{
  "id": "v1-tm-8451",
  "long_id": "v1.terminal.shop.s08.p04.t05.u01",
  "name": "Terminal, a shop kept as a ledger in magenta",
  "era": {
    "slug": "terminal",
    "code": "tm",
    "name": "Terminal",
    "years": [
      2015,
      2026
    ],
    "description": "The text-terminal look of 2015 to 2026: a monospace face for everything, bright text on a dark screen, boxes and rules drawn with borders like character frames, prompts and cursors, status lines and key hints instead of buttons with chrome."
  },
  "archetype": "shop",
  "mode": "mix",
  "viewport": {
    "width": 1280,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is a small online shop of 2015 to 2026 that sells its goods the way a terminal lists files: a line of cells at the top, then ruled rows, each named and numbered in a gutter at the left, with pictures typed in characters and prices in aligned columns. One monospace face sets everything, here in hot magenta on black with a cyan accent, capitals for headings and controls, dotted rules and a hard offset ghost behind the large type. It was the look of merchandise shops of software projects, of shops that took orders from a command line, and of the storefronts of people who sold keyboards, zines and stickers to others like themselves.",
  "url": "https://chrono.skin/s/v1-tm-8451",
  "preview_url": "https://chrono.skin/s/v1-tm-8451/specimen.html",
  "files": {
    "STYLE.md": "# Terminal, a shop kept as a ledger in magenta\n\n## Summary\n\nThis is a small online shop of 2015 to 2026 that sells its goods the way a terminal lists files: a line of cells at the top, then ruled rows, each named and numbered in a gutter at the left, with pictures typed in characters and prices in aligned columns. One monospace face sets everything, here in hot magenta on black with a cyan accent, capitals for headings and controls, dotted rules and a hard offset ghost behind the large type. It was the look of merchandise shops of software projects, of shops that took orders from a command line, and of the storefronts of people who sold keyboards, zines and stickers to others like themselves.\n\n## Layout\n\n- The page is designed for a 1280px window and does not stretch beyond it: `.ds-shop` is a column of `--size-page` (1280px) on `--color-canvas`, at least as tall as the window: the line of cells `.ds-nav`, then `.ds-main` (the views), then the `.ds-footer` strip.\n- `.ds-nav` is one line on `--fill-bar-alt` with a rule below, cut into cells by upright rules: the `.ds-brand` in a cell as wide as the gutter, then `.ds-nav__list` whose `.ds-nav__link` items are one cell each, and at the right `.ds-nav__tools`: a pulled-down `.ds-menu` and `.ds-nav__cart`, the cart with its count. The cell of the view that shows is a hole in the bar: `--color-canvas` with `--color-heading`.\n- The ledger. A view is a pile of `.ds-row` blocks with a rule between them and no gap. A row is two columns: `.ds-row__gutter`, `--size-side` (220px) wide with an upright rule at its right, and `.ds-row__body`, padded `--space-3` and `3ch`. The gutter names the row: `.ds-row__num` (a number or a code), `.ds-row__name` (the row's heading) and a small muted `.ds-row__hint`. `.ds-row--mark` is the row the reader is on: its gutter stands on `--color-surface-strong` with a mark in `--color-accent` at the left edge. There are no other section headings.\n- The home view is four rows: `shop`, the `.ds-hero` (3 to 2: the claim, a lead and two buttons at the left, the `.ds-carousel` of featured goods at the right); `numbers`, the `.ds-stats` row; `shelves`, the `.ds-grid` of four; `new in`, `.ds-cols` (3 to 2) with the table of new items beside a `.ds-stack` of the shipping panel and the restock line `.ds-inline`.\n- Inner pages have no hero. Their first row is `.ds-row--head`: the gutter says where the reader is, the body holds the `.ds-breadcrumb` and the `.ds-page-header`, and a rule of `--border-width-strong` closes the row. The work follows in further rows. In the catalogue the gutter of the main row holds the `.ds-sidebar` in place of a name. Inside a row, `.ds-cols` is 3 to 2 and `.ds-cols--item` 2 to 3; `.ds-col` is a column that may shrink, `.ds-stack` piles frames `--space-3` apart. Tabs sit directly above the list they sort.\n- Views. The specimen is one small shop with six views, one showing at a time; nav and footer are written once around them. `shop` is the home view. `catalogue` is one shelf: the shelves in the gutter, sort tabs, the list of items, pagination, and the empty state of the seconds. `item` is one item: its typed picture and badges beside the text, the framed table of sizes and links, then what buyers said, each with an avatar. `cart` is two notices, the table of lines with its sum and a progress bar toward a free parcel beside the question before a line is removed, and the empty state of things saved for later. `order` is the step as a progress bar, then the address form with its error and four buttons beside the receipt and the switches for extras. `help` is how ordering works as running text beside the questions asked most as a folding list. A view is `<section class=\"ds-view\" id=\"...\">`; links between views are plain `href=\"#id\"`.\n- Spacing scale, in quarters and multiples of one 24px step: `--space-1` 6px is the vertical padding of buttons, inputs, table cells and tabs; `--space-2` 12px the padding of a cell of the nav, the padding above the text in a frame, the gap between list rows and between notices; `--space-3` 24px the padding above the content of a row, the gap between paragraphs and between frames in a stack; `--space-4` 36px the padding under the content of a row; `--space-5` 60px is kept for a break larger than a row. Horizontal steps are character cells written in `ch`.\n- Fixed sizes: `--size-label` 150px the label column of a form, `--size-field` 440px a text input, `--size-date` 90px the code column of the list, `--size-dialog` 420px a dialog.\n- Below 900px a row is one column: its gutter becomes one line above the body (number and name side by side, the hint left out; the sidebar keeps its full blocks), the hero's carousel goes under its text, columns stack, the stats row and the grid become two by two, the nav puts brand and tools on its first line and the cells of the views on a second, form labels sit above their fields, list codes sit above their entries, and table cells marked `.ds-table__extra` are left out. The page never scrolls sideways; only the carousel does, inside itself. Below 900px a `.ds-tooltip__tip` opens under its line, as wide as the box its trigger sits in. Below 600px the `.ds-nav__list` cells share the second line, each growing to fill it and centred, and scroll sideways if they do not fit; the current cell stays a hole in the bar.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\n- One face for everything: `--font-body`, `--font-heading`, `--font-ui` and `--font-mono` are the same monospace stack (\"Source Code Pro\", \"DejaVu Sans Mono\", \"Andale Mono\", \"Lucida Console\", monospace). Weights are `--weight-body` 400 and 700 for bold and headings; `--weight-display` and `--weight-ui` are 400. Nothing is tracked.\n- Small and dense: `--text-base` 13px with `--line-body` 1.35 is all running text, `--text-ui` 13px the window list, buttons, inputs, tabs and the status line, `--text-small` 12px meta lines, hints, badges, the log and code blocks, `--text-large` 15px the hero's lead. `--text-display` 24px is the hero title and the figures, `--text-h1` 18px a page title; `--text-h2` and `--text-h3` are 13px, told from text by weight and colour. `--heading-transform` is lowercase, `--ui-transform` none.\n- The sixteen colours of a terminal on black: grey text, white for what matters, and blue, cyan, yellow, green, amber and red each with one job.\n- The screen: `--color-page` #000000 is the window, `--color-canvas` #0b0b0b the screen and (as `--fill-panel`) the inside of tiles, `--color-surface` #121212 table rows, `--color-surface-alt` #1c1c1c alternate rows and code blocks, `--color-surface-strong` #303030 tile title lines and inline code. `--color-text` #bbbbbb is running text, `--color-text-muted` #8a8a8a times, counts and hints, `--color-heading` #ffffff headings and figures, `--color-heading-alt` #ffff00 tile titles, figure labels and tags.\n- Links: `--color-link` #87afff, `--color-link-quiet` #bbbbbb for breadcrumb, tabs and sidebar links, `--color-link-visited` #af87ff, `--color-link-hover` #ffffff, `--color-link-active` #ffff00. Links are not underlined (`--link-decoration` and `--link-decoration-quiet` none) until hovered (`--link-decoration-hover` underline).\n- Bars: `--color-bar` #87afff with `--color-bar-text` #000000 is the head row of a table and the session label of the status line. `--color-bar-alt` #303030 with `--color-bar-alt-text` #d0d0d0 is the window list and the status line. `--color-inverse` #bbbbbb with `--color-inverse-text` #000000 is inverse video: the current window, tab, page number and sidebar link, the row under the cursor.\n- Lines: `--color-border` #585858 at `--border-width` 1px solid draws every tile; `--border-width-strong` is also 1px, in `--color-border-strong` #bbbbbb, under a page header and around a notice and a dialog; `--color-border-muted` #303030 parts list rows and a tile's foot.\n- Accents: `--color-accent` #ffff00 with `--color-accent-text` #000000 is the count badge; `--color-accent-alt` #00d7d7 the names of meters and the prompt sign. `--color-fill-1` to `--color-fill-4` (#0f1b2d, #0f2414, #2b2410, #24122a: blue, green, yellow and magenta, darkened) tint the tiles of the grid by group. Status words and meters: `--color-success` #5fd700, `--color-warning` #ffaf00, `--color-danger` #ff5555.\n- Controls: the primary button is `--color-button` #00d7d7 with `--color-button-text` #000000; the secondary button is `--color-button-secondary` #303030 with #ffffff text; fields are `--color-input` #000000 with `--color-input-text` #ffffff and a line in `--color-input-border` #585858; disabled is `--color-disabled` #1c1c1c with `--color-disabled-text` #585858. The notice is `--color-notice` #0f1b2d with `--color-notice-text` #afd7ff, the error notice `--color-danger-surface` #2a0a0a with `--color-danger`. `--color-overlay` #1c1c1c is the block a dialog stands on; `--color-focus` #ffff00 the focus outline, `--focus-ring` 1px dashed.\n- Surface: flat and thin. `--fill-panel` is `--color-canvas`, so a tile is only its lines. `--shadow-panel` is a one-pixel edge in `--color-shadow` #3a3a3a at the right and foot of a deck; `--shadow-dialog` a hard 4px block; a hovered button gets a 2px underline in the focus colour (`--shadow-control-hover`), a pressed one an inset line; `--fill-button-hover` darkens the button. `--shadow-control` and `--shadow-text` are none, all four radii are 0, `--backdrop-blur` is 0px and `--transition` is none.\n- The era's rule for which text stands on which fill (every layout of the era keeps it, so any palette works with any layout): `--color-text`, `--color-text-muted`, the two heading colours, every link colour and the three status colours stand on `--fill-page`, `--color-canvas`, the three surfaces, `--fill-panel` and the four fills, and on nothing else. `--color-bar-text` only on `--fill-bar`; `--color-bar-alt-text` only on `--fill-bar-alt`; `--color-inverse-text` only on `--fill-inverse`; `--color-accent-text` only on `--fill-accent`; `--color-button-text` and `--color-button-hover-text` only on `--fill-button` and its hover; `--color-notice-text` only on `--color-notice`; `--color-danger` also on `--color-danger-surface`; `--color-disabled-text` on `--color-disabled`. Two tokens must read in two places, because a surface set may leave a control unfilled: `--color-button-secondary-text` on `--fill-button-secondary` and on the canvas and surfaces, `--color-input-text` on `--fill-input` and on the canvas and surfaces. Whatever is current or selected is inverse video (`--fill-inverse` with `--color-inverse-text`); where the navigation stands on `--fill-bar`, its current item is a hole in the bar: `--color-canvas` with `--color-heading`.\n- One-off sizes written with `calc()` or `ch`: tiles overlap by `--border-width` through negative margins written with `calc()`; a dialog's title is lifted by half of `--text-h3` times `--line-body` so that its top line runs through it; the brand tile is one text line square; horizontal paddings are whole character cells; the checkbox is `2ch` square.\n\n## Components\n\n- `.ds-page` on `<body>`: page fill and base type, no margin. `.ds-shop` is the sheet; `.ds-main` holds the views; `.ds-row` (`--head`, `--mark`) with `.ds-row__gutter` (`.ds-row__num`, `.ds-row__name`, `.ds-row__hint`) and `.ds-row__body` is the ledger row; `.ds-cols` (`--item`) are column pairs inside a row, `.ds-col` a column, `.ds-stack` a pile of frames, `.ds-text` a paragraph of at most 70 characters.\n- `.ds-nav`: the line of cells at the top. `.ds-nav__list` holds `.ds-nav__link` cells; `.ds-nav__tools` at the right holds a `.ds-menu` and `.ds-nav__cart`, a link with a `.ds-badge` count. The stylesheet marks the cell whose `href` names the view that is showing (one selector per view, and the first when the address names none); on a page of its own give the link `is-current`.\n- `.ds-hero`: the opening of the home view, 3 to 2. `.ds-hero__text` holds `.ds-hero__title` (`--text-display`), `.ds-hero__lead`, a `.ds-buttons` row and a small `.ds-hero__note`; beside it stands the `.ds-carousel`.\n- `.ds-footer`: a strip on `--fill-bar`: `.ds-footer__keys`, a list of `.ds-footer__link` items in brackets, and `.ds-footer__text` at the right.\n- `.ds-brand`: the site's mark and name, a link to the home view, in the first cell of the nav. `.ds-brand__mark` is a tile one text line square, dressed like the primary button (`--fill-button`, `--color-button-text`, the button's frame, `--radius-control`, `--shadow-control`); `.ds-brand__name` is bold at `--text-large`. The name `chronoskin` and the mark are placeholders for the installing project's own name and logo.\n- `.ds-breadcrumb`: a path: `.ds-breadcrumb__link` items with `.ds-breadcrumb__sep` (`/`) between them, ending in a bold `.ds-breadcrumb__current`.\n- `.ds-page-header`: the head of an inner page, in the body of a `.ds-row--head`: `.ds-page-header__main` with `.ds-page-header__title` (`--text-h1`) and one muted `.ds-page-header__text` line; `.ds-page-header__action` at the right holds one button. Inside the head row it draws no rule of its own; the row's heavy rule closes it.\n- `.ds-prose`: running text, at most 78 characters wide: h1, h2, h3, paragraphs, lists whose bullet is a typed dash, `code` on `--color-surface-strong`, `strong` in the heading colour. Anything typed literally goes in `.ds-code`, a `<pre>` at `--text-small` on `--color-surface-alt` in a frame; it scrolls sideways inside itself.\n- `.ds-link`: text link with `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-link--quiet` for meta and tool links, `.ds-link--bracket` for a link written as a word in brackets (`[all 24]`). `.ds-links` sets several in a wrapping line.\n- `.ds-button`: a `<button>`, or an `<a>` when it only leads to another view. It is a word in square brackets, which the stylesheet adds. The primary one is a block of `--fill-button`; `.ds-button--secondary` is a frame in `--color-border`; `.ds-button--danger` is the destructive action in `--color-danger` on `--color-danger-surface`; `disabled` or `is-disabled` is greyed. `is-hover`, `is-active` and `is-focus` show the states. Group with `.ds-buttons`.\n- `.ds-form`: rows (`.ds-form__row`) of a `.ds-form__label` and a `.ds-form__field`. Controls take `.ds-form__input` (`--wide` for the full width, `--auto` for selects). `is-invalid` plus a bold `.ds-form__error` marks a validation error, `.ds-form__hint` is help text, `.ds-form__check` holds a `.ds-form__checkbox` (one empty cell, a filled block when set), and `.ds-form__actions` lines the buttons up with the fields. `.ds-inline` is one field and its button on a line, for the restock mail.\n- `.ds-table`: aligned columns under a head row on `--fill-bar`. `.ds-table__num` right-aligns a numeric column (pieces, prices), `.ds-table__code` is a bold first column (an item number, a size), `.ds-table__date` a muted one, `tr.is-alt` an alternate row, `.ds-table__group` a group row, `.ds-table__total` the row of the sum, `tr.is-selected` the chosen row in inverse video, `.ds-table__title` the link in a row, `.ds-table__extra` cells a phone leaves out. `.ds-table--framed` gives every cell its four lines.\n- `.ds-list`: the items of a shelf. Each `.ds-list__item` is a muted `.ds-list__date` (here the item number) in a `--size-date` column and a `.ds-list__main` with a bold `.ds-list__title` link, a `.ds-list__excerpt` and a small `.ds-list__meta` line with price, sizes and a status badge; faint rules part the items.\n- `.ds-panel`: a frame with its `.ds-panel__title` cut into the top line, and a `.ds-panel__body` of `.ds-panel__text` paragraphs. The title row draws the top line itself, so the frame works on any fill and with any border style; a panel always has a title.\n- `.ds-stat`: one figure: a `.ds-stat__value` at `--text-h1` over a small muted `.ds-stat__label`. `.ds-stats` is the row: four figures parted by upright rules.\n- `.ds-grid`: four `.ds-grid__cell` boxes (four across, two by two on a phone), each a frame on `--color-fill-1` (`--2`, `--3`, `--4` select the other fills), with a `.ds-grid__title`, `.ds-grid__text` and a muted `.ds-grid__label`.\n- `.ds-tabs`: a row of words on a rule; each `.ds-tabs__tab` is a link in brackets, the current one a `<span class=\"ds-tabs__tab is-current\">` in inverse video. Content goes in `.ds-tabs__body`.\n- `.ds-badge`: a count: bold `--text-small` on `--fill-accent`. `.ds-badge--tag` is a word after a `#` in `--color-heading-alt`. Status labels are `.ds-badge--success`, `.ds-badge--warning` and `.ds-badge--danger`: a word in brackets in the status colour (in stock, few left, sold out), with no fill and no frame. `.ds-badges` sets several in a line.\n- `.ds-sidebar`: the shelves and filters of the catalogue, in the gutter of its main row. Each `.ds-sidebar__block` is a frame with a `.ds-sidebar__title` cut into its top line and a `.ds-sidebar__list` of `.ds-sidebar__link` items (`is-current` in inverse video) with a `.ds-sidebar__count`; `.ds-sidebar__text` is a small muted paragraph.\n- `.ds-notice`: a sentence in a frame of `--color-border-strong` with a heavy left edge, starting with a bold `.ds-notice__title`. `.ds-notice--error` uses `--color-danger` on `--color-danger-surface`. Stack several in `.ds-notices`.\n- `.ds-pagination`: a line of `.ds-pagination__link` items: previous, numbers, next. The current page is a `<span>` with `is-current` in inverse video; `is-disabled` is muted.\n- `.ds-dialog`: a frame in `--color-border-strong`, `--size-dialog` wide, with `--shadow-dialog`. It sits in the page flow on `.ds-dialog__backdrop`, a flat block of `--color-overlay`; it has a `.ds-dialog__title`, a `.ds-dialog__body`, `.ds-dialog__text` and `.ds-dialog__actions`. No dimming of the page, no blur.\n- `.ds-empty`: a faint frame with a centred muted `.ds-empty__text` sentence and one secondary button.\n- `.ds-menu`: a pulled-down menu, a `<details>` in the nav. `.ds-menu__title` is its `<summary>`, a cell with a `v`; open, it is a hole in the bar. `.ds-menu__list` is the framed list under it, on `--color-surface` with `--shadow-dialog`; each `.ds-menu__item` is a link with a muted `.ds-menu__key` at the right, inverse video when hovered (`is-hover`); `.ds-menu__rule` parts two groups. It is closed until asked for.\n- `.ds-carousel`: the featured shelf: a box in `--color-border-strong` with `--shadow-dialog`. `.ds-carousel__slides` is a row of `.ds-carousel__slide` items of which one shows; the others are a swipe away (scroll snap, no script). A slide holds a `.ds-art`, a `.ds-carousel__name` and a `.ds-carousel__text`. `.ds-carousel__nav` is the pager under a rule: two `.ds-carousel__arrow` links around a bold `.ds-carousel__count` (`1/3`).\n- `.ds-accordion`: a folding list of questions. Each `.ds-accordion__item` is a `<details>`; its `.ds-accordion__title` is the `<summary>`, marked `[+]` when closed and `[-]` when open; `.ds-accordion__body` is indented four cells.\n- `.ds-tooltip`: a word with a dotted underline that can take the focus; its `.ds-tooltip__tip` is a small boxed hint on `--color-surface-strong` that shows above it on hover or focus (`is-open` shows it statically).\n- `.ds-switch`: an on/off choice, a `<label>` holding `.ds-switch__label`, a hidden `.ds-switch__input` checkbox and `.ds-switch__track`, which draws the pair `on` `off`; the half that holds is inverse video. `.ds-setting` is a ruled row for one.\n- `.ds-progress`: a quantity or a step: a muted `.ds-progress__label`, a `.ds-progress__bar` typed in cells between brackets (`#` for the filled part in `.ds-progress__on`, `.` for the rest; `--warning` and `--danger` recolour it) and a bold `.ds-progress__value`.\n- `.ds-avatar`: a buyer as two initials in a cell on `--color-surface-strong`; `--2` and `--3` use two of the block fills. `.ds-reviews` is the list of what buyers said: each `.ds-review` is an avatar beside a `.ds-review__who`, a muted `.ds-review__meta` and a `.ds-review__text`.\n- Shop pieces: `.ds-art` is a picture typed in characters, a `<pre>` in `--color-heading-alt`; `.ds-receipt` is a till receipt whose `.ds-receipt__row` is a name, a `.ds-receipt__fill` leader and a bold `.ds-receipt__sum` (`--total` under a rule).\n- Text-mode pieces: `.ds-prompt` is a typed command line; `.ds-cursor` is the block cursor; `.ds-key` is a key hint whose `.ds-key__cap` is set in brackets; `.ds-meter` is the older name of a typed bar; `.ds-section__title` is a heading followed by a rule, for a page that is not a ledger; `.ds-note` is a small muted line under a block.\n\n## Never\n\n- `font-families <= 1`: one monospace face sets everything, headings and buttons included.\n- `font-size <= 24px`: the largest text is a figure; everything else is within a few pixels of the body size.\n- `font-size >= 12px`: small text is the meta size; nothing is set smaller.\n- `letter-spacing <= 0px`: the grid of the typeface is never stretched.\n- `line-height <= 1.5`: lines sit as close as a terminal sets them.\n- `border-radius <= 0px`: a character cell has no round corner; every box, button and field is square.\n- `box-shadow-blur <= 0px`: nothing is soft and nothing floats; where a set has a shadow at all it is a hard offset block.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `border-width <= 2px`: lines are one weight, with one heavier rule.\n- `transition = none`: states change at once, as a screen redraws.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. A new block of a page is a `.ds-row`: name it in the gutter and put its content in the body; do not add a heading above it. A boxed thing copies `.ds-panel`: a frame of `--border-width` in `--color-border` with its title cut into the top line and `--space-2` and `2ch` of padding. A row type copies a `.ds-table` row, a `.ds-list__item` or a `.ds-review`. A set of choices copies `.ds-tabs`, and whatever is current or selected is inverse video (`--fill-inverse` with `--color-inverse-text`), or a hole when it stands in a bar. A status is a word in brackets in its status colour; a quantity or a step is a `.ds-progress` typed in cells; a sum is a `.ds-receipt` row; a picture is a `.ds-art` typed in characters; an action is a word dressed as `.ds-button`. Use only the tokens of `tokens.css` and the `--size-*` and `--space-*` tokens of `components.css`, write horizontal steps in `ch`, and pair each text token with its own fill as listed above. When in doubt do less: text before a box, a rule before a fill, a typed character before an icon, and never a radius, a soft shadow, a gradient, a photograph or a second typeface.\n",
    "components.css": "/* Layout tokens (structure part). Vertical steps are quarters, halves and\n   multiples of one 24px step; horizontal steps are written in ch. */\n:root {\n  --size-page: 1280px;\n  --size-side: 220px;\n  --size-label: 150px;\n  --size-field: 440px;\n  --size-dialog: 420px;\n  --size-date: 90px;\n  --space-1: 6px;\n  --space-2: 12px;\n  --space-3: 24px;\n  --space-4: 36px;\n  --space-5: 60px;\n}\n\n/* ---------- shell: one face, one size, a screen of text ---------- */\n.ds-page {\n  margin: 0;\n  padding: 0;\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n/* Selection is inverse video. */\n.ds-page ::selection {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n/* ---------- views: one screen of the example site shows at a time ---------- */\n.ds-view { display: none; }\n.ds-view:target, .ds-page:not(:has(.ds-view:target)) .ds-view--home { display: block; }\n.ds-view:target { scroll-margin-top: 100vh; }\n\n/* ---------- frames: a box of 1-cell lines with its title cut into the top edge.\n   The top edge is drawn by the title row (a short rule, the title, a long rule),\n   so it works on any fill and with any border style. ---------- */\n.ds-panel,\n.ds-dialog,\n.ds-sidebar__block,\n.ds-term {\n  position: relative;\n  display: flow-root;\n  box-sizing: border-box;\n  min-width: 0;\n  margin: calc(var(--text-h3) * var(--line-body) * 0.5) 0 0;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-top: 0;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__title,\n.ds-dialog__title,\n.ds-sidebar__title,\n.ds-term__title {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  margin: calc(var(--text-h3) * var(--line-body) * -0.5) calc(var(--border-width) * -1) 0;\n  padding: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__title::before,\n.ds-dialog__title::before,\n.ds-sidebar__title::before,\n.ds-term__title::before {\n  content: \"\";\n  flex: none;\n  width: 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__title::after,\n.ds-dialog__title::after,\n.ds-sidebar__title::after,\n.ds-term__title::after {\n  content: \"\";\n  flex: 1;\n  min-width: 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-2);\n}\n.ds-panel__text:last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- a section rule: the name, then a line to the right edge ---------- */\n.ds-section__title {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  margin: var(--space-3) 0 var(--space-2);\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-section__title:first-child {\n  margin-top: 0;\n}\n.ds-section__title::after {\n  content: \"\";\n  flex: 1;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-note:last-child {\n  margin-bottom: 0;\n}\n.ds-note {\n  margin: var(--space-2) 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- prompt, cursor, key hints, meters ---------- */\n.ds-prompt {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-weight: var(--weight-bold);\n  overflow-wrap: anywhere;\n}\n/* The block cursor: one cell of inverse video. It holds a no-break space. */\n.ds-cursor {\n  background: currentColor;\n}\n@media (prefers-reduced-motion: no-preference) {\n  .ds-cursor {\n    animation: ds-blink 1.2s steps(1) infinite;\n  }\n}\n@keyframes ds-blink {\n  0% { opacity: 1; }\n  50% { opacity: 0; }\n  100% { opacity: 0; }\n}\n.ds-key {\n  white-space: nowrap;\n}\n.ds-key__cap {\n  font-weight: var(--weight-bold);\n}\n.ds-key__cap::before {\n  content: \"[\";\n}\n.ds-key__cap::after {\n  content: \"]\";\n}\n/* A progress bar typed in block characters. */\n.ds-meter {\n  color: var(--color-border);\n  white-space: nowrap;\n}\n.ds-code {\n  box-sizing: border-box;\n  max-width: 100%;\n  margin: 0 0 var(--space-3);\n  padding: var(--space-2) 2ch;\n  overflow-x: auto;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n  white-space: pre;\n}\n.ds-code:last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- links ---------- */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--quiet,\n.ds-link--quiet:visited,\n.ds-link--quiet.is-visited {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-link--quiet:hover,\n.ds-link--quiet.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n/* A link marked by brackets instead of an underline: [copy]. */\n.ds-link--bracket,\n.ds-link--bracket:visited {\n  color: var(--color-link);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-link--bracket::before {\n  content: \"[\";\n}\n.ds-link--bracket::after {\n  content: \"]\";\n}\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) 3ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* ---------- brand: the mark on a one-line tile dressed like the primary button ---------- */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: 1ch;\n  color: var(--color-heading);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  flex: none;\n  display: block;\n  box-sizing: border-box;\n  width: calc(var(--text-base) * var(--line-body));\n  height: calc(var(--text-base) * var(--line-body));\n  border: var(--border-width) var(--border-style) var(--color-button);\n  border-radius: var(--radius-control);\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: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--display-tracking);\n  text-shadow: var(--shadow-text);\n}\n.ds-brand:hover .ds-brand__name,\n.ds-brand.is-hover .ds-brand__name {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-brand:focus-visible,\n.ds-brand.is-focus {\n  outline: var(--focus-ring);\n}\n\n/* ---------- breadcrumb: a path ---------- */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 1ch;\n  margin: 0 0 var(--space-2);\n  padding: 0;\n  list-style: none;\n}\n.ds-breadcrumb__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__link:hover,\n.ds-breadcrumb__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-breadcrumb__sep {\n  color: var(--color-text-muted);\n}\n.ds-breadcrumb__current {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- page header: title, one line, an action at the right, a heavy rule ---------- */\n.ds-page-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: var(--space-2) 2ch;\n  margin: 0 0 var(--space-3);\n  padding: 0 0 var(--space-2);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-page-header__main {\n  min-width: 0;\n}\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  text-shadow: var(--shadow-text);\n}\n.ds-page-header__text {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- stats ---------- */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  min-width: 0;\n}\n.ds-stat__value {\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-display);\n}\n.ds-stat__label {\n  color: var(--color-text-muted);\n}\n\n/* ---------- prose ---------- */\n.ds-prose {\n  max-width: 78ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0 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 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-4);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-3);\n  font-size: var(--text-h3);\n  color: var(--color-heading-alt);\n}\n.ds-prose p {\n  margin: 0 0 var(--space-3);\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: 0 0 var(--space-3);\n  padding: 0 0 0 3ch;\n}\n.ds-prose ul {\n  list-style-type: \"- \";\n  padding-left: 2ch;\n}\n.ds-prose code {\n  padding: 0 0.5ch;\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n}\n.ds-prose strong {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-prose > :first-child {\n  margin-top: 0;\n}\n.ds-prose > :last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- buttons: a word in brackets, the primary one in inverse video ---------- */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2) 2ch;\n}\n.ds-button {\n  display: inline-block;\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-1) 1ch;\n  border: var(--border-width) var(--border-style) var(--color-button);\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: var(--line-body);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button::before {\n  content: \"[ \";\n}\n.ds-button::after {\n  content: \" ]\";\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 {\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border);\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border-strong);\n}\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  border-color: var(--color-border-muted);\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  margin: 0;\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: var(--size-label) minmax(0, 1fr);\n  gap: 0 2ch;\n  align-items: start;\n  margin: 0 0 var(--space-2);\n}\n.ds-form__label {\n  padding: var(--space-1) 0;\n  color: var(--color-heading);\n}\n.ds-form__field {\n  min-width: 0;\n}\n.ds-form__input {\n  box-sizing: border-box;\n  width: 100%;\n  max-width: var(--size-field);\n  margin: 0;\n  padding: var(--space-1) 1ch;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  box-shadow: var(--shadow-control);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: var(--line-body);\n  transition: var(--transition);\n}\n.ds-form__input--wide {\n  max-width: none;\n}\n.ds-form__input--auto {\n  width: auto;\n}\n.ds-form__input:focus-visible,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-form__input:disabled,\n.ds-form__input.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n}\n.ds-form__input.is-invalid {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  margin: var(--space-1) 0 0;\n  color: var(--color-danger);\n  font-weight: var(--weight-bold);\n}\n.ds-form__hint {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  padding: var(--space-1) 0;\n}\n/* A checkbox is one cell: an empty box, or a filled block when set. */\n.ds-form__checkbox {\n  appearance: none;\n  flex: none;\n  box-sizing: border-box;\n  width: 2ch;\n  height: 2ch;\n  margin: 0;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n}\n.ds-form__checkbox:checked {\n  border-style: solid;\n  background: var(--color-input-text);\n}\n.ds-form__checkbox:focus-visible {\n  outline: var(--focus-ring);\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) 2ch;\n  margin: var(--space-3) 0 0;\n  padding-left: calc(var(--size-label) + 2ch);\n}\n\n/* ---------- table: aligned columns under a head line in the bar colours ---------- */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-radius: var(--radius-panel);\n}\n.ds-table th,\n.ds-table td {\n  padding: var(--space-1) 1ch;\n  border-style: var(--border-style);\n  border-color: var(--color-border-muted);\n  border-width: 0 0 var(--border-width);\n  text-align: left;\n  vertical-align: top;\n}\n.ds-table th {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  border-color: var(--color-border);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-bold);\n  text-transform: var(--heading-transform);\n  white-space: nowrap;\n}\n.ds-table td {\n  background: var(--color-surface);\n}\n.ds-table tr.is-alt td,\n.ds-table__row--alt td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  text-align: right;\n  white-space: nowrap;\n}\n.ds-table td.ds-table__code {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-table td.ds-table__date {\n  color: var(--color-text-muted);\n  white-space: nowrap;\n}\n.ds-table__group td {\n  background: var(--color-surface-strong);\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n}\n/* The row under the cursor: inverse video. */\n.ds-table tr.is-selected td {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-table tr.is-selected .ds-table__title {\n  color: var(--color-inverse-text);\n}\n.ds-table tr.is-unread td {\n  font-weight: var(--weight-bold);\n}\n.ds-table__title {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-table__title:visited,\n.ds-table__title.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-table__title:hover,\n.ds-table__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- list ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: grid;\n  grid-template-columns: var(--size-date) minmax(0, 1fr);\n  gap: 0 2ch;\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-list__date {\n  color: var(--color-text-muted);\n  white-space: nowrap;\n}\n.ds-list__main {\n  min-width: 0;\n}\n.ds-list__title {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n}\n.ds-list__title:visited,\n.ds-list__title.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-list__excerpt {\n  margin: 0;\n}\n.ds-list__meta {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- grid: four framed cells on the block fills ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-2) 2ch;\n}\n.ds-grid__cell {\n  min-width: 0;\n  padding: var(--space-2) 2ch var(--space-3);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  background: var(--color-fill-1);\n}\n.ds-grid__cell--2 {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 {\n  background: var(--color-fill-4);\n}\n.ds-grid__label {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-grid__title {\n  margin: 0 0 var(--space-1);\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-grid__text {\n  margin: 0;\n}\n\n/* ---------- tabs: words on a rule, the current one in inverse video ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 1ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-tabs__tab {\n  display: block;\n  padding: var(--space-1) 1ch;\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-tabs__tab:focus-visible,\n.ds-tabs__tab.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tabs__tab.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-tabs__body {\n  padding: var(--space-2) 0 var(--space-3);\n}\n\n/* ---------- badge: a count on the accent fill; a tag; a status word in brackets ---------- */\n.ds-prose + .ds-links {\n  margin-top: var(--space-3);\n}\n.ds-badges {\n  margin: 0 0 var(--space-2);\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1) 2ch;\n}\n.ds-badge {\n  display: inline-block;\n  padding: 0 1ch;\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: var(--line-body);\n  white-space: nowrap;\n}\n.ds-badge--tag,\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  padding: 0;\n  background: transparent;\n  font-weight: var(--weight-body);\n}\n.ds-badge--tag {\n  color: var(--color-heading-alt);\n}\n.ds-badge--tag::before {\n  content: \"#\";\n}\n.ds-badge--success::before,\n.ds-badge--warning::before,\n.ds-badge--danger::before {\n  content: \"[\";\n}\n.ds-badge--success::after,\n.ds-badge--warning::after,\n.ds-badge--danger::after {\n  content: \"]\";\n}\n.ds-badge--success {\n  color: var(--color-success);\n}\n.ds-badge--warning {\n  color: var(--color-warning);\n}\n.ds-badge--danger {\n  color: var(--color-danger);\n}\n\n/* ---------- sidebar: framed blocks of links ---------- */\n.ds-sidebar {\n  display: grid;\n  gap: var(--space-2);\n  align-content: start;\n  min-width: 0;\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: var(--space-1) 1ch var(--space-2);\n  list-style: none;\n}\n.ds-sidebar__list li {\n  display: flex;\n  justify-content: space-between;\n  gap: 1ch;\n}\n.ds-sidebar__link {\n  flex: 1;\n  min-width: 0;\n  padding: 0 1ch;\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-sidebar__link.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-sidebar__count {\n  flex: none;\n  padding: 0 1ch 0 0;\n  color: var(--color-text-muted);\n}\n.ds-sidebar__text {\n  margin: 0;\n  padding: var(--space-1) 2ch var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- notice: a box with a heavy left edge ---------- */\n.ds-notices {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-3);\n}\n.ds-notice {\n  margin: 0;\n  padding: var(--space-2) 2ch;\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-left-width: var(--border-width-strong);\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n  text-transform: var(--heading-transform);\n}\n.ds-notice--error {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n\n/* ---------- pagination ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1) 1ch;\n  margin: var(--space-3) 0 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-pagination__link {\n  display: block;\n  padding: 0 1ch;\n  color: var(--color-link);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-pagination__link:focus-visible,\n.ds-pagination__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-text-muted);\n  text-decoration: none;\n}\n\n/* ---------- dialog: a framed box on a block of the overlay colour, in the page flow ---------- */\n.ds-dialog__backdrop {\n  box-sizing: border-box;\n  padding: var(--space-3) 2ch;\n  border-radius: var(--radius-panel);\n  background: var(--color-overlay);\n}\n.ds-dialog {\n  max-width: var(--size-dialog);\n  margin-left: auto;\n  margin-right: auto;\n  border-color: var(--color-border-strong);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__title::before,\n.ds-dialog__title::after {\n  border-color: var(--color-border-strong);\n}\n.ds-dialog__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-dialog__text {\n  margin: 0 0 var(--space-3);\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) 2ch;\n}\n\n/* ---------- empty ---------- */\n.ds-empty {\n  padding: var(--space-3) 2ch;\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  text-align: center;\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n}\n.ds-note code,\n.ds-notice code,\n.ds-panel__text code {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n}\n.ds-notice code {\n  color: inherit;\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- pieces of the period beyond the checklist ---------- */\n/* menu: an item of a bar that pulls down a framed list. A <details>; closed until asked for. */\n.ds-menu {\n  position: relative;\n  flex: none;\n}\n.ds-menu__title {\n  display: block;\n  padding: var(--space-1) 1ch;\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n  list-style: none;\n  cursor: pointer;\n}\n.ds-menu__title::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__title::after {\n  content: \" v\";\n  text-transform: none;\n}\n.ds-menu__title:hover,\n.ds-menu__title.is-hover,\n.ds-menu[open] > .ds-menu__title {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n}\n.ds-menu__title:focus-visible,\n.ds-menu__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-menu__list {\n  position: absolute;\n  z-index: 4;\n  top: 100%;\n  right: 0;\n  box-sizing: border-box;\n  min-width: 28ch;\n  max-width: 90vw;\n  margin: 0;\n  padding: var(--space-1) 0;\n  list-style: none;\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface);\n  box-shadow: var(--shadow-dialog);\n  color: var(--color-text);\n  font-weight: var(--weight-body);\n  text-shadow: none;\n}\n.ds-menu__item {\n  display: flex;\n  justify-content: space-between;\n  gap: 2ch;\n  padding: 0 1ch;\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n  white-space: nowrap;\n}\n.ds-menu__item:hover,\n.ds-menu__item.is-hover {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-menu__key {\n  color: var(--color-text-muted);\n}\n.ds-menu__item:hover .ds-menu__key,\n.ds-menu__item.is-hover .ds-menu__key {\n  color: inherit;\n}\n.ds-menu__rule {\n  margin: var(--space-1) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n\n/* accordion: nodes of a tree that fold; [+] closed, [-] open */\n.ds-accordion {\n  margin: 0;\n}\n.ds-accordion__item {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__item:last-child {\n  border-bottom: 0;\n}\n.ds-accordion__title {\n  display: block;\n  padding: var(--space-1) 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__title::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__title::before {\n  content: \"[+] \";\n  color: var(--color-accent-alt);\n}\n.ds-accordion__item[open] > .ds-accordion__title::before {\n  content: \"[-] \";\n}\n.ds-accordion__title:hover,\n.ds-accordion__title.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-accordion__title:focus-visible,\n.ds-accordion__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  margin: 0;\n  padding: 0 0 var(--space-2) 4ch;\n}\n.ds-accordion__body p {\n  margin: 0 0 var(--space-1);\n}\n.ds-accordion__body code {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n}\n\n/* tooltip: a boxed hint over its trigger, shown on hover or focus only */\n.ds-tooltip {\n  position: relative;\n  text-decoration: underline dotted;\n  cursor: help;\n}\n.ds-tooltip:focus-visible {\n  outline: var(--focus-ring);\n}\n.ds-tooltip__tip {\n  display: none;\n  position: absolute;\n  z-index: 3;\n  bottom: 100%;\n  left: 0;\n  box-sizing: border-box;\n  width: max-content;\n  max-width: 34ch;\n  padding: 0 1ch;\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-strong);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  letter-spacing: 0;\n  text-align: left;\n  text-transform: none;\n  white-space: normal;\n}\n.ds-tooltip:hover .ds-tooltip__tip,\n.ds-tooltip:focus .ds-tooltip__tip,\n.ds-tooltip.is-open .ds-tooltip__tip {\n  display: block;\n}\n\n/* switch: an on/off pair over a checkbox; the half that holds is inverse video */\n.ds-switch {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 2ch;\n  padding: var(--space-1) 0;\n  cursor: pointer;\n}\n.ds-switch__label {\n  min-width: 0;\n}\n.ds-switch__input {\n  position: absolute;\n  appearance: none;\n  margin: 0;\n  opacity: 0;\n}\n.ds-switch__track {\n  flex: none;\n  display: inline-flex;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-size: var(--text-small);\n  white-space: nowrap;\n}\n.ds-switch__track::before {\n  content: \"on\";\n  padding: 0 1ch;\n}\n.ds-switch__track::after {\n  content: \"off\";\n  padding: 0 1ch;\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n}\n.ds-switch__input:checked + .ds-switch__track::before {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n}\n.ds-switch__input:checked + .ds-switch__track::after {\n  background: transparent;\n  color: inherit;\n  font-weight: var(--weight-body);\n}\n.ds-switch__input:focus-visible + .ds-switch__track {\n  outline: var(--focus-ring);\n}\n\n/* progress: a bar typed in cells between brackets, then its figure */\n.ds-progress {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: 0 1ch;\n  margin: 0 0 var(--space-2);\n}\n.ds-progress:last-child {\n  margin-bottom: 0;\n}\n.ds-progress__label {\n  color: var(--color-text-muted);\n}\n.ds-progress__bar {\n  color: var(--color-border);\n  white-space: nowrap;\n}\n.ds-progress__bar::before {\n  content: \"[\";\n  color: var(--color-text-muted);\n}\n.ds-progress__bar::after {\n  content: \"]\";\n  color: var(--color-text-muted);\n}\n.ds-progress__on {\n  color: var(--color-success);\n}\n.ds-progress__on--warning {\n  color: var(--color-warning);\n}\n.ds-progress__value {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\n/* avatar: initials in a cell */\n.ds-avatar {\n  display: inline-block;\n  box-sizing: border-box;\n  min-width: 4ch;\n  padding: 0 0.5ch;\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n  text-align: center;\n  text-transform: uppercase;\n  white-space: nowrap;\n}\n.ds-avatar--2 {\n  background: var(--color-fill-3);\n  color: var(--color-heading);\n}\n.ds-avatar--3 {\n  background: var(--color-fill-4);\n  color: var(--color-accent-alt);\n}\n\n/* ---------- layout 8: a shop as a ledger: a line of cells at the top, then ruled rows,\n   each named in a gutter at the left with its goods at the right ---------- */\n.ds-shop {\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  max-width: var(--size-page);\n  min-height: 100vh;\n  margin: 0 auto;\n  border-radius: var(--radius-page);\n  background: var(--color-canvas);\n}\n.ds-main {\n  flex: 1;\n  min-width: 0;\n}\n.ds-row {\n  display: grid;\n  grid-template-columns: var(--size-side) minmax(0, 1fr);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-row--head {\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-row__gutter {\n  box-sizing: border-box;\n  min-width: 0;\n  padding: var(--space-3) 2ch;\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n  border-left: var(--border-width-strong) var(--border-style) transparent;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n/* the row the reader is on: a stronger ground and a mark at its left edge */\n.ds-row--mark .ds-row__gutter {\n  border-left-color: var(--color-accent);\n  background: var(--color-surface-strong);\n}\n.ds-row__num {\n  display: block;\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-row__name {\n  display: block;\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-row__hint {\n  margin: var(--space-1) 0 0;\n}\n.ds-row__body {\n  box-sizing: border-box;\n  min-width: 0;\n  padding: var(--space-3) 3ch var(--space-4);\n}\n.ds-row__body > :last-child {\n  margin-bottom: 0;\n}\n.ds-row--head .ds-row__body {\n  padding-bottom: var(--space-3);\n}\n.ds-row--head .ds-page-header {\n  margin: 0;\n  padding: 0;\n  border-bottom: 0;\n}\n.ds-cols {\n  display: grid;\n  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);\n  gap: var(--space-3) 4ch;\n  align-items: start;\n}\n.ds-cols--item {\n  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n}\n.ds-col {\n  min-width: 0;\n}\n.ds-stack {\n  display: grid;\n  gap: var(--space-3);\n  align-content: start;\n  min-width: 0;\n}\n.ds-text {\n  max-width: 70ch;\n  margin: 0 0 var(--space-3);\n}\n\n/* nav: one line of cells parted by upright rules; the cart is the last cell */\n.ds-nav {\n  position: relative;\n  z-index: 3;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-nav .ds-brand {\n  box-sizing: border-box;\n  width: var(--size-side);\n  padding: var(--space-2) 2ch;\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-nav .ds-brand,\n.ds-nav .ds-brand__name {\n  color: var(--color-bar-alt-text);\n}\n.ds-nav__list {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__list li {\n  display: flex;\n}\n.ds-nav__link,\n.ds-nav__cart,\n.ds-nav .ds-menu__title {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  box-sizing: border-box;\n  padding: var(--space-2) 2ch;\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover,\n.ds-nav__cart:hover,\n.ds-nav__cart.is-hover {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus,\n.ds-nav__cart:focus-visible {\n  outline: var(--focus-ring);\n}\n/* the cell of the view that shows is a hole in the bar */\n.ds-nav__link.is-current,\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(#catalogue:target) .ds-nav__link[href=\"#catalogue\"],\n.ds-page:has(#item:target) .ds-nav__link[href=\"#item\"],\n.ds-page:has(#order:target) .ds-nav__link[href=\"#order\"],\n.ds-page:has(#help:target) .ds-nav__link[href=\"#help\"],\n.ds-page:has(#cart:target) .ds-nav__cart {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-decoration: none;\n}\n.ds-nav__tools {\n  display: flex;\n  align-items: stretch;\n  margin-left: auto;\n}\n.ds-nav .ds-menu {\n  display: flex;\n}\n.ds-nav .ds-menu__title,\n.ds-nav__cart {\n  border-right: 0;\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n}\n\n/* hero: the claim at the left, the shelf of featured goods at the right */\n.ds-hero {\n  display: grid;\n  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);\n  gap: var(--space-3) 4ch;\n  align-items: start;\n}\n.ds-hero__text {\n  min-width: 0;\n}\n.ds-hero__title {\n  margin: 0 0 var(--space-3);\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  text-shadow: var(--shadow-text);\n}\n.ds-hero__lead {\n  max-width: 60ch;\n  margin: 0 0 var(--space-3);\n  font-size: var(--text-large);\n}\n.ds-hero__note {\n  margin: var(--space-2) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* a picture typed in characters */\n.ds-art {\n  margin: 0 0 var(--space-2);\n  overflow: hidden;\n  color: var(--color-heading-alt);\n  font-family: var(--font-mono);\n  font-size: var(--text-base);\n  line-height: var(--line-heading);\n  white-space: pre;\n}\n\n/* carousel: one slide showing, the others a swipe away; its pager is a count */\n.ds-carousel {\n  box-sizing: border-box;\n  min-width: 0;\n  margin: 0 0 var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-carousel__slides {\n  display: flex;\n  margin: 0;\n  padding: 0;\n  overflow-x: auto;\n  list-style: none;\n  scroll-snap-type: x mandatory;\n  scrollbar-width: none;\n}\n.ds-carousel__slide {\n  flex: 0 0 100%;\n  box-sizing: border-box;\n  min-width: 0;\n  padding: var(--space-2) 2ch;\n  scroll-snap-align: start;\n}\n.ds-carousel__name {\n  margin: 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-carousel__text {\n  margin: 0;\n}\n.ds-carousel__nav {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 1ch;\n  padding: var(--space-1) 2ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-carousel__arrow {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-carousel__arrow:hover,\n.ds-carousel__arrow.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-carousel__count {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\n/* stats: four figures parted by upright rules */\n.ds-stat {\n  padding: 0 2ch;\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-stat:first-child {\n  padding-left: 0;\n  border-left: 0;\n}\n.ds-stat__value {\n  display: block;\n  font-size: var(--text-h1);\n  line-height: var(--line-heading);\n  text-shadow: var(--shadow-text);\n}\n.ds-stat__label {\n  display: block;\n  font-size: var(--text-small);\n}\n\n.ds-tabs__tab::before {\n  content: \"[\";\n}\n.ds-tabs__tab::after {\n  content: \"]\";\n}\n.ds-table--framed th,\n.ds-table--framed td {\n  border-width: var(--border-width);\n  border-color: var(--color-border);\n}\n.ds-table__total td {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n/* a field and its button on one line */\n.ds-inline {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2) 2ch;\n  margin: 0;\n}\n.ds-inline .ds-form__input {\n  flex: 1 1 24ch;\n  width: auto;\n}\n\n/* what buyers said: a cell of initials, a name, a line */\n.ds-reviews {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-review {\n  display: grid;\n  grid-template-columns: auto minmax(0, 1fr);\n  gap: 0 2ch;\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-review .ds-avatar {\n  align-self: start;\n}\n.ds-review:first-child {\n  padding-top: 0;\n}\n.ds-review:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-review__who {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-review__meta {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-review__text {\n  margin: 0;\n}\n\n/* a till receipt: a name, a rule to the right, a sum */\n.ds-receipt {\n  margin: 0;\n}\n.ds-receipt__row {\n  margin: 0;\n  display: flex;\n  align-items: baseline;\n  gap: 1ch;\n}\n.ds-receipt__fill {\n  flex: 1;\n  min-width: 1ch;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-receipt__sum {\n  margin: 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-receipt__row--total {\n  margin-top: var(--space-2);\n  padding-top: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__text code {\n  white-space: nowrap;\n}\n.ds-setting {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-setting:last-child {\n  border-bottom: 0;\n}\n\n/* footer: a strip in the bar colours */\n.ds-footer {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: var(--space-1) 3ch;\n  padding: var(--space-2) 2ch;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-size: var(--text-small);\n}\n.ds-footer__keys {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 2ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__text {\n  margin: 0;\n}\n.ds-footer__link {\n  color: var(--color-bar-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link::before {\n  content: \"[\";\n}\n.ds-footer__link::after {\n  content: \"]\";\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- narrow windows: one column, nothing scrolls sideways but code ---------- */\n@media (max-width: 900px) {\n  .ds-page-header {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-stats,\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-form__label {\n    padding: 0;\n  }\n  .ds-form__actions {\n    padding-left: 0;\n  }\n  .ds-table__extra {\n    display: none;\n  }\n  .ds-dialog__backdrop {\n    padding: var(--space-3) 1ch;\n  }\n  .ds-button {\n    white-space: normal;\n  }\n  .ds-table td.ds-table__code {\n    white-space: normal;\n    overflow-wrap: anywhere;\n  }\n  .ds-list__item {\n    grid-template-columns: minmax(0, 1fr);\n  }\n\n  .ds-row,\n  .ds-hero,\n  .ds-cols,\n  .ds-cols--item {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-row__gutter {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: baseline;\n    gap: 0 1ch;\n    padding: var(--space-1) 2ch;\n    border-right: 0;\n    border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  }\n  .ds-row__gutter .ds-sidebar {\n    flex: 1 1 100%;\n    padding: var(--space-2) 0;\n  }\n  .ds-row__hint {\n    display: none;\n  }\n  .ds-row__body {\n    padding: var(--space-3) 2ch;\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-stat:nth-child(odd) {\n    padding-left: 0;\n    border-left: 0;\n  }\n  .ds-stat:nth-child(n + 3) {\n    margin-top: var(--space-2);\n  }\n  .ds-nav .ds-brand {\n    width: auto;\n    padding: var(--space-1) 2ch;\n    border-right: 0;\n  }\n  .ds-nav__list {\n    order: 3;\n    width: 100%;\n    border-top: var(--border-width) var(--border-style) var(--color-border);\n  }\n  .ds-nav__link,\n  .ds-nav__cart,\n  .ds-nav .ds-menu__title {\n    padding: var(--space-1) 1ch;\n  }\n}\n\n/* phones: the navigation spans the bar */\n@media (max-width: 600px) {\n  .ds-nav__list {\n    flex-wrap: nowrap;\n    overflow-x: auto;\n  }\n  .ds-nav__list li {\n    flex: 1 0 auto;\n  }\n  .ds-nav__link {\n    flex: 1;\n    justify-content: center;\n  }\n  .ds-nav__list li:last-child .ds-nav__link {\n    border-right: 0;\n  }\n}\n\n/* one-column windows: a hint opens under its line, as wide as the box its trigger sits in, which holds it */\n@media (max-width: 900px) {\n  .ds-tooltip {\n    position: static;\n  }\n  .ds-tooltip__tip {\n    bottom: auto;\n    left: 1ch;\n    right: 1ch;\n    width: auto;\n    max-width: none;\n  }\n  .ds-page :is(p, div, li, td):has(> .ds-tooltip),\n  .ds-page :is(p, div, li, td):has(> span > .ds-tooltip) {\n    position: relative;\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 shop: a text-mode store. Terminal, 2015 to 2026: specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n<div class=\"ds-shop\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#shop\"><span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\" aria-hidden=\"true\"><polyline points=\"4,6 11,12 4,18\"/><line x1=\"13\" y1=\"19\" x2=\"21\" y2=\"19\"/></svg></span><span class=\"ds-brand__name\">chronoskin</span></a>\n  <ul class=\"ds-nav__list\">\n    <li><a class=\"ds-nav__link\" href=\"#shop\">shop</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#catalogue\">catalogue</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#item\">featured</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#order\">order</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#help\">help</a></li>\n  </ul>\n  <div class=\"ds-nav__tools\">\n    <details class=\"ds-menu\">\n      <summary class=\"ds-menu__title\">account</summary>\n      <ul class=\"ds-menu__list\">\n        <li><a class=\"ds-menu__item\" href=\"#order\">your orders <span class=\"ds-menu__key\">2</span></a></li>\n        <li><a class=\"ds-menu__item is-hover\" href=\"#cart\">saved for later <span class=\"ds-menu__key\">0</span></a></li>\n        <li><a class=\"ds-menu__item\" href=\"#order\">addresses</a></li>\n        <li class=\"ds-menu__rule\"></li>\n        <li><a class=\"ds-menu__item\" href=\"#help\">write to us</a></li>\n        <li><a class=\"ds-menu__item\" href=\"#shop\">sign out</a></li>\n      </ul>\n    </details>\n    <a class=\"ds-nav__cart\" href=\"#cart\">cart <span class=\"ds-badge\">3</span></a>\n  </div>\n</header>\n\n<main class=\"ds-main\">\n\n<!-- View 1, the shop front: the claim beside the featured shelf, figures, the four shelves, what is new, a restock line. -->\n<section class=\"ds-view ds-view--home\" id=\"shop\">\n  <div class=\"ds-row ds-row--mark\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">01</span><h2 class=\"ds-row__name\">shop</h2><p class=\"ds-row__hint\">open, ships Monday to Friday</p></div>\n    <div class=\"ds-row__body\">\n      <section class=\"ds-hero\" data-component=\"hero\">\n        <div class=\"ds-hero__text\">\n          <h1 class=\"ds-hero__title\">Goods for people who live in a terminal</h1>\n          <p class=\"ds-hero__lead\">Shirts, mugs, stickers and paper from the chronoskin project. Small batches, plain prices, and every order keeps the build machines running.</p>\n          <div class=\"ds-buttons\">\n            <a class=\"ds-button\" href=\"#catalogue\">Browse the catalogue</a>\n            <a class=\"ds-button ds-button--secondary\" href=\"#help\">How ordering works</a>\n          </div>\n          <p class=\"ds-hero__note\">24 items on four shelves. Prices in EUR, tax included.</p>\n        </div>\n        <div class=\"ds-carousel\">\n          <ul class=\"ds-carousel__slides\">\n            <li class=\"ds-carousel__slide\">\n<pre class=\"ds-art\" aria-hidden=\"true\">    ___   ___\n   /   \\_/   \\\n  /_         _\\\n    |  &gt;_   |\n    |       |\n    |_______|</pre>\n              <p class=\"ds-carousel__name\"><a class=\"ds-link\" href=\"#item\">Prompt tee</a>, 24.00</p>\n              <p class=\"ds-carousel__text\">Heavy cotton, a prompt on the chest, nothing on the back.</p>\n            </li>\n            <li class=\"ds-carousel__slide\">\n<pre class=\"ds-art\" aria-hidden=\"true\">    ________\n   |        |_\n   |  $ _   | |\n   |        |_|\n   |________|\n</pre>\n              <p class=\"ds-carousel__name\"><a class=\"ds-link\" href=\"#catalogue\">Cursor mug</a>, 14.00</p>\n              <p class=\"ds-carousel__text\">Stoneware, 330 ml, a block cursor that never blinks.</p>\n            </li>\n            <li class=\"ds-carousel__slide\">\n<pre class=\"ds-art\" aria-hidden=\"true\">    _________\n   | chrono  |\\\n   | skin    | |\n   | no. 3   | |\n   |_________|/\n</pre>\n              <p class=\"ds-carousel__name\"><a class=\"ds-link\" href=\"#catalogue\">Zine no. 3</a>, 9.00</p>\n              <p class=\"ds-carousel__text\">48 pages on colour schemes, set in one typeface.</p>\n            </li>\n          </ul>\n          <p class=\"ds-carousel__nav\"><a class=\"ds-carousel__arrow\" href=\"#shop\">&lt; prev</a><span class=\"ds-carousel__count\">1/3</span><a class=\"ds-carousel__arrow\" href=\"#shop\">next &gt;</a></p>\n        </div>\n      </section>\n    </div>\n  </div>\n\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">02</span><h2 class=\"ds-row__name\">numbers</h2><p class=\"ds-row__hint\">since the shop opened</p></div>\n    <div class=\"ds-row__body\">\n      <ul class=\"ds-stats\" data-component=\"stats\">\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">24</span><span class=\"ds-stat__label\">items in stock</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">3,180</span><span class=\"ds-stat__label\">orders shipped</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">41</span><span class=\"ds-stat__label\">countries</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">2 d</span><span class=\"ds-stat__label\">from order to post</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">03</span><h2 class=\"ds-row__name\">shelves</h2><p class=\"ds-row__hint\">four of them, one page each</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <div class=\"ds-grid__cell\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-link\" href=\"#catalogue\">apparel</a></h3>\n          <p class=\"ds-grid__text\">Shirts, a hooded jumper and a cap. Sizes S to XXL.</p>\n          <p class=\"ds-grid__label\">9 items, from 18.00</p>\n        </div>\n        <div class=\"ds-grid__cell ds-grid__cell--2\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-link\" href=\"#catalogue\">desk</a></h3>\n          <p class=\"ds-grid__text\">Mugs, a desk mat and keycaps for the keys you wear out.</p>\n          <p class=\"ds-grid__label\">7 items, from 12.00</p>\n        </div>\n        <div class=\"ds-grid__cell ds-grid__cell--3\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-link\" href=\"#catalogue\">paper</a></h3>\n          <p class=\"ds-grid__text\">The zine, a poster of the colour chart, a notebook in a grid of cells.</p>\n          <p class=\"ds-grid__label\">5 items, from 6.00</p>\n        </div>\n        <div class=\"ds-grid__cell ds-grid__cell--4\">\n          <h3 class=\"ds-grid__title\"><a class=\"ds-link\" href=\"#catalogue\">stickers</a></h3>\n          <p class=\"ds-grid__text\">Sheets and singles. They survive a dishwasher and a laptop bag.</p>\n          <p class=\"ds-grid__label\">3 items, from 3.00</p>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">04</span><h2 class=\"ds-row__name\">new in</h2><p class=\"ds-row__hint\">this month's batch</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-cols\">\n        <div class=\"ds-col\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>no.</th><th>item</th><th class=\"ds-table__extra\">shelf</th><th>stock</th><th class=\"ds-table__num\">price</th></tr>\n            </thead>\n            <tbody>\n              <tr class=\"is-selected\"><td class=\"ds-table__code\">CS-014</td><td>Prompt tee</td><td class=\"ds-table__extra\">apparel</td><td>in stock</td><td class=\"ds-table__num\">24.00</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\">CS-021</td><td><a class=\"ds-table__title\" href=\"#item\">Cursor mug</a></td><td class=\"ds-table__extra\">desk</td><td><span class=\"ds-badge ds-badge--success\">in stock</span></td><td class=\"ds-table__num\">14.00</td></tr>\n              <tr><td class=\"ds-table__code\">CS-030</td><td><a class=\"ds-table__title\" href=\"#item\">Zine no. 3</a></td><td class=\"ds-table__extra\">paper</td><td><span class=\"ds-badge ds-badge--warning\">12 left</span></td><td class=\"ds-table__num\">9.00</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\">CS-033</td><td><a class=\"ds-table__title\" href=\"#item\">Esc keycap</a></td><td class=\"ds-table__extra\">desk</td><td><span class=\"ds-badge ds-badge--success\">in stock</span></td><td class=\"ds-table__num\">12.00</td></tr>\n              <tr><td class=\"ds-table__code\">CS-036</td><td><a class=\"ds-table__title\" href=\"#item\">Sticker sheet</a></td><td class=\"ds-table__extra\">stickers</td><td><span class=\"ds-badge ds-badge--success\">in stock</span></td><td class=\"ds-table__num\">6.00</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\">CS-038</td><td><a class=\"ds-table__title\" href=\"#item\">Desk mat</a></td><td class=\"ds-table__extra\">desk</td><td><span class=\"ds-badge ds-badge--danger\">sold out</span></td><td class=\"ds-table__num\">28.00</td></tr>\n            </tbody>\n          </table>\n          <p class=\"ds-note\">The row in inverse video is the featured item. <a class=\"ds-link ds-link--bracket\" href=\"#catalogue\">all 24</a></p>\n        </div>\n        <div class=\"ds-stack\">\n          <div class=\"ds-panel\" data-component=\"panel\">\n            <h2 class=\"ds-panel__title\">shipping</h2>\n            <div class=\"ds-panel__body\">\n              <p class=\"ds-panel__text\">Orders placed before 14:00 leave the same day. Free from <span class=\"ds-tooltip\" tabindex=\"0\">60.00<span class=\"ds-tooltip__tip\" role=\"tooltip\">Counted after discounts, before the cost of the parcel.</span></span> inside the union.</p>\n              <p class=\"ds-progress\"><span class=\"ds-progress__label\">next batch</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on\">#########</span>.......</span><span class=\"ds-progress__value\">9 of 16 d</span></p>\n            </div>\n          </div>\n          <form class=\"ds-inline\">\n            <input class=\"ds-form__input\" type=\"text\" placeholder=\"you@example.org\" aria-label=\"mail address\">\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Tell me of new stock</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 2, the catalogue: the shelves in the gutter, the items as a list under their sort tabs, an empty shelf. -->\n<section class=\"ds-view\" id=\"catalogue\">\n  <div class=\"ds-row ds-row--head\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">~</span><p class=\"ds-row__hint\">you are here</p></div>\n    <div class=\"ds-row__body\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#shop\">shop</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#catalogue\">catalogue</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">apparel</li>\n      </ol>\n      <header class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Apparel</h1>\n          <p class=\"ds-page-header__text\">9 items. Printed in small runs; when a size is gone it comes back with the next batch.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#help\">Size guide</a></div>\n      </header>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\">\n      <div class=\"ds-sidebar\" data-component=\"sidebar\">\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">shelves</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__link is-current\" href=\"#catalogue\">apparel</a><span class=\"ds-sidebar__count\">9</span></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#catalogue\">desk</a><span class=\"ds-sidebar__count\">7</span></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#catalogue\">paper</a><span class=\"ds-sidebar__count\">5</span></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#catalogue\">stickers</a><span class=\"ds-sidebar__count\">3</span></li>\n          </ul>\n        </div>\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">show</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__link\" href=\"#catalogue\">in stock</a><span class=\"ds-sidebar__count\">7</span></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#catalogue\">new</a><span class=\"ds-sidebar__count\">2</span></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n    <div class=\"ds-row__body\">\n      <ul class=\"ds-tabs\" data-component=\"tabs\">\n        <li><span class=\"ds-tabs__tab is-current\">newest</span></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#catalogue\">price</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#catalogue\">name</a></li>\n      </ul>\n      <div class=\"ds-tabs__body\">\n        <ul class=\"ds-list\" data-component=\"list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__date\">CS-014</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#item\">Prompt tee</a>\n              <p class=\"ds-list__excerpt\">Heavy cotton, a prompt on the chest, nothing on the back.</p>\n              <p class=\"ds-list__meta\">24.00, sizes S to XXL, <span class=\"ds-badge ds-badge--success\">in stock</span></p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__date\">CS-015</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title is-visited\" href=\"#item\">Exit code tee</a>\n              <p class=\"ds-list__excerpt\">A zero on the front for the days when everything returned clean.</p>\n              <p class=\"ds-list__meta\">24.00, sizes S to XL, <span class=\"ds-badge ds-badge--warning\">4 left</span></p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__date\">CS-009</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#item\">Hooded jumper</a>\n              <p class=\"ds-list__excerpt\">Brushed inside, the mark on the sleeve, a pocket that holds a notebook.</p>\n              <p class=\"ds-list__meta\">54.00, sizes M to XXL, <span class=\"ds-badge ds-badge--success\">in stock</span></p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__date\">CS-004</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#item\">Six panel cap</a>\n              <p class=\"ds-list__excerpt\">One size, a strap at the back, the mark stitched in one colour.</p>\n              <p class=\"ds-list__meta\">18.00, one size, <span class=\"ds-badge ds-badge--danger\">sold out</span></p>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <ul class=\"ds-pagination\" data-component=\"pagination\">\n        <li><span class=\"ds-pagination__link is-disabled\">&lt; prev</span></li>\n        <li><span class=\"ds-pagination__link is-current\">1</span></li>\n        <li><a class=\"ds-pagination__link\" href=\"#catalogue\">2</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#catalogue\">3</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#catalogue\">next &gt;</a></li>\n      </ul>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">00</span><h2 class=\"ds-row__name\">seconds</h2><p class=\"ds-row__hint\">misprints at half price</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-empty\" data-component=\"empty\">\n        <p class=\"ds-empty__text\">No seconds on this shelf today. The last batch printed clean.</p>\n        <a class=\"ds-button ds-button--secondary\" href=\"#shop\">Back to the shop front</a>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 3, one item: its picture and status, the text and sizes, what buyers said. -->\n<section class=\"ds-view\" id=\"item\">\n  <div class=\"ds-row ds-row--head\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">~</span><p class=\"ds-row__hint\">you are here</p></div>\n    <div class=\"ds-row__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#shop\">shop</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#catalogue\">apparel</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">CS-014</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Prompt tee</h1>\n          <p class=\"ds-page-header__text\">24.00, tax included. Leaves within a day of your order.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#cart\">Add to cart</a></div>\n      </header>\n    </div>\n  </div>\n  <div class=\"ds-row ds-row--mark\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">CS-014</span><h2 class=\"ds-row__name\">the item</h2><p class=\"ds-row__hint\">batch 7, printed in September</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-cols ds-cols--item\">\n        <div class=\"ds-stack\">\n          <div class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">front</h2>\n            <div class=\"ds-panel__body\">\n<pre class=\"ds-art\" aria-hidden=\"true\">      ____     ____\n     /    \\___/    \\\n    /               \\\n   /__             __\\\n      |           |\n      |   &gt;_      |\n      |           |\n      |           |\n      |___________|</pre>\n              <p class=\"ds-panel__text\">One print, one colour, on the chest.</p>\n            </div>\n          </div>\n          <div class=\"ds-badges\" data-component=\"badge\">\n            <span class=\"ds-badge\">7</span>\n            <span class=\"ds-badge ds-badge--success\">in stock</span>\n            <span class=\"ds-badge ds-badge--warning\">XL: 4 left</span>\n            <span class=\"ds-badge ds-badge--danger\">S: sold out</span>\n            <span class=\"ds-badge ds-badge--tag\">cotton</span>\n          </div>\n        </div>\n        <div class=\"ds-col\">\n          <p class=\"ds-text\">A shirt that says what you look at all day. Heavy combed cotton that keeps its shape, a collar that does not curl, and a print that is part of the cloth, not a film on top of it.</p>\n          <table class=\"ds-table ds-table--framed\">\n            <thead>\n              <tr><th>size</th><th class=\"ds-table__num\">chest, cm</th><th class=\"ds-table__num ds-table__extra\">length, cm</th><th>stock</th><th class=\"ds-table__num\">price</th></tr>\n            </thead>\n            <tbody>\n              <tr><td class=\"ds-table__code\">S</td><td class=\"ds-table__num\">92</td><td class=\"ds-table__num ds-table__extra\">68</td><td><span class=\"ds-badge ds-badge--danger\">sold out</span></td><td class=\"ds-table__num\">24.00</td></tr>\n              <tr class=\"is-selected\"><td class=\"ds-table__code\">M</td><td class=\"ds-table__num\">100</td><td class=\"ds-table__num ds-table__extra\">71</td><td>18 left</td><td class=\"ds-table__num\">24.00</td></tr>\n              <tr><td class=\"ds-table__code\">L</td><td class=\"ds-table__num\">108</td><td class=\"ds-table__num ds-table__extra\">74</td><td><span class=\"ds-badge ds-badge--success\">22 left</span></td><td class=\"ds-table__num\">24.00</td></tr>\n              <tr><td class=\"ds-table__code\">XL</td><td class=\"ds-table__num\">116</td><td class=\"ds-table__num ds-table__extra\">77</td><td><span class=\"ds-badge ds-badge--warning\">4 left</span></td><td class=\"ds-table__num\">24.00</td></tr>\n            </tbody>\n          </table>\n          <p class=\"ds-note\">Size M is chosen. Measured flat, doubled; a shirt may differ by a centimetre.</p>\n          <ul class=\"ds-links\" data-component=\"links\">\n            <li><a class=\"ds-link\" href=\"#help\">size guide</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#help\">washing (visited)</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#help\">returns (hover)</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#catalogue\">all apparel (active)</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">03</span><h2 class=\"ds-row__name\">buyers say</h2><p class=\"ds-row__hint\">3 of 41 notes</p></div>\n    <div class=\"ds-row__body\">\n      <ul class=\"ds-reviews\">\n        <li class=\"ds-review\">\n          <span class=\"ds-avatar\">mk</span>\n          <div><span class=\"ds-review__who\">mika</span> <span class=\"ds-review__meta\">size M, 2026-09-22, <span class=\"ds-tooltip\" tabindex=\"0\">bought here<span class=\"ds-tooltip__tip\" role=\"tooltip\">This note belongs to an order the shop has shipped.</span></span></span>\n            <p class=\"ds-review__text\">Washed it ten times. The print has not moved and neither has the collar.</p></div>\n        </li>\n        <li class=\"ds-review\">\n          <span class=\"ds-avatar ds-avatar--2\">jo</span>\n          <div><span class=\"ds-review__who\">jonas</span> <span class=\"ds-review__meta\">size L, 2026-09-14</span>\n            <p class=\"ds-review__text\">Runs a little long. Good cloth, and the parcel came in two days.</p></div>\n        </li>\n        <li class=\"ds-review\">\n          <span class=\"ds-avatar ds-avatar--3\">ai</span>\n          <div><span class=\"ds-review__who\">aiko</span> <span class=\"ds-review__meta\">size S, 2026-08-30</span>\n            <p class=\"ds-review__text\">The only shirt my colleagues have asked about. Please print S again.</p></div>\n        </li>\n      </ul>\n    </div>\n  </div>\n</section>\n\n<!-- View 4, the cart: notes from the shop, the lines and their sum, the question before a line is removed. -->\n<section class=\"ds-view\" id=\"cart\">\n  <div class=\"ds-row ds-row--head\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">~</span><p class=\"ds-row__hint\">you are here</p></div>\n    <div class=\"ds-row__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#shop\">shop</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">cart</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Cart</h1>\n          <p class=\"ds-page-header__text\">2 lines, 3 pieces. Nothing is reserved until the order is placed.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#order\">Check out</a></div>\n      </header>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">01</span><h2 class=\"ds-row__name\">notes</h2><p class=\"ds-row__hint\">from the shop</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-notices\" data-component=\"notice\">\n        <p class=\"ds-notice\"><span class=\"ds-notice__title\">Today.</span> Place the order before 14:00 and the parcel leaves this afternoon.</p>\n        <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Changed.</span> Only 2 cursor mugs were left, so the line was cut from 3 pieces to 2.</p>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-row ds-row--mark\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">02</span><h2 class=\"ds-row__name\">lines</h2><p class=\"ds-row__hint\">prices in EUR</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-cols\">\n        <div class=\"ds-col\">\n          <table class=\"ds-table\">\n            <thead>\n              <tr><th>item</th><th class=\"ds-table__extra\">size</th><th class=\"ds-table__num\">pieces</th><th class=\"ds-table__num ds-table__extra\">each</th><th class=\"ds-table__num\">sum</th></tr>\n            </thead>\n            <tbody>\n              <tr><td><a class=\"ds-table__title\" href=\"#item\">Prompt tee</a></td><td class=\"ds-table__extra\">M</td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">24.00</td><td class=\"ds-table__num\">24.00</td></tr>\n              <tr class=\"is-alt\"><td><a class=\"ds-table__title\" href=\"#item\">Cursor mug</a></td><td class=\"ds-table__extra\">330 ml</td><td class=\"ds-table__num\">2</td><td class=\"ds-table__num ds-table__extra\">14.00</td><td class=\"ds-table__num\">28.00</td></tr>\n              <tr><td>Parcel, inside the union</td><td class=\"ds-table__extra\"></td><td class=\"ds-table__num\">1</td><td class=\"ds-table__num ds-table__extra\">5.50</td><td class=\"ds-table__num\">5.50</td></tr>\n              <tr class=\"ds-table__total\"><td>to pay</td><td class=\"ds-table__extra\"></td><td class=\"ds-table__num\">3</td><td class=\"ds-table__num ds-table__extra\"></td><td class=\"ds-table__num\">57.50</td></tr>\n            </tbody>\n          </table>\n          <p class=\"ds-note\">8.00 more and the parcel is free.</p>\n          <p class=\"ds-progress\"><span class=\"ds-progress__label\">free parcel</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on ds-progress__on--warning\">##############</span>..</span><span class=\"ds-progress__value\">52.00 of 60.00</span></p>\n        </div>\n        <div class=\"ds-dialog__backdrop\">\n          <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-1\">\n            <h2 class=\"ds-dialog__title\" id=\"dlg-1\">remove the mugs?</h2>\n            <div class=\"ds-dialog__body\">\n              <p class=\"ds-dialog__text\">2 cursor mugs leave the cart. They are the last two, and someone else may take them.</p>\n              <div class=\"ds-dialog__actions\">\n                <button class=\"ds-button ds-button--danger\" type=\"button\">Remove</button>\n                <a class=\"ds-button ds-button--secondary\" href=\"#cart\">Keep them</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">03</span><h2 class=\"ds-row__name\">for later</h2><p class=\"ds-row__hint\">kept for 30 days</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-empty\">\n        <p class=\"ds-empty__text\">Nothing is saved for later.</p>\n        <a class=\"ds-button ds-button--secondary\" href=\"#catalogue\">Browse the catalogue</a>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 5, the order: the step, the address form with its buttons, the receipt and the extras. -->\n<section class=\"ds-view\" id=\"order\">\n  <div class=\"ds-row ds-row--head\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">~</span><p class=\"ds-row__hint\">you are here</p></div>\n    <div class=\"ds-row__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#shop\">shop</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#cart\">cart</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">order</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Order</h1>\n          <p class=\"ds-page-header__text\">Where the parcel goes. Payment is the next and last step.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#cart\">Back to the cart</a></div>\n      </header>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">01</span><h2 class=\"ds-row__name\">step</h2><p class=\"ds-row__hint\">cart, address, payment</p></div>\n    <div class=\"ds-row__body\">\n      <p class=\"ds-progress\"><span class=\"ds-progress__label\">2 of 3</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on\">################</span>........</span><span class=\"ds-progress__value\">address</span></p>\n    </div>\n  </div>\n  <div class=\"ds-row ds-row--mark\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">02</span><h2 class=\"ds-row__name\">address</h2><p class=\"ds-row__hint\">as the carrier should read it</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-cols\">\n        <form class=\"ds-form\" data-component=\"form\">\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-name\">name</label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input\" id=\"f-name\" type=\"text\" value=\"R. Reader\"></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-mail\">mail</label>\n            <div class=\"ds-form__field\">\n              <input class=\"ds-form__input is-invalid\" id=\"f-mail\" type=\"text\" value=\"reader@example\">\n              <p class=\"ds-form__error\">This address has no domain ending. The receipt is sent by mail.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-land\">country</label>\n            <div class=\"ds-form__field\">\n              <select class=\"ds-form__input ds-form__input--auto\" id=\"f-land\">\n                <option>inside the union</option>\n                <option>rest of Europe</option>\n                <option>rest of the world</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-addr\">address</label>\n            <div class=\"ds-form__field\">\n              <textarea class=\"ds-form__input ds-form__input--wide\" id=\"f-addr\" rows=\"3\">12 Example Lane\n40210 Sampleton</textarea>\n              <p class=\"ds-form__hint\">Street and number, then postcode and town.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <span class=\"ds-form__label\">terms</span>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> I have read how returns work</label>\n            </div>\n          </div>\n          <div class=\"ds-form__actions\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"button\">Go to payment</button>\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Save for later</button>\n            <button class=\"ds-button ds-button--danger\" type=\"button\">Empty the cart</button>\n            <button class=\"ds-button\" type=\"button\" disabled>Pay by invoice</button>\n          </div>\n        </form>\n        <div class=\"ds-stack\">\n          <div class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">receipt</h2>\n            <div class=\"ds-panel__body\">\n              <div class=\"ds-receipt\">\n                <p class=\"ds-receipt__row\"><span>1 Prompt tee, M</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">24.00</span></p>\n                <p class=\"ds-receipt__row\"><span>2 Cursor mug</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">28.00</span></p>\n                <p class=\"ds-receipt__row\"><span>Parcel</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">5.50</span></p>\n                <p class=\"ds-receipt__row ds-receipt__row--total\"><span>to pay</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">57.50</span></p>\n              </div>\n            </div>\n          </div>\n          <div class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">extras</h2>\n            <div class=\"ds-panel__body\">\n              <div class=\"ds-setting\"><label class=\"ds-switch\"><span class=\"ds-switch__label\">a sticker in the parcel</span><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></label></div>\n              <div class=\"ds-setting\"><label class=\"ds-switch\"><span class=\"ds-switch__label\">tracking by mail</span><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></label></div>\n              <div class=\"ds-setting\"><label class=\"ds-switch\"><span class=\"ds-switch__label\">news of new batches</span><input class=\"ds-switch__input\" type=\"checkbox\"><span class=\"ds-switch__track\"></span></label></div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 6, help: how ordering works as running text, beside the questions asked most as a folding list. -->\n<section class=\"ds-view\" id=\"help\">\n  <div class=\"ds-row ds-row--head\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">~</span><p class=\"ds-row__hint\">you are here</p></div>\n    <div class=\"ds-row__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#shop\">shop</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">help</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Help</h1>\n          <p class=\"ds-page-header__text\">How an order travels from the cart to your door, and what to do when it does not.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#help\">Write to us</a></div>\n      </header>\n    </div>\n  </div>\n  <div class=\"ds-row\">\n    <div class=\"ds-row__gutter\"><span class=\"ds-row__num\">01</span><h2 class=\"ds-row__name\">the manual</h2><p class=\"ds-row__hint\">read once, order often</p></div>\n    <div class=\"ds-row__body\">\n      <div class=\"ds-cols\">\n        <div class=\"ds-prose\" data-component=\"typography\">\n          <h1>How ordering works</h1>\n          <p>The chronoskin shop is run by two people of the project. There is no warehouse: goods are printed in <strong>small batches</strong> and sent from one room.</p>\n          <h2>From cart to door</h2>\n          <ul>\n            <li>Fill the cart and give an address. No account is needed.</li>\n            <li>Pay by card or transfer. The receipt comes by mail.</li>\n            <li>The parcel leaves within a day and carries a tracking number.</li>\n          </ul>\n          <h2>When something is wrong</h2>\n          <p>Answer the receipt and say what happened. Quote the order number, which looks like <code>CS-2026-03180</code>, and we take it from there.</p>\n          <h3>Returns</h3>\n          <p>Unworn goods come back within 30 days. Seconds and stickers do not.</p>\n          <h3>Batches</h3>\n          <p>A sold out size returns with the next batch, about every six weeks.</p>\n        </div>\n        <div class=\"ds-stack\">\n          <div class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">asked most</h2>\n            <div class=\"ds-panel__body\">\n              <div class=\"ds-accordion\">\n                <details class=\"ds-accordion__item\" open>\n                  <summary class=\"ds-accordion__title\">How long does a parcel take?</summary>\n                  <div class=\"ds-accordion__body\"><p>Two to four working days inside the union, up to two weeks beyond it.</p></div>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__title\">Do you ship everywhere?</summary>\n                  <div class=\"ds-accordion__body\"><p>To 41 countries so far. The order form lists them.</p></div>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__title\">Can I change an order?</summary>\n                  <div class=\"ds-accordion__body\"><p>Until it is packed. Answer the receipt.</p></div>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__title\">Where does the money go?</summary>\n                  <div class=\"ds-accordion__body\"><p>To the build machines and the people who mind them.</p></div>\n                </details>\n              </div>\n            </div>\n          </div>\n          <div class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">costs of a parcel</h2>\n            <div class=\"ds-panel__body\">\n              <div class=\"ds-receipt\">\n                <p class=\"ds-receipt__row\"><span>inside the union</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">5.50</span></p>\n                <p class=\"ds-receipt__row\"><span>rest of Europe</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">9.00</span></p>\n                <p class=\"ds-receipt__row\"><span>rest of the world</span><span class=\"ds-receipt__fill\"></span><span class=\"ds-receipt__sum\">16.00</span></p>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n</main>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <ul class=\"ds-footer__keys\">\n    <li><a class=\"ds-footer__link\" href=\"#help\">shipping</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#help\">returns</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#catalogue\">catalogue</a></li>\n  </ul>\n  <p class=\"ds-footer__text\">chronoskin shop, run by the project. Prices in EUR, tax included.</p>\n</footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.terminal.shop.s08.p04.t05.u01\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"terminal\",\n    \"years\": [\n      2015,\n      2026\n    ]\n  },\n  \"archetype\": \"shop\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1280,\n    \"fluid\": false,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-tm-8451\",\n  \"short\": \"v1-tm-8451\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #e8e8e8;\n  --color-canvas: #ffffff;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f3f3f3;\n  --color-surface-strong: #dedede;\n  --color-bar: #000000;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #dedede;\n  --color-bar-alt-text: #000000;\n  --color-inverse: #000000;\n  --color-inverse-text: #ffffff;\n  --color-text: #1c1c1c;\n  --color-text-muted: #636363;\n  --color-heading: #000000;\n  --color-heading-alt: #a3001b;\n  --color-link: #0037a6;\n  --color-link-quiet: #1c1c1c;\n  --color-link-visited: #6a2c91;\n  --color-link-hover: #000000;\n  --color-link-active: #a3001b;\n  --color-border: #000000;\n  --color-border-strong: #000000;\n  --color-border-muted: #c4c4c4;\n  --color-accent: #ffe14d;\n  --color-accent-text: #000000;\n  --color-accent-alt: #006f80;\n  --color-fill-1: #ffffff;\n  --color-fill-2: #f3f3f3;\n  --color-fill-3: #e8e8e8;\n  --color-fill-4: #f3f3f3;\n  --color-button: #000000;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffe14d;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #000000;\n  --color-input: #ffffff;\n  --color-input-text: #000000;\n  --color-input-border: #000000;\n  --color-disabled: #e8e8e8;\n  --color-disabled-text: #8a8a8a;\n  --color-danger: #a3001b;\n  --color-danger-surface: #fbe9ec;\n  --color-success: #1a7a1a;\n  --color-warning: #8a5a00;\n  --color-notice: #f3f3f3;\n  --color-notice-text: #1c1c1c;\n  --color-focus: #0037a6;\n  --color-shadow: #000000;\n  --color-overlay: #c4c4c4;\n}\n\n/* @part type */\n:root {\n  --font-body: \"Source Code Pro\", \"DejaVu Sans Mono\", \"Andale Mono\", \"Lucida Console\", monospace;\n  --font-heading: \"Source Code Pro\", \"DejaVu Sans Mono\", \"Andale Mono\", \"Lucida Console\", monospace;\n  --font-ui: \"Source Code Pro\", \"DejaVu Sans Mono\", \"Andale Mono\", \"Lucida Console\", monospace;\n  --font-mono: \"Source Code Pro\", \"DejaVu Sans Mono\", \"Andale Mono\", \"Lucida Console\", monospace;\n  --text-base: 13px;\n  --text-small: 12px;\n  --text-ui: 13px;\n  --text-large: 15px;\n  --text-display: 24px;\n  --text-h1: 18px;\n  --text-h2: 13px;\n  --text-h3: 13px;\n  --line-body: 1.35;\n  --line-heading: 1.2;\n  --line-display: 1.1;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 400;\n  --weight-ui: 400;\n  --heading-transform: lowercase;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: none;\n  --shadow-control-hover: none;\n  --shadow-control-pressed: none;\n  --shadow-dialog: none;\n  --shadow-text: 0 0 4px color-mix(in srgb, var(--color-accent) 30%, transparent);\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) 70%, white);\n  --fill-button-secondary: transparent;\n  --fill-input: transparent;\n  --focus-ring: 1px solid var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
