{
  "id": "v1-tm-2222",
  "long_id": "v1.terminal.app.s02.p02.t02.u02",
  "name": "Terminal, a full-screen text-mode program",
  "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": "app",
  "mode": "pure",
  "viewport": {
    "width": 1280,
    "fluid": false
  },
  "summary": "This is a web application built as a full-screen text-mode program, a form that came back between 2015 and 2026 with terminal user interfaces and the libraries that copy them in the browser. The screen is a menu line, framed panes that sit one cell apart with their titles cut into the top line, and a row of numbered function keys at the foot; one monospace face sets everything and whatever is selected is shown in inverse video. It was used for mail readers, file managers, monitors and dashboards made by and for people who live in a terminal.",
  "url": "https://chrono.skin/s/v1-tm-2222",
  "preview_url": "https://chrono.skin/s/v1-tm-2222/specimen.html",
  "files": {
    "STYLE.md": "# Terminal, a full-screen text-mode program\n\n## Summary\n\nThis is a web application built as a full-screen text-mode program, a form that came back between 2015 and 2026 with terminal user interfaces and the libraries that copy them in the browser. The screen is a menu line, framed panes that sit one cell apart with their titles cut into the top line, and a row of numbered function keys at the foot; one monospace face sets everything and whatever is selected is shown in inverse video. It was used for mail readers, file managers, monitors and dashboards made by and for people who live in a terminal.\n\n## Layout\n\n- The page is designed for a 1280px window and does not stretch: `.ds-screen` is the whole screen, at most `--size-page` (1280px) wide and at least as tall as the window, a column of `.ds-nav`, `.ds-main` and `.ds-footer` on `--color-canvas`. Nothing is centred and there are no margins beyond one cell.\n- `.ds-nav` is the menu line on `--fill-bar`, as wide as the screen: the `.ds-brand`, then `.ds-nav__list` whose `.ds-nav__link` items carry their hot letter underlined (`.ds-nav__hot`), and `.ds-nav__status` at the right. The open menu is a hole in the bar: `--color-canvas` with `--color-heading`.\n- `.ds-main` holds the views with one cell of padding. Panes are laid out by `.ds-panes`, a grid one cell (`1ch`, `--space-2`) apart whose panes stretch to one height: `--top` is 3 to 2, `--work` is a `--size-side` (230px) column beside the rest, `--wide` is 2 to 1, `--even` two halves. A `.ds-pane` is a frame with `.ds-pane__title` cut into its top line, a `.ds-pane__body` (`--flush` when a table fills it) and an optional `.ds-pane__foot`, a ruled line of key hints and pagination. `.ds-stack` piles panes in a column.\n- The home view (the inbox) is three rows of panes: the message of the day (`.ds-hero`) beside the status figures; the folders (`.ds-sidebar`, always at the left) beside the message table; the preview panel beside the accounts.\n- Inner pages have no hero. They open with the `.ds-breadcrumb`, then `.ds-page-header`, then panes: `--wide` with the work at the left and a stack of narrow panes at the right (message, compose), or tabs across the screen with the grid in `.ds-tabs__body` and two even panes under it (help).\n- Views. The specimen is one small program with four views, one showing at a time; menu line and key bar are written once around them. `inbox` is the home view. `message` is one message: badges, its text, links, key hints and pagination in the pane foot, beside the thread list and the table of attached files. `compose` is the two notices, the form with bracketed fields, its error and its four buttons, beside the discard dialog and a pane of keys. `help` is the tabs, the grid of four key groups, the empty state of the filters and a pane about the program. A view is `<section class=\"ds-view\" id=\"...\">`; links between views are plain `href=\"#id\"`.\n- Spacing scale, tight as a text screen: `--space-1` 3px is the vertical padding of menu items, buttons, inputs and tabs and the padding above the text in a pane; `--space-2` 8px the gap between panes, between notices and under the text of a pane; `--space-3` 16px the gap between paragraphs, under a page header and at the foot of the screen; `--space-4` 24px and `--space-5` 40px are kept for larger breaks. Table rows have no vertical padding: one text line a row.\n- Fixed sizes: `--size-label` 110px the label column of a form, `--size-field` 620px a field, `--size-date` 90px the date column of the list, `--size-dialog` 400px a dialog.\n- Below 720px every `.ds-panes` is one column, in source order (folders above the list). The status of the menu line is left out, the key bar becomes two rows of four, form labels sit above their fields, the grid is one cell across and table cells marked `.ds-table__extra` are left out. The page never scrolls sideways.\n\n## Typography and colour roles\n\n- One face for everything: `--font-body`, `--font-heading`, `--font-ui` and `--font-mono` are the same monospace stack (\"IBM Plex Mono\", \"Courier Prime\", \"Courier New\", Courier, monospace). Weights are `--weight-body` 400, `--weight-ui` 500 and 600 for bold and headings. The stack starts with IBM Plex Mono and Courier Prime and falls back to Courier New: a typewriter face suits paper. Nothing is tracked: `--heading-tracking` and `--display-tracking` are 0.\n- Sizes stay close to one size, as on a screen of character cells: `--text-base` 16px with `--line-body` 1.5 is all running text, `--text-ui` 15px navigation, buttons, inputs, tabs and pagination, `--text-small` 14px meta lines, hints, badges, code blocks and the status line, `--text-large` 18px the hero's lead and the brand name. Headings are told apart by weight and colour more than by size: `--text-display` 38px is the hero title only, `--text-h1` 26px a page title and the first heading of running text, `--text-h2` 19px section rules and second headings, `--text-h3` 16px frame titles, grid titles and third headings. `--heading-transform` is none, `--ui-transform` is lowercase.\n- Dark brown ink on warm paper, the light scheme of the era: the bars and inverse video are the ink colour, links and frame titles a burnt orange, and one blue marks flags.\n- The screen: `--color-page` #efe6c8 is the window, `--color-canvas` #fbf5dc the sheet the text stands on, `--color-surface` #fbf5dc the inside of frames and table rows, `--color-surface-alt` #f1e9c9 alternate rows, code blocks and the install line, `--color-surface-strong` #e4d9b0 group rows and inline code. `--color-text` #3b2a1a is running text, `--color-text-muted` #7a6748 dates, counts, hints and the brackets of fields, `--color-heading` #1f140a headings, typed commands and figures, `--color-heading-alt` #9a4a00 frame titles, third headings and tags.\n- Links: `--color-link` #a64b00, `--color-link-quiet` #3b2a1a for navigation, breadcrumb, tabs and sidebar links, `--color-link-visited` #6b4a6e, `--color-link-hover` #1f140a, `--color-link-active` #c2410c. `--link-decoration` is none for links in text and titles, `--link-decoration-quiet` none for navigation, and every link takes `--link-decoration-hover` (underline) when hovered. A link may also be marked by brackets (`.ds-link--bracket`).\n- Bars: `--color-bar` #3b2a1a with `--color-bar-text` #fbf5dc is the head row of a table and, where a layout has one, the menu line and the labels of the key bar. `--color-bar-alt` #e4d9b0 with `--color-bar-alt-text` #3b2a1a is the status line at the foot. `--color-inverse` #3b2a1a with `--color-inverse-text` #fbf5dc is inverse video: the current navigation link, tab, page number and sidebar link, the selected table row, a text selection.\n- Lines: `--color-border` #8c7a58 at `--border-width` 1px `--border-style` dashed draws every frame and rule; `--color-border-strong` #3b2a1a at `--border-width-strong` 3px is the rule under a page header, the left edge of a notice and the frame of a dialog; `--color-border-muted` #cfc39c parts rows inside a frame and boxes the empty state.\n- Accents: `--color-accent` #c2410c with `--color-accent-text` #fffbdc is the count badge; `--color-accent-alt` #1a6fb0 is the prompt sign and flag letters. `--color-fill-1` to `--color-fill-4` (#fbf5dc, #f1e9c9, #e4d9b0, #f1e9c9) are the four grid cells. Status words are text in brackets: `--color-success` #3d7a1c, `--color-warning` #a86400, `--color-danger` #b3123f; meters use the first two.\n- Controls: the primary button is `--color-button` #3b2a1a with `--color-button-text` #fbf5dc; the secondary button is `--fill-button-secondary` with `--color-button-secondary-text` #3b2a1a and a frame in `--color-border`; fields are `--fill-input` with `--color-input-text` #1f140a and a line in `--color-input-border` #8c7a58; disabled is `--color-disabled` #e4d9b0 with `--color-disabled-text` #9c8c6a. The notice is `--color-notice` #f1e9c9 with `--color-notice-text` #3b2a1a, the error notice `--color-danger-surface` #f8e1d4 with `--color-danger`. `--color-overlay` #e4d9b0 is the block a dialog stands on; `--color-focus` #c2410c is the focus outline.\n- Surface: Lines are dashed, the way a frame is typed with hyphens, and the heavy rule is 3px. `--fill-panel` is transparent, so frames show the canvas; `--fill-button-secondary` and `--fill-input` are their own colours; `--fill-button-hover` darkens the button (80% of it over black). The only shadows are states drawn with hard lines: `--shadow-control-hover` is a 2px underline in `--color-border-strong`, `--shadow-control-pressed` a 1px inner line; `--shadow-panel`, `--shadow-control`, `--shadow-dialog` and `--shadow-text` are none. All four radii are 0 and `--backdrop-blur` is 0px. `--focus-ring` is 2px dashed var(--color-focus); `--transition` is none: states change at once. The only motion is the blinking `.ds-cursor`, and only under `prefers-reduced-motion: no-preference`.\n- The era's rule for which text stands on which fill (all three layouts keep 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. Where the navigation stands on `--fill-bar`, its current item is a hole in the bar: `--color-canvas` with `--color-heading`. Nothing but a button, a badge or a key label stands on a bar or an inverse block.\n- One-off sizes written with `calc()` or `ch`: a frame title is lifted by half of `--text-h3` times `--line-body` so that the frame's top line runs through it; the brand tile is one text line square (`--text-base` times `--line-body`); horizontal paddings and column gaps are whole character cells (`1ch`, `2ch`, `3ch`, `4ch`); the checkbox is `2ch` square.\n\n## Components\n\n- `.ds-page` on `<body>`: page fill and base type, no margin. `.ds-screen` is the screen; `.ds-main` holds the views; `.ds-panes` (`--top`, `--work`, `--wide`, `--even`) lay out `.ds-pane` frames; `.ds-stack` piles them. `.ds-keys` is a two-column list of keys (`dt`) and what they do (`dd`).\n- `.ds-nav`: the menu line. `.ds-nav__list` holds `.ds-nav__link` items, each with its hot letter in `.ds-nav__hot`; `.ds-nav__status` is the text at the right. The stylesheet marks the link whose `href` names the view that is showing (one selector per view, and the home link when the address names none); on a page of its own give the link `is-current`.\n- `.ds-hero`: the message of the day, a `.ds-pane` like the others: `.ds-hero__title` (`--text-display`), `.ds-hero__lead` and a `.ds-buttons` row with the main action.\n- `.ds-footer`: the key bar on `--fill-bar-alt`: a `.ds-footer__note` line, then eight `.ds-footer__key` links in a row, each a `.ds-footer__num` and a `.ds-footer__label` on `--fill-bar`.\n- `.ds-brand`: the site's mark and name, a link to the home view, first thing in the header. `.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: `.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. A rule of `--border-width-strong` 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 (`[copy]`, `[get]`). `.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 angle brackets, which the stylesheet adds: `< Send >`. 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` ending in a colon and a `.ds-form__field`. Controls take `.ds-form__input` (`--wide` for the full width, `--auto` for selects). Each control sits in a `.ds-form__control` (`--auto` beside a select), which sets it in muted square brackets and leaves only its bottom line: `[ text____ ]`. `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.\n- `.ds-table`: aligned columns under a head row on `--fill-bar`. `.ds-table__num` right-aligns a numeric column, `.ds-table__code` is a bold first column, `.ds-table__date` a muted one, `tr.is-alt` an alternate row, `.ds-table__group` a group row, `tr.is-selected` the row under the cursor in inverse video, `tr.is-unread` a bold row, `.ds-table__title` the link in a row, `.ds-table__extra` cells a phone leaves out. Rows are one text line tall with no rules between them. `.ds-table__flag` is the narrow first column of flag letters in `--color-accent-alt`.\n- `.ds-list`: entries of a thread. Each `.ds-list__item` is a muted `.ds-list__date` in a `--size-date` column and a `.ds-list__main` with a bold `.ds-list__title` link and a small `.ds-list__meta` line (`.ds-list__excerpt` for a sentence); 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 (a one-cell rule, the title, a rule to the corner), so the frame works on any fill and with any border style; a panel always has a title.\n- `.ds-stat`: one line of a status screen: `.ds-stat__label`, a dotted leader the stylesheet draws, then a bold `.ds-stat__value` at the right. `.ds-stats` is the list of them, a column inside a pane, not a row of cards.\n- `.ds-grid`: four `.ds-grid__cell` boxes (four across, one 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 an optional muted `.ds-grid__label`.\n- `.ds-tabs`: a row of words on a rule; each `.ds-tabs__tab` is a link, 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, with no fill and no frame. `.ds-badges` sets several in a line.\n- `.ds-sidebar`: the folder pane, at the left of the work row and as tall as the pane beside it. 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 optional `.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 block of inverse video (`--fill-inverse`, `--color-inverse-text`), `--size-dialog` wide, with its frame and title drawn inside it in the text colour; its secondary button is a frame in that colour. 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- Text-mode pieces: `.ds-prompt` is a typed command line (`.ds-prompt__sign` the `$`, `.ds-prompt__path` the directory); `.ds-cursor` is the block cursor, a `<span>` holding one no-break space; `.ds-key` is a key hint whose `.ds-key__cap` is set in brackets (`[q] quit`); `.ds-meter` is a progress bar typed in block characters, the filled part in `.ds-meter__on` (`--warning` for the amber one); `.ds-section__title` is a heading followed by a rule to the right edge; `.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 <= 38px`: the largest text is the hero title; everything else is within a few pixels of the body size.\n- `font-size >= 14px`: 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.6`: 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 <= 3px`: lines are one weight, with one heavier rule.\n- `transition = none`: states change at once, as a screen redraws.\n- `text-shadow = none`: text is flat.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. 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 or a `.ds-list__item`. A set of choices copies `.ds-tabs`, and whatever is current or selected is inverse video (`--fill-inverse` with `--color-inverse-text`). A status is a word in brackets in its status colour; a quantity is a `.ds-meter` of block characters; an action is a word dressed as `.ds-button`, with its key given as a `.ds-key`. 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 picture or a second typeface.\n",
    "components.css": "/* Layout tokens (structure part). A full-screen text-mode program: the\n   screen is as wide as the window, panes sit one cell apart, rows are tight. */\n:root {\n  --size-page: 1280px;\n  --size-side: 230px;\n  --size-label: 110px;\n  --size-field: 620px;\n  --size-dialog: 400px;\n  --size-date: 90px;\n  --space-1: 3px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 40px;\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-pane {\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-pane__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-pane__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-pane__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 {\n  margin: 0 0 var(--space-4);\n}\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.ds-prompt__sign {\n  color: var(--color-accent-alt);\n}\n.ds-prompt__path {\n  color: var(--color-heading-alt);\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-meter__on {\n  color: var(--color-success);\n}\n.ds-meter__on--warning {\n  color: var(--color-warning);\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/* ---------- layout 2: a full-screen program: menu line, panes, function keys ---------- */\n.ds-screen {\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  padding: var(--space-2) 1ch var(--space-3);\n}\n.ds-panes {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-2) 1ch;\n  align-items: stretch;\n  margin: 0 0 var(--space-2);\n}\n.ds-panes--top {\n  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);\n}\n.ds-panes--work {\n  grid-template-columns: var(--size-side) minmax(0, 1fr);\n}\n.ds-panes--wide {\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n}\n.ds-panes--even {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ds-stack {\n  display: grid;\n  gap: var(--space-2);\n  align-content: start;\n  min-width: 0;\n}\n.ds-pane__body {\n  padding: var(--space-1) 1ch var(--space-2);\n}\n.ds-pane__body--flush {\n  padding: var(--space-1) 0 0;\n}\n.ds-pane__foot {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-1) 2ch;\n  padding: var(--space-1) 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n}\n.ds-pane__foot .ds-pagination {\n  margin: 0;\n}\n.ds-sidebar__block {\n  height: 100%;\n}\n\n/* nav: the menu line, in the bar colours; the open menu is a hole in the bar */\n.ds-nav {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 0 2ch;\n  padding: 0 1ch;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-shadow: var(--shadow-text);\n}\n.ds-nav .ds-brand,\n.ds-nav .ds-brand__name {\n  color: var(--color-bar-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__link {\n  display: block;\n  padding: var(--space-1) 1ch;\n  color: var(--color-bar-text);\n  text-decoration: var(--link-decoration-quiet);\n  text-transform: var(--ui-transform);\n}\n.ds-nav__hot {\n  text-decoration: underline;\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#inbox\"],\n.ds-page:has(#inbox:target) .ds-nav__link[href=\"#inbox\"],\n.ds-page:has(#message:target) .ds-nav__link[href=\"#message\"],\n.ds-page:has(#compose:target) .ds-nav__link[href=\"#compose\"],\n.ds-page:has(#help:target) .ds-nav__link[href=\"#help\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n  text-shadow: none;\n}\n.ds-nav__status {\n  margin: 0 0 0 auto;\n}\n\n/* hero: the message of the day, a pane like the others */\n.ds-hero__title {\n  margin: 0 0 var(--space-1);\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  margin: 0 0 var(--space-3);\n  font-size: var(--text-large);\n}\n.ds-hero .ds-pane__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n\n/* stats: label, leader, figure: lines of a status screen */\n.ds-stats {\n  display: block;\n}\n.ds-stat {\n  display: flex;\n  align-items: baseline;\n  gap: 1ch;\n}\n.ds-stat__label {\n  order: 1;\n  color: var(--color-text);\n}\n.ds-stat::before {\n  content: \"\";\n  order: 2;\n  flex: 1;\n  min-width: 2ch;\n  border-bottom: var(--border-width) dotted var(--color-border);\n}\n.ds-stat__value {\n  order: 3;\n  text-shadow: var(--shadow-text);\n}\n\n/* tables are tight: one text line a row, no rules between rows */\n.ds-table th,\n.ds-table td {\n  padding: 0 1ch;\n  border-width: 0;\n}\n.ds-table td.ds-table__flag {\n  width: 2ch;\n  color: var(--color-accent-alt);\n  font-weight: var(--weight-bold);\n}\n\n/* form: fields in brackets on a ruled line */\n.ds-form__control {\n  display: flex;\n  align-items: flex-start;\n  max-width: var(--size-field);\n  color: var(--color-text-muted);\n}\n.ds-form__control::before {\n  content: \"[\";\n  padding: var(--space-1) 0;\n}\n.ds-form__control::after {\n  content: \"]\";\n  padding: var(--space-1) 0;\n}\n.ds-form__control .ds-form__input {\n  flex: 1;\n  min-width: 0;\n  max-width: none;\n  border-width: 0 0 var(--border-width);\n}\n.ds-form__control--auto {\n  display: inline-flex;\n}\n\n/* dialog: a block of inverse video with the frame drawn inside it */\n.ds-dialog {\n  margin-top: 0;\n  padding: var(--space-2) 1ch;\n  border: 0;\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-dialog__title {\n  margin: 0 0 calc(var(--text-h3) * var(--line-body) * -0.5);\n  color: var(--color-inverse-text);\n}\n.ds-dialog__title::before,\n.ds-dialog__title::after {\n  border-color: currentColor;\n}\n.ds-dialog__body {\n  padding-top: calc(var(--text-h3) * var(--line-body) * 0.5 + var(--space-2));\n  border: var(--border-width) var(--border-style) currentColor;\n  border-top: 0;\n}\n.ds-dialog .ds-button--secondary,\n.ds-dialog .ds-button--secondary:hover {\n  border-color: currentColor;\n  background: transparent;\n  color: var(--color-inverse-text);\n}\n.ds-grid {\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-2) 1ch;\n}\n.ds-keys {\n  display: grid;\n  grid-template-columns: 9ch minmax(0, 1fr);\n  gap: 0 1ch;\n  margin: 0;\n}\n.ds-keys dt {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-keys dd {\n  margin: 0;\n}\n\n/* footer: the function keys: a number, then its label on the bar fill */\n.ds-footer {\n  display: grid;\n  grid-template-columns: repeat(8, minmax(0, 1fr));\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}\n.ds-footer__note {\n  grid-column: 1 / -1;\n  margin: 0;\n  padding: 0 1ch;\n}\n.ds-footer__key {\n  display: flex;\n  min-width: 0;\n  color: var(--color-bar-alt-text);\n  text-decoration: none;\n}\n.ds-footer__num {\n  flex: none;\n  padding: 0 0.5ch 0 1ch;\n}\n.ds-footer__label {\n  flex: 1;\n  min-width: 0;\n  padding: 0 1ch;\n  overflow: hidden;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n}\n.ds-footer__key:hover .ds-footer__label,\n.ds-footer__key.is-hover .ds-footer__label {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- narrow windows: one column, nothing scrolls sideways but code ---------- */\n@media (max-width: 720px) {\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\n  .ds-panes--top,\n  .ds-panes--work,\n  .ds-panes--wide,\n  .ds-panes--even {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-nav__status {\n    display: none;\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-stats {\n    display: block;\n  }\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-footer {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n  .ds-list__item {\n    grid-template-columns: minmax(0, 1fr);\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 mail: a text-mode mail reader. 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-screen\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#inbox\"><span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"square\" aria-hidden=\"true\"><path d=\"M12 3a9 9 0 1 1-9 9\"/><path d=\"M12 17a5 5 0 1 1 5-5\"/><circle cx=\"12\" cy=\"12\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/></svg></span><span class=\"ds-brand__name\">chronoskin</span></a>\n  <ul class=\"ds-nav__list\">\n    <li><a class=\"ds-nav__link\" href=\"#inbox\"><span class=\"ds-nav__hot\">I</span>nbox</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#message\"><span class=\"ds-nav__hot\">M</span>essage</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#compose\"><span class=\"ds-nav__hot\">C</span>ompose</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#help\"><span class=\"ds-nav__hot\">H</span>elp</a></li>\n  </ul>\n  <p class=\"ds-nav__status\">reader@chronoskin | 2 accounts | 08:44</p>\n</header>\n\n<main class=\"ds-main\">\n\n<!-- View 1, the inbox: message of the day and status, folders beside the message list, a preview. -->\n<section class=\"ds-view ds-view--home\" id=\"inbox\">\n  <div class=\"ds-panes ds-panes--top\">\n    <section class=\"ds-pane ds-hero\" data-component=\"hero\">\n      <h2 class=\"ds-pane__title\">today</h2>\n      <div class=\"ds-pane__body\">\n        <h1 class=\"ds-hero__title\">3 unread in 2 folders</h1>\n        <p class=\"ds-hero__lead\">Last fetched at 08:42. Nothing is waiting in the outbox.</p>\n        <div class=\"ds-buttons\">\n          <a class=\"ds-button\" href=\"#compose\">Compose</a>\n          <a class=\"ds-button ds-button--secondary is-hover\" href=\"#inbox\">Fetch mail</a>\n          <a class=\"ds-link ds-link--quiet\" href=\"#help\">all keys</a>\n        </div>\n      </div>\n    </section>\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">status</h2>\n      <div class=\"ds-pane__body\">\n        <ul class=\"ds-stats\" data-component=\"stats\">\n          <li class=\"ds-stat\"><span class=\"ds-stat__label\">unread</span><span class=\"ds-stat__value\">3</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__label\">flagged</span><span class=\"ds-stat__value\">5</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__label\">drafts</span><span class=\"ds-stat__value\">2</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__label\">messages kept</span><span class=\"ds-stat__value\">18,204</span></li>\n        </ul>\n        <p class=\"ds-note\">disk <span class=\"ds-meter\"><span class=\"ds-meter__on\">██████████████</span>░░░░░░</span> 71% of 2 GB</p>\n      </div>\n    </section>\n  </div>\n\n  <div class=\"ds-panes ds-panes--work\">\n    <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n      <div class=\"ds-sidebar__block\">\n        <h2 class=\"ds-sidebar__title\">folders</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li><a class=\"ds-sidebar__link is-current\" href=\"#inbox\">Inbox</a><span class=\"ds-sidebar__count\">3</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#inbox\">Lists</a><span class=\"ds-sidebar__count\">1</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#compose\">Drafts</a><span class=\"ds-sidebar__count\">2</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#inbox\">Sent</a><span class=\"ds-sidebar__count\">0</span></li>\n          <li><a class=\"ds-sidebar__link is-hover\" href=\"#inbox\">Archive</a><span class=\"ds-sidebar__count\">0</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#inbox\">Spam</a><span class=\"ds-sidebar__count\">12</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#inbox\">Trash</a><span class=\"ds-sidebar__count\">0</span></li>\n        </ul>\n        <p class=\"ds-sidebar__text\"><span class=\"ds-key\"><span class=\"ds-key__cap\">Tab</span> switch pane</span> <span class=\"ds-key\"><span class=\"ds-key__cap\">c</span> change folder</span></p>\n      </div>\n    </aside>\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">inbox: 24 messages, 3 unread</h2>\n      <div class=\"ds-pane__body ds-pane__body--flush\">\n        <table class=\"ds-table\" data-component=\"table\">\n          <thead>\n            <tr><th></th><th>from</th><th>subject</th><th class=\"ds-table__extra\">date</th><th class=\"ds-table__num ds-table__extra\">size</th></tr>\n          </thead>\n          <tbody>\n            <tr class=\"is-unread\"><td class=\"ds-table__flag\">N</td><td>Ines Varga</td><td><a class=\"ds-table__title\" href=\"#message\">Release notes for 4.2, last look</a></td><td class=\"ds-table__extra ds-table__date\">08:31</td><td class=\"ds-table__num ds-table__extra\">6.1K</td></tr>\n            <tr class=\"is-selected is-unread\"><td class=\"ds-table__flag\">N</td><td>Tomas Lind</td><td><a class=\"ds-table__title\" href=\"#message\">Re: Release planning, week 12</a></td><td class=\"ds-table__extra ds-table__date\">08:02</td><td class=\"ds-table__num ds-table__extra\">3.4K</td></tr>\n            <tr class=\"is-unread is-alt\"><td class=\"ds-table__flag\">N</td><td>build robot</td><td><a class=\"ds-table__title\" href=\"#message\">nightly: 2 of 214 tests failed</a></td><td class=\"ds-table__extra ds-table__date\">03:10</td><td class=\"ds-table__num ds-table__extra\">11K</td></tr>\n            <tr><td class=\"ds-table__flag\">!</td><td>Mara Oyelaran</td><td><a class=\"ds-table__title is-visited\" href=\"#message\">Invoice 2026-031 attached</a></td><td class=\"ds-table__extra ds-table__date\">Mar 01</td><td class=\"ds-table__num ds-table__extra\">184K</td></tr>\n            <tr class=\"is-alt\"><td class=\"ds-table__flag\"></td><td>Tomas Lind</td><td><a class=\"ds-table__title is-visited\" href=\"#message\">Release planning, week 12</a></td><td class=\"ds-table__extra ds-table__date\">Mar 01</td><td class=\"ds-table__num ds-table__extra\">2.2K</td></tr>\n            <tr><td class=\"ds-table__flag\"></td><td>users list</td><td><a class=\"ds-table__title is-visited\" href=\"#message\">[users] folding quoted text by default?</a></td><td class=\"ds-table__extra ds-table__date\">Feb 28</td><td class=\"ds-table__num ds-table__extra\">4.8K</td></tr>\n            <tr class=\"is-alt\"><td class=\"ds-table__flag\">r</td><td>Ines Varga</td><td><a class=\"ds-table__title is-visited\" href=\"#message\">Draft of the release notes</a></td><td class=\"ds-table__extra ds-table__date\">Feb 27</td><td class=\"ds-table__num ds-table__extra\">5.0K</td></tr>\n            <tr><td class=\"ds-table__flag\"></td><td>Jun Aoki</td><td><a class=\"ds-table__title is-visited\" href=\"#message\">Keys for the new mirror</a></td><td class=\"ds-table__extra ds-table__date\">Feb 26</td><td class=\"ds-table__num ds-table__extra\">1.9K</td></tr>\n          </tbody>\n        </table>\n      </div>\n      <div class=\"ds-pane__foot\">\n        <span><span class=\"ds-key\"><span class=\"ds-key__cap\">Enter</span> open</span> <span class=\"ds-key\"><span class=\"ds-key__cap\">r</span> reply</span> <span class=\"ds-key\"><span class=\"ds-key__cap\">d</span> delete</span></span>\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=\"#inbox\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#inbox\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#inbox\">next &gt;</a></li>\n        </ul>\n      </div>\n    </section>\n  </div>\n\n  <div class=\"ds-panes ds-panes--wide\">\n    <div class=\"ds-panel\" data-component=\"panel\">\n      <h2 class=\"ds-panel__title\">preview: Re: Release planning, week 12</h2>\n      <div class=\"ds-panel__body\">\n        <p class=\"ds-panel__text\">Tuesday works for me. I would rather cut the release from the branch as it stands than wait for the importer; it can go into 4.3 without anyone noticing.</p>\n        <p class=\"ds-panel__text\"><a class=\"ds-link\" href=\"#message\">Open the message</a> or press <span class=\"ds-key\"><span class=\"ds-key__cap\">Enter</span></span>.</p>\n      </div>\n    </div>\n    <div class=\"ds-panel\">\n      <h2 class=\"ds-panel__title\">accounts</h2>\n      <div class=\"ds-panel__body\">\n        <p class=\"ds-panel__text\"><span class=\"ds-badge ds-badge--success\">ok</span> work, fetched 08:42</p>\n        <p class=\"ds-panel__text\"><span class=\"ds-badge ds-badge--warning\">slow</span> lists, fetched 07:15</p>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 2, one message: its head, its text, the thread and what is attached. -->\n<section class=\"ds-view\" id=\"message\">\n  <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#inbox\">Inbox</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li><a class=\"ds-breadcrumb__link\" href=\"#message\">Release planning, week 12</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li class=\"ds-breadcrumb__current\">message 2 of 3</li>\n  </ol>\n  <div class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">Re: Release planning, week 12</h1>\n      <p class=\"ds-page-header__text\">From Tomas Lind to the release group, today at 08:02, 3.4K</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#compose\">Reply</a></div>\n  </div>\n  <div class=\"ds-panes ds-panes--wide\">\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">message</h2>\n      <div class=\"ds-pane__body\">\n        <p class=\"ds-badges\" data-component=\"badge\"><span class=\"ds-badge\">3</span> <span class=\"ds-badge ds-badge--success\">signed</span> <span class=\"ds-badge ds-badge--warning\">external</span> <span class=\"ds-badge ds-badge--danger\">1 link removed</span> <span class=\"ds-badge ds-badge--tag\">release</span></p>\n        <div class=\"ds-prose\" data-component=\"typography\">\n          <h1>Release planning, week 12</h1>\n          <p>Tuesday works for me. I would rather cut the release from the branch <strong>as it stands</strong> than wait for the importer; it can go into 4.3 without anyone noticing.</p>\n          <h2>What is left</h2>\n          <ul>\n            <li>The two failing tests from the nightly run, both in the date parser.</li>\n            <li>Release notes: Ines has a draft, it needs one more reader.</li>\n            <li>Tag with <code>make tag VERSION=4.2.0</code> and wait for the mirrors.</li>\n          </ul>\n          <h3>If Tuesday slips</h3>\n          <p>Then Thursday, not Wednesday: the mirror sync runs on Wednesday night and we would ship half a release.</p>\n        </div>\n        <ul class=\"ds-links\" data-component=\"links\">\n          <li><a class=\"ds-link\" href=\"#message\">the nightly report</a></li>\n          <li><a class=\"ds-link is-visited\" href=\"#message\">draft notes (visited)</a></li>\n          <li><a class=\"ds-link is-hover\" href=\"#message\">the branch (hover)</a></li>\n          <li><a class=\"ds-link is-active\" href=\"#message\">mirror status (active)</a></li>\n        </ul>\n      </div>\n      <div class=\"ds-pane__foot\">\n        <span><span class=\"ds-key\"><span class=\"ds-key__cap\">r</span> reply</span> <span class=\"ds-key\"><span class=\"ds-key__cap\">f</span> forward</span> <span class=\"ds-key\"><span class=\"ds-key__cap\">q</span> back to the list</span></span>\n        <ul class=\"ds-pagination\">\n          <li><a class=\"ds-pagination__link\" href=\"#message\">&lt; prev</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#message\">1</a></li>\n          <li><span class=\"ds-pagination__link is-current\">2</span></li>\n          <li><a class=\"ds-pagination__link\" href=\"#message\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#message\">next &gt;</a></li>\n        </ul>\n      </div>\n    </section>\n    <div class=\"ds-stack\">\n      <section class=\"ds-pane\">\n        <h2 class=\"ds-pane__title\">thread</h2>\n        <div class=\"ds-pane__body\">\n          <ul class=\"ds-list\" data-component=\"list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\">Mar 01</span>\n              <div class=\"ds-list__main\">\n                <a class=\"ds-list__title is-visited\" href=\"#message\">Release planning, week 12</a>\n                <p class=\"ds-list__meta\">Tomas Lind | 2.2K | read</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\">08:02</span>\n              <div class=\"ds-list__main\">\n                <a class=\"ds-list__title\" href=\"#message\">Re: Release planning, week 12</a>\n                <p class=\"ds-list__meta\">Tomas Lind | 3.4K | this message</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\">08:31</span>\n              <div class=\"ds-list__main\">\n                <a class=\"ds-list__title\" href=\"#message\">Release notes for 4.2, last look</a>\n                <p class=\"ds-list__meta\">Ines Varga | 6.1K | unread</p>\n              </div>\n            </li>\n          </ul>\n        </div>\n      </section>\n      <section class=\"ds-pane\">\n        <h2 class=\"ds-pane__title\">attached</h2>\n        <div class=\"ds-pane__body\">\n          <table class=\"ds-table\">\n            <thead><tr><th>file</th><th class=\"ds-table__num\">size</th></tr></thead>\n            <tbody>\n              <tr><td><a class=\"ds-table__title\" href=\"#message\">checklist-4.2.txt</a></td><td class=\"ds-table__num\">1.1K</td></tr>\n              <tr class=\"is-alt\"><td><a class=\"ds-table__title\" href=\"#message\">signature.asc</a></td><td class=\"ds-table__num\">0.8K</td></tr>\n            </tbody>\n          </table>\n        </div>\n      </section>\n    </div>\n  </div>\n</section>\n\n<!-- View 3, compose: bracketed fields, what went wrong, and the question before a draft is thrown away. -->\n<section class=\"ds-view\" id=\"compose\">\n  <ol class=\"ds-breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#inbox\">Inbox</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li><a class=\"ds-breadcrumb__link\" href=\"#compose\">Drafts</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li class=\"ds-breadcrumb__current\">new message</li>\n  </ol>\n  <div class=\"ds-page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">New message</h1>\n      <p class=\"ds-page-header__text\">Draft 2 of 2, kept in Drafts until it is sent.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#inbox\">Back to the inbox</a></div>\n  </div>\n  <div class=\"ds-notices\" data-component=\"notice\">\n    <p class=\"ds-notice\"><span class=\"ds-notice__title\">Saved.</span> The draft was written to Drafts at 08:44.</p>\n    <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not sent.</span> The outgoing server for the account \"lists\" did not answer within 30 seconds.</p>\n  </div>\n  <div class=\"ds-panes ds-panes--wide\">\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">compose</h2>\n      <div class=\"ds-pane__body\">\n        <form class=\"ds-form\" data-component=\"form\" action=\"#compose\">\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"c-from\">From:</label>\n            <div class=\"ds-form__field\">\n              <span class=\"ds-form__control ds-form__control--auto\"><select class=\"ds-form__input ds-form__input--auto\" id=\"c-from\"><option>reader@chronoskin (work)</option><option>reader@chronoskin (lists)</option></select></span>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"c-to\">To:</label>\n            <div class=\"ds-form__field\">\n              <span class=\"ds-form__control\"><input class=\"ds-form__input is-invalid\" id=\"c-to\" type=\"text\" value=\"tomas.lind@, ines\"></span>\n              <p class=\"ds-form__error\">Two addresses are incomplete: \"tomas.lind@\" and \"ines\".</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"c-subject\">Subject:</label>\n            <div class=\"ds-form__field\">\n              <span class=\"ds-form__control\"><input class=\"ds-form__input\" id=\"c-subject\" type=\"text\" value=\"Re: Release planning, week 12\"></span>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"c-body\">Text:</label>\n            <div class=\"ds-form__field\">\n              <span class=\"ds-form__control\"><textarea class=\"ds-form__input\" id=\"c-body\" rows=\"8\">Tuesday it is. I will read the notes tonight and tag in the morning.\n\n&gt; Then Thursday, not Wednesday: the mirror sync runs on\n&gt; Wednesday night and we would ship half a release.\n\nAgreed.</textarea></span>\n              <p class=\"ds-form__hint\">Plain text, wrapped at 72 columns when sent.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <span class=\"ds-form__label\">Options:</span>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> sign this message</label>\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\"> ask for a receipt</label>\n            </div>\n          </div>\n          <div class=\"ds-form__actions\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"button\">Send</button>\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Save draft</button>\n            <button class=\"ds-button ds-button--danger\" type=\"button\">Discard</button>\n            <button class=\"ds-button\" type=\"button\" disabled>Attach</button>\n          </div>\n        </form>\n      </div>\n    </section>\n    <div class=\"ds-stack\">\n      <div class=\"ds-dialog__backdrop\">\n        <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-2\">\n          <h2 class=\"ds-dialog__title\" id=\"dlg-2\">Discard draft?</h2>\n          <div class=\"ds-dialog__body\">\n            <p class=\"ds-dialog__text\">The draft \"Re: Release planning, week 12\" will be removed from Drafts. This cannot be undone.</p>\n            <div class=\"ds-dialog__actions\">\n              <button class=\"ds-button ds-button--danger\" type=\"button\">Discard</button>\n              <button class=\"ds-button ds-button--secondary\" type=\"button\">Keep</button>\n            </div>\n          </div>\n        </div>\n      </div>\n      <section class=\"ds-pane\">\n        <h2 class=\"ds-pane__title\">while writing</h2>\n        <div class=\"ds-pane__body\">\n          <dl class=\"ds-keys\">\n            <dt>Ctrl-X</dt><dd>send</dd>\n            <dt>Ctrl-O</dt><dd>save the draft</dd>\n            <dt>Ctrl-T</dt><dd>pick from the address book</dd>\n            <dt>Ctrl-C</dt><dd>cancel, after asking</dd>\n          </dl>\n        </div>\n      </section>\n    </div>\n  </div>\n</section>\n\n<!-- View 4, help: the keys in four groups, and the filters, of which there are none yet. -->\n<section class=\"ds-view\" id=\"help\">\n  <ol class=\"ds-breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#inbox\">Inbox</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li class=\"ds-breadcrumb__current\">help</li>\n  </ol>\n  <div 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\">Every key, by what you are doing when you press it.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#inbox\">Close help</a></div>\n  </div>\n  <ul class=\"ds-tabs\" data-component=\"tabs\">\n    <li><span class=\"ds-tabs__tab is-current\">Keys</span></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#help\">Commands</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#help\">Accounts</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#help\">Filters</a></li>\n  </ul>\n  <div class=\"ds-tabs__body\">\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <div class=\"ds-grid__cell\">\n        <h3 class=\"ds-grid__title\">Moving</h3>\n        <dl class=\"ds-keys\">\n          <dt>j, k</dt><dd>next, previous message</dd>\n          <dt>Tab</dt><dd>the other pane</dd>\n          <dt>c</dt><dd>change folder</dd>\n          <dt>/</dt><dd>search this folder</dd>\n        </dl>\n      </div>\n      <div class=\"ds-grid__cell ds-grid__cell--2\">\n        <h3 class=\"ds-grid__title\">Reading</h3>\n        <dl class=\"ds-keys\">\n          <dt>Enter</dt><dd>open the message</dd>\n          <dt>Space</dt><dd>one screen down</dd>\n          <dt>v</dt><dd>list what is attached</dd>\n          <dt>q</dt><dd>back to the list</dd>\n        </dl>\n      </div>\n      <div class=\"ds-grid__cell ds-grid__cell--3\">\n        <h3 class=\"ds-grid__title\">Writing</h3>\n        <dl class=\"ds-keys\">\n          <dt>m</dt><dd>new message</dd>\n          <dt>r, R</dt><dd>reply, reply to all</dd>\n          <dt>f</dt><dd>forward</dd>\n          <dt>Ctrl-X</dt><dd>send</dd>\n        </dl>\n      </div>\n      <div class=\"ds-grid__cell ds-grid__cell--4\">\n        <h3 class=\"ds-grid__title\">Filing</h3>\n        <dl class=\"ds-keys\">\n          <dt>s</dt><dd>save to a folder</dd>\n          <dt>d, u</dt><dd>delete, undelete</dd>\n          <dt>!</dt><dd>flag as important</dd>\n          <dt>$</dt><dd>write changes to disk</dd>\n        </dl>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-panes ds-panes--even\">\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">filters</h2>\n      <div class=\"ds-pane__body\">\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <p class=\"ds-empty__text\">No filters yet. Mail stays in the inbox until you move it.</p>\n          <a class=\"ds-button ds-button--secondary\" href=\"#help\">Add a filter</a>\n        </div>\n      </div>\n    </section>\n    <section class=\"ds-pane\">\n      <h2 class=\"ds-pane__title\">about</h2>\n      <div class=\"ds-pane__body\">\n        <p class=\"ds-panel__text\">chronoskin mail 4.1.3 reads and writes plain mail folders and speaks to two kinds of server. It keeps no copy of your password; it asks the system keyring.</p>\n        <p class=\"ds-panel__text\">The manual is one text file: <a class=\"ds-link\" href=\"#help\">read it here</a> or with any pager.</p>\n      </div>\n    </section>\n  </div>\n</section>\n\n</main>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <p class=\"ds-footer__note\">chronoskin mail 4.1.3 | work: ok | lists: slow | press a number or follow a link</p>\n  <a class=\"ds-footer__key\" href=\"#help\"><span class=\"ds-footer__num\">1</span><span class=\"ds-footer__label\">Help</span></a>\n  <a class=\"ds-footer__key\" href=\"#compose\"><span class=\"ds-footer__num\">2</span><span class=\"ds-footer__label\">Compose</span></a>\n  <a class=\"ds-footer__key\" href=\"#message\"><span class=\"ds-footer__num\">3</span><span class=\"ds-footer__label\">View</span></a>\n  <a class=\"ds-footer__key\" href=\"#compose\"><span class=\"ds-footer__num\">4</span><span class=\"ds-footer__label\">Reply</span></a>\n  <a class=\"ds-footer__key\" href=\"#inbox\"><span class=\"ds-footer__num\">5</span><span class=\"ds-footer__label\">Fetch</span></a>\n  <a class=\"ds-footer__key\" href=\"#inbox\"><span class=\"ds-footer__num\">6</span><span class=\"ds-footer__label\">Move</span></a>\n  <a class=\"ds-footer__key\" href=\"#inbox\"><span class=\"ds-footer__num\">8</span><span class=\"ds-footer__label\">Delete</span></a>\n  <a class=\"ds-footer__key\" href=\"#inbox\"><span class=\"ds-footer__num\">10</span><span class=\"ds-footer__label\">Quit</span></a>\n</footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.terminal.app.s02.p02.t02.u02\",\n  \"library\": \"2026.10.07-2111\",\n  \"era\": {\n    \"slug\": \"terminal\",\n    \"years\": [\n      2015,\n      2026\n    ]\n  },\n  \"archetype\": \"app\",\n  \"mode\": \"pure\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1280,\n    \"fluid\": false\n  },\n  \"source\": \"https://chrono.skin/s/v1-tm-2222\",\n  \"short\": \"v1-tm-2222\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #efe6c8;\n  --color-canvas: #fbf5dc;\n  --color-surface: #fbf5dc;\n  --color-surface-alt: #f1e9c9;\n  --color-surface-strong: #e4d9b0;\n  --color-bar: #3b2a1a;\n  --color-bar-text: #fbf5dc;\n  --color-bar-alt: #e4d9b0;\n  --color-bar-alt-text: #3b2a1a;\n  --color-inverse: #3b2a1a;\n  --color-inverse-text: #fbf5dc;\n  --color-text: #3b2a1a;\n  --color-text-muted: #7a6748;\n  --color-heading: #1f140a;\n  --color-heading-alt: #9a4a00;\n  --color-link: #a64b00;\n  --color-link-quiet: #3b2a1a;\n  --color-link-visited: #6b4a6e;\n  --color-link-hover: #1f140a;\n  --color-link-active: #c2410c;\n  --color-border: #8c7a58;\n  --color-border-strong: #3b2a1a;\n  --color-border-muted: #cfc39c;\n  --color-accent: #c2410c;\n  --color-accent-text: #fffbdc;\n  --color-accent-alt: #1a6fb0;\n  --color-fill-1: #fbf5dc;\n  --color-fill-2: #f1e9c9;\n  --color-fill-3: #e4d9b0;\n  --color-fill-4: #f1e9c9;\n  --color-button: #3b2a1a;\n  --color-button-text: #fbf5dc;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #f1e9c9;\n  --color-button-secondary-text: #3b2a1a;\n  --color-input: #fffdf0;\n  --color-input-text: #1f140a;\n  --color-input-border: #8c7a58;\n  --color-disabled: #e4d9b0;\n  --color-disabled-text: #9c8c6a;\n  --color-danger: #b3123f;\n  --color-danger-surface: #f8e1d4;\n  --color-success: #3d7a1c;\n  --color-warning: #a86400;\n  --color-notice: #f1e9c9;\n  --color-notice-text: #3b2a1a;\n  --color-focus: #c2410c;\n  --color-shadow: #8c7a58;\n  --color-overlay: #e4d9b0;\n}\n\n/* @part type */\n:root {\n  --font-body: \"IBM Plex Mono\", \"Courier Prime\", \"Courier New\", Courier, monospace;\n  --font-heading: \"IBM Plex Mono\", \"Courier Prime\", \"Courier New\", Courier, monospace;\n  --font-ui: \"IBM Plex Mono\", \"Courier Prime\", \"Courier New\", Courier, monospace;\n  --font-mono: \"IBM Plex Mono\", \"Courier Prime\", \"Courier New\", Courier, monospace;\n  --text-base: 16px;\n  --text-small: 14px;\n  --text-ui: 15px;\n  --text-large: 18px;\n  --text-display: 38px;\n  --text-h1: 26px;\n  --text-h2: 19px;\n  --text-h3: 16px;\n  --line-body: 1.5;\n  --line-heading: 1.25;\n  --line-display: 1.1;\n  --weight-body: 400;\n  --weight-bold: 600;\n  --weight-heading: 600;\n  --weight-display: 600;\n  --weight-ui: 500;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --ui-transform: lowercase;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 3px;\n  --border-style: dashed;\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: 0 2px 0 var(--color-border-strong);\n  --shadow-control-pressed: inset 0 0 0 1px var(--color-border-strong);\n  --shadow-dialog: none;\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: transparent;\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 80%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px dashed var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
