{
  "id": "v1-tm-6432",
  "long_id": "v1.terminal.forum.s06.p04.t03.u02",
  "name": "Terminal, a bulletin board in amber",
  "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": "forum",
  "mode": "mix",
  "viewport": {
    "width": 1280,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is a dial-up bulletin board as its revivals of 2015 to 2026 put it on the web: a forum that lives in one terminal window. One monospace face sets everything, amber text glows on a dark brown screen, boxes are drawn with double lines whose titles are cut into the top edge, and every choice has a letter. It was the look of retro-computing communities, telnet boards with a web front, and the text-mode forums of people who missed the modem.",
  "url": "https://chrono.skin/s/v1-tm-6432",
  "preview_url": "https://chrono.skin/s/v1-tm-6432/specimen.html",
  "files": {
    "STYLE.md": "# Terminal, a bulletin board in amber\n\n## Summary\n\nThis is a dial-up bulletin board as its revivals of 2015 to 2026 put it on the web: a forum that lives in one terminal window. One monospace face sets everything, amber text glows on a dark brown screen, boxes are drawn with double lines whose titles are cut into the top edge, and every choice has a letter. It was the look of retro-computing communities, telnet boards with a web front, and the text-mode forums of people who missed the modem.\n\n## Layout\n\n- The page is designed for a 1280px window; the content is narrow and fixed. `.ds-window` is one terminal window of `--size-page` (940px, about ninety columns) in the middle of `--fill-page`, `--space-4` from the top: a frame of `--border-width` in `--color-border-strong` on `--color-canvas` with `--shadow-dialog`. It holds, top to bottom, `.ds-window__title` (a small line on `--fill-bar-alt`: what was dialled, the node, the size of the screen), the menu line `.ds-nav`, `.ds-main` (the views, padded `--space-3` and `3ch`) and the status line `.ds-footer`.\n- `.ds-nav` is one line on `--fill-bar`: the `.ds-brand` at the left and `.ds-nav__list` at the right, whose `.ds-nav__link` items each open with their letter in parentheses (`.ds-nav__hot`); the current one is a hole in the bar (`--color-canvas` with `--color-heading`).\n- The home view is one column, top to bottom: `.ds-hero`, the banner after login, centred between two `.ds-hero__shade` rules of typed shade characters; then `.ds-section` blocks `--space-4` (33px) apart: the `.ds-stats` line, the main menu as a `.ds-grid` two by two, the table of boards with its group rows, and `.ds-cols--even`: the newest messages as a list beside the sysop's panel.\n- Inner pages have no hero. They open with the `.ds-breadcrumb` as a path, then `.ds-page-header`, then one column of work: tabs over a list, or notices over messages. `.ds-cols` puts a `--size-side` (230px) sidebar at the right of the messages of a topic; `--form` is 3 to 2 (the form beside a dialog and a panel); `--even` is two equal columns. `.ds-col` is a column that may shrink, `.ds-stack` piles frames `--space-3` apart.\n- Views. The specimen is one small site with four views, one showing at a time; title line, menu line and status line are written once around them. `home` is the main menu. `board` is one board: tabs, the list of topics, pagination and the empty state of the caller's own topics. `thread` is a topic: two notices, its messages as `.ds-post` frames (the first with running text, the last with a quote and links), and a sidebar with the writers and the legend of badges. `post` is the form for writing a message with its four buttons, the confirmation dialog and a panel. A view is `<section class=\"ds-view\" id=\"...\">`; links between views are plain `href=\"#id\"`.\n- Spacing scale, in parts of one 22px text line: `--space-1` 4px is the vertical padding of buttons, inputs, table cells, tabs and the three lines of the window; `--space-2` 11px the padding above the text in a frame, the gap between a rule and what follows and between list rows; `--space-3` 22px the gap between paragraphs, between messages, under a page header and around the banner's title; `--space-4` 33px the gap between sections and above the window; `--space-5` 55px the space below the window. Horizontal steps are character cells written in `ch`.\n- Fixed sizes: `--size-label` 120px the label column of a form, `--size-field` 400px a text input, `--size-date` 110px the date column of the list, `--size-dialog` 360px a dialog.\n- Below 900px the window fills the screen and loses its frame, its title line keeps only the first item, columns stack with the sidebar last, the menu grid becomes one column, form labels sit above their fields, list dates sit above their entries, 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 with its `.ds-nav__link` items evenly spread, the current one still a hole in the bar, and the footer stacks with `.ds-footer__keys` as one spread row. 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-window` is the framed window with its `.ds-window__title` line, `.ds-main` the padded area the views sit in; `.ds-cols` (`--even`, `--form`) are column pairs, `.ds-col` a column that may shrink, `.ds-stack` a pile of frames, `.ds-section` a block of the page.\n- `.ds-nav`: the menu line, described under Layout. The stylesheet marks the `.ds-nav__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 banner of the home view, centred: a `.ds-hero__shade` rule (shade characters, light to full to light, in `--color-border`), `.ds-hero__title` (`--text-display`, tracked), `.ds-hero__lead`, a `.ds-buttons` row, a small muted `.ds-hero__note` (the last call), and a second shade rule.\n- `.ds-footer`: the status line on `--fill-bar-alt`: `.ds-footer__keys`, a list of `.ds-key` hints each holding a `.ds-footer__link`, and a `.ds-footer__text` at the right (node, time left, clock).\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` in `--color-border-strong` closes it.\n- `.ds-prose`: running text, at most 78 characters wide: h1, h2, h3 (the third in `--color-heading-alt`), 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 (`[reply]`). `.ds-links` sets several in a wrapping line.\n- `.ds-button`: a `<button>`, or an `<a>` when it only leads to another view. It is a word in square brackets, which the stylesheet adds: `[ send ]`. The primary one is a block of `--fill-button` with `--color-button-text`; `.ds-button--secondary` is `--fill-button-secondary` in a frame of `--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, in a `--size-label` column, and a `.ds-form__field`. Controls take `.ds-form__input` (`--wide` for the full width, `--auto` for selects). `is-invalid` plus a bold `.ds-form__error` marks a validation error, `.ds-form__hint` is help text, `.ds-form__check` holds a `.ds-form__checkbox` (one empty cell, a filled block when set), and `.ds-form__actions` lines the buttons up with the fields.\n- `.ds-table`: aligned columns under a head row on `--fill-bar`, rows parted by a line. `.ds-table__key` is the first column, a number to type, in `--color-accent-alt`; `.ds-table__title` the link in a row and `.ds-table__desc` a small muted line under it; `.ds-table__num` right-aligns a numeric column, `.ds-table__date` is a muted one, `tr.is-alt` an alternate row, `.ds-table__group` a group row, `tr.is-selected` a row in inverse video, `.ds-table__extra` cells a phone leaves out.\n- `.ds-list`: dated entries. 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, a `.ds-list__excerpt` and a small `.ds-list__meta` line; faint rules part the items. A count badge may follow a title.\n- `.ds-panel`: a frame with its `.ds-panel__title` cut into the top line and a `.ds-panel__body` of `.ds-panel__text` paragraphs. The title row draws the top line itself, so the frame works on any fill and with any border style; a panel always has a title.\n- `.ds-post`: one message, a frame like a panel: `.ds-post__title` cut into the top line (`message 1 of 7`), `.ds-post__head`, a `<dl>` of From and Date on `--color-surface-alt`, `.ds-post__body` (running text in `.ds-prose`, a `.ds-post__quote` line that the stylesheet opens with `>`, a muted `.ds-post__sig`), and `.ds-post__foot`, a line of bracket links.\n- `.ds-stat`: one figure of a status line: a `.ds-stat__label`, a colon, then the bold `.ds-stat__value`. `.ds-stats` is the row: one framed line with the figures spread across it.\n- `.ds-grid`: the main menu, two by two (one column on a phone). Each `.ds-grid__cell` is a link in a frame on `--color-fill-1` (`--2`, `--3`, `--4` select the other fills): a `.ds-grid__key` (its letter in inverse video at `--text-h1`), a `.ds-grid__title` and a `.ds-grid__text`.\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` with `--color-accent-text`. `.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 column at the right of a topic. Each `.ds-sidebar__block` is a frame with a `.ds-sidebar__title` cut into its top line and a `.ds-sidebar__list` of `.ds-sidebar__link` items (`is-current` in inverse video) with a `.ds-sidebar__count`; a block may hold `.ds-badges` and a small muted `.ds-sidebar__text`.\n- `.ds-notice`: a sentence in a frame of `--color-border-strong` with a left edge of `--border-width-strong`, starting with a bold `.ds-notice__title`. `.ds-notice--error` uses `--color-danger` on `--color-danger-surface`. Stack several in `.ds-notices`.\n- `.ds-pagination`: a line of `.ds-pagination__link` items: previous, numbers, next. The current page is a `<span>` with `is-current` in inverse video; `is-disabled` is muted.\n- `.ds-dialog`: a frame in `--color-border-strong`, `--size-dialog` wide, with its `.ds-dialog__title` cut into the top line and `--shadow-dialog`. It sits in the page flow on `.ds-dialog__backdrop`, a flat block of `--color-overlay`; it has a `.ds-dialog__body`, `.ds-dialog__text` and `.ds-dialog__actions`. No dimming of the page, no blur.\n- `.ds-empty`: a faint frame in `--color-border-muted` 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 bar typed in 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`: nothing is soft and nothing floats; where a set has a shadow at all it is a hard offset block.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `border-width <= 3px`: lines are one weight, with one heavier rule.\n- `transition = none`: states change at once, as a screen redraws.\n- `text-shadow = none`: text is flat.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen. A boxed thing copies `.ds-panel`: a frame of `--border-width` in `--color-border` with its title cut into the top line and `--space-2` and `2ch` of padding; a thing somebody wrote copies `.ds-post`. A new choice gets a letter: a `.ds-nav__hot` in the menu line, a `.ds-grid__key` in the main menu, a `.ds-key` in the status line. 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 typed 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 bulletin board: one terminal window of\n   about ninety columns in the middle of the page, everything in it stacked.\n   Vertical steps are parts of one 22px text line; horizontal steps are in ch. */\n:root {\n  --size-page: 940px;\n  --size-side: 230px;\n  --size-label: 120px;\n  --size-field: 400px;\n  --size-dialog: 360px;\n  --size-date: 110px;\n  --space-1: 4px;\n  --space-2: 11px;\n  --space-3: 22px;\n  --space-4: 33px;\n  --space-5: 55px;\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-post {\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-post__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-post__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-post__title::after {\n  content: \"\";\n  flex: 1;\n  min-width: 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-2);\n}\n.ds-panel__text:last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- a section rule: the name, then a line to the right edge ---------- */\n.ds-section {\n  margin: 0 0 var(--space-4);\n}\n.ds-section__title {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  margin: var(--space-3) 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-section__title:first-child {\n  margin-top: 0;\n}\n.ds-section__title::after {\n  content: \"\";\n  flex: 1;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-note:last-child {\n  margin-bottom: 0;\n}\n.ds-note {\n  margin: var(--space-2) 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- prompt, cursor, key hints, meters ---------- */\n.ds-prompt {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-weight: var(--weight-bold);\n  overflow-wrap: anywhere;\n}\n.ds-prompt__sign {\n  color: var(--color-accent-alt);\n}\n.ds-prompt__path {\n  color: var(--color-heading-alt);\n}\n/* The block cursor: one cell of inverse video. It holds a no-break space. */\n.ds-cursor {\n  background: currentColor;\n}\n@media (prefers-reduced-motion: no-preference) {\n  .ds-cursor {\n    animation: ds-blink 1.2s steps(1) infinite;\n  }\n}\n@keyframes ds-blink {\n  0% { opacity: 1; }\n  50% { opacity: 0; }\n  100% { opacity: 0; }\n}\n.ds-key {\n  white-space: nowrap;\n}\n.ds-key__cap {\n  font-weight: var(--weight-bold);\n}\n.ds-key__cap::before {\n  content: \"[\";\n}\n.ds-key__cap::after {\n  content: \"]\";\n}\n/* A progress bar typed in block characters. */\n.ds-meter {\n  color: var(--color-border);\n  white-space: nowrap;\n}\n.ds-meter__on {\n  color: var(--color-success);\n}\n.ds-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__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__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 6: a bulletin board: one framed window in the middle of the page, a banner, menus by letter ---------- */\n.ds-window {\n  box-sizing: border-box;\n  max-width: var(--size-page);\n  margin: var(--space-4) auto var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-page);\n  background: var(--color-canvas);\n  box-shadow: var(--shadow-dialog);\n}\n/* The window's own title line: what you dialled, which node, the size of the screen. */\n.ds-window__title {\n  display: flex;\n  justify-content: space-between;\n  gap: 0 2ch;\n  margin: 0;\n  padding: var(--space-1) 2ch;\n  overflow: hidden;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  white-space: nowrap;\n}\n.ds-main {\n  min-width: 0;\n  padding: var(--space-3) 3ch var(--space-4);\n}\n.ds-cols {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-side);\n  gap: var(--space-3) 3ch;\n  align-items: start;\n}\n.ds-cols--even {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ds-cols--form {\n  grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);\n}\n.ds-stack {\n  display: grid;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-col {\n  min-width: 0;\n}\n\n/* nav: the menu line on the bar fill; each entry is chosen by its letter; the open one is a hole in the bar */\n.ds-nav {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: 0 2ch;\n  padding: 0 2ch;\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}\n.ds-nav .ds-brand,\n.ds-nav .ds-brand__name {\n  color: var(--color-bar-text);\n  text-shadow: none;\n}\n.ds-nav .ds-brand__mark {\n  border-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  font-weight: var(--weight-bold);\n}\n.ds-nav__hot::before {\n  content: \"(\";\n}\n.ds-nav__hot::after {\n  content: \")\";\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#board:target) .ds-nav__link[href=\"#board\"],\n.ds-page:has(#thread:target) .ds-nav__link[href=\"#thread\"],\n.ds-page:has(#post:target) .ds-nav__link[href=\"#post\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  text-decoration: none;\n}\n\n/* hero: the banner a caller sees after logging in, centred between two rules of shade characters */\n.ds-hero {\n  margin: 0 0 var(--space-3);\n  text-align: center;\n}\n.ds-hero__shade {\n  display: flex;\n  justify-content: center;\n  margin: 0;\n  overflow: hidden;\n  color: var(--color-border);\n  line-height: var(--line-display);\n  white-space: nowrap;\n}\n.ds-hero__title {\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-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-hero__lead {\n  max-width: 62ch;\n  margin: 0 auto var(--space-3);\n  font-size: var(--text-large);\n}\n.ds-hero .ds-buttons {\n  justify-content: center;\n  margin: 0 0 var(--space-3);\n}\n.ds-hero__note {\n  margin: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* stats: one framed line of figures, each after its label */\n.ds-stats {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: 0 2ch;\n  padding: var(--space-1) 2ch;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-stat {\n  display: flex;\n  gap: 1ch;\n  white-space: nowrap;\n}\n.ds-stat__value {\n  order: 2;\n  font-weight: var(--weight-bold);\n  text-shadow: var(--shadow-text);\n}\n.ds-stat__label::after {\n  content: \":\";\n}\n\n/* grid: the main menu: two by two, each choice behind its letter */\n.ds-grid {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ds-grid__cell {\n  display: grid;\n  grid-template-columns: max-content minmax(0, 1fr);\n  gap: 0 2ch;\n  color: inherit;\n  text-decoration: none;\n}\n.ds-grid__cell:hover .ds-grid__title,\n.ds-grid__cell.is-hover .ds-grid__title {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-grid__cell:hover,\n.ds-grid__cell.is-hover {\n  border-color: var(--color-border-strong);\n}\n.ds-grid__cell:focus-visible {\n  outline: var(--focus-ring);\n}\n.ds-grid__key {\n  grid-row: 1 / span 2;\n  align-self: start;\n  padding: 0 1ch;\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n}\n.ds-grid__title,\n.ds-grid__text {\n  display: block;\n}\n\n/* the board table: a number, the board and what it is for, counts */\n.ds-table td.ds-table__key {\n  width: 3ch;\n  color: var(--color-accent-alt);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-table__desc {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* a message: a frame named by its number, a head of From, To and Date, then the text */\n.ds-post {\n  margin-bottom: var(--space-3);\n}\n.ds-post__head {\n  display: grid;\n  grid-template-columns: max-content minmax(0, 1fr);\n  gap: 0 2ch;\n  margin: 0;\n  padding: var(--space-2) 2ch;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  background: var(--color-surface-alt);\n}\n.ds-post__head dt {\n  color: var(--color-text-muted);\n}\n.ds-post__head dd {\n  margin: 0;\n  color: var(--color-heading);\n}\n.ds-post__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-post__foot {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 2ch;\n  padding: var(--space-1) 2ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-post__quote {\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n}\n.ds-post__quote::before {\n  content: \"> \";\n}\n.ds-post__sig {\n  margin: var(--space-2) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-prose h1 {\n  font-size: var(--text-h2);\n}\n.ds-prose h2 {\n  margin-top: var(--space-3);\n  font-size: var(--text-h3);\n}\n\n.ds-sidebar__block .ds-badges {\n  margin: 0;\n  padding: var(--space-1) 2ch var(--space-2);\n}\n\n/* footer: the status line under the window's text: node, time left, the keys */\n.ds-footer {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: 0 3ch;\n  padding: var(--space-1) 2ch;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n}\n.ds-footer__keys {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 2ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__text {\n  margin: 0;\n}\n.ds-footer__link {\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- narrow windows: the window fills the screen, 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.ds-avatar--2 {\n  background: var(--color-fill-3);\n  color: var(--color-heading);\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-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\n  .ds-window {\n    margin: 0;\n    border-width: 0;\n    box-shadow: none;\n  }\n  .ds-window__title span:nth-child(n + 2) {\n    display: none;\n  }\n  .ds-main {\n    padding: var(--space-3) 2ch;\n  }\n  .ds-nav {\n    padding: var(--space-1) 1ch;\n  }\n  .ds-cols,\n  .ds-cols--even,\n  .ds-cols--form,\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n    letter-spacing: var(--heading-tracking);\n  }\n  .ds-stats {\n    justify-content: flex-start;\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    justify-content: space-evenly;\n  }\n  .ds-footer {\n    flex-direction: column;\n  }\n  .ds-footer__keys {\n    flex-wrap: nowrap;\n    justify-content: space-between;\n    gap: 0 1ch;\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: a bulletin board for people who repair old computers. 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-window\">\n<p class=\"ds-window__title\"><span>telnet chronoskin 23</span><span>node 2 of 4</span><span>90x40</span></p>\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#home\"><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=\"#home\"><span class=\"ds-nav__hot\">M</span>enu</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#board\"><span class=\"ds-nav__hot\">B</span>oard</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#thread\"><span class=\"ds-nav__hot\">R</span>ead</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#post\"><span class=\"ds-nav__hot\">W</span>rite</a></li>\n  </ul>\n</header>\n\n<main class=\"ds-main\">\n\n<!-- View 1, the main menu: the banner after login, who is on, the four choices, the boards, the latest messages. -->\n<section class=\"ds-view ds-view--home\" id=\"home\">\n  <section class=\"ds-hero\" data-component=\"hero\">\n    <p class=\"ds-hero__shade\" aria-hidden=\"true\">░░░░▒▒▒▒▓▓▓▓████████████████████████████████████████████████████▓▓▓▓▒▒▒▒░░░░</p>\n    <h1 class=\"ds-hero__title\">Welcome back, caller</h1>\n    <p class=\"ds-hero__lead\">chronoskin is a board for people who keep old computers running. Three new messages are waiting in the boards you follow.</p>\n    <div class=\"ds-buttons\">\n      <a class=\"ds-button\" href=\"#thread\">read new messages</a>\n      <a class=\"ds-button ds-button--secondary\" href=\"#post\">write a message</a>\n    </div>\n    <p class=\"ds-hero__note\">Last call: 5 October 2026, 21:14, from node 1. You have 42 minutes today.</p>\n    <p class=\"ds-hero__shade\" aria-hidden=\"true\">░░░░▒▒▒▒▓▓▓▓████████████████████████████████████████████████████▓▓▓▓▒▒▒▒░░░░</p>\n  </section>\n\n  <section class=\"ds-section\">\n    <ul class=\"ds-stats\" data-component=\"stats\">\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">3</span><span class=\"ds-stat__label\">on line</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">41</span><span class=\"ds-stat__label\">calls today</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">12,480</span><span class=\"ds-stat__label\">messages</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">302</span><span class=\"ds-stat__label\">files</span></li>\n    </ul>\n  </section>\n\n  <section class=\"ds-section\">\n    <h2 class=\"ds-section__title\">main menu</h2>\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <a class=\"ds-grid__cell\" href=\"#board\"><span class=\"ds-grid__key\">B</span><span class=\"ds-grid__title\">Message boards</span><span class=\"ds-grid__text\">Six boards, 3 new messages for you.</span></a>\n      <a class=\"ds-grid__cell ds-grid__cell--2\" href=\"#thread\"><span class=\"ds-grid__key\">R</span><span class=\"ds-grid__title\">Read new</span><span class=\"ds-grid__text\">Go through what is new, board by board.</span></a>\n      <a class=\"ds-grid__cell ds-grid__cell--3\" href=\"#post\"><span class=\"ds-grid__key\">W</span><span class=\"ds-grid__title\">Write</span><span class=\"ds-grid__text\">A message to a board, or a note to the sysop.</span></a>\n      <a class=\"ds-grid__cell ds-grid__cell--4\" href=\"#home\"><span class=\"ds-grid__key\">G</span><span class=\"ds-grid__title\">Goodbye</span><span class=\"ds-grid__text\">Log off and free the line for the next caller.</span></a>\n    </div>\n  </section>\n\n  <section class=\"ds-section\">\n    <h2 class=\"ds-section__title\">boards</h2>\n    <table class=\"ds-table\" data-component=\"table\">\n      <thead>\n        <tr><th>no</th><th>board</th><th class=\"ds-table__num ds-table__extra\">topics</th><th class=\"ds-table__num\">messages</th><th class=\"ds-table__extra\">last message</th></tr>\n      </thead>\n      <tbody>\n        <tr class=\"ds-table__group\"><td colspan=\"5\">Hardware</td></tr>\n        <tr><td class=\"ds-table__key\">1</td><td><a class=\"ds-table__title\" href=\"#board\">Repairs</a><span class=\"ds-table__desc\">Dead boards, leaking capacitors, tired power supplies.</span></td><td class=\"ds-table__num ds-table__extra\">412</td><td class=\"ds-table__num\">5,106</td><td class=\"ds-table__extra ds-table__date\">today 13:52</td></tr>\n        <tr class=\"is-alt\"><td class=\"ds-table__key\">2</td><td><a class=\"ds-table__title\" href=\"#board\">Cables and adapters</a><span class=\"ds-table__desc\">Pinouts, null modems, getting a picture on a new screen.</span></td><td class=\"ds-table__num ds-table__extra\">198</td><td class=\"ds-table__num\">2,240</td><td class=\"ds-table__extra ds-table__date\">today 09:30</td></tr>\n        <tr><td class=\"ds-table__key\">3</td><td><a class=\"ds-table__title is-visited\" href=\"#board\">Storage</a><span class=\"ds-table__desc\">Floppy drives, old hard disks and what replaces them.</span></td><td class=\"ds-table__num ds-table__extra\">167</td><td class=\"ds-table__num\">1,935</td><td class=\"ds-table__extra ds-table__date\">4 Oct</td></tr>\n        <tr class=\"ds-table__group\"><td colspan=\"5\">Software</td></tr>\n        <tr><td class=\"ds-table__key\">4</td><td><a class=\"ds-table__title\" href=\"#board\">Operating systems</a><span class=\"ds-table__desc\">Installing, booting and patching systems nobody ships any more.</span></td><td class=\"ds-table__num ds-table__extra\">220</td><td class=\"ds-table__num\">2,387</td><td class=\"ds-table__extra ds-table__date\">yesterday</td></tr>\n        <tr class=\"is-alt\"><td class=\"ds-table__key\">5</td><td><a class=\"ds-table__title is-visited\" href=\"#board\">Terminal programs</a><span class=\"ds-table__desc\">Settings, transfer protocols and character sets.</span></td><td class=\"ds-table__num ds-table__extra\">64</td><td class=\"ds-table__num\">812</td><td class=\"ds-table__extra ds-table__date\">28 Sep</td></tr>\n      </tbody>\n    </table>\n  </section>\n\n  <div class=\"ds-cols ds-cols--even\">\n    <div class=\"ds-col\">\n      <h2 class=\"ds-section__title\">new for you</h2>\n      <ul class=\"ds-list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">today 13:52</span>\n          <div class=\"ds-list__main\">\n            <a class=\"ds-list__title\" href=\"#thread\">Null modem for a 9-pin port</a>\n            <p class=\"ds-list__meta\">in Cables and adapters, from mira</p>\n          </div>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">today 09:30</span>\n          <div class=\"ds-list__main\">\n            <a class=\"ds-list__title\" href=\"#thread\">Supply hums but will not start</a>\n            <p class=\"ds-list__meta\">in Repairs, from otto</p>\n          </div>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">yesterday</span>\n          <div class=\"ds-list__main\">\n            <a class=\"ds-list__title\" href=\"#thread\">Boot disk reads on one drive only</a>\n            <p class=\"ds-list__meta\">in Storage, from ines</p>\n          </div>\n        </li>\n      </ul>\n    </div>\n    <div class=\"ds-panel\" data-component=\"panel\">\n      <h2 class=\"ds-panel__title\">from the sysop</h2>\n      <div class=\"ds-panel__body\">\n        <p class=\"ds-panel__text\">The board is down on Sunday from 02:00 to 04:00 while the disk is copied to a new machine.</p>\n        <p class=\"ds-progress\"><span class=\"ds-progress__label\">disk copy</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on\">######</span>....</span><span class=\"ds-progress__value\">60%</span></p>\n        <p class=\"ds-panel__text\"><span class=\"ds-tooltip\" tabindex=\"0\">Node 4<span class=\"ds-tooltip__tip\" role=\"tooltip\">The fourth of the four lines into the board.</span></span> now answers at 14400. <a class=\"ds-link\" href=\"#post\">Tell me</a> if it drops you.</p>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 2, one board: its topics. -->\n<section class=\"ds-view\" id=\"board\">\n  <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#home\">main menu</a></li>\n    <li class=\"ds-breadcrumb__sep\">&gt;</li>\n    <li><a class=\"ds-breadcrumb__link\" href=\"#home\">boards</a></li>\n    <li class=\"ds-breadcrumb__sep\">&gt;</li>\n    <li class=\"ds-breadcrumb__current\">Cables and adapters</li>\n  </ol>\n  <header class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">Cables and adapters</h1>\n      <p class=\"ds-page-header__text\">Board 2. 198 topics, 2,240 messages, 2 new for you.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#post\">new topic</a></div>\n  </header>\n  <ul class=\"ds-tabs\" data-component=\"tabs\">\n    <li><span class=\"ds-tabs__tab is-current\">all topics</span></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#board\">new 2</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#board\">unanswered 5</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#board\">mine 0</a></li>\n  </ul>\n  <div class=\"ds-tabs__body\">\n    <ul class=\"ds-list\" data-component=\"list\">\n      <li class=\"ds-list__item\">\n        <span class=\"ds-list__date\">today 13:52</span>\n        <div class=\"ds-list__main\">\n          <a class=\"ds-list__title\" href=\"#thread\">Null modem for a 9-pin port</a> <span class=\"ds-badge\">2 new</span>\n          <p class=\"ds-list__excerpt\">Which pins cross, and which three you can get away with.</p>\n          <p class=\"ds-list__meta\">started by mira, 7 messages, last from the sysop</p>\n        </div>\n      </li>\n      <li class=\"ds-list__item\">\n        <span class=\"ds-list__date\">today 09:30</span>\n        <div class=\"ds-list__main\">\n          <a class=\"ds-list__title\" href=\"#thread\">Picture rolls on a modern flat screen</a>\n          <p class=\"ds-list__excerpt\">15 kHz video into a monitor that expects 31.</p>\n          <p class=\"ds-list__meta\">started by otto, 12 messages, last from ines</p>\n        </div>\n      </li>\n      <li class=\"ds-list__item\">\n        <span class=\"ds-list__date\">3 Oct</span>\n        <div class=\"ds-list__main\">\n          <a class=\"ds-list__title is-visited\" href=\"#thread\">Where to buy 25-pin shells</a>\n          <p class=\"ds-list__excerpt\">Two shops still stock them; one sells by the hundred only.</p>\n          <p class=\"ds-list__meta\">started by pavel, 4 messages, last from pavel</p>\n        </div>\n      </li>\n      <li class=\"ds-list__item\">\n        <span class=\"ds-list__date\">29 Sep</span>\n        <div class=\"ds-list__main\">\n          <a class=\"ds-list__title is-visited\" href=\"#thread\">Keyboard adapter drops the first key</a>\n          <p class=\"ds-list__excerpt\">Works after the second press. Timing or power?</p>\n          <p class=\"ds-list__meta\">started by ines, 9 messages, last from mira</p>\n        </div>\n      </li>\n    </ul>\n    <ul class=\"ds-pagination\" data-component=\"pagination\">\n      <li><span class=\"ds-pagination__link is-disabled\">&lt; back</span></li>\n      <li><span class=\"ds-pagination__link is-current\">1</span></li>\n      <li><a class=\"ds-pagination__link\" href=\"#board\">2</a></li>\n      <li><a class=\"ds-pagination__link\" href=\"#board\">3</a></li>\n      <li><a class=\"ds-pagination__link\" href=\"#board\">50</a></li>\n      <li><a class=\"ds-pagination__link\" href=\"#board\">more &gt;</a></li>\n    </ul>\n  </div>\n  <h2 class=\"ds-section__title\">mine</h2>\n  <div class=\"ds-empty\" data-component=\"empty\">\n    <p class=\"ds-empty__text\">You have not written in this board yet.</p>\n    <a class=\"ds-button ds-button--secondary\" href=\"#post\">start a topic</a>\n  </div>\n</section>\n\n<!-- View 3, a topic: its messages, one frame each. -->\n<section class=\"ds-view\" id=\"thread\">\n  <ol class=\"ds-breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#home\">main menu</a></li>\n    <li class=\"ds-breadcrumb__sep\">&gt;</li>\n    <li><a class=\"ds-breadcrumb__link\" href=\"#board\">Cables and adapters</a></li>\n    <li class=\"ds-breadcrumb__sep\">&gt;</li>\n    <li class=\"ds-breadcrumb__current\">topic 198</li>\n  </ol>\n  <header class=\"ds-page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">Null modem for a 9-pin port</h1>\n      <p class=\"ds-page-header__text\">7 messages since 2 October. Messages 1 and 7 are shown.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#post\">reply</a></div>\n  </header>\n  <div class=\"ds-notices\" data-component=\"notice\">\n    <p class=\"ds-notice\"><span class=\"ds-notice__title\">Pinned:</span> the sysop keeps the first message of this topic up to date.</p>\n    <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Line noise:</span> message 5 arrived damaged and was left out. Its writer has been asked to send it again.</p>\n  </div>\n  <div class=\"ds-cols\">\n    <div class=\"ds-col\">\n      <article class=\"ds-post\">\n        <h2 class=\"ds-post__title\">message 1 of 7</h2>\n        <dl class=\"ds-post__head\">\n          <dt>From:</dt><dd><span class=\"ds-avatar\">mi</span> mira <span class=\"ds-badge ds-badge--tag\">regular</span></dd>\n          <dt>Date:</dt><dd>2 October 2026, 20:41</dd>\n        </dl>\n        <div class=\"ds-post__body\">\n          <div class=\"ds-prose\" data-component=\"typography\">\n            <h1>A null modem in seven wires</h1>\n            <p>Two machines that both think they are the terminal need their lines crossed. For a 9-pin port on each side this is the <strong>full cable</strong>; it works with every program I have tried.</p>\n            <h2>What crosses</h2>\n            <ul>\n              <li>2 to 3 and 3 to 2: data.</li>\n              <li>7 to 8 and 8 to 7: the two ask and answer lines.</li>\n              <li>4 to 6 and 6 to 4, with 5 straight through as ground.</li>\n            </ul>\n            <h3>The short version</h3>\n            <p>With flow control switched off, pins 2, 3 and 5 are enough. Set <code>9600 8N1</code> on both ends first.</p>\n          </div>\n          <p class=\"ds-post__sig\">-- mira, still soldering</p>\n        </div>\n        <div class=\"ds-post__foot\">\n          <a class=\"ds-link ds-link--bracket\" href=\"#post\">reply</a>\n          <a class=\"ds-link ds-link--bracket\" href=\"#post\">quote</a>\n          <a class=\"ds-link ds-link--bracket\" href=\"#thread\">next</a>\n        </div>\n      </article>\n      <article class=\"ds-post\">\n        <h2 class=\"ds-post__title\">message 7 of 7</h2>\n        <dl class=\"ds-post__head\">\n          <dt>From:</dt><dd><span class=\"ds-avatar ds-avatar--2\">sy</span> the sysop <span class=\"ds-badge\">new</span></dd>\n          <dt>Date:</dt><dd>7 October 2026, 13:52</dd>\n        </dl>\n        <div class=\"ds-post__body\">\n          <p class=\"ds-post__quote\">pins 2, 3 and 5 are enough</p>\n          <p class=\"ds-panel__text\">They are, and that is the cable in the file area now. The drawing is in the list below.</p>\n          <ul class=\"ds-links\" data-component=\"links\">\n            <li><a class=\"ds-link\" href=\"#thread\">nullmodem.txt</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#thread\">pinouts.txt</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#board\">more in this board</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#post\">answer the sysop</a></li>\n          </ul>\n        </div>\n      </article>\n    </div>\n    <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n      <div class=\"ds-sidebar__block\">\n        <h2 class=\"ds-sidebar__title\">in this topic</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li><a class=\"ds-sidebar__link is-current\" href=\"#thread\">mira</a><span class=\"ds-sidebar__count\">3</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#thread\">otto</a><span class=\"ds-sidebar__count\">2</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#thread\">the sysop</a><span class=\"ds-sidebar__count\">1</span></li>\n          <li><a class=\"ds-sidebar__link\" href=\"#thread\">ines</a><span class=\"ds-sidebar__count\">1</span></li>\n        </ul>\n      </div>\n      <div class=\"ds-sidebar__block\">\n        <h2 class=\"ds-sidebar__title\">marks</h2>\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">new</span>\n          <span class=\"ds-badge ds-badge--tag\">regular</span>\n          <span class=\"ds-badge ds-badge--success\">answered</span>\n          <span class=\"ds-badge ds-badge--warning\">held</span>\n          <span class=\"ds-badge ds-badge--danger\">damaged</span>\n        </div>\n        <p class=\"ds-sidebar__text\">A held message waits for the sysop. A damaged one must be sent again.</p>\n      </div>\n    </aside>\n  </div>\n</section>\n\n<!-- View 4, write a message: the form, its buttons, the question before throwing it away. -->\n<section class=\"ds-view\" id=\"post\">\n  <header class=\"ds-page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">Write a message</h1>\n      <p class=\"ds-page-header__text\">To a board, or to the sysop alone. Plain text, 72 columns.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#thread\">back to the topic</a></div>\n  </header>\n  <div class=\"ds-cols ds-cols--form\">\n    <form class=\"ds-form\" data-component=\"form\" action=\"#post\">\n      <div class=\"ds-form__row\">\n        <label class=\"ds-form__label\" for=\"f-board\">board:</label>\n        <div class=\"ds-form__field\">\n          <select class=\"ds-form__input ds-form__input--auto\" id=\"f-board\"><option>2 Cables and adapters</option><option>1 Repairs</option><option>to the sysop only</option></select>\n        </div>\n      </div>\n      <div class=\"ds-form__row\">\n        <label class=\"ds-form__label\" for=\"f-subj\">subject:</label>\n        <div class=\"ds-form__field\">\n          <input class=\"ds-form__input is-invalid\" id=\"f-subj\" type=\"text\" value=\"\">\n          <p class=\"ds-form__error\">error: a message needs a subject.</p>\n        </div>\n      </div>\n      <div class=\"ds-form__row\">\n        <label class=\"ds-form__label\" for=\"f-text\">message:</label>\n        <div class=\"ds-form__field\">\n          <textarea class=\"ds-form__input\" id=\"f-text\" rows=\"6\">&gt; pins 2, 3 and 5 are enough\n\nTried it last night between two machines. Works at 9600, drops characters at 19200.</textarea>\n          <p class=\"ds-form__hint\">A line that starts with &gt; is shown as a quote.</p>\n        </div>\n      </div>\n      <div class=\"ds-form__row\">\n        <label class=\"ds-form__label\" for=\"f-sig\">signature:</label>\n        <div class=\"ds-form__field\">\n          <input class=\"ds-form__input\" id=\"f-sig\" type=\"text\" value=\"-- caller 118\">\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> add it to this message</label>\n          <label class=\"ds-switch\"><span class=\"ds-switch__label\">ring the bell when someone answers</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\">throw away</button>\n        <button class=\"ds-button\" type=\"button\" disabled>attach</button>\n      </div>\n    </form>\n    <div class=\"ds-stack\">\n      <div class=\"ds-dialog__backdrop\">\n        <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-1\">\n          <h2 class=\"ds-dialog__title\" id=\"dlg-1\">throw it away?</h2>\n          <div class=\"ds-dialog__body\">\n            <p class=\"ds-dialog__text\">Three lines of your reply are not saved as a draft.</p>\n            <div class=\"ds-dialog__actions\">\n              <button class=\"ds-button ds-button--danger\" type=\"button\">yes</button>\n              <button class=\"ds-button ds-button--secondary\" type=\"button\">no</button>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <h2 class=\"ds-panel__title\">house rules</h2>\n        <div class=\"ds-panel__body\">\n          <p class=\"ds-panel__text\">Say which machine. Quote two lines, not twenty. Files go in the file area, not in a message.</p>\n          <div class=\"ds-accordion\">\n          <details class=\"ds-accordion__item\" open>\n          <summary class=\"ds-accordion__title\">How long may a message be?</summary>\n          <div class=\"ds-accordion__body\">\n          <p>As long as it needs, in lines of 72 columns.</p>\n          </div>\n          </details>\n          <details class=\"ds-accordion__item\">\n          <summary class=\"ds-accordion__title\">Where do files go?</summary>\n          <div class=\"ds-accordion__body\">\n          <p>In the file area. A message only names them.</p>\n          </div>\n          </details>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n</main>\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <ul class=\"ds-footer__keys\">\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">M</span> <a class=\"ds-footer__link\" href=\"#home\">menu</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">B</span> <a class=\"ds-footer__link\" href=\"#board\">board</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">R</span> <a class=\"ds-footer__link\" href=\"#thread\">read</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">W</span> <a class=\"ds-footer__link\" href=\"#post\">write</a></li>\n  </ul>\n  <p class=\"ds-footer__text\">chronoskin, node 2 | 42 min left | 14:02</p>\n</footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.terminal.forum.s06.p04.t03.u02\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"terminal\",\n    \"years\": [\n      2015,\n      2026\n    ]\n  },\n  \"archetype\": \"forum\",\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-6432\",\n  \"short\": \"v1-tm-6432\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #e8e8e8;\n  --color-canvas: #ffffff;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f3f3f3;\n  --color-surface-strong: #dedede;\n  --color-bar: #000000;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #dedede;\n  --color-bar-alt-text: #000000;\n  --color-inverse: #000000;\n  --color-inverse-text: #ffffff;\n  --color-text: #1c1c1c;\n  --color-text-muted: #636363;\n  --color-heading: #000000;\n  --color-heading-alt: #a3001b;\n  --color-link: #0037a6;\n  --color-link-quiet: #1c1c1c;\n  --color-link-visited: #6a2c91;\n  --color-link-hover: #000000;\n  --color-link-active: #a3001b;\n  --color-border: #000000;\n  --color-border-strong: #000000;\n  --color-border-muted: #c4c4c4;\n  --color-accent: #ffe14d;\n  --color-accent-text: #000000;\n  --color-accent-alt: #006f80;\n  --color-fill-1: #ffffff;\n  --color-fill-2: #f3f3f3;\n  --color-fill-3: #e8e8e8;\n  --color-fill-4: #f3f3f3;\n  --color-button: #000000;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffe14d;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #000000;\n  --color-input: #ffffff;\n  --color-input-text: #000000;\n  --color-input-border: #000000;\n  --color-disabled: #e8e8e8;\n  --color-disabled-text: #8a8a8a;\n  --color-danger: #a3001b;\n  --color-danger-surface: #fbe9ec;\n  --color-success: #1a7a1a;\n  --color-warning: #8a5a00;\n  --color-notice: #f3f3f3;\n  --color-notice-text: #1c1c1c;\n  --color-focus: #0037a6;\n  --color-shadow: #000000;\n  --color-overlay: #c4c4c4;\n}\n\n/* @part type */\n:root {\n  --font-body: \"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: dashed;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: none;\n  --shadow-control-hover: 0 2px 0 var(--color-border-strong);\n  --shadow-control-pressed: inset 0 0 0 1px var(--color-border-strong);\n  --shadow-dialog: none;\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: transparent;\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 80%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px dashed var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
