{
  "id": "v1-sg-7328",
  "long_id": "v1.saas-gradient.docs.s07.p03.t02.u08",
  "name": "SaaS gradient developer portal",
  "era": {
    "slug": "saas-gradient",
    "code": "sg",
    "name": "SaaS gradient",
    "years": [
      2016,
      2021
    ],
    "description": "The start-up product page of 2016 to 2021: slanted or curved bands of purple-to-blue gradient, white rounded cards with soft wide shadows, friendly geometric sans, pill buttons and flat illustration blocks."
  },
  "archetype": "docs",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is the developer side of a start-up product of 2016 to 2021: a dark bar of navigation with a search field, a band of two-colour gradient whose lower edge rises to the left and carries the claim beside a request drawn as a code window, and a quickstart card that climbs onto the band. The reference is read in three columns, contents at the left, text and tables in the middle and the request and its reply in dark windows at the right, and the dashboard pages keep the same cards for keys, quotas and forms. Any product with an API had such a portal by 2018, friendly in the marketing colours and exact in the code.",
  "url": "https://chrono.skin/s/v1-sg-7328",
  "preview_url": "https://chrono.skin/s/v1-sg-7328/specimen.html",
  "files": {
    "STYLE.md": "# SaaS gradient developer portal\n\n## Summary\n\nThis is the developer side of a start-up product of 2016 to 2021: a dark bar of navigation with a search field, a band of two-colour gradient whose lower edge rises to the left and carries the claim beside a request drawn as a code window, and a quickstart card that climbs onto the band. The reference is read in three columns, contents at the left, text and tables in the middle and the request and its reply in dark windows at the right, and the dashboard pages keep the same cards for keys, quotas and forms. Any product with an API had such a portal by 2018, friendly in the marketing colours and exact in the code.\n\n## Layout\n\n- The page is designed for a 1440px viewport and is not fluid: content sits in `.ds-wrap`, centred, at most `--size-page` (1180px) wide with `--space-5` side padding. The bar, the band and the footer run the full width of the window.\n- Navigation is a solid bar on `--fill-bar-alt`, at least `--size-nav` (60px) tall, over a faint rule: the `.ds-brand`, a `.ds-nav__tag` naming the portal behind a hairline, four links (the current one on a translucent block), then at the right the `.ds-search` field, one `.ds-menu` and one small `.ds-button--bar`. Nothing of the navigation lies on the gradient.\n- The home view stacks: `.ds-hero`, in two columns (5 to 6): kicker, title, one paragraph, two buttons and an install line at the left, a `.ds-code` window with a `.ds-reply` card over its corner at the right; its lower edge is cut by `clip-path` so that it rises 5vw to the left. Then `.ds-main--home`: `.ds-quick`, one card that climbs onto the band, a tinted lead with the progress bar and three `.ds-steps` across; `.ds-stat`, four figures set on the page; a `.ds-block__head` and the `.ds-grid` of six resources three across; `.ds-cols` (2 to 1, `--level`) with the recent changes beside the status rows; and `.ds-cta`, a gradient card. Blocks are `--space-7` apart.\n- Inner pages have no hero. They open with `.ds-page-header`: the same gradient as a slim straight band holding the breadcrumb, the page title, one line of text and at most one button at the right. `.ds-main` follows. A reference page is `.ds-docs`, three columns: the `.ds-sidebar` lists (`--size-side`, 210px), the text column (the `.ds-endpoint` line, `.ds-prose`, the parameter table in a card, notices, the errors as an accordion, the pagination), and `.ds-docs__code` (`--size-code`, 400px), which stays in view while the text scrolls and holds the `.ds-tabs`, the code windows and the next links. Dashboard pages use `.ds-cols` (2 to 1); a list page uses `.ds-cols--side` with the sidebar at the left.\n- Views. The specimen is the developer portal of a parcel shipping API, with four views. `home` is the overview. `reference` is the page of one request. `keys` is the list of API keys with the test mode switch, the form that makes a key with its buttons, the month's quotas, the open revoke dialog and an empty list of webhooks. `changelog` lists the changes of a year with the versions and the label key at the left and the pagination in the foot of the card.\n- Below 1100px the code column moves under the text and the search field goes; below 960px the hero, the quickstart and the columns stack and cards stand two across; below 900px `.ds-nav__links` is not shown and the menu `.ds-nav__menu` takes its place at the right of the brand, while `.ds-nav__tag` and the search and menu in `.ds-nav__actions` are hidden; below 640px the menu goes again and the links return as one `.ds-nav__links` strip under the brand and button, scrolling sideways edge to edge and fading at the right (on the later views it starts from its far end, so that the current link is in sight), everything is one column and a wide table scrolls inside `.ds-table__wrap`. The page never scrolls sideways.\n- Spacing scale: `--space-1` 4px (label to field, pagination gaps), `--space-2` 8px (icon to text, between badges), `--space-3` 12px (button and cell vertical padding), `--space-4` 16px (between form rows, code padding), `--space-5` 24px (card padding, grid gap, page gutter), `--space-6` 32px (column gap of the reference, page header padding), `--space-7` 48px (between blocks, hero top), `--space-8` 80px (hero foot, end of the page).\n- Other sizes: `--size-mark` 28px, `--size-icon` 40px (icon tiles), `--size-control` 34px (pagination), `--size-avatar` 28px (avatars, step numbers), `--size-search` 200px, `--size-menu` 190px, `--size-tip` 220px (widest tooltip), `--size-dialog` 420px.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\nThe conventions are the era's, as its first layout sets them out.\n\n- The gradient is `--fill-inverse` (from `--color-fill-1` to `--color-fill-2`); text on it is `--color-inverse-text`. It fills the band, the trial card in the rail and the progress bars. Only `.ds-button--inverse` and `.ds-button--ghost` stand on it; the search field on the band is a translucent pill in `--color-inverse-text`.\n- `--color-fill-1` to `--color-fill-4` colour the rail icons, the round icon tiles, avatars, sparklines and the two chart lines. A fill carries an icon or initials in `--color-inverse-text`, never running text.\n- `--color-page` is the work area, `--color-surface` (through `--fill-panel`) the cards and the rail, `--color-surface-alt` a hovered table row, the dialog foot and the empty state, `--color-surface-strong` the current rail link, the current sidebar row, the quiet badge and the progress track.\n- `--fill-bar` with `--color-bar-text` is the table head. `--fill-bar-alt` with `--color-bar-alt-text` is the footer line.\n- Text is `--color-text` (`#576f7f`), meta `--color-text-muted`, headings and figures `--color-heading` (`#0e304b`); sidebar titles and h3 in prose are `--color-heading-alt`. The change under a figure is `--color-success` (`.ds-stat__up`) or `--color-danger` (`.ds-stat__down`).\n- `--color-button` (navy `#033156`, white text) is the action colour on cards, the current page number and the edge under the current tab. Links are `--color-link`, bold, underlined only on hover.\n- Badges, notices and the destructive button follow the era's rules: `--fill-accent` for the default badge, tints mixed into `--color-surface` for `--alt` and the status variants, `--color-notice` with `--color-notice-text`, `--color-danger` with `--color-button-text`.\n- Two families: `--font-heading` is a rounded sans (Varela Round, Arial Rounded MT Bold) for titles and figures, `--font-body` and `--font-ui` a plain humanist sans (Nunito, Open Sans, Helvetica Neue); `--font-mono` for code. `--text-base` 16px at `--line-body` 1.6; `--text-ui` 15px; `--text-small` 13px (labels, meta, badges); `--text-large` 20px (band text); `--text-h1` 38px (band titles, figures); `--text-h2` 27px; `--text-h3` 19px (card titles). `--text-display` 50px is not used in this layout: the greeting is `--text-h1`.\n- Headings and controls are bold (`--weight-heading`, `--weight-ui` 700). Nothing is uppercase.\n- Surface: pills for buttons, inputs, rail links and badges (`--radius-control`, `--radius-pill` 100px); cards `--radius-panel` 16px; `--radius-page` 28px on the dialog's backdrop. `--shadow-panel` is one very wide, soft, tinted shadow (60px blur); `--shadow-dialog` is deeper and also marks a hovered project card. `--border-width-strong` 3px is the edge under the current tab, the ring of an unticked checklist mark and the ring of the account's initials.\n- One-off values made with `calc()` and `color-mix()`: the translucent search field (`--color-inverse-text` at 16%, its edge at 30%), the ghost button border (55%), the account ring's wash (20%), tinted badges, the hairlines of the chart (a repeating gradient of `--color-border-muted` every 25%), the area under the first chart line (its own colour at 10% opacity). Progress widths are percentages.\n\n## Components\n\n- `.ds-page`: on `<body>`. Sets font, text colour and `--fill-page`.\n- `.ds-wrap`: the centred content column.\n- `.ds-brand`: the site's mark and name, first in the bar and again in the footer. `.ds-brand__mark` is a 28px tile dressed like the primary button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) holding the mark as inline SVG; `.ds-brand__name` is the name in bold. Name and mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the bar. `.ds-nav__inner` centres it; `.ds-nav__tag` names the portal; `.ds-nav__links` holds `.ds-nav__link`, the current one on a translucent block (`is-current`); `.ds-nav__actions` holds the search, the menu and one `.ds-button--bar ds-button--small`. In the specimen the showing view marks its link with one `:has()` rule per view; a project sets `is-current` itself.\n- `.ds-search`: the search field of the bar, an icon and a `.ds-search__input` in the bar's colours.\n- `.ds-menu`: a drop-down, a `<details>` whose `.ds-menu__button` is the summary and whose `.ds-menu__list` of `.ds-menu__link` opens as a small card under it, aligned to the right.\n- `.ds-hero`: the gradient band of the home view. `.ds-hero__inner` is two columns: `.ds-hero__copy` with `.ds-hero__kicker`, `.ds-hero__title`, `.ds-hero__lead`, `.ds-hero__actions` (one `--inverse`, one `--ghost` button) and `.ds-hero__note` in monospace; and `.ds-hero__art` with a `.ds-code--deep` and a `.ds-reply`. One per site.\n- `.ds-code`: a code window: `.ds-code__bar` (optional `.ds-code__dot`s, `.ds-code__name`, a label or `.ds-code__copy`) over `.ds-code__body`, a `<pre>` that scrolls sideways. Inside, `.ds-code__b` is bold, `.ds-code__s` a string or value, `.ds-code__c` a comment. `--deep` takes the dialog shadow.\n- `.ds-reply`: a small card of `.ds-reply__head` and `.ds-reply__row` pairs (`.ds-reply__value` at the right) laid over the corner of the hero's code window.\n- `.ds-page-header`: head of an inner page, used instead of `.ds-hero`: `.ds-page-header__inner` holds the breadcrumb, `.ds-page-header__title`, `.ds-page-header__text` and `.ds-page-header__actions`.\n- `.ds-main`: the area under the band; `--home` has no top padding. `.ds-block` is one block of it, `.ds-block__head` its `.ds-block__title` with a `.ds-block__text` at the right.\n- `.ds-cols`: main and side column, 2 to 1; `--level` makes them equally tall; `--side` puts a narrow column first. `.ds-stack` stacks cards 24px apart.\n- `.ds-quick`: the quickstart, a `.ds-panel` with `.ds-quick__lead` (title, `.ds-quick__note`, a progress bar) and `.ds-steps`, three `.ds-steps__item` each a `.ds-steps__num`, `.ds-steps__title`, `.ds-steps__text` and a link; `is-done` fills the number.\n- `.ds-stat`: the row of figures; each `.ds-stat__item` is a `.ds-stat__figure` over a `.ds-stat__label` behind a rule in one of the fills.\n- `.ds-grid`: three cards across. Each `.ds-grid__cell` is a `.ds-grid__head` (a `.ds-tile` and the `.ds-grid__title`), `.ds-grid__text` and a `.ds-path`.\n- `.ds-tile`: an icon tile on `--color-fill-1` (`--2`, `--3`, `--4`; `--round` for a circle).\n- `.ds-path`: a request path or a key prefix in monospace on a grey chip; `.ds-key` is the same without the chip, for tables and running text.\n- `.ds-rows`: plain rows in a card, a `.ds-rows__name` with a badge or figure at the right, `.ds-rows__item` each.\n- `.ds-cta`: the closing call to action, a gradient card with `.ds-cta__title`, `.ds-cta__text` and the two gradient buttons.\n- `.ds-docs`: the three columns of a reference page; `.ds-docs__code` is the third. `.ds-endpoint` is the line that names the request: a badge for the method, `.ds-endpoint__path` and an optional label.\n- `.ds-prose`: running text: h1, h2, h3, p, lists, `code`, `strong`. `.ds-prose__lead` for the first paragraph.\n- `.ds-link`: text link. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `--quiet` for meta; `--more` appends an arrow. `.ds-linkrow` lays links in a row.\n- `.ds-button`: 14px medium, tight corners. Variants: `--secondary`, `--danger` (destructive actions only), `--inverse` and `--ghost` (on the gradient only), `--bar` (on the bar only), `--small`, `--wide`. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. `.ds-buttonrow` spaces buttons.\n- `.ds-form`: vertical form with labels above the fields. `.ds-form__row` puts two fields side by side; `.ds-form__field` wraps `.ds-form__label` and one of `.ds-form__input`, `.ds-form__select`, `.ds-form__textarea`. Error: `is-error` on the input plus `.ds-form__error`. `.ds-form__hint`, `.ds-form__check` with `.ds-form__checkbox`, `.ds-form__actions`.\n- `.ds-table`: data table inside a card: a small bold head on `--fill-bar`, hairlines between rows; `is-hover` tints a row. `.ds-table__num` right-aligns numbers; `.ds-table__title` is a row's link. Wrap it in `.ds-table__wrap`; `.ds-table__foot` is a last row for a count and the pagination.\n- `.ds-list`: rows parted by hairlines. `.ds-list__item` holds a `.ds-list__title` (alone or in a `.ds-list__head` with a badge at the right), an optional `.ds-list__text` and `.ds-list__meta`.\n- `.ds-panel`: the white card. `.ds-panel__head` holds the `.ds-panel__title` and an optional badge, link or `.ds-panel__tools` above a hairline; `.ds-panel__body` is padded; `.ds-panel__text` is a small paragraph.\n- `.ds-tabs`: a row of `.ds-tabs__tab` over a hairline, the current one (`is-current`) underlined in `--color-button`. Here it chooses the language of the code windows.\n- `.ds-badge`: small tag, 12px semibold, on `--fill-accent`. `--alt` tinted, `--quiet` grey. Status variants: `--success`, `--warning`, `--danger`. `.ds-badgerow` for several.\n- `.ds-sidebar`: a block of links: `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__item` with an optional `.ds-sidebar__count`; the current row (`is-current`) is a grey block.\n- `.ds-notice`: tinted message; `--error` in the danger colours. `.ds-notice__title` for the bold lead-in. `.ds-noticerow` stacks notices.\n- `.ds-pagination`: `.ds-pagination__link` blocks; `is-current` is filled with `--fill-button`, `is-disabled` is grey.\n- `.ds-breadcrumb`: a small trail of `.ds-breadcrumb__item` parted by slashes; the last is `.ds-breadcrumb__current`. It takes the colour of what it stands on.\n- `.ds-dialog`: a dimmed block (`--color-overlay`) centring `.ds-dialog__box`, a card in `--shadow-dialog`: `.ds-dialog__head` (`.ds-dialog__title`, `.ds-dialog__close`), `.ds-dialog__body`, and `.ds-dialog__actions` right-aligned on `--color-surface-alt`.\n- `.ds-empty`: a centred message on `--color-surface-alt`: `.ds-empty__icon` (a circle of `--color-fill-3`), `.ds-empty__title`, `.ds-empty__text` and one small secondary button.\n- `.ds-accordion`: sections that open and close: each `.ds-accordion__item` is a `<details>` with a `.ds-accordion__title` summary (a plus that turns to a minus) and a `.ds-accordion__body`. Used for the errors of a request.\n- `.ds-tooltip`: a hint shown on hover or focus of its trigger; `.ds-tooltip__text` is the hint, above the trigger. `--mark` draws the trigger as a small round question mark; `--end` aligns the hint to the trigger's right edge; `is-open` shows it.\n- `.ds-switch`: an on/off control, a `<label>` with a hidden `.ds-switch__input` checkbox, the `.ds-switch__track` and the text; on, the track takes `--fill-button`.\n- `.ds-progress`: a thin track with a `.ds-progress__bar` in the gradient (`--33`, `--62`, `--82`, `--90` set its width; `--over` fills it in `--color-danger`). `.ds-meter` puts a `.ds-meter__row` (`.ds-meter__name` and the figures) over one.\n- `.ds-avatar`: a person as initials on a round fill (`--1`, `--2`, `--4`); `.ds-who` sets one beside a name.\n- `.ds-footer`: one row on `--fill-bar-alt`: `.ds-footer__row` holds the brand, a `.ds-footer__list` of `.ds-footer__link` and `.ds-footer__legal` at the right.\n- `.ds-nav__menu`: the `.ds-menu` that replaces the bar's links on a phone. It lists every view, marks the one showing, and sits last in the bar after the brand and the one action that stays.\n\n## Never\n\n- `font-weight <= 700`: headings and figures are bold, never black.\n- `font-size >= 13px`: labels, meta and badges are the smallest text.\n- `font-size <= 38px`: band titles and figures are the largest text.\n- `font-families <= 3`: a rounded heading face, a body sans and monospace for code.\n- `line-height <= 1.6`: body text is set at 1.6.\n- `uppercase-text <= 0%`: navigation, buttons and labels are in sentence case.\n- `text-shadow = none`: text is flat, also on the gradient.\n- `animation = none`: nothing moves by itself, not even the countdown; only hover states ease.\n- `border-width <= 4px`: borders are 2px; 4px rings a speaker's face.\n- `border-radius <= 32px`: cards are 18px and the largest blocks 32px; only pills and circles are rounder.\n- `box-shadow-blur <= 80px`: shadows are soft but end at 80px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. A new block of the overview is a `.ds-block` with a `.ds-block__head`; a new reference page keeps the three columns of `.ds-docs` and puts every request and reply in a `.ds-code` window; anything that holds data is a `.ds-panel`. Text goes on cards, on the page and, in `--color-inverse-text`, on the gradient; on the bar and in code windows everything is drawn from `--color-bar-alt-text`. The four fills take an icon or initials only. Put only the `--inverse` and `--ghost` buttons on the gradient, only `--bar` on the bar, and at most one primary button in a card. Keep corners, shadows and borders on their tokens, spacing on the `--space-*` scale, and note any one-off `color-mix()` shade next to its rule.\n",
    "components.css": ":root {\n  --size-page: 1180px;\n  --size-nav: 60px;\n  --size-mark: 28px;\n  --size-icon: 40px;\n  --size-control: 34px;\n  --size-dialog: 420px;\n  --size-avatar: 28px;\n  --size-side: 210px;\n  --size-code: 400px;\n  --size-search: 200px;\n  --size-menu: 190px;\n  --size-tip: 220px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 24px;\n  --space-6: 32px;\n  --space-7: 48px;\n  --space-8: 80px;\n}\n\n/* views: one screen of the example site shows at a time */\n.ds-view { display: none; }\n.ds-view:target, .ds-page:not(:has(.ds-view:target)) .ds-view--home { display: block; }\n.ds-view:target { scroll-margin-top: 100vh; }\n\n.ds-page {\n  margin: 0;\n  padding: 0;\n  min-height: 100vh;\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n.ds-page *,\n.ds-page *::before,\n.ds-page *::after {\n  box-sizing: border-box;\n}\n\n/* brand: the mark on a tile dressed like the primary button */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: inherit;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  letter-spacing: var(--heading-tracking);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-brand__mark {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-mark);\n  height: var(--size-mark);\n  padding: var(--space-1);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-button-text) 35%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  display: inline-block;\n}\n\n/* typography */\n.ds-prose {\n  color: var(--color-text);\n  max-width: 68ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-prose h1 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-6);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-5);\n  color: var(--color-heading-alt);\n  font-size: var(--text-h3);\n}\n.ds-prose p {\n  margin: var(--space-3) 0 0;\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: var(--space-3) 0 0;\n  padding-left: var(--space-5);\n}\n.ds-prose li {\n  margin-top: var(--space-1);\n}\n.ds-prose strong {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose a {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-prose__lead {\n  color: var(--color-text);\n  font-size: var(--text-large);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--more::after {\n  content: \" \\2192\";\n}\n.ds-linkrow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* buttons */\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n  transform: translateY(calc(var(--space-1) * -0.25));\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n  transform: none;\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border);\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--color-danger);\n  color: var(--color-button-text);\n}\n.ds-button--inverse,\n.ds-button--inverse:hover,\n.ds-button--inverse.is-hover {\n  background: var(--color-inverse-text);\n  color: var(--color-inverse);\n}\n.ds-button--ghost,\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  border-color: color-mix(in srgb, var(--color-inverse-text) 55%, transparent);\n  background: transparent;\n  color: var(--color-inverse-text);\n  box-shadow: none;\n}\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  background: color-mix(in srgb, var(--color-inverse-text) 14%, transparent);\n}\n.ds-button--small {\n  padding: var(--space-2) var(--space-4);\n  font-size: var(--text-small);\n}\n.ds-button:disabled,\n.ds-button.is-disabled,\n.ds-button.is-disabled:hover {\n  border-color: transparent;\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  box-shadow: none;\n  text-shadow: none;\n  transform: none;\n  cursor: default;\n}\n.ds-buttonrow {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* form */\n.ds-form {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-4);\n}\n.ds-form__field {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  min-width: 0;\n}\n.ds-form__label {\n  color: var(--color-heading);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-form__input,\n.ds-form__select,\n.ds-form__textarea {\n  width: 100%;\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-form__textarea {\n  min-height: calc(var(--space-8) + var(--space-6));\n  border-radius: var(--radius-panel);\n  line-height: var(--line-body);\n  resize: vertical;\n}\n.ds-form__input:focus,\n.ds-form__select:focus,\n.ds-form__textarea:focus,\n.ds-form__input.is-focus {\n  border-color: var(--color-focus);\n  outline: var(--focus-ring);\n}\n.ds-form__input.is-error {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  color: var(--color-danger);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n}\n.ds-form__hint {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-form__checkbox {\n  width: var(--space-4);\n  height: var(--space-4);\n  margin: 0;\n  accent-color: var(--color-button);\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin-top: var(--space-2);\n}\n\n/* table */\n.ds-table__wrap {\n  max-width: 100%;\n  overflow-x: auto;\n}\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-align: left;\n  white-space: nowrap;\n}\n.ds-table td {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text);\n  vertical-align: middle;\n}\n.ds-table tr:last-child td {\n  border-bottom: 0;\n}\n.ds-table tbody tr:hover td,\n.ds-table tr.is-hover td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n.ds-table__title {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-table__foot {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  padding: var(--space-4) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-list__head {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-list__title {\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__text {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-list__meta {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* panel: the white card with the soft wide shadow */\n.ds-panel {\n  min-width: 0;\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-panel__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  padding: var(--space-5);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-4);\n  font-size: var(--text-ui);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.7;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.ds-badge--alt {\n  background: color-mix(in srgb, var(--color-accent-alt) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-accent-alt) 60%, var(--color-heading));\n}\n.ds-badge--quiet {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n}\n.ds-badge--success {\n  background: color-mix(in srgb, var(--color-success) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-success) 60%, var(--color-heading));\n}\n.ds-badge--warning {\n  background: color-mix(in srgb, var(--color-warning) 22%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-warning) 50%, var(--color-heading));\n}\n.ds-badge--danger {\n  background: color-mix(in srgb, var(--color-danger) 16%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-danger) 70%, var(--color-heading));\n}\n.ds-badgerow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n\n/* sidebar block */\n.ds-sidebar {\n  min-width: 0;\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__item:hover,\n.ds-sidebar__item.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-sidebar__item.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__count {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n\n/* notice */\n.ds-notice {\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n}\n.ds-notice--error {\n  border-color: color-mix(in srgb, var(--color-danger) 35%, transparent);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n}\n.ds-noticerow {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-pagination__link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-pagination__link.is-disabled {\n  background: transparent;\n  color: var(--color-disabled-text);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n}\n.ds-breadcrumb__item {\n  color: inherit;\n  opacity: 0.8;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__item::after {\n  content: \"/\";\n  margin-left: var(--space-2);\n  opacity: 0.6;\n}\n.ds-breadcrumb__current {\n  font-weight: var(--weight-bold);\n}\n\n/* dialog: shown open in the page flow on its dimmed backdrop */\n.ds-dialog {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-7) var(--space-4);\n  border-radius: var(--radius-page);\n  background: var(--color-overlay);\n}\n.ds-dialog__box {\n  width: 100%;\n  max-width: var(--size-dialog);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-5) var(--space-5) 0;\n}\n.ds-dialog__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-dialog__close {\n  position: relative;\n  display: inline-block;\n  flex: none;\n  width: calc(var(--text-large) * 0.8);\n  height: calc(var(--text-large) * 0.8);\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-dialog__close::before, .ds-dialog__close::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  margin: auto;\n  width: 100%;\n  height: max(var(--border-width), calc(var(--text-large) * 0.12));\n  background: currentColor;\n  transform: rotate(45deg);\n}\n.ds-dialog__close::after {\n  transform: rotate(-45deg);\n}\n.ds-dialog__body {\n  padding: var(--space-3) var(--space-5) var(--space-5);\n  font-size: var(--text-ui);\n}\n.ds-dialog__body p {\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: 0 0 var(--radius-panel) var(--radius-panel);\n  background: var(--color-surface-alt);\n}\n\n/* empty state */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-6) var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  text-align: center;\n}\n.ds-empty__icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n}\n.ds-empty__icon svg {\n  width: 50%;\n  height: 50%;\n}\n.ds-empty__title {\n  margin: var(--space-1) 0 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-empty__text {\n  max-width: 44ch;\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) var(--space-5);\n  margin: 0;\n  padding: 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  list-style: none;\n}\n.ds-tabs__tab {\n  display: inline-block;\n  padding: var(--space-3) 0;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  margin-bottom: calc(var(--border-width) * -1);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-tabs__tab.is-current {\n  border-bottom-color: var(--color-button);\n  color: var(--color-heading);\n}\n\n/* shared small pieces: an icon tile on one of the four fills, a sparkline */\n.ds-tile {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: var(--radius-panel);\n  background: var(--color-fill-1);\n  color: var(--color-inverse-text);\n}\n.ds-tile svg {\n  width: 55%;\n  height: 55%;\n}\n.ds-tile--2 { background: var(--color-fill-2); }\n.ds-tile--3 { background: var(--color-fill-3); }\n.ds-tile--4 { background: var(--color-fill-4); }\n\n@media (max-width: 640px) {\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-3);\n  }\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-dialog {\n    padding: var(--space-5) var(--space-3);\n  }\n}\n\n/* ---- components of the period: avatar, progress, switch, tooltip, accordion, menu ---- */\n.ds-avatar {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-avatar--2 { background: var(--color-fill-2); }\n.ds-avatar--4 { background: var(--color-fill-4); }\n.ds-who {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  white-space: nowrap;\n}\n.ds-progress {\n  display: block;\n  height: var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  overflow: hidden;\n}\n.ds-progress__bar {\n  display: block;\n  width: 50%;\n  height: 100%;\n  border-radius: var(--radius-pill);\n  background: var(--fill-inverse);\n}\n.ds-progress__bar--33 { width: 33%; }\n.ds-progress__bar--62 { width: 62%; }\n.ds-progress__bar--90 { width: 90%; }\n.ds-progress__bar--over {\n  width: 100%;\n  background: var(--color-danger);\n}\n.ds-meter {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  font-size: var(--text-small);\n}\n.ds-meter + .ds-meter {\n  margin-top: var(--space-4);\n}\n.ds-meter__row {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n  color: var(--color-text-muted);\n}\n.ds-meter__name {\n  color: var(--color-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n}\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n.ds-switch__track {\n  position: relative;\n  flex: none;\n  width: calc(var(--space-5) * 1.75);\n  height: var(--space-5);\n  border-radius: var(--radius-pill);\n  background: var(--color-border-strong);\n  transition: var(--transition);\n}\n.ds-switch__track::after {\n  content: \"\";\n  position: absolute;\n  top: calc(var(--space-1) / 2);\n  left: calc(var(--space-1) / 2);\n  width: calc(var(--space-5) - var(--space-1));\n  height: calc(var(--space-5) - var(--space-1));\n  border-radius: var(--radius-pill);\n  background: var(--color-button-text);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track {\n  background: var(--fill-button);\n}\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: calc(var(--space-5) * 0.75 + var(--space-1) / 2);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch.is-focus .ds-switch__track {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  cursor: help;\n}\n.ds-tooltip--mark {\n  width: calc(var(--space-4) + var(--space-1));\n  height: calc(var(--space-4) + var(--space-1));\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-tooltip:focus-visible,\n.ds-tooltip.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tooltip__text {\n  position: absolute;\n  bottom: calc(100% + var(--space-2));\n  left: 50%;\n  z-index: 6;\n  display: none;\n  width: max-content;\n  max-width: var(--size-tip);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-panel);\n  background: var(--color-heading);\n  color: var(--color-surface);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  text-align: left;\n  white-space: normal;\n  box-shadow: var(--shadow-control);\n  transform: translateX(-50%);\n}\n.ds-tooltip--end .ds-tooltip__text {\n  right: 0;\n  left: auto;\n  transform: none;\n}\n.ds-tooltip:hover .ds-tooltip__text,\n.ds-tooltip:focus .ds-tooltip__text,\n.ds-tooltip.is-open .ds-tooltip__text {\n  display: block;\n}\n.ds-accordion {\n  min-width: 0;\n}\n.ds-accordion__item {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__item:first-child > .ds-accordion__title {\n  padding-top: 0;\n}\n.ds-accordion__item:last-child {\n  border-bottom: 0;\n}\n.ds-accordion__item:last-child:not([open]) > .ds-accordion__title {\n  padding-bottom: 0;\n}\n.ds-accordion__title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__title::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__title::after {\n  content: \"\";\n  flex: none;\n  width: calc(var(--text-large) * 0.7);\n  height: calc(var(--text-large) * 0.7);\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-large) * 0.12)) no-repeat, linear-gradient(currentColor, currentColor) center / max(var(--border-width), calc(var(--text-large) * 0.12)) 100% no-repeat;\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-accordion__item[open] > .ds-accordion__title::after {\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-large) * 0.12)) no-repeat;\n}\n.ds-accordion__title:hover,\n.ds-accordion__title.is-hover {\n  color: var(--color-link);\n}\n.ds-accordion__title:focus-visible,\n.ds-accordion__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  padding: 0 0 var(--space-4);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-accordion__body p {\n  margin: 0;\n}\n.ds-menu {\n  position: relative;\n}\n.ds-menu__button {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  padding: var(--space-1) var(--space-3);\n  border-radius: var(--radius-control);\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n  list-style: none;\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-menu__button::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__button::after {\n  content: \"\";\n  display: inline-block;\n  flex: none;\n  width: 0;\n  height: 0;\n  border: calc(var(--text-small) * 0.3) solid transparent;\n  border-top: calc(var(--text-small) * 0.36) solid currentColor;\n  border-bottom-width: 0;\n  font-size: var(--text-small);\n  vertical-align: calc(var(--text-small) * 0.14);\n}\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  right: 0;\n  z-index: 5;\n  min-width: var(--size-menu);\n  margin: var(--space-2) 0 0;\n  padding: var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  list-style: none;\n}\n.ds-menu__link {\n  display: block;\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover {\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n}\n\n/* ---- layout: developer portal ---- */\n.ds-wrap {\n  width: 100%;\n  max-width: var(--size-page);\n  margin: 0 auto;\n  padding: 0 var(--space-5);\n}\n\n/* nav: a solid bar in the footer's colours, above the gradient */\n.ds-nav {\n  position: relative;\n  z-index: 3;\n  border-bottom: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 18%, transparent);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-nav__inner {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  min-height: var(--size-nav);\n  max-width: var(--size-page);\n  margin: 0 auto;\n  padding: 0 var(--space-5);\n}\n.ds-nav__tag {\n  padding-left: var(--space-3);\n  border-left: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 35%, transparent);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n  opacity: 0.8;\n}\n.ds-nav__links {\n  display: flex;\n  flex: 1 0 auto;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link {\n  display: block;\n  padding: var(--space-1) var(--space-3);\n  border-radius: var(--radius-control);\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  opacity: 0.8;\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover,\n.ds-nav .ds-menu__button:hover,\n.ds-nav .ds-menu[open] .ds-menu__button {\n  opacity: 1;\n}\n.ds-nav .ds-menu__button {\n  opacity: 0.8;\n}\n.ds-nav__link.is-current,\n.ds-nav .ds-menu[open] .ds-menu__button,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#reference:target) .ds-nav__link[href=\"#reference\"],\n.ds-page:has(#keys:target) .ds-nav__link[href=\"#keys\"],\n.ds-page:has(#changelog:target) .ds-nav__link[href=\"#changelog\"] {\n  background: color-mix(in srgb, var(--color-bar-alt-text) 16%, transparent);\n  opacity: 1;\n}\n.ds-nav__actions {\n  display: flex;\n  flex: 0 1 auto;\n  align-items: center;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-search {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  flex: 0 1 var(--size-search);\n  min-width: 0;\n  padding: var(--space-1) var(--space-3);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 30%, transparent);\n  border-radius: var(--radius-control);\n  background: color-mix(in srgb, var(--color-bar-alt-text) 8%, transparent);\n  color: inherit;\n}\n.ds-search svg {\n  flex: none;\n  width: var(--space-4);\n  height: var(--space-4);\n  opacity: 0.7;\n}\n.ds-search__input {\n  flex: 1;\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  background: transparent;\n  color: inherit;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-search__input::placeholder {\n  color: inherit;\n  opacity: 0.7;\n}\n.ds-search__input:focus {\n  outline: 0;\n}\n.ds-search:focus-within {\n  outline: var(--focus-ring);\n}\n.ds-button--bar,\n.ds-button--bar:hover,\n.ds-button--bar.is-hover {\n  border-color: color-mix(in srgb, var(--color-bar-alt-text) 45%, transparent);\n  background: transparent;\n  color: var(--color-bar-alt-text);\n  box-shadow: none;\n}\n.ds-button--bar:hover,\n.ds-button--bar.is-hover {\n  background: color-mix(in srgb, var(--color-bar-alt-text) 14%, transparent);\n}\n\n/* hero: the gradient band, its lower edge rising to the left */\n.ds-hero {\n  padding: var(--space-7) 0 calc(var(--space-8) + var(--space-7) + 5vw);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 5vw));\n}\n.ds-hero__inner {\n  display: grid;\n  grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);\n  align-items: center;\n  gap: var(--space-7);\n}\n.ds-hero__copy {\n  min-width: 0;\n}\n.ds-hero__kicker {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-4);\n  padding: var(--space-1) var(--space-3) var(--space-1) var(--space-1);\n  border-radius: var(--radius-pill);\n  background: color-mix(in srgb, var(--color-inverse-text) 16%, transparent);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n}\n.ds-hero__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-hero__lead {\n  max-width: 44ch;\n  margin: var(--space-4) 0 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n  margin-top: var(--space-5);\n}\n.ds-hero__note {\n  margin: var(--space-4) 0 0;\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  opacity: 0.8;\n}\n.ds-hero__art {\n  position: relative;\n  min-width: 0;\n  padding: 0 var(--space-6) var(--space-7) 0;\n}\n\n/* code: a request or reply in a window, in the footer's colours */\n.ds-code {\n  min-width: 0;\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 18%, transparent);\n  border-radius: var(--radius-panel);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-code--deep {\n  box-shadow: var(--shadow-dialog);\n}\n.ds-code__bar {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-2) var(--space-4);\n  border-bottom: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 18%, transparent);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n}\n.ds-code__dot {\n  width: var(--space-2);\n  height: var(--space-2);\n  border-radius: 50%;\n  background: color-mix(in srgb, var(--color-bar-alt-text) 35%, transparent);\n}\n.ds-code__name {\n  flex: 1;\n  min-width: 0;\n  margin-left: var(--space-1);\n  font-weight: var(--weight-bold);\n}\n.ds-code__copy {\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  opacity: 0.8;\n}\n.ds-code__body {\n  margin: 0;\n  padding: var(--space-4);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: 1.7;\n  white-space: pre;\n  overflow-x: auto;\n}\n.ds-code__s {\n  color: color-mix(in srgb, var(--color-accent-alt) 55%, var(--color-bar-alt-text));\n}\n.ds-code__c {\n  opacity: 0.6;\n}\n.ds-code__b {\n  font-weight: var(--weight-bold);\n}\n.ds-reply {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 58%;\n  padding: var(--space-4);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  color: var(--color-text);\n  font-size: var(--text-small);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-reply__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-reply__row {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-1) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  font-family: var(--font-mono);\n}\n.ds-reply__value {\n  color: var(--color-heading);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n/* page header: the same band, slim and straight, on inner pages */\n.ds-page-header {\n  padding: var(--space-6) 0;\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-page-header__inner {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-5);\n}\n.ds-page-header__title {\n  margin: var(--space-2) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-page-header__text {\n  max-width: 60ch;\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  gap: var(--space-3);\n}\n\n/* blocks of a page */\n.ds-main {\n  padding: var(--space-6) 0 var(--space-8);\n}\n.ds-main--home {\n  padding-top: 0;\n}\n.ds-block {\n  margin-top: var(--space-7);\n}\n.ds-block__head {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-2) var(--space-5);\n  margin-bottom: var(--space-5);\n}\n.ds-block__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-block__text {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n.ds-stack {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-cols {\n  display: grid;\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n  align-items: start;\n  gap: var(--space-5);\n}\n.ds-cols--level {\n  align-items: stretch;\n}\n.ds-cols--side {\n  grid-template-columns: var(--size-side) minmax(0, 1fr);\n  gap: var(--space-6);\n}\n\n/* quickstart: one card that climbs onto the band, steps three across */\n.ds-quick {\n  position: relative;\n  z-index: 1;\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);\n  margin-top: calc((var(--space-8) + 3vw) * -1);\n}\n.ds-quick__lead {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  padding: var(--space-5);\n  border-right: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel) 0 0 var(--radius-panel);\n  background: var(--color-surface-alt);\n}\n.ds-quick__note {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-steps {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-steps__item {\n  padding: var(--space-5);\n  border-left: var(--border-width) var(--border-style) var(--color-border-muted);\n  font-size: var(--text-ui);\n}\n.ds-steps__item:first-child {\n  border-left: 0;\n}\n.ds-steps__num {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: 50%;\n  color: var(--color-heading);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-steps__item.is-done .ds-steps__num {\n  border-color: transparent;\n  background: var(--color-success);\n  color: var(--color-surface);\n}\n.ds-steps__title {\n  margin: var(--space-3) 0 var(--space-1);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-steps__text {\n  margin: 0 0 var(--space-2);\n}\n\n/* stats: figures set on the page, each behind a rule in one of the fills */\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5);\n}\n.ds-stat__item {\n  padding-left: var(--space-4);\n  border-left: var(--border-width-strong) var(--border-style) var(--color-fill-2);\n}\n.ds-stat__item:nth-child(2) { border-left-color: var(--color-fill-3); }\n.ds-stat__item:nth-child(3) { border-left-color: var(--color-fill-4); }\n.ds-stat__item:nth-child(4) { border-left-color: var(--color-fill-1); }\n.ds-stat__figure {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-stat__label {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* grid: the parts of the API, three across */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: var(--space-5);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-grid__head {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-grid__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-grid__text {\n  flex: 1;\n  margin: var(--space-3) 0;\n  font-size: var(--text-ui);\n}\n.ds-path {\n  display: inline-block;\n  max-width: 100%;\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: 1.9;\n  text-decoration: none;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n/* rows: a name with a label or figure at the right */\n.ds-rows {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-ui);\n}\n.ds-rows__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-rows__item:last-child {\n  border-bottom: 0;\n}\n.ds-rows__name {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-heading);\n  font-weight: var(--weight-ui);\n}\n\n/* call to action: a gradient card */\n.ds-cta {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-5);\n  padding: var(--space-6);\n  border-radius: var(--radius-page);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  box-shadow: var(--shadow-panel);\n}\n.ds-cta__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-cta__text {\n  margin: var(--space-1) 0 0;\n  opacity: 0.9;\n}\n\n/* reference: contents, text and code in three columns */\n.ds-docs {\n  display: grid;\n  grid-template-columns: var(--size-side) minmax(0, 1fr) var(--size-code);\n  align-items: start;\n  gap: var(--space-6);\n}\n.ds-docs__code {\n  position: sticky;\n  top: var(--space-5);\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n  min-width: 0;\n}\n.ds-endpoint {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-ui);\n  box-shadow: var(--shadow-control);\n}\n.ds-endpoint__path {\n  flex: 1;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.ds-key {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  white-space: nowrap;\n}\n.ds-panel__tools {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* footer: one row in the bar's colours */\n.ds-footer {\n  padding: var(--space-5) 0;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-ui);\n}\n.ds-footer__row {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3) var(--space-6);\n}\n.ds-footer__list {\n  display: flex;\n  flex: 1;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: inherit;\n  text-decoration: var(--link-decoration-quiet);\n  opacity: 0.85;\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n  opacity: 1;\n}\n.ds-footer__legal {\n  margin: 0;\n  font-size: var(--text-small);\n  opacity: 0.7;\n}\n\n@media (max-width: 1100px) {\n  .ds-docs {\n    grid-template-columns: var(--size-side) minmax(0, 1fr);\n  }\n  .ds-docs__code {\n    position: static;\n    grid-column: 2;\n  }\n  .ds-search {\n    display: none;\n  }\n}\n@media (max-width: 960px) {\n  .ds-hero__inner,\n  .ds-cols,\n  .ds-quick {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-quick__lead {\n    border-right: 0;\n    border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n    border-radius: var(--radius-panel) var(--radius-panel) 0 0;\n  }\n  .ds-grid,\n  .ds-stat {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n}\n@media (max-width: 900px) {\n  .ds-wrap {\n    padding: 0 var(--space-4);\n  }\n  .ds-nav__inner {\n    flex-wrap: wrap;\n    justify-content: space-between;\n    gap: var(--space-2) var(--space-3);\n    padding: var(--space-3) var(--space-4) var(--space-2);\n  }\n  .ds-nav__links {\n    order: 3;\n    flex: none;\n    width: 100%;\n    min-width: 0;\n    overflow-x: auto;\n  }\n  .ds-nav__actions {\n    flex: none;\n  }\n  .ds-nav__tag {\n    display: none;\n  }\n  .ds-hero {\n    padding-top: var(--space-6);\n    padding-bottom: calc(var(--space-8) + var(--space-5) + 5vw);\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-hero__art {\n    padding-right: var(--space-4);\n  }\n  .ds-page-header {\n    padding: var(--space-5) 0;\n  }\n  .ds-page-header__inner {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-docs,\n  .ds-cols--side,\n  .ds-grid,\n  .ds-steps {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-docs__code {\n    grid-column: auto;\n  }\n  .ds-steps__item {\n    border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n    border-left: 0;\n  }\n  .ds-steps__item:first-child {\n    border-top: 0;\n  }\n  .ds-main {\n    padding: var(--space-5) 0 var(--space-7);\n  }\n  .ds-main--home {\n    padding-top: 0;\n  }\n  .ds-cta {\n    padding: var(--space-5);\n  }\n  .ds-stat__figure {\n    font-size: var(--text-h2);\n  }\n}\n\n/* components shared across the era: menu, switch, tooltip, accordion, progress, avatar */\n.ds-progress__bar--33 { width: 33%; }\n.ds-tooltip--mark {\n  margin-left: var(--space-1);\n  vertical-align: middle;\n}\n.ds-form__check > .ds-switch {\n  flex: 1;\n  min-width: 0;\n}\n\n/* phone: the links fold into a menu behind a button; the brand and one action stay in the bar */\n.ds-nav__menu {\n  display: none;\n}\n.ds-nav__menu > .ds-menu__button {\n  gap: var(--space-2);\n  padding: var(--space-1) var(--space-2);\n  color: inherit;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-nav__menu > .ds-menu__button::before {\n  content: \"\";\n  box-sizing: border-box;\n  flex: none;\n  width: var(--text-ui);\n  height: calc(var(--text-ui) * 0.75);\n  border-top: max(var(--border-width), calc(var(--text-ui) * 0.12)) solid currentColor;\n  border-bottom: max(var(--border-width), calc(var(--text-ui) * 0.12)) solid currentColor;\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-ui) * 0.12)) no-repeat;\n}\n.ds-nav__menu > .ds-menu__button::after {\n  content: none;\n}\n.ds-nav__menu .ds-menu__link {\n  border-left: var(--border-width-strong) var(--border-style) transparent;\n}\n.ds-page:not(:has(.ds-view:target)) .ds-nav__menu .ds-menu__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__menu .ds-menu__link[href=\"#home\"],\n.ds-page:has(#reference:target) .ds-nav__menu .ds-menu__link[href=\"#reference\"],\n.ds-page:has(#keys:target) .ds-nav__menu .ds-menu__link[href=\"#keys\"],\n.ds-page:has(#changelog:target) .ds-nav__menu .ds-menu__link[href=\"#changelog\"] {\n  border-left-color: var(--color-accent);\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n@media (max-width: 900px) {\n  .ds-nav__menu {\n    display: block;\n    flex: none;\n  }\n  .ds-nav > .ds-nav__links,\n  .ds-nav__inner > .ds-nav__links {\n    display: none;\n  }\n  .ds-nav__actions > .ds-menu,\n  .ds-nav__actions > .ds-search {\n    display: none;\n  }\n  .ds-nav__actions {\n    margin-left: auto;\n  }\n}\n\n/* phone: the links are one strip that scrolls sideways under the bar, fading at the edge where there is more */\n@media (max-width: 640px) {\n  .ds-nav__menu {\n    display: none;\n  }\n  .ds-nav__inner > .ds-nav__links {\n    display: flex;\n    flex-wrap: nowrap;\n    width: calc(100% + var(--space-4) * 2);\n    max-width: none;\n    margin: 0 calc(var(--space-4) * -1);\n    padding: 0 var(--space-6) var(--space-1) var(--space-4);\n    overflow-x: auto;\n    scrollbar-width: none;\n    -webkit-mask: linear-gradient(to right, black calc(100% - var(--space-7)), transparent);\n    mask: linear-gradient(to right, black calc(100% - var(--space-7)), transparent);\n  }\n  .ds-nav__inner > .ds-nav__links > li {\n    flex: none;\n    direction: ltr;\n  }\n  /* on the later views the strip starts from its far end, so the current link is in sight */\n  .ds-page:has(#keys:target) .ds-nav__inner > .ds-nav__links,\n  .ds-page:has(#changelog:target) .ds-nav__inner > .ds-nav__links {\n    flex-direction: row-reverse;\n    direction: rtl;\n    padding: 0 var(--space-6) var(--space-1) var(--space-4);\n    -webkit-mask: linear-gradient(to left, black calc(100% - var(--space-7)), transparent);\n    mask: linear-gradient(to left, black calc(100% - var(--space-7)), transparent);\n  }\n}\n",
    "specimen.html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>chronoskin: SaaS gradient developer portal specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <div class=\"ds-nav__inner\">\n    <a class=\"ds-brand\" data-component=\"brand\" href=\"#home\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"13.6\" cy=\"10\" r=\"7.6\" opacity=\".45\"/><circle cx=\"9.2\" cy=\"15\" r=\"5.8\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <span class=\"ds-nav__tag\">Developers</span>\n    <ul class=\"ds-nav__links\">\n      <li><a class=\"ds-nav__link\" href=\"#home\">Overview</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#reference\">API reference</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#keys\">API keys</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#changelog\">Changelog</a></li>\n    </ul>\n    <div class=\"ds-nav__actions\">\n      <label class=\"ds-search\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"9\" cy=\"9\" r=\"5\"/><path d=\"M13 13l4 4\"/></svg><input class=\"ds-search__input\" type=\"search\" placeholder=\"Search the docs\" aria-label=\"Search the docs\"></label>\n      <details class=\"ds-menu\" data-component=\"menu\">\n        <summary class=\"ds-menu__button\">Libraries</summary>\n        <ul class=\"ds-menu__list\">\n          <li><a class=\"ds-menu__link\" href=\"#reference\">Node</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#reference\">Python</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#reference\">Ruby</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#reference\">PHP</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#changelog\">All 14 libraries</a></li>\n        </ul>\n      </details>\n      <a class=\"ds-button ds-button--bar ds-button--small\" href=\"#keys\">Dashboard</a>\n    </div>\n    <details class=\"ds-menu ds-nav__menu\">\n      <summary class=\"ds-menu__button\">Menu</summary>\n      <ul class=\"ds-menu__list\">\n        <li><a class=\"ds-menu__link\" href=\"#home\">Overview</a></li>\n        <li><a class=\"ds-menu__link\" href=\"#reference\">API reference</a></li>\n        <li><a class=\"ds-menu__link\" href=\"#keys\">API keys</a></li>\n        <li><a class=\"ds-menu__link\" href=\"#changelog\">Changelog</a></li>\n      </ul>\n    </details>\n  </div>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"home\">\n  <div class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-wrap ds-hero__inner\">\n      <div class=\"ds-hero__copy\">\n        <p class=\"ds-hero__kicker\"><span class=\"ds-badge ds-badge--alt\">v3</span> Rates for 31 carriers in one call</p>\n        <h1 class=\"ds-hero__title\">Ship a parcel with one request</h1>\n        <p class=\"ds-hero__lead\">The chronoskin API buys the label, books the collection and tells you where the parcel is. Seven lines of code, any carrier.</p>\n        <div class=\"ds-hero__actions\">\n          <a class=\"ds-button ds-button--inverse\" href=\"#keys\">Get your API keys</a>\n          <a class=\"ds-button ds-button--ghost\" href=\"#reference\">Read the reference</a>\n        </div>\n        <p class=\"ds-hero__note\">npm install chronoskin</p>\n      </div>\n      <div class=\"ds-hero__art\" aria-hidden=\"true\">\n        <div class=\"ds-code ds-code--deep\">\n          <div class=\"ds-code__bar\"><span class=\"ds-code__dot\"></span><span class=\"ds-code__dot\"></span><span class=\"ds-code__dot\"></span><span class=\"ds-code__name\">Create a shipment</span><span>curl</span></div>\n          <pre class=\"ds-code__body\"><span class=\"ds-code__b\">curl</span> api.chronoskin.test/v3/shipments \\\n  -u <span class=\"ds-code__s\">sk_test_a1b2c3d4:</span> \\\n  -d <span class=\"ds-code__s\">\"to[name]\"=\"Harbour Bakery\"</span> \\\n  -d <span class=\"ds-code__s\">\"to[postcode]\"=\"EH6 6QQ\"</span> \\\n  -d weight=<span class=\"ds-code__s\">1200</span> \\\n  -d service=<span class=\"ds-code__s\">next_day</span>\n<span class=\"ds-code__c\"># weight is in grams</span>\n\n\n</pre>\n        </div>\n        <div class=\"ds-reply\">\n          <p class=\"ds-reply__head\">Reply <span class=\"ds-badge ds-badge--success\">201 Created</span></p>\n          <div class=\"ds-reply__row\"><span>id</span><span class=\"ds-reply__value\">shp_8Kd20a</span></div>\n          <div class=\"ds-reply__row\"><span>carrier</span><span class=\"ds-reply__value\">northline</span></div>\n          <div class=\"ds-reply__row\"><span>label</span><span class=\"ds-reply__value\">label_8Kd20a.pdf</span></div>\n          <div class=\"ds-reply__row\"><span>cost</span><span class=\"ds-reply__value\">4.85</span></div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main ds-main--home\">\n    <div class=\"ds-wrap\">\n      <div class=\"ds-panel ds-quick\">\n        <div class=\"ds-quick__lead\">\n          <h2 class=\"ds-panel__title\">Quickstart</h2>\n          <p class=\"ds-quick__note\">About ten minutes, in test mode. Nothing is collected and nothing is charged.</p>\n          <span class=\"ds-progress\" data-component=\"progress\"><span class=\"ds-progress__bar ds-progress__bar--33\"></span></span>\n          <p class=\"ds-quick__note\">1 of 3 steps done</p>\n        </div>\n        <ol class=\"ds-steps\">\n          <li class=\"ds-steps__item is-done\"><span class=\"ds-steps__num\">1</span><h3 class=\"ds-steps__title\">Get a test key</h3><p class=\"ds-steps__text\">Every account starts with one. It begins with <span class=\"ds-path\">sk_test_</span>.</p><a class=\"ds-link ds-link--more\" href=\"#keys\">Your keys</a></li>\n          <li class=\"ds-steps__item\"><span class=\"ds-steps__num\">2</span><h3 class=\"ds-steps__title\">Create a shipment</h3><p class=\"ds-steps__text\">Send an address and a weight; get back a label and a price.</p><a class=\"ds-link ds-link--more\" href=\"#reference\">The request</a></li>\n          <li class=\"ds-steps__item\"><span class=\"ds-steps__num\">3</span><h3 class=\"ds-steps__title\">Listen for tracking</h3><p class=\"ds-steps__text\">Add a webhook and we call you each time the parcel is scanned.</p><a class=\"ds-link ds-link--more\" href=\"#keys\">Webhooks</a></li>\n        </ol>\n      </div>\n\n      <div class=\"ds-block\">\n        <div class=\"ds-stat\" data-component=\"stats\">\n          <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">99.99%</p><p class=\"ds-stat__label\">of requests answered over the last 90 days</p></div>\n          <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">180 ms</p><p class=\"ds-stat__label\">median time to a label</p></div>\n          <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">31</p><p class=\"ds-stat__label\">carriers behind one address format</p></div>\n          <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">14</p><p class=\"ds-stat__label\">libraries, kept in step with the API</p></div>\n        </div>\n      </div>\n\n      <div class=\"ds-block\">\n        <div class=\"ds-block__head\">\n          <h2 class=\"ds-block__title\">What the API does</h2>\n          <p class=\"ds-block__text\">Six resources. Each has its own page in the reference.</p>\n        </div>\n        <div class=\"ds-grid\" data-component=\"grid\">\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 6l7-3 7 3v8l-7 3-7-3z M3 6l7 3 7-3 M10 9v8\"/></svg></span><h3 class=\"ds-grid__title\">Shipments</h3></div>\n            <p class=\"ds-grid__text\">Create, change and cancel a parcel on its way from you to a customer.</p>\n            <a class=\"ds-path\" href=\"#reference\">POST /v3/shipments</a>\n          </div>\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile ds-tile--2\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 3h7l7 7-7 7-7-7z\"/><circle cx=\"7\" cy=\"7\" r=\"1\"/></svg></span><h3 class=\"ds-grid__title\">Labels</h3></div>\n            <p class=\"ds-grid__text\">A label as PDF or ZPL, in the size your printer takes.</p>\n            <a class=\"ds-path\" href=\"#reference\">GET /v3/labels/:id</a>\n          </div>\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile ds-tile--3\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M10 17s5-5 5-9a5 5 0 0 0-10 0c0 4 5 9 5 9z\"/><circle cx=\"10\" cy=\"8\" r=\"1.5\"/></svg></span><h3 class=\"ds-grid__title\">Tracking</h3></div>\n            <p class=\"ds-grid__text\">Every scan as an event, in the same words for every carrier.</p>\n            <a class=\"ds-path\" href=\"#reference\">GET /v3/trackers/:id</a>\n          </div>\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile ds-tile--4\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"M10 6v8 M8 8h3a1.5 1.5 0 0 1 0 3H8\"/></svg></span><h3 class=\"ds-grid__title\">Rates</h3></div>\n            <p class=\"ds-grid__text\">Prices for a parcel from all carriers, before you buy anything.</p>\n            <a class=\"ds-path\" href=\"#reference\">POST /v3/rates</a>\n          </div>\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile ds-tile--3\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 9l7-6 7 6v8H3z M8 17v-5h4v5\"/></svg></span><h3 class=\"ds-grid__title\">Addresses</h3></div>\n            <p class=\"ds-grid__text\">Check and tidy an address, so a parcel is not sent to nowhere.</p>\n            <a class=\"ds-path\" href=\"#reference\">POST /v3/addresses</a>\n          </div>\n          <div class=\"ds-grid__cell\">\n            <div class=\"ds-grid__head\"><span class=\"ds-tile ds-tile--2\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M11 2L4 11h5l-1 7 7-9h-5z\"/></svg></span><h3 class=\"ds-grid__title\">Webhooks</h3></div>\n            <p class=\"ds-grid__text\">We call your server when something changes, and retry for three days.</p>\n            <a class=\"ds-path\" href=\"#keys\">POST /v3/webhooks</a>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"ds-block ds-cols ds-cols--level\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Recent changes</h2><a class=\"ds-link ds-link--more\" href=\"#changelog\">Changelog</a></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item\">\n                <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#changelog\">Rates return the delivery day</a><span class=\"ds-badge\">2019-04-02</span></div>\n                <p class=\"ds-list__meta\">Added to every rate, in the receiver's time zone</p>\n              </li>\n              <li class=\"ds-list__item\">\n                <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#changelog\">Weights must be whole grams</a><span class=\"ds-badge ds-badge--warning\">Breaking</span></div>\n                <p class=\"ds-list__meta\">Fractions are refused from version 2019-03-11</p>\n              </li>\n              <li class=\"ds-list__item\">\n                <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#changelog\">A library for Go</a><span class=\"ds-badge ds-badge--alt\">New</span></div>\n                <p class=\"ds-list__meta\">The fourteenth, written with two customers</p>\n              </li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">API status</h2><span class=\"ds-badge ds-badge--success\">All good</span></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-rows\">\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Shipments and labels</span><span class=\"ds-badge ds-badge--success\">Up</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Tracking</span><span class=\"ds-badge ds-badge--success\">Up</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Webhooks <span class=\"ds-tooltip ds-tooltip--mark\" tabindex=\"0\">?<span class=\"ds-tooltip__text\">Deliveries are about two minutes behind while one carrier catches up.</span></span></span><span class=\"ds-badge ds-badge--warning\">Slow</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Test mode</span><span class=\"ds-badge ds-badge--success\">Up</span></li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"ds-block\">\n        <div class=\"ds-cta\">\n          <div>\n            <h2 class=\"ds-cta__title\">Stuck on a request?</h2>\n            <p class=\"ds-cta__text\">Send us its id. An engineer answers within a working day.</p>\n          </div>\n          <div class=\"ds-buttonrow\">\n            <a class=\"ds-button ds-button--inverse\" href=\"#keys\">Open the dashboard</a>\n            <a class=\"ds-button ds-button--ghost\" href=\"#changelog\">See what changed</a>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"reference\">\n  <div class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">Developers</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#reference\">API reference</a></li>\n          <li class=\"ds-breadcrumb__current\">Shipments</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Shipments</h1>\n        <p class=\"ds-page-header__text\">A shipment is one parcel on its way from you to one address.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#keys\">Get your API keys</a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-docs\">\n      <div class=\"ds-stack\">\n        <nav class=\"ds-sidebar\" data-component=\"sidebar\">\n          <h2 class=\"ds-sidebar__title\">Shipments</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">The shipment object</a></li>\n            <li><a class=\"ds-sidebar__item is-current\" href=\"#reference\">Create a shipment</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Retrieve a shipment</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Cancel a shipment</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">List shipments <span class=\"ds-sidebar__count\">paged</span></a></li>\n          </ul>\n        </nav>\n        <nav class=\"ds-sidebar\">\n          <h2 class=\"ds-sidebar__title\">Other resources</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Labels</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Tracking</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Rates</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#reference\">Addresses</a></li>\n          </ul>\n        </nav>\n      </div>\n\n      <div class=\"ds-stack\">\n        <div class=\"ds-endpoint\"><span class=\"ds-badge ds-badge--success\">POST</span><span class=\"ds-endpoint__path\">/v3/shipments</span><span class=\"ds-tooltip ds-tooltip--end\" tabindex=\"0\" data-component=\"tooltip\"><span class=\"ds-badge ds-badge--quiet\">Idempotent</span><span class=\"ds-tooltip__text\">Send the same Idempotency-Key twice and the second call returns the first shipment.</span></span></div>\n        <article class=\"ds-prose\" data-component=\"typography\">\n          <h1>Create a shipment</h1>\n          <p class=\"ds-prose__lead\">Buys a label from the cheapest carrier that can meet the service you ask for, and returns the shipment with its label and price.</p>\n          <h2>Before you call</h2>\n          <p>Use a test key while you build. A test shipment gets a real-looking label marked <strong>SAMPLE</strong> and is never collected.</p>\n          <h3>Units</h3>\n          <ul>\n            <li>Weights are whole grams: <code>weight=1200</code> is 1.2 kg.</li>\n            <li>Sizes are whole millimetres, longest side first.</li>\n            <li>Money is in the smallest unit of your account's currency.</li>\n          </ul>\n        </article>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Parameters</h2><span class=\"ds-badge ds-badge--quiet\">form encoded</span></div>\n          <div class=\"ds-table__wrap\">\n            <table class=\"ds-table\" data-component=\"table\">\n              <thead>\n                <tr><th>Parameter</th><th>Type</th><th>Needed</th><th class=\"ds-table__num\">Longest</th></tr>\n              </thead>\n              <tbody>\n                <tr><td><span class=\"ds-key\">to[name]</span></td><td>string</td><td><span class=\"ds-badge ds-badge--danger\">Required</span></td><td class=\"ds-table__num\">60</td></tr>\n                <tr><td><span class=\"ds-key\">to[postcode]</span></td><td>string</td><td><span class=\"ds-badge ds-badge--danger\">Required</span></td><td class=\"ds-table__num\">12</td></tr>\n                <tr><td><span class=\"ds-key\">weight</span></td><td>integer, grams</td><td><span class=\"ds-badge ds-badge--danger\">Required</span></td><td class=\"ds-table__num\">30,000</td></tr>\n                <tr><td><span class=\"ds-key\">service</span></td><td>one of three</td><td><span class=\"ds-badge ds-badge--quiet\">Optional</span></td><td class=\"ds-table__num\">16</td></tr>\n                <tr><td><span class=\"ds-key\">reference</span></td><td>string</td><td><span class=\"ds-badge ds-badge--quiet\">Optional</span></td><td class=\"ds-table__num\">40</td></tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n        <div class=\"ds-noticerow\" data-component=\"notice\">\n          <p class=\"ds-notice\"><span class=\"ds-notice__title\">Test mode is free.</span> Labels made with a test key cost nothing and cannot be posted.</p>\n          <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Fractions of a gram are refused.</span> Since 2019-03-11 the call fails with <span class=\"ds-key\">weight_not_whole</span>.</p>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Errors</h2></div>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-accordion\" data-component=\"accordion\">\n              <details class=\"ds-accordion__item\" open>\n                <summary class=\"ds-accordion__title\">400 address_not_found</summary>\n                <div class=\"ds-accordion__body\"><p>No carrier knows the postcode. Check it with the Addresses resource first; the reply suggests the nearest match.</p></div>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__title\">402 balance_too_low</summary>\n                <div class=\"ds-accordion__body\"><p>The account cannot pay for the label. Top up, or switch on automatic top-ups in the dashboard.</p></div>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__title\">429 too_many_requests</summary>\n                <div class=\"ds-accordion__body\"><p>More than 100 calls in a second. Wait for the time given in the Retry-After header.</p></div>\n              </details>\n            </div>\n          </div>\n        </div>\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li><a class=\"ds-pagination__link\" href=\"#reference\">Previous</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#reference\">1</a></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#reference\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#reference\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#reference\">4</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#reference\">Next</a></li>\n        </ul>\n      </div>\n\n      <div class=\"ds-docs__code\">\n        <ul class=\"ds-tabs\" data-component=\"tabs\">\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#reference\">curl</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#reference\">Node</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#reference\">Python</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#reference\">Ruby</a></li>\n        </ul>\n        <div class=\"ds-code\">\n          <div class=\"ds-code__bar\"><span class=\"ds-code__name\">Request</span><a class=\"ds-code__copy\" href=\"#reference\">Copy</a></div>\n          <pre class=\"ds-code__body\"><span class=\"ds-code__b\">curl</span> api.chronoskin.test/v3/shipments \\\n  -u <span class=\"ds-code__s\">sk_test_a1b2c3d4:</span> \\\n  -d <span class=\"ds-code__s\">\"to[name]\"=\"Harbour Bakery\"</span> \\\n  -d <span class=\"ds-code__s\">\"to[postcode]\"=\"EH6 6QQ\"</span> \\\n  -d weight=<span class=\"ds-code__s\">1200</span> \\\n  -d service=<span class=\"ds-code__s\">next_day</span></pre>\n        </div>\n        <div class=\"ds-code\">\n          <div class=\"ds-code__bar\"><span class=\"ds-code__name\">Reply</span><span>201</span></div>\n          <pre class=\"ds-code__body\">{\n  <span class=\"ds-code__b\">\"id\"</span>: <span class=\"ds-code__s\">\"shp_8Kd20a\"</span>,\n  <span class=\"ds-code__b\">\"status\"</span>: <span class=\"ds-code__s\">\"label_ready\"</span>,\n  <span class=\"ds-code__b\">\"carrier\"</span>: <span class=\"ds-code__s\">\"northline\"</span>,\n  <span class=\"ds-code__b\">\"service\"</span>: <span class=\"ds-code__s\">\"next_day\"</span>,\n  <span class=\"ds-code__b\">\"weight\"</span>: 1200,\n  <span class=\"ds-code__b\">\"cost\"</span>: 485,\n  <span class=\"ds-code__b\">\"label\"</span>: <span class=\"ds-code__s\">\"label_8Kd20a.pdf\"</span>,\n  <span class=\"ds-code__b\">\"tracker\"</span>: <span class=\"ds-code__s\">\"trk_51Lm9x\"</span>\n}</pre>\n        </div>\n        <nav class=\"ds-sidebar\">\n          <h2 class=\"ds-sidebar__title\">Read next</h2>\n          <ul class=\"ds-linkrow\" data-component=\"links\">\n            <li><a class=\"ds-link\" href=\"#reference\">Retrieve a shipment</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#keys\">Test and live keys</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#changelog\">Version 2019-04-02</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#reference\">Idempotent requests</a></li>\n          </ul>\n        </nav>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"keys\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">Developers</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#keys\">Dashboard</a></li>\n          <li class=\"ds-breadcrumb__current\">API keys</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">API keys</h1>\n        <p class=\"ds-page-header__text\">A key says who is calling. Keep live keys on your server and nowhere else.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--ghost\" href=\"#reference\">How keys work</a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-cols\">\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\">\n            <h2 class=\"ds-panel__title\">Your keys</h2>\n            <div class=\"ds-panel__tools\">\n              <label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Test mode</span></label>\n            </div>\n          </div>\n          <div class=\"ds-table__wrap\">\n            <table class=\"ds-table\">\n              <thead>\n                <tr><th>Name</th><th>Key</th><th>Made by</th><th class=\"ds-table__num\">Calls today</th><th>State</th></tr>\n              </thead>\n              <tbody>\n                <tr><td><a class=\"ds-table__title\" href=\"#keys\">Warehouse server</a></td><td><span class=\"ds-key\">sk_test_...c3d4</span></td><td><span class=\"ds-who\"><span class=\"ds-avatar\" data-component=\"avatar\">IL</span> Ingrid</span></td><td class=\"ds-table__num\">4,212</td><td><span class=\"ds-badge ds-badge--success\">In use</span></td></tr>\n                <tr class=\"is-hover\"><td><a class=\"ds-table__title\" href=\"#keys\">Returns desk</a></td><td><span class=\"ds-key\">sk_test_...9f0a</span></td><td><span class=\"ds-who\"><span class=\"ds-avatar ds-avatar--2\">TO</span> Tomas</span></td><td class=\"ds-table__num\">318</td><td><span class=\"ds-badge ds-badge--success\">In use</span></td></tr>\n                <tr><td><a class=\"ds-table__title\" href=\"#keys\">Old shop plugin</a></td><td><span class=\"ds-key\">sk_test_...77be</span></td><td><span class=\"ds-who\"><span class=\"ds-avatar ds-avatar--4\">MP</span> Maya</span></td><td class=\"ds-table__num\">0</td><td><span class=\"ds-badge ds-badge--warning\">Quiet 60 days</span></td></tr>\n                <tr><td><a class=\"ds-table__title\" href=\"#keys\">Laptop, Tomas</a></td><td><span class=\"ds-key\">sk_test_...01aa</span></td><td><span class=\"ds-who\"><span class=\"ds-avatar ds-avatar--2\">TO</span> Tomas</span></td><td class=\"ds-table__num\">0</td><td><span class=\"ds-badge ds-badge--danger\">Revoked</span></td></tr>\n              </tbody>\n            </table>\n          </div>\n          <div class=\"ds-table__foot\"><span>4 test keys, 2 live keys</span><a class=\"ds-link\" href=\"#reference\">Rolling a key without downtime</a></div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Make a new key</h2></div>\n          <div class=\"ds-panel__body\">\n            <form class=\"ds-form\" data-component=\"form\" action=\"#keys\">\n              <div class=\"ds-form__row\">\n                <div class=\"ds-form__field\">\n                  <label class=\"ds-form__label\" for=\"k-name\">Name</label>\n                  <input class=\"ds-form__input\" id=\"k-name\" type=\"text\" value=\"Label printer, dock 2\">\n                  <span class=\"ds-form__hint\">Only you see it. Say where the key lives.</span>\n                </div>\n                <div class=\"ds-form__field\">\n                  <label class=\"ds-form__label\" for=\"k-scope\">May do</label>\n                  <select class=\"ds-form__select\" id=\"k-scope\"><option>Everything</option><option>Read only</option><option>Labels only</option></select>\n                </div>\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"k-ip\">Allowed address</label>\n                <input class=\"ds-form__input is-error\" id=\"k-ip\" type=\"text\" value=\"203.0.113\">\n                <span class=\"ds-form__error\">An address has four numbers, such as 203.0.113.24.</span>\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"k-note\">Note for your team (optional)</label>\n                <textarea class=\"ds-form__textarea\" id=\"k-note\" placeholder=\"Who to ask before revoking this key\"></textarea>\n              </div>\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Tell me by email when this key is first used</label>\n              <div class=\"ds-form__actions\" data-component=\"buttons\">\n                <button class=\"ds-button\" type=\"submit\">Make the key</button>\n                <a class=\"ds-button ds-button--secondary\" href=\"#keys\">Cancel</a>\n                <button class=\"ds-button ds-button--danger\" type=\"button\">Revoke all test keys</button>\n                <button class=\"ds-button is-disabled\" type=\"button\" disabled>Make a live key</button>\n              </div>\n            </form>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">This month</h2><span class=\"ds-badge ds-badge--quiet\">Growth plan</span></div>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-meter\"><div class=\"ds-meter__row\"><span class=\"ds-meter__name\">Labels</span><span>6,200 of 10,000</span></div><span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--62\"></span></span></div>\n            <div class=\"ds-meter\"><div class=\"ds-meter__row\"><span class=\"ds-meter__name\">Address checks</span><span>18,000 of 20,000</span></div><span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--90\"></span></span></div>\n            <div class=\"ds-meter\"><div class=\"ds-meter__row\"><span class=\"ds-meter__name\">Tracked parcels</span><span>5,400 of 5,000</span></div><span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--over\"></span></span></div>\n          </div>\n        </div>\n        <div class=\"ds-dialog\" data-component=\"dialog\">\n          <div class=\"ds-dialog__box\" role=\"dialog\" aria-labelledby=\"k-dialog\">\n            <div class=\"ds-dialog__head\"><h2 class=\"ds-dialog__title\" id=\"k-dialog\">Revoke this key?</h2><a class=\"ds-dialog__close\" href=\"#keys\" aria-label=\"Close\"></a></div>\n            <div class=\"ds-dialog__body\"><p>Calls made with <span class=\"ds-key\">sk_test_...77be</span> will fail from the next second. This cannot be undone.</p></div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#keys\">Keep it</a>\n              <a class=\"ds-button ds-button--danger ds-button--small\" href=\"#keys\">Revoke</a>\n            </div>\n          </div>\n        </div>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <span class=\"ds-empty__icon\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M11 2L4 11h5l-1 7 7-9h-5z\"/></svg></span>\n          <h2 class=\"ds-empty__title\">No webhooks yet</h2>\n          <p class=\"ds-empty__text\">Give us an address on your server and we call it when a parcel moves.</p>\n          <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#reference\">Add a webhook</a>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"changelog\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">Developers</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#reference\">API reference</a></li>\n          <li class=\"ds-breadcrumb__current\">Changelog</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Changelog</h1>\n        <p class=\"ds-page-header__text\">Every change to the API, newest first. Your account stays on its version until you move it.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#keys\">Change my version</a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-cols ds-cols--side\">\n      <div class=\"ds-stack\">\n        <nav class=\"ds-sidebar\">\n          <h2 class=\"ds-sidebar__title\">Versions</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__item is-current\" href=\"#changelog\">2019 <span class=\"ds-sidebar__count\">7</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#changelog\">2018 <span class=\"ds-sidebar__count\">19</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#changelog\">2017 <span class=\"ds-sidebar__count\">12</span></a></li>\n          </ul>\n        </nav>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__text\">What the labels on a change mean.</p>\n            <div class=\"ds-badgerow\" data-component=\"badge\">\n              <span class=\"ds-badge\">Dated</span>\n              <span class=\"ds-badge ds-badge--alt\">New</span>\n              <span class=\"ds-badge ds-badge--quiet\">Library</span>\n              <span class=\"ds-badge ds-badge--success\">Fixed</span>\n              <span class=\"ds-badge ds-badge--warning\">Breaking</span>\n              <span class=\"ds-badge ds-badge--danger\">Removed</span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Changes in 2019</h2><span class=\"ds-who\"><span class=\"ds-avatar ds-avatar--4\">MP</span> You are on 2019-03-11</span></div>\n        <div class=\"ds-panel__body\">\n          <ul class=\"ds-list\" data-component=\"list\">\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#reference\">Rates return the delivery day</a><span class=\"ds-badge\">2019-04-02</span></div>\n              <p class=\"ds-list__text\">Each rate now carries <span class=\"ds-key\">delivery_day</span>, worked out in the receiver's time zone. Nothing is taken away.</p>\n              <p class=\"ds-list__meta\">Rates, all libraries from 3.4</p>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#reference\">Weights must be whole grams</a><span class=\"ds-badge ds-badge--warning\">Breaking</span></div>\n              <p class=\"ds-list__text\">A weight with a fraction used to be rounded down, which made labels too cheap. It is now refused.</p>\n              <p class=\"ds-list__meta\">Shipments and rates, version 2019-03-11</p>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#reference\">A library for Go</a><span class=\"ds-badge ds-badge--alt\">New</span></div>\n              <p class=\"ds-list__text\">The fourteenth library. It covers every resource and retries idempotent calls by itself.</p>\n              <p class=\"ds-list__meta\">Libraries, February</p>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#reference\">Labels in XML are gone</a><span class=\"ds-badge ds-badge--danger\">Removed</span></div>\n              <p class=\"ds-list__text\">Announced a year ago and used by eleven accounts, all of which have moved to PDF or ZPL.</p>\n              <p class=\"ds-list__meta\">Labels, version 2019-01-15</p>\n            </li>\n          </ul>\n        </div>\n        <div class=\"ds-table__foot\">\n          <span>Changes 1 to 4 of 7</span>\n          <ul class=\"ds-pagination\">\n            <li><a class=\"ds-pagination__link is-disabled\" href=\"#changelog\">Previous</a></li>\n            <li><a class=\"ds-pagination__link is-current\" href=\"#changelog\">1</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#changelog\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#changelog\">Next</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-wrap ds-footer__row\">\n    <a class=\"ds-brand\" href=\"#home\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"13.6\" cy=\"10\" r=\"7.6\" opacity=\".45\"/><circle cx=\"9.2\" cy=\"15\" r=\"5.8\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <ul class=\"ds-footer__list\">\n      <li><a class=\"ds-footer__link\" href=\"#reference\">API reference</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#keys\">API keys</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#changelog\">Changelog</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#home\">Status</a></li>\n    </ul>\n    <p class=\"ds-footer__legal\">chronoskin, 2019. The API for parcels.</p>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.saas-gradient.docs.s07.p03.t02.u08\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"saas-gradient\",\n    \"years\": [\n      2016,\n      2021\n    ]\n  },\n  \"archetype\": \"docs\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": false,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-sg-7328\",\n  \"short\": \"v1-sg-7328\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #f8f5f3;\n  --color-canvas: #f8f5f3;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f3f0ee;\n  --color-surface-strong: #eae4df;\n  --color-bar: #f3f0ee;\n  --color-bar-text: #46585c;\n  --color-bar-alt: #17262b;\n  --color-bar-alt-text: #c8d3d5;\n  --color-inverse: #fb5a62;\n  --color-inverse-text: #ffffff;\n  --color-text: #46585c;\n  --color-text-muted: #8d9a9c;\n  --color-heading: #17262b;\n  --color-heading-alt: #2f4347;\n  --color-link: #f0336b;\n  --color-link-quiet: #5b6c70;\n  --color-link-visited: #b8517f;\n  --color-link-hover: #f27a3e;\n  --color-link-active: #c22f62;\n  --color-border: #e6dfd9;\n  --color-border-strong: #cbc2ba;\n  --color-border-muted: #f1ebe6;\n  --color-accent: #f27a3e;\n  --color-accent-text: #ffffff;\n  --color-accent-alt: #7b5fd3;\n  --color-fill-1: #ff3d6e;\n  --color-fill-2: #ff9440;\n  --color-fill-3: #7b5fd3;\n  --color-fill-4: #23b5a3;\n  --color-button: #5b4bd6;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #17262b;\n  --color-input: #ffffff;\n  --color-input-text: #17262b;\n  --color-input-border: #cbc2ba;\n  --color-disabled: #efe8e3;\n  --color-disabled-text: #a9a29c;\n  --color-danger: #d6344a;\n  --color-danger-surface: #fdf0f1;\n  --color-success: #23a586;\n  --color-warning: #eda02b;\n  --color-notice: #fff1e6;\n  --color-notice-text: #9a4a17;\n  --color-focus: #5b4bd6;\n  --color-shadow: rgb(23 38 43 / 0.1);\n  --color-overlay: rgb(23 38 43 / 0.6);\n}\n\n/* @part type */\n:root {\n  --font-body: Nunito, \"Open Sans\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-heading: \"Varela Round\", \"Arial Rounded MT Bold\", Nunito, \"Helvetica Neue\", sans-serif;\n  --font-ui: Nunito, \"Open Sans\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-mono: \"Roboto Mono\", Monaco, Consolas, monospace;\n  --text-base: 16px;\n  --text-small: 13px;\n  --text-ui: 15px;\n  --text-large: 20px;\n  --text-display: 50px;\n  --text-h1: 38px;\n  --text-h2: 27px;\n  --text-h3: 19px;\n  --line-body: 1.6;\n  --line-heading: 1.25;\n  --line-display: 1.15;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 700;\n  --weight-ui: 700;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 2px;\n  --border-width-strong: 4px;\n  --border-style: solid;\n  --radius-control: 100px;\n  --radius-panel: 18px;\n  --radius-pill: 100px;\n  --radius-page: 32px;\n  --shadow-panel: 0 3px 0 var(--color-border), 0 22px 44px -22px var(--color-shadow);\n  --shadow-control: 0 3px 0 color-mix(in srgb, black 14%, transparent);\n  --shadow-control-hover: 0 5px 0 color-mix(in srgb, black 14%, transparent);\n  --shadow-control-pressed: 0 1px 0 color-mix(in srgb, black 14%, transparent);\n  --shadow-dialog: 0 4px 0 var(--color-border), 0 40px 80px -30px var(--color-shadow);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: linear-gradient(to bottom right, var(--color-fill-1) 15%, var(--color-fill-2));\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 88%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 3px solid color-mix(in srgb, var(--color-focus) 30%, transparent);\n  --transition: transform 0.12s ease, box-shadow 0.12s ease, background-color 0.12s ease;\n  --backdrop-blur: 0px;\n}\n"
  }
}
