{
  "id": "v1-md-3353",
  "long_id": "v1.material-design.docs.s03.p03.t05.u03",
  "name": "Material product landing, 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 developer landing page in the paper-and-ink manner: a white toolbar with the links at the right, a full-width hero block in the primary colour with a floating action button on its lower edge, and below it a sequence of full-width bands with centred headings. The first band is a mosaic of solid colour-block cards of unequal size; later bands alternate between the page colour, a grey band of white cards and a dark band. Platform, product and developer-hub home pages built on the 2014 guidelines used this skeleton until about 2018.",
  "url": "https://chrono.skin/s/v1-md-3353",
  "preview_url": "https://chrono.skin/s/v1-md-3353/specimen.html",
  "files": {
    "STYLE.md": "# Material product landing, 2016\n\n## Summary\n\nA developer landing page in the paper-and-ink manner: a white toolbar with the links at the right, a full-width hero block in the primary colour with a floating action button on its lower edge, and below it a sequence of full-width bands with centred headings. The first band is a mosaic of solid colour-block cards of unequal size; later bands alternate between the page colour, a grey band of white cards and a dark band. Platform, product and developer-hub home pages built on the 2014 guidelines used this skeleton until about 2018.\n\n## Layout\n\n- The page is fluid: `--size-page` is `100%`; toolbar, hero, bands and footer span the window. Designed at 1440px. Content inside every band is centred in `.ds-container`, capped at `--size-content` (1200px) with `--space-5` side padding; running text is capped at `--size-measure` (600px).\n- Order on the home page: `.ds-nav` (a white sheet, `--size-bar` 64px, brand left, links right, current link marked by a `--border-width-strong` (3px) line in `--color-link`), `.ds-hero` (title, lead and button at the left, a composition of flat shapes `--size-art` wide at the right, `.ds-hero__fab` straddling the bottom edge), then `.ds-section` bands, then `.ds-footer`. There is no drawer and no sidebar on the home page.\n- A `.ds-section` has `--space-7` (72px) of padding above and below and usually opens with a centred `.ds-intro`. Bands are separated by a change of fill, never by a rule: plain (page colour), `--strong` (grey, holds white cards only) and `--inverse` (dark, holds one left-aligned `.ds-intro--start` and a button). `--tight` removes the top padding when two plain bands follow each other.\n- The mosaic `.ds-grid` has four columns and rows of `--size-tile` (168px), `--space-2` (8px) apart. One `--feature` cell spans two columns and two rows, one `--wide` cell spans two columns, the rest are single. Text sits directly on the fill.\n- `.ds-columns` splits a band in two (`--split` 7:5 for text beside a ruled list, `--cards` 1:2 for cards). `.ds-stack` piles blocks `--space-4` apart. `.ds-columns--even` stretches both columns of a split band to one height: the cards of its `.ds-stack` share the height of the neighbouring column equally, so both columns end on the same line.\n- Spacing: `--space-1` 4px, `--space-2` 8px (mosaic gap, between flat buttons), `--space-3` 16px (button padding, list row padding, table cell padding), `--space-4` 24px (card padding, gap between cards and stacked blocks), `--space-5` 40px (container side padding, gap between main column and rail, form column gap), `--space-6` 56px (under a centred intro, top of the footer), `--space-7` 72px (band padding, hero top, gap in a split band), `--space-8` 104px (hero bottom, bottom of an inner page).\n- Heights: toolbar `--size-bar` 64px; tabs and table rows `--size-row` 48px; table head and rail links `--size-row-dense` 40px; buttons and fields `--size-control` 36px; floating button `--size-fab` 56px. Other sizes: `--size-sidebar` 280px, `--size-stripe` 4px, `--size-icon` 24px, `--size-check` 18px, `--size-badge` 22px, `--size-dialog` 440px, `--size-area` 96px.\n- Inner pages (a guide, reference, a record and its table, settings, the console) have no `.ds-hero`. Under the same white `.ds-nav` comes `.ds-page-header`, a compact full-width strip in the primary colour: the `.ds-breadcrumb` on its first line, then the title and one line of description at the left and one white raised button at the right. Directly under it `.ds-tabs` is a full-width white strip with a shadow, when the page has tabs. Then `.ds-layout` in a container: the main column at the left (`.ds-stats` unboxed on the page, the `.ds-table` sheet and its status key, or a form card with fields in two columns, `--space-4` apart) and a right rail of `--size-sidebar` holding the `.ds-sidebar` card and secondary cards. The rail is always on the right and only on inner pages. A guide page uses `.ds-section--inner` with `.ds-columns--split` instead: the `.ds-prose` text at the left, notices and cards stacked at the right.\n- Views: the specimen is one site with five views. `develop` is the home view: hero, the mosaic of guides, the list of latest changes beside two cards, and the dark band that leads to the console. `guide` is a guide page: page header strip, prose beside notices and a card of related links. `reference` is a reference page: page header strip, tabs, stats, the table and its status key, with the section rail at the right. `driver` is the settings form for one table row, with all its actions at the foot of the form and the reset dialog and a destructive card in the rail. `console` is the stations list, shown empty, beside two help cards.\n- Below 900px every grid becomes one column, the mosaic and the footer two, the hero shapes are dropped and the page header stacks. Below 600px the toolbar wraps into a brand row and a full-width `.ds-nav__links` row whose items share the width and centre their links (the current one keeps `.is-current`), the account menu `.ds-menu--account` is pinned at the right of the brand row with its name (`.ds-menu__label`) hidden, the mosaic becomes one column, stats 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- Two families: `--font-heading` is a slab serif (Roboto Slab, openly licensed, then Rockwell and Georgia) for the brand name, card titles, page titles and figures; `--font-body` and `--font-ui` are Roboto for everything else. `--font-mono` is for code only.\n- Dense application text: `--text-base` 14px on a 20px line (`--line-body` 1.43); `--text-ui` 13px (buttons, tabs, bar links, card text); `--text-small` 12px (captions, meta, table heads, field labels, footer); `--text-large` 20px (featured lead, brand name, prose lead).\n- Headings: `--text-display` 40px light (`--weight-display` 300) for the featured title only; `--text-h1` 30px, `--text-h2` 24px and `--text-h3` 16px are bold (`--weight-heading` and `--weight-bold` 700) on `--line-heading` 1.25. `--weight-ui` is 500. Nothing is heavier than 700 or lighter than 300.\n- `--ui-transform` is `uppercase` for buttons, tabs, bar links and small captions (`.ds-hero__overline`, `.ds-stat__label`, `.ds-sidebar__title`, `.ds-panel__label`). Headings are sentence case. No tracking. Links have no underline at rest and gain one on hover (`--link-decoration-hover`); quiet links never do.\n- `--color-page` `#f5f5f5` is the desk; `--color-surface` white is every card and sheet; `--color-surface-alt` `#fafafa` the current table row, current side link and code block; `--color-surface-strong` `#e0e0e0` chips, hovered rows, inline code and the empty-state disc.\n- `--fill-bar` (purple `#9c27b0`) with `--color-bar-text` white: the app bar, the tab strip and the page header. Secondary text on it is `--color-bar-text` at 70% or 87%; the search field and the current view link are a 16% wash of it. `--fill-bar-alt` (deep purple `#7820a0`) with `--color-bar-alt-text`: the legal strip under the footer. `--fill-inverse` (`#212121`) with `--color-inverse-text`: the footer.\n- `--color-button` purple with white text: raised primary button, brand tile, current page, checked checkbox. `--color-button-secondary` white with purple text: the second button and the active filter chip. `--color-accent` pink `#ff4081` with `--color-accent-text`: the floating button and count badges. `--color-link` is deep pink `#c2185b`, brightening to `#ff4081` on hover; visited links are purple. `--color-accent-alt` cyan `#00bcd4` marks \"new\".\n- `--color-fill-1` to `--color-fill-4` (purple, pink, light purple, near-black) are the picture blocks of cards (`.ds-media`), the list avatars and the side swatches. Fixed text pairs: `--color-bar-text` on fill 1 and fill 3, `--color-accent-text` on fill 2, the accent and the warning badge, `--color-inverse-text` on fill 4 and the footer, `--color-button-text` on the primary and danger buttons and on the new, success and danger badges. Links, muted text and headings are used only on the desk and on white sheets.\n- `--color-text` and `--color-heading` are black at 87%, `--color-text-muted` black at 54%; `--color-heading-alt` deep purple is the toolbar title and side titles. `--color-border` black at 12% for dividers, `--color-border-muted` `#eeeeee` inside lists, `--color-input-border` black at 54% under a field.\n- `--color-notice` (`#212121`) with white `--color-notice-text` is the information notice, a dark slab like a snackbar; the error notice is `--color-danger-surface` with a `--color-danger` (`#bd4147`) outline and text. `--color-success` teal and `--color-warning` orange are flat badge fills.\n- Surface: `--radius-control`, `--radius-panel` and `--radius-page` are 2px; `--radius-pill` 16px rounds badges, chips and pagination cells fully; discs are 50%. Cards rest on `--shadow-panel` (three tight layers, 5px blur); raised buttons on `--shadow-control` (6px blur); the floating button and a hovered button on `--shadow-control-hover` (10px blur); the active chip shows `--shadow-control-pressed` (a 1px inner ring); the featured card and the dialog float on `--shadow-dialog` (three layers up to 22px blur). All fills are flat; a hovered button darkens by 8% black; `--fill-input` is a 4% wash of the text colour above the field's bottom line. `--border-width` 1px, `--border-width-strong` 2px for tab indicators and the focus and error line; `--focus-ring` a 2px line of the focus colour at 60%; `--transition` 0.25s on the standard curve. `--backdrop-blur` is `0px` and applies to the app bar.\n- One-off values built with `color-mix()`, `calc()` or `opacity` because the vocabulary has no token: 70% and 87% of the bar text for secondary text on the bar, 16% of it for the search field and current link, 22% and 12% of it for the header shapes, 30% opacity and 20% of `--color-shadow` for the two shapes of a picture, 70% of the inverse text in the footer, a 20% grey wash behind a hovered flat button, a 12% danger wash, and line heights 1.2, 1.25, 1.3, 1.43 and 1.5.\n\n## Components\n\n- `.ds-page` on `<body>`: page fill, body family and size.\n- `.ds-nav`: the white toolbar. `.ds-brand` at the left; `.ds-nav__links` > `.ds-nav__item` > `.ds-nav__link` at the right; `is-current` has the 3px `--color-link` line on the toolbar's bottom edge.\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`, no border, as buttons in this style have none) holding the mark as inline SVG in the current colour; `.ds-brand__name` is the name at `--text-h2` in the heading font with `--weight-heading`, `--heading-tracking` and `--heading-transform`, in `--color-heading` because the toolbar is a white sheet (`--fill-panel`). The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-hero`: full-width block in the primary colour. `.ds-hero__inner` (with `.ds-container`) places the text column (`.ds-hero__title`, `.ds-hero__lead`, one raised `.ds-button--secondary`) beside `.ds-hero__art`, a group of flat `.ds-hero__shape` rectangles (`--2`, `--3`) and one accent disc (`--disc`). `.ds-hero__fab` positions the floating button on the bottom edge.\n- `.ds-container`: centres content at the page width inside any full-width block. `.ds-section` is a band (`--strong`, `--inverse`, `--tight`). `.ds-intro` is its heading: `.ds-intro__title`, `.ds-intro__text`, optional `.ds-intro__actions`; centred by default, `--start` left-aligned. `.ds-columns` (`--split`, `--cards`), `.ds-stack`, `.ds-center` and `.ds-label` (a column heading) arrange what is inside. `.ds-layout` is the inner page's main column plus right rail.\n- `.ds-page-header`: the coloured strip at the head of an inner page. `.ds-page-header__row` holds `.ds-page-header__body` (`.ds-page-header__title`, `.ds-page-header__text`) and `.ds-page-header__actions` with one `.ds-button--secondary`.\n- `.ds-breadcrumb`: small trail of `.ds-breadcrumb__item` with `.ds-breadcrumb__link`, separated by drawn chevrons; the last carries `is-current`. Inside the page header it takes the bar text colour.\n- `.ds-tabs`: a full-width white strip under the page header; `.ds-tabs__list` aligns the `.ds-tabs__tab` items with the container; `is-current` has a 3px line in `--color-link`.\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. It sits directly on the page, not on a sheet.\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 hero and the page header), `--flat` has no fill (inside cards, dialogs, empty states), `--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`: fields in two columns on a card. `.ds-form__field` wraps `.ds-form__label` and a `.ds-form__control` with only a bottom line (`--area` for a textarea, inside `.ds-form__select` for a select); `--full` spans both columns; `is-focus`, `is-invalid` with `.ds-form__error`, `.ds-form__hint`, `.ds-form__check` with `.ds-form__checkbox`, and `.ds-form__actions` right-aligned across both columns.\n- `.ds-table`: a white shadowed sheet; the head row is a 40px grey strip with dark text, body rows are 48px with hairlines. `.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`: an unboxed list on the page: rows divided by full-width hairlines, no sheet and no avatars. `.ds-list__item` holds `.ds-list__body` with a link-coloured `.ds-list__title` and `.ds-list__text`, and `.ds-list__meta` at the right.\n- `.ds-panel`: a white card with `.ds-panel__title`, `.ds-panel__body` and optional ruled `.ds-panel__actions`; `--pad` gives the body normal text colour for controls or a form. Use it on the grey band and in the rail.\n- `.ds-stat`: one summary figure, unboxed on the page: a 3px rule above, `.ds-stat__value`, `.ds-stat__label`. Three or more sit in a `.ds-stats` row, `--space-4` apart.\n- `.ds-grid`: the mosaic. Each `.ds-grid__cell` is a link filled with a block colour (`--2`, `--3`, `--4`), sized by `--feature` or `--wide`, holding `.ds-grid__title`, `.ds-grid__text` and a `.ds-grid__more` label pinned to the bottom.\n- `.ds-badge`: accent count tag; `--new`, `--chip`, and the status fills `--success`, `--warning`, `--danger`. Group with `.ds-badges`.\n- `.ds-sidebar`: the right-rail card of an inner page: `.ds-sidebar__title` headings and `.ds-sidebar__list` groups of 40px `.ds-sidebar__link` rows; `is-current` is link-coloured on a tint.\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.\n- `.ds-pagination`: `.ds-pagination__link` cells, `is-current` filled, `is-disabled` grey, centred under the list 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, directly on the page.\n- `.ds-footer`: dark band. `.ds-footer__cols` puts `.ds-footer__brand` with `.ds-footer__text` in a wide first column and three link columns (`.ds-footer__title`, `.ds-footer__list`, `.ds-footer__link`) beside it; `.ds-footer__legal` is a ruled last line.\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-menu--account`: the account menu in the bar; its `.ds-menu__label` shows the name beside the avatar and is hidden on a phone, where only the avatar is left.\n- `.ds-avatar`: a person as a `--size-control` disc in the accent fill with one initial; use it in the bar as the account button.\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 <= 72px`: bands touch; inside a band blocks are at most one band padding apart.\n- `content-width >= 70%`: content fills a 1200px container in a 1440px window; it is never a narrow centred column.\n- `font-weight <= 700`: bold slab headings are the heaviest text.\n- `font-weight >= 300`: light is for the featured title only.\n- `font-size >= 12px`: captions are the smallest text.\n- `font-size <= 40px`: the featured title is the largest text.\n- `font-families <= 3`: a slab for headings, a sans-serif for text, the mono for code.\n- `letter-spacing = 0px`: no tracking, including on uppercase labels.\n- `uppercase-text <= 25%`: capitals are for buttons, tabs, bar links and small captions.\n- `gradient-fills = 0%`: every fill is one flat colour; depth comes from shadow.\n- `text-shadow = none`: no text has a shadow.\n- `border-radius <= 2px`: every box, tag and control has a 2px corner; only discs are round.\n- `box-shadow-blur <= 14px`: shadows are layered and tight, never a wide glow.\n- `border-width <= 4px`: hairlines are 1px, indicators and stat rules 3px, the notice stripe 4px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. A new block of the home page is a new `.ds-section` band with a `.ds-intro` and a `.ds-container`; choose its fill so neighbouring bands differ, and put only white cards on a grey band. A new entry point is a `.ds-grid__cell` on one flat `--color-fill-*` with the text colour paired with it above. Secondary navigation of an inner page goes in the right rail as another `.ds-sidebar` group or `.ds-panel`; never move the rail to the left or add one to the home page. Use tokens only and take heights and gaps from the `--size-*` and `--space-*` scale.\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: 1200px;\n  --size-measure: 600px;\n  --size-sidebar: 280px;\n  --size-bar: 64px;\n  --size-art: 360px;\n  --size-tile: 168px;\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-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: 40px;\n  --space-6: 56px;\n  --space-7: 72px;\n  --space-8: 104px;\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__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/* avatar: a person as a disc with an initial */\n.ds-avatar {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex: none;\n  width: var(--size-control);\n  height: var(--size-control);\n  border-radius: 50%;\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n}\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--left > .ds-tooltip__text {\n  top: 50%;\n  right: calc(100% + var(--space-2));\n  left: auto;\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--ring {\n  width: var(--size-ring);\n  height: var(--size-ring);\n  border: var(--border-width-strong) var(--border-style) color-mix(in srgb, var(--color-button) 30%, transparent);\n  border-top-color: var(--color-button);\n  border-right-color: var(--color-button);\n  border-radius: 50%;\n  background: transparent;\n}\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-2) 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--fab { box-shadow: var(--shadow-control-hover); }\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.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-2);\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.ds-form { grid-template-columns: 1fr 1fr; column-gap: var(--space-5); }\n.ds-form__field--full,\n.ds-form__check,\n.ds-form__actions { grid-column: 1 / -1; }\n\n/* nav */\n.ds-nav {\n  position: relative;\n  display: flex;\n  align-items: stretch;\n  height: var(--size-bar);\n  padding: 0 var(--space-5);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n}\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\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-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  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  padding: 0 var(--space-3);\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: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover { color: var(--color-text); }\n.ds-nav__link.is-current {\n  color: var(--color-text);\n  border-bottom-color: var(--color-link);\n}\n\n/* layout */\n.ds-container {\n  max-width: calc(var(--size-content) + var(--space-5) + var(--space-5));\n  margin: 0 auto;\n  padding: 0 var(--space-5);\n}\n.ds-section { padding: var(--space-7) 0; }\n.ds-section--tight { padding-top: 0; }\n.ds-section--inner { padding: var(--space-5) 0 var(--space-8); }\n.ds-section--inverse {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-intro {\n  max-width: var(--size-measure);\n  margin: 0 auto var(--space-6);\n  text-align: center;\n}\n.ds-intro--start {\n  margin-left: 0;\n  margin-bottom: 0;\n  text-align: left;\n}\n.ds-intro__title {\n  margin: 0 0 var(--space-3);\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-intro__text {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-base);\n}\n.ds-intro__actions { margin-top: var(--space-4); }\n.ds-section--inverse .ds-intro__title { color: var(--color-inverse-text); }\n.ds-section--inverse .ds-intro__text {\n  color: color-mix(in srgb, var(--color-inverse-text) 87%, transparent);\n  font-size: var(--text-large);\n  line-height: 1.6;\n}\n.ds-columns {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: var(--space-4);\n  align-items: start;\n}\n.ds-columns--split {\n  grid-template-columns: 7fr 5fr;\n  gap: var(--space-7);\n}\n.ds-columns--even { align-items: stretch; }\n.ds-columns--even > .ds-stack { grid-auto-rows: 1fr; }\n.ds-columns--even > .ds-stack > .ds-panel {\n  display: flex;\n  flex-direction: column;\n}\n.ds-columns--even > .ds-stack > .ds-panel > .ds-panel__body { flex: 1 1 auto; }\n.ds-stack {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n}\n.ds-label {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  text-transform: var(--heading-transform);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-sidebar);\n  gap: var(--space-5);\n  align-items: start;\n  padding-top: var(--space-5);\n  padding-bottom: var(--space-8);\n}\n.ds-center {\n  display: flex;\n  justify-content: center;\n  padding-top: var(--space-5);\n}\n\n/* hero */\n.ds-hero {\n  position: relative;\n  padding: var(--space-7) 0 var(--space-8);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-shadow: var(--shadow-text);\n}\n.ds-hero__inner {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-art);\n  gap: var(--space-7);\n  align-items: 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.ds-hero__art {\n  position: relative;\n  height: calc(var(--size-art) * 0.66);\n}\n.ds-hero__shape {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 62%;\n  height: 86%;\n  background: color-mix(in srgb, var(--color-bar-text) 14%, transparent);\n}\n.ds-hero__shape--2 {\n  left: 30%;\n  top: 34%;\n  width: 70%;\n  height: 66%;\n  background: color-mix(in srgb, var(--color-bar-text) 22%, transparent);\n}\n.ds-hero__shape--3 {\n  left: 18%;\n  top: 56%;\n  width: 22%;\n  height: 44%;\n  background: color-mix(in srgb, var(--color-bar-text) 40%, transparent);\n}\n.ds-hero__shape--disc {\n  left: 76%;\n  top: 14%;\n  width: 20%;\n  height: auto;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: var(--fill-accent);\n}\n.ds-hero__fab {\n  position: absolute;\n  right: var(--space-7);\n  bottom: calc(var(--size-fab) / -2);\n}\n\n/* page header */\n.ds-page-header {\n  padding: var(--space-3) 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-shadow: var(--shadow-text);\n}\n.ds-page-header__row {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-4);\n  margin-top: var(--space-2);\n}\n.ds-page-header__body { flex: 1 1 0; min-width: 0; }\n.ds-page-header__title {\n  margin: 0;\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-1) 0 0;\n  color: color-mix(in srgb, var(--color-bar-text) 87%, transparent);\n  font-size: var(--text-base);\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  gap: var(--space-2);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 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 {\n  content: \"\";\n  width: calc(var(--space-1) + var(--border-width-strong));\n  height: calc(var(--space-1) + var(--border-width-strong));\n  border-top: var(--border-width) var(--border-style) currentColor;\n  border-right: var(--border-width) var(--border-style) currentColor;\n  transform: rotate(45deg);\n}\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.ds-page-header .ds-breadcrumb { color: color-mix(in srgb, var(--color-bar-text) 70%, transparent); }\n.ds-page-header .ds-breadcrumb__link:hover,\n.ds-page-header .ds-breadcrumb__item.is-current { color: var(--color-bar-text); }\n\n/* tabs */\n.ds-tabs {\n  position: relative;\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  font-family: var(--font-ui);\n}\n.ds-tabs__list {\n  display: flex;\n  margin: 0 auto;\n  padding: 0 var(--space-3);\n  max-width: calc(var(--size-content) + var(--space-5) + var(--space-5));\n  list-style: none;\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\n/* grid */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  grid-auto-rows: var(--size-tile);\n  gap: var(--space-2);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n  padding: var(--space-4);\n  border-radius: var(--radius-page);\n  background: var(--color-fill-1);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-bar-text);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-grid__cell:hover,\n.ds-grid__cell.is-hover { box-shadow: var(--shadow-control-hover); }\n.ds-grid__cell--2 { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-grid__cell--3 { background: var(--color-fill-3); }\n.ds-grid__cell--4 { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-grid__cell--feature { grid-column: span 2; grid-row: span 2; }\n.ds-grid__cell--wide { grid-column: span 2; }\n.ds-grid__title {\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n  text-transform: var(--heading-transform);\n}\n.ds-grid__cell--feature .ds-grid__title {\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: 1.18;\n}\n.ds-grid__text {\n  max-width: 44ch;\n  margin: 0;\n  opacity: 0.87;\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-grid__more {\n  margin-top: auto;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-list__item {\n  display: flex;\n  align-items: baseline;\n  gap: var(--space-3);\n  padding: var(--space-3) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-list__body { flex: 1 1 0; min-width: 0; }\n.ds-list__title {\n  display: block;\n  color: var(--color-link);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\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);\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/* panel */\n.ds-panel {\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-text);\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__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--pad .ds-panel__body { color: var(--color-text); padding-top: var(--space-4); }\n.ds-panel--pad .ds-panel__body + .ds-panel__body { padding-top: 0; }\n\n/* stats */\n.ds-stats {\n  display: flex;\n  gap: var(--space-4);\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-top: var(--space-2);\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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/* table */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\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-3);\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  height: var(--size-row-dense);\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-table th:first-child { border-top-left-radius: var(--radius-panel); }\n.ds-table th:last-child { border-top-right-radius: var(--radius-panel); }\n.ds-table tbody tr:last-child td { border-bottom: 0; }\n.ds-table tbody tr:hover,\n.ds-table tbody tr.is-hover,\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/* sidebar */\n.ds-sidebar {\n  padding: var(--space-2) 0;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  font-family: var(--font-ui);\n}\n.ds-sidebar__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-4) var(--space-2);\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-sidebar__list {\n  margin: 0;\n  padding: 0 0 var(--space-2);\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-sidebar__list:last-child { border-bottom: 0; padding-bottom: 0; }\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  height: var(--size-row-dense);\n  padding: 0 var(--space-4);\n  color: color-mix(in srgb, var(--color-link-quiet) 66%, transparent);\n  font-size: var(--text-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover { background: var(--color-surface-strong); }\n.ds-sidebar__link.is-current {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  background: var(--color-surface-alt);\n}\n\n/* overlay */\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\n/* footer */\n.ds-footer {\n  padding: var(--space-6) 0 var(--space-4);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-small);\n}\n.ds-footer__cols {\n  display: grid;\n  grid-template-columns: 2fr 1fr 1fr 1fr;\n  gap: var(--space-5);\n}\n.ds-footer__brand {\n  display: block;\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-footer__text {\n  max-width: 40ch;\n  margin: 0;\n  color: color-mix(in srgb, var(--color-inverse-text) 70%, transparent);\n}\n.ds-footer__title {\n  margin: 0 0 var(--space-2);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-footer__list { margin: 0; padding: 0; list-style: none; }\n.ds-footer__link {\n  display: block;\n  color: color-mix(in srgb, var(--color-inverse-text) 70%, transparent);\n  line-height: 1.85;\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: var(--space-6) 0 0;\n  padding-top: var(--space-3);\n  border-top: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-inverse-text) 40%, transparent);\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=\"#develop\"],\n.ds-page:has(#develop:target) .ds-nav__link[href=\"#develop\"],\n.ds-page:has(#guide:target) .ds-nav__link[href=\"#guide\"],\n.ds-page:has(#reference:target) .ds-nav__link[href=\"#reference\"],\n.ds-page:has(#driver:target) .ds-nav__link[href=\"#reference\"],\n.ds-page:has(#console:target) .ds-nav__link[href=\"#console\"] {\n  color: var(--color-text);\n  border-bottom-color: var(--color-link);\n}\n\n@media (max-width: 900px) {\n  .ds-hero__inner,\n  .ds-columns,\n  .ds-columns--split,\n  .ds-columns--cards,\n  .ds-layout,\n  .ds-form { grid-template-columns: minmax(0, 1fr); }\n  .ds-columns--split { gap: var(--space-5); }\n  .ds-footer__cols { grid-template-columns: 1fr 1fr; }\n  .ds-hero__art { display: none; }\n  .ds-grid { grid-template-columns: 1fr 1fr; grid-auto-rows: auto; }\n  .ds-nav__links,\n  .ds-tabs__list { overflow: auto; }\n  .ds-page-header__row { flex-direction: column; align-items: flex-start; }\n}\n@media (max-width: 600px) {\n  .ds-nav {\n    flex-wrap: wrap;\n    height: auto;\n    padding: 0 var(--space-2);\n  }\n  .ds-brand {\n    width: 100%;\n    height: var(--size-bar);\n    padding: 0 var(--space-2);\n  }\n  .ds-nav__links { margin: 0; height: var(--size-row); }\n  .ds-nav__link { padding: 0 var(--space-2); }\n  .ds-container { padding: 0 var(--space-3); }\n  .ds-hero { padding: var(--space-5) 0 var(--space-6); }\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-hero__fab { right: var(--space-3); }\n  .ds-section { padding: var(--space-5) 0; }\n  .ds-section--inner { padding: var(--space-4) 0 var(--space-6); }\n  .ds-intro { margin-bottom: var(--space-4); }\n  .ds-grid { grid-template-columns: minmax(0, 1fr); }\n  .ds-grid__cell { min-height: calc(var(--size-tile) * 0.75); }\n  .ds-grid__cell--feature,\n  .ds-grid__cell--wide { grid-column: auto; grid-row: auto; }\n  .ds-grid__cell--feature .ds-grid__title { font-size: var(--text-h2); }\n  .ds-grid__more { padding-top: var(--space-3); }\n  .ds-layout { padding-top: var(--space-4); padding-bottom: var(--space-6); }\n  .ds-tabs__list { padding: 0; }\n  .ds-tabs__tab { padding: 0 var(--space-3); white-space: nowrap; }\n  .ds-stats { flex-wrap: wrap; gap: var(--space-3); }\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-links { gap: var(--space-2) var(--space-4); }\n  .ds-form__actions { justify-content: flex-start; }\n  .ds-overlay { padding: var(--space-4) var(--space-3); }\n  .ds-footer { padding-top: var(--space-5); }\n  .ds-footer__cols { gap: var(--space-4) var(--space-3); }\n  .ds-footer__legal { margin-top: var(--space-4); }\n}\n\n/* the account menu keeps the bar's top right corner on a phone */\n@media (max-width: 600px) {\n  .ds-nav { position: relative; }\n  .ds-nav > .ds-menu--account {\n    position: absolute;\n    top: calc((var(--size-bar) - var(--size-row-dense)) / 2);\n    right: var(--space-3);\n  }\n  .ds-menu__label { display: none; }\n}\n\n.ds-menu--account { margin-left: var(--space-2); }\n\n/* phones: the links are tabs that share 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 auto;\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 developers</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  <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=\"#develop\">Develop</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#guide\">Guides</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#reference\">Reference</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#console\">Console</a></li>\n  </ul>\n  <details class=\"ds-menu ds-menu--account\" data-component=\"menu\">\n    <summary class=\"ds-menu__button\" aria-label=\"Account\"><span class=\"ds-avatar\" data-component=\"avatar\">M</span></summary>\n    <ul class=\"ds-menu__list\">\n      <li><a class=\"ds-menu__link\" href=\"#console\">Your stations</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#driver\">Configure gauge.radar</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#guide\">Guides</a></li>\n    </ul>\n  </details>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"develop\">\n\n  <div class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-container ds-hero__inner\">\n      <div>\n        <h1 class=\"ds-hero__title\">Build for every tide gauge</h1>\n        <p class=\"ds-hero__lead\">One kit for reading sensors, storing levels and drawing charts on a phone, a wall display or a watch.</p>\n        <a class=\"ds-button ds-button--secondary\" href=\"#guide\">Read the quick start</a>\n      </div>\n      <div class=\"ds-hero__art\" aria-hidden=\"true\">\n        <span class=\"ds-hero__shape\"></span>\n        <span class=\"ds-hero__shape ds-hero__shape--2\"></span>\n        <span class=\"ds-hero__shape ds-hero__shape--3\"></span>\n        <span class=\"ds-hero__shape ds-hero__shape--disc\"></span>\n      </div>\n    </div>\n    <a class=\"ds-button ds-button--fab ds-hero__fab ds-tooltip ds-tooltip--left\" href=\"#console\" aria-label=\"Register a station\"><span class=\"ds-tooltip__text\" role=\"tooltip\">Register a station</span>\n      <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" fill=\"none\"/></svg>\n    </a>\n  </div>\n\n  <div class=\"ds-section\">\n    <div class=\"ds-container\">\n      <div class=\"ds-intro\">\n        <h2 class=\"ds-intro__title\">Start with a guide</h2>\n        <p class=\"ds-intro__text\">Four short paths through the kit. Each ends with something running on a real device.</p>\n      </div>\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <a class=\"ds-grid__cell ds-grid__cell--feature\" href=\"#guide\">\n          <h3 class=\"ds-grid__title\">Your first station</h3>\n          <p class=\"ds-grid__text\">Connect a gauge, read a level every minute and see it on a chart. About twenty minutes from an empty folder.</p>\n          <span class=\"ds-grid__more\">Begin the guide</span>\n        </a>\n        <a class=\"ds-grid__cell ds-grid__cell--2\" href=\"#reference\">\n          <h3 class=\"ds-grid__title\">Sensors</h3>\n          <p class=\"ds-grid__text\">Pressure, radar and float gauges behind one interface.</p>\n          <span class=\"ds-grid__more\">Open</span>\n        </a>\n        <a class=\"ds-grid__cell ds-grid__cell--3\" href=\"#guide\">\n          <h3 class=\"ds-grid__title\">Storage</h3>\n          <p class=\"ds-grid__text\">Keep a year of readings on the device.</p>\n          <span class=\"ds-grid__more\">Open</span>\n        </a>\n        <a class=\"ds-grid__cell ds-grid__cell--4 ds-grid__cell--wide\" href=\"#guide\">\n          <h3 class=\"ds-grid__title\">Charts on small screens</h3>\n          <p class=\"ds-grid__text\">Draw a tide curve that stays readable on a watch face and on a harbour wall display.</p>\n          <span class=\"ds-grid__more\">Open</span>\n        </a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-section ds-section--tight\">\n    <div class=\"ds-container ds-columns ds-columns--split ds-columns--even\">\n      <div>\n        <h2 class=\"ds-label\">Latest changes</h2>\n        <ul class=\"ds-list\" data-component=\"list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#reference\">Radar gauges supported</a>\n              <span class=\"ds-list__text\">Two new drivers and a calibration guide.</span>\n            </span>\n            <span class=\"ds-list__meta\">18 Sep</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#guide\">Smaller store module</a>\n              <span class=\"ds-list__text\">A year of readings now fits in half the space.</span>\n            </span>\n            <span class=\"ds-list__meta\">30 Aug</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#guide\">Watch charts</a>\n              <span class=\"ds-list__text\">A round layout for the tide curve.</span>\n            </span>\n            <span class=\"ds-list__meta\">11 Aug</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#console\">Console export</a>\n              <span class=\"ds-list__text\">Download any station as a plain table.</span>\n            </span>\n            <span class=\"ds-list__meta\">2 Jul</span>\n          </li>\n        </ul>\n        <div class=\"ds-center\">\n          <ul class=\"ds-pagination\" data-component=\"pagination\">\n            <li><a class=\"ds-pagination__link is-disabled\" href=\"#develop\" 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=\"#develop\">1</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#develop\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#develop\">3</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#develop\" 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      <div class=\"ds-stack\">\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <h3 class=\"ds-panel__title\">Harbour sample</h3>\n          <div class=\"ds-panel__body\">\n            <p>A complete station app with two gauges, a week chart and an alarm screen.</p>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#guide\">Read the guide</a>\n            <a class=\"ds-button ds-button--flat\" href=\"#reference\">Drivers</a>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Release 3.1</h3>\n          <div class=\"ds-panel__body\">\n            <p>Radar drivers, a smaller store and round charts. Wall displays need release 3.0 or later of the draw module.</p>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#reference\">See what changed</a>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-section ds-section--inverse\">\n    <div class=\"ds-container\">\n      <div class=\"ds-intro ds-intro--start\">\n        <h2 class=\"ds-intro__title\">A console for every station</h2>\n        <p class=\"ds-intro__text\">Watch levels arrive, compare gauges and export a season of data.</p>\n        <div class=\"ds-intro__actions\"><a class=\"ds-button\" href=\"#console\">Open the console</a></div>\n      </div>\n    </div>\n  </div>\n\n</section>\n\n<section class=\"ds-view\" id=\"guide\">\n\n  <header class=\"ds-page-header\">\n    <div class=\"ds-container\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#develop\">Develop</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#guide\">Guides</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Kit overview</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Kit overview</h1>\n          <p class=\"ds-page-header__text\">What each module does and how they fit together, before you write any code.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#reference\">Open the reference</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-section ds-section--inner\">\n    <div class=\"ds-container ds-columns ds-columns--split\">\n      <article class=\"ds-prose\" data-component=\"typography\">\n        <h1>How the kit is organised</h1>\n        <p class=\"ds-prose__lead\">Three modules, each usable alone: one reads, one stores, one draws.</p>\n        <h2>Reading levels</h2>\n        <p>A reader wraps one gauge and reports a level in millimetres. Set the interval with <code>reader.every</code> and the kit handles sleep and wake-up. The <a href=\"#reference\">gauge table</a> lists supported hardware.</p>\n        <ul>\n          <li>Readings carry a time and a quality flag.</li>\n          <li>A missed reading is recorded, never guessed.</li>\n          <li>Two readers can share one clock.</li>\n        </ul>\n        <h3>Install</h3>\n        <p>Add the modules you need and build.</p>\n        <pre><code>chronoskin add reader store\nchronoskin build --target wall</code></pre>\n      </article>\n      <div class=\"ds-stack\">\n        <div class=\"ds-notices\" data-component=\"notice\">\n          <div class=\"ds-notice\">\n            <strong class=\"ds-notice__title\">Before you deploy</strong>\n            Wall displays need release 3.0 or later of the draw module.\n          </div>\n          <div class=\"ds-notice ds-notice--error\">\n            <strong class=\"ds-notice__title\">Build stopped</strong>\n            No gauge is configured for the target. Add a reader and build again.\n          </div>\n        </div>\n        <div class=\"ds-panel ds-panel--pad\">\n          <h3 class=\"ds-panel__title\">Read next</h3>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-links\" data-component=\"links\">\n              <a class=\"ds-link\" href=\"#reference\">Gauge drivers</a>\n              <a class=\"ds-link is-visited\" href=\"#develop\">Developer home</a>\n              <a class=\"ds-link is-hover\" href=\"#driver\">Configure a radar gauge</a>\n              <a class=\"ds-link is-active\" href=\"#console\">Console</a>\n              <a class=\"ds-link ds-link--quiet\" href=\"#develop\">Latest changes</a>\n            </div>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Try it on a station</h3>\n          <div class=\"ds-panel__body\">\n            <p>Register a station in the console and the build picks up its gauges.</p>\n            <p>A build is running now.</p>\n            <span class=\"ds-progress ds-progress--ring\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Build running\"></span>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#console\">Open the console</a>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</section>\n\n<section class=\"ds-view\" id=\"reference\">\n\n  <header class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-container\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#reference\">Reference</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#reference\">Reader module</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Gauge drivers</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Gauge drivers</h1>\n          <p class=\"ds-page-header__text\">Every sensor the reader module can talk to, with its range and sampling limits.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#driver\">Add driver</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <nav class=\"ds-tabs\" data-component=\"tabs\">\n    <ul class=\"ds-tabs__list\">\n      <li><a class=\"ds-tabs__tab is-current\" href=\"#reference\">Drivers</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#reference\">Calibration</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#reference\">Wiring</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#reference\">History</a></li>\n    </ul>\n  </nav>\n\n  <div class=\"ds-container ds-layout\">\n    <div class=\"ds-stack\">\n\n      <ul class=\"ds-stats\" data-component=\"stats\">\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">14</span><span class=\"ds-stat__label\">Drivers</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">3</span><span class=\"ds-stat__label\">Gauge types</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">0.5 s</span><span class=\"ds-stat__label\">Fastest sample</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">12,000</span><span class=\"ds-stat__label\">Longest range, mm</span></li>\n      </ul>\n\n      <table class=\"ds-table\" data-component=\"table\">\n        <thead>\n          <tr><th>Driver</th><th class=\"ds-table__extra\">Gauge</th><th>Status</th><th class=\"ds-table__num\">Range mm</th><th class=\"ds-table__num ds-table__extra\">Step mm</th><th class=\"ds-table__num\">Sample s</th></tr>\n        </thead>\n        <tbody>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#driver\">gauge.float2</a></td><td class=\"ds-table__extra\">Float and tape</td><td><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">6,000</td><td class=\"ds-table__num ds-table__extra\">1</td><td class=\"ds-table__num\">5</td></tr>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#driver\">gauge.press</a></td><td class=\"ds-table__extra\">Pressure cell</td><td><span class=\"ds-badge ds-badge--success\">Stable</span></td><td class=\"ds-table__num\">10,000</td><td class=\"ds-table__num ds-table__extra\">2</td><td class=\"ds-table__num\">1</td></tr>\n          <tr class=\"is-current\"><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#driver\">gauge.radar</a></td><td class=\"ds-table__extra\">Downward radar</td><td><span class=\"ds-badge ds-badge--warning\">Preview</span></td><td class=\"ds-table__num\">12,000</td><td class=\"ds-table__num ds-table__extra\">1</td><td class=\"ds-table__num\">0.5</td></tr>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#driver\">gauge.sonic</a></td><td class=\"ds-table__extra\">Ultrasonic</td><td><span class=\"ds-badge ds-badge--warning\">Preview</span></td><td class=\"ds-table__num\">4,000</td><td class=\"ds-table__num ds-table__extra\">3</td><td class=\"ds-table__num\">2</td></tr>\n          <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#driver\">gauge.float1</a></td><td class=\"ds-table__extra\">Float, first series</td><td><span class=\"ds-badge ds-badge--danger\">Retired</span></td><td class=\"ds-table__num\">3,000</td><td class=\"ds-table__num ds-table__extra\">5</td><td class=\"ds-table__num\">10</td></tr>\n        </tbody>\n      </table>\n\n      <div class=\"ds-badges\" data-component=\"badge\">\n        <span class=\"ds-badge\">5</span>\n        <span class=\"ds-badge ds-badge--success\">Stable</span>\n        <span class=\"ds-badge ds-badge--warning\">Preview</span>\n        <span class=\"ds-badge ds-badge--danger\">Retired</span>\n        <span class=\"ds-badge ds-badge--new\">New</span>\n        <span class=\"ds-badge ds-badge--chip\">Radar</span>\n        <span class=\"ds-badge ds-badge--chip\">Release 3.1</span>\n      </div>\n\n    </div>\n\n    <div class=\"ds-stack\">\n      <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n        <h2 class=\"ds-sidebar__title\">Reader module</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li><a class=\"ds-sidebar__link\" href=\"#guide\">Overview</a></li>\n          <li><a class=\"ds-sidebar__link is-current\" href=\"#reference\">Gauge drivers</a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#reference\">Intervals</a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#reference\">Quality flags <span class=\"ds-badge ds-badge--new\">2</span></a></li>\n        </ul>\n        <h2 class=\"ds-sidebar__title\">Related</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li><a class=\"ds-sidebar__link\" href=\"#guide\">Store module</a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#guide\">Draw module</a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#console\">Console</a></li>\n        </ul>\n      </aside>\n    </div>\n  </div>\n\n</section>\n\n<section class=\"ds-view\" id=\"driver\">\n\n  <header class=\"ds-page-header\">\n    <div class=\"ds-container\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#reference\">Reference</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#reference\">Gauge drivers</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">gauge.radar</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Configure gauge.radar</h1>\n          <p class=\"ds-page-header__text\">Downward radar, in preview. Set where it is mounted and how often it samples.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#reference\">All drivers</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-container ds-layout\">\n    <div class=\"ds-stack\">\n      <div class=\"ds-panel ds-panel--pad\">\n        <h3 class=\"ds-panel__title\">Mounting and sampling</h3>\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\">Station</span>\n              <input class=\"ds-form__control\" type=\"text\" value=\"North quay\">\n            </label>\n            <label class=\"ds-form__field is-invalid\">\n              <span class=\"ds-form__label\">Mount height, mm</span>\n              <input class=\"ds-form__control\" type=\"text\" value=\"14000\">\n              <span class=\"ds-form__error\">The radar driver reaches 12,000 at most.</span>\n            </label>\n            <label class=\"ds-form__field ds-form__field--full\">\n              <span class=\"ds-form__label\">Sampling</span>\n              <span class=\"ds-form__select\">\n                <select class=\"ds-form__control\">\n                  <option>Every minute</option>\n                  <option>Every ten seconds</option>\n                  <option>Every second</option>\n                </select>\n              </span>\n            </label>\n            <label class=\"ds-form__field ds-form__field--full\">\n              <span class=\"ds-form__label\">Notes</span>\n              <textarea class=\"ds-form__control ds-form__control--area\">Mounted under the footbridge, facing the channel.</textarea>\n              <span class=\"ds-form__hint\">Shown to everyone with access to the station.</span>\n            </label>\n            <label class=\"ds-form__check\">\n              <input class=\"ds-form__checkbox\" type=\"checkbox\" checked>\n              <span>Raise an alarm when readings stop</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>Keep sampling while the display sleeps</span></label>\n            <div class=\"ds-form__actions ds-buttons\" data-component=\"buttons\">\n              <button class=\"ds-button ds-button--danger\" type=\"button\">Reset</button>\n              <button class=\"ds-button ds-button--secondary\" type=\"button\">Simulate</button>\n              <button class=\"ds-button is-disabled\" type=\"button\" disabled>Deploy</button>\n              <a class=\"ds-button ds-button--flat\" href=\"#reference\">Cancel</a>\n              <a class=\"ds-button\" href=\"#reference\">Save</a>\n            </div>\n          </form>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"ds-stack\">\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\">Reset this gauge?</h3>\n          <div class=\"ds-dialog__body\">\n            <p>Calibration returns to factory values. Stored readings are kept.</p>\n          </div>\n          <div class=\"ds-dialog__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#driver\">Cancel</a>\n            <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#reference\">Reset</a>\n          </div>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">Retire this driver</h3>\n        <div class=\"ds-panel__body\">\n          <p>Stations that use it keep running but receive no further updates.</p>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#reference\">Retire</a>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</section>\n\n<section class=\"ds-view\" id=\"console\">\n\n  <header class=\"ds-page-header\">\n    <div class=\"ds-container\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#develop\">Develop</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#console\">Console</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Stations</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Stations</h1>\n          <p class=\"ds-page-header__text\">Watch levels arrive, compare gauges and export a season of data.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#driver\">Register a station</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <nav class=\"ds-tabs\">\n    <ul class=\"ds-tabs__list\">\n      <li><a class=\"ds-tabs__tab is-current\" href=\"#console\">Stations</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#console\">Alarms</a></li>\n      <li><a class=\"ds-tabs__tab\" href=\"#console\">Exports</a></li>\n    </ul>\n  </nav>\n\n  <div class=\"ds-container ds-layout\">\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=\"M4 18h16M6 14c2-3 4-3 6 0s4 3 6 0\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        </span>\n        <h3 class=\"ds-empty__title\">No stations yet</h3>\n        <p class=\"ds-empty__text\">Stations you register show up here.</p>\n        <a class=\"ds-button ds-button--flat\" href=\"#driver\">Register a station</a>\n      </div>\n    </div>\n\n    <div class=\"ds-stack\">\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">Before you register</h3>\n        <div class=\"ds-panel__body\">\n          <p>Pick a driver for each gauge on the station. Preview drivers work in the console but raise no alarms.</p>\n          <div class=\"ds-accordion\" data-component=\"accordion\">\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">Which drivers are stable?</summary>\n              <p class=\"ds-accordion__body\">The float and pressure drivers. Radar and sonic are in preview.</p>\n            </details>\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">What does preview mean?</summary>\n              <p class=\"ds-accordion__body\">The driver works in the console but raises no alarms.</p>\n            </details>\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">Can I change a driver later?</summary>\n              <p class=\"ds-accordion__body\">Yes. Stored readings are kept when you do.</p>\n            </details>\n          </div>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#reference\">Choose a driver</a>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">New to the kit?</h3>\n        <div class=\"ds-panel__body\">\n          <p>The overview explains readers, stores and charts in five minutes.</p>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#guide\">Read the overview</a>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-container\">\n    <div class=\"ds-footer__cols\">\n      <div>\n        <span class=\"ds-footer__brand\">chronoskin</span>\n        <p class=\"ds-footer__text\">A sample developer site. Code under an open licence, text free to reuse.</p>\n      </div>\n      <div>\n        <h2 class=\"ds-footer__title\">Develop</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#develop\">Home</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#guide\">Kit overview</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#develop\">Latest changes</a></li>\n        </ul>\n      </div>\n      <div>\n        <h2 class=\"ds-footer__title\">Reference</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#reference\">Gauge drivers</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#driver\">gauge.radar</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#reference\">Reader module</a></li>\n        </ul>\n      </div>\n      <div>\n        <h2 class=\"ds-footer__title\">Console</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#console\">Stations</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#console\">Alarms</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#console\">Exports</a></li>\n        </ul>\n      </div>\n    </div>\n    <p class=\"ds-footer__legal\">chronoskin developers, sample content.</p>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.material-design.docs.s03.p03.t05.u03\",\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-3353\",\n  \"short\": \"v1-md-3353\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #f3f3f3;\n  --color-canvas: #f3f3f3;\n  --color-surface: #ffffff;\n  --color-surface-alt: #fafafa;\n  --color-surface-strong: #e3e3e3;\n  --color-bar: #80cbc4;\n  --color-bar-text: #212121;\n  --color-bar-alt: #455a64;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #455a64;\n  --color-inverse-text: #ffffff;\n  --color-text: #212121;\n  --color-text-muted: #757575;\n  --color-heading: #212121;\n  --color-heading-alt: #444444;\n  --color-link: #46873b;\n  --color-link-quiet: #212121;\n  --color-link-visited: #46873b;\n  --color-link-hover: #46873b;\n  --color-link-active: #455a64;\n  --color-border: #dcdcdc;\n  --color-border-strong: #757575;\n  --color-border-muted: #ebebec;\n  --color-accent: #64ffda;\n  --color-accent-text: #212121;\n  --color-accent-alt: #455a64;\n  --color-fill-1: #80cbc4;\n  --color-fill-2: #64ffda;\n  --color-fill-3: #6ab344;\n  --color-fill-4: #455a64;\n  --color-button: #46873b;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #212121;\n  --color-input: #ffffff;\n  --color-input-text: #212121;\n  --color-input-border: #757575;\n  --color-disabled: #e3e3e3;\n  --color-disabled-text: #767777;\n  --color-danger: #c2185b;\n  --color-danger-surface: #ffffff;\n  --color-success: #46873b;\n  --color-warning: #ffc400;\n  --color-notice: #e3e3e3;\n  --color-notice-text: #212121;\n  --color-focus: #46873b;\n  --color-shadow: #000000;\n  --color-overlay: rgb(0 0 0 / 0.4);\n}\n\n/* @part type */\n:root {\n  --font-body: Roboto, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-heading: \"Roboto Slab\", Rockwell, Georgia, \"Times New Roman\", serif;\n  --font-ui: Roboto, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  --font-mono: \"Roboto Mono\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --text-base: 14px;\n  --text-small: 12px;\n  --text-ui: 13px;\n  --text-large: 20px;\n  --text-display: 40px;\n  --text-h1: 30px;\n  --text-h2: 24px;\n  --text-h3: 16px;\n  --line-body: 1.43;\n  --line-heading: 1.25;\n  --line-display: 1.15;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 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: 3px;\n  --border-style: solid;\n  --radius-control: 2px;\n  --radius-panel: 2px;\n  --radius-pill: 2px;\n  --radius-page: 2px;\n  --shadow-panel: 0 2px 4px -1px color-mix(in srgb, var(--color-shadow) 20%, transparent), 0 4px 5px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 1px 10px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-control: 0 3px 5px -1px color-mix(in srgb, var(--color-shadow) 20%, transparent), 0 6px 10px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 1px 14px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-control-hover: 0 5px 5px -3px color-mix(in srgb, var(--color-shadow) 20%, transparent), 0 8px 10px 1px color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 3px 14px 2px color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-control-pressed: 0 2px 4px -1px color-mix(in srgb, var(--color-shadow) 20%, transparent), 0 4px 5px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent);\n  --shadow-dialog: 0 7px 8px -4px color-mix(in srgb, var(--color-shadow) 22%, transparent), 0 12px 14px 2px color-mix(in srgb, var(--color-shadow) 16%, 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) 88%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: transparent;\n  --focus-ring: 3px solid var(--color-focus);\n  --transition: box-shadow 0.15s cubic-bezier(0, 0, 0.2, 1), background-color 0.15s cubic-bezier(0, 0, 0.2, 1), color 0.15s cubic-bezier(0, 0, 0.2, 1);\n  --backdrop-blur: 0px;\n}\n"
  }
}
