{
  "id": "v1-tm-2137",
  "long_id": "v1.terminal.app.s02.p01.t03.u07",
  "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": "mix",
  "viewport": {
    "width": 1280,
    "fluid": false,
    "responsive": true
  },
  "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-2137",
  "preview_url": "https://chrono.skin/s/v1-tm-2137/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 900px 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. Below 600px `.ds-nav__list` takes a row of its own under the brand, each `.ds-nav__link` an equal centred cell without side padding. A `.ds-tooltip__tip` opens under its line across the width of the window.\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 (\"SF Mono\", \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace). Weights are `--weight-body` 400, bold and `--weight-ui` 700, and `--weight-display` 800 for the hero title. The stack starts with SF Mono and Cascadia Code, the faces terminal programs ship with. 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` 14px with `--line-body` 1.45 is all running text, `--text-ui` 13px navigation, buttons, inputs, tabs and pagination, `--text-small` 12px meta lines, hints, badges, code blocks and the status line, `--text-large` 16px the hero's lead and the brand name. Headings are told apart by weight and colour more than by size: `--text-display` 32px is the hero title only, `--text-h1` 20px a page title and the first heading of running text, `--text-h2` 16px section rules and second headings, `--text-h3` 14px frame titles, grid titles and third headings. `--heading-transform` is none, `--ui-transform` is none.\n- A modern sixteen-colour scheme on blue-grey, with each colour given a role: cyan for links, blue for quiet links, bars and heavy rules, magenta for the primary button, the prompt path, frame titles and tags, yellow for the accent, focus and warnings, green and red for status.\n- The screen: `--color-page` #181825 is the window, `--color-canvas` #1e1e2e the sheet the text stands on, `--color-surface` #24253a the inside of frames and table rows, `--color-surface-alt` #2a2b40 alternate rows, code blocks and the install line, `--color-surface-strong` #45475a group rows and inline code. `--color-text` #bac2de is running text, `--color-text-muted` #9399b2 dates, counts, hints and the brackets of fields, `--color-heading` #cdd6f4 headings, typed commands and figures, `--color-heading-alt` #cba6f7 frame titles, third headings and tags.\n- Links: `--color-link` #89dceb, `--color-link-quiet` #89b4fa for navigation, breadcrumb, tabs and sidebar links, `--color-link-visited` #b4befe, `--color-link-hover` #f5c2e7, `--color-link-active` #f9e2af. `--link-decoration` is underline 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` #89b4fa with `--color-bar-text` #11111b 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` #313244 with `--color-bar-alt-text` #cdd6f4 is the status line at the foot. `--color-inverse` #cdd6f4 with `--color-inverse-text` #1e1e2e is inverse video: the current navigation link, tab, page number and sidebar link, the selected table row, a text selection.\n- Lines: `--color-border` #585b70 at `--border-width` 2px `--border-style` solid draws every frame and rule; `--color-border-strong` #89b4fa at `--border-width-strong` 4px is the rule under a page header, the left edge of a notice and the frame of a dialog; `--color-border-muted` #3b3d54 parts rows inside a frame and boxes the empty state.\n- Accents: `--color-accent` #f9e2af with `--color-accent-text` #1e1e2e is the count badge; `--color-accent-alt` #cba6f7 is the prompt sign and flag letters. `--color-fill-1` to `--color-fill-4` (#1e2a3a, #2a2238, #2e2a24, #1f2e2a) are the four grid cells. Status words are text in brackets: `--color-success` #a6e3a1, `--color-warning` #f9e2af, `--color-danger` #f38ba8; meters use the first two.\n- Controls: the primary button is `--color-button` #cba6f7 with `--color-button-text` #11111b; the secondary button is `--fill-button-secondary` with `--color-button-secondary-text` #cdd6f4 and a frame in `--color-border`; fields are `--fill-input` with `--color-input-text` #cdd6f4 and a line in `--color-input-border` #585b70; disabled is `--color-disabled` #313244 with `--color-disabled-text` #6c7086. The notice is `--color-notice` #1e2a3a with `--color-notice-text` #b4d8f0, the error notice `--color-danger-surface` #302030 with `--color-danger`. `--color-overlay` #313244 is the block a dialog stands on; `--color-focus` #f9e2af is the focus outline.\n- Surface: Lines are 2px and solid, the heavy rule 4px. `--fill-panel` is `--color-surface`; `--fill-button-secondary` and `--fill-input` are their own colours; `--fill-button-hover` lightens the button (60% of it over white). Shadows are hard lines and blocks only: `--shadow-control-hover` is a 2px ring in `--color-focus`, `--shadow-control-pressed` a 2px inner line in `--color-shadow`, and `--shadow-dialog` drops a block of `--color-shadow` 8px down and right, the way a text-mode dialog throws its shadow one cell away; `--shadow-panel`, `--shadow-control` and `--shadow-text` are none. All four radii are 0 and `--backdrop-blur` is 0px. `--focus-ring` is 2px solid 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- `.ds-progress`: a quantity on one line: a muted `.ds-progress__label`, a `.ds-progress__bar` typed in cells between brackets (`#` in `.ds-progress__on` for the filled part, `.` for the rest; `--warning` and `--danger` recolour it) and a bold `.ds-progress__value`.\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` shown above it on hover or focus only. Use it for a term or a figure that needs one sentence.\n- `.ds-avatar`: a person as two initials in a cell on `--color-surface-strong`, set before a name.\n- `.ds-switch`: an on/off setting, 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. Use it for a setting that takes effect at once; a `.ds-form__check` stays for what is sent with a form.\n- `.ds-accordion`: a folding list for answers and asides. 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\n## Never\n\n- `font-families <= 1`: one monospace face sets everything, headings and buttons included.\n- `font-size <= 32px`: the largest text is the hero title; 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.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`: a shadow is a hard block of the screen's black, never a soft one.\n- `text-shadow = none`: letters do not glow on this screen.\n- `border-width <= 3px`: lines are one cell thin, 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 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__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-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--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  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-shadow: none;\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  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-shadow: none;\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- narrow windows: one column, nothing scrolls sideways but code ---------- */\n\n/* components of the era, typed in characters */\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__value {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\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.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\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.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.ds-form__field .ds-switch {\n  justify-content: flex-start;\n}\n\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\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\n/* phones: the navigation spans the bar; a hint opens under its line, as wide as its box */\n@media (max-width: 600px) {\n  .ds-nav__list {\n    flex: 1 1 100%;\n    flex-wrap: nowrap;\n  }\n  .ds-nav__list li {\n    flex: 1 1 0;\n    min-width: 0;\n  }\n  .ds-nav__link {\n    padding-right: 0;\n    padding-left: 0;\n    text-align: center;\n  }\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}\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=\"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=\"#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>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__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__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__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__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__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__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__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__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</h2>\n      <div class=\"ds-panel__body\">\n        <p class=\"ds-panel__text\"><strong>Re: Release planning, week 12</strong></p>\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> <span class=\"ds-tooltip\" tabindex=\"0\">lists<span class=\"ds-tooltip__tip\" role=\"tooltip\">The server took more than ten seconds to answer.</span></span>, fetched 07:15</p>\n        <p class=\"ds-progress\"><span class=\"ds-progress__label\">fetching lists</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on\">####</span>......</span><span class=\"ds-progress__value\">40%</span></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\"><span class=\"ds-avatar\">tl</span> 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              <label class=\"ds-switch\"><span class=\"ds-switch__label\">wrap at 72 columns</span><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></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 class=\"ds-accordion\">\n        <details class=\"ds-accordion__item\" open>\n        <summary class=\"ds-accordion__title\">Where is my mail kept?</summary>\n        <div class=\"ds-accordion__body\">\n        <p>In plain folders under your home directory, one file per message.</p>\n        </div>\n        </details>\n        <details class=\"ds-accordion__item\">\n        <summary class=\"ds-accordion__title\">Which servers does it speak to?</summary>\n        <div class=\"ds-accordion__body\">\n        <p>The two common kinds, both over an encrypted line only.</p>\n        </div>\n        </details>\n        <details class=\"ds-accordion__item\">\n        <summary class=\"ds-accordion__title\">How do I leave?</summary>\n        <div class=\"ds-accordion__body\">\n        <p>Press <code>q</code>. Changes are written to disk first.</p>\n        </div>\n        </details>\n        </div>\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.p01.t03.u07\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"terminal\",\n    \"years\": [\n      2015,\n      2026\n    ]\n  },\n  \"archetype\": \"app\",\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-2137\",\n  \"short\": \"v1-tm-2137\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #000000;\n  --color-canvas: #030a05;\n  --color-surface: #061208;\n  --color-surface-alt: #0a1a0d;\n  --color-surface-strong: #0f2614;\n  --color-bar: #38c85a;\n  --color-bar-text: #000000;\n  --color-bar-alt: #0f2614;\n  --color-bar-alt-text: #6fe38a;\n  --color-inverse: #9df5ae;\n  --color-inverse-text: #000000;\n  --color-text: #38c85a;\n  --color-text-muted: #2a8f44;\n  --color-heading: #9df5ae;\n  --color-heading-alt: #d7ff5f;\n  --color-link: #9df5ae;\n  --color-link-quiet: #38c85a;\n  --color-link-visited: #5fa87a;\n  --color-link-hover: #e8f0e8;\n  --color-link-active: #d7ff5f;\n  --color-border: #1f6b33;\n  --color-border-strong: #38c85a;\n  --color-border-muted: #12401f;\n  --color-accent: #d7ff5f;\n  --color-accent-text: #000000;\n  --color-accent-alt: #5fd7af;\n  --color-fill-1: #061208;\n  --color-fill-2: #0a1a0d;\n  --color-fill-3: #0f2614;\n  --color-fill-4: #0a1a0d;\n  --color-button: #38c85a;\n  --color-button-text: #000000;\n  --color-button-hover-text: #000000;\n  --color-button-secondary: #0a1a0d;\n  --color-button-secondary-text: #9df5ae;\n  --color-input: #000000;\n  --color-input-text: #9df5ae;\n  --color-input-border: #1f6b33;\n  --color-disabled: #0a1a0d;\n  --color-disabled-text: #1f6b33;\n  --color-danger: #ff5f5f;\n  --color-danger-surface: #1a0505;\n  --color-success: #5fff00;\n  --color-warning: #ffd75f;\n  --color-notice: #0a1a0d;\n  --color-notice-text: #9df5ae;\n  --color-focus: #d7ff5f;\n  --color-shadow: #000000;\n  --color-overlay: #0a1a0d;\n}\n\n/* @part type */\n:root {\n  --font-body: \"SF Mono\", \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace;\n  --font-heading: \"SF Mono\", \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace;\n  --font-ui: \"SF Mono\", \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace;\n  --font-mono: \"SF Mono\", \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, monospace;\n  --text-base: 14px;\n  --text-small: 12px;\n  --text-ui: 13px;\n  --text-large: 16px;\n  --text-display: 32px;\n  --text-h1: 20px;\n  --text-h2: 16px;\n  --text-h3: 14px;\n  --line-body: 1.45;\n  --line-heading: 1.3;\n  --line-display: 1.15;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 800;\n  --weight-ui: 700;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 3px;\n  --border-style: solid;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: 6px 5px 0 var(--color-shadow);\n  --shadow-control: 3px 3px 0 var(--color-shadow);\n  --shadow-control-hover: 3px 3px 0 var(--color-shadow);\n  --shadow-control-pressed: 1px 1px 0 var(--color-shadow);\n  --shadow-dialog: 16px 12px 0 var(--color-shadow);\n  --shadow-text: none;\n  --fill-page: repeating-conic-gradient(color-mix(in srgb, var(--color-page) 70%, black) 0% 25%, var(--color-page) 0% 50%) 0 0 / 4px 4px;\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) 60%, white);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 3px solid var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
