{
  "id": "v1-md-28bb",
  "long_id": "v1.material-design.docs.s02.p08.t11.u11",
  "name": "Material tabbed handbook, 2016",
  "era": {
    "slug": "material-design",
    "code": "md",
    "name": "Material Design",
    "years": [
      2014,
      2018
    ],
    "description": "Paper and ink, 2014 to 2018: flat sheets that cast soft shadows, a coloured app bar, uppercase medium-weight buttons, two-pixel corners and one bright accent for the floating action."
  },
  "archetype": "docs",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "A documentation page in the paper-and-ink manner where the whole head of the page is one tall band of the primary colour: a toolbar row, a centred title with one line of lead text and a raised button, and a centred row of tabs along the band's bottom edge. Everything below is a single centred column of white sheets on a pale page, with no drawer and no second column; small captions sit on the page between the sheets. Component libraries, handbooks and product help pages built on the 2014 guidelines looked like this until about 2018.",
  "url": "https://chrono.skin/s/v1-md-28bb",
  "preview_url": "https://chrono.skin/s/v1-md-28bb/specimen.html",
  "files": {
    "STYLE.md": "# Material tabbed handbook, 2016\n\n## Summary\n\nA documentation page in the paper-and-ink manner where the whole head of the page is one tall band of the primary colour: a toolbar row, a centred title with one line of lead text and a raised button, and a centred row of tabs along the band's bottom edge. Everything below is a single centred column of white sheets on a pale page, with no drawer and no second column; small captions sit on the page between the sheets. Component libraries, handbooks and product help pages built on the 2014 guidelines looked like this until about 2018.\n\n## Layout\n\n- The page is fluid: `--size-page` is `100%` and the band and footer span the window. Designed at 1440px. The content is one centred column capped at `--size-content` (880px); running text is capped at `--size-measure` (520px).\n- Order on the home page: `.ds-nav` (`--size-bar` 64px: menu icon and brand at the left, a few links at the right), then a `.ds-band` in the same fill holding `.ds-hero` (centred title, lead and one button) and `.ds-tabs--band` (centred, the current tab marked by a 2px line in `--color-bar-text` on the band's bottom edge). Then `.ds-main`, the column, then the one-row `.ds-footer`.\n- `.ds-main` is a vertical stack with `--space-4` (24px) between blocks. Every block is a sheet: `.ds-panel`, `.ds-grid` tiles, `.ds-stats` cards, `.ds-notice`. A group of sheets is introduced by `.ds-subhead`, a small caption set directly on the page and indented to the sheet's text edge. Sections are never separated by rules on the page, and nothing sits beside the column.\n- The long article is one `.ds-panel--article` sheet with `--space-6` (48px) padding. Inside it `.ds-article` puts the `.ds-prose` text at the left and the `.ds-sidebar` contents block (`--size-sidebar` 200px) at the right. This contents block is the only side element the layout has.\n- Spacing is on an 8px grid: `--space-1` 4px (helper text, pagination gap), `--space-2` 8px (between flat buttons, card action padding), `--space-3` 16px (button padding, gap between grid tiles and stat cards, tile text padding), `--space-4` 24px (gap between sheets, sheet side padding, bar side padding), `--space-5` 32px (top of the column, page header side padding, under the hero lead), `--space-6` 48px (hero padding, article sheet padding, overlay padding), `--space-7` 64px (spare step), `--space-8` 96px (bottom of the column).\n- Heights: toolbar and card head `--size-bar` 64px; tabs and table rows `--size-row` 48px; avatars and the menu button `--size-row-dense` 40px; buttons, fields and nav links `--size-control` 36px; floating button `--size-fab` 56px; two-line list rows 72px. Other sizes: `--size-tile` 112px (colour block of a grid tile), `--size-overlap` 72px, `--size-stripe` 4px, `--size-icon` 24px, `--size-check` 18px, `--size-badge` 22px, `--size-dialog` 440px, `--size-area` 96px.\n- Inner pages (a resource, settings, a record and its table) have no `.ds-hero` and no tabs in the band. Under the `.ds-nav` row the band takes `.ds-band--inner`: it is empty and continues the bar's fill for `--size-overlap` plus `--space-5`. `.ds-main--overlap` pulls the column up by `--size-overlap`, so the first sheet lies over the band. That first `.ds-panel` is the head of the page: `.ds-breadcrumb` at its top, `.ds-page-header` (title, one grey line, one raised button at the right) and `.ds-tabs` along its bottom edge, separated by a hairline. Below it, `--space-4` apart, come `.ds-stats` (separate small cards), then a `.ds-panel` with a `.ds-panel__head` and the `.ds-table`, or, on an edit screen, a `.ds-panel--form` with the form and its buttons in `.ds-panel__actions--end`. A chapter page puts its breadcrumb at the top of the `.ds-panel--article` sheet. The column stays single; there is no drawer on inner pages either.\n- Views: the specimen is one site with five views. `handbook` is the home view: hero and band tabs, the grid of chapter tiles, a card and the list of recent edits with its pagination. `chapter` is one handbook chapter: the article sheet with its contents block, two notices and a sheet of related links. `api` is a resource page: head sheet with breadcrumb, page header and tabs, the stat cards, and the table with its status key. `webhook` is the edit screen for one table row: head sheet with the page actions, the form sheet and the confirmation dialog. `starred` is the reader's starred chapters, shown empty, above the list of most starred chapters.\n- Below 900px the contents block drops under the text, grid tiles become one column, the page header stacks and the band tabs scroll. Below 600px the toolbar wraps: `.ds-nav__links` becomes a full-width second row under the menu icon and brand, each item an equal cell with its `.ds-nav__link` centred (the current one keeps `.is-current`), the tabs scroll sideways, the stat cards sit two by two, and table cells marked `.ds-table__extra` are hidden.\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- One family, Roboto, then Segoe UI and Helvetica Neue; `--font-mono` for code only.\n- Large light headings over small text: `--text-display` 56px on `--line-display` 1.1, `--text-h1` 34px, `--text-h2` 26px, all at weight 300; `--text-h3` 18px at `--weight-bold` 500. `--line-heading` 1.3.\n- `--text-base` 15px on a 24px line (`--line-body` 1.6) at weight 400; `--text-large` 20px for the lead; `--text-small` and `--text-ui` are both 13px.\n- `--ui-transform` uppercase at `--weight-ui` 500 for buttons, tabs and navigation; no tracking.\n- Links have no underline at rest and gain one on hover (`--link-decoration-hover`); quiet links never do.\n\n- Soft paper: `--shadow-panel` is a wide, faint two-layer shadow (16px blur, 6px drop); `--shadow-control` a small soft pair (6px blur); `--shadow-control-hover` 14px blur; `--shadow-dialog` two layers up to 22px blur.\n- Round corners that grow with the box: `--radius-control` 8px, `--radius-panel` 12px, `--radius-page` 16px; `--radius-pill` is a full pill.\n- Flat fills; a hovered button lightens (15% white) and fields are filled with `--color-surface-alt` above their bottom line, with rounded top corners. `--border-width` 1px dividers, `--border-width-strong` 2px indicators; `--focus-ring` is a 4px halo of the focus colour at 30%; `--transition` 0.3s ease-out.\n\n## Components\n\n- `.ds-page` on `<body>`: page fill, body family and size.\n- `.ds-band`: the coloured head of the page under the nav; wraps the hero and the band tabs and carries their shadow. `--inner` is the short form for inner pages.\n- `.ds-nav`: the toolbar row inside the band. `.ds-nav__menu` is a round icon button, the summary of a `.ds-menu` that lists the views; `.ds-brand` follows it; `.ds-nav__links` > `.ds-nav__item` > `.ds-nav__link` sit at the right, the current one (`is-current`) on a faint wash of the bar text colour.\n- `.ds-brand`: the site's mark and name at the left of the toolbar, one link. `.ds-brand__mark` is a `--size-brand` (28px) tile dressed like the primary raised button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) with a `--border-width` ring of `--color-bar-text` at 70%, which keeps it apart from the band when a palette's button and bar colours are close, holding the mark as inline SVG in the current colour; `.ds-brand__name` is the name at `--text-large` in the heading font with `--weight-heading`, `--heading-tracking` and `--heading-transform`, in `--color-bar-text` because the band is filled with `--fill-bar`. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-hero`: centred `.ds-hero__title`, `.ds-hero__lead` and one raised `.ds-button--secondary`. No floating button and no image.\n- `.ds-tabs`: a row of `.ds-tabs__tab`; `is-current` has a 2px line, `--color-link` on a sheet and `--color-bar-text` on the band. The plain form closes a sheet (hairline above); `--band` is the centred row at the bottom of the band, in the bar text colour.\n- `.ds-main`: the single column; `--overlap` lifts it over an inner band. `.ds-subhead` is the caption above a group of sheets. `.ds-article` splits the article sheet into text and contents. `.ds-center` centres one block.\n- `.ds-page-header`: head of an inner page, inside the first sheet. `.ds-page-header__body` holds `.ds-page-header__title` and `.ds-page-header__text`; `.ds-page-header__actions` at the right holds one raised `.ds-button`.\n- `.ds-breadcrumb`: small grey trail of `.ds-breadcrumb__item` with `.ds-breadcrumb__link`, separated by slashes, at the top of the head sheet; the last carries `is-current`.\n- `.ds-prose`: long-form text; styles h1 to h3, paragraphs, lists, `strong`, inline `code`, `pre` and links. `.ds-prose__lead` is the opening paragraph.\n- `.ds-sidebar`: the contents block beside the article: a 4px stripe in the link colour at the left, `.ds-sidebar__title`, `.ds-sidebar__list` of `.ds-sidebar__link`; `is-current` is in the link colour. It has no fill and no shadow.\n- `.ds-link`: inline link with `is-visited`, `is-hover`, `is-active`, `is-focus`; `--quiet` is text-coloured. `.ds-links` lays several out in a row.\n- `.ds-button`: raised primary button. `--secondary` is the white raised button (use it on the band), `--flat` has no fill (use it inside sheets and dialogs), `--danger` is the destructive form (with `--flat`: danger-coloured text), `--fab` the accent disc with one `.ds-icon`. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. Group with `.ds-buttons`.\n- `.ds-icon`: 24px stroked inline SVG in the current text colour.\n- `.ds-form`: one column of fields. `.ds-form__field` wraps `.ds-form__label` and a `.ds-form__control` filled with `--fill-input` over a bottom line (`--area` for a textarea, inside `.ds-form__select` for a select); `is-focus`, `is-invalid` with `.ds-form__error`, `.ds-form__hint`, `.ds-form__check` with `.ds-form__checkbox`. The buttons go in the sheet's `.ds-panel__actions--end`, not in the form.\n- `.ds-table`: 48px rows divided by hairlines, small grey head; it has no fill of its own and always sits in a `.ds-panel` under a `.ds-panel__head`. `.ds-table__num` right-aligns numbers, `.ds-table__name` sets a code name, `.ds-table__extra` marks cells a phone can do without, `tr.is-current` is tinted.\n- `.ds-list`: two-line rows inside a `.ds-panel`. `.ds-list__item` holds a `.ds-list__avatar` disc (`--alt`, `--accent`), `.ds-list__body` with `.ds-list__title` and `.ds-list__text`, and `.ds-list__meta` at the right.\n- `.ds-panel`: the sheet. `.ds-panel__title` and `.ds-panel__body` for a simple card; `.ds-panel__head` is a 64px title row with an optional flat button and a hairline under it; `.ds-panel__actions` is the ruled button row (`--end` right-aligns it). `--article` is the padded article sheet, `--form` and `--pad` give the body normal text colour.\n- `.ds-stat`: one summary figure as its own small centred card: `.ds-stat__value` over `.ds-stat__label`. Three or more sit in a `.ds-stats` row, `--space-3` apart.\n- `.ds-grid`: two columns of horizontal tiles. Each `.ds-grid__cell` (`--2`, `--3`, `--4` pick the fill) has a square `.ds-grid__media` colour block with a number or initial at the left and `.ds-grid__body` with `.ds-grid__title`, `.ds-grid__text` and `.ds-grid__actions`.\n- `.ds-badge`: accent count pill; `--new`, `--chip`, and the status fills `--success`, `--warning`, `--danger`. Group with `.ds-badges`.\n- `.ds-notice`: tinted block with a 4px left stripe and `.ds-notice__title`; `--error` is a white sheet in the danger colour. `.ds-notices` stacks them at column width.\n- `.ds-pagination`: `.ds-pagination__link` cells, `is-current` filled, `is-disabled` grey; it sits right-aligned in the `.ds-panel__actions--end` of the sheet it pages.\n- `.ds-dialog`: sheet with the deepest shadow, `.ds-dialog__title`, `.ds-dialog__body`, right-aligned flat buttons in `.ds-dialog__actions`; shown on `.ds-overlay`.\n- `.ds-empty`: centred `.ds-empty__mark` disc, `.ds-empty__title`, `.ds-empty__text` and one flat button, inside a `.ds-panel`.\n- `.ds-footer`: one row in the inverse colour: `.ds-footer__brand`, a `.ds-footer__list` of `.ds-footer__link` and `.ds-footer__legal` at the right. No columns.\n- `.ds-menu`: a `<details>` whose `.ds-menu__button` (the `<summary>`: an icon, or the account's `.ds-avatar`) opens `.ds-menu__list`, a white sheet with the dialog shadow holding 48px `.ds-menu__link` rows. Use it for the account menu and the overflow (three dots) at the end of the bar; `--start` hangs the sheet from the left, for the menu button that carries the navigation on a phone.\n- `.ds-tooltip`: on an icon-only button, with a `.ds-tooltip__text` child naming it; the small dark label shows on hover and focus (`is-open` statically). It sits below; `--left`, `--right` and `--above` move it. Use it on the floating button and bar icons, never on a button that already has a text label.\n- `.ds-switch`: an on-off setting that takes effect at once: a `<span>` or `<label>` holding `.ds-switch__input` (a checkbox) and `.ds-switch__track`, which draws the track and the round thumb; `is-on` shows the on state statically. Keep the checkbox for choices that are saved with a form.\n- `.ds-progress`: a `--size-progress` line with `.ds-progress__bar` (`--low`, `--high`) for work whose length is known; `--ring` is the small ring for work whose length is not. Put it inside the card or notice it reports on.\n- `.ds-accordion`: expansion panels inside a card: `<details class=\"ds-accordion__item\">` with a `.ds-accordion__head` summary (a chevron is drawn at its right) and a `.ds-accordion__body` paragraph. Use it for short questions and answers, closed by default.\n\n## Never\n\n- `row-gap <= 4px`: table and list rows touch and are divided by hairlines; bullet items sit 4px apart at most.\n- `block-gap <= 48px`: sheets in the column are 24px apart; nothing is spaced wider than a caption plus a gap.\n- `content-width <= 66%`: one centred 880px column in a 1440px window; no drawer and no second column.\n- `font-weight >= 300`: light, never thin.\n- `font-weight <= 500`: emphasis is medium, never bold.\n- `font-size >= 13px`: captions are the smallest text.\n- `font-size <= 56px`: the header band title is the largest text.\n- `letter-spacing = 0px`: no tracking.\n- `font-families <= 2`: one sans-serif plus the mono for code.\n- `gradient-fills = 0%`: every fill is one flat colour.\n- `text-shadow = none`: no text has a shadow.\n- `border-radius <= 16px`: 8px controls, 12px cards, 16px for the largest containers; pills and discs are shapes.\n- `box-shadow-blur <= 22px`: sheets rest on 6px; only the dialog reaches 22px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. New content is a new sheet in the column: a `.ds-panel` with a `.ds-panel__head` when it holds data, with a `.ds-subhead` above it when it starts a group. Never add a drawer, a second column beside the sheets, or a rule across the page; navigation between sections belongs in the band's tabs, navigation inside a page in the head sheet's tabs or the contents block. Use tokens only, pick heights and gaps from the `--size-*` and `--space-*` scale, and colour a block with one flat `--color-fill-*` and the text colour paired with it above.\n",
    "components.css": ":root {\n  --size-page: 100%;\n  --size-menu: 208px;\n  --size-switch: 36px;\n  --size-switch-track: 14px;\n  --size-switch-knob: 20px;\n  --size-progress: 4px;\n  --size-ring: 32px;\n  --size-brand: 28px;\n  --size-content: 880px;\n  --size-measure: 520px;\n  --size-sidebar: 200px;\n  --size-bar: 64px;\n  --size-overlap: 72px;\n  --size-row: 48px;\n  --size-row-dense: 40px;\n  --size-control: 36px;\n  --size-fab: 56px;\n  --size-icon: 24px;\n  --size-check: 18px;\n  --size-badge: 22px;\n  --size-stripe: 4px;\n  --size-tile: 112px;\n  --size-dialog: 440px;\n  --size-area: 96px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 32px;\n  --space-6: 48px;\n  --space-7: 64px;\n  --space-8: 96px;\n}\n\n/* menu: a sheet of choices that drops from a button in the bar */\n.ds-menu {\n  position: relative;\n  display: flex;\n  align-items: center;\n  align-self: center;\n  flex: none;\n}\n.ds-menu__button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  min-width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  border-radius: var(--radius-pill);\n  color: inherit;\n  font-size: var(--text-small);\n  list-style: none;\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-menu__button::-webkit-details-marker { display: none; }\n.ds-menu__button:hover,\n.ds-menu__button.is-hover,\n.ds-menu[open] > .ds-menu__button { background: color-mix(in srgb, currentColor 16%, transparent); }\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus { outline: var(--focus-ring); }\n.ds-menu__list {\n  position: absolute;\n  z-index: 20;\n  top: 100%;\n  right: 0;\n  min-width: var(--size-menu);\n  margin: var(--space-1) 0 0;\n  padding: var(--space-2) 0;\n  list-style: none;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  color: var(--color-text);\n}\n.ds-menu--start .ds-menu__list { right: auto; left: 0; }\n.ds-menu__link,\n.ds-menu__link:hover {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-row);\n  padding: 0 var(--space-3);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  text-decoration: none;\n  text-transform: none;\n  white-space: nowrap;\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover { background: var(--color-surface-alt); }\n.ds-menu__link:focus-visible { outline: var(--focus-ring); outline-offset: calc(var(--border-width-strong) * -1); }\n\n/* tooltip: the name of an icon button, shown on hover and focus */\n.ds-tooltip { position: relative; }\n.ds-tooltip__text {\n  position: absolute;\n  z-index: 30;\n  top: calc(100% + var(--space-2));\n  left: 50%;\n  transform: translateX(-50%);\n  padding: var(--space-1) var(--space-2);\n  border-radius: var(--radius-control);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-family: var(--font-body);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n  text-transform: none;\n  white-space: nowrap;\n  visibility: hidden;\n  opacity: 0;\n  pointer-events: none;\n}\n.ds-tooltip:hover > .ds-tooltip__text,\n.ds-tooltip:focus-visible > .ds-tooltip__text,\n.ds-tooltip.is-open > .ds-tooltip__text { visibility: visible; opacity: 1; }\n.ds-tooltip--right > .ds-tooltip__text {\n  top: 50%;\n  left: calc(100% + var(--space-2));\n  transform: translateY(-50%);\n}\n\n/* switch: an on-off setting drawn over a checkbox */\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  flex: none;\n  width: var(--size-switch);\n  height: var(--size-switch-knob);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  opacity: 0;\n  cursor: pointer;\n}\n.ds-switch__track {\n  width: 100%;\n  height: var(--size-switch-track);\n  border-radius: var(--radius-pill);\n  background: var(--color-border-strong);\n  transition: var(--transition);\n}\n.ds-switch__track::after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: var(--size-switch-knob);\n  height: var(--size-switch-knob);\n  border-radius: 50%;\n  background: var(--fill-button-secondary);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track { background: color-mix(in srgb, var(--color-button) 50%, transparent); }\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: calc(100% - var(--size-switch-knob));\n  background: var(--fill-button);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch.is-focus .ds-switch__track { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n\n/* progress: a thin line, or a ring while the length is unknown */\n.ds-progress {\n  display: block;\n  height: var(--size-progress);\n  margin: var(--space-3) 0 var(--space-1);\n  overflow: hidden;\n  background: color-mix(in srgb, var(--color-button) 30%, transparent);\n}\n.ds-progress__bar {\n  display: block;\n  width: 60%;\n  height: 100%;\n  background: var(--fill-button);\n}\n.ds-progress__bar--low { width: 30%; }\n\n/* accordion: expansion panels inside a sheet */\n.ds-accordion {\n  margin: var(--space-3) 0 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__item + .ds-accordion__item { border-top: var(--border-width) var(--border-style) var(--color-border); }\n.ds-accordion__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  min-height: var(--size-row);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__head::-webkit-details-marker { display: none; }\n.ds-accordion__head::after {\n  content: \"\";\n  flex: none;\n  width: var(--space-2);\n  height: var(--space-2);\n  margin: 0 var(--space-1);\n  border-right: var(--border-width-strong) var(--border-style) var(--color-text-muted);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-text-muted);\n  transform: rotate(45deg);\n}\n.ds-accordion__item[open] > .ds-accordion__head::after { transform: rotate(-135deg); }\n.ds-accordion__head:focus-visible { outline: var(--focus-ring); }\n.ds-accordion__body {\n  margin: 0;\n  padding: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* shell */\n.ds-page {\n  margin: 0;\n  min-width: 0;\n  width: var(--size-page);\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 { box-sizing: border-box; }\n\n.ds-icon {\n  width: var(--size-icon);\n  height: var(--size-icon);\n  flex: none;\n  fill: none;\n  stroke: currentColor;\n  stroke-width: 2;\n}\n\n/* typography */\n.ds-prose { max-width: var(--size-measure); }\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: var(--space-5) 0 var(--space-3);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  text-transform: var(--heading-transform);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-prose h1 { margin-top: 0; font-size: var(--text-h1); line-height: 1.18; }\n.ds-prose h2 { font-size: var(--text-h2); }\n.ds-prose h3 { font-size: var(--text-h3); font-weight: var(--weight-bold); line-height: 1.6; margin-bottom: var(--space-2); }\n.ds-prose p { margin: 0 0 var(--space-3); }\n.ds-prose ul,\n.ds-prose ol { margin: 0 0 var(--space-3); padding-left: var(--space-4); }\n.ds-prose li { margin-bottom: var(--space-1); }\n.ds-prose strong { font-weight: var(--weight-bold); }\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-control);\n  background: var(--color-surface-strong);\n  font-family: var(--font-mono);\n  font-size: var(--text-ui);\n}\n.ds-prose pre {\n  margin: 0 0 var(--space-3);\n  padding: var(--space-3);\n  overflow: auto;\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-prose pre code { padding: 0; background: transparent; font-size: inherit; }\n.ds-prose__lead {\n  color: var(--color-text);\n  font-size: var(--text-large);\n  line-height: 1.6;\n}\n.ds-prose a { color: var(--color-link); text-decoration: var(--link-decoration); }\n.ds-prose a:hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n\n/* links */\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-5);\n}\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited { color: var(--color-link-visited); }\n.ds-link:hover,\n.ds-link.is-hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n.ds-link:active,\n.ds-link.is-active { color: var(--color-link-active); }\n.ds-link:focus-visible,\n.ds-link.is-focus { outline: var(--focus-ring); }\n.ds-link--quiet,\n.ds-link--quiet:visited {\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-body);\n  text-decoration: var(--link-decoration-quiet);\n}\n\n/* buttons */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: calc(var(--size-control) + var(--size-control) + var(--space-3));\n  height: var(--size-control);\n  margin: 0;\n  padding: 0 var(--space-3);\n  border: 0;\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-button-hover-text);\n}\n.ds-button:active,\n.ds-button.is-active { box-shadow: var(--shadow-control-pressed); }\n.ds-button:focus-visible,\n.ds-button.is-focus { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--flat,\n.ds-button--flat:active,\n.ds-button--flat.is-active {\n  background: transparent;\n  box-shadow: none;\n  color: var(--color-link);\n}\n.ds-button--flat:hover,\n.ds-button--flat.is-hover {\n  background: color-mix(in srgb, var(--color-text-muted) 20%, transparent);\n  box-shadow: none;\n  color: var(--color-link);\n}\n.ds-button--danger {\n  background: var(--color-danger);\n  color: var(--color-button-text);\n}\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: color-mix(in srgb, var(--color-danger) 88%, var(--color-shadow));\n  color: var(--color-button-hover-text);\n}\n.ds-button--flat.ds-button--danger,\n.ds-button--flat.ds-button--danger:active,\n.ds-button--flat.ds-button--danger.is-active {\n  background: transparent;\n  color: var(--color-danger);\n}\n.ds-button--flat.ds-button--danger:hover,\n.ds-button--flat.ds-button--danger.is-hover {\n  background: color-mix(in srgb, var(--color-danger) 12%, transparent);\n  color: var(--color-danger);\n}\n.ds-button--fab,\n.ds-button--fab:hover,\n.ds-button--fab.is-hover {\n  width: var(--size-fab);\n  min-width: 0;\n  height: var(--size-fab);\n  padding: 0;\n  border-radius: 50%;\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-button:disabled,\n.ds-button.is-disabled,\n.ds-button.is-disabled:hover {\n  background: var(--color-disabled);\n  box-shadow: none;\n  color: var(--color-disabled-text);\n  cursor: default;\n}\n\n/* form */\n.ds-form {\n  display: grid;\n  gap: var(--space-4);\n}\n.ds-form__field { display: block; }\n.ds-form__label {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.25;\n}\n.ds-form__control {\n  display: block;\n  width: 100%;\n  height: var(--size-control);\n  margin: 0;\n  padding: var(--space-1) calc(var(--radius-control) * 2);\n  border: 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  line-height: var(--line-body);\n  appearance: none;\n  transition: var(--transition);\n}\n.ds-form__control:focus,\n.ds-form__control.is-focus {\n  outline: 0;\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-focus);\n  padding-bottom: calc(var(--space-1) - var(--border-width));\n}\n.ds-form__control--area {\n  height: var(--size-area);\n  resize: vertical;\n}\n.ds-form__select {\n  position: relative;\n  display: block;\n}\n.ds-form__select::after {\n  content: \"\";\n  position: absolute;\n  right: var(--space-1);\n  top: calc(var(--size-control) / 2 - var(--border-width-strong));\n  border: var(--size-stripe) var(--border-style) transparent;\n  border-top-color: var(--color-text-muted);\n  border-bottom: 0;\n  border-left-width: calc(var(--size-stripe) + var(--border-width));\n  border-right-width: calc(var(--size-stripe) + var(--border-width));\n  pointer-events: none;\n}\n.ds-form__hint,\n.ds-form__error {\n  display: block;\n  margin-top: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.25;\n}\n.ds-form__field.is-invalid .ds-form__label,\n.ds-form__error { color: var(--color-danger); }\n.ds-form__field.is-invalid .ds-form__control {\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-danger);\n  padding-bottom: calc(var(--space-1) - var(--border-width));\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  font-size: var(--text-base);\n}\n.ds-form__checkbox {\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  flex: none;\n  accent-color: var(--color-button);\n}\n\n/* badge */\n.ds-badges {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-badge {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-badge);\n  height: var(--size-badge);\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-badge--new { background: var(--color-accent-alt); color: var(--color-button-text); }\n.ds-badge--success { background: var(--color-success); color: var(--color-button-text); }\n.ds-badge--warning { background: var(--color-warning); color: var(--color-accent-text); }\n.ds-badge--danger { background: var(--color-danger); color: var(--color-button-text); }\n.ds-badge--chip {\n  height: var(--space-5);\n  padding: 0 calc(var(--space-2) + var(--space-1));\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-weight: var(--weight-body);\n}\n\n/* notice */\n.ds-notices {\n  display: grid;\n  gap: var(--space-3);\n  max-width: var(--size-measure);\n}\n.ds-notice {\n  padding: var(--space-3) var(--space-4);\n  border-left: var(--size-stripe) var(--border-style) var(--color-link);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-notice__title {\n  display: block;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n}\n.ds-notice--error {\n  border-left-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-danger);\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  font-family: var(--font-ui);\n}\n.ds-pagination__link {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  height: var(--size-control);\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover { background: color-mix(in srgb, var(--color-text-muted) 20%, transparent); }\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-disabled-text);\n  background: transparent;\n}\n\n/* dialog */\n.ds-overlay {\n  display: flex;\n  justify-content: center;\n  padding: var(--space-6) var(--space-4);\n  background: var(--color-overlay);\n}\n.ds-dialog {\n  width: 100%;\n  max-width: var(--size-dialog);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.6;\n}\n.ds-dialog__body {\n  padding: var(--space-3) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-base);\n}\n.ds-dialog__body p { margin: 0; }\n.ds-dialog__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--space-2);\n  padding: var(--space-2);\n}\n\n/* empty */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: var(--space-6) var(--space-4);\n  color: var(--color-text-muted);\n  text-align: center;\n}\n.ds-empty__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-fab);\n  height: var(--size-fab);\n  margin-bottom: var(--space-3);\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-disabled-text);\n}\n.ds-empty__title {\n  margin: 0;\n  color: var(--color-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: 1.6;\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-3);\n  font-size: var(--text-ui);\n}\n\n.ds-notices { max-width: none; }\n\n/* band */\n.ds-band {\n  position: relative;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  box-shadow: var(--shadow-panel);\n  text-shadow: var(--shadow-text);\n}\n.ds-band--inner { padding-bottom: calc(var(--size-overlap) + var(--space-5)); }\n.ds-view > .ds-band { clip-path: inset(0 -100% -100% -100%); }\n\n/* nav */\n.ds-nav {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  height: var(--size-bar);\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n}\n.ds-nav__menu {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  border-radius: 50%;\n  color: var(--color-bar-text);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-nav__menu:hover,\n.ds-nav__menu.is-hover { background: color-mix(in srgb, var(--color-bar-text) 16%, transparent); }\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  line-height: 1.2;\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-brand);\n  height: var(--size-brand);\n  flex: none;\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--color-button);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\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-weight: var(--weight-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-nav__links {\n  display: flex;\n  gap: var(--space-1);\n  margin: 0 0 0 auto;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__item { display: flex; }\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  color: color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover { color: var(--color-bar-text); }\n.ds-nav__link.is-current {\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n}\n\n/* hero */\n.ds-hero {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: var(--space-6) var(--space-4) var(--space-6);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-align: center;\n}\n.ds-hero__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n}\n.ds-hero__lead {\n  max-width: var(--size-measure);\n  margin: var(--space-3) 0 var(--space-5);\n  color: color-mix(in srgb, var(--color-bar-text) 87%, transparent);\n  font-size: var(--text-large);\n  line-height: 1.6;\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  margin: 0;\n  padding: 0 var(--space-3);\n  list-style: none;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n}\n.ds-tabs__tab {\n  display: flex;\n  align-items: center;\n  height: var(--size-row);\n  padding: 0 var(--space-4);\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  border-top: var(--border-width-strong) var(--border-style) transparent;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover { color: var(--color-text); }\n.ds-tabs__tab.is-current {\n  color: var(--color-text);\n  border-bottom-color: var(--color-link);\n}\n.ds-tabs--band {\n  justify-content: center;\n  border-top: 0;\n  background: var(--fill-bar);\n}\n.ds-tabs--band .ds-tabs__tab { color: color-mix(in srgb, var(--color-bar-text) 70%, transparent); }\n.ds-tabs--band .ds-tabs__tab:hover,\n.ds-tabs--band .ds-tabs__tab.is-hover,\n.ds-tabs--band .ds-tabs__tab.is-current { color: var(--color-bar-text); }\n.ds-tabs--band .ds-tabs__tab.is-current { border-bottom-color: var(--color-bar-text); }\n\n/* layout */\n.ds-main {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n  max-width: calc(var(--size-content) + var(--space-4) + var(--space-4));\n  margin: 0 auto;\n  padding: var(--space-5) var(--space-4) var(--space-8);\n}\n.ds-main--overlap {\n  position: relative;\n  margin-top: calc(var(--size-overlap) * -1);\n  padding-top: 0;\n}\n.ds-subhead {\n  margin: var(--space-3) 0 calc(var(--space-2) * -1);\n  padding: 0 var(--space-4);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-article {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-sidebar);\n  gap: var(--space-6);\n  align-items: start;\n}\n\n/* page header */\n.ds-page-header {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-2) var(--space-5) var(--space-5);\n}\n.ds-page-header__body { flex: 1 1 0; min-width: 0; }\n.ds-page-header__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: 1.18;\n  text-transform: var(--heading-transform);\n  letter-spacing: var(--heading-tracking);\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  font-size: var(--text-base);\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  padding-top: var(--space-1);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-4) var(--space-5) 0;\n  list-style: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-breadcrumb__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before { content: \"/\"; }\n.ds-breadcrumb__link { color: inherit; text-decoration: var(--link-decoration-quiet); }\n.ds-breadcrumb__link:hover { color: var(--color-link-hover); }\n.ds-breadcrumb__item.is-current { color: var(--color-text); }\n\n/* panel */\n.ds-panel {\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  min-height: var(--size-bar);\n  padding: 0 var(--space-2) 0 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n}\n.ds-panel__head .ds-panel__title { padding: 0 var(--space-4); }\n.ds-panel__body {\n  padding: var(--space-3) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-panel__body p { margin: 0 0 var(--space-3); }\n.ds-panel__body p:last-child { margin-bottom: 0; }\n.ds-panel__actions {\n  display: flex;\n  gap: var(--space-2);\n  padding: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__actions--end { justify-content: flex-end; }\n.ds-panel--article { padding: var(--space-6); }\n.ds-panel--article .ds-breadcrumb { padding: 0 0 var(--space-4); }\n.ds-panel > .ds-page-header:last-child { padding-bottom: var(--space-4); }\n.ds-panel__actions .ds-badges { padding: var(--space-2) var(--space-3); gap: var(--space-2); }\n.ds-panel--form .ds-panel__body { color: var(--color-text); padding: var(--space-4) var(--space-5); }\n.ds-panel--pad .ds-panel__body { color: var(--color-text); padding: var(--space-4); }\n\n/* sidebar */\n.ds-sidebar {\n  padding: var(--space-1) 0 var(--space-1) var(--space-3);\n  border-left: var(--size-stripe) var(--border-style) var(--color-link);\n  font-family: var(--font-ui);\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n.ds-sidebar__list {\n  margin: 0;\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  gap: var(--space-2);\n  min-height: var(--space-5);\n  color: color-mix(in srgb, var(--color-link-quiet) 66%, transparent);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover { color: var(--color-link-hover); }\n.ds-sidebar__link.is-current {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n}\n\n/* table */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th,\n.ds-table td {\n  height: var(--size-row);\n  padding: 0 var(--space-4);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  text-align: left;\n  vertical-align: middle;\n}\n.ds-table th {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-table tbody tr:last-child td { border-bottom: 0; }\n.ds-table tbody tr:hover,\n.ds-table tbody tr.is-hover { background: var(--color-surface-strong); }\n.ds-table tbody tr.is-current { background: var(--color-surface-alt); }\n.ds-table .ds-table__num { text-align: right; font-variant-numeric: tabular-nums; }\n.ds-table__name { font-family: var(--font-mono); font-size: var(--text-small); }\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-height: calc(var(--size-row) + var(--space-4));\n  padding: var(--space-2) var(--space-4);\n}\n.ds-list__item + .ds-list__item { border-top: var(--border-width) var(--border-style) var(--color-border-muted); }\n.ds-list__avatar {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  flex: none;\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-bar-text);\n  font-weight: var(--weight-bold);\n}\n.ds-list__avatar--alt { background: var(--color-fill-1); }\n.ds-list__avatar--accent { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-list__body { flex: 1 1 0; min-width: 0; }\n.ds-list__title {\n  display: block;\n  color: var(--color-link-quiet);\n  font-size: var(--text-base);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:hover { color: var(--color-link-hover); }\n.ds-list__text {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-list__meta {\n  flex: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* stats */\n.ds-stats {\n  display: flex;\n  gap: var(--space-3);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  flex: 1 1 0;\n  min-width: 0;\n  padding: var(--space-3) var(--space-3) var(--space-3);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  text-align: center;\n}\n.ds-stat__value {\n  display: block;\n  color: var(--color-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: 1.18;\n  font-variant-numeric: tabular-nums;\n}\n.ds-stat__label {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n}\n\n/* grid */\n.ds-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: var(--space-3);\n}\n.ds-grid__cell {\n  display: flex;\n  overflow: hidden;\n  min-height: var(--size-tile);\n  border-radius: var(--radius-page);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-grid__media {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex: none;\n  width: var(--size-tile);\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: 1.18;\n}\n.ds-grid__cell--2 .ds-grid__media { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-grid__cell--3 .ds-grid__media { background: var(--color-fill-3); }\n.ds-grid__cell--4 .ds-grid__media { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-grid__body {\n  display: flex;\n  flex: 1 1 0;\n  flex-direction: column;\n  min-width: 0;\n  padding: var(--space-3) var(--space-3) var(--space-2);\n}\n.ds-grid__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n}\n.ds-grid__text {\n  flex: 1 1 auto;\n  margin: var(--space-1) 0 var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-grid__actions { margin-left: calc(var(--space-3) * -1); }\n\n/* overlay */\n.ds-overlay {\n  display: flex;\n  justify-content: center;\n  padding: var(--space-6) var(--space-4);\n  border-radius: var(--radius-panel);\n  background: var(--color-overlay);\n}\n.ds-center {\n  display: flex;\n  justify-content: center;\n}\n\n/* footer */\n.ds-footer {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  min-height: var(--size-bar);\n  padding: var(--space-3) var(--space-4);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-small);\n}\n.ds-footer__brand {\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n}\n.ds-footer__list {\n  display: flex;\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: color-mix(in srgb, var(--color-inverse-text) 70%, transparent);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover { color: var(--color-inverse-text); }\n.ds-footer__legal {\n  margin: 0 0 0 auto;\n  color: color-mix(in srgb, var(--color-inverse-text) 70%, transparent);\n}\n\n/* views */\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.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#handbook\"],\n.ds-page:has(#handbook:target) .ds-nav__link[href=\"#handbook\"],\n.ds-page:has(#chapter:target) .ds-nav__link[href=\"#handbook\"],\n.ds-page:has(#api:target) .ds-nav__link[href=\"#api\"],\n.ds-page:has(#webhook:target) .ds-nav__link[href=\"#api\"],\n.ds-page:has(#starred:target) .ds-nav__link[href=\"#starred\"] {\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n}\n\n@media (max-width: 900px) {\n  .ds-article,\n  .ds-grid { grid-template-columns: minmax(0, 1fr); }\n  .ds-panel--article { padding: var(--space-4); }\n  .ds-tabs { overflow: auto; }\n  .ds-tabs--band { justify-content: flex-start; }\n  .ds-page-header { flex-direction: column; }\n  .ds-footer__legal { margin-left: 0; }\n}\n@media (max-width: 600px) {\n  .ds-nav {\n    flex-wrap: wrap;\n    gap: 0 var(--space-2);\n    height: auto;\n    padding: 0 var(--space-2);\n  }\n  .ds-nav__menu,\n  .ds-brand { margin-top: calc((var(--size-bar) - var(--size-row-dense)) / 2); }\n  .ds-brand { height: var(--size-row-dense); }\n  .ds-nav__links {\n    width: 100%;\n    margin: var(--space-2) 0;\n  }\n  .ds-hero { padding: var(--space-5) var(--space-3); }\n  .ds-hero__title { font-size: var(--text-h1); }\n  .ds-hero__lead { margin-bottom: var(--space-4); font-size: var(--text-base); }\n  .ds-tabs { padding: 0; }\n  .ds-tabs__tab { padding: 0 var(--space-3); white-space: nowrap; }\n  .ds-main { padding: var(--space-4) var(--space-3) var(--space-6); gap: var(--space-3); }\n  .ds-main--overlap { padding-top: 0; }\n  .ds-panel--article { padding: var(--space-3); }\n  .ds-breadcrumb { padding: var(--space-3) var(--space-3) 0; flex-wrap: wrap; }\n  .ds-page-header { padding: var(--space-2) var(--space-3) var(--space-4); }\n  .ds-stats { flex-wrap: wrap; gap: var(--space-2); }\n  .ds-stat { flex: 1 1 40%; }\n  .ds-table th,\n  .ds-table td { padding: 0 var(--space-2); }\n  .ds-table .ds-table__extra { display: none; }\n  .ds-list__item { padding: var(--space-2) var(--space-3); }\n  .ds-panel--form .ds-panel__body { padding: var(--space-4) var(--space-3); }\n  .ds-links { gap: var(--space-3) var(--space-4); }\n  .ds-overlay { padding: var(--space-4) var(--space-3); }\n  .ds-grid__media { width: calc(var(--size-tile) * 0.66); }\n  .ds-footer { gap: var(--space-2) var(--space-4); }\n  .ds-footer__list { gap: var(--space-3); }\n}\n\n/* phones: the links are tabs of equal width across the bar */\n@media (max-width: 600px) {\n  .ds-nav__links {\n    flex: 1 1 100%;\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .ds-nav__links > li {\n    flex: 1 1 0;\n  }\n  .ds-nav__link {\n    justify-content: center;\n    width: 100%;\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 handbook</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  <details class=\"ds-menu ds-menu--start\" data-component=\"menu\">\n    <summary class=\"ds-nav__menu ds-menu__button ds-tooltip ds-tooltip--right\" aria-label=\"Contents\"><svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 7h16M4 12h16M4 17h16\" stroke=\"currentColor\" fill=\"none\"/></svg><span class=\"ds-tooltip__text\" role=\"tooltip\">Contents</span></summary>\n    <ul class=\"ds-menu__list\">\n      <li><a class=\"ds-menu__link\" href=\"#handbook\">Handbook</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#chapter\">Your first feed</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#api\">Webhooks</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#webhook\">hook.opened</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#starred\">Starred chapters</a></li>\n    </ul>\n  </details>\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#\">\n    <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M4 3h8.5v8.5H21V21H4z\"/><path d=\"M14.5 3l6.5 6.5h-6.5z\" fill-opacity=\"0.55\"/></svg></span>\n    <span class=\"ds-brand__name\">chronoskin</span>\n  </a>\n  <ul class=\"ds-nav__links\">\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#handbook\">Handbook</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#api\">API</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#starred\">Starred</a></li>\n  </ul>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"handbook\">\n  <div class=\"ds-band\">\n    <div class=\"ds-hero\" data-component=\"hero\">\n      <h1 class=\"ds-hero__title\">Publishing handbook</h1>\n      <p class=\"ds-hero__lead\">Set up a feed, schedule issues and send them to readers on any screen.</p>\n      <a class=\"ds-button ds-button--secondary\" href=\"#chapter\">Start a feed</a>\n    </div>\n    <ul class=\"ds-tabs ds-tabs--band\">\n      <li><a class=\"ds-tabs__tab is-current\" href=\"#handbook\">Basics</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#chapter\">Feeds</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#chapter\">Issues</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#api\">Webhooks</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#starred\">Starred</a></li>\n    </ul>\n  </div>\n\n  <div class=\"ds-main\">\n\n    <h2 class=\"ds-subhead\">Chapters</h2>\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <article class=\"ds-grid__cell\">\n        <div class=\"ds-grid__media\">01</div>\n        <div class=\"ds-grid__body\">\n          <h3 class=\"ds-grid__title\">Your first feed</h3>\n          <p class=\"ds-grid__text\">Name a feed, give it an address and push a draft.</p>\n          <div class=\"ds-grid__actions\"><a class=\"ds-button ds-button--flat\" href=\"#chapter\">Open</a></div>\n        </div>\n      </article>\n      <article class=\"ds-grid__cell ds-grid__cell--2\">\n        <div class=\"ds-grid__media\">02</div>\n        <div class=\"ds-grid__body\">\n          <h3 class=\"ds-grid__title\">Scheduling</h3>\n          <p class=\"ds-grid__text\">Send at a set hour in each reader's own time zone.</p>\n          <div class=\"ds-grid__actions\"><a class=\"ds-button ds-button--flat\" href=\"#chapter\">Open</a></div>\n        </div>\n      </article>\n      <article class=\"ds-grid__cell ds-grid__cell--3\">\n        <div class=\"ds-grid__media\">03</div>\n        <div class=\"ds-grid__body\">\n          <h3 class=\"ds-grid__title\">Webhooks</h3>\n          <p class=\"ds-grid__text\">Have your own service called when an issue is sent or opened.</p>\n          <div class=\"ds-grid__actions\"><a class=\"ds-button ds-button--flat\" href=\"#api\">Open</a></div>\n        </div>\n      </article>\n      <article class=\"ds-grid__cell ds-grid__cell--4\">\n        <div class=\"ds-grid__media\">04</div>\n        <div class=\"ds-grid__body\">\n          <h3 class=\"ds-grid__title\">Archive</h3>\n          <p class=\"ds-grid__text\">Keep past issues searchable or take them offline.</p>\n          <div class=\"ds-grid__actions\"><a class=\"ds-button ds-button--flat\" href=\"#chapter\">Open</a></div>\n        </div>\n      </article>\n    </div>\n\n    <div class=\"ds-panel\" data-component=\"panel\">\n      <h3 class=\"ds-panel__title\">Sample feed</h3>\n      <div class=\"ds-panel__body\">\n        <p>A small weekly feed with three issues, two editors and a template, ready to copy into your account.</p>\n        <div class=\"ds-accordion\" data-component=\"accordion\">\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__head\">What is in it?</summary>\n            <p class=\"ds-accordion__body\">Three issues, one template and a weekly schedule.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__head\">Who can edit it?</summary>\n            <p class=\"ds-accordion__body\">You and anyone you add as an editor after copying it.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__head\">Does it send anything?</summary>\n            <p class=\"ds-accordion__body\">No. A copied feed stays a draft until you schedule an issue.</p>\n          </details>\n        </div>\n      </div>\n      <div class=\"ds-panel__actions\">\n        <a class=\"ds-button ds-button--flat\" href=\"#chapter\">Read how it is built</a>\n        <a class=\"ds-button ds-button--flat\" href=\"#starred\">Star it</a>\n      </div>\n    </div>\n\n    <h2 class=\"ds-subhead\">Recently edited</h2>\n    <div class=\"ds-panel\">\n      <ul class=\"ds-list\" data-component=\"list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar\">S</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#chapter\">Scheduling across time zones</a>\n            <span class=\"ds-list__text\">Added the table of sending windows.</span>\n          </span>\n          <span class=\"ds-list__meta\">4 Jun</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar ds-list__avatar--alt\">W</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#api\">Webhook retries</a>\n            <span class=\"ds-list__text\">Failed calls are now retried for a day.</span>\n          </span>\n          <span class=\"ds-list__meta\">21 May</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar ds-list__avatar--accent\">R</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#chapter\">Reader imports</a>\n            <span class=\"ds-list__text\">Bring a list from a spreadsheet in one step.</span>\n          </span>\n          <span class=\"ds-list__meta\">2 May</span>\n        </li>\n      </ul>\n      <div class=\"ds-panel__actions ds-panel__actions--end\">\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li><a class=\"ds-pagination__link is-disabled\" href=\"#handbook\" aria-label=\"Previous\">\n            <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n          </a></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#handbook\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#handbook\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#handbook\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#handbook\" aria-label=\"Next\">\n            <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n          </a></li>\n        </ul>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"chapter\">\n  <div class=\"ds-band ds-band--inner\"></div>\n  <div class=\"ds-main ds-main--overlap\">\n\n    <div class=\"ds-panel ds-panel--article\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#handbook\">Handbook</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#handbook\">Basics</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Your first feed</li>\n      </ol>\n      <div class=\"ds-article\">\n        <article class=\"ds-prose\" data-component=\"typography\">\n          <h1>Your first feed</h1>\n          <p class=\"ds-prose__lead\">A feed is a named stream of issues. Readers follow the feed, not the single issue.</p>\n          <h2>Naming and address</h2>\n          <p>Every feed gets a short address made from its name. Change it later with <code>feed.rename</code>; old addresses keep working for ninety days. The <a href=\"#api\">webhook reference</a> lists the events a feed can send.</p>\n          <ul>\n            <li>Names are up to forty characters.</li>\n            <li>One feed can have several editors.</li>\n            <li>Drafts are private until an issue is scheduled.</li>\n          </ul>\n          <h3>From the command line</h3>\n          <p>Create the feed, then push a first draft.</p>\n          <pre><code>chronoskin feed new \"Night desk\"\nchronoskin push draft.md --feed night-desk</code></pre>\n        </article>\n        <aside class=\"ds-sidebar\" data-component=\"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=\"#chapter\">Naming and address</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#chapter\">Command line</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#chapter\">Editors</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#chapter\">Scheduling <span class=\"ds-badge ds-badge--new\">3</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#chapter\">Archiving</a></li>\n          </ul>\n        </aside>\n      </div>\n    </div>\n\n    <div class=\"ds-notices\" data-component=\"notice\">\n      <div class=\"ds-notice\">\n        <strong class=\"ds-notice__title\">Heads up</strong>\n        Scheduled issues go out in the reader's time zone, not yours.\n      </div>\n      <div class=\"ds-notice ds-notice--error\">\n        <strong class=\"ds-notice__title\">Push rejected</strong>\n        The draft has no title. Add one and push again.\n      </div>\n    </div>\n\n    <div class=\"ds-panel ds-panel--pad\">\n      <div class=\"ds-panel__head\">\n        <h3 class=\"ds-panel__title\">Read next</h3>\n        <a class=\"ds-button ds-button--flat\" href=\"#starred\">Star this chapter</a>\n      </div>\n      <div class=\"ds-panel__body\">\n        <div class=\"ds-links\" data-component=\"links\">\n          <a class=\"ds-link\" href=\"#chapter\">Scheduling</a>\n          <a class=\"ds-link is-visited\" href=\"#handbook\">Handbook contents</a>\n          <a class=\"ds-link is-hover\" href=\"#api\">Webhooks</a>\n          <a class=\"ds-link is-active\" href=\"#chapter\">Templates</a>\n          <a class=\"ds-link ds-link--quiet\" href=\"#starred\">Starred chapters</a>\n        </div>\n        <p>You have read one chapter of four.</p>\n        <span class=\"ds-progress\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Handbook read\"><span class=\"ds-progress__bar ds-progress__bar--low\"></span></span>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"api\">\n  <div class=\"ds-band ds-band--inner\"></div>\n  <div class=\"ds-main ds-main--overlap\">\n\n    <div class=\"ds-panel\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#api\">API</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#api\">Resources</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Webhooks</li>\n      </ol>\n      <header class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Webhooks</h1>\n          <p class=\"ds-page-header__text\">Addresses that chronoskin calls when an issue is sent, opened or bounced.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button\" href=\"#webhook\">Add webhook</a>\n        </div>\n      </header>\n      <ul class=\"ds-tabs\" data-component=\"tabs\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#api\">Endpoints</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#api\">Events</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#api\">Deliveries</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#api\">Secrets</a></li>\n      </ul>\n    </div>\n\n    <ul class=\"ds-stats\" data-component=\"stats\">\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">4</span><span class=\"ds-stat__label\">Endpoints</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">18,204</span><span class=\"ds-stat__label\">Calls this week</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">99.2%</span><span class=\"ds-stat__label\">Delivered</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">143</span><span class=\"ds-stat__label\">Retries</span></li>\n    </ul>\n\n    <div class=\"ds-panel\">\n      <div class=\"ds-panel__head\">\n        <h3 class=\"ds-panel__title\">Endpoints</h3>\n        <a class=\"ds-button ds-button--flat\" href=\"#webhook\">Edit hook.opened</a>\n      </div>\n      <table class=\"ds-table\" data-component=\"table\">\n        <thead>\n          <tr><th>Name</th><th class=\"ds-table__extra\">Event</th><th>Status</th><th class=\"ds-table__num\">Calls</th><th class=\"ds-table__num\">Failed</th><th class=\"ds-table__num ds-table__extra\">Median ms</th></tr>\n        </thead>\n        <tbody>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#webhook\">hook.sent</a></td><td class=\"ds-table__extra\">Issue sent</td><td><span class=\"ds-badge ds-badge--success\">Live</span></td><td class=\"ds-table__num\">9,120</td><td class=\"ds-table__num\">12</td><td class=\"ds-table__num ds-table__extra\">84</td></tr>\n          <tr class=\"is-current\"><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#webhook\">hook.opened</a></td><td class=\"ds-table__extra\">Issue opened</td><td><span class=\"ds-badge ds-badge--success\">Live</span></td><td class=\"ds-table__num\">7,645</td><td class=\"ds-table__num\">31</td><td class=\"ds-table__num ds-table__extra\">91</td></tr>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#webhook\">hook.joined</a></td><td class=\"ds-table__extra\">Reader joined</td><td><span class=\"ds-badge ds-badge--warning\">Paused</span></td><td class=\"ds-table__num\">1,302</td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num ds-table__extra\">77</td></tr>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#webhook\">hook.bounced</a></td><td class=\"ds-table__extra\">Mail bounced</td><td><span class=\"ds-badge ds-badge--danger\">Failing</span></td><td class=\"ds-table__num\">137</td><td class=\"ds-table__num\">100</td><td class=\"ds-table__num ds-table__extra\">2,410</td></tr>\n        </tbody>\n      </table>\n      <div class=\"ds-panel__actions\">\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">4</span>\n          <span class=\"ds-badge ds-badge--success\">Live</span>\n          <span class=\"ds-badge ds-badge--warning\">Paused</span>\n          <span class=\"ds-badge ds-badge--danger\">Failing</span>\n          <span class=\"ds-badge ds-badge--new\">New</span>\n          <span class=\"ds-badge ds-badge--chip\">Weekly feed</span>\n          <span class=\"ds-badge ds-badge--chip\">Editors only</span>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"webhook\">\n  <div class=\"ds-band ds-band--inner\"></div>\n  <div class=\"ds-main ds-main--overlap\">\n\n    <div class=\"ds-panel\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#api\">API</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#api\">Webhooks</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">hook.opened</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">hook.opened</h1>\n          <p class=\"ds-page-header__text\">Called each time a reader opens an issue of the night desk feed.</p>\n        </div>\n        <div class=\"ds-page-header__actions ds-buttons\" data-component=\"buttons\">\n          <button class=\"ds-button ds-button--danger\" type=\"button\">Delete</button>\n          <button class=\"ds-button ds-button--secondary\" type=\"button\">Send test</button>\n          <button class=\"ds-button is-disabled\" type=\"button\" disabled>Replay</button>\n          <a class=\"ds-button\" href=\"#api\">Save</a>\n        </div>\n      </header>\n    </div>\n\n    <div class=\"ds-panel ds-panel--form\">\n      <div class=\"ds-panel__head\"><h3 class=\"ds-panel__title\">Settings</h3></div>\n      <div class=\"ds-panel__body\">\n        <form class=\"ds-form\" data-component=\"form\">\n          <label class=\"ds-form__field\">\n            <span class=\"ds-form__label\">Label</span>\n            <input class=\"ds-form__control\" type=\"text\" value=\"Opens to the stats board\">\n          </label>\n          <label class=\"ds-form__field is-invalid\">\n            <span class=\"ds-form__label\">Address</span>\n            <input class=\"ds-form__control\" type=\"text\" value=\"stats.example/hooks\">\n            <span class=\"ds-form__error\">Start the address with https.</span>\n          </label>\n          <label class=\"ds-form__field\">\n            <span class=\"ds-form__label\">Event</span>\n            <span class=\"ds-form__select\">\n              <select class=\"ds-form__control\">\n                <option>Issue opened</option>\n                <option>Issue sent</option>\n                <option>Mail bounced</option>\n              </select>\n            </span>\n          </label>\n          <label class=\"ds-form__field\">\n            <span class=\"ds-form__label\">Notes</span>\n            <textarea class=\"ds-form__control ds-form__control--area\">Feeds the weekly opens chart for the night desk.</textarea>\n            <span class=\"ds-form__hint\">Only editors see this.</span>\n          </label>\n          <label class=\"ds-form__check\">\n            <input class=\"ds-form__checkbox\" type=\"checkbox\" checked>\n            <span>Retry failed calls for a day</span>\n          </label>\n          <label class=\"ds-form__check\"><span class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></span><span>Send a test call after saving</span></label>\n        </form>\n      </div>\n      <div class=\"ds-panel__actions ds-panel__actions--end\">\n        <a class=\"ds-button ds-button--flat\" href=\"#api\">Cancel</a>\n        <a class=\"ds-button\" href=\"#api\">Save</a>\n      </div>\n    </div>\n\n    <div class=\"ds-overlay\">\n      <div class=\"ds-dialog\" role=\"dialog\" aria-labelledby=\"dialog-title\" data-component=\"dialog\">\n        <h3 class=\"ds-dialog__title\" id=\"dialog-title\">Delete hook.opened?</h3>\n        <div class=\"ds-dialog__body\">\n          <p>The stats board stops receiving opens at once. Past deliveries stay in the log.</p>\n        </div>\n        <div class=\"ds-dialog__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#webhook\">Keep it</a>\n          <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#api\">Delete</a>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"starred\">\n  <div class=\"ds-band ds-band--inner\"></div>\n  <div class=\"ds-main ds-main--overlap\">\n\n    <div class=\"ds-panel\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#handbook\">Handbook</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#starred\">Your shelf</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Starred</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Starred chapters</h1>\n          <p class=\"ds-page-header__text\">Chapters you marked to come back to, newest first.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button\" href=\"#handbook\">Browse the handbook</a>\n        </div>\n      </header>\n    </div>\n\n    <div class=\"ds-panel\">\n      <div class=\"ds-empty\" data-component=\"empty\">\n        <span class=\"ds-empty__mark\">\n          <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 4l2.5 5 5.5.8-4 3.9.9 5.5-4.9-2.6-4.9 2.6.9-5.5-4-3.9 5.5-.8z\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        </span>\n        <h3 class=\"ds-empty__title\">No stars yet</h3>\n        <p class=\"ds-empty__text\">Chapters you star are kept here.</p>\n        <a class=\"ds-button ds-button--flat\" href=\"#handbook\">Browse the handbook</a>\n      </div>\n    </div>\n\n    <h2 class=\"ds-subhead\">Readers star these most</h2>\n    <div class=\"ds-panel\">\n      <ul class=\"ds-list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar ds-list__avatar--alt\">01</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#chapter\">Your first feed</a>\n            <span class=\"ds-list__text\">Name a feed, give it an address and push a draft.</span>\n          </span>\n          <span class=\"ds-list__meta\">412 stars</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar ds-list__avatar--accent\">02</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#chapter\">Scheduling</a>\n            <span class=\"ds-list__text\">Send at a set hour in each reader's own time zone.</span>\n          </span>\n          <span class=\"ds-list__meta\">268 stars</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__avatar\">03</span>\n          <span class=\"ds-list__body\">\n            <a class=\"ds-list__title\" href=\"#api\">Webhooks</a>\n            <span class=\"ds-list__text\">Have your own service called when an issue is sent or opened.</span>\n          </span>\n          <span class=\"ds-list__meta\">197 stars</span>\n        </li>\n      </ul>\n    </div>\n\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <span class=\"ds-footer__brand\">chronoskin</span>\n  <ul class=\"ds-footer__list\">\n    <li><a class=\"ds-footer__link\" href=\"#handbook\">Handbook</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#chapter\">First feed</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#api\">API</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#starred\">Starred</a></li>\n  </ul>\n  <p class=\"ds-footer__legal\">chronoskin is a sample project. Text free to reuse.</p>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.material-design.docs.s02.p08.t11.u11\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"material-design\",\n    \"years\": [\n      2014,\n      2018\n    ]\n  },\n  \"archetype\": \"docs\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": true,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-md-28bb\",\n  \"short\": \"v1-md-28bb\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #263238;\n  --color-canvas: #263238;\n  --color-surface: #37474f;\n  --color-surface-alt: #455a64;\n  --color-surface-strong: #546e7a;\n  --color-bar: #d32f2f;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #b71c1c;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #cfd8dc;\n  --color-inverse-text: #263238;\n  --color-text: #eceff1;\n  --color-text-muted: #b0bec5;\n  --color-heading: #ffffff;\n  --color-heading-alt: #b0bec5;\n  --color-link: #64ffda;\n  --color-link-quiet: #eceff1;\n  --color-link-visited: #80cbc4;\n  --color-link-hover: #a7ffeb;\n  --color-link-active: #1de9b6;\n  --color-border: rgb(255 255 255 / 0.12);\n  --color-border-strong: #90a4ae;\n  --color-border-muted: #41525a;\n  --color-accent: #1de9b6;\n  --color-accent-text: #263238;\n  --color-accent-alt: #ffd740;\n  --color-fill-1: #d32f2f;\n  --color-fill-2: #1de9b6;\n  --color-fill-3: #00897b;\n  --color-fill-4: #eceff1;\n  --color-button: #1de9b6;\n  --color-button-text: #263238;\n  --color-button-hover-text: #263238;\n  --color-button-secondary: #eceff1;\n  --color-button-secondary-text: #263238;\n  --color-input: #455a64;\n  --color-input-text: #ffffff;\n  --color-input-border: #90a4ae;\n  --color-disabled: #455a64;\n  --color-disabled-text: #78909c;\n  --color-danger: #ff8a80;\n  --color-danger-surface: #4a3237;\n  --color-success: #69f0ae;\n  --color-warning: #ffab40;\n  --color-notice: #455a64;\n  --color-notice-text: #eceff1;\n  --color-focus: #a7ffeb;\n  --color-shadow: #000000;\n  --color-overlay: rgb(0 0 0 / 0.6);\n}\n\n/* @part type */\n:root {\n  --font-body: Roboto, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-heading: Roboto, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-ui: Roboto, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-mono: \"Roboto Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n  --text-base: 15px;\n  --text-small: 13px;\n  --text-ui: 13px;\n  --text-large: 20px;\n  --text-display: 56px;\n  --text-h1: 34px;\n  --text-h2: 26px;\n  --text-h3: 18px;\n  --line-body: 1.6;\n  --line-heading: 1.3;\n  --line-display: 1.1;\n  --weight-body: 400;\n  --weight-bold: 500;\n  --weight-heading: 300;\n  --weight-display: 300;\n  --weight-ui: 500;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: uppercase;\n  --link-decoration: none;\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: 16px;\n  --shadow-panel: 0 1px 3px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 6px 16px 0 color-mix(in srgb, var(--color-shadow) 10%, transparent);\n  --shadow-control: 0 1px 3px 0 color-mix(in srgb, var(--color-shadow) 16%, transparent), 0 2px 6px 0 color-mix(in srgb, var(--color-shadow) 10%, transparent);\n  --shadow-control-hover: 0 2px 4px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 6px 14px 0 color-mix(in srgb, var(--color-shadow) 18%, transparent);\n  --shadow-control-pressed: 0 1px 2px 0 color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  --shadow-dialog: 0 8px 12px -4px color-mix(in srgb, var(--color-shadow) 18%, transparent), 0 16px 22px 2px color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 85%, white);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-surface-alt);\n  --focus-ring: 4px solid color-mix(in srgb, var(--color-focus) 30%, transparent);\n  --transition: box-shadow 0.3s ease-out, background-color 0.3s ease-out, color 0.3s ease-out;\n  --backdrop-blur: 0px;\n}\n"
  }
}
