{
  "id": "v1-md-7124",
  "long_id": "v1.material-design.shop.s07.p01.t02.u04",
  "name": "Material storefront, 2017",
  "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": "shop",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "A small online shop in the paper-and-ink manner: a coloured app bar with a search field in its middle, a darker strip of departments under it, and a centred column of white cards on a warm pale page. The home page is a promotion card beside two solid colour tiles, then a shelf of six product cards with flat colour pictures, a price and a small button; inner pages are a filter card beside a ruled product list, a product sheet with a floating action button on the seam of its picture, a basket table beside an order summary and a check-out form under a stepper. Shops, app stores and catalogue sites built on material frameworks looked like this from about 2015 to 2018.",
  "url": "https://chrono.skin/s/v1-md-7124",
  "preview_url": "https://chrono.skin/s/v1-md-7124/specimen.html",
  "files": {
    "STYLE.md": "# Material storefront, 2017\n\n## Summary\n\nA small online shop in the paper-and-ink manner: a coloured app bar with a search field in its middle, a darker strip of departments under it, and a centred column of white cards on a warm pale page. The home page is a promotion card beside two solid colour tiles, then a shelf of six product cards with flat colour pictures, a price and a small button; inner pages are a filter card beside a ruled product list, a product sheet with a floating action button on the seam of its picture, a basket table beside an order summary and a check-out form under a stepper. Shops, app stores and catalogue sites built on material frameworks looked like this from about 2015 to 2018.\n\n## Layout\n\n- The page is fluid: `--size-page` is `100%`; the bar, the department strip and the footer span the window. Designed at 1440px. Everything else is centred in `.ds-container`, capped at `--size-content` (1232px) with `--space-4` at the sides; running text is capped at `--size-measure` (640px).\n- Order on the home page: `.ds-nav`, which holds `.ds-nav__row` (`--size-bar` 64px: brand at the left, `.ds-nav__search` up to `--size-search` wide in the middle, three icon links at the right) and `.ds-strip` (the departments, `--size-row-dense` 40px, in `--fill-bar-alt`). Then `.ds-main`: `.ds-hero`, one or more `.ds-shelf` blocks, a `.ds-columns` row of three cards and the `.ds-snackbar`. Below 600px the snackbar is a square bar along the bottom edge of the window. Then `.ds-footer`. There is no drawer and no side column on the home page.\n- `.ds-hero` is a row of two parts, 3 to 1 and `--space-3` apart: `.ds-hero__card`, a sheet with the text at the left and a flat picture `--size-art` (400px) wide at the right, and `.ds-hero__side`, two `.ds-promo` tiles stacked. A `.ds-shelf` is a head (title and one grey line at the left, one flat button at the right) over a `.ds-grid` of six cards `--space-3` apart.\n- `.ds-main` is a vertical stack: blocks are `--space-5` (32px) apart on the home page and `--space-4` (24px) apart on inner pages (`.ds-main--inner`). Blocks are separated by the gap and their shadow, never by rules on the page.\n- Everything is on an 8px grid. `--space-1` 4px (label to field, meta gaps), `--space-2` 8px (between buttons, card action padding, picture padding), `--space-3` 16px (gap between cards of a shelf, card text padding, button side padding, list row padding), `--space-4` 24px (gap between sheets, sheet side padding, container side padding, field gap), `--space-5` 32px (between blocks of the home page, top of the footer), `--space-6` 48px (padding of the promotion card text, bottom of the page), `--space-7` 64px (line between two steps), `--space-8` 80px (spare step).\n- Heights: bar `--size-bar` 64px; tabs and table head `--size-row` 48px, table rows 56px; department links, side links and the search field `--size-row-dense` 40px; buttons `--size-control` 36px, small buttons 32px, fields 40px; floating button `--size-fab` 56px. Other sizes: `--size-brand` 32px, `--size-media` 152px (picture of a product card; the large pictures are twice that), `--size-thumb` 72px (list picture, empty-state disc), `--size-side` 264px (filter card), `--size-summary` 368px (summary column), `--size-meter` 8px, `--size-stripe` 4px, `--size-icon` 24px, `--size-icon-small` 16px, `--size-check` 18px, `--size-badge` 22px, `--size-dialog` 440px, `--size-area` 96px.\n- Inner pages (a department, a product, the basket, check-out, the account) have no `.ds-hero`. The bar and the strip stay. `.ds-main--inner` opens with `.ds-breadcrumb`, then `.ds-page-header` set directly on the page (title, one grey line, raised buttons at the right), then the working sheets. A department page is a `.ds-layout`: the `.ds-sidebar` filter card (`--size-side`) at the left and one `.ds-panel` at the right that holds `.ds-tabs` along its top edge, the `.ds-list` and `.ds-pagination` in a ruled strip at its foot. A product page has no page header: under the breadcrumb comes `.ds-product`, one sheet with the pictures at the left (5 parts) and the name, price and buy controls at the right (7 parts), then `.ds-columns--detail` (7 to 5): the description sheet with tabs and `.ds-prose`, and a `.ds-stack` of cards. Basket and check-out use `.ds-columns--aside`: the main sheet (table or form) and a column of `--size-summary` at the right with the order summary. Check-out puts `.ds-steps` between the page header and the columns. The account page is `.ds-stats`, then a sheet with tabs, then `.ds-columns--pair`.\n- Views: the specimen is one shop with six views. `shop` is the home view: promotion card and tiles, the shelf of new products, three cards and the snackbar. `browse` is a department: page header, filter card, and the sheet with tabs, the product list and pagination. `product` is one product: the product sheet with its floating button, the description, ratings, two reviews and related links. `basket` is the basket: two notices, the table with its stock labels and the order summary. `checkout` is the address step: page actions, the stepper, the form, the summary and the dialog that empties the basket. `orders` is the account's orders, shown empty under its tabs, with figures above and two cards below.\n- Below 1100px a shelf has three cards to a row and the two tiles move under the promotion card. Below 900px every pair of columns becomes one, the product sheet stacks picture over text with the floating button on the picture's lower right edge, and the page header stacks. Below 600px the bar splits into a row with the brand and icon-only links and a row with the search field, the promotion picture moves above its text, a shelf has two cards to a row, figures sit two by two, only the current step keeps its label, 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- `--color-bar` deep pink `#c2185b` with white `--color-bar-text`: navigation bar and header band. `--color-bar-alt` indigo `#3f51b5` is the secondary toolbar; `--color-inverse` `#424242` with `#fafafa` text is the footer.\n- Indigo `#3f51b5` is the colour of action: `--color-button`, `--color-link`, `--color-heading-alt` (section and drawer titles). Hover darkens to `--color-link-hover` `#284888`; visited links are purple `#9c27b0`.\n- `--color-accent` cyan `#00bcd4` with dark `--color-accent-text` `#212121`: the floating button and count badges. Tab indicators do not use it: on the band the line is `--color-bar-text`, on a sheet `--color-link`, so it stays readable under every palette. `--color-accent-alt` and `--color-focus` are bright pink `#ff4081`.\n- Page `#fafafa`, sheets white, `--color-surface-alt` `#f5f5f5`, `--color-surface-strong` and `--color-border` `#dddddd`. Body text is `#424242`, headings `#212121`, secondary text `#757575`.\n- Block fills: pink `#e91e63`, orange `#ff9800` (dark text), indigo `#3f51b5`, slate `#37474f`. Status: `--color-danger` `#e91e63`, `--color-success` teal `#009688`, `--color-warning` `#ff9800`; the notice is pale orange `#ffe0b2` with `#212121` text.\n- `--font-heading` and `--font-ui` are the monospace stack (Roboto Mono, Menlo): headings, brand name, buttons, navigation, tabs, drawer. `--font-body` stays Roboto for running text.\n- Headings are uppercase (`--heading-transform`) at regular weight 400 and modest sizes: `--text-display` 40px, `--text-h1` 30px, `--text-h2` 20px, `--text-h3` 16px, `--line-heading` 1.4.\n- `--text-base` 16px on a 24px line; `--text-large` 18px; `--text-ui` 13px uppercase at `--weight-ui` 400; `--text-small` 12px. `--weight-bold` 500 is the heaviest weight.\n- Links in running text are underlined in every state (`--link-decoration`, `--link-decoration-hover`); quiet links, titles and navigation are not (`--link-decoration-quiet` `none`).\n- Sheets are flat and outlined: `--shadow-panel` is a 1px ring in `--color-border` with no blur; nothing rests above the page. `--fill-page` is the sheet colour (`--color-surface`), so page and sheets are one tone and only the outline separates them.\n- `--radius-control`, `--radius-panel` and `--radius-page` are 4px; `--radius-pill` is 16px, so badges and chips are pills and pagination cells are rounded squares.\n- Buttons rest flat with a 1px inner ring (`--shadow-control`), lift to a soft two-layer shadow on hover (`--shadow-control-hover`, 4px blur, also the floating button), and only the dialog floats (`--shadow-dialog`, three layers up to 14px blur). A hovered button lightens: `--fill-button-hover` is the button colour mixed with 10% white.\n- Text fields are filled: `--fill-input` is the text colour at 6% over the sheet, with the top corners at `--radius-control`, a side inset of twice that radius and the bottom line. `--focus-ring` is a 3px halo of the focus colour at 40%. `--transition` is 0.28s on the standard curve.\n- Every fill is one flat colour; `--border-width` 1px for dividers, `--border-width-strong` 2px for indicators and focused fields.\n- Text on fills follows fixed pairs: `--color-bar-text` on the band, on `--color-fill-1` and on `--color-fill-3`; `--color-accent-text` on the accent, on `--color-fill-2` and on the warning badge; `--color-inverse-text` on the footer and on `--color-fill-4`; `--color-button-text` on the primary and danger buttons and on the new, success and danger badges. Links, muted text and headings are used only on the page and on white sheets.\n- One-off values built with `color-mix()` or `calc()` because the vocabulary has no token: 70% and 87% of the bar text colour for band tabs, toolbar links and the hero lead, a 16% wash of it behind the current toolbar link, 66% of the quiet link colour for contents links, 70% of the inverse text in the footer, a 20% grey wash behind a hovered flat button, and line heights 1.18, 1.2, 1.43 and 1.6.\n\n## Components\n\n- `.ds-page` on `<body>`: the page fill, family and 15px text. `.ds-container` centres content at `--size-content`.\n- `.ds-nav`: the app bar with the department strip. `.ds-nav__row` holds the brand, `.ds-nav__search` (an icon and a borderless `.ds-nav__field`) and `.ds-nav__links` > `.ds-nav__item` > `.ds-nav__link` (icon, `.ds-nav__label`, optionally a count badge); `is-current` has a `--border-width-strong` line in `--color-bar-text`. `.ds-strip` > `.ds-strip__list` > `.ds-strip__link` are the departments; `is-current` is bold.\n- `.ds-brand`: the site's mark and name at the left of the bar, one link. `.ds-brand__mark` is a `--size-brand` tile dressed like the primary button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) with a hairline ring of the bar text at 70%; `.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-hero`: the promotion row. `.ds-hero__card` holds `.ds-hero__body` (`.ds-hero__label`, `.ds-hero__title`, `.ds-hero__lead`, a `.ds-buttons` row with one raised and one flat button) and `.ds-hero__art` with three `.ds-hero__shape` circles (`--2`, `--3`). `.ds-hero__side` holds two `.ds-promo` tiles (`--alt` for the dark one) with `.ds-promo__title`, `.ds-promo__text` and `.ds-promo__link`.\n- `.ds-shelf`: a titled row of products: `.ds-shelf__head` with `.ds-shelf__title`, `.ds-shelf__text` and a flat button, then a `.ds-grid`.\n- `.ds-page-header`: the head of an inner page, unboxed. `.ds-page-header__body` holds `.ds-page-header__title` and `.ds-page-header__text`; `.ds-page-header__actions` sits at the right.\n- `.ds-main`, `.ds-layout`, `.ds-columns` (three equal cards; `--detail` 7 to 5, `--aside` main plus summary column, `--pair` two equal), `.ds-stack` (cards piled `--space-4` apart) and `.ds-caption` (a small uppercase caption on the page).\n- `.ds-prose`: long-form text inside a padded sheet; styles h1 to h3, paragraphs, lists, `strong`, inline `code` and links. `.ds-prose__lead` is the opening paragraph.\n- `.ds-link`: inline link with `is-visited`, `is-hover`, `is-active`, `is-focus`; `--quiet` is text-coloured. `.ds-links` stacks several.\n- `.ds-button`: the primary button, 36px, uppercase. `--secondary` is white with a hairline, `--flat` has no fill (cards, dialogs, empty states), `--danger` is filled with `--color-danger` (with `--flat`, danger-coloured text), `--small` is the 32px form on product cards, `--wide` fills its column, `--fab` is the 56px accent disc with one `.ds-icon`. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. Group with `.ds-buttons`.\n- `.ds-icon`: 24px stroked inline SVG in the current colour.\n- `.ds-form`: stacked fields; `.ds-form__row` puts two side by side. `.ds-form__field` wraps a `.ds-form__label` and a `.ds-form__control` (filled, bottom line only; `--area` for a textarea; inside `.ds-form__select` for a select). `is-focus` thickens the line in `--color-focus`; `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; `.ds-form__inline` puts one field and one button on a line.\n- `.ds-table`: sits in a `.ds-panel`; 56px rows divided by hairlines, small uppercase head, `.ds-table__num` right-aligned numbers, `.ds-table__name` a bold item, `.ds-table__extra` cells a phone can do without, `tr.is-current` tinted.\n- `.ds-list`: ruled rows inside a `.ds-panel`. `.ds-list__item` holds `.ds-list__thumb` (a square picture; `--2`, `--3`, `--4` pick the fill, `--round` is a small avatar disc), `.ds-list__body` with `.ds-list__title`, `.ds-list__text` and optionally a `.ds-rating`, and `.ds-list__meta` at the right. `.ds-rating` is one `.ds-rating__star` and a figure; `.ds-price` is a price (`--large`, with `.ds-price__was` for the old price).\n- `.ds-panel`: a card with `.ds-panel__title`, `.ds-panel__body` and optional `.ds-panel__actions` (`--end` for raised buttons at the right); `--form` holds a form, `--pad` pads the sheet for prose and lets `.ds-tabs` run along its top edge. `.ds-summary` is the list of amounts in the summary card (`.ds-summary__label`, `.ds-summary__value`, `--total` for the last line).\n- `.ds-stat`: one figure card with a `--border-width-strong` line in `--color-button` along its foot; four sit in a `.ds-stats` row. `.ds-stat__label` is the small uppercase caption above `.ds-stat__value`.\n- `.ds-grid`: six product cards. Each `.ds-grid__cell` (`--2`, `--3`, `--4` pick the fill) has `.ds-grid__media` (the picture, may hold a badge), `.ds-grid__body` with `.ds-grid__title`, `.ds-grid__text` and a rating, and `.ds-grid__foot` with the price and a small button.\n- `.ds-tabs`: a hairline-ruled row of uppercase `.ds-tabs__tab` along the top of a sheet; `is-current` is in `--color-link` with a line of the same colour.\n- `.ds-badge`: accent count pill; `--new` for new items; `--success`, `--warning`, `--danger` for stock and order status; `--chip` is a 32px choice chip, `is-current` when chosen. Group with `.ds-badges`.\n- `.ds-sidebar`: the filter card of a department page. `.ds-sidebar__title` is a small uppercase heading, `.ds-sidebar__list` a group of `.ds-sidebar__link` rows with a `.ds-sidebar__count`; `is-current` has a `--size-stripe` line at its left. `.ds-sidebar__checks` holds checkbox filters.\n- `.ds-notice`: tinted block with a left stripe and a `.ds-notice__title`; `--error` is a sheet with the stripe and text in the danger colour. `.ds-notices` puts two side by side.\n- `.ds-pagination`: a centred row of square `.ds-pagination__link` in a ruled strip at the foot of a sheet; `is-current` is filled, `is-disabled` grey.\n- `.ds-breadcrumb`: small grey trail of `.ds-breadcrumb__item` with `.ds-breadcrumb__link`, separated by drawn chevrons; the last carries `is-current`.\n- `.ds-product`: the product sheet. `.ds-product__gallery` holds `.ds-product__media` and `.ds-product__thumbs`; `.ds-product__fab` places the floating button on the seam; `.ds-product__body` holds `.ds-product__title`, `.ds-product__text`, chips, the price and `.ds-product__options`. `.ds-ratings` is the list of `.ds-ratings__row`, each with a `.ds-meter` and its `.ds-meter__bar` (`--2` to `--4` set the length).\n- `.ds-steps`: the check-out stepper, one sheet. `.ds-steps__step` holds a round `.ds-steps__mark` and a `.ds-steps__label`; `is-done` and `is-current` fill the mark.\n- `.ds-dialog`: a 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-snackbar`: a short message on the inverse fill that sticks to the lower left of the view, with one `.ds-snackbar__action`.\n- `.ds-empty`: centred `.ds-empty__mark` disc, `.ds-empty__title`, `.ds-empty__text` and one flat button, inside a sheet under its tabs.\n- `.ds-footer`: inverse band with `.ds-footer__cols` of `.ds-footer__col`, each with `.ds-footer__title` and `.ds-footer__text` or a `.ds-footer__list` of `.ds-footer__link`, and a ruled `.ds-footer__legal` line.\n- `.ds-menu`: a `<details>` whose `.ds-menu__button` (the `<summary>`: an icon, or the account's `.ds-avatar`) opens `.ds-menu__list`, a white sheet with the dialog shadow holding 48px `.ds-menu__link` rows. Use it for the account menu and the overflow (three dots) at the end of the bar; `--start` hangs the sheet from the left, for the menu button that carries the navigation on a phone.\n- `.ds-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- `block-gap <= 32px`: blocks are 24px or 32px apart.\n- `font-weight <= 500`: emphasis is medium, never bold.\n- `font-size >= 12px`: captions are the smallest text.\n- `font-size <= 40px`: the mono display line stays small.\n- `font-families <= 2`: one sans-serif for text, one monospace for headings, labels and code.\n- `letter-spacing = 0px`: the mono face is not tracked further.\n- `gradient-fills = 0%`: every fill is one flat colour; depth comes from shadow only.\n- `text-shadow = none`: no text has a shadow.\n- `border-radius <= 12px`: controls 3px, cards 6px, chips 12px; only discs and badge pills are rounder.\n- `box-shadow-blur <= 22px`: cards rest on a 4px blur; buttons and the dialog reach 22px.\n- `border-width <= 4px`: hairlines are 1px, indicators 2px, the drawer stripe 4px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: anything that holds data is a sheet like `.ds-panel` with `--radius-panel` and `--shadow-panel`; anything pressed is a `.ds-button` variant; a new picture is one `--color-fill-*` with circles in its text colour; a new choice is a `.ds-badge--chip`. Use tokens only. Pick heights and gaps from the `--size-*` and `--space-*` scale so everything stays on the 8px grid, keep the text colour that belongs to each fill, and separate blocks with the gap and the shadow, not with rules on the page. Never add a gradient, an outline around a card, tracking or a radius between 8px and a full disc.\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: 1232px;\n  --size-measure: 640px;\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-icon-small: 16px;\n  --size-check: 18px;\n  --size-badge: 22px;\n  --size-stripe: 4px;\n  --size-meter: 8px;\n  --size-media: 152px;\n  --size-thumb: 72px;\n  --size-art: 400px;\n  --size-side: 264px;\n  --size-summary: 368px;\n  --size-search: 520px;\n  --size-dialog: 440px;\n  --size-area: 96px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 32px;\n  --space-6: 48px;\n  --space-7: 64px;\n  --space-8: 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.ds-progress__bar--high { width: 85%; }\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.ds-container {\n  width: 100%;\n  max-width: calc(var(--size-content) + var(--space-4) + var(--space-4));\n  margin: 0 auto;\n  padding: 0 var(--space-4);\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  background: var(--fill-bar);\n  box-shadow: var(--shadow-panel);\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-nav__row {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  height: var(--size-bar);\n}\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  flex: none;\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: 1 1 auto;\n  min-width: 0;\n  max-width: var(--size-search);\n  height: var(--size-row-dense);\n  margin: 0 auto;\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n  transition: var(--transition);\n}\n.ds-nav__search:focus-within,\n.ds-nav__search.is-focus { background: color-mix(in srgb, var(--color-bar-text) 26%, transparent); }\n.ds-nav__field {\n  flex: 1 1 auto;\n  min-width: 0;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  outline: 0;\n  background: transparent;\n  color: inherit;\n  font-family: var(--font-body);\n  font-size: var(--text-ui);\n  appearance: none;\n}\n.ds-nav__field::placeholder { color: color-mix(in srgb, var(--color-bar-text) 72%, transparent); opacity: 1; }\n.ds-nav__links {\n  display: flex;\n  align-self: stretch;\n  flex: none;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__item { display: flex; }\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: 0 var(--space-3);\n  border-top: var(--border-width-strong) var(--border-style) transparent;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  color: color-mix(in srgb, var(--color-bar-text) 76%, transparent);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover { color: var(--color-bar-text); }\n.ds-nav__link.is-current {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-bar-text);\n}\n.ds-strip {\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n}\n.ds-strip__list {\n  display: flex;\n  gap: var(--space-1);\n  margin: 0 calc(var(--space-3) * -1);\n  padding: 0;\n  overflow: auto;\n  list-style: none;\n}\n.ds-strip__link {\n  display: flex;\n  align-items: center;\n  height: var(--size-row-dense);\n  padding: 0 var(--space-3);\n  color: color-mix(in srgb, var(--color-bar-alt-text) 80%, transparent);\n  font-size: var(--text-ui);\n  white-space: nowrap;\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-strip__link:hover,\n.ds-strip__link.is-hover,\n.ds-strip__link.is-current { color: var(--color-bar-alt-text); }\n.ds-strip__link.is-current { font-weight: var(--weight-bold); }\n\n/* layout */\n.ds-main {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-5);\n  padding-top: var(--space-4);\n  padding-bottom: var(--space-6);\n}\n.ds-main--inner { gap: var(--space-4); padding-top: var(--space-3); }\n.ds-layout {\n  display: grid;\n  grid-template-columns: var(--size-side) minmax(0, 1fr);\n  gap: var(--space-4);\n  align-items: start;\n}\n.ds-columns {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: var(--space-4);\n  align-items: stretch;\n}\n.ds-columns--detail { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); align-items: start; }\n.ds-columns--aside { grid-template-columns: minmax(0, 1fr) var(--size-summary); align-items: start; }\n.ds-columns--pair { grid-template-columns: repeat(2, minmax(0, 1fr)); }\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-caption {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-transform: var(--ui-transform);\n}\n\n/* hero */\n.ds-hero {\n  display: grid;\n  grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);\n  gap: var(--space-3);\n}\n.ds-hero__card {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-art);\n  overflow: hidden;\n  border-radius: var(--radius-page);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-hero__body {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n  padding: var(--space-6);\n}\n.ds-hero__label {\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\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  max-width: var(--size-measure);\n  margin: var(--space-3) 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__art {\n  position: relative;\n  min-height: calc(var(--size-media) + var(--size-media));\n  overflow: hidden;\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n}\n.ds-hero__shape {\n  position: absolute;\n  right: -12%;\n  bottom: -30%;\n  width: 78%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: var(--color-fill-2);\n}\n.ds-hero__shape--2 {\n  right: auto;\n  bottom: auto;\n  left: 10%;\n  top: 12%;\n  width: 34%;\n  background: var(--color-fill-3);\n  box-shadow: var(--shadow-panel);\n}\n.ds-hero__shape--3 {\n  right: 30%;\n  bottom: 22%;\n  width: 26%;\n  border: var(--border-width-strong) var(--border-style) color-mix(in srgb, currentColor 80%, transparent);\n  background: transparent;\n}\n.ds-hero__side {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-3);\n}\n.ds-promo {\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n  padding: var(--space-4);\n  border-radius: var(--radius-page);\n  background: var(--color-fill-2);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-accent-text);\n  text-decoration: none;\n}\n.ds-promo--alt { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-promo__title {\n  margin: 0;\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-promo__text {\n  margin: var(--space-1) 0 var(--space-2);\n  font-size: var(--text-ui);\n  line-height: 1.45;\n}\n.ds-promo__link {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n\n/* shelf */\n.ds-shelf {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-3);\n}\n.ds-shelf__head {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-shelf__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-shelf__text {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* page header */\n.ds-page-header {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-2) 0 0;\n}\n.ds-page-header__body { flex: 1 1 0; min-width: 0; }\n.ds-page-header__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\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: var(--color-text-muted);\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-4) 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-prose h1 { margin-top: 0; font-size: var(--text-h1); }\n.ds-prose h2 { font-size: var(--text-h2); }\n.ds-prose h3 { font-size: var(--text-h3); }\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__lead {\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n  line-height: 1.5;\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: grid;\n  gap: var(--space-2);\n  justify-items: start;\n}\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited { color: var(--color-link-visited); }\n.ds-link:hover,\n.ds-link.is-hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n.ds-link:active,\n.ds-link.is-active { color: var(--color-link-active); }\n.ds-link:focus-visible,\n.ds-link.is-focus { outline: var(--focus-ring); }\n.ds-link--quiet,\n.ds-link--quiet:visited {\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-body);\n  text-decoration: var(--link-decoration-quiet);\n}\n\n/* buttons */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\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  white-space: nowrap;\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--secondary { border: var(--border-width) var(--border-style) var(--color-border); }\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) 18%, 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) 86%, 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--small {\n  min-width: 0;\n  height: calc(var(--size-control) - var(--space-1));\n  padding: 0 calc(var(--space-2) + var(--space-1));\n}\n.ds-button--wide { width: 100%; }\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--fab:hover,\n.ds-button--fab.is-hover { box-shadow: var(--shadow-control-pressed); }\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  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-4);\n}\n.ds-form__field { display: block; min-width: 0; }\n.ds-form__label {\n  display: block;\n  margin-bottom: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-form__control {\n  display: block;\n  width: 100%;\n  height: calc(var(--size-control) + var(--space-1));\n  margin: 0;\n  padding: var(--space-1) calc(var(--space-2) + var(--space-1));\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-3);\n  top: calc(var(--size-control) / 2);\n  border: var(--size-stripe) var(--border-style) transparent;\n  border-top-color: var(--color-text-muted);\n  border-bottom: 0;\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.3;\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-2);\n  font-size: var(--text-ui);\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.ds-form__inline {\n  display: flex;\n  align-items: flex-end;\n  gap: var(--space-2);\n}\n.ds-form__inline .ds-form__field { flex: 1 1 0; }\n\n/* table */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th,\n.ds-table td {\n  height: calc(var(--size-row) + var(--space-2));\n  padding: 0 var(--space-3);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  text-align: left;\n  vertical-align: middle;\n}\n.ds-table th:first-child,\n.ds-table td:first-child { padding-left: var(--space-4); }\n.ds-table th:last-child,\n.ds-table td:last-child { padding-right: var(--space-4); }\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  text-transform: var(--ui-transform);\n}\n.ds-table tbody tr:hover,\n.ds-table tbody tr.is-hover { background: var(--color-surface-alt); }\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-weight: var(--weight-bold); }\n.ds-table tfoot td {\n  border-bottom: 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\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: center;\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__thumb {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  flex: none;\n  overflow: hidden;\n  border-radius: var(--radius-control);\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n}\n.ds-list__thumb::after {\n  content: \"\";\n  position: absolute;\n  right: -20%;\n  bottom: -30%;\n  width: 80%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: color-mix(in srgb, currentColor 22%, transparent);\n}\n.ds-list__thumb--2 { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-list__thumb--3 { background: var(--color-fill-3); }\n.ds-list__thumb--4 { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-list__thumb--round {\n  width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  border-radius: 50%;\n  font-size: var(--text-base);\n}\n.ds-list__thumb--round::after { display: none; }\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.45;\n}\n.ds-list__meta {\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  align-items: flex-end;\n  gap: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-rating {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.5;\n}\n.ds-rating__star {\n  width: var(--size-icon-small);\n  height: var(--size-icon-small);\n  flex: none;\n  color: var(--color-warning);\n}\n.ds-price {\n  color: var(--color-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n  font-variant-numeric: tabular-nums;\n}\n.ds-price--large { font-size: var(--text-h1); }\n.ds-price__was {\n  margin-left: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  text-decoration: line-through;\n}\n\n/* panel */\n.ds-panel {\n  display: flex;\n  flex-direction: column;\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__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-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  flex: 1 1 auto;\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.5;\n}\n.ds-panel__body p { margin: 0 0 var(--space-3); }\n.ds-panel__body p:last-child { margin-bottom: 0; }\n.ds-panel__actions {\n  display: flex;\n  gap: var(--space-2);\n  padding: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__actions--end { justify-content: flex-end; padding: var(--space-3) var(--space-4); }\n.ds-panel--form .ds-panel__body { color: var(--color-text); padding-top: var(--space-4); }\n.ds-panel--pad { padding: var(--space-4); }\n.ds-panel--pad .ds-tabs { margin: calc(var(--space-4) * -1) calc(var(--space-4) * -1) var(--space-4); }\n.ds-summary {\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: var(--space-2) var(--space-3);\n  margin: 0 0 var(--space-3);\n  color: var(--color-text);\n}\n.ds-summary__label { margin: 0; color: var(--color-text-muted); }\n.ds-summary__value { margin: 0; text-align: right; font-variant-numeric: tabular-nums; }\n.ds-summary__label--total,\n.ds-summary__value--total {\n  padding-top: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n}\n\n/* stats */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-3);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  display: flex;\n  flex-direction: column-reverse;\n  min-width: 0;\n  padding: var(--space-3) var(--space-4);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-button);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\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: var(--line-heading);\n  font-variant-numeric: tabular-nums;\n}\n.ds-stat__label {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-transform: var(--ui-transform);\n}\n\n/* grid */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(6, minmax(0, 1fr));\n  gap: var(--space-3);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  overflow: hidden;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-grid__media {\n  position: relative;\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  height: var(--size-media);\n  padding: var(--space-2);\n  overflow: hidden;\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n}\n.ds-grid__media::before {\n  content: \"\";\n  position: absolute;\n  left: 16%;\n  bottom: 18%;\n  width: 30%;\n  aspect-ratio: 1;\n  border: var(--border-width-strong) var(--border-style) color-mix(in srgb, currentColor 60%, transparent);\n  border-radius: 50%;\n}\n.ds-grid__media::after {\n  content: \"\";\n  position: absolute;\n  right: -14%;\n  bottom: -28%;\n  width: 70%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: color-mix(in srgb, currentColor 22%, transparent);\n}\n.ds-grid__cell--2 .ds-grid__media { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-grid__cell--3 .ds-grid__media { background: var(--color-fill-3); }\n.ds-grid__cell--4 .ds-grid__media { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-grid__body {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-1);\n  padding: var(--space-3) var(--space-3) var(--space-2);\n}\n.ds-grid__title {\n  color: var(--color-link-quiet);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1.35;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-grid__title:hover { color: var(--color-link-hover); }\n.ds-grid__text {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.5;\n}\n.ds-grid__foot {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: 0 var(--space-3) var(--space-3);\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  margin: 0;\n  padding: 0 var(--space-2);\n  overflow: auto;\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-3);\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  white-space: nowrap;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover { color: var(--color-text); }\n.ds-tabs__tab.is-current {\n  color: var(--color-link);\n  border-bottom-color: var(--color-link);\n}\n\n/* badge */\n.ds-badges {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-badge {\n  position: relative;\n  z-index: 1;\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  white-space: nowrap;\n  text-decoration: none;\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  transition: var(--transition);\n}\n.ds-badge--chip.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n}\n.ds-badge--chip.is-focus,\n.ds-badge--chip:focus-visible { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n\n/* sidebar */\n.ds-sidebar {\n  padding: var(--space-2) 0;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  font-family: var(--font-ui);\n}\n.ds-sidebar__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-4) var(--space-2);\n  color: var(--color-heading-alt);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-sidebar__list {\n  margin: 0 0 var(--space-2);\n  padding: 0 0 var(--space-2);\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-sidebar__list:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: 0; }\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  height: var(--size-row-dense);\n  padding: 0 var(--space-4);\n  border-left: var(--size-stripe) var(--border-style) transparent;\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  border-left-color: var(--color-link);\n  background: var(--color-surface-alt);\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__count { color: var(--color-text-muted); font-size: var(--text-small); font-weight: var(--weight-body); }\n.ds-sidebar__checks {\n  display: grid;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-4) var(--space-3);\n  color: var(--color-text);\n}\n\n/* notice */\n.ds-notices {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-3);\n}\n.ds-notice {\n  padding: var(--space-3) var(--space-4);\n  border-left: var(--size-stripe) var(--border-style) var(--color-link);\n  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.5;\n}\n.ds-notice__title {\n  display: block;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n}\n.ds-notice--error {\n  border-left-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-danger);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: var(--space-2);\n  list-style: none;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n}\n.ds-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-control);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover { background: color-mix(in srgb, var(--color-text-muted) 18%, 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  background: transparent;\n  color: var(--color-disabled-text);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\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/* product */\n.ds-product {\n  position: relative;\n  display: grid;\n  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);\n  border-radius: var(--radius-page);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-product__gallery {\n  display: grid;\n  grid-template-rows: 1fr auto;\n  gap: var(--space-2);\n  padding: var(--space-2);\n}\n.ds-product__media {\n  position: relative;\n  min-height: calc(var(--size-media) + var(--size-media));\n  overflow: hidden;\n  border-radius: var(--radius-panel);\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n}\n.ds-product__thumbs {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-2);\n}\n.ds-product__thumbs .ds-list__thumb { width: 100%; }\n.ds-product__thumbs .ds-list__thumb.is-current { outline: var(--border-width-strong) var(--border-style) var(--color-link); outline-offset: calc(var(--border-width-strong) * -1); }\n.ds-product__fab {\n  position: absolute;\n  left: calc(41.666% - var(--size-fab) / 2);\n  top: var(--space-5);\n}\n.ds-product__body {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-3);\n  padding: var(--space-5) var(--space-6) var(--space-5) calc(var(--space-6) + var(--space-2));\n}\n.ds-product__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-product__text { max-width: var(--size-measure); margin: 0; color: var(--color-text-muted); }\n.ds-product__options { width: 100%; max-width: var(--size-summary); }\n.ds-ratings {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-ratings__row {\n  display: grid;\n  grid-template-columns: var(--space-4) minmax(0, 1fr) var(--space-5);\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-variant-numeric: tabular-nums;\n}\n.ds-meter {\n  display: block;\n  height: var(--size-meter);\n  overflow: hidden;\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n}\n.ds-meter__bar {\n  display: block;\n  width: 72%;\n  height: 100%;\n  background: var(--color-button);\n}\n.ds-meter__bar--2 { width: 18%; }\n.ds-meter__bar--3 { width: 6%; }\n.ds-meter__bar--4 { width: 3%; }\n\n/* steps */\n.ds-steps {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  list-style: none;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-steps__step {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text-muted);\n  white-space: nowrap;\n}\n.ds-steps__step + .ds-steps__step::before {\n  content: \"\";\n  width: var(--space-7);\n  margin-right: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border-strong);\n}\n.ds-steps__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: calc(var(--size-badge) + var(--space-1));\n  height: calc(var(--size-badge) + var(--space-1));\n  flex: none;\n  border-radius: 50%;\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-steps__step.is-done .ds-steps__mark,\n.ds-steps__step.is-current .ds-steps__mark {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n}\n.ds-steps__step.is-current { color: var(--color-text); font-weight: var(--weight-bold); }\n.ds-steps__step.is-done { color: var(--color-text); }\n\n/* dialog */\n.ds-overlay {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-5) var(--space-4);\n  border-radius: var(--radius-panel);\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-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-dialog__body {\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\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/* snackbar */\n.ds-snackbar {\n  position: sticky;\n  bottom: var(--space-4);\n  z-index: 2;\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  width: fit-content;\n  max-width: 100%;\n  min-height: var(--size-row);\n  padding: var(--space-1) var(--space-2) var(--space-1) var(--space-4);\n  border-radius: var(--radius-control);\n  background: var(--fill-inverse);\n  box-shadow: var(--shadow-dialog);\n  color: var(--color-inverse-text);\n  font-size: var(--text-ui);\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-snackbar__action,\n.ds-snackbar__action:hover {\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: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n}\n.ds-snackbar__action:hover,\n.ds-snackbar__action.is-hover { background: color-mix(in srgb, var(--color-inverse-text) 16%, transparent); }\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-thumb);\n  height: var(--size-thumb);\n  margin-bottom: var(--space-3);\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-text-muted);\n}\n.ds-empty__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-empty__text {\n  max-width: var(--size-dialog);\n  margin: var(--space-1) 0 var(--space-3);\n  font-size: var(--text-ui);\n}\n\n/* footer */\n.ds-footer {\n  padding: var(--space-5) 0 var(--space-4);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-ui);\n}\n.ds-footer__cols {\n  display: grid;\n  grid-template-columns: 2fr 1fr 1fr 1fr;\n  gap: var(--space-5);\n}\n.ds-footer__col { min-width: 0; }\n.ds-footer__title {\n  margin: 0 0 var(--space-2);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-footer__text {\n  max-width: var(--size-summary);\n  margin: 0;\n  color: color-mix(in srgb, var(--color-inverse-text) 74%, transparent);\n}\n.ds-footer__list { margin: 0; padding: 0; list-style: none; }\n.ds-footer__link {\n  display: block;\n  color: color-mix(in srgb, var(--color-inverse-text) 74%, transparent);\n  line-height: 1.9;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover { color: var(--color-inverse-text); }\n.ds-footer__legal {\n  margin: var(--space-5) 0 0;\n  padding-top: var(--space-3);\n  border-top: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-inverse-text) 24%, transparent);\n  color: color-mix(in srgb, var(--color-inverse-text) 74%, transparent);\n  font-size: var(--text-small);\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=\"#shop\"],\n.ds-page:has(#shop:target) .ds-nav__link[href=\"#shop\"],\n.ds-page:has(#browse:target) .ds-nav__link[href=\"#shop\"],\n.ds-page:has(#product:target) .ds-nav__link[href=\"#shop\"],\n.ds-page:has(#basket:target) .ds-nav__link[href=\"#basket\"],\n.ds-page:has(#checkout:target) .ds-nav__link[href=\"#basket\"],\n.ds-page:has(#orders:target) .ds-nav__link[href=\"#orders\"] {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-bar-text);\n}\n.ds-page:has(#browse:target) .ds-strip__link[href=\"#browse\"],\n.ds-page:has(#product:target) .ds-strip__link[href=\"#browse\"] {\n  color: var(--color-bar-alt-text);\n  font-weight: var(--weight-bold);\n}\n\n@media (max-width: 1100px) {\n  .ds-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n  .ds-hero { grid-template-columns: minmax(0, 1fr); }\n  .ds-hero__side { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .ds-hero__card { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }\n}\n@media (max-width: 900px) {\n  .ds-layout,\n  .ds-columns,\n  .ds-columns--detail,\n  .ds-columns--aside,\n  .ds-columns--pair { grid-template-columns: minmax(0, 1fr); }\n  .ds-product { grid-template-columns: minmax(0, 1fr); }\n  .ds-product__fab { left: auto; right: var(--space-4); top: calc(var(--size-media) + var(--size-media) - var(--size-fab) / 2 + var(--space-2)); }\n  .ds-product__body { padding: var(--space-5) var(--space-4) var(--space-4); }\n  .ds-sidebar__checks { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .ds-page-header { flex-direction: column; align-items: flex-start; }\n  .ds-footer__cols { grid-template-columns: 1fr 1fr; }\n  .ds-steps__step + .ds-steps__step::before { width: var(--space-4); }\n}\n@media (max-width: 600px) {\n  .ds-container { padding: 0 var(--space-3); }\n  .ds-nav__row {\n    flex-wrap: wrap;\n    gap: 0 var(--space-2);\n    height: auto;\n    padding-bottom: var(--space-2);\n  }\n  .ds-brand { height: calc(var(--size-bar) - var(--space-2)); margin-right: auto; }\n  .ds-nav__links { order: 1; align-self: auto; height: calc(var(--size-bar) - var(--space-2)); }\n  .ds-nav__link { padding: 0 var(--space-2); }\n  .ds-nav__label { display: none; }\n  .ds-nav__search { order: 2; flex: 1 1 100%; max-width: none; }\n  .ds-main { gap: var(--space-4); padding-top: var(--space-3); }\n  .ds-hero__card { grid-template-columns: minmax(0, 1fr); }\n  .ds-hero__art { order: -1; min-height: var(--size-media); }\n  .ds-hero__body { padding: var(--space-4); }\n  .ds-hero__title { font-size: var(--text-h1); }\n  .ds-hero__lead { font-size: var(--text-base); }\n  .ds-hero__side { grid-template-columns: minmax(0, 1fr); }\n  .ds-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); }\n  .ds-grid__media { height: calc(var(--size-media) * 0.66); }\n  .ds-grid__body { padding: var(--space-2) var(--space-2) var(--space-1); }\n  .ds-grid__foot { flex-wrap: wrap; padding: 0 var(--space-2) var(--space-2); }\n  .ds-shelf__text { display: none; }\n  .ds-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); }\n  .ds-stat { padding: var(--space-3); }\n  .ds-notices { grid-template-columns: minmax(0, 1fr); }\n  .ds-form__row { grid-template-columns: minmax(0, 1fr); }\n  .ds-table th,\n  .ds-table td { padding: 0 var(--space-2); }\n  .ds-table th:first-child,\n  .ds-table td:first-child { padding-left: var(--space-3); }\n  .ds-table th:last-child,\n  .ds-table td:last-child { padding-right: var(--space-3); }\n  .ds-table .ds-table__extra { display: none; }\n  .ds-list__item { padding: var(--space-3); }\n  .ds-list__thumb { width: var(--size-row); height: var(--size-row); }\n  .ds-panel--pad { padding: var(--space-3); }\n  .ds-panel--pad .ds-tabs { margin: calc(var(--space-3) * -1) calc(var(--space-3) * -1) var(--space-3); }\n  .ds-steps { gap: var(--space-2); padding: var(--space-3); }\n  .ds-steps__step:not(.is-current) .ds-steps__label { display: none; }\n  .ds-steps__step + .ds-steps__step::before { width: var(--space-3); margin-right: 0; }\n  .ds-overlay { padding: var(--space-4) var(--space-3); }\n  .ds-footer__cols { gap: var(--space-4) var(--space-3); }\n  .ds-snackbar { gap: var(--space-2); padding-left: var(--space-3); }\n}\n\n.ds-menu--account { margin-left: var(--space-2); }\n.ds-nav__row > .ds-menu { order: 1; }\n\n/* ---------- phones: the snackbar is a bar along the window's bottom edge, as on a handset, not a card floating over the column ---------- */\n@media (max-width: 600px) {\n  .ds-snackbar {\n    bottom: 0;\n    width: auto;\n    max-width: none;\n    margin: 0 calc(var(--space-3) * -1);\n    border-radius: 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 tea shop</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <div class=\"ds-container ds-nav__row\">\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    <label 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      <input class=\"ds-nav__field\" type=\"search\" placeholder=\"Search teas and teaware\" aria-label=\"Search\">\n    </label>\n    <ul class=\"ds-nav__links\">\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#shop\">\n        <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 8h14l-1 12H6zM9 8a3 3 0 0 1 6 0\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        <span class=\"ds-nav__label\">Shop</span></a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#basket\">\n        <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 5h2l2 10h10l2-7H7\" stroke=\"currentColor\" fill=\"none\"/><circle cx=\"9\" cy=\"19\" r=\"1.4\" stroke=\"currentColor\" fill=\"none\"/><circle cx=\"17\" cy=\"19\" r=\"1.4\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        <span class=\"ds-nav__label\">Basket</span> <span class=\"ds-badge\">4</span></a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#orders\">\n        <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 3h12v18l-3-2-3 2-3-2-3 2zM9 8h6M9 12h6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        <span class=\"ds-nav__label\">Orders</span></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=\"#orders\">Your orders</a></li>\n        <li><a class=\"ds-menu__link\" href=\"#basket\">Basket</a></li>\n        <li><a class=\"ds-menu__link\" href=\"#checkout\">Check out</a></li>\n      </ul>\n    </details>\n  </div>\n  <nav class=\"ds-strip\" aria-label=\"Departments\">\n    <div class=\"ds-container\">\n      <ul class=\"ds-strip__list\">\n        <li><a class=\"ds-strip__link\" href=\"#browse\">Black tea</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Green tea</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Oolong</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Herbal</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Teaware</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Gifts</a></li>\n        <li><a class=\"ds-strip__link\" href=\"#shop\">Sale</a></li>\n      </ul>\n    </div>\n  </nav>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"shop\">\n  <div class=\"ds-container ds-main\">\n\n    <div class=\"ds-hero\" data-component=\"hero\">\n      <div class=\"ds-hero__card\">\n        <div class=\"ds-hero__body\">\n          <p class=\"ds-hero__label\">Spring harvest</p>\n          <h1 class=\"ds-hero__title\">The first flush teas are in</h1>\n          <p class=\"ds-hero__lead\">Twelve small lots picked in March, packed in tins of 50 and 100 grams and sent the next working day.</p>\n          <div class=\"ds-buttons\">\n            <a class=\"ds-button\" href=\"#browse\">Shop the harvest</a>\n            <a class=\"ds-button ds-button--flat\" href=\"#product\">Read the tasting notes</a>\n          </div>\n        </div>\n        <div class=\"ds-hero__art\" aria-hidden=\"true\">\n          <span class=\"ds-hero__shape\"></span>\n          <span class=\"ds-hero__shape ds-hero__shape--2\"></span>\n          <span class=\"ds-hero__shape ds-hero__shape--3\"></span>\n        </div>\n      </div>\n      <div class=\"ds-hero__side\">\n        <a class=\"ds-promo\" href=\"#browse\">\n          <h2 class=\"ds-promo__title\">Teaware, 20% off</h2>\n          <p class=\"ds-promo__text\">Glass pots, strainers and cups until Sunday.</p>\n          <span class=\"ds-promo__link\">Shop teaware</span>\n        </a>\n        <a class=\"ds-promo ds-promo--alt\" href=\"#product\">\n          <h2 class=\"ds-promo__title\">Tea of the month</h2>\n          <p class=\"ds-promo__text\">A smoked black tea with a long, sweet finish.</p>\n          <span class=\"ds-promo__link\">See the tea</span>\n        </a>\n      </div>\n    </div>\n\n    <section class=\"ds-shelf\">\n      <div class=\"ds-shelf__head\">\n        <div>\n          <h2 class=\"ds-shelf__title\">New this week</h2>\n          <p class=\"ds-shelf__text\">Fresh lots, added on Monday.</p>\n        </div>\n        <a class=\"ds-button ds-button--flat\" href=\"#browse\">See all</a>\n      </div>\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media\"><span class=\"ds-badge ds-badge--new\">New</span></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">Smoked black tea</a>\n            <p class=\"ds-grid__text\">Loose leaf, 100 g tin</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.6 (128)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€9.50</span><a class=\"ds-button ds-button--small\" href=\"#basket\">Add</a></div>\n        </article>\n        <article class=\"ds-grid__cell ds-grid__cell--2\">\n          <div class=\"ds-grid__media\"><span class=\"ds-badge ds-badge--new\">New</span></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">First flush green</a>\n            <p class=\"ds-grid__text\">Loose leaf, 50 g tin</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.8 (64)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€14.00</span><a class=\"ds-button ds-button--small is-hover\" href=\"#basket\">Add</a></div>\n        </article>\n        <article class=\"ds-grid__cell ds-grid__cell--3\">\n          <div class=\"ds-grid__media\"></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">Breakfast blend</a>\n            <p class=\"ds-grid__text\">Loose leaf, 250 g bag</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.4 (311)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€12.00</span><a class=\"ds-button ds-button--small is-active\" href=\"#basket\">Add</a></div>\n        </article>\n        <article class=\"ds-grid__cell ds-grid__cell--4\">\n          <div class=\"ds-grid__media\"><span class=\"ds-badge\">Sale</span></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">Glass teapot</a>\n            <p class=\"ds-grid__text\">600 ml, with strainer</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.7 (92)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€22.40</span><a class=\"ds-button ds-button--small\" href=\"#basket\">Add</a></div>\n        </article>\n        <article class=\"ds-grid__cell\">\n          <div class=\"ds-grid__media\"></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">Roasted oolong</a>\n            <p class=\"ds-grid__text\">Loose leaf, 100 g tin</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.5 (47)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€11.00</span><a class=\"ds-button ds-button--small\" href=\"#basket\">Add</a></div>\n        </article>\n        <article class=\"ds-grid__cell ds-grid__cell--3\">\n          <div class=\"ds-grid__media\"><span class=\"ds-badge ds-badge--warning\">Last tins</span></div>\n          <div class=\"ds-grid__body\">\n            <a class=\"ds-grid__title\" href=\"#product\">Mint and verbena</a>\n            <p class=\"ds-grid__text\">Herbal, 80 g tin</p>\n            <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.3 (75)</span>\n          </div>\n          <div class=\"ds-grid__foot\"><span class=\"ds-price\">€7.50</span><a class=\"ds-button ds-button--small\" href=\"#basket\">Add</a></div>\n        </article>\n      </div>\n    </section>\n\n    <div class=\"ds-columns\">\n      <div class=\"ds-panel\" data-component=\"panel\">\n        <h3 class=\"ds-panel__title\">Free delivery over €40</h3>\n        <div class=\"ds-panel__body\">\n          <p>Orders placed before two in the afternoon leave the same day. Smaller orders travel for a flat €3.90.</p>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#basket\">View basket</a>\n          <a class=\"ds-button ds-button--flat\" href=\"#orders\">Track an order</a>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">Brew it right</h3>\n        <div class=\"ds-panel__body\">\n          <p>Water temperature, leaf weight and steeping time for every tea we sell, printed on the tin and on each product page.</p>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#product\">Read a brewing guide</a>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">The monthly list</h3>\n        <div class=\"ds-panel__body\">\n          <p>One letter a month with the new lots and a voucher.</p>\n          <div class=\"ds-form__inline\">\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Email address</span>\n              <input class=\"ds-form__control\" type=\"email\" value=\"mira@example.org\">\n            </label>\n            <a class=\"ds-button ds-button--secondary\" href=\"#shop\">Subscribe</a>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"ds-snackbar\" role=\"status\">\n      <span>Smoked black tea was added to your basket.</span>\n      <a class=\"ds-snackbar__action\" href=\"#basket\">View basket</a>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"browse\">\n  <div class=\"ds-container ds-main ds-main--inner\">\n\n    <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#shop\">Shop</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#browse\">Tea</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Black tea</li>\n    </ol>\n\n    <header class=\"ds-page-header\" data-component=\"page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Black tea</h1>\n        <p class=\"ds-page-header__text\">24 teas, from light first flush leaves to smoked and malty breakfast blends.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#basket\">View basket</a>\n      </div>\n    </header>\n\n    <div class=\"ds-layout\">\n      <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n        <h2 class=\"ds-sidebar__title\">Tea</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li><a class=\"ds-sidebar__link is-current\" href=\"#browse\">Black tea <span class=\"ds-sidebar__count\">24</span></a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#browse\">Green tea <span class=\"ds-sidebar__count\">31</span></a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#browse\">Oolong <span class=\"ds-sidebar__count\">12</span></a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#browse\">Herbal <span class=\"ds-sidebar__count\">18</span></a></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#browse\">Teaware <span class=\"ds-badge ds-badge--new\">New</span></a></li>\n        </ul>\n        <h2 class=\"ds-sidebar__title\">Show only</h2>\n        <div class=\"ds-sidebar__checks\">\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked><span>In stock</span></label>\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\"><span>Organic</span></label>\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked><span>Loose leaf</span></label>\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\"><span>Gift tins</span></label>\n        </div>\n      </aside>\n\n      <div class=\"ds-panel\">\n        <ul class=\"ds-tabs\" data-component=\"tabs\">\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#browse\">All</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#browse\">New</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#browse\">On sale</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#browse\">Top rated</a></li>\n        </ul>\n        <ul class=\"ds-list\" data-component=\"list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">Smoked black tea</a>\n              <span class=\"ds-list__text\">Dried over pine wood. Deep, sweet and a little resinous.</span>\n              <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.6 (128)</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€9.50</span>100 g tin</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb ds-list__thumb--3\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">Breakfast blend</a>\n              <span class=\"ds-list__text\">Three malty teas for a strong first cup, with or without milk.</span>\n              <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.4 (311)</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€12.00</span>250 g bag</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb ds-list__thumb--2\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">First flush, garden lot 7</a>\n              <span class=\"ds-list__text\">Picked in March. Pale, floral and best without milk.</span>\n              <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.8 (39)</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€16.00</span>50 g tin</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb ds-list__thumb--4\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">Bergamot black tea</a>\n              <span class=\"ds-list__text\">Scented with cold pressed bergamot oil, nothing else.</span>\n              <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.5 (204)</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€8.00</span>100 g tin</span>\n          </li>\n        </ul>\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li><a class=\"ds-pagination__link is-disabled\" href=\"#browse\" 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=\"#browse\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#browse\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#browse\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#browse\" aria-label=\"Next\">\n            <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n          </a></li>\n        </ul>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"product\">\n  <div class=\"ds-container ds-main ds-main--inner\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#shop\">Shop</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#browse\">Black tea</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Smoked black tea</li>\n    </ol>\n\n    <div class=\"ds-product\">\n      <div class=\"ds-product__gallery\">\n        <div class=\"ds-product__media\" aria-hidden=\"true\">\n          <span class=\"ds-hero__shape\"></span>\n          <span class=\"ds-hero__shape ds-hero__shape--2\"></span>\n          <span class=\"ds-hero__shape ds-hero__shape--3\"></span>\n        </div>\n        <div class=\"ds-product__thumbs\" aria-hidden=\"true\">\n          <span class=\"ds-list__thumb is-current\"></span>\n          <span class=\"ds-list__thumb ds-list__thumb--2\"></span>\n          <span class=\"ds-list__thumb ds-list__thumb--3\"></span>\n          <span class=\"ds-list__thumb ds-list__thumb--4\"></span>\n        </div>\n      </div>\n      <a class=\"ds-button ds-button--fab ds-product__fab ds-tooltip ds-tooltip--left\" href=\"#basket\" aria-label=\"Add to basket\"><span class=\"ds-tooltip__text\" role=\"tooltip\">Add to basket</span>\n        <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" fill=\"none\"/></svg>\n      </a>\n      <div class=\"ds-product__body\">\n        <p class=\"ds-caption\">Black tea, loose leaf</p>\n        <h1 class=\"ds-product__title\">Smoked black tea</h1>\n        <span class=\"ds-rating\"><svg class=\"ds-rating__star\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3l2.7 5.8 6.3.8-4.6 4.3 1.2 6.2L12 17l-5.6 3.1 1.2-6.2L3 9.6l6.3-.8z\" fill=\"currentColor\"/></svg>4.6 from 128 reviews</span>\n        <p class=\"ds-product__text\">Whole leaves dried slowly over pine wood. The cup is dark amber, sweet and resinous, and stands up to milk.</p>\n        <div class=\"ds-badges\">\n          <a class=\"ds-badge ds-badge--chip\" href=\"#product\">50 g</a>\n          <a class=\"ds-badge ds-badge--chip is-current\" href=\"#product\">100 g</a>\n          <a class=\"ds-badge ds-badge--chip is-focus\" href=\"#product\">250 g</a>\n          <span class=\"ds-badge ds-badge--success\">In stock</span>\n        </div>\n        <span class=\"ds-price ds-price--large\">€9.50 <span class=\"ds-price__was\">€11.00</span></span>\n        <div class=\"ds-form__inline ds-product__options\">\n          <label class=\"ds-form__field\">\n            <span class=\"ds-form__label\">Quantity</span>\n            <span class=\"ds-form__select\">\n              <select class=\"ds-form__control\">\n                <option>1 tin</option>\n                <option>2 tins</option>\n                <option>3 tins</option>\n              </select>\n            </span>\n          </label>\n          <a class=\"ds-button\" href=\"#basket\">Add to basket</a>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"ds-columns ds-columns--detail\">\n      <div class=\"ds-panel ds-panel--pad\">\n        <ul class=\"ds-tabs\">\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#product\">Description</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#product\">Brewing</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#product\">Reviews <span class=\"ds-badge\">128</span></a></li>\n        </ul>\n        <article class=\"ds-prose\" data-component=\"typography\">\n          <h1>About this tea</h1>\n          <p class=\"ds-prose__lead\">A mountain tea from a single garden, smoked the old way in a wooden loft above a slow pine fire.</p>\n          <h2>How to brew it</h2>\n          <p>Use water just off the boil and give the leaves room to open. The tea is forgiving: a minute too long makes it stronger, not bitter. See the <a href=\"#browse\">other black teas</a> if you prefer a lighter cup.</p>\n          <ul>\n            <li>3 grams of leaf for a 250 ml cup.</li>\n            <li>Water at 95 degrees, four minutes.</li>\n            <li>A second, shorter infusion is worth making.</li>\n          </ul>\n          <h3>Keeping it fresh</h3>\n          <p>Store the tin closed, away from light and spices. Enter <code>FLUSH10</code> at the basket for a tenth off your first order.</p>\n        </article>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">What buyers say</h3>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-ratings\">\n              <li class=\"ds-ratings__row\"><span>5</span><span class=\"ds-meter\"><span class=\"ds-meter__bar\"></span></span><span>92</span></li>\n              <li class=\"ds-ratings__row\"><span>4</span><span class=\"ds-meter\"><span class=\"ds-meter__bar ds-meter__bar--2\"></span></span><span>23</span></li>\n              <li class=\"ds-ratings__row\"><span>3</span><span class=\"ds-meter\"><span class=\"ds-meter__bar ds-meter__bar--3\"></span></span><span>8</span></li>\n              <li class=\"ds-ratings__row\"><span>2</span><span class=\"ds-meter\"><span class=\"ds-meter__bar ds-meter__bar--4\"></span></span><span>5</span></li>\n            </ul>\n          </div>\n          <ul class=\"ds-list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__thumb ds-list__thumb--round ds-list__thumb--3\">I</span>\n              <span class=\"ds-list__body\">\n                <span class=\"ds-list__title\">Ines Okafor</span>\n                <span class=\"ds-list__text\">Smoky without tasting of ash. My morning tea now.</span>\n              </span>\n              <span class=\"ds-list__meta\">12 Mar</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__thumb ds-list__thumb--round ds-list__thumb--2\">T</span>\n              <span class=\"ds-list__body\">\n                <span class=\"ds-list__title\">Tomas Lind</span>\n                <span class=\"ds-list__text\">Good with milk. The tin arrived in two days.</span>\n              </span>\n              <span class=\"ds-list__meta\">3 Mar</span>\n            </li>\n          </ul>\n        </div>\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Goes well with</h3>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-links\" data-component=\"links\">\n              <a class=\"ds-link\" href=\"#product\">Glass teapot, 600 ml</a>\n              <a class=\"ds-link is-visited\" href=\"#product\">Breakfast blend</a>\n              <a class=\"ds-link is-hover\" href=\"#product\">Paper filters, 100 pieces</a>\n              <a class=\"ds-link is-active\" href=\"#product\">Roasted oolong</a>\n              <a class=\"ds-link ds-link--quiet\" href=\"#browse\">All black teas</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"basket\">\n  <div class=\"ds-container ds-main ds-main--inner\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#shop\">Shop</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Basket</li>\n    </ol>\n\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Your basket</h1>\n        <p class=\"ds-page-header__text\">Five items. Prices include tax; delivery is added at the next step.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#browse\">Keep shopping</a>\n        <a class=\"ds-button\" href=\"#checkout\">Check out</a>\n      </div>\n    </header>\n\n    <div class=\"ds-notices\" data-component=\"notice\">\n      <div class=\"ds-notice\">\n        <strong class=\"ds-notice__title\">€2.50 short of free delivery</strong>\n        Add one more small item and this order travels free.\n        <span class=\"ds-progress\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Towards free delivery\"><span class=\"ds-progress__bar ds-progress__bar--high\"></span></span>\n      </div>\n      <div class=\"ds-notice ds-notice--error\">\n        <strong class=\"ds-notice__title\">One item is sold out</strong>\n        The glass teapot cannot be ordered. Remove it to check out.\n      </div>\n    </div>\n\n    <div class=\"ds-columns ds-columns--aside\">\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>Item</th><th class=\"ds-table__extra\">Size</th><th>Status</th><th class=\"ds-table__num\">Qty</th><th class=\"ds-table__num ds-table__extra\">Price</th><th class=\"ds-table__num\">Total</th></tr>\n            </thead>\n            <tbody>\n              <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#product\">Smoked black tea</a></td><td class=\"ds-table__extra\">100 g tin</td><td><span class=\"ds-badge ds-badge--success\">In stock</span></td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">€9.50</td><td class=\"ds-table__num\">€9.50</td></tr>\n              <tr class=\"is-current\"><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#product\">Breakfast blend</a></td><td class=\"ds-table__extra\">250 g bag</td><td><span class=\"ds-badge ds-badge--success\">In stock</span></td><td class=\"ds-table__num\">2</td><td class=\"ds-table__num ds-table__extra\">€12.00</td><td class=\"ds-table__num\">€24.00</td></tr>\n              <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#product\">First flush green</a></td><td class=\"ds-table__extra\">50 g tin</td><td><span class=\"ds-badge ds-badge--warning\">Two left</span></td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">€14.00</td><td class=\"ds-table__num\">€14.00</td></tr>\n              <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#product\">Glass teapot</a></td><td class=\"ds-table__extra\">600 ml</td><td><span class=\"ds-badge ds-badge--danger\">Sold out</span></td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">€22.40</td><td class=\"ds-table__num\">€0.00</td></tr>\n              <tr><td class=\"ds-table__name\"><a class=\"ds-link ds-link--quiet\" href=\"#product\">Paper filters</a></td><td class=\"ds-table__extra\">100 pieces</td><td><span class=\"ds-badge ds-badge--success\">In stock</span></td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">€3.50</td><td class=\"ds-table__num\">€3.50</td></tr>\n            </tbody>\n          </table>\n        </div>\n        <p class=\"ds-caption\">Stock labels</p>\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">4</span>\n          <span class=\"ds-badge ds-badge--success\">In stock</span>\n          <span class=\"ds-badge ds-badge--warning\">Two left</span>\n          <span class=\"ds-badge ds-badge--danger\">Sold out</span>\n          <span class=\"ds-badge ds-badge--new\">New</span>\n          <span class=\"ds-badge ds-badge--chip\">Loose leaf</span>\n          <span class=\"ds-badge ds-badge--chip\">Gift tin</span>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Order summary</h3>\n          <div class=\"ds-panel__body\">\n            <dl class=\"ds-summary\">\n              <dt class=\"ds-summary__label\">Four items</dt><dd class=\"ds-summary__value\">€51.00</dd>\n              <dt class=\"ds-summary__label\">Voucher FLUSH10</dt><dd class=\"ds-summary__value\">-€5.10</dd>\n              <dt class=\"ds-summary__label\">Delivery</dt><dd class=\"ds-summary__value\">€3.90</dd>\n              <dt class=\"ds-summary__label ds-summary__label--total\">Total</dt><dd class=\"ds-summary__value ds-summary__value--total\">€49.80</dd>\n            </dl>\n            <a class=\"ds-button ds-button--wide\" href=\"#checkout\">Check out</a>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Sent tomorrow</h3>\n          <div class=\"ds-panel__body\">\n            <p>Orders placed before two in the afternoon leave the same day, in a paper box without plastic.</p>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#orders\">Delivery times</a>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"checkout\">\n  <div class=\"ds-container ds-main ds-main--inner\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#shop\">Shop</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#basket\">Basket</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Check out</li>\n    </ol>\n\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Check out</h1>\n        <p class=\"ds-page-header__text\">Where should the parcel go? You can review the order before paying.</p>\n      </div>\n      <div class=\"ds-page-header__actions ds-buttons\" data-component=\"buttons\">\n        <button class=\"ds-button ds-button--danger\" type=\"button\">Empty basket</button>\n        <a class=\"ds-button ds-button--secondary\" href=\"#basket\">Back to basket</a>\n        <button class=\"ds-button is-disabled\" type=\"button\" disabled>Place order</button>\n        <a class=\"ds-button\" href=\"#orders\">Save address</a>\n      </div>\n    </header>\n\n    <ol class=\"ds-steps\">\n      <li class=\"ds-steps__step is-done\"><span class=\"ds-steps__mark\">1</span><span class=\"ds-steps__label\">Basket</span></li>\n      <li class=\"ds-steps__step is-current\"><span class=\"ds-steps__mark\">2</span><span class=\"ds-steps__label\">Address</span></li>\n      <li class=\"ds-steps__step\"><span class=\"ds-steps__mark\">3</span><span class=\"ds-steps__label\">Delivery</span></li>\n      <li class=\"ds-steps__step\"><span class=\"ds-steps__mark\">4</span><span class=\"ds-steps__label\">Payment</span></li>\n    </ol>\n\n    <div class=\"ds-columns ds-columns--aside\">\n      <div class=\"ds-panel ds-panel--form\">\n        <div class=\"ds-panel__body\">\n          <form class=\"ds-form\" data-component=\"form\">\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__field\">\n                <span class=\"ds-form__label\">Full name</span>\n                <input class=\"ds-form__control\" type=\"text\" value=\"Mira Okafor\">\n              </label>\n              <label class=\"ds-form__field is-invalid\">\n                <span class=\"ds-form__label\">Email</span>\n                <input class=\"ds-form__control\" type=\"text\" value=\"mira@example\">\n                <span class=\"ds-form__error\">Enter a complete email address.</span>\n              </label>\n            </div>\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__field\">\n                <span class=\"ds-form__label\">Street and number</span>\n                <input class=\"ds-form__control is-focus\" type=\"text\" value=\"14 Mill Lane\">\n              </label>\n              <label class=\"ds-form__field\">\n                <span class=\"ds-form__label\">Country</span>\n                <span class=\"ds-form__select\">\n                  <select class=\"ds-form__control\">\n                    <option>Ireland</option>\n                    <option>Portugal</option>\n                    <option>Somewhere else</option>\n                  </select>\n                </span>\n              </label>\n            </div>\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Note for the courier</span>\n              <textarea class=\"ds-form__control ds-form__control--area\">Leave the parcel with the neighbour at number 16.</textarea>\n              <span class=\"ds-form__hint\">Printed on the label, up to 120 characters.</span>\n            </label>\n            <label class=\"ds-form__check\">\n              <input class=\"ds-form__checkbox\" type=\"checkbox\" checked>\n              <span>Use this address for the invoice too</span>\n            </label>\n            <label class=\"ds-form__check\"><span class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></span><span>Send me the monthly list</span></label>\n          </form>\n        </div>\n        <div class=\"ds-panel__actions ds-panel__actions--end\">\n          <a class=\"ds-button ds-button--flat\" href=\"#basket\">Back</a>\n          <a class=\"ds-button\" href=\"#orders\">Continue to delivery</a>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Your order</h3>\n          <div class=\"ds-panel__body\">\n            <dl class=\"ds-summary\">\n              <dt class=\"ds-summary__label\">Four items</dt><dd class=\"ds-summary__value\">€45.90</dd>\n              <dt class=\"ds-summary__label\">Delivery</dt><dd class=\"ds-summary__value\">€3.90</dd>\n              <dt class=\"ds-summary__label ds-summary__label--total\">Total</dt><dd class=\"ds-summary__value ds-summary__value--total\">€49.80</dd>\n            </dl>\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\">Empty the basket?</h3>\n            <div class=\"ds-dialog__body\">\n              <p>All five items are removed and the voucher goes back to your account.</p>\n            </div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--flat\" href=\"#checkout\">Keep them</a>\n              <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#shop\">Empty basket</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"orders\">\n  <div class=\"ds-container ds-main ds-main--inner\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#shop\">Shop</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#orders\">Account</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Orders</li>\n    </ol>\n\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Your orders</h1>\n        <p class=\"ds-page-header__text\">Parcels on their way, past orders and returns for Mira Okafor.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#browse\">Shop tea</a>\n      </div>\n    </header>\n\n    <ul class=\"ds-stats\" data-component=\"stats\">\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">0</span><span class=\"ds-stat__label\">Open orders</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">5</span><span class=\"ds-stat__label\">In the basket</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">120</span><span class=\"ds-stat__label\">Leaf points</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">€5.10</span><span class=\"ds-stat__label\">Voucher credit</span></li>\n    </ul>\n\n    <div class=\"ds-panel\">\n      <ul class=\"ds-tabs\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#orders\">Open</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#orders\">Delivered</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#orders\">Returned</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=\"M6 3h12v18l-3-2-3 2-3-2-3 2zM9 8h6M9 12h6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n        </span>\n        <h3 class=\"ds-empty__title\">No open orders</h3>\n        <p class=\"ds-empty__text\">When you check out, the parcel and its tracking number appear here.</p>\n        <a class=\"ds-button ds-button--flat\" href=\"#basket\">Go to your basket</a>\n      </div>\n    </div>\n\n    <div class=\"ds-columns ds-columns--pair\">\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">Recently viewed</h3>\n        <ul class=\"ds-list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">Smoked black tea</a>\n              <span class=\"ds-list__text\">Loose leaf, 100 g tin</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€9.50</span>Today</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__thumb ds-list__thumb--2\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#product\">First flush green</a>\n              <span class=\"ds-list__text\">Loose leaf, 50 g tin</span>\n            </span>\n            <span class=\"ds-list__meta\"><span class=\"ds-price\">€14.00</span>Today</span>\n          </li>\n        </ul>\n      </div>\n      <div class=\"ds-panel\">\n        <h3 class=\"ds-panel__title\">Returns are free for 30 days</h3>\n        <div class=\"ds-panel__body\">\n          <p>Unopened tins and unused teaware can come back at our cost. Start a return from the order once it is delivered, and the refund follows within five working days.</p>\n          <div class=\"ds-accordion\" data-component=\"accordion\">\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">How do I start a return?</summary>\n              <p class=\"ds-accordion__body\">Open the order and choose the tins to send back. A label is made for you.</p>\n            </details>\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">When does the refund arrive?</summary>\n              <p class=\"ds-accordion__body\">Within five working days of the parcel reaching us.</p>\n            </details>\n            <details class=\"ds-accordion__item\">\n              <summary class=\"ds-accordion__head\">What cannot come back?</summary>\n              <p class=\"ds-accordion__body\">Opened tins and used teaware.</p>\n            </details>\n          </div>\n        </div>\n        <div class=\"ds-panel__actions\">\n          <a class=\"ds-button ds-button--flat\" href=\"#browse\">Shop tea</a>\n          <a class=\"ds-button ds-button--flat\" href=\"#basket\">View basket</a>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-container\">\n    <div class=\"ds-footer__cols\">\n      <div class=\"ds-footer__col\">\n        <h2 class=\"ds-footer__title\">chronoskin</h2>\n        <p class=\"ds-footer__text\">Loose leaf tea and plain teaware, packed by hand and sent the next working day.</p>\n      </div>\n      <div class=\"ds-footer__col\">\n        <h2 class=\"ds-footer__title\">Shop</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#browse\">Black tea</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#shop\">New this week</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#product\">Tea of the month</a></li>\n        </ul>\n      </div>\n      <div class=\"ds-footer__col\">\n        <h2 class=\"ds-footer__title\">Your order</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#basket\">Basket</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#checkout\">Check out</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#orders\">Orders</a></li>\n        </ul>\n      </div>\n      <div class=\"ds-footer__col\">\n        <h2 class=\"ds-footer__title\">Help</h2>\n        <ul class=\"ds-footer__list\">\n          <li><a class=\"ds-footer__link\" href=\"#orders\">Delivery</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#orders\">Returns</a></li>\n          <li><a class=\"ds-footer__link\" href=\"#product\">Brewing guides</a></li>\n        </ul>\n      </div>\n    </div>\n    <p class=\"ds-footer__legal\">chronoskin is a sample shop. Nothing on these pages can be bought.</p>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.material-design.shop.s07.p01.t02.u04\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"material-design\",\n    \"years\": [\n      2014,\n      2018\n    ]\n  },\n  \"archetype\": \"shop\",\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-7124\",\n  \"short\": \"v1-md-7124\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #fafafa;\n  --color-canvas: #fafafa;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f7f7f7;\n  --color-surface-strong: #eeeeee;\n  --color-bar: #455a64;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #546e7a;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #424242;\n  --color-inverse-text: #ffffff;\n  --color-text: #212121;\n  --color-text-muted: #757575;\n  --color-heading: #212121;\n  --color-heading-alt: #757575;\n  --color-link: #00bcd4;\n  --color-link-quiet: #212121;\n  --color-link-visited: #00bcd4;\n  --color-link-hover: #00acc1;\n  --color-link-active: #00838f;\n  --color-border: rgb(0 0 0 / 0.12);\n  --color-border-strong: #757575;\n  --color-border-muted: #ebebeb;\n  --color-accent: #ffc400;\n  --color-accent-text: #212121;\n  --color-accent-alt: #ff4081;\n  --color-fill-1: #00bcd4;\n  --color-fill-2: #ffc400;\n  --color-fill-3: #607d8b;\n  --color-fill-4: #212121;\n  --color-button: #00bcd4;\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: #9e9e9e;\n  --color-danger: #c2185b;\n  --color-danger-surface: #ffffff;\n  --color-success: #46873b;\n  --color-warning: #ff9800;\n  --color-notice: #edf2f5;\n  --color-notice-text: #212121;\n  --color-focus: #00bcd4;\n  --color-shadow: #000000;\n  --color-overlay: rgb(0 0 0 / 0.5);\n}\n\n/* @part type */\n:root {\n  --font-body: Roboto, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-heading: \"Roboto Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n  --font-ui: \"Roboto Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n  --font-mono: \"Roboto Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n  --text-base: 16px;\n  --text-small: 12px;\n  --text-ui: 13px;\n  --text-large: 18px;\n  --text-display: 40px;\n  --text-h1: 30px;\n  --text-h2: 20px;\n  --text-h3: 16px;\n  --line-body: 1.5;\n  --line-heading: 1.4;\n  --line-display: 1.2;\n  --weight-body: 400;\n  --weight-bold: 500;\n  --weight-heading: 400;\n  --weight-display: 400;\n  --weight-ui: 400;\n  --heading-transform: uppercase;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: uppercase;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 3px;\n  --radius-panel: 6px;\n  --radius-pill: 12px;\n  --radius-page: 6px;\n  --shadow-panel: 0 1px 4px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent);\n  --shadow-control: 0 12px 20px -10px color-mix(in srgb, var(--color-shadow) 28%, transparent), 0 4px 20px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 7px 8px -5px color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  --shadow-control-hover: 0 14px 22px -12px color-mix(in srgb, var(--color-shadow) 42%, transparent), 0 4px 22px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 8px 10px -5px color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  --shadow-control-pressed: 0 2px 5px 0 color-mix(in srgb, var(--color-shadow) 30%, transparent);\n  --shadow-dialog: 0 12px 22px 0 color-mix(in srgb, var(--color-shadow) 34%, 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) 82%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: transparent;\n  --focus-ring: 2px solid color-mix(in srgb, var(--color-focus) 70%, transparent);\n  --transition: box-shadow 0.3s cubic-bezier(0.25, 0.8, 0.5, 1), background-color 0.3s cubic-bezier(0.25, 0.8, 0.5, 1), color 0.3s cubic-bezier(0.25, 0.8, 0.5, 1);\n  --backdrop-blur: 0px;\n}\n"
  }
}
