{
  "id": "v1-tm-6776",
  "long_id": "v1.terminal.forum.s06.p07.t07.u06",
  "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-6776",
  "preview_url": "https://chrono.skin/s/v1-tm-6776/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 (\"Cascadia Mono\", Consolas, \"Lucida Console\", Menlo, \"Liberation Mono\", monospace). Weights are `--weight-body` 400 and 700 for headings, names, bar items (`--weight-ui`) and the brand. Nothing is tracked and nothing is set in capitals: `--heading-transform` and `--ui-transform` are none.\n- Sizes are one size with two exceptions, as on a screen of 80 by 25 cells: `--text-base` 16px with `--line-body` 1.2 is all running text, `--text-ui` 16px bars, buttons, inputs, tabs and pagination, `--text-small` 15px meta lines, hints, badges, the footer and code blocks, `--text-large` 18px the hero's lead and the brand name. `--text-display` 26px is the hero title only, `--text-h1` 20px a page title, a figure and the first heading of running text; `--text-h2` and `--text-h3` are 16px and differ from text by weight and colour.\n- The DOS screen: `--color-page` #000070 is the desktop behind the program (`--fill-page` dithers it with a 4px check of a darker blue), `--color-canvas` #0000a8 the screen, `--color-surface` #0000a8 the inside of frames and table rows, `--color-surface-alt` #00008c alternate rows and code, `--color-surface-strong` #1818c4 group rows, inline code, the cell of an avatar and a line that names the reader. `--color-text` #c6c6c6 is running text, `--color-text-muted` #86a4dc times, counts and hints, `--color-heading` #ffffff headings, names and figures, `--color-heading-alt` #ffff54 frame titles, third headings and tags.\n- Links: `--color-link` #54ffff, `--color-link-quiet` #a8e0ff for breadcrumb, tabs, sidebar and footer links, `--color-link-visited` #dca8ff, `--color-link-hover` #ffffff, `--color-link-active` #ffff54. `--link-decoration` is none: a link is known by its colour, and takes `--link-decoration-hover` (underline) when hovered.\n- Bars: `--color-bar` #00a8a8 with `--color-bar-text` #000000 is the topic line and the head row of a table. `--color-bar-alt` #a8a8a8 with `--color-bar-alt-text` #000000 is the window list. `--color-inverse` #54ffff with `--color-inverse-text` #000000 is inverse video: the current tab, page number and sidebar link, the selected table row, the hovered menu item, the half of a switch that holds.\n- Lines: `--color-border` #a8a8a8 at `--border-width` 1px `--border-style` solid draws every frame and rule; `--color-border-strong` #ffffff at `--border-width-strong` 3px is the rule under a page header, the left edge of the hero, of a notice and of a mentioned line, and the frame of a dialog and a menu; `--color-border-muted` #3c3cd0 parts rows inside a frame.\n- Accents: `--color-accent` #ffff54 with `--color-accent-text` #000000 is the count badge and the mark of a mentioned line; `--color-accent-alt` #54ff54 is the prompt sign, the reader's own name at the input line and the fold marks of a tree. `--color-fill-1` to `--color-fill-4` (#0000a8, #00008c, #004c8c, #1818c4) are the four grid cells and two of the avatar cells. Status words are text in brackets: `--color-success` #54ff54, `--color-warning` #ffb454, `--color-danger` #ff8080; progress bars use the same three.\n- Controls: the primary button is `--color-button` #00a800 with `--color-button-text` #000000; the secondary button is `--color-button-secondary` #000070 with `--color-button-secondary-text` #54ffff and a frame in `--color-border`; fields are `--color-input` #000058 with `--color-input-text` #ffffff and a line in `--color-input-border` #00a8a8; disabled is `--color-disabled` #00008c with `--color-disabled-text` #6464e0. The notice is `--color-notice` #005c78 with `--color-notice-text` #ffffff, the error notice `--color-danger-surface` #400014 with `--color-danger`. `--color-overlay` #000058 is the block a dialog stands on; `--color-focus` #ffff54 is the focus outline.\n- Surface: everything is square and every shadow is a hard black block, as a text screen draws it: `--shadow-control` 3px 3px on buttons and fields (1px 1px when pressed), `--shadow-panel` 6px 5px on frames, `--shadow-dialog` 16px 12px on the hero, a dialog and a pulled-down menu, none of them blurred. `--shadow-text` is none. Buttons and fields are filled (`--fill-button-secondary`, `--fill-input`); `--fill-button-hover` lightens the button (60% of it over white). All four radii are 0, `--backdrop-blur` is 0px, `--focus-ring` is 3px solid var(--color-focus), `--transition` is none.\n- The era's rule for which text stands on which fill (every layout of the era keeps it, so any palette works with any layout): `--color-text`, `--color-text-muted`, the two heading colours, every link colour and the three status colours stand on `--fill-page`, `--color-canvas`, the three surfaces, `--fill-panel` and the four fills, and on nothing else. `--color-bar-text` only on `--fill-bar`; `--color-bar-alt-text` only on `--fill-bar-alt`; `--color-inverse-text` only on `--fill-inverse`; `--color-accent-text` only on `--fill-accent`; `--color-button-text` and `--color-button-hover-text` only on `--fill-button` and its hover; `--color-notice-text` only on `--color-notice`; `--color-danger` also on `--color-danger-surface`; `--color-disabled-text` on `--color-disabled`. `--color-button-secondary-text` and `--color-input-text` must read on their own fills and on the canvas and surfaces, because a surface set may leave those controls unfilled. The current item of a bar is a hole in it: `--color-canvas` with `--color-heading`. Nothing but a link in the bar's own text colour, 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; the log's columns are `6ch` for the time and `17ch` for the name; an avatar is at least `4ch` wide; a pulled-down menu is at least `28ch` and a tooltip at most `34ch` wide; horizontal paddings and gaps are whole character cells.\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 <= 26px`: the largest text is the hero title; everything else is within a few pixels of the body size.\n- `font-size >= 15px`: small text is the meta size; nothing is set smaller.\n- `letter-spacing <= 0px`: the grid of the typeface is never stretched.\n- `uppercase-text <= 5%`: nothing is set in capitals by the stylesheet but the initials of an avatar.\n- `line-height <= 1.4`: lines sit as close as an 80 by 25 screen 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`: no box is soft and none floats; only text glows.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `border-width <= 6px`: a double line is three pixels, the heavy one six.\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 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.p07.t07.u06\",\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-6776\",\n  \"short\": \"v1-tm-6776\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #000070;\n  --color-canvas: #0000a8;\n  --color-surface: #0000a8;\n  --color-surface-alt: #00008c;\n  --color-surface-strong: #1818c4;\n  --color-bar: #00a8a8;\n  --color-bar-text: #000000;\n  --color-bar-alt: #a8a8a8;\n  --color-bar-alt-text: #000000;\n  --color-inverse: #54ffff;\n  --color-inverse-text: #000000;\n  --color-text: #c6c6c6;\n  --color-text-muted: #86a4dc;\n  --color-heading: #ffffff;\n  --color-heading-alt: #ffff54;\n  --color-link: #54ffff;\n  --color-link-quiet: #a8e0ff;\n  --color-link-visited: #dca8ff;\n  --color-link-hover: #ffffff;\n  --color-link-active: #ffff54;\n  --color-border: #a8a8a8;\n  --color-border-strong: #ffffff;\n  --color-border-muted: #3c3cd0;\n  --color-accent: #ffff54;\n  --color-accent-text: #000000;\n  --color-accent-alt: #54ff54;\n  --color-fill-1: #0000a8;\n  --color-fill-2: #00008c;\n  --color-fill-3: #004c8c;\n  --color-fill-4: #1818c4;\n  --color-button: #00a800;\n  --color-button-text: #000000;\n  --color-button-hover-text: #000000;\n  --color-button-secondary: #000070;\n  --color-button-secondary-text: #54ffff;\n  --color-input: #000058;\n  --color-input-text: #ffffff;\n  --color-input-border: #00a8a8;\n  --color-disabled: #00008c;\n  --color-disabled-text: #6464e0;\n  --color-danger: #ff8080;\n  --color-danger-surface: #400014;\n  --color-success: #54ff54;\n  --color-warning: #ffb454;\n  --color-notice: #005c78;\n  --color-notice-text: #ffffff;\n  --color-focus: #ffff54;\n  --color-shadow: #000000;\n  --color-overlay: #000058;\n}\n\n/* @part type */\n:root {\n  --font-body: \"Cascadia Mono\", Consolas, \"Lucida Console\", Menlo, \"Liberation Mono\", monospace;\n  --font-heading: \"Cascadia Mono\", Consolas, \"Lucida Console\", Menlo, \"Liberation Mono\", monospace;\n  --font-ui: \"Cascadia Mono\", Consolas, \"Lucida Console\", Menlo, \"Liberation Mono\", monospace;\n  --font-mono: \"Cascadia Mono\", Consolas, \"Lucida Console\", Menlo, \"Liberation Mono\", monospace;\n  --text-base: 16px;\n  --text-small: 15px;\n  --text-ui: 16px;\n  --text-large: 18px;\n  --text-display: 26px;\n  --text-h1: 20px;\n  --text-h2: 16px;\n  --text-h3: 16px;\n  --line-body: 1.2;\n  --line-heading: 1.2;\n  --line-display: 1.1;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 700;\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: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 3px;\n  --border-width-strong: 6px;\n  --border-style: double;\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 0 0 1px var(--color-button);\n  --shadow-control-pressed: inset 0 0 0 2px var(--color-shadow);\n  --shadow-dialog: none;\n  --shadow-text: 0 0 6px color-mix(in srgb, var(--color-heading) 45%, transparent);\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: transparent;\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 85%, white);\n  --fill-button-secondary: transparent;\n  --fill-input: transparent;\n  --focus-ring: 1px dotted var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
