{
  "id": "v1-bg-7331",
  "long_id": "v1.bento-grids.docs.s07.p03.t03.u01",
  "name": "Documentation hub bento, 2025",
  "era": {
    "slug": "bento-grids",
    "code": "bg",
    "name": "Bento grids",
    "years": [
      2022,
      2026
    ],
    "description": "Feature grids, 2022 to 2026: rounded cells of unequal size, each holding one idea, packed into a tight grid on a dark or very pale page."
  },
  "archetype": "docs",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": false,
    "responsive": true
  },
  "summary": "A documentation home page laid out as a bento: the ways into the docs (a quickstart, the reference, the libraries, the guides, the status, what is new) are rounded cells of unequal width in a grid of five tracks, with the largest cell asking the reader where to start. Cells are cream on sage paper and every one is drawn with a 2px ink outline and no shadow, a few of them filled flat with lime, butter or clay, and the header is the two-row bar of a documentation site with a search field in its middle. The form was common for developer documentation, help centres and product handbooks from about 2022 to 2026.",
  "url": "https://chrono.skin/s/v1-bg-7331",
  "preview_url": "https://chrono.skin/s/v1-bg-7331/specimen.html",
  "files": {
    "STYLE.md": "# Documentation hub bento, 2025\n\n## Summary\n\nA documentation home page laid out as a bento: the ways into the docs (a quickstart, the reference, the libraries, the guides, the status, what is new) are rounded cells of unequal width in a grid of five tracks, with the largest cell asking the reader where to start. Cells are cream on sage paper and every one is drawn with a 2px ink outline and no shadow, a few of them filled flat with lime, butter or clay, and the header is the two-row bar of a documentation site with a search field in its middle. The form was common for developer documentation, help centres and product handbooks from about 2022 to 2026.\n\n## Layout\n\n- Fixed centred column: `--size-page` is 1240px, designed at a 1440px viewport, padded by `--space-5` (20px) at the sides. The header's and the footer's rules run the full width; everything else stays in the column.\n- `.ds-nav` is sticky and has two rows. The first, `--size-nav` (56px) tall, holds the `.ds-brand`, a version badge, the search field `.ds-nav__search` (at most `--size-search`, 400px, centred) and at the right one small button and the account `.ds-avatar` with its `.ds-menu`. Under a faint rule the second row, `--size-subnav` (44px), holds the sections as plain text links; the current one is underlined with `--border-width-strong` in `--color-link`, and one of them opens a `.ds-menu`. A status line sits at the right end of the second row.\n- `.ds-grid` has five equal tracks (about 237px). A cell takes one track by default, two with `--w2`, three with `--w3`, all five with `--full`, and two rows with `--tall`. A cell is at least `--size-row` (212px) tall; inside `.ds-grid--auto`, in the rail and with `--flush` it follows its content.\n- The home page is one grid. Rows one and two: the `.ds-hero` cell, three tracks by two rows, with a two-track code cell over two one-track cells beside it. Row three: a two-track list, a one-track status cell, a two-track `.ds-carousel`. Row four: the `.ds-stats` strip in a `--full --flush` cell. Row five: a two-track cell, a one-track cell and the two-track `--accent` cell. No two neighbouring rows split the same way.\n- Cells never touch: the gap is `--space-gap` (14px) in both directions, the padding inside a cell `--space-cell` (24px), in the hero `--space-7` (40px).\n- Spacing scale: `--space-1` 4px (pill padding, title to caption), `--space-2` 8px (button gap, label to control, chips), `--space-3` 12px (control padding, table cell padding, cell head to body), `--space-4` 16px (stack gap inside a cell, form gap, list row padding), `--space-5` 20px (page gutter, tab gap, under the page header), `--space-6` 28px (above the first cell, footer padding), `--space-7` 40px (hero padding, above a section label), `--space-8` 56px (under the last cell, dialog stage), `--space-9` 88px (textarea height).\n- Controls are `--size-control` (36px) tall, `--size-control-large` (46px) in the hero, 28px with `--small`; icon tiles are `--size-icon` (36px) with a `--size-glyph` (18px) line icon; an avatar is `--size-avatar` (32px).\n- Inner pages (a list of guides, one guide, a reference page, a settings page) have no hero. A view starts `--space-6` under the bar with the `.ds-breadcrumb`, then the `.ds-page-header` on the bare page: title at `--text-h1` with an optional badge beside it, one line of text, buttons at the right, and a rule under it. Below, `.ds-layout` splits the column into `.ds-layout__main` and a `.ds-layout__rail` of `--size-rail` (252px) at the right, sticky under the bar. The main column starts with an optional `.ds-toolbar` holding the `.ds-tabs` and continues with a `.ds-grid--auto` of the same five tracks, in which cells pair as three and two or take the full width. The rail is a stack of small cells: a `.ds-sidebar`, a progress cell, a legend. A guide has no page header: its `.ds-prose` starts with the h1 in the first cell.\n- Views: `home` is the hub (hero, quickstart sample, reference, libraries, starter guides, status, what is new, the figures, the forum, change notes, the call for a key); `guides` is the list (tabs, the list with pagination, two reading paths in panels, the empty state for migration guides, topics and authors in the rail); `guide` is one guide (prose, code, notices, links, questions as an accordion, the page's contents and its author in the rail); `reference` is one resource (the endpoint table, parameters as an accordion, a sample answer, usage and the label legend in the rail); `keys` is the account page (the form for a key with its buttons, the dialog that revokes one, the table of keys, safety switches and a notice in the rail). The second row marks Overview, Guides, API reference or Keys; a guide marks Guides.\n- Below 1080px the grid drops to two tracks, `--w3` and the hero take both, and the rail moves under the main column as two columns. Below 640px everything is one column, the search field takes the room between brand and avatar, the version badge, the header button, the key hint and the status line hide, the links of the second row wrap, the stats strip becomes two by two, a table hides its `.ds-table__extra` columns and scrolls inside `.ds-table__scroll`, a drop-down in the second row opens as a full row inset by `--space-4`, and a tooltip opens as a full row under its line.\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\n- A neutral graphite ramp without any blue in it: `--color-page`, `--color-canvas` and `--color-bar` `#1c1c1c`; cells `--color-surface` `#232323`; panels, the dialog and current navigation items `--color-surface-alt` `#2e2e2e`; current tab, neutral badges, chart bars and inline code `--color-surface-strong` `#3e3e3e`. `--color-bar-alt` and `--color-input` are the darker `#161616` (table head strip, tab row, form controls).\n- Text: `--color-bar-text` `#ffffff` (brand and hovered navigation), `--color-heading` `#ededed`, `--color-text` and `--color-heading-alt` `#dddddd`, `--color-text-muted`, `--color-link-quiet` and `--color-bar-alt-text` `#a0a0a0`, `--color-disabled-text` `#707070`.\n- Green leads. `--color-button` and `--color-accent` are the deeper green `#37996b` with white text: primary button, accent badge, highlighted chart bar, call-to-action cell. `--color-link`, `--color-focus` and `--color-success` are the brighter `#3ecf8e`: links, icons, the accent phrase of the hero title.\n- `--color-accent-alt` `#569cd6` is a quiet blue for \"new\" markers, passed checks, switched-on toggles and code keys, so that green stays the brand colour and the status colour only.\n- Borders are solid greys, not translucent white: `--color-border` `#343434`, `--color-border-strong` and `--color-input-border` `#505050`, `--color-border-muted` `#2e2e2e`.\n- Feature cells are barely tinted: `--color-fill-1` `#002533` (teal), `--color-fill-2` `#28302c` (green-grey), `--color-fill-3` `#0c0f24` (navy), `--color-fill-4` `#2e2e2e`.\n- Status: `--color-warning` `#f7be2b`, `--color-danger` `#fa1f41` on `--color-danger-surface` `#201818`; the notice is `--color-notice` `#002533` with `--color-notice-text` `#dddddd`. `--color-inverse` `#ededed` with `--color-inverse-text` `#1c1c1c` is the button on the accent cell.\n- One neutral grotesque, Inter first with the system sans behind it, for `--font-body`, `--font-heading` and `--font-ui`; `--font-mono` is the system mono.\n- Heavy headings: `--weight-display` 800 on the hero title and stat figures, `--weight-heading` and `--weight-bold` 700 on every title, `--weight-ui` 600 on buttons, navigation, tabs and labels, `--weight-body` 400.\n- Sizes are a step up from the usual: `--text-display` 56px at `--line-display` 1.06, `--text-h1` 46px, `--text-h2` 32px, `--text-h3` 22px at `--line-heading` 1.15; `--text-large` 20px for the lead and cell titles.\n- `--text-base` and `--text-ui` are both 16px (`--line-body` 1.5), so buttons, navigation and form controls read as large as the body; `--text-small` 14px is for captions, tables and lists.\n- Links in running text are underlined at rest and on hover (`--link-decoration`, `--link-decoration-hover` underline); quiet links in navigation, sidebar and footer are not (`--link-decoration-quiet` none). No tracking, no transforms.\n- Medium corners: `--radius-page` 20px on cells, `--radius-panel` 16px on panels, tables, notices and the dialog, `--radius-control` 11px on buttons, inputs and icon tiles, `--radius-pill` for badges, tabs and switches.\n- Cells are lit, not dropped: `--shadow-panel` is a 1px inset line of `--color-heading` at 5% on the top edge plus a 20px halo of `--color-accent` at 32%, so every cell stands in a glow of the accent colour that fills the gaps of the grid; the dialog has the same halo at 36%.\n- `--fill-panel` is a vertical gradient from 2% to 6% of `--color-text` laid into `--color-surface`: the cell is a touch stronger at the bottom than at the top.\n- Buttons are lit from above: `--fill-button` runs from the button colour mixed 15% with white down to the plain colour, `--shadow-control` adds an inset top line of `--color-heading` at 10% and a 2px drop of `--color-shadow` at 28%; hover deepens the drop to 4px at 25% and `--fill-button-hover` moves 15% toward the button's text colour.\n- `--fill-bar` is `--color-bar` at 80% so the page shows through the floating navigation pill. `--border-width` is 1px, `--border-width-strong` 2px for the focus ring. `--transition` is a 0.2s fade of colours and shadow.\n- The smallest text is 12px, written as `calc(var(--text-small) * 0.857)` because the vocabulary has no token for it: badges, hints, list meta, stat notes, the footer strip. Code in a cell is `calc(var(--text-small) * 0.886)`.\n- Which text sits on which fill: `--color-bar-text` on the navigation pill (current item on `--color-surface-alt`); `--color-heading`, `--color-text` and `--color-text-muted` on cells, including the hero cell, the footer cell and the `--color-fill-*` cells; `--color-accent-text` on the accent cell; `--color-bar-alt-text` on the table head strip and the tab row; `--color-inverse-text` only on the `--inverse` button. Table rows have no fill of their own and take `--color-text` on the cell.\n- Fills 1 to 3 are the corner of a diagonal gradient that fades to `--color-surface`; fill 4 is flat. At most half the cells of a grid are tinted.\n- The hero glow and the `--glow` cell are a radial fade from `--color-fill-2` to transparent, so a glow is always the palette's own tint (green-grey here) and a palette with neutral fills simply has none; the accent colour is never used for it.\n- One-off mixes written in `components.css` because no token exists: the button hairline (25% button text in the button colour), the `--new` and status badges (the colour at 14% with a 30% hairline), the danger button's hairline (danger at 45%) and hover fill, notice borders.\n\n## Components\n\n- `.ds-page` on `<body>`: sage page, family and 15px text. `.ds-page__inner` is the 1240px column of a view.\n- `.ds-nav`: the two-row header. `.ds-nav__inner` (brand, badge, `.ds-nav__search` with `.ds-nav__glass`, `.ds-nav__field` and `.ds-nav__key`, `.ds-nav__actions` with `.ds-nav__account`), `.ds-nav__rule`, then `.ds-nav__sub` with `.ds-nav__links` of `.ds-nav__entry` holding a `.ds-nav__link` (`is-current` by hand) and `.ds-nav__meta` with a `.ds-nav__dot`. `.ds-nav__extra` marks what hides on a phone.\n- `.ds-brand`: the site's mark and name at the left of the first row. `.ds-brand__mark` is a 26px tile dressed like the primary button (`--fill-button`, `--color-button-text`, outline, `--radius-control`, `--shadow-control`) holding the mark as inline SVG; `.ds-brand__name` is the name in the heading family at 17px. The name `chronoskin` and its mark are placeholders: the installing project puts its own name and logo here.\n- `.ds-hero`: the largest cell of the home grid, always together with `.ds-grid__cell--w3` and `--tall`. A badge, `.ds-hero__title`, `.ds-hero__lead` at the top; `.ds-hero__actions` with two large buttons and `.ds-hero__note` with a row of badge links at the bottom.\n- `.ds-grid`: the bento. `.ds-grid__cell` with spans `--w2`, `--w3`, `--full`, `--tall`; `--stack` (16px between children), `--row` (children side by side), `--flush` (no padding, clipped, for the stats strip and the dialog stage), fills `--fill-1` to `--fill-4`, `--accent` (the closing call), `--bare` (outline only). Inside: `.ds-grid__head` (title left, badge right), `.ds-grid__icon` with `.ds-grid__glyph`, `.ds-grid__title`, `.ds-grid__text`, `.ds-grid__copy`, `.ds-grid__visual` and `.ds-grid__actions` (both pushed to the bottom), `.ds-grid__more` (the cell's one link). `.ds-grid--auto` is for cells that hold components.\n- `.ds-layout`: main column and rail of an inner page, `.ds-layout__main` and `.ds-layout__rail`. `.ds-section__label` with `.ds-section__title` is a small heading on the bare page above a further run of cells.\n- `.ds-page-header`: the head of an inner page, on the bare page with a rule under it. `.ds-page-header__copy` holds `.ds-page-header__title` (an h1, optionally with a badge) and `.ds-page-header__text`; `.ds-page-header__actions` sits at the right. Put a `.ds-breadcrumb` above it; never use it with a `.ds-hero`.\n- `.ds-stat`: one figure: `.ds-stat__label` over `.ds-stat__value` (36px, with an optional `.ds-stat__unit`) over a 12px `.ds-stat__note` (`--success`, `--warning`, `--danger`). `.ds-stats` is the row: four figures in one `--full --flush` cell, parted by upright rules. `.ds-stat--display` raises a single figure to the display size.\n- `.ds-prose`: long text in a full-width cell; styles h1 to h3, paragraphs, lists, `strong`, `code` and links.\n- `.ds-link`: underlined inline link with `is-visited`, `is-hover`, `is-active`, `is-focus`; `--quiet` for grey links without underline. `.ds-links` lays several out in a row.\n- `.ds-button`: green primary with an ink lip. `--secondary` cream with an ink outline, `--danger` red text on `--color-danger-surface` (never a solid red block), `--inverse` ink for the accent cell, `--large`, `--small`; states `is-hover`, `is-active`, `is-focus`, `is-disabled`. Group with `.ds-buttons`.\n- `.ds-badge`: 12px pill with an outline. `--accent`, `--new`, `--count` (a number in a sidebar row), optional `.ds-badge__dot`; status labels `--success` (stable, live), `--warning` (beta, unused), `--danger` (leaving, failed). `.ds-chips` wraps several.\n- `.ds-endpoint`: a method in `.ds-endpoint__verb` and a path, in mono; used in tables and cell heads.\n- `.ds-form`: two-column grid of `.ds-form__field` (`--full`) with `.ds-form__label`, `.ds-form__control` (`--area`; `is-invalid`, `is-focus`, `is-disabled`), `.ds-form__hint`, `.ds-form__error`, `.ds-form__check` with `.ds-form__checkbox`, and `.ds-form__actions`.\n- `.ds-table`: a 14px-rounded box with a `--fill-bar-alt` head and faint row rules, inside `.ds-table__scroll`; `.ds-table__link` on a row's first cell, `.ds-table__num`, `.ds-table__muted`, `.ds-table__extra` (hidden on a phone), `tr.is-current`.\n- `.ds-list`: rule-separated `.ds-list__item` with `.ds-list__title`, `.ds-list__text`, `.ds-list__meta`; `.ds-list__row` puts a badge beside the title. `.ds-rows` with `.ds-rows__item` is the plain label-and-control list used for switches.\n- `.ds-panel`: the small 14px card inside a cell, `.ds-panel__title`, `.ds-panel__body`, `.ds-panel__meta`; `.ds-panels` puts two side by side.\n- `.ds-tabs`: text labels on a rule, `.ds-tabs__tab`, the current one (`is-current`) underlined in `--color-link`. `.ds-toolbar` holds it above the main column's grid.\n- `.ds-sidebar`: a rail cell with `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__link` (`is-current` filled): topics of a list, the contents of a page.\n- `.ds-notice`: information box with `.ds-notice__title` and `.ds-notice__text`; `--error` for the red variant. `.ds-notices` stacks them.\n- `.ds-pagination`: `.ds-pagination__link` items; `is-current` outlined, `is-disabled` greyed.\n- `.ds-breadcrumb`: 14px trail of `.ds-breadcrumb__item` parted by slashes, the last `is-current`; the first thing of an inner view.\n- `.ds-dialog`: 460px box with `.ds-dialog__bar` (`.ds-dialog__title`, `.ds-dialog__close` with `.ds-dialog__glyph`), `.ds-dialog__body`, `.ds-dialog__actions`, shown on a `.ds-stage` filled with `--color-overlay` inside a `--flush` cell.\n- `.ds-empty`: centred `.ds-empty__title`, `.ds-empty__text` and one secondary button inside a `--bare` cell.\n- `.ds-code`: a mono sample in a cell, with `.ds-code__key` and `.ds-code__str`. `.ds-checks` with `.ds-checks__item` and `.ds-checks__mark` is a ticked list; `.ds-chart` with `.ds-chart__bar` a small bar chart.\n- `.ds-menu`: a drop-down under its trigger, opened by hover or keyboard focus (`is-open` by hand). `.ds-menu__list` of `.ds-menu__item` with an optional `.ds-menu__hint`, parted by `.ds-menu__rule`; `.ds-menu__caret` in the trigger; `--end` aligns it to the right edge. Used under Libraries and under the account avatar.\n- `.ds-accordion`: `<details>` as `.ds-accordion__item` with a `.ds-accordion__head` summary and `.ds-accordion__body`; questions under a guide, parameters of an endpoint.\n- `.ds-tooltip`: a focusable term with `.ds-tooltip__mark` and `.ds-tooltip__tip`, shown on hover or focus (`is-open` by hand) on `--fill-inverse`. For one sentence of explanation, never for an action.\n- `.ds-carousel`: `.ds-carousel__track` of `.ds-carousel__slide` with scroll snap, one showing; `.ds-carousel__foot` holds `.ds-carousel__dots` (`.ds-carousel__dot`, `is-current`) and `.ds-carousel__arrows` of `.ds-carousel__arrow` with a `.ds-carousel__glyph`. Used for what is new.\n- `.ds-switch`: a label around `.ds-switch__input` (a checkbox) and `.ds-switch__track`; on is `--color-accent-alt` with an ink knob.\n- `.ds-progress`: `.ds-progress__label` with `.ds-progress__value` over `.ds-progress__bar` with `.ds-progress__fill` (`--1` to `--5` set the width; `--success`, `--warning` the colour). Uptime, quota, place in a reading path.\n- `.ds-avatar`: initials on a disc, `--accent`, `--large`; `.ds-avatars` overlaps several; `.ds-person` puts one beside `.ds-person__copy` with `.ds-person__name` and `.ds-person__meta`.\n- `.ds-footer`: one line under a rule: `.ds-footer__inner` with `.ds-footer__brand`, a `.ds-footer__list` of `.ds-footer__link` and `.ds-footer__text`.\n\n## Never\n\n- `block-gap <= 40px`: cells sit 14px apart and nothing stands further than 40px from its neighbour.\n- `content-width <= 1240px`: content stays in the centred column.\n- `palette-colours <= 36`: graphite greys, two greens and one blue; no purple, no second brand colour.\n- `font-weight <= 800`: 800 is the hero weight; nothing is heavier.\n- `font-size <= 56px`: the hero heading tops out at 56px; weight carries the emphasis, not size.\n- `font-size >= 12px`: the smallest text is 12px.\n- `font-families <= 2`: one sans for everything plus the mono for code.\n- `line-height <= 1.6`: body text sits at 1.5.\n- `uppercase-text <= 1%`: nothing is set in capitals.\n- `border-width <= 2px`: every hairline is 1px; 2px exists only as the focus ring.\n- `border-radius >= 4px`: no box is square; the smallest measured radius is 4px.\n- `text-shadow = none`: no visible text shadows.\n- `box-shadow-blur <= 25px`: shadows are quiet; the largest measured blur is 25px.\n- `gradient-fills <= 30%`: gradients are faint cell lighting and glows, on at most about a third of boxes.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. A new way into the docs is a `.ds-grid__cell` whose span keeps its row uneven, with a title, one caption and either a `.ds-grid__more` link or one small visual; a new box inside a cell is a `.ds-panel`; a new label is a `.ds-badge`; anything that belongs beside the working column goes in the rail as a small cell. Use tokens only: fills are `--fill-panel`, a `--color-surface*` or a flat `--color-fill-*`, outlines are `--border-width` in `--color-border`, corners `--radius-page` for cells, `--radius-panel` inside them and `--radius-control` for controls, spacing from the `--space-*` scale. Keep one subject per cell, part cells with the gap and never with a rule, and do not add a blurred shadow, a gradient fill or a second accent.\n",
    "components.css": "/* Layout tokens (structure part) */\n:root {\n  --size-page: 1240px;\n  --size-measure: 660px;\n  --size-nav: 56px;\n  --size-subnav: 44px;\n  --size-rail: 252px;\n  --size-search: 400px;\n  --size-control: 36px;\n  --size-control-large: 46px;\n  --size-row: 212px;\n  --size-icon: 36px;\n  --size-glyph: 18px;\n  --size-check: 16px;\n  --size-dot: 8px;\n  --size-chart: 96px;\n  --size-switch: 34px;\n  --size-knob: 14px;\n  --size-avatar: 32px;\n  --size-dialog: 460px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 20px;\n  --space-6: 28px;\n  --space-7: 40px;\n  --space-8: 56px;\n  --space-9: 88px;\n  --space-gap: 14px;\n  --space-cell: 24px;\n}\n\n/* shell */\n.ds-page {\n  margin: 0;\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  -webkit-font-smoothing: antialiased;\n}\n.ds-page *,\n.ds-page *::before,\n.ds-page *::after {\n  box-sizing: border-box;\n}\n.ds-page__inner {\n  width: 100%;\n  max-width: calc(var(--size-page) + var(--space-5) * 2);\n  margin: 0 auto;\n  padding: var(--space-6) var(--space-5) var(--space-8);\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/* nav: a documentation header of two rows. Brand, search and account above; the sections below */\n.ds-nav {\n  position: sticky;\n  top: 0;\n  z-index: 10;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-nav__inner,\n.ds-nav__sub {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  max-width: calc(var(--size-page) + var(--space-5) * 2);\n  margin: 0 auto;\n  padding: 0 var(--space-5);\n}\n.ds-nav__inner {\n  min-height: var(--size-nav);\n}\n.ds-nav__sub {\n  min-height: var(--size-subnav);\n  justify-content: space-between;\n}\n.ds-nav__rule {\n  height: 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-nav__search {\n  position: relative;\n  display: flex;\n  flex: 0 1 var(--size-search);\n  align-items: center;\n  margin: 0 auto;\n  color: var(--color-input-text);\n}\n.ds-nav__glass {\n  position: absolute;\n  left: var(--space-3);\n  width: var(--size-check);\n  height: var(--size-check);\n  opacity: 0.6;\n  pointer-events: none;\n}\n.ds-nav__field {\n  width: 100%;\n  min-height: var(--size-control);\n  padding: 0 var(--space-7) 0 calc(var(--space-6) + var(--space-2));\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: 1.4;\n  transition: var(--transition);\n}\n.ds-nav__field::placeholder {\n  color: var(--color-disabled-text);\n}\n.ds-nav__field:focus-visible,\n.ds-nav__field.is-focus {\n  outline: var(--focus-ring);\n  border-color: var(--color-focus);\n}\n.ds-nav__key {\n  position: absolute;\n  right: var(--space-2);\n  padding: 0 var(--space-2);\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  border-radius: calc(var(--radius-control) / 2);\n  font-family: var(--font-mono);\n  font-size: calc(var(--text-small) * 0.857);\n  line-height: 1.7;\n}\n.ds-nav__actions {\n  display: flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-nav__account {\n  display: flex;\n  padding: 0;\n  background: transparent;\n  border: 0;\n  border-radius: var(--radius-pill);\n  cursor: pointer;\n}\n.ds-nav__account:focus-visible,\n.ds-nav__account.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-nav__links {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  gap: 0 var(--space-5);\n  min-height: var(--size-subnav);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__entry {\n  display: flex;\n}\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-subnav);\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1.2;\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  color: var(--color-link-quiet);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  color: var(--color-bar-text);\n}\n/* the current view marks its section; one guide belongs to Guides */\n.ds-nav__link.is-current,\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(#guides:target) .ds-nav__link[href=\"#guides\"],\n.ds-page:has(#guide:target) .ds-nav__link[href=\"#guides\"],\n.ds-page:has(#reference:target) .ds-nav__link[href=\"#reference\"],\n.ds-page:has(#keys:target) .ds-nav__link[href=\"#keys\"] {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-link);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-nav__meta {\n  display: flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-2);\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-link-quiet);\n}\n.ds-nav__dot {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  background: var(--color-success);\n  border-radius: var(--radius-pill);\n}\n\n/* hero: the largest cell of the hub. A question, a lead and the two ways in */\n.ds-grid .ds-hero {\n  justify-content: space-between;\n  gap: var(--space-6);\n  padding: var(--space-7);\n  background: radial-gradient(circle at 100% 0, var(--color-fill-1), transparent 58%), var(--fill-panel);\n}\n.ds-hero__title {\n  max-width: 15ch;\n  margin: var(--space-4) 0 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  color: var(--color-heading);\n}\n.ds-hero__lead {\n  max-width: 46ch;\n  margin: var(--space-4) 0 0;\n  font-size: var(--text-large);\n  line-height: 1.5;\n  color: var(--color-text-muted);\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n.ds-hero__note {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n  margin: var(--space-4) 0 0;\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-text-muted);\n}\n\n/* section label: a small heading on the bare page above a run of cells */\n.ds-section__label {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-4);\n  margin: var(--space-7) 0 var(--space-4);\n}\n.ds-section__title {\n  margin: 0;\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  color: var(--color-heading);\n}\n\n/* inner page: the trail, then the page header on the bare page with a rule under it */\n.ds-page-header {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-4) var(--space-6);\n  margin: 0 0 var(--space-5);\n  padding-bottom: var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-page-header__copy {\n  flex: 1;\n  min-width: 0;\n}\n.ds-page-header__title {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin: 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  color: var(--color-heading);\n}\n.ds-page-header__text {\n  max-width: var(--size-measure);\n  margin: var(--space-2) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-2);\n}\n\n/* layout of an inner page: the working column and a narrow rail at the right */\n.ds-layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-rail);\n  align-items: start;\n  gap: var(--space-gap);\n}\n.ds-layout__main {\n  min-width: 0;\n}\n.ds-layout__rail {\n  position: sticky;\n  top: calc(var(--size-nav) + var(--size-subnav) + var(--space-4));\n  display: grid;\n  gap: var(--space-gap);\n  min-width: 0;\n}\n\n/* grid: the bento. Five tracks; a cell takes one, two, three or all of them */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(5, minmax(0, 1fr));\n  grid-auto-flow: dense;\n  gap: var(--space-gap);\n}\n.ds-grid--auto .ds-grid__cell {\n  min-height: 0;\n}\n.ds-grid__cell {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  min-height: var(--size-row);\n  padding: var(--space-cell);\n  background: var(--fill-panel);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-panel);\n}\n.ds-grid__cell--w2 {\n  grid-column: span 2;\n}\n.ds-grid__cell--w3 {\n  grid-column: span 3;\n}\n.ds-grid__cell--full {\n  grid-column: 1 / -1;\n}\n.ds-grid__cell--tall {\n  grid-row: span 2;\n}\n.ds-grid__cell--stack {\n  gap: var(--space-4);\n}\n.ds-grid__cell--fill-1 {\n  background: var(--color-fill-1);\n}\n.ds-grid__cell--fill-2 {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--fill-3 {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--fill-4 {\n  background: var(--color-fill-4);\n}\n.ds-grid__cell--accent {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  border-color: transparent;\n}\n.ds-grid__cell--bare {\n  background: transparent;\n  box-shadow: none;\n  border-color: var(--color-border-strong);\n}\n.ds-grid__cell--flush {\n  min-height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.ds-grid__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin-bottom: var(--space-3);\n}\n.ds-grid__icon {\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  margin-bottom: var(--space-4);\n  background: var(--color-page);\n  color: var(--color-link);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n}\n.ds-grid__head .ds-grid__icon {\n  margin-bottom: 0;\n}\n.ds-grid__glyph {\n  width: var(--size-glyph);\n  height: var(--size-glyph);\n}\n.ds-grid__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-heading);\n  line-height: 1.25;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-heading);\n  text-decoration: none;\n}\n.ds-grid__cell--accent .ds-grid__title {\n  font-size: var(--text-h2);\n  line-height: var(--line-heading);\n  color: var(--color-accent-text);\n}\n.ds-grid__text {\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  line-height: 1.5;\n  color: var(--color-text-muted);\n}\n.ds-grid__cell--accent .ds-grid__text {\n  max-width: 52ch;\n  margin-top: var(--space-2);\n  font-size: var(--text-base);\n  color: var(--color-accent-text);\n  opacity: 0.85;\n}\n.ds-grid__copy {\n  flex: 1;\n  min-width: 0;\n}\n.ds-grid__visual {\n  width: 100%;\n  margin-top: auto;\n  padding-top: var(--space-4);\n}\n.ds-grid__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n  margin-top: auto;\n  padding-top: var(--space-4);\n}\n.ds-grid__more {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  margin-top: auto;\n  padding-top: var(--space-4);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  color: var(--color-link);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-grid__more:hover,\n.ds-grid__more.is-hover {\n  color: var(--color-link-hover);\n}\n\n/* stats: one cell cut into figures by upright rules */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  margin: 0;\n  padding: var(--space-cell) 0;\n  list-style: none;\n}\n.ds-stats .ds-stat {\n  padding: 0 var(--space-cell);\n  border-left: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-stats .ds-stat:first-child {\n  border-left: 0;\n}\n\n/* tabs: a row of labels on a rule; the current one is underlined */\n.ds-tabs {\n  display: flex;\n  align-items: stretch;\n  gap: var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-tabs__tab {\n  display: block;\n  margin-bottom: calc(var(--border-width) * -1);\n  padding: var(--space-2) 0 var(--space-3);\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1.2;\n  text-transform: var(--ui-transform);\n  color: var(--color-text-muted);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-heading);\n}\n.ds-tabs__tab.is-current {\n  color: var(--color-heading);\n  border-bottom-color: var(--color-link);\n}\n.ds-tabs__tab:focus-visible,\n.ds-tabs__tab.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-4);\n  margin-bottom: var(--space-gap);\n}\n.ds-toolbar .ds-tabs {\n  flex: 1;\n}\n\n/* endpoint: a method label and a path in mono */\n.ds-endpoint {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  font-family: var(--font-mono);\n  font-size: calc(var(--text-small) * 0.928);\n  color: var(--color-text);\n}\n.ds-endpoint__verb {\n  padding: 0 var(--space-2);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  border-radius: calc(var(--radius-control) / 2);\n  font-weight: var(--weight-bold);\n  line-height: 1.7;\n}\n\n/* footer: one quiet line under a rule */\n.ds-footer {\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-footer__inner {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4) var(--space-6);\n  max-width: calc(var(--size-page) + var(--space-5) * 2);\n  margin: 0 auto;\n  padding: var(--space-6) var(--space-5);\n}\n.ds-footer__brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-heading);\n}\n.ds-footer__text {\n  margin: 0;\n  font-size: calc(var(--text-small) * 0.857);\n}\n.ds-footer__list {\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.ds-footer__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  color: var(--color-link-hover);\n}\n/* brand: the mark on a small tile dressed like the primary button, then the name */\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: calc(var(--size-glyph) + var(--space-1));\n  height: calc(var(--size-glyph) + var(--space-1));\n  background: var(--color-button);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-button-text) 25%, var(--color-button));\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 72%;\n  height: 72%;\n}\n.ds-brand__name {\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-heading);\n  line-height: 1;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-bar-text);\n}\n/* small things that live inside cells */\n.ds-chart {\n  display: flex;\n  align-items: flex-end;\n  gap: var(--space-2);\n  height: var(--size-chart);\n}\n.ds-chart__bar {\n  flex: 1;\n  height: 30%;\n  background: var(--color-surface-strong);\n  border-radius: calc(var(--radius-control) / 2);\n}\n.ds-chart__bar.is-current {\n  background: var(--fill-accent);\n}\n.ds-stat {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  min-width: 0;\n  margin: 0;\n}\n.ds-stat__label {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n.ds-stat__value {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: 1;\n  letter-spacing: var(--display-tracking);\n  font-variant-numeric: tabular-nums;\n  color: var(--color-heading);\n}\n.ds-stat__unit {\n  font-size: var(--text-h3);\n  color: var(--color-text-muted);\n}\n.ds-stat__note {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  font-size: calc(var(--text-small) * 0.857);\n  line-height: 1.34;\n  color: var(--color-text-muted);\n}\n.ds-stat__note--success {\n  color: var(--color-success);\n}\n.ds-stat__note--warning {\n  color: var(--color-warning);\n}\n.ds-stat--display .ds-stat__value {\n  font-size: var(--text-display);\n}\n.ds-stat--display .ds-stat__unit {\n  font-size: var(--text-h2);\n}\n.ds-code {\n  margin: 0;\n  padding: var(--space-4);\n  overflow: hidden;\n  background: var(--color-page);\n  color: var(--color-text-muted);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  font-family: var(--font-mono);\n  font-size: calc(var(--text-small) * 0.886);\n  line-height: 1.6;\n  white-space: pre;\n}\n.ds-code__key {\n  color: var(--color-accent-alt);\n}\n.ds-code__str {\n  color: var(--color-link);\n}\n.ds-checks {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n  color: var(--color-text);\n}\n.ds-checks__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-checks__mark {\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  color: var(--color-accent-alt);\n}\n.ds-chips {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n.ds-rows {\n  display: grid;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n}\n.ds-rows__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-3) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n\n/* typography */\n.ds-prose {\n  color: var(--color-text);\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0;\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  color: var(--color-heading);\n}\n.ds-prose h1 {\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\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  font-size: var(--text-h3);\n  color: var(--color-heading-alt);\n}\n.ds-prose p,\n.ds-prose ul {\n  margin: var(--space-3) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-prose ul {\n  padding-left: var(--space-5);\n}\n.ds-prose li + li {\n  margin-top: var(--space-1);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n  color: var(--color-text);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  border-radius: calc(var(--radius-control) / 2);\n  font-family: var(--font-mono);\n  font-size: 87.5%;\n}\n.ds-prose a {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-prose a:hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\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  border-radius: calc(var(--radius-control) / 2);\n}\n.ds-link--quiet {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  font-size: var(--text-small);\n}\n\n/* buttons: small, 8px corners, a hairline one step lighter than the fill */\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  min-height: var(--size-control);\n  padding: 0 var(--space-4);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-button-text) 25%, var(--color-button));\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  cursor: pointer;\n  transition: var(--transition);\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}\n.ds-button:active,\n.ds-button.is-active {\n  background: color-mix(in srgb, var(--color-button) 85%, var(--color-shadow));\n  box-shadow: var(--shadow-control-pressed);\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  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n  border-color: var(--color-border-strong);\n}\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--color-surface-strong);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--secondary:active,\n.ds-button--secondary.is-active {\n  background: var(--color-surface);\n}\n.ds-button--danger {\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n  border-color: color-mix(in srgb, var(--color-danger) 45%, transparent);\n}\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: color-mix(in srgb, var(--color-danger) 20%, var(--color-danger-surface));\n  color: var(--color-danger);\n}\n.ds-button--danger:active,\n.ds-button--danger.is-active {\n  background: var(--color-danger-surface);\n}\n.ds-button--inverse {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  border-color: transparent;\n}\n.ds-button--inverse:hover,\n.ds-button--inverse.is-hover {\n  background: color-mix(in srgb, var(--color-inverse) 86%, var(--color-inverse-text));\n  color: var(--color-inverse-text);\n}\n.ds-button--large {\n  min-height: var(--size-control-large);\n  padding: 0 var(--space-5);\n  font-size: var(--text-base);\n}\n.ds-button--small {\n  min-height: var(--space-6);\n  padding: 0 var(--space-3);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  border-color: var(--color-border);\n  box-shadow: none;\n  cursor: not-allowed;\n}\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-1) var(--space-3);\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.857);\n  font-weight: var(--weight-ui);\n  line-height: 1.34;\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-badge--accent {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  border-color: transparent;\n}\n.ds-badge--new {\n  background: color-mix(in srgb, var(--color-accent-alt) 14%, transparent);\n  color: var(--color-accent-alt);\n  border-color: color-mix(in srgb, var(--color-accent-alt) 30%, transparent);\n}\n.ds-badge--success {\n  background: color-mix(in srgb, var(--color-success) 14%, transparent);\n  color: var(--color-success);\n  border-color: color-mix(in srgb, var(--color-success) 30%, transparent);\n}\n.ds-badge--warning {\n  background: color-mix(in srgb, var(--color-warning) 14%, transparent);\n  color: var(--color-warning);\n  border-color: color-mix(in srgb, var(--color-warning) 30%, transparent);\n}\n.ds-badge--danger {\n  background: color-mix(in srgb, var(--color-danger) 14%, transparent);\n  color: var(--color-danger);\n  border-color: color-mix(in srgb, var(--color-danger) 30%, transparent);\n}\n.ds-badge--count {\n  padding: var(--space-1) var(--space-2);\n  border-radius: var(--radius-control);\n  font-weight: var(--weight-bold);\n}\n.ds-badge__dot {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  background: var(--color-accent-alt);\n  border-radius: var(--radius-pill);\n}\n.ds-badge--success .ds-badge__dot,\n.ds-badge--warning .ds-badge__dot,\n.ds-badge--danger .ds-badge__dot {\n  background: currentColor;\n}\n\n/* form */\n.ds-form {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: var(--space-4);\n}\n.ds-form__field {\n  display: grid;\n  align-content: start;\n  gap: var(--space-2);\n  min-width: 0;\n}\n.ds-form__field--full {\n  grid-column: 1 / -1;\n}\n.ds-form__label {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1.2;\n  color: var(--color-text);\n}\n.ds-form__control {\n  width: 100%;\n  min-height: var(--size-control);\n  padding: var(--space-2) var(--space-3);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: 1.4;\n  transition: var(--transition);\n}\n.ds-form__control::placeholder {\n  color: var(--color-disabled-text);\n}\n.ds-form__control--area {\n  min-height: var(--space-9);\n  resize: vertical;\n}\n.ds-form__control:focus-visible,\n.ds-form__control.is-focus {\n  outline: var(--focus-ring);\n  border-color: var(--color-focus);\n}\n.ds-form__control.is-invalid {\n  border-color: var(--color-danger);\n}\n.ds-form__control:disabled,\n.ds-form__control.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n}\n.ds-form__hint {\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-text-muted);\n}\n.ds-form__error {\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-danger);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-form__checkbox {\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  accent-color: var(--color-accent);\n}\n.ds-form__actions {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  grid-column: 1 / -1;\n}\n\n/* table: its own 12px box inside a cell, hairline rows */\n.ds-table {\n  width: 100%;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  border-collapse: separate;\n  border-spacing: 0;\n  overflow: hidden;\n  font-size: var(--text-small);\n  text-align: left;\n}\n.ds-table th {\n  padding: var(--space-3) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-ui);\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n}\n.ds-table td {\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-page);\n  color: var(--color-text);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-table tr.is-current td {\n  background: var(--color-surface);\n}\n.ds-table__scroll {\n  max-width: 100%;\n  overflow-x: auto;\n}\n.ds-table .ds-table__link {\n  font-weight: var(--weight-bold);\n  color: var(--color-heading);\n  text-decoration: var(--link-decoration-quiet);\n  white-space: nowrap;\n}\n.ds-table .ds-table__link:hover,\n.ds-table .ds-table__link.is-hover {\n  color: var(--color-link);\n}\n.ds-table .ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n.ds-table .ds-table__muted {\n  color: var(--color-text-muted);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: grid;\n  gap: var(--space-1);\n  padding: var(--space-4) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n  border-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n}\n.ds-list__title {\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-heading);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  color: var(--color-link);\n}\n.ds-list__text {\n  margin: 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-list__meta {\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-text-muted);\n}\n\n/* panel: the small card. 12px corners, sits inside a cell or in a row of its own */\n.ds-panel {\n  min-width: 0;\n  padding: var(--space-5);\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n}\n.ds-panel__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-heading);\n  line-height: 1.4;\n  color: var(--color-heading-alt);\n}\n.ds-panel__body {\n  margin: var(--space-2) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-panel__meta {\n  display: block;\n  margin-top: var(--space-4);\n  font-size: calc(var(--text-small) * 0.857);\n  color: var(--color-text-muted);\n}\n.ds-panels {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: var(--space-3);\n}\n\n/* sidebar */\n.ds-sidebar {\n  font-size: var(--text-small);\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-3);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-heading);\n  color: var(--color-heading-alt);\n}\n.ds-sidebar__list {\n  display: grid;\n  gap: var(--space-1);\n  margin: 0 calc(var(--space-3) * -1);\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  font-size: var(--text-small);\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-sidebar__link.is-current {\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n}\n\n/* notice */\n.ds-notice {\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-notice-text) 20%, transparent);\n  border-radius: var(--radius-panel);\n  font-size: var(--text-small);\n}\n.ds-notice__title {\n  display: block;\n  font-weight: var(--weight-bold);\n}\n.ds-notice__text {\n  margin: 0;\n  opacity: 0.8;\n}\n.ds-notice--error {\n  background: var(--color-danger-surface);\n  color: var(--color-text);\n  border-color: color-mix(in srgb, var(--color-danger) 45%, transparent);\n}\n.ds-notice--error .ds-notice__title {\n  color: var(--color-danger);\n}\n.ds-notices {\n  display: grid;\n  gap: var(--space-3);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\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: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--space-6);\n  min-height: var(--space-6);\n  padding: 0 var(--space-3);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  color: var(--color-link-quiet);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-link-hover);\n  background: var(--color-surface-alt);\n}\n.ds-pagination__link.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-disabled-text);\n  pointer-events: none;\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-5);\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before {\n  content: \"/\";\n  margin-right: var(--space-2);\n  color: var(--color-disabled-text);\n}\n.ds-breadcrumb__item.is-current {\n  color: var(--color-text);\n}\n\n/* dialog: a lifted 12px box on a dimmed stage */\n.ds-dialog {\n  width: 100%;\n  max-width: var(--size-dialog);\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__bar {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-4) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-dialog__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-heading);\n  color: var(--color-heading);\n}\n.ds-dialog__close {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--space-6);\n  height: var(--space-6);\n  padding: 0;\n  background: transparent;\n  color: var(--color-text-muted);\n  border: 0;\n  border-radius: var(--radius-control);\n  cursor: pointer;\n}\n.ds-dialog__glyph {\n  width: var(--size-check);\n  height: var(--size-check);\n}\n.ds-dialog__close:hover,\n.ds-dialog__close.is-hover {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-dialog__body {\n  padding: var(--space-5);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-dialog__body p {\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--space-2);\n  padding: var(--space-4) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-stage {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-8) var(--space-5);\n  background: var(--color-overlay);\n}\n\n/* empty state: an empty cell with only an outline */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  flex: 1;\n  text-align: center;\n}\n.ds-empty__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-heading);\n  color: var(--color-heading);\n}\n.ds-empty__text {\n  max-width: 36ch;\n  margin: var(--space-1) 0 var(--space-5);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* switch: an on/off control drawn over a checkbox */\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  flex: none;\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  opacity: 0;\n  cursor: pointer;\n}\n.ds-switch__track {\n  position: relative;\n  display: block;\n  width: var(--size-switch);\n  height: calc(var(--size-knob) + var(--space-1));\n  background: var(--color-surface-strong);\n  border-radius: var(--radius-pill);\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: var(--size-knob);\n  height: var(--size-knob);\n  background: var(--color-text-muted);\n  border-radius: var(--radius-pill);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track {\n  background: var(--color-accent-alt);\n}\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: auto;\n  right: calc(var(--space-1) / 2);\n  background: var(--color-inverse);\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\n/* menu: a drop-down under its trigger, opened by hover or keyboard focus */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__caret {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  margin-left: var(--space-1);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 20;\n  display: none;\n  min-width: 24ch;\n  margin: 0;\n  padding: var(--space-2);\n  list-style: none;\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n  text-align: left;\n}\n.ds-menu--end .ds-menu__list {\n  left: auto;\n  right: 0;\n}\n.ds-menu:hover > .ds-menu__list,\n.ds-menu:focus-within > .ds-menu__list,\n.ds-menu.is-open > .ds-menu__list {\n  display: block;\n}\n.ds-menu__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n  color: var(--color-text);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-menu__item:hover,\n.ds-menu__item.is-hover,\n.ds-menu__item:focus-visible {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-menu__hint {\n  font-size: calc(var(--text-small) * 0.857);\n  font-weight: var(--weight-body);\n  color: var(--color-text-muted);\n}\n.ds-menu__rule {\n  height: 0;\n  margin: var(--space-2) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n\n/* accordion: sections that open and close */\n.ds-accordion {\n  display: grid;\n}\n.ds-accordion__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__item:first-child {\n  border-top: 0;\n}\n.ds-accordion__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-3) 0;\n  list-style: none;\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-heading);\n  line-height: 1.35;\n  color: var(--color-heading);\n  cursor: pointer;\n}\n.ds-accordion__head::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__head::after {\n  content: \"\";\n  flex: none;\n  align-self: center;\n  display: inline-block;\n  width: calc(var(--space-2) * 1.25);\n  height: calc(var(--space-2) * 1.25);\n  background: currentColor;\n  clip-path: polygon(calc(50% - var(--space-2) / 8) 0, calc(50% + var(--space-2) / 8) 0, calc(50% + var(--space-2) / 8) calc(50% - var(--space-2) / 8), 100% calc(50% - var(--space-2) / 8), 100% calc(50% + var(--space-2) / 8), calc(50% + var(--space-2) / 8) calc(50% + var(--space-2) / 8), calc(50% + var(--space-2) / 8) 100%, calc(50% - var(--space-2) / 8) 100%, calc(50% - var(--space-2) / 8) calc(50% + var(--space-2) / 8), 0 calc(50% + var(--space-2) / 8), 0 calc(50% - var(--space-2) / 8), calc(50% - var(--space-2) / 8) calc(50% - var(--space-2) / 8));\n  color: var(--color-link);\n  transition: var(--transition);\n}\n.ds-accordion__item[open] > .ds-accordion__head::after,\n.ds-accordion__item.is-open > .ds-accordion__head::after {\n  transform: rotate(45deg);\n}\n.ds-accordion__head:hover,\n.ds-accordion__head.is-hover {\n  color: var(--color-link);\n}\n.ds-accordion__head:focus-visible,\n.ds-accordion__head.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  max-width: var(--size-measure);\n  margin: 0;\n  padding: 0 0 var(--space-4);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* tooltip: a hint over its trigger, on hover or focus */\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  cursor: help;\n}\n.ds-tooltip__mark {\n  display: inline-block;\n  width: var(--size-check);\n  height: var(--size-check);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-pill);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.857);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  color: var(--color-text-muted);\n  align-content: center;\n  text-align: center;\n  text-box: trim-both cap alphabetic;\n}\n.ds-tooltip__tip {\n  position: absolute;\n  bottom: calc(100% + var(--space-2));\n  left: 50%;\n  z-index: 15;\n  width: max-content;\n  max-width: 28ch;\n  padding: var(--space-2) var(--space-3);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-dialog);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.857);\n  font-weight: var(--weight-body);\n  line-height: 1.4;\n  text-align: left;\n  text-transform: none;\n  letter-spacing: 0;\n  white-space: normal;\n  transform: translateX(-50%);\n  visibility: hidden;\n  opacity: 0;\n  transition: var(--transition);\n}\n.ds-tooltip:hover .ds-tooltip__tip,\n.ds-tooltip:focus-within .ds-tooltip__tip,\n.ds-tooltip:focus .ds-tooltip__tip,\n.ds-tooltip.is-open .ds-tooltip__tip {\n  visibility: visible;\n  opacity: 1;\n}\n\n/* carousel: one slide showing, the rest a swipe away, dots under it */\n.ds-carousel {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  min-width: 0;\n  min-height: 0;\n}\n.ds-carousel__track {\n  display: flex;\n  flex: 1;\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  overflow-x: auto;\n  scroll-snap-type: x mandatory;\n  scrollbar-width: none;\n}\n.ds-carousel__slide {\n  display: flex;\n  flex: 0 0 100%;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-2);\n  min-width: 0;\n  scroll-snap-align: start;\n}\n.ds-carousel__foot {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding-top: var(--space-4);\n}\n.ds-carousel__dots {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-carousel__dot {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  background: var(--color-surface-strong);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-pill);\n}\n.ds-carousel__dot.is-current {\n  width: calc(var(--size-dot) * 3);\n  background: var(--color-link);\n  border-color: transparent;\n}\n.ds-carousel__arrows {\n  display: flex;\n  gap: var(--space-2);\n}\n.ds-carousel__arrow {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--space-6);\n  height: var(--space-6);\n  padding: 0;\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-pill);\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-carousel__arrow:hover,\n.ds-carousel__arrow.is-hover {\n  background: var(--color-surface-strong);\n}\n.ds-carousel__arrow.is-disabled {\n  color: var(--color-disabled-text);\n  cursor: default;\n}\n.ds-carousel__glyph {\n  width: var(--size-check);\n  height: var(--size-check);\n}\n\n/* progress: how far something is, as a bar */\n.ds-progress {\n  display: grid;\n  gap: var(--space-2);\n  min-width: 0;\n}\n.ds-progress__label {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n  font-size: var(--text-small);\n  color: var(--color-text);\n}\n.ds-progress__value {\n  font-size: calc(var(--text-small) * 0.857);\n  font-variant-numeric: tabular-nums;\n  color: var(--color-text-muted);\n}\n.ds-progress__bar {\n  display: block;\n  height: var(--space-2);\n  overflow: hidden;\n  background: var(--color-surface-strong);\n  border-radius: var(--radius-pill);\n}\n.ds-progress__fill {\n  display: block;\n  width: 50%;\n  height: 100%;\n  background: var(--fill-accent);\n  border-radius: var(--radius-pill);\n}\n.ds-progress__fill--2 {\n  width: 34%;\n}\n.ds-progress__fill--3 {\n  width: 62%;\n}\n.ds-progress__fill--4 {\n  width: 81%;\n}\n.ds-progress__fill--5 {\n  width: 96%;\n}\n.ds-progress__fill--success {\n  background: var(--color-success);\n}\n.ds-progress__fill--warning {\n  background: var(--color-warning);\n}\n\n/* avatar: a person drawn as initials on a disc */\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  background: var(--color-surface-strong);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-pill);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.857);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  letter-spacing: 0;\n  text-transform: uppercase;\n}\n.ds-avatar--accent {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  border-color: transparent;\n}\n.ds-avatars {\n  display: flex;\n  align-items: center;\n  padding-left: var(--space-2);\n}\n.ds-avatars .ds-avatar {\n  margin-left: calc(var(--space-2) * -1);\n}\n.ds-person {\n  display: flex;\n  color: inherit;\n  text-decoration: none;\n  align-items: center;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-person__copy {\n  display: grid;\n  min-width: 0;\n}\n.ds-person__name {\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n  color: var(--color-heading);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-person__meta {\n  font-size: calc(var(--text-small) * 0.857);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n\n.ds-person:hover .ds-person__name,\n.ds-person.is-hover .ds-person__name {\n  color: var(--color-link);\n}\n\n/* this layout's own turns on the shared components */\n.ds-brand__mark {\n  width: calc(var(--size-glyph) + var(--space-2));\n  height: calc(var(--size-glyph) + var(--space-2));\n}\n.ds-layout__rail .ds-grid__cell {\n  min-height: 0;\n}\n.ds-table td {\n  background: transparent;\n}\n.ds-table tr.is-current td {\n  background: var(--color-surface-alt);\n}\n.ds-sidebar__title {\n  margin-bottom: var(--space-2);\n}\n.ds-code {\n  overflow-x: auto;\n}\n.ds-dialog {\n  margin: 0 auto;\n}\n.ds-stage {\n  flex: 1;\n  border-radius: calc(var(--radius-page) - var(--border-width));\n}\n.ds-list__row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n\n@media (max-width: 1080px) {\n  .ds-tooltip {\n    position: static;\n  }\n  .ds-tooltip__tip {\n    bottom: auto;\n    left: var(--space-4);\n    right: var(--space-4);\n    width: auto;\n    max-width: none;\n    margin-top: var(--space-6);\n    transform: none;\n  }\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    grid-auto-rows: auto;\n  }\n  .ds-grid__cell--w3,\n  .ds-hero {\n    grid-column: 1 / -1;\n  }\n  .ds-grid__cell--tall {\n    grid-row: auto;\n  }\n  .ds-layout {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-layout__rail {\n    position: static;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n}\n@media (max-width: 640px) {\n  .ds-grid,\n  .ds-form,\n  .ds-panels,\n  .ds-layout__rail {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-grid__cell--w2 {\n    grid-column: auto;\n  }\n  .ds-grid__cell,\n  .ds-hero {\n    padding: var(--space-5);\n  }\n  .ds-grid__cell--flush {\n    padding: 0;\n  }\n  .ds-page__inner {\n    padding: var(--space-5) var(--space-4) var(--space-7);\n  }\n  .ds-nav__inner,\n  .ds-nav__sub,\n  .ds-footer__inner {\n    padding-left: var(--space-4);\n    padding-right: var(--space-4);\n  }\n  .ds-nav__inner {\n    gap: var(--space-3);\n  }\n  .ds-nav__search {\n    flex: 1;\n    min-width: 0;\n  }\n  .ds-nav__extra,\n  .ds-nav__key,\n  .ds-nav__meta,\n  .ds-table .ds-table__extra {\n    display: none;\n  }\n  .ds-nav__field {\n    padding-right: var(--space-3);\n  }\n  .ds-nav__links {\n    gap: 0 var(--space-4);\n  }\n  .ds-menu__list {\n    min-width: 20ch;\n  }\n  .ds-hero__title,\n  .ds-page-header__title {\n    font-size: var(--text-h2);\n  }\n  .ds-grid__cell--accent .ds-grid__title {\n    font-size: var(--text-h3);\n  }\n  .ds-stats {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: var(--space-5) 0;\n    padding: var(--space-5) 0;\n  }\n  .ds-stats .ds-stat {\n    padding: 0 var(--space-5);\n  }\n  .ds-stats .ds-stat:nth-child(odd) {\n    border-left: 0;\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-3);\n  }\n  .ds-tabs {\n    max-width: 100%;\n    overflow-x: auto;\n  }\n  .ds-pagination,\n  .ds-form__actions,\n  .ds-dialog__actions {\n    flex-wrap: wrap;\n  }\n  .ds-page-header__copy {\n    flex-basis: 100%;\n  }\n  .ds-stage {\n    padding: var(--space-5) var(--space-4);\n  }\n}\n\n/* phone: the drop-down in the second row takes that row's width and stays inside the window */\n@media (max-width: 640px) {\n  .ds-nav__sub {\n    position: relative;\n  }\n  .ds-nav__sub .ds-menu {\n    position: static;\n  }\n  .ds-nav__sub .ds-menu__list {\n    left: var(--space-4);\n    right: var(--space-4);\n    min-width: 0;\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 docs, documentation hub 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\"><rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"8\" rx=\"2.5\"/><rect x=\"15.5\" y=\"2.5\" width=\"6\" height=\"8\" rx=\"2.5\" opacity=\".5\"/><rect x=\"2.5\" y=\"12.5\" width=\"6\" height=\"9\" rx=\"2.5\" opacity=\".5\"/><rect x=\"10.5\" y=\"12.5\" width=\"11\" height=\"9\" rx=\"2.5\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <span class=\"ds-badge ds-nav__extra\">Docs v4.2</span>\n    <label class=\"ds-nav__search\">\n      <svg class=\"ds-nav__glass\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"7\" cy=\"7\" r=\"4.5\"/><path d=\"m10.5 10.5 3.5 3.5\"/></svg>\n      <input class=\"ds-nav__field\" type=\"search\" placeholder=\"Search guides and endpoints\" aria-label=\"Search the documentation\">\n      <kbd class=\"ds-nav__key\">/</kbd>\n    </label>\n    <div class=\"ds-nav__actions\">\n      <a class=\"ds-button ds-button--secondary ds-button--small ds-nav__extra\" href=\"#keys\">Get a key</a>\n      <div class=\"ds-menu ds-menu--end\">\n        <button class=\"ds-nav__account\" type=\"button\" aria-label=\"Account menu\"><span class=\"ds-avatar ds-avatar--accent\">IK</span></button>\n        <ul class=\"ds-menu__list\">\n          <li><a class=\"ds-menu__item\" href=\"#keys\">API keys <span class=\"ds-menu__hint\">3 live</span></a></li>\n          <li><a class=\"ds-menu__item\" href=\"#reference\">Usage this month</a></li>\n          <li class=\"ds-menu__rule\"></li>\n          <li><a class=\"ds-menu__item\" href=\"#home\">Sign out</a></li>\n        </ul>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-nav__rule\"></div>\n  <div class=\"ds-nav__sub\">\n    <ul class=\"ds-nav__links\">\n      <li class=\"ds-nav__entry\"><a class=\"ds-nav__link\" href=\"#home\">Overview</a></li>\n      <li class=\"ds-nav__entry\"><a class=\"ds-nav__link\" href=\"#guides\">Guides</a></li>\n      <li class=\"ds-nav__entry\"><a class=\"ds-nav__link\" href=\"#reference\">API reference</a></li>\n      <li class=\"ds-nav__entry ds-menu\">\n        <span class=\"ds-nav__link\" tabindex=\"0\">Libraries<svg class=\"ds-menu__caret\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m1.5 3 2.5 2.5L6.5 3\"/></svg></span>\n        <ul class=\"ds-menu__list\">\n          <li><a class=\"ds-menu__item\" href=\"#guide\">TypeScript <span class=\"ds-menu__hint\">4.2.0</span></a></li>\n          <li><a class=\"ds-menu__item\" href=\"#guide\">Python <span class=\"ds-menu__hint\">4.1.3</span></a></li>\n          <li><a class=\"ds-menu__item\" href=\"#guide\">Go <span class=\"ds-menu__hint\">4.2.0</span></a></li>\n          <li><a class=\"ds-menu__item\" href=\"#guide\">Ruby <span class=\"ds-menu__hint\">3.9.1</span></a></li>\n          <li class=\"ds-menu__rule\"></li>\n          <li><a class=\"ds-menu__item\" href=\"#reference\">Plain HTTP</a></li>\n        </ul>\n      </li>\n      <li class=\"ds-nav__entry\"><a class=\"ds-nav__link\" href=\"#keys\">Keys</a></li>\n    </ul>\n    <span class=\"ds-nav__meta\"><span class=\"ds-nav__dot\"></span>All systems normal</span>\n  </div>\n</header>\n\n<main>\n  <section class=\"ds-view ds-view--home\" id=\"home\">\n    <div class=\"ds-page__inner\">\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <section class=\"ds-grid__cell ds-grid__cell--w3 ds-grid__cell--tall ds-hero\" data-component=\"hero\">\n          <div>\n            <span class=\"ds-badge ds-badge--new\"><span class=\"ds-badge__dot\"></span>Version 4.2 adds recurring holds</span>\n            <h1 class=\"ds-hero__title\">Put time on your side of the API</h1>\n            <p class=\"ds-hero__lead\">chronoskin turns calendars, time zones and opening hours into one bookable schedule. Start with a guide, or go straight to the endpoint you need.</p>\n          </div>\n          <div>\n            <div class=\"ds-hero__actions\">\n              <a class=\"ds-button ds-button--large\" href=\"#guide\">Read the quickstart</a>\n              <a class=\"ds-button ds-button--secondary ds-button--large\" href=\"#reference\">Browse the reference</a>\n            </div>\n            <p class=\"ds-hero__note\">Popular: <a class=\"ds-badge\" href=\"#guide\">Hold a slot</a><a class=\"ds-badge\" href=\"#guide\">Time zones</a><a class=\"ds-badge\" href=\"#reference\">Webhooks</a><a class=\"ds-badge\" href=\"#keys\">Test keys</a></p>\n          </div>\n        </section>\n\n        <article class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--fill-4\">\n          <div class=\"ds-grid__head\">\n            <h2 class=\"ds-grid__title\">First request in a minute</h2>\n            <span class=\"ds-badge\">curl</span>\n          </div>\n          <pre class=\"ds-code\"><span class=\"ds-code__key\">curl</span> api.chronoskin.example/v4/slots \\\n  -H <span class=\"ds-code__str\">\"Authorization: Bearer ck_test_...\"</span> \\\n  -d calendar=<span class=\"ds-code__str\">\"studio\"</span> \\\n  -d day=<span class=\"ds-code__str\">\"2025-03-14\"</span></pre>\n          <a class=\"ds-grid__more\" href=\"#guide\">Follow the quickstart</a>\n        </article>\n\n        <article class=\"ds-grid__cell\">\n          <span class=\"ds-grid__icon\"><svg class=\"ds-grid__glyph\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m7 6-4 4 4 4m6-8 4 4-4 4\"/></svg></span>\n          <h2 class=\"ds-grid__title\">API reference</h2>\n          <p class=\"ds-grid__text\">42 endpoints, each with a request you can copy.</p>\n          <a class=\"ds-grid__more\" href=\"#reference\">Open the reference</a>\n        </article>\n\n        <article class=\"ds-grid__cell ds-grid__cell--fill-2\">\n          <span class=\"ds-grid__icon\"><svg class=\"ds-grid__glyph\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 6.5 10 3l7 3.5v7L10 17l-7-3.5z\"/><path d=\"M3 6.5 10 10l7-3.5M10 10v7\"/></svg></span>\n          <h2 class=\"ds-grid__title\">Libraries</h2>\n          <p class=\"ds-grid__text\">Typed clients for four languages.</p>\n          <div class=\"ds-grid__actions\">\n            <span class=\"ds-badge\">TS</span><span class=\"ds-badge\">Py</span><span class=\"ds-badge\">Go</span><span class=\"ds-badge\">Rb</span>\n          </div>\n        </article>\n\n        <article class=\"ds-grid__cell ds-grid__cell--w2\">\n          <div class=\"ds-grid__head\">\n            <h2 class=\"ds-grid__title\">Guides to start with</h2>\n            <a class=\"ds-link ds-link--quiet\" href=\"#guides\">All 28</a>\n          </div>\n          <ul class=\"ds-list\">\n            <li class=\"ds-list__item\"><a class=\"ds-list__title\" href=\"#guide\">Hold a slot, then confirm it</a><span class=\"ds-list__meta\">Bookings, 8 minutes</span></li>\n            <li class=\"ds-list__item\"><a class=\"ds-list__title\" href=\"#guide\">Opening hours across time zones</a><span class=\"ds-list__meta\">Calendars, 12 minutes</span></li>\n            <li class=\"ds-list__item\"><a class=\"ds-list__title\" href=\"#guide\">Receive and verify webhooks</a><span class=\"ds-list__meta\">Webhooks, 6 minutes</span></li>\n          </ul>\n        </article>\n\n        <article class=\"ds-grid__cell ds-grid__cell--stack\">\n          <div>\n            <h2 class=\"ds-grid__title\">Status</h2>\n            <p class=\"ds-grid__text\">The last 30 days, <span class=\"ds-tooltip\" tabindex=\"0\">measured at the edge<span class=\"ds-tooltip__mark\">?</span><span class=\"ds-tooltip__tip\">Timed from six regions every minute, not from inside our own network.</span></span></p>\n          </div>\n          <div class=\"ds-progress\">\n            <span class=\"ds-progress__label\">Slots API <span class=\"ds-progress__value\">99.98%</span></span>\n            <span class=\"ds-progress__bar\"><span class=\"ds-progress__fill ds-progress__fill--5 ds-progress__fill--success\"></span></span>\n          </div>\n          <div class=\"ds-progress\">\n            <span class=\"ds-progress__label\">Webhooks <span class=\"ds-progress__value\">99.2%</span></span>\n            <span class=\"ds-progress__bar\"><span class=\"ds-progress__fill ds-progress__fill--4 ds-progress__fill--warning\"></span></span>\n          </div>\n        </article>\n\n        <article class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--fill-1\">\n          <div class=\"ds-carousel\">\n            <ul class=\"ds-carousel__track\">\n              <li class=\"ds-carousel__slide\">\n                <span class=\"ds-badge ds-badge--accent\">New in 4.2</span>\n                <h2 class=\"ds-grid__title\">Recurring holds</h2>\n                <p class=\"ds-grid__text\">Reserve the same hour every week with one call, and release the whole series with another.</p>\n              </li>\n              <li class=\"ds-carousel__slide\">\n                <span class=\"ds-badge ds-badge--accent\">New in 4.1</span>\n                <h2 class=\"ds-grid__title\">Signed webhooks</h2>\n                <p class=\"ds-grid__text\">Every delivery now carries a signature you can check in three lines.</p>\n              </li>\n              <li class=\"ds-carousel__slide\">\n                <span class=\"ds-badge ds-badge--accent\">New in 4.0</span>\n                <h2 class=\"ds-grid__title\">One clock for every zone</h2>\n                <p class=\"ds-grid__text\">Times are sent as instants and shown in the calendar's own zone.</p>\n              </li>\n            </ul>\n            <div class=\"ds-carousel__foot\">\n              <span class=\"ds-carousel__dots\"><span class=\"ds-carousel__dot is-current\"></span><span class=\"ds-carousel__dot\"></span><span class=\"ds-carousel__dot\"></span></span>\n              <span class=\"ds-carousel__arrows\">\n                <button class=\"ds-carousel__arrow is-disabled\" type=\"button\" aria-label=\"Previous\"><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m10 4-4 4 4 4\"/></svg></button>\n                <button class=\"ds-carousel__arrow\" type=\"button\" aria-label=\"Next\"><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></button>\n              </span>\n            </div>\n          </div>\n        </article>\n\n        <section class=\"ds-grid__cell ds-grid__cell--full ds-grid__cell--flush\">\n          <ul class=\"ds-stats\" data-component=\"stats\">\n            <li class=\"ds-stat\"><span class=\"ds-stat__label\">Endpoints</span><span class=\"ds-stat__value\">42</span><span class=\"ds-stat__note\">Across six resources</span></li>\n            <li class=\"ds-stat\"><span class=\"ds-stat__label\">Median response</span><span class=\"ds-stat__value\">38<span class=\"ds-stat__unit\"> ms</span></span><span class=\"ds-stat__note ds-stat__note--success\">4 ms faster than in 4.1</span></li>\n            <li class=\"ds-stat\"><span class=\"ds-stat__label\">Requests a minute</span><span class=\"ds-stat__value\">600</span><span class=\"ds-stat__note\">On a live key; 60 on a test key</span></li>\n            <li class=\"ds-stat\"><span class=\"ds-stat__label\">Guides</span><span class=\"ds-stat__value\">28</span><span class=\"ds-stat__note ds-stat__note--warning\">3 being rewritten for 4.2</span></li>\n          </ul>\n        </section>\n\n        <article class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--fill-3\">\n          <h2 class=\"ds-grid__title\">Ask the people who wrote it</h2>\n          <p class=\"ds-grid__text\">The forum is answered by the same six people who maintain the API, usually within a working day.</p>\n          <div class=\"ds-grid__actions\">\n            <span class=\"ds-avatars\"><span class=\"ds-avatar\">IK</span><span class=\"ds-avatar\">TM</span><span class=\"ds-avatar\">LO</span><span class=\"ds-avatar\">RS</span><span class=\"ds-avatar ds-avatar--accent\">+2</span></span>\n            <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#guides\">Open the forum</a>\n          </div>\n        </article>\n\n        <article class=\"ds-grid__cell\">\n          <h2 class=\"ds-grid__title\">Change notes</h2>\n          <p class=\"ds-grid__text\">Choose what reaches your inbox.</p>\n          <div class=\"ds-grid__visual\">\n            <ul class=\"ds-rows\">\n              <li class=\"ds-rows__item\">Breaking changes <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked aria-label=\"Breaking changes\"><span class=\"ds-switch__track\"></span></label></li>\n              <li class=\"ds-rows__item\">New endpoints <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked aria-label=\"New endpoints\"><span class=\"ds-switch__track\"></span></label></li>\n              <li class=\"ds-rows__item\">Monthly digest <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" aria-label=\"Monthly digest\"><span class=\"ds-switch__track\"></span></label></li>\n            </ul>\n          </div>\n        </article>\n\n        <section class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--accent\">\n          <h2 class=\"ds-grid__title\">Start with a test key</h2>\n          <p class=\"ds-grid__text\">Free, rate limited, and it cannot touch a real calendar.</p>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--inverse\" href=\"#keys\">Create a key</a>\n          </div>\n        </section>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"guides\">\n    <div class=\"ds-page__inner\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Docs</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#guides\">Guides</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">All guides</li>\n      </ol>\n      <header class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__copy\">\n          <h1 class=\"ds-page-header__title\">Guides</h1>\n          <p class=\"ds-page-header__text\">Twenty-eight worked examples, each one task from the first request to the last check.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#reference\">Reference</a>\n          <a class=\"ds-button\" href=\"#guide\">Start with the quickstart</a>\n        </div>\n      </header>\n      <div class=\"ds-layout\">\n        <div class=\"ds-layout__main\">\n          <div class=\"ds-toolbar\">\n            <ul class=\"ds-tabs\" data-component=\"tabs\">\n              <li><a class=\"ds-tabs__tab is-current\" href=\"#guides\">All</a></li>\n              <li><a class=\"ds-tabs__tab\" href=\"#guides\">Getting started</a></li>\n              <li><a class=\"ds-tabs__tab\" href=\"#guides\">Bookings</a></li>\n              <li><a class=\"ds-tabs__tab\" href=\"#guides\">Webhooks</a></li>\n              <li><a class=\"ds-tabs__tab\" href=\"#guides\">Migration</a></li>\n            </ul>\n          </div>\n          <div class=\"ds-grid ds-grid--auto\">\n            <section class=\"ds-grid__cell ds-grid__cell--full\">\n              <ul class=\"ds-list\" data-component=\"list\">\n                <li class=\"ds-list__item\">\n                  <div class=\"ds-list__row\"><a class=\"ds-list__title\" href=\"#guide\">Hold a slot, then confirm it</a><span class=\"ds-badge ds-badge--new\">Updated for 4.2</span></div>\n                  <p class=\"ds-list__text\">Reserve a time for ten minutes while your customer pays, and confirm or release it afterwards.</p>\n                  <span class=\"ds-list__meta\">Bookings, 8 minutes, by Ines Kovar</span>\n                </li>\n                <li class=\"ds-list__item\">\n                  <div class=\"ds-list__row\"><a class=\"ds-list__title\" href=\"#guide\">Opening hours across time zones</a><span class=\"ds-badge\">Calendars</span></div>\n                  <p class=\"ds-list__text\">Describe a week once and let the API answer in the zone of whoever is asking.</p>\n                  <span class=\"ds-list__meta\">Calendars, 12 minutes, by Tomas Meier</span>\n                </li>\n                <li class=\"ds-list__item\">\n                  <div class=\"ds-list__row\"><a class=\"ds-list__title\" href=\"#guide\">Receive and verify webhooks</a><span class=\"ds-badge\">Webhooks</span></div>\n                  <p class=\"ds-list__text\">Check the signature, answer within five seconds and handle a delivery that arrives twice.</p>\n                  <span class=\"ds-list__meta\">Webhooks, 6 minutes, by Lena Okafor</span>\n                </li>\n                <li class=\"ds-list__item\">\n                  <div class=\"ds-list__row\"><a class=\"ds-list__title\" href=\"#guide\">Page through a long calendar</a><span class=\"ds-badge\">Getting started</span></div>\n                  <p class=\"ds-list__text\">Cursors, page sizes and why the last page can be empty.</p>\n                  <span class=\"ds-list__meta\">Getting started, 5 minutes, by Ravi Sen</span>\n                </li>\n              </ul>\n              <div class=\"ds-grid__actions\">\n                <ul class=\"ds-pagination\" data-component=\"pagination\">\n                  <li><a class=\"ds-pagination__link is-disabled\" href=\"#guides\">Previous</a></li>\n                  <li><a class=\"ds-pagination__link is-current\" href=\"#guides\">1</a></li>\n                  <li><a class=\"ds-pagination__link\" href=\"#guides\">2</a></li>\n                  <li><a class=\"ds-pagination__link\" href=\"#guides\">3</a></li>\n                  <li><a class=\"ds-pagination__link\" href=\"#guides\">Next</a></li>\n                </ul>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w3 ds-grid__cell--stack\">\n              <h2 class=\"ds-grid__title\">Two ways through</h2>\n              <div class=\"ds-panels\">\n                <article class=\"ds-panel\" data-component=\"panel\">\n                  <h3 class=\"ds-panel__title\">If you take bookings</h3>\n                  <p class=\"ds-panel__body\">Quickstart, holding a slot, payments in between, then webhooks.</p>\n                  <span class=\"ds-panel__meta\">4 guides, about 30 minutes</span>\n                </article>\n                <article class=\"ds-panel\">\n                  <h3 class=\"ds-panel__title\">If you show availability</h3>\n                  <p class=\"ds-panel__body\">Quickstart, opening hours, time zones, then caching the answers.</p>\n                  <span class=\"ds-panel__meta\">4 guides, about 35 minutes</span>\n                </article>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--bare\">\n              <div class=\"ds-empty\" data-component=\"empty\">\n                <h2 class=\"ds-empty__title\">No migration guides yet</h2>\n                <p class=\"ds-empty__text\">Version 4 has not removed anything, so there is nothing to migrate from.</p>\n                <a class=\"ds-button ds-button--secondary\" href=\"#guides\">Show all guides</a>\n              </div>\n            </section>\n          </div>\n        </div>\n        <aside class=\"ds-layout__rail\">\n          <nav class=\"ds-grid__cell ds-sidebar\" data-component=\"sidebar\">\n            <h2 class=\"ds-sidebar__title\">Topics</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li><a class=\"ds-sidebar__link is-current\" href=\"#guides\">All guides <span class=\"ds-badge ds-badge--count\">28</span></a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guides\">Getting started <span class=\"ds-badge ds-badge--count\">5</span></a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guides\">Bookings <span class=\"ds-badge ds-badge--count\">9</span></a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guides\">Calendars <span class=\"ds-badge ds-badge--count\">8</span></a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guides\">Webhooks <span class=\"ds-badge ds-badge--count\">6</span></a></li>\n            </ul>\n          </nav>\n          <section class=\"ds-grid__cell ds-grid__cell--fill-2 ds-grid__cell--stack\">\n            <h2 class=\"ds-grid__title\">Written by</h2>\n            <span class=\"ds-person\"><span class=\"ds-avatar\">IK</span><span class=\"ds-person__copy\"><span class=\"ds-person__name\">Ines Kovar</span><span class=\"ds-person__meta\">Bookings, 9 guides</span></span></span>\n            <span class=\"ds-person\"><span class=\"ds-avatar\">TM</span><span class=\"ds-person__copy\"><span class=\"ds-person__name\">Tomas Meier</span><span class=\"ds-person__meta\">Calendars, 8 guides</span></span></span>\n            <span class=\"ds-person\"><span class=\"ds-avatar\">LO</span><span class=\"ds-person__copy\"><span class=\"ds-person__name\">Lena Okafor</span><span class=\"ds-person__meta\">Webhooks, 6 guides</span></span></span>\n          </section>\n          <section class=\"ds-grid__cell ds-grid__cell--fill-4\">\n            <h2 class=\"ds-grid__title\">Missing a guide?</h2>\n            <p class=\"ds-grid__text\">Tell us the task you are stuck on and we will write it up, usually within two weeks.</p>\n            <div class=\"ds-grid__actions\"><a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#keys\">Suggest a guide</a></div>\n          </section>\n        </aside>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"guide\">\n    <div class=\"ds-page__inner\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Docs</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#guides\">Guides</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Hold a slot</li>\n      </ol>\n      <div class=\"ds-layout\">\n        <div class=\"ds-layout__main\">\n          <div class=\"ds-grid ds-grid--auto\">\n            <article class=\"ds-grid__cell ds-grid__cell--full\">\n              <div class=\"ds-prose\" data-component=\"typography\">\n                <h1>Hold a slot, then confirm it</h1>\n                <p>A hold reserves a time for a short while without booking it. Use one whenever something has to happen between choosing a time and committing to it, such as a payment.</p>\n                <h2>Create the hold</h2>\n                <p>Send the calendar and the instant you want to <code>POST /v4/holds</code>. The answer carries an <code>id</code> and the moment the hold runs out, ten minutes later unless you ask for less.</p>\n              </div>\n              <pre class=\"ds-code\"><span class=\"ds-code__key\">const</span> hold = <span class=\"ds-code__key\">await</span> chronoskin.holds.create({\n  calendar: <span class=\"ds-code__str\">\"studio\"</span>,\n  start: <span class=\"ds-code__str\">\"2025-03-14T09:30:00Z\"</span>,\n  minutes: 45,\n});</pre>\n              <div class=\"ds-prose\">\n                <h3>What can go wrong</h3>\n                <ul>\n                  <li>The time was taken a moment ago: the answer is <code>409</code> with the next free slot.</li>\n                  <li>The calendar is closed that day: the answer is <code>422</code>.</li>\n                  <li>A <strong>test key</strong> can hold at most five slots at once.</li>\n                </ul>\n                <h2>Confirm or release</h2>\n                <p>When the payment succeeds, confirm the hold and it becomes a booking. If it fails, release it at once so the time is free again; do not wait for it to run out. The <a href=\"#reference\">holds reference</a> lists every field.</p>\n              </div>\n            </article>\n            <section class=\"ds-grid__cell ds-grid__cell--w3\">\n              <div class=\"ds-notices\" data-component=\"notice\">\n                <div class=\"ds-notice\"><strong class=\"ds-notice__title\">A hold is not a booking</strong><p class=\"ds-notice__text\">It is not sent to the customer's calendar and no webhook fires until you confirm it.</p></div>\n                <div class=\"ds-notice ds-notice--error\"><strong class=\"ds-notice__title\">Do not extend a hold in a loop</strong><p class=\"ds-notice__text\">A hold can be extended once. A second attempt answers 409 and the slot is released.</p></div>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--fill-4\">\n              <h2 class=\"ds-grid__title\">Keep reading</h2>\n              <div class=\"ds-grid__visual\">\n                <p class=\"ds-links\" data-component=\"links\">\n                  <a class=\"ds-link\" href=\"#guide\">Take a payment in between</a>\n                  <a class=\"ds-link is-visited\" href=\"#guide\">Quickstart, read</a>\n                  <a class=\"ds-link is-hover\" href=\"#guide\">Webhooks, hovered</a>\n                  <a class=\"ds-link is-active\" href=\"#reference\">Holds reference, pressed</a>\n                </p>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--full\">\n              <h2 class=\"ds-grid__title\">Questions about holds</h2>\n              <div class=\"ds-grid__visual\">\n                <div class=\"ds-accordion\">\n                  <details class=\"ds-accordion__item\" open>\n                    <summary class=\"ds-accordion__head\">How long can a hold last?</summary>\n                    <p class=\"ds-accordion__body\">Between one and thirty minutes. Ten is the default, and one extension of the same length is allowed.</p>\n                  </details>\n                  <details class=\"ds-accordion__item\">\n                    <summary class=\"ds-accordion__head\">Does a hold count against my rate limit?</summary>\n                    <p class=\"ds-accordion__body\">Creating one is a request like any other. Holding it costs nothing.</p>\n                  </details>\n                  <details class=\"ds-accordion__item\">\n                    <summary class=\"ds-accordion__head\">Can two holds overlap?</summary>\n                    <p class=\"ds-accordion__body\">Only when the calendar allows more than one booking at a time, such as a class with twelve places.</p>\n                  </details>\n                </div>\n              </div>\n            </section>\n          </div>\n        </div>\n        <aside class=\"ds-layout__rail\">\n          <nav class=\"ds-grid__cell ds-sidebar\">\n            <h2 class=\"ds-sidebar__title\">On this page</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li><a class=\"ds-sidebar__link is-current\" href=\"#guide\">Create the hold</a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guide\">What can go wrong</a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guide\">Confirm or release</a></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#guide\">Questions</a></li>\n            </ul>\n          </nav>\n          <section class=\"ds-grid__cell ds-grid__cell--stack\">\n            <span class=\"ds-person\"><span class=\"ds-avatar ds-avatar--accent\">IK</span><span class=\"ds-person__copy\"><span class=\"ds-person__name\">Ines Kovar</span><span class=\"ds-person__meta\">Updated 3 March</span></span></span>\n            <div class=\"ds-progress\">\n              <span class=\"ds-progress__label\">Bookings path <span class=\"ds-progress__value\">2 of 4</span></span>\n              <span class=\"ds-progress__bar\"><span class=\"ds-progress__fill\"></span></span>\n            </div>\n            <div class=\"ds-buttons\">\n              <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#guides\">Previous</a>\n              <a class=\"ds-button ds-button--small\" href=\"#guide\">Next guide</a>\n            </div>\n          </section>\n        </aside>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"reference\">\n    <div class=\"ds-page__inner\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Docs</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#reference\">API reference</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Holds</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__copy\">\n          <h1 class=\"ds-page-header__title\">Holds <span class=\"ds-badge ds-badge--success\"><span class=\"ds-badge__dot\"></span>Stable</span></h1>\n          <p class=\"ds-page-header__text\">Reserve a time for a few minutes before it becomes a booking. Six endpoints, all under <code class=\"ds-endpoint\">/v4/holds</code>.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#guide\">Read the guide</a>\n        </div>\n      </header>\n      <div class=\"ds-layout\">\n        <div class=\"ds-layout__main\">\n          <div class=\"ds-grid ds-grid--auto\">\n            <section class=\"ds-grid__cell ds-grid__cell--full\">\n              <div class=\"ds-table__scroll\">\n                <table class=\"ds-table\" data-component=\"table\">\n                  <thead>\n                    <tr><th>Endpoint</th><th>What it does</th><th class=\"ds-table__extra\">State</th><th class=\"ds-table__num\">A minute</th></tr>\n                  </thead>\n                  <tbody>\n                    <tr class=\"is-current\"><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">POST</span>/holds</span></a></td><td class=\"ds-table__muted\">Create a hold</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">600</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">GET</span>/holds/:id</span></a></td><td class=\"ds-table__muted\">Read one hold</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">1,200</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">POST</span>/holds/:id/confirm</span></a></td><td class=\"ds-table__muted\">Turn it into a booking</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">600</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">POST</span>/holds/:id/extend</span></a></td><td class=\"ds-table__muted\">Add time, once</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--warning\">Beta</span></td><td class=\"ds-table__num\">120</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">DELETE</span>/holds/:id</span></a></td><td class=\"ds-table__muted\">Release it</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">600</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#reference\"><span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">PUT</span>/holds/:id</span></a></td><td class=\"ds-table__muted\">Replace a hold</td><td class=\"ds-table__extra\"><span class=\"ds-badge ds-badge--danger\">Leaves in 5.0</span></td><td class=\"ds-table__num\">60</td></tr>\n                  </tbody>\n                </table>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w3\">\n              <div class=\"ds-grid__head\">\n                <h2 class=\"ds-grid__title\">Parameters of a new hold</h2>\n                <span class=\"ds-endpoint\"><span class=\"ds-endpoint__verb\">POST</span>/holds</span>\n              </div>\n              <div class=\"ds-accordion\">\n                <details class=\"ds-accordion__item\" open>\n                  <summary class=\"ds-accordion__head\">calendar, required</summary>\n                  <p class=\"ds-accordion__body\">The calendar's short name or id. The key must have the bookings scope for it.</p>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__head\">start, required</summary>\n                  <p class=\"ds-accordion__body\">An instant in UTC. A local time without a zone is refused.</p>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__head\">minutes</summary>\n                  <p class=\"ds-accordion__body\">Length of the slot. Defaults to the calendar's own slot length.</p>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__head\">expires_in</summary>\n                  <p class=\"ds-accordion__body\">How long the hold lasts, in minutes, from 1 to 30.</p>\n                </details>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--fill-4\">\n              <div class=\"ds-grid__head\">\n                <h2 class=\"ds-grid__title\">Answer</h2>\n                <span class=\"ds-badge ds-badge--success\">201</span>\n              </div>\n              <pre class=\"ds-code\">{\n  <span class=\"ds-code__key\">\"id\"</span>: <span class=\"ds-code__str\">\"hold_8fq2\"</span>,\n  <span class=\"ds-code__key\">\"calendar\"</span>: <span class=\"ds-code__str\">\"studio\"</span>,\n  <span class=\"ds-code__key\">\"minutes\"</span>: 45,\n  <span class=\"ds-code__key\">\"expires_at\"</span>: <span class=\"ds-code__str\">\"09:40:00Z\"</span>\n}</pre>\n            </section>\n          </div>\n        </div>\n        <aside class=\"ds-layout__rail\">\n          <section class=\"ds-grid__cell ds-grid__cell--stack\">\n            <h2 class=\"ds-grid__title\">Your use this month</h2>\n            <div class=\"ds-progress\">\n              <span class=\"ds-progress__label\">Requests <span class=\"ds-progress__value\">186k of 300k</span></span>\n              <span class=\"ds-progress__bar\"><span class=\"ds-progress__fill ds-progress__fill--3\"></span></span>\n            </div>\n            <div class=\"ds-progress\">\n              <span class=\"ds-progress__label\">Active holds <span class=\"ds-progress__value\">2 of 5</span></span>\n              <span class=\"ds-progress__bar\"><span class=\"ds-progress__fill ds-progress__fill--2\"></span></span>\n            </div>\n            <a class=\"ds-grid__more\" href=\"#keys\">Manage keys</a>\n          </section>\n          <section class=\"ds-grid__cell ds-grid__cell--fill-1 ds-grid__cell--stack\">\n            <h2 class=\"ds-grid__title\">Labels</h2>\n            <div class=\"ds-chips\" data-component=\"badge\">\n              <span class=\"ds-badge\">Label</span>\n              <span class=\"ds-badge ds-badge--success\">Stable</span>\n              <span class=\"ds-badge ds-badge--warning\">Beta</span>\n              <span class=\"ds-badge ds-badge--danger\">Leaving</span>\n            </div>\n            <p class=\"ds-grid__text\">A leaving endpoint keeps working until the next major version.</p>\n          </section>\n        </aside>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"keys\">\n    <div class=\"ds-page__inner\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Docs</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#keys\">Account</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">API keys</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__copy\">\n          <h1 class=\"ds-page-header__title\">API keys</h1>\n          <p class=\"ds-page-header__text\">A key is shown once, when it is made. Keep it out of the browser and out of your repository.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#guide\">How keys work</a>\n        </div>\n      </header>\n      <div class=\"ds-layout\">\n        <div class=\"ds-layout__main\">\n          <div class=\"ds-grid ds-grid--auto\">\n            <section class=\"ds-grid__cell ds-grid__cell--w3\">\n              <h2 class=\"ds-grid__title\">New key</h2>\n              <div class=\"ds-grid__visual\">\n                <form class=\"ds-form\" data-component=\"form\">\n                  <div class=\"ds-form__field\">\n                    <label class=\"ds-form__label\" for=\"k-name\">Name</label>\n                    <input class=\"ds-form__control\" id=\"k-name\" type=\"text\" value=\"Booking page, staging\">\n                  </div>\n                  <div class=\"ds-form__field\">\n                    <label class=\"ds-form__label\" for=\"k-kind\">Kind</label>\n                    <select class=\"ds-form__control\" id=\"k-kind\"><option>Test key</option><option>Live key</option></select>\n                  </div>\n                  <div class=\"ds-form__field ds-form__field--full\">\n                    <label class=\"ds-form__label\" for=\"k-origin\">Allowed address</label>\n                    <input class=\"ds-form__control is-invalid\" id=\"k-origin\" type=\"text\" value=\"staging.example\" aria-invalid=\"true\">\n                    <span class=\"ds-form__error\">Give the full address, starting with https.</span>\n                  </div>\n                  <div class=\"ds-form__field ds-form__field--full\">\n                    <label class=\"ds-form__label\" for=\"k-note\">Note for your team</label>\n                    <textarea class=\"ds-form__control ds-form__control--area\" id=\"k-note\" placeholder=\"Where this key is used and who to ask about it\"></textarea>\n                    <span class=\"ds-form__hint\">Shown beside the key in this list, never sent with a request.</span>\n                  </div>\n                  <label class=\"ds-form__check ds-form__field--full\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> May create and confirm holds</label>\n                  <div class=\"ds-form__actions\">\n                    <div class=\"ds-buttons\" data-component=\"buttons\">\n                      <button class=\"ds-button\" type=\"button\">Create 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</button>\n                      <button class=\"ds-button is-disabled\" type=\"button\" disabled>Rotate</button>\n                    </div>\n                  </div>\n                </form>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--w2 ds-grid__cell--flush\">\n              <div class=\"ds-stage\">\n                <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"d-title\">\n                  <div class=\"ds-dialog__bar\">\n                    <h2 class=\"ds-dialog__title\" id=\"d-title\">Revoke this key?</h2>\n                    <button class=\"ds-dialog__close\" type=\"button\" aria-label=\"Close\"><svg class=\"ds-dialog__glyph\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"m4 4 8 8m0-8-8 8\"/></svg></button>\n                  </div>\n                  <div class=\"ds-dialog__body\"><p>Requests signed with the key named Old checkout will fail at once. This cannot be undone.</p></div>\n                  <div class=\"ds-dialog__actions\">\n                    <a class=\"ds-button ds-button--secondary\" href=\"#keys\">Keep it</a>\n                    <button class=\"ds-button ds-button--danger\" type=\"button\">Revoke key</button>\n                  </div>\n                </div>\n              </div>\n            </section>\n            <section class=\"ds-grid__cell ds-grid__cell--full\">\n              <div class=\"ds-grid__head\">\n                <h2 class=\"ds-grid__title\">Your keys</h2>\n                <span class=\"ds-tooltip\" tabindex=\"0\">Last used<span class=\"ds-tooltip__mark\">?</span><span class=\"ds-tooltip__tip\">Rounded to the hour, in your own time zone.</span></span>\n              </div>\n              <div class=\"ds-table__scroll\">\n                <table class=\"ds-table\">\n                  <thead>\n                    <tr><th>Name</th><th>Kind</th><th class=\"ds-table__extra\">Last used</th><th class=\"ds-table__num\">Requests today</th></tr>\n                  </thead>\n                  <tbody>\n                    <tr><td><a class=\"ds-table__link\" href=\"#keys\">Booking page</a></td><td><span class=\"ds-badge ds-badge--success\">Live</span></td><td class=\"ds-table__extra ds-table__muted\">Today, 14:00</td><td class=\"ds-table__num\">8,412</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#keys\">Back office</a></td><td><span class=\"ds-badge ds-badge--success\">Live</span></td><td class=\"ds-table__extra ds-table__muted\">Today, 13:00</td><td class=\"ds-table__num\">1,096</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#keys\">Old checkout</a></td><td><span class=\"ds-badge ds-badge--warning\">Live, unused</span></td><td class=\"ds-table__extra ds-table__muted\">41 days ago</td><td class=\"ds-table__num\">0</td></tr>\n                    <tr><td><a class=\"ds-table__link\" href=\"#keys\">Laptop</a></td><td><span class=\"ds-badge\">Test</span></td><td class=\"ds-table__extra ds-table__muted\">Yesterday, 18:00</td><td class=\"ds-table__num\">37</td></tr>\n                  </tbody>\n                </table>\n              </div>\n            </section>\n          </div>\n        </div>\n        <aside class=\"ds-layout__rail\">\n          <section class=\"ds-grid__cell\">\n            <h2 class=\"ds-grid__title\">Safety</h2>\n            <div class=\"ds-grid__visual\">\n              <ul class=\"ds-rows\">\n                <li class=\"ds-rows__item\">Mail me when a key is made <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked aria-label=\"Mail me when a key is made\"><span class=\"ds-switch__track\"></span></label></li>\n                <li class=\"ds-rows__item\">Block keys from browsers <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked aria-label=\"Block keys from browsers\"><span class=\"ds-switch__track\"></span></label></li>\n                <li class=\"ds-rows__item\">Expire test keys monthly <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" aria-label=\"Expire test keys monthly\"><span class=\"ds-switch__track\"></span></label></li>\n              </ul>\n            </div>\n          </section>\n          <div class=\"ds-notices\">\n            <div class=\"ds-notice\"><strong class=\"ds-notice__title\">One unused key</strong><p class=\"ds-notice__text\">Old checkout has not been used for 41 days.</p></div>\n          </div>\n        </aside>\n      </div>\n    </div>\n  </section>\n</main>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-footer__inner\">\n    <span class=\"ds-footer__brand\">chronoskin docs</span>\n    <ul class=\"ds-footer__list\">\n      <li><a class=\"ds-footer__link\" href=\"#guides\">Guides</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#reference\">API reference</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#keys\">Keys</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#home\">Status</a></li>\n    </ul>\n    <p class=\"ds-footer__text\">Version 4.2, written by the chronoskin team.</p>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.bento-grids.docs.s07.p03.t03.u01\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"bento-grids\",\n    \"years\": [\n      2022,\n      2026\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-bg-7331\",\n  \"short\": \"v1-bg-7331\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #1c1c1c;\n  --color-canvas: #1c1c1c;\n  --color-surface: #232323;\n  --color-surface-alt: #2e2e2e;\n  --color-surface-strong: #3e3e3e;\n  --color-bar: #1c1c1c;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #161616;\n  --color-bar-alt-text: #a0a0a0;\n  --color-inverse: #ededed;\n  --color-inverse-text: #1c1c1c;\n  --color-text: #dddddd;\n  --color-text-muted: #a0a0a0;\n  --color-heading: #ededed;\n  --color-heading-alt: #dddddd;\n  --color-link: #3ecf8e;\n  --color-link-quiet: #a0a0a0;\n  --color-link-visited: #85e0b7;\n  --color-link-hover: #ededed;\n  --color-link-active: #37996b;\n  --color-border: #343434;\n  --color-border-strong: #505050;\n  --color-border-muted: #2e2e2e;\n  --color-accent: #37996b;\n  --color-accent-text: #ffffff;\n  --color-accent-alt: #569cd6;\n  --color-fill-1: #002533;\n  --color-fill-2: #28302c;\n  --color-fill-3: #0c0f24;\n  --color-fill-4: #2e2e2e;\n  --color-button: #37996b;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #2e2e2e;\n  --color-button-secondary-text: #ededed;\n  --color-input: #161616;\n  --color-input-text: #dddddd;\n  --color-input-border: #505050;\n  --color-disabled: #2e2e2e;\n  --color-disabled-text: #707070;\n  --color-danger: #fa1f41;\n  --color-danger-surface: #201818;\n  --color-success: #3ecf8e;\n  --color-warning: #f7be2b;\n  --color-notice: #002533;\n  --color-notice-text: #dddddd;\n  --color-focus: #3ecf8e;\n  --color-shadow: #000000;\n  --color-overlay: rgb(22 22 22 / 0.8);\n}\n\n/* @part type */\n:root {\n  --font-body: Inter, \"Inter Variable\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\n  --font-heading: Inter, \"Inter Variable\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\n  --font-ui: Inter, \"Inter Variable\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\n  --font-mono: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n  --text-base: 16px;\n  --text-small: 14px;\n  --text-ui: 16px;\n  --text-large: 20px;\n  --text-display: 56px;\n  --text-h1: 46px;\n  --text-h2: 32px;\n  --text-h3: 22px;\n  --line-body: 1.5;\n  --line-heading: 1.15;\n  --line-display: 1.06;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 800;\n  --weight-ui: 600;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 8px;\n  --radius-panel: 12px;\n  --radius-pill: 9999px;\n  --radius-page: 24px;\n  --shadow-panel: inset 0 1px 1px color-mix(in srgb, white 8%, transparent), 0 12px 12px color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-control: 0 1px 2px color-mix(in srgb, var(--color-shadow) 16%, transparent);\n  --shadow-control-hover: 0 2px 4px color-mix(in srgb, var(--color-shadow) 16%, transparent);\n  --shadow-control-pressed: none;\n  --shadow-dialog: inset 0 1px 2px color-mix(in srgb, white 12%, transparent), 0 20px 25px color-mix(in srgb, var(--color-shadow) 50%, transparent);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: color-mix(in srgb, var(--color-bar) 80%, transparent);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: linear-gradient(180deg, color-mix(in srgb, var(--color-surface) 95%, white), color-mix(in srgb, var(--color-surface) 88%, black));\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 85%, white);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px solid var(--color-focus);\n  --transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;\n  --backdrop-blur: 0px;\n}\n"
  }
}
