{
  "id": "v1-md-536b",
  "long_id": "v1.material-design.app.s05.p03.t06.u11",
  "name": "Material card feed, 2015",
  "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": "app",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "A signed-in feed application in the paper-and-ink manner: one coloured app bar carries the brand, a search field and the views, a row of tabs continues it on the home screen, and the page under it is a pale desk of white cards. The home screen is a featured card with a floating action button on the seam of its picture, then a staggered grid of cards whose pictures are flat colour blocks with two drawn shapes; a detail screen opens with a tall coloured header that the first sheet overlaps. Social, travel, recipe and news applications built on the 2014 guidelines looked like this on the web from about 2015 to 2018.",
  "url": "https://chrono.skin/s/v1-md-536b",
  "preview_url": "https://chrono.skin/s/v1-md-536b/specimen.html",
  "files": {
    "STYLE.md": "# Material card feed, 2015\n\n## Summary\n\nA signed-in feed application in the paper-and-ink manner: one coloured app bar carries the brand, a search field and the views, a row of tabs continues it on the home screen, and the page under it is a pale desk of white cards. The home screen is a featured card with a floating action button on the seam of its picture, then a staggered grid of cards whose pictures are flat colour blocks with two drawn shapes; a detail screen opens with a tall coloured header that the first sheet overlaps. Social, travel, recipe and news applications built on the 2014 guidelines looked like this on the web from about 2015 to 2018.\n\n## Layout\n\n- The page is fluid: `--size-page` is `100%`; the app bar, the tab strip, the page header and the footer span the window. Designed at 1440px. Content is centred and capped at `--size-content` (1240px) with `--space-4` at the sides; running text is capped at `--size-measure` (640px).\n- Order on the home screen: `.ds-nav` (one row, `--size-bar` 64px: brand at the left, `.ds-nav__search` and the view links at the right), `.ds-appbar` (the same fill, no seam, holding `.ds-tabs--bar` and carrying the bar's shadow), then `.ds-main`: the `.ds-hero` featured card, a `.ds-toolbar` (section title, filter chips, one filter field), the `.ds-grid` and a centred `.ds-pagination`. Then `.ds-footer`. There is no drawer and no side column on the home screen.\n- `.ds-grid` is four columns (`.ds-grid__col`), `--space-3` (16px) apart, each a stack of cards `--space-3` apart. Cards differ in height because their pictures do (`.ds-grid__media`, `--tall`, `--short`, or no picture at all), which staggers the rows; the last card of every column stretches so all columns end on one line.\n- Everything is on an 8px grid. `--space-1` 4px (helper text, pagination gap, stat label to value), `--space-2` 8px (card action padding, between flat buttons, chip gaps), `--space-3` 16px (gap between cards of the grid, card text padding, button side padding), `--space-4` 24px (gap between sheets of an inner page, sheet side padding, bar side padding, top of the page), `--space-5` 32px (above the toolbar, padding of a text sheet and of the featured card), `--space-6` 48px (bottom of the page, side padding of the featured card text), `--space-7` 64px and `--space-8` 80px (spare steps).\n- Heights: bar and card head `--size-bar` 64px; tabs, table rows and side links `--size-row` 48px; avatars `--size-row-dense` 40px; buttons, fields and bar links `--size-control` 36px; floating button `--size-fab` 56px. Other sizes: `--size-brand` 32px, `--size-media` 160px (picture of a grid card; 240px tall, 96px short), `--size-header` 248px (featured picture and the tall page header), `--size-overlap` 56px, `--size-side` 320px (side column of an inner page), `--size-search` 240px, `--size-icon` 24px, `--size-check` 18px, `--size-badge` 22px, `--size-stripe` 4px, `--size-dialog` 440px, `--size-area` 120px.\n- Inner pages (one item, a compose screen, a personal collection) have no `.ds-hero` and no tab strip. Directly under `.ds-nav` comes `.ds-page-header` in the bar's fill: the `.ds-breadcrumb` on its first line and, at its foot, the page title with one line of description at the left and one raised white button at the right. On a detail page it is `--size-header` tall and decorated with two flat shapes; `.ds-page-header--compact` is the short, plain form for forms and lists. `.ds-main--overlap` pulls the content up by `--size-overlap`, so the first sheets lie over the header's lower edge. Below it `.ds-layout` has two columns: the main column and a side column of `--size-side` at the right, both stacks of sheets `--space-4` apart (`.ds-stack`). A detail page puts `.ds-stats`, the text sheet and the table sheet in the main column and the notes list, the `.ds-sidebar` card and small cards at the side. A compose page puts the form sheet with its buttons in a ruled strip at the bottom in the main column, notices and the dialog at the side. A collection page puts a sheet with `.ds-tabs` along its top edge in the main column. `.ds-layout--even` stretches both columns to one height.\n- Views: the specimen is one application with four views. `feed` is the home view: tab strip, featured card with the floating button, filter toolbar, the staggered grid and pagination. `route` is one walk: tall page header, figures, the description with its tags, the table of stages, and at the side the notes, more walks and links. `share` is the compose form with its actions, a saved notice, an error notice and the discard dialog. `saved` is the reader's saved walks, shown empty under its tabs, beside recently opened walks and a help card.\n- Below 900px the search field goes, the featured card stacks picture over text with the floating button on the picture's lower right edge, the grid has two columns, the side column drops under the main one and the page header stacks. Below 600px the bar wraps into a brand row and a full-width `.ds-nav__links` row that is centred when it fits and scrolls sideways when it does not (the current link 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 grid is one column, figures 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- `--font-body` and `--font-ui` are the system sans-serif stack (Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica Neue); `--font-heading` is Roboto (openly licensed), then Noto Sans. `--font-mono` (Source Code Pro, Roboto Mono) is for code only.\n- Light text: `--text-base` 16px at `--weight-body` 300 on a 26px line (`--line-body` 1.6); `--text-ui` 14px (buttons, tabs, bar links, secondary row text, card text); `--text-small` 13px (meta, captions, table heads, field labels, footer); `--text-large` 18px (brand name, headline lead).\n- Small regular headings: `--text-display` 34px light (`--weight-display` 300) for the headline of the home strip only; `--text-h1` 24px (page title, figures), `--text-h2` 20px (sheet titles, list card names), `--text-h3` 16px medium (card titles), `--weight-heading` 400, `--line-heading` 1.3. `--weight-bold` and `--weight-ui` are 500. Nothing is heavier than 500 or lighter than 300.\n- `--ui-transform` is `uppercase` for buttons, tabs, bar links and small captions (`.ds-subhead`, `.ds-sidebar__title`). Headings are sentence case; no tracking. Links in running text are underlined and lose the underline on hover (`--link-decoration`, `--link-decoration-hover`); quiet links, titles and navigation are never underlined.\n- `--color-page` `#eceff1` is the desk; `--color-surface` white is every sheet; `--color-surface-alt` `#f6f6f6` the chosen and hovered list row, the current table row and side link; `--color-surface-strong` `#e0e0e0` chips, hovered table rows, inline code, the track of a progress line and the empty-state disc.\n- `--fill-bar` (deep orange `#fd5632`) with `--color-bar-text` white: the navigation bar; other links on it are the bar text at 70%. `--fill-bar-alt` (dark blue-grey `#263238`) with `--color-bar-alt-text`: the headline strip and the page header strip; secondary text on it is that colour at 87% or 70%. `--fill-inverse` with `--color-inverse-text`: the footer line.\n- `--color-button` deep orange with white text: raised primary button, brand tile, current page, checked checkbox, the progress line and a switch that is on. `--color-button-secondary` white with dark text: the second button, the active chip and the thumb of a switch that is off. `--color-accent` blue `#4285f4` with `--color-accent-text`: the floating button and count badges. `--color-link` blue `#1e88e5`, hover and visited navy `#0d47a1`; `--color-heading-alt` navy for small captions; `--color-accent-alt` navy marks \"new\".\n- `--color-fill-1` to `--color-fill-4` (deep orange, blue, grey, near-black) are the heads of list cards, the top lines of the figure cards and the avatars. 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, `--color-bar-alt-text` on the strip. Links, muted text and headings are used only on the desk and on white sheets.\n- `--color-text` `#212121`, headings black, `--color-text-muted` `#6b6b6b`. `--color-border` `#e0e0e0` divides the parts of a sheet, `--color-border-muted` `#eceff1` the rows of a list, `--color-border-strong` and `--color-input-border` grey `#999da8` are the line under a field and the track of a switch that is off.\n- `--color-notice` (navy) with white `--color-notice-text` is the information notice; the error notice is `--color-danger-surface` with a top line and text in `--color-danger` (`#e8345a`). `--color-success` teal and `--color-warning` orange are flat badge fills.\n- Surface: `--radius-control`, `--radius-panel` and `--radius-page` are 3px; `--radius-pill` 4px, so badges and chips are small rounded rectangles, not pills; discs are 50%. Sheets rest on `--shadow-panel`, one soft shadow (10px blur, 2px drop); raised buttons and the switch thumb on `--shadow-control` (5px blur); the floating button and a hovered card on `--shadow-control-hover`; the active chip is pressed in (`--shadow-control-pressed`, two inset lines); the side sheet, the notes sheet and the dialog float on `--shadow-dialog` (three layers up to 17px blur). All fills are flat; a hovered button lightens by 20% white; `--fill-input` is transparent, so a field is a bottom line only. `--border-width` 1px, `--border-width-strong` 3px for the lines under the current bar link and tab, the top line of figure cards and the focus and error line of a field; `--focus-ring` a 3px line of the focus colour at 50%; `--transition` 0.2s linear. `--backdrop-blur` is `0px` and applies to the bar.\n- One-off values built with `color-mix()`, `calc()` or `opacity` because the vocabulary has no token: 70% and 87% of the bar and strip text for secondary text, 70% of the inverse text in the footer, 50% of the button colour for the track of a switch that is on, a 20% grey wash behind a hovered flat or icon button, a 16% wash of the strip text behind a hovered flat button on the strip, a 12% danger wash, and line heights 1.25, 1.3, 1.4 and 1.43.\n\n- Soft paper: `--shadow-panel` is a wide, faint two-layer shadow (16px blur, 6px drop); `--shadow-control` a small soft pair (6px blur); `--shadow-control-hover` 14px blur; `--shadow-dialog` two layers up to 22px blur.\n- Round corners that grow with the box: `--radius-control` 8px, `--radius-panel` 12px, `--radius-page` 16px; `--radius-pill` is a full pill.\n- Flat fills; a hovered button lightens (15% white) and fields are filled with `--color-surface-alt` above their bottom line, with rounded top corners. `--border-width` 1px dividers, `--border-width-strong` 2px indicators; `--focus-ring` is a 4px halo of the focus colour at 30%; `--transition` 0.3s ease-out.\n\n## Components\n\n- `.ds-page` on `<body>`: the desk, family, 14px/1.43 text.\n- `.ds-nav`: the 64px app bar. `.ds-brand` at its left, then at the right `.ds-nav__search` (a washed field with an icon) and `.ds-nav__links` > `.ds-nav__link`, uppercase links to the views; the current one (`is-current`) has full-strength text on a 16% wash.\n- `.ds-brand`: the application's mark and name, one link. `.ds-brand__mark` is a `--size-brand` tile dressed like the primary raised button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) with a `--border-width` ring of `--color-bar-text` at 70%, which keeps it apart from the bar when button and bar colours are close; `.ds-brand__name` is the name at `--text-large` in the heading font. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-appbar`: the strip that continues the bar on the home screen and holds `.ds-tabs--bar`. `.ds-container` centres content at `--size-content`.\n- `.ds-hero`: the featured card, two halves. `.ds-hero__media` is a `.ds-media` picture; `.ds-hero__body` holds `.ds-hero__overline`, `.ds-hero__title` (40px light), `.ds-hero__lead` and a `.ds-buttons` row with the main action. `.ds-hero__fab` places the floating button on the seam between picture and text. One per home screen.\n- `.ds-media`: a picture drawn in CSS, one flat `--color-fill-*` block with a pale disc and a darker ridge. `--2`, `--3`, `--4` pick the fill and its text colour; `--shore` and `--wood` change the two shapes. Text set on it goes in a child element so it stays above the shapes.\n- `.ds-toolbar`: the row above the grid: `.ds-toolbar__title`, a `.ds-badges` group of filter chips and `.ds-toolbar__field`, a short text field at the right.\n- `.ds-grid`: the staggered grid. Four `.ds-grid__col`, each a stack of `.ds-grid__cell` cards. A card has an optional `.ds-grid__media` picture (with `.ds-media`; `--tall`, `--short`) carrying a caption, an optional `.ds-grid__title` with a `.ds-grid__link`, `.ds-grid__text`, a `.ds-grid__meta` line with a small avatar, and `.ds-grid__actions` (flat buttons at the left, `.ds-grid__count` at the right).\n- `.ds-page-header`: the head of an inner page in the bar's fill. `.ds-page-header__inner` holds the breadcrumb and `.ds-page-header__row`; in the row `.ds-page-header__body` has `.ds-page-header__title` and `.ds-page-header__text`, and `.ds-page-header__actions` one `.ds-button--secondary`. `--compact` is the short form without shapes.\n- `.ds-main`, `.ds-layout`, `.ds-stack`, `.ds-center`: the content column (`--overlap` on inner pages), its two-column grid (`--even` to equalise heights), a stack of sheets and a centred row.\n- `.ds-prose`: long-form text on a `.ds-panel--pad` sheet; styles h1 to h3, paragraphs, lists, `strong`, inline `code`, `pre` and links. `.ds-prose__lead` is the 20px opening paragraph.\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 purple button, 36px tall, uppercase. `--secondary` is raised white, `--flat` has no fill or shadow and link-coloured text (inside cards, dialogs and empty states), `--fab` is the 56px accent disc holding one `.ds-icon`, `--icon` a round 36px icon button, `--danger` a raised button filled with `--color-danger` for a destructive action; `--flat` with `--danger` is its flat form. 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`: stacked fields. `.ds-form__field` wraps a small `.ds-form__label` above a `.ds-form__control` (washed fill over a bottom line; `--area` for a textarea, wrapped in `.ds-form__select` for a select). `is-focus` thickens the line; `is-invalid` on the field plus `.ds-form__error` shows an error; `.ds-form__hint` is help text; `.ds-form__check` with `.ds-form__checkbox` is a checkbox; `.ds-form__actions` right-aligns buttons inside a form.\n- `.ds-table`: 48px rows divided by hairlines with a small grey head; inside a `.ds-panel` it drops its own shadow. `.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`: rows of notes or items inside a `.ds-panel`. `.ds-list__item` holds a `.ds-list__avatar` disc (`--alt`, `--accent`, `--small`), `.ds-list__body` with `.ds-list__title` and `.ds-list__text`, and `.ds-list__meta` at the right.\n- `.ds-panel`: a white sheet. `.ds-panel__title` and `.ds-panel__body` for a small card, `.ds-panel__head` (64px, title left, one flat button right) above a table, `.ds-panel__actions` (`--end`) a ruled strip of buttons, `.ds-panel__label` a small caption inside a body; `--pad` gives a text or form sheet 32px padding.\n- `.ds-stat`: one figure. Four sit in a `.ds-stats` row, a single white sheet divided by vertical hairlines. `.ds-stat__label` is the small uppercase caption, shown above `.ds-stat__value`, the number in the heading font at 30px.\n- `.ds-tabs`: a hairline-ruled row of uppercase `.ds-tabs__tab` along the top of a sheet; `is-current` has a 2px line in `--color-link`. `--bar` is the form in `.ds-appbar`, in bar text colours with the line in `--color-bar-text`.\n- `.ds-badge`: accent count pill; `--new` cyan; `--chip` a 32px grey chip, `is-active` white and ringed when it is the chosen filter. Status labels `--success`, `--warning`, `--danger` are flat fills with one or two words in sentence case. Group with `.ds-badges`.\n- `.ds-sidebar`: a card in the side column of an inner page: `.ds-sidebar__title`, then `.ds-sidebar__list` of 48px `.ds-sidebar__link` rows, each with a `.ds-sidebar__swatch` picture tile and a `.ds-sidebar__count` at the right; `is-current` is link-coloured on a tint.\n- `.ds-notice`: a dark slab with a `.ds-notice__title`; `--error` is a white sheet outlined and lettered in the danger colour. Group with `.ds-notices`.\n- `.ds-pagination`: a row of round `.ds-pagination__link`; `is-current` is a filled disc, `is-disabled` grey; previous and next are chevron icons.\n- `.ds-breadcrumb`: 12px 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's text colour.\n- `.ds-dialog`: a white sheet with the deepest shadow, `.ds-dialog__title`, `.ds-dialog__body` and right-aligned flat buttons in `.ds-dialog__actions`. Sits on `.ds-overlay`.\n- `.ds-empty`: centred `.ds-empty__mark` disc, `.ds-empty__title`, `.ds-empty__text` and one flat button, inside the sheet whose list is empty.\n- `.ds-footer`: the dark band: `.ds-footer__inner` with `.ds-footer__title` and a `.ds-footer__list` of `.ds-footer__link`, then `.ds-footer__legal`, a centred strip in the secondary bar fill.\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.\n- `block-gap <= 32px`: cards are 16px apart, sheets 24px, the toolbar 32px under the featured card.\n- `content-width >= 70%`: cards fill a 1240px container in a 1440px window; never a narrow centred column.\n- `font-weight <= 500`: emphasis is medium, never bold.\n- `font-weight >= 300`: body text is light, never thin.\n- `font-size >= 13px`: meta text is the smallest text.\n- `font-size <= 34px`: the headline of the home strip is the largest text.\n- `font-families <= 3`: a system sans-serif for text, Roboto for headings, 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.\n- `text-shadow = none`: no text has a shadow.\n- `border-radius <= 16px`: 8px controls, 12px cards, 16px for the largest containers; pills and discs are shapes.\n- `box-shadow-blur <= 22px`: sheets rest on 6px; only the dialog reaches 22px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. New content of the feed is a new `.ds-grid__cell` in the shortest column, with or without a `.ds-media` picture; a new block of an inner page is a `.ds-panel` in the main or the side `.ds-stack`. A new view gets a `.ds-nav__link` and opens with a `.ds-page-header`; a switch inside one sheet is a `.ds-tabs` row. Use tokens only, take heights and gaps from the `--size-*` and `--space-*` scale, and colour a block with one flat `--color-fill-*` and the text colour paired with it above. Never add a drawer, a second floating button, a gradient or photograph in a picture block, an outline around a card or a rule across the desk.\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-content: 1240px;\n  --size-measure: 640px;\n  --size-side: 320px;\n  --size-search: 240px;\n  --size-bar: 64px;\n  --size-row: 48px;\n  --size-row-dense: 40px;\n  --size-control: 36px;\n  --size-fab: 56px;\n  --size-brand: 32px;\n  --size-icon: 24px;\n  --size-check: 18px;\n  --size-badge: 22px;\n  --size-stripe: 4px;\n  --size-media: 160px;\n  --size-header: 248px;\n  --size-overlap: 56px;\n  --size-dialog: 440px;\n  --size-area: 120px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 32px;\n  --space-6: 48px;\n  --space-7: 64px;\n  --space-8: 80px;\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\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/* nav */\n.ds-nav {\n  position: relative;\n  z-index: 2;\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  height: var(--size-bar);\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  text-shadow: var(--shadow-text);\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  color: var(--color-bar-text);\n  font-size: var(--text-large);\n  line-height: 1.2;\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-brand);\n  height: var(--size-brand);\n  flex: none;\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--color-button);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 70%;\n  height: 70%;\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__search {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  flex: 0 1 var(--size-search);\n  height: var(--size-control);\n  margin-left: auto;\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-control);\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: color-mix(in srgb, var(--color-bar-text) 87%, transparent);\n  font-size: var(--text-ui);\n  white-space: nowrap;\n  overflow: hidden;\n}\n.ds-nav__links {\n  display: flex;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  color: color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover { color: var(--color-bar-text); }\n.ds-nav__link.is-current {\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n}\n\n/* app bar strip and containers */\n.ds-appbar {\n  position: relative;\n  z-index: 1;\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  box-shadow: var(--shadow-panel);\n}\n.ds-container {\n  max-width: var(--size-content);\n  margin: 0 auto;\n}\n.ds-main {\n  max-width: calc(var(--size-content) + var(--space-4) + var(--space-4));\n  margin: 0 auto;\n  padding: var(--space-4) var(--space-4) var(--space-6);\n}\n.ds-main--overlap {\n  position: relative;\n  z-index: 1;\n  margin-top: calc(var(--size-overlap) * -1);\n  padding-top: 0;\n}\n.ds-layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-side);\n  gap: var(--space-4);\n  align-items: start;\n}\n.ds-layout--even { align-items: stretch; }\n.ds-layout--even > .ds-stack {\n  display: flex;\n  flex-direction: column;\n}\n.ds-layout--even > .ds-stack > :last-child { flex: 1 1 auto; }\n.ds-layout--even > .ds-panel,\n.ds-layout--even > .ds-stack > .ds-panel {\n  display: flex;\n  flex-direction: column;\n}\n.ds-layout--even .ds-panel > .ds-panel__body { flex: 1 1 auto; }\n.ds-layout--even .ds-overlay { align-items: center; }\n.ds-stack {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n  align-content: start;\n}\n.ds-center {\n  display: flex;\n  justify-content: center;\n  padding-top: var(--space-4);\n}\n\n/* media: a colour block with two flat shapes */\n.ds-media {\n  position: relative;\n  overflow: hidden;\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n}\n.ds-media::before {\n  content: \"\";\n  position: absolute;\n  top: 14%;\n  right: 12%;\n  width: 16%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: currentColor;\n  opacity: 0.3;\n}\n.ds-media::after {\n  content: \"\";\n  position: absolute;\n  inset: 30% 0 0 0;\n  background: color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  clip-path: polygon(0 100%, 0 72%, 20% 34%, 38% 66%, 60% 6%, 82% 58%, 100% 40%, 100% 100%);\n}\n.ds-media--2 { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-media--3 { background: var(--color-fill-3); color: var(--color-bar-text); }\n.ds-media--4 { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-media--shore::before { top: 12%; right: auto; left: 14%; width: 12%; }\n.ds-media--shore::after {\n  inset: 58% 0 0 0;\n  clip-path: polygon(0 100%, 0 30%, 16% 8%, 34% 30%, 52% 6%, 70% 30%, 86% 10%, 100% 28%, 100% 100%);\n}\n.ds-media--wood::before { top: 18%; right: 42%; width: 10%; }\n.ds-media--wood::after {\n  inset: 22% 0 0 0;\n  clip-path: polygon(6% 100%, 16% 30%, 26% 100%, 30% 100%, 44% 4%, 58% 100%, 64% 100%, 76% 40%, 88% 100%);\n}\n.ds-media > * { position: relative; z-index: 1; }\n\n/* hero: the featured card */\n.ds-hero {\n  position: relative;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  overflow: hidden;\n  border-radius: var(--radius-page);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-hero__media { min-height: var(--size-header); }\n.ds-hero__body {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: flex-start;\n  padding: var(--space-5) var(--space-6);\n}\n.ds-hero__overline {\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\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.ds-hero__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-hero__lead {\n  margin: var(--space-2) 0 var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n  line-height: 1.5;\n}\n.ds-hero__fab {\n  position: absolute;\n  z-index: 2;\n  top: var(--space-4);\n  left: calc(50% - var(--size-fab) / 2);\n}\n\n/* toolbar above the grid */\n.ds-toolbar {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: var(--space-3) var(--space-4);\n  margin: var(--space-5) 0 var(--space-3);\n}\n.ds-toolbar__title {\n  margin: 0;\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  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-toolbar__field {\n  flex: 0 1 var(--size-search);\n  margin-left: auto;\n}\n\n/* grid: staggered columns of cards */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-3);\n  align-items: stretch;\n}\n.ds-grid__col {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  transition: var(--transition);\n}\n.ds-grid__col > .ds-grid__cell:last-child { flex: 1 1 auto; }\n.ds-grid__media {\n  display: flex;\n  align-items: flex-end;\n  flex: 1 0 auto;\n  min-height: var(--size-media);\n  padding: var(--space-3);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: 1.3;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-grid__media--tall { min-height: calc(var(--size-media) * 1.5); }\n.ds-grid__media--short { min-height: calc(var(--size-media) * 0.6); }\n.ds-grid__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-3) 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.3;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-grid__link {\n  color: inherit;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-grid__text {\n  margin: 0;\n  padding: var(--space-2) var(--space-3) var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-grid__meta {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: 0 var(--space-3) var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.25;\n}\n.ds-grid__actions {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-grid__count {\n  display: flex;\n  align-items: center;\n  gap: var(--space-1);\n  padding-right: var(--space-2);\n}\n\n/* page header: the tall head of an inner page */\n.ds-page-header {\n  position: relative;\n  overflow: hidden;\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  box-shadow: var(--shadow-panel);\n}\n.ds-page-header::before {\n  content: \"\";\n  position: absolute;\n  top: 12%;\n  right: 22%;\n  width: 6%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: color-mix(in srgb, var(--color-bar-text) 22%, transparent);\n}\n.ds-page-header::after {\n  content: \"\";\n  position: absolute;\n  inset: 20% 0 0 46%;\n  background: color-mix(in srgb, var(--color-bar-text) 12%, transparent);\n  clip-path: polygon(0 100%, 18% 46%, 30% 70%, 52% 4%, 74% 62%, 86% 40%, 100% 78%, 100% 100%);\n}\n.ds-page-header__inner {\n  position: relative;\n  z-index: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  gap: var(--space-4);\n  max-width: var(--size-content);\n  min-height: var(--size-header);\n  margin: 0 auto;\n  padding: var(--space-2) 0 calc(var(--size-overlap) + var(--space-4));\n}\n.ds-page-header--compact::before,\n.ds-page-header--compact::after { content: none; }\n.ds-page-header--compact .ds-page-header__inner { min-height: 0; }\n.ds-page-header__row {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-4);\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.2;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\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  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n\n/* typography */\n.ds-prose { max-width: var(--size-measure); }\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: var(--space-5) 0 var(--space-3);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  text-transform: var(--heading-transform);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-prose h1 { margin-top: 0; font-size: var(--text-h1); line-height: 1.18; }\n.ds-prose h2 { font-size: var(--text-h2); }\n.ds-prose h3 { font-size: var(--text-h3); font-weight: var(--weight-bold); line-height: 1.6; margin-bottom: var(--space-2); }\n.ds-prose p { margin: 0 0 var(--space-3); }\n.ds-prose ul,\n.ds-prose ol { margin: 0 0 var(--space-3); padding-left: var(--space-4); }\n.ds-prose li { margin-bottom: var(--space-1); }\n.ds-prose strong { font-weight: var(--weight-bold); }\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-control);\n  background: var(--color-surface-strong);\n  font-family: var(--font-mono);\n  font-size: var(--text-ui);\n}\n.ds-prose pre {\n  margin: 0 0 var(--space-3);\n  padding: var(--space-3);\n  overflow: auto;\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-prose pre code { padding: 0; background: transparent; font-size: inherit; }\n.ds-prose__lead {\n  color: var(--color-text);\n  font-size: var(--text-large);\n  line-height: 1.6;\n}\n.ds-prose a { color: var(--color-link); text-decoration: var(--link-decoration); }\n.ds-prose a:hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n\n/* links */\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-5);\n}\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited { color: var(--color-link-visited); }\n.ds-link:hover,\n.ds-link.is-hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n.ds-link:active,\n.ds-link.is-active { color: var(--color-link-active); }\n.ds-link:focus-visible,\n.ds-link.is-focus { outline: var(--focus-ring); }\n\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  justify-content: flex-end;\n  gap: var(--space-2);\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-4);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  text-align: left;\n  vertical-align: middle;\n}\n.ds-table th {\n  height: var(--size-row);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-table tbody tr:last-child td { border-bottom: 0; }\n.ds-table tbody tr:hover,\n.ds-table tbody tr.is-hover { background: var(--color-surface-strong); }\n.ds-table tbody tr.is-current { background: var(--color-surface-alt); }\n.ds-table .ds-table__num { text-align: right; font-variant-numeric: tabular-nums; }\n.ds-table__name { font-family: var(--font-mono); font-size: var(--text-small); }\n\n/* 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/* 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/* 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\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/* controls of this layout */\n.ds-button .ds-icon { margin: 0 var(--space-2) 0 calc(var(--space-1) * -1); }\n.ds-button--fab .ds-icon { margin: 0; }\n.ds-button--icon,\n.ds-button--icon:hover,\n.ds-button--icon.is-hover {\n  width: var(--size-control);\n  min-width: 0;\n  padding: 0;\n  border-radius: 50%;\n  background: transparent;\n  box-shadow: none;\n  color: var(--color-text-muted);\n}\n.ds-button--icon:hover,\n.ds-button--icon.is-hover { background: color-mix(in srgb, var(--color-text-muted) 20%, transparent); }\n.ds-badge--chip { border-radius: var(--radius-pill); text-decoration: none; }\n.ds-badge--chip.is-active {\n  background: var(--fill-button-secondary);\n  box-shadow: var(--shadow-control-pressed);\n  color: var(--color-button-secondary-text);\n  font-weight: var(--weight-bold);\n}\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.ds-panel .ds-table {\n  border-radius: 0;\n  background: transparent;\n  box-shadow: none;\n}\n.ds-panel .ds-table tbody tr:last-child td { border-bottom: 0; }\n.ds-overlay { border-radius: var(--radius-panel); }\n.ds-panel .ds-links { gap: var(--space-2) var(--space-4); }\n\n/* panel */\n.ds-panel {\n  min-width: 0;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  min-height: var(--size-bar);\n  padding: 0 var(--space-2) 0 var(--space-4);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__head .ds-panel__title { padding: 0; }\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  flex-wrap: wrap;\n  gap: var(--space-2);\n  padding: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__actions--end { justify-content: flex-end; }\n.ds-panel--pad .ds-panel__body {\n  padding: var(--space-5) var(--space-5) var(--space-5);\n  color: var(--color-text);\n  font-size: inherit;\n  line-height: inherit;\n}\n.ds-panel__label {\n  margin: var(--space-5) 0 var(--space-3);\n  color: var(--color-text-muted);\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/* stats */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-stat {\n  display: flex;\n  flex-direction: column-reverse;\n  justify-content: flex-end;\n  gap: var(--space-1);\n  min-width: 0;\n  padding: var(--space-3) var(--space-4);\n}\n.ds-stat + .ds-stat { border-left: var(--border-width) var(--border-style) var(--color-border); }\n.ds-stat__value {\n  display: block;\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.2;\n  font-variant-numeric: tabular-nums;\n}\n.ds-stat__label {\n  display: block;\n  color: var(--color-text-muted);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: flex-start;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n}\n.ds-list__item + .ds-list__item { border-top: var(--border-width) var(--border-style) var(--color-border-muted); }\n.ds-list__avatar {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  flex: none;\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n}\n.ds-list__avatar--alt { background: var(--color-fill-1); }\n.ds-list__avatar--accent { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-list__avatar--small {\n  width: var(--size-icon);\n  height: var(--size-icon);\n  font-size: var(--text-small);\n}\n.ds-list__body { flex: 1 1 0; min-width: 0; }\n.ds-list__title {\n  display: block;\n  color: var(--color-link-quiet);\n  font-size: var(--text-base);\n  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-muted);\n  font-size: var(--text-ui);\n  line-height: 1.43;\n}\n.ds-list__meta {\n  flex: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n\n/* sidebar */\n.ds-sidebar {\n  min-width: 0;\n  padding-bottom: var(--space-2);\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-alt);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-height: var(--size-row);\n  padding: var(--space-1) var(--space-4);\n  color: var(--color-link-quiet);\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  background: var(--color-surface-alt);\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__swatch {\n  width: var(--size-icon);\n  height: var(--size-icon);\n  flex: none;\n  border-radius: var(--radius-control);\n}\n.ds-sidebar__count {\n  margin-left: auto;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* notice */\n.ds-notices {\n  display: grid;\n  gap: var(--space-3);\n}\n.ds-notice {\n  padding: var(--space-3) var(--space-4);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n  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-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n}\n.ds-tabs__tab {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  height: var(--size-row);\n  padding: 0 var(--space-4);\n  margin-bottom: calc(var(--border-width) * -1);\n  border-bottom: 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  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover { color: var(--color-text); }\n.ds-tabs__tab.is-current {\n  color: var(--color-text);\n  border-bottom-color: var(--color-link);\n}\n.ds-tabs--bar { border-bottom: 0; }\n.ds-tabs--bar .ds-tabs__tab {\n  margin-bottom: 0;\n  color: color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n}\n.ds-tabs--bar .ds-tabs__tab:hover,\n.ds-tabs--bar .ds-tabs__tab.is-hover { color: var(--color-bar-text); }\n.ds-tabs--bar .ds-tabs__tab.is-current {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-bar-text);\n}\n\n/* footer */\n.ds-footer {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-small);\n}\n.ds-footer__inner {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: var(--space-3) var(--space-5);\n  max-width: calc(var(--size-content) + var(--space-4) + var(--space-4));\n  margin: 0 auto;\n  padding: var(--space-4);\n}\n.ds-footer__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-heading);\n  line-height: 1.2;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-footer__list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: color-mix(in srgb, var(--color-inverse-text) 70%, transparent);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover { color: var(--color-inverse-text); }\n.ds-footer__legal {\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  text-align: center;\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=\"#feed\"],\n.ds-page:has(#feed:target) .ds-nav__link[href=\"#feed\"],\n.ds-page:has(#route:target) .ds-nav__link[href=\"#route\"],\n.ds-page:has(#share:target) .ds-nav__link[href=\"#share\"],\n.ds-page:has(#saved:target) .ds-nav__link[href=\"#saved\"] {\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n}\n\n@media (max-width: 900px) {\n  .ds-nav__search { display: none; }\n  .ds-nav__links { margin-left: auto; }\n  .ds-hero { grid-template-columns: minmax(0, 1fr); }\n  .ds-hero__media { min-height: var(--size-media); }\n  .ds-hero__body { padding: var(--space-5) var(--space-4) var(--space-4); }\n  .ds-hero__fab {\n    top: calc(var(--size-media) - var(--size-fab) / 2);\n    left: auto;\n    right: var(--space-3);\n  }\n  .ds-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .ds-layout { grid-template-columns: minmax(0, 1fr); }\n  .ds-appbar { overflow: auto; }\n  .ds-page-header__row { flex-direction: column; align-items: flex-start; }\n  .ds-page-header::after { inset: 20% 0 0 20%; }\n}\n@media (max-width: 600px) {\n  .ds-nav {\n    flex-wrap: wrap;\n    gap: 0;\n    height: auto;\n    padding: 0 var(--space-3);\n  }\n  .ds-brand { width: 100%; height: var(--size-bar); }\n  .ds-nav__links {\n    margin-left: calc(var(--space-2) * -1);\n    height: var(--size-row);\n    min-width: 0;\n    overflow: auto;\n  }\n  .ds-nav__link { padding: 0 var(--space-2); }\n  .ds-appbar { padding: 0; }\n  .ds-tabs__tab { padding: 0 var(--space-3); }\n  .ds-main { padding: var(--space-3) var(--space-3) var(--space-6); }\n  .ds-main--overlap { padding-top: 0; }\n  .ds-hero__title { font-size: var(--text-h1); }\n  .ds-hero__lead { font-size: var(--text-base); }\n  .ds-toolbar { margin-top: var(--space-4); }\n  .ds-toolbar__field { flex: 1 1 100%; margin-left: 0; }\n  .ds-grid { grid-template-columns: minmax(0, 1fr); }\n  .ds-page-header { padding: 0 var(--space-3); }\n  .ds-page-header__inner { min-height: 0; }\n  .ds-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .ds-stat { padding: var(--space-3); }\n  .ds-stat:nth-child(odd) { border-left: 0; }\n  .ds-stat:nth-child(n + 3) { border-top: var(--border-width) var(--border-style) var(--color-border); }\n  .ds-panel--pad .ds-panel__body { padding: var(--space-4) var(--space-3); }\n  .ds-panel__head { padding-left: var(--space-3); }\n  .ds-list__item { padding: var(--space-3); }\n  .ds-table th,\n  .ds-table td { padding: 0 var(--space-2); }\n  .ds-table .ds-table__extra { display: none; }\n  .ds-tabs { overflow: auto; }\n  .ds-links { gap: var(--space-3) var(--space-4); }\n  .ds-overlay { padding: var(--space-4) var(--space-3); }\n  .ds-footer__inner { padding: var(--space-4) var(--space-3); }\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 sit centred in the bar */\n@media (max-width: 600px) {\n  .ds-nav__links {\n    flex: 1 1 100%;\n    justify-content: safe center;\n    margin-left: 0;\n  }\n}\n",
    "specimen.html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>chronoskin walks</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  <span class=\"ds-nav__search\">\n    <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"6\" stroke=\"currentColor\" fill=\"none\"/><path d=\"M16 16l4 4\" stroke=\"currentColor\" fill=\"none\"/></svg>\n    Search walks\n  </span>\n  <ul class=\"ds-nav__links\">\n    <li><a class=\"ds-nav__link\" href=\"#feed\">Feed</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#route\">Walk of the week</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#share\">Share</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#saved\">Saved</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=\"#saved\">Saved walks</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#share\">Share a walk</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#feed\">Feed</a></li>\n    </ul>\n  </details>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"feed\">\n\n  <div class=\"ds-appbar\">\n    <div class=\"ds-container\">\n      <ul class=\"ds-tabs ds-tabs--bar\" data-component=\"tabs\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#feed\">Latest</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#feed\">Nearby</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#feed\">Following</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#feed\">Short walks</a></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n\n    <article class=\"ds-hero\" data-component=\"hero\">\n      <div class=\"ds-hero__media ds-media\"></div>\n      <div class=\"ds-hero__body\">\n        <p class=\"ds-hero__overline\">Walk of the week</p>\n        <h1 class=\"ds-hero__title\">Three tarns before lunch</h1>\n        <p class=\"ds-hero__lead\">A half day loop over open fell, with a paddle at the top and a bus back from the far end.</p>\n        <div class=\"ds-buttons\">\n          <a class=\"ds-button\" href=\"#route\">Open the walk</a>\n          <a class=\"ds-button ds-button--secondary\" href=\"#saved\">Save for later</a>\n        </div>\n      </div>\n      <a class=\"ds-button ds-button--fab ds-hero__fab ds-tooltip ds-tooltip--left\" href=\"#share\" aria-label=\"Share a walk\"><span class=\"ds-tooltip__text\" role=\"tooltip\">Share a walk</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    </article>\n\n    <div class=\"ds-toolbar\">\n      <h2 class=\"ds-toolbar__title\">Fresh this week</h2>\n      <div class=\"ds-badges\">\n        <a class=\"ds-badge ds-badge--chip is-active\" href=\"#feed\">All</a>\n        <a class=\"ds-badge ds-badge--chip\" href=\"#feed\">Hills</a>\n        <a class=\"ds-badge ds-badge--chip\" href=\"#feed\">Coast</a>\n        <a class=\"ds-badge ds-badge--chip\" href=\"#feed\">Woods</a>\n      </div>\n      <label class=\"ds-toolbar__field\">\n        <input class=\"ds-form__control\" type=\"text\" placeholder=\"Filter by place\" aria-label=\"Filter by place\">\n      </label>\n    </div>\n\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <div class=\"ds-grid__col\">\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-grid__media--tall ds-media\"><span>Ridge above the reservoir</span></div>\n          <p class=\"ds-grid__text\">Nine miles along a broad grass ridge. Clear paths, one steep pull at the start.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-list__avatar ds-list__avatar--small\">I</span> Ines Halloran, 2 hours ago</div>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#route\">Open</a>\n            <span class=\"ds-grid__count\"><svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 4h10v16l-5-4-5 4z\" stroke=\"currentColor\" fill=\"none\"/></svg> 48</span>\n          </div>\n        </article>\n        <article class=\"ds-grid__cell\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-grid__link\" href=\"#route\">Is the ford passable in March?</a></h3>\n          <p class=\"ds-grid__text\">Asked on the valley loop. Four walkers answered, two with wet feet.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-list__avatar ds-list__avatar--small ds-list__avatar--accent\">T</span> Tomas Reyner, yesterday</div>\n        </article>\n      </div>\n      <div class=\"ds-grid__col\">\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-grid__media--short ds-media ds-media--2 ds-media--shore\"><span>Harbour wall at low tide</span></div>\n          <p class=\"ds-grid__text\">Flat, two miles, good with a pushchair.</p>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#route\">Open</a>\n            <span class=\"ds-grid__count\"><svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 4h10v16l-5-4-5 4z\" stroke=\"currentColor\" fill=\"none\"/></svg> 112</span>\n          </div>\n        </article>\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-media ds-media--3 ds-media--wood\"><span>Beech hanger in leaf</span></div>\n          <h3 class=\"ds-grid__title\"><a class=\"ds-grid__link\" href=\"#route\">Best in the first week of May</a></h3>\n          <p class=\"ds-grid__text\">A short climb through old beech, then a level mile along the top with views over the vale.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-list__avatar ds-list__avatar--small ds-list__avatar--alt\">K</span> Kwame Lindqvist, 3 days ago</div>\n        </article>\n      </div>\n      <div class=\"ds-grid__col\">\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-media ds-media--4\"><span>Night walk to the beacon</span></div>\n          <p class=\"ds-grid__text\">Leave at dusk, torches for the way down. The group meets at the lower car park.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-badge ds-badge--new\">New</span> Friday, 8 walkers going</div>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#route\">Join</a>\n            <a class=\"ds-button ds-button--flat\" href=\"#saved\">Save</a>\n          </div>\n        </article>\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-grid__media--short ds-media ds-media--shore\"><span>Salt marsh boardwalk</span></div>\n          <p class=\"ds-grid__text\">Bring binoculars. Closed at spring tides.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-list__avatar ds-list__avatar--small\">P</span> Priya Castell, 4 days ago</div>\n        </article>\n      </div>\n      <div class=\"ds-grid__col\">\n        <article class=\"ds-grid__cell\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-grid__link\" href=\"#saved\">Your saved walks</a></h3>\n          <p class=\"ds-grid__text\">Nothing saved yet. Tap the bookmark on any card to keep it for a dry day.</p>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#saved\">See saved</a>\n          </div>\n        </article>\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media ds-grid__media--tall ds-media ds-media--2\"><span>Quarry rim and the old incline</span></div>\n          <p class=\"ds-grid__text\">Six miles on slate paths. Rough underfoot, grand in low sun.</p>\n          <div class=\"ds-grid__meta\"><span class=\"ds-list__avatar ds-list__avatar--small ds-list__avatar--alt\">M</span> Mirela Osei, last week</div>\n          <div class=\"ds-grid__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#route\">Open</a>\n            <span class=\"ds-grid__count\"><svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 4h10v16l-5-4-5 4z\" stroke=\"currentColor\" fill=\"none\"/></svg> 31</span>\n          </div>\n        </article>\n      </div>\n    </div>\n\n    <div class=\"ds-center\">\n      <ul class=\"ds-pagination\" data-component=\"pagination\">\n        <li><a class=\"ds-pagination__link is-disabled\" href=\"#feed\" 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=\"#feed\">1</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#feed\">2</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#feed\">3</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#feed\" 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\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"route\">\n\n  <header class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-page-header__inner\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#feed\">Feed</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#feed\">Hills</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Three tarns</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Three tarns before lunch</h1>\n          <p class=\"ds-page-header__text\">A half day loop over open fell, shared by Ines Halloran.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#saved\">Save walk</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-main ds-main--overlap\">\n    <div class=\"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\">7.4</span><span class=\"ds-stat__label\">Miles</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">1,820</span><span class=\"ds-stat__label\">Feet of climb</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">4:10</span><span class=\"ds-stat__label\">Hours</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">48</span><span class=\"ds-stat__label\">Saves</span></li>\n        </ul>\n\n        <div class=\"ds-panel ds-panel--pad\">\n          <div class=\"ds-panel__body\">\n            <article class=\"ds-prose\" data-component=\"typography\">\n              <h1>The walk</h1>\n              <p class=\"ds-prose__lead\">Start early. The first tarn is in shade until ten and the last one is best with the sun behind you.</p>\n              <h2>Getting there</h2>\n              <p>Park at the chapel or take the valley bus to the bridge. The path leaves the lane by a stone stile marked <code>FP 12</code> and climbs beside the beck. See the <a href=\"#saved\">list of bus times</a> before you set off.</p>\n              <ul>\n                <li>Boots, not trainers: the middle section is wet all year.</li>\n                <li>No shelter above the second tarn.</li>\n                <li>Dogs on leads from March to July.</li>\n              </ul>\n              <h3>On the top</h3>\n              <p>The cairn sits a little north of the true summit. In mist, follow the wall, not the path.</p>\n            </article>\n            <p class=\"ds-panel__label\">Tagged</p>\n            <div class=\"ds-badges\" data-component=\"badge\">\n              <span class=\"ds-badge ds-badge--chip\">Hills</span>\n              <span class=\"ds-badge ds-badge--chip\">Half day</span>\n              <span class=\"ds-badge\">48</span>\n              <span class=\"ds-badge ds-badge--new\">New</span>\n              <span class=\"ds-badge ds-badge--success\">Open</span>\n              <span class=\"ds-badge ds-badge--warning\">Boggy</span>\n              <span class=\"ds-badge ds-badge--danger\">Closed</span>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\">\n            <h2 class=\"ds-panel__title\">Stages</h2>\n            <a class=\"ds-button ds-button--flat\" href=\"#share\">Suggest a change</a>\n          </div>\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>Stage</th><th class=\"ds-table__extra\">Ground</th><th>Path</th><th class=\"ds-table__num\">Miles</th><th class=\"ds-table__num ds-table__extra\">Climb, ft</th></tr>\n            </thead>\n            <tbody>\n              <tr><td>Chapel to the stile</td><td class=\"ds-table__extra\">Lane</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">0.6</td><td class=\"ds-table__num ds-table__extra\">90</td></tr>\n              <tr><td>Beck path to first tarn</td><td class=\"ds-table__extra\">Stone pitching</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">1.9</td><td class=\"ds-table__num ds-table__extra\">940</td></tr>\n              <tr class=\"is-current\"><td>Across the moss</td><td class=\"ds-table__extra\">Peat</td><td><span class=\"ds-badge ds-badge--warning\">Boggy</span></td><td class=\"ds-table__num\">1.2</td><td class=\"ds-table__num ds-table__extra\">210</td></tr>\n              <tr><td>Summit and third tarn</td><td class=\"ds-table__extra\">Grass</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">1.5</td><td class=\"ds-table__num ds-table__extra\">580</td></tr>\n              <tr><td>Old drove road down</td><td class=\"ds-table__extra\">Track</td><td><span class=\"ds-badge ds-badge--danger\">Closed</span></td><td class=\"ds-table__num\">2.2</td><td class=\"ds-table__num ds-table__extra\">0</td></tr>\n            </tbody>\n          </table>\n        </div>\n\n      </div>\n      <aside class=\"ds-stack\">\n\n        <div class=\"ds-panel\">\n          <ul class=\"ds-list\" data-component=\"list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__avatar ds-list__avatar--accent\">T</span>\n              <span class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#route\">Tomas Reyner</a>\n                <span class=\"ds-list__text\">Did it on Sunday. The moss is as wet as promised.</span>\n              </span>\n              <span class=\"ds-list__meta\">2 d</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__avatar ds-list__avatar--alt\">K</span>\n              <span class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#route\">Kwame Lindqvist</a>\n                <span class=\"ds-list__text\">The drove road reopens at the end of the month.</span>\n              </span>\n              <span class=\"ds-list__meta\">5 d</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__avatar\">P</span>\n              <span class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#route\">Priya Castell</a>\n                <span class=\"ds-list__text\">Lovely. We swam in the second tarn.</span>\n              </span>\n              <span class=\"ds-list__meta\">9 d</span>\n            </li>\n          </ul>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#share\">Add a note</a>\n          </div>\n        </div>\n\n        <nav class=\"ds-sidebar\" data-component=\"sidebar\">\n          <h2 class=\"ds-sidebar__title\">More hill walks</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__link is-current\" href=\"#route\"><span class=\"ds-sidebar__swatch ds-media\"></span> Three tarns <span class=\"ds-sidebar__count\">7.4 mi</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#route\"><span class=\"ds-sidebar__swatch ds-media ds-media--2\"></span> Quarry rim <span class=\"ds-sidebar__count\">6.0 mi</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#route\"><span class=\"ds-sidebar__swatch ds-media ds-media--3\"></span> Reservoir ridge <span class=\"ds-sidebar__count\">9.1 mi</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#route\"><span class=\"ds-sidebar__swatch ds-media ds-media--4\"></span> Beacon by night <span class=\"ds-sidebar__count\">3.2 mi</span></a></li>\n          </ul>\n        </nav>\n\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Before you go</h3>\n          <div class=\"ds-panel__body\">\n            <p>The valley bus runs hourly until six. The last one back from the far end leaves the bridge at ten past five.</p>\n            <p>There is no phone signal between the first tarn and the drove road, so save the walk to read it on the hill.</p>\n            <div class=\"ds-accordion\" data-component=\"accordion\">\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">What to carry</summary>\n                <p class=\"ds-accordion__body\">Boots, a waterproof and a map. There is no water on the route.</p>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">Dogs and livestock</summary>\n                <p class=\"ds-accordion__body\">Sheep graze the fell all year. Keep dogs on a lead from March to July.</p>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">Getting back</summary>\n                <p class=\"ds-accordion__body\">The last bus leaves the far end at ten past five.</p>\n              </details>\n            </div>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#saved\">Save walk</a>\n            <a class=\"ds-button ds-button--flat\" href=\"#share\">Report a problem</a>\n          </div>\n        </div>\n\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Also from Ines</h3>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-links\" data-component=\"links\">\n              <a class=\"ds-link\" href=\"#route\">Reservoir ridge</a>\n              <a class=\"ds-link is-visited\" href=\"#route\">Salt marsh</a>\n              <a class=\"ds-link is-hover\" href=\"#route\">Quarry rim</a>\n              <a class=\"ds-link is-active\" href=\"#route\">Beech hanger</a>\n            </div>\n          </div>\n        </div>\n\n      </aside>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"share\">\n\n  <header class=\"ds-page-header ds-page-header--compact\">\n    <div class=\"ds-page-header__inner\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#feed\">Feed</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#saved\">Your walks</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">New</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Share a walk</h1>\n          <p class=\"ds-page-header__text\">Tell others where to start, how far it is and what to watch for.</p>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-main ds-main--overlap\">\n    <div class=\"ds-layout ds-layout--even\">\n\n      <div class=\"ds-panel ds-panel--pad\">\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\">Name of the walk</span>\n              <input class=\"ds-form__control\" type=\"text\" value=\"Mill race and the weir\">\n            </label>\n            <label class=\"ds-form__field is-invalid\">\n              <span class=\"ds-form__label\">Distance in miles</span>\n              <input class=\"ds-form__control\" type=\"text\" value=\"about five\">\n              <span class=\"ds-form__error\">Enter a number, for example 5.2.</span>\n            </label>\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Kind of ground</span>\n              <span class=\"ds-form__select\">\n                <select class=\"ds-form__control\">\n                  <option>Riverside</option>\n                  <option>Hills</option>\n                  <option>Coast</option>\n                  <option>Woods</option>\n                </select>\n              </span>\n            </label>\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Directions</span>\n              <textarea class=\"ds-form__control ds-form__control--area\">From the mill yard follow the race upstream to the weir, cross by the footbridge and return on the far bank.</textarea>\n              <span class=\"ds-form__hint\">Plain text. Mention gates, stiles and anything slippery.</span>\n            </label>\n            <label class=\"ds-form__check\">\n              <input class=\"ds-form__checkbox\" type=\"checkbox\" checked>\n              <span>Suitable for dogs</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>Show my name on the walk</span></label>\n          </form>\n        </div>\n        <div class=\"ds-panel__actions ds-panel__actions--end ds-buttons\" data-component=\"buttons\">\n          <button class=\"ds-button ds-button--danger\" type=\"button\">Discard</button>\n          <button class=\"ds-button ds-button--secondary\" type=\"button\">Save draft</button>\n          <button class=\"ds-button is-disabled\" type=\"button\" disabled>Preview</button>\n          <a class=\"ds-button\" href=\"#feed\">Publish</a>\n        </div>\n      </div>\n\n      <div class=\"ds-stack\">\n        <div class=\"ds-notices\" data-component=\"notice\">\n          <div class=\"ds-notice\">\n            <strong class=\"ds-notice__title\">Draft saved</strong>\n            Your walk is kept on this device until you publish it.\n          </div>\n          <div class=\"ds-notice ds-notice--error\">\n            <strong class=\"ds-notice__title\">One field needs a look</strong>\n            The distance must be a number.\n          </div>\n        </div>\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\">Discard this walk?</h3>\n            <div class=\"ds-dialog__body\">\n              <p>The draft and its directions will be removed from this device.</p>\n            </div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--flat\" href=\"#share\">Keep editing</a>\n              <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#feed\">Discard</a>\n            </div>\n          </div>\n        </div>\n      </div>\n\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"saved\">\n\n  <header class=\"ds-page-header ds-page-header--compact\">\n    <div class=\"ds-page-header__inner\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#feed\">Feed</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#saved\">Your walks</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Saved</li>\n      </ol>\n      <div class=\"ds-page-header__row\">\n        <div class=\"ds-page-header__body\">\n          <h1 class=\"ds-page-header__title\">Saved walks</h1>\n          <p class=\"ds-page-header__text\">Walks you bookmarked, kept for a dry day.</p>\n        </div>\n        <div class=\"ds-page-header__actions\">\n          <a class=\"ds-button ds-button--secondary\" href=\"#share\">Share a walk</a>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-main ds-main--overlap\">\n    <div class=\"ds-layout ds-layout--even\">\n\n      <div class=\"ds-panel\">\n        <ul class=\"ds-tabs\">\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#saved\">Saved</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#saved\">Walked</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#saved\">Drafts <span class=\"ds-badge\">1</span></a></li>\n        </ul>\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=\"M7 4h10v16l-5-4-5 4z\" stroke=\"currentColor\" fill=\"none\"/></svg>\n          </span>\n          <h3 class=\"ds-empty__title\">Nothing saved yet</h3>\n          <p class=\"ds-empty__text\">Walks you bookmark in the feed appear here.</p>\n          <a class=\"ds-button ds-button--flat\" href=\"#feed\">Browse the feed</a>\n        </div>\n      </div>\n\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Recently opened</h3>\n          <ul class=\"ds-list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__avatar ds-list__avatar--alt\">3</span>\n              <span class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#route\">Three tarns before lunch</a>\n                <span class=\"ds-list__text\">Hills, 7.4 miles</span>\n              </span>\n              <span class=\"ds-list__meta\">Today</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__avatar ds-list__avatar--accent\">H</span>\n              <span class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#route\">Harbour wall at low tide</a>\n                <span class=\"ds-list__text\">Coast, 2.0 miles</span>\n              </span>\n              <span class=\"ds-list__meta\">Mon</span>\n            </li>\n          </ul>\n        </div>\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <h3 class=\"ds-panel__title\">Walks without a signal</h3>\n          <div class=\"ds-panel__body\">\n            <p>Saved walks are stored on your phone with their directions, so they open on the hill.</p>\n            <p>Two of three saved walks are on this phone.</p>\n            <span class=\"ds-progress\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Saved walks downloaded\"><span class=\"ds-progress__bar\"></span></span>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#feed\">Find a walk</a>\n          </div>\n        </div>\n      </div>\n\n    </div>\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-footer__inner\">\n    <p class=\"ds-footer__title\">chronoskin</p>\n    <ul class=\"ds-footer__list\">\n      <li><a class=\"ds-footer__link\" href=\"#feed\">Feed</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#route\">Walk of the week</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#share\">Share a walk</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#saved\">Saved</a></li>\n    </ul>\n  </div>\n  <p class=\"ds-footer__legal\">chronoskin is a sample walking feed. Check the weather and the ground before you set out.</p>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.material-design.app.s05.p03.t06.u11\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"material-design\",\n    \"years\": [\n      2014,\n      2018\n    ]\n  },\n  \"archetype\": \"app\",\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-536b\",\n  \"short\": \"v1-md-536b\"\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: \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Noto Sans\", \"Helvetica Neue\", sans-serif;\n  --font-heading: Roboto, \"Noto Sans\", \"Segoe UI\", sans-serif;\n  --font-ui: \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Noto Sans\", \"Helvetica Neue\", sans-serif;\n  --font-mono: \"Source Code Pro\", \"Roboto Mono\", Inconsolata, Consolas, Menlo, monospace;\n  --text-base: 16px;\n  --text-small: 13px;\n  --text-ui: 14px;\n  --text-large: 18px;\n  --text-display: 34px;\n  --text-h1: 24px;\n  --text-h2: 20px;\n  --text-h3: 16px;\n  --line-body: 1.6;\n  --line-heading: 1.3;\n  --line-display: 1.3;\n  --weight-body: 300;\n  --weight-bold: 500;\n  --weight-heading: 400;\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: underline;\n  --link-decoration-hover: none;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 8px;\n  --radius-panel: 12px;\n  --radius-pill: 9999px;\n  --radius-page: 16px;\n  --shadow-panel: 0 1px 3px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 6px 16px 0 color-mix(in srgb, var(--color-shadow) 10%, transparent);\n  --shadow-control: 0 1px 3px 0 color-mix(in srgb, var(--color-shadow) 16%, transparent), 0 2px 6px 0 color-mix(in srgb, var(--color-shadow) 10%, transparent);\n  --shadow-control-hover: 0 2px 4px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 6px 14px 0 color-mix(in srgb, var(--color-shadow) 18%, transparent);\n  --shadow-control-pressed: 0 1px 2px 0 color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  --shadow-dialog: 0 8px 12px -4px color-mix(in srgb, var(--color-shadow) 18%, transparent), 0 16px 22px 2px color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 85%, white);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-surface-alt);\n  --focus-ring: 4px solid color-mix(in srgb, var(--color-focus) 30%, transparent);\n  --transition: box-shadow 0.3s ease-out, background-color 0.3s ease-out, color 0.3s ease-out;\n  --backdrop-blur: 0px;\n}\n"
  }
}
