{
  "id": "v1-tm-5262",
  "long_id": "v1.terminal.app.s05.p02.t06.u02",
  "name": "Terminal, a monitor in sixteen colours",
  "era": {
    "slug": "terminal",
    "code": "tm",
    "name": "Terminal",
    "years": [
      2015,
      2026
    ],
    "description": "The text-terminal look of 2015 to 2026: a monospace face for everything, bright text on a dark screen, boxes and rules drawn with borders like character frames, prompts and cursors, status lines and key hints instead of buttons with chrome."
  },
  "archetype": "app",
  "mode": "mix",
  "viewport": {
    "width": 1280,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is a monitoring screen as terminal programs draw it and as web dashboards of 2015 to 2026 copied it: process viewers, multiplexers and status boards. One small monospace face sets everything, grey text stands on black with the sixteen terminal colours for states, and the screen is cut into tiles that share one thin line and name themselves on a grey title line. It was the look of server monitors, text-mode weather and status pages, and of admin tools that wanted to feel like the shell they sat beside.",
  "url": "https://chrono.skin/s/v1-tm-5262",
  "preview_url": "https://chrono.skin/s/v1-tm-5262/specimen.html",
  "files": {
    "STYLE.md": "# Terminal, a monitor in sixteen colours\n\n## Summary\n\nThis is a monitoring screen as terminal programs draw it and as web dashboards of 2015 to 2026 copied it: process viewers, multiplexers and status boards. One small monospace face sets everything, grey text stands on black with the sixteen terminal colours for states, and the screen is cut into tiles that share one thin line and name themselves on a grey title line. It was the look of server monitors, text-mode weather and status pages, and of admin tools that wanted to feel like the shell they sat beside.\n\n## Layout\n\n- The page is designed for a 1280px window and does not stretch beyond it: `.ds-screen` is a column of `--size-page` (1280px) on `--color-canvas`, at least as tall as the window: the window list `.ds-nav`, then `.ds-main` (the views, padded `--space-3` and `2ch`), then the status line `.ds-footer` at the foot.\n- `.ds-nav` is one line on `--fill-bar-alt`: the `.ds-brand`, then `.ds-nav__list`, whose `.ds-nav__link` items are windows named by number (`.ds-nav__num`, bold, followed by a colon) and word; the current one is inverse video. `.ds-nav__status` is the refresh interval and clock at the right.\n- Tiles. A `.ds-deck` is one block of tiles with `--shadow-panel`. Inside it, rows are `.ds-tiles` grids: plain (one column), `--top` and `--even` (two equal columns) or `--work` (the work at the left, a rail of `--size-side` 320px at the right); `.ds-tiles__col` piles tiles in one column, the last one taking what height is left. A tile is a `.ds-tile`, `.ds-panel`, `.ds-sidebar__block`, `.ds-stat` or `.ds-grid__cell`: each has all four lines in `--color-border` and overlaps its neighbour by `--border-width`, so tiles share the line between them and there is never a gap. A tile opens with a title line on `--color-surface-strong` in `--color-heading-alt` (`.ds-tile__title`, with a muted `.ds-tile__aside` at its right end), then `.ds-tile__body` (`--flush` for a table) and an optional `.ds-tile__foot` (`--bare` when it is all the tile holds).\n- The home view is one deck: a `--top` row with the `.ds-hero` tile (title, lead, two buttons) beside a tile of `.ds-gauges`; the `.ds-stats` row of four figure tiles; and a `--work` row with the table of hosts at the left and, in the rail, the `.ds-sidebar` tile over the log `.ds-panel`.\n- Inner pages have no hero. They open with the `.ds-breadcrumb` (where there is a level above) and `.ds-page-header`, then tabs or notices straight on the canvas, then one deck: hosts as a `.ds-grid` of tiles over a pagination tile and an `--even` row; alerts as an `--even` row of a list and a runbook; settings as a `--work` row of a form beside a dialog and a panel.\n- Views. The specimen is one small site with four views, one showing at a time; window list and status line are written once around them. `overview` is the home view. `hosts` is every host as a tile under tabs, with pagination, the empty state of the paused hosts and the legend of badges. `alerts` is two notices, the list of today's alerts and the runbook of one of them as running text with links. `settings` is the form of one host 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: rows are one text line and nothing is padded more than it must be. `--space-1` 2px is the padding of a tile's foot and of form controls; `--space-2` 6px the padding above the text in a tile, the height added to a window-list item, the gap between list rows and between notices; `--space-3` 12px the gap between blocks on the canvas, under a page header and below the text in a tile; `--space-4` 18px the foot of the main area; `--space-5` 36px is kept for a break larger than a block. Horizontal steps are character cells written in `ch`.\n- Fixed sizes: `--size-label` 130px the label column of a form, `--size-field` 440px a text input, `--size-date` 80px the time column of the list, `--size-dialog` 380px a dialog.\n- Below 900px every row of tiles is one column, the stats row is two by two, the grid is one column, the clock in the window list is left out, form labels sit above their fields, and table cells marked `.ds-table__extra` are left out. The page never scrolls sideways. The status at the right of the window list (`.ds-nav__status`) is left out; below 600px `.ds-nav__list` takes a row of its own under the brand with its windows spread to both edges, scrolling sideways if they do not fit, the current one still in inverse video. 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 (\"Fira Mono\", \"Ubuntu Mono\", \"PT Mono\", \"Courier New\", monospace). Headings are not bold: `--weight-heading` and `--weight-display` are 400, and a heading is told by capitals, tracking and a brighter amber. `--weight-bold` 700 is for titles of topics, figures and letters of the menu.\n- Large for a terminal, as a screen of ninety columns is: `--text-base` 17px with `--line-body` 1.3 is all running text, `--text-ui` 17px the menu line, buttons, inputs, tabs and pagination, `--text-small` 15px meta lines, hints, badges, code blocks and the window's title and status lines, `--text-large` 19px the banner's lead and the brand name. `--text-display` 36px is the banner title only, `--text-h1` 24px a page title and the letters of the menu, `--text-h2` 19px section rules, `--text-h3` 17px frame titles. `--heading-transform` is uppercase with `--heading-tracking` 0.08em; `--display-tracking` is 0.12em; `--ui-transform` is none.\n- An amber phosphor screen: every colour is a step of one amber on brown-black; only the status colours and the orange accent leave the family.\n- The screen: `--color-page` #070400 is the room, `--color-canvas` #120a00 the screen, `--color-surface` #1a0f00 table rows, `--color-surface-alt` #241500 alternate rows, the head of a message and code blocks, `--color-surface-strong` #382100 group rows and inline code. `--color-text` #e89b00 is running text, `--color-text-muted` #a86c00 dates, counts, hints and quotes, `--color-heading` #ffcf70 headings and figures, `--color-heading-alt` #fff1b8 frame titles, third headings and tags.\n- Links: `--color-link` #ffd98f, `--color-link-quiet` #e89b00 for breadcrumb, tabs and sidebar links, `--color-link-visited` #c98f52, `--color-link-hover` #fff7dd, `--color-link-active` #ffffff. Links are brighter than text, not underlined (`--link-decoration` and `--link-decoration-quiet` none) until hovered (`--link-decoration-hover` underline).\n- Bars: `--color-bar` #ffb000 with `--color-bar-text` #120a00 is the menu line and the head row of a table. `--color-bar-alt` #382100 with `--color-bar-alt-text` #ffc955 is the window's title line and status line. `--color-inverse` #ffcf70 with `--color-inverse-text` #120a00 is inverse video: the letters of the main menu, the current tab, page number and sidebar link.\n- Lines are double, as box characters draw them: `--border-style` double at `--border-width` 3px in `--color-border` #7d4c00 draws every frame, rule and table row; `--border-width-strong` 6px in `--color-border-strong` #e89b00 is the rule under a page header and the left edge of a notice, and the strong colour frames the window, a notice and a dialog; `--color-border-muted` #472b00 parts rows inside a frame.\n- Accents: `--color-accent` #fff1b8 with `--color-accent-text` #120a00 is the count badge; `--color-accent-alt` #ff7a1a the board numbers and the prompt sign. `--color-fill-1` to `--color-fill-4` (#1a0f00, #241500, #382100, #241500) are the four cells of the main menu. Status words: `--color-success` #b5e853, `--color-warning` #ffee58, `--color-danger` #ff5a36.\n- Controls: the primary button is `--color-button` #e89b00 with `--color-button-text` #120a00; the secondary button is unfilled (`--fill-button-secondary` transparent) with `--color-button-secondary-text` #ffcf70 in a frame of `--color-border`; fields are unfilled with `--color-input-text` #ffcf70 and a line in `--color-input-border` #7d4c00; disabled is `--color-disabled` #241500 with `--color-disabled-text` #7d4c00. The notice is `--color-notice` #241500 with `--color-notice-text` #ffcf70, the error notice `--color-danger-surface` #2a0800 with `--color-danger`. `--color-overlay` #382100 is the block a dialog stands on; `--color-focus` #fff1b8 the focus outline, `--focus-ring` 1px dotted.\n- Surface: `--fill-panel` is transparent, so frames are only their lines on the screen. `--shadow-text` is the phosphor glow, a 6px bloom of the heading colour at 45%, on the banner title, page titles, figures and the brand name. There is no box shadow at rest (`--shadow-panel`, `--shadow-control`, `--shadow-dialog` none); a hovered button gets a one-pixel ring of its own colour, a pressed one an inset line; `--fill-button-hover` lightens the button. All four radii are 0, `--backdrop-blur` is 0px and `--transition` is none.\n- The era's rule for which text stands on which fill (every layout of the era keeps it, so any palette works with any layout): `--color-text`, `--color-text-muted`, the two heading colours, every link colour and the three status colours stand on `--fill-page`, `--color-canvas`, the three surfaces, `--fill-panel` and the four fills, and on nothing else. `--color-bar-text` only on `--fill-bar`; `--color-bar-alt-text` only on `--fill-bar-alt`; `--color-inverse-text` only on `--fill-inverse`; `--color-accent-text` only on `--fill-accent`; `--color-button-text` and `--color-button-hover-text` only on `--fill-button` and its hover; `--color-notice-text` only on `--color-notice`; `--color-danger` also on `--color-danger-surface`; `--color-disabled-text` on `--color-disabled`. Two tokens must read in two places, because a surface set may leave a control unfilled: `--color-button-secondary-text` on `--fill-button-secondary` and on the canvas and surfaces, `--color-input-text` on `--fill-input` and on the canvas and surfaces. Whatever is current or selected is inverse video (`--fill-inverse` with `--color-inverse-text`); where the navigation stands on `--fill-bar`, its current item is a hole in the bar: `--color-canvas` with `--color-heading`.\n- One-off sizes written with `calc()` or `ch`: 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; horizontal paddings and column gaps are whole character cells; the banner's lead is at most `62ch` wide; the checkbox is `2ch` square. Inside a message the first two headings of running text are one step smaller (`--text-h2`, `--text-h3`).\n\n## Components\n\n- `.ds-page` on `<body>`: page fill and base type, no margin. `.ds-screen` is the column of the whole screen, `.ds-main` the padded area the views sit in, `.ds-deck`, `.ds-tiles` (`--top`, `--even`, `--work`), `.ds-tiles__col` and `.ds-tile` the tiles described under Layout.\n- `.ds-nav`: the window list at the top, 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`: a tile like the others: its title line, then `.ds-hero__title` (`--text-display`), `.ds-hero__lead` and a `.ds-buttons` row. It states what the screen shows in one sentence.\n- `.ds-footer`: the status line on `--fill-bar-alt`: `.ds-footer__session` (the program's name on `--fill-bar`), `.ds-footer__keys`, a list of `.ds-key` hints each holding a `.ds-footer__link`, and `.ds-footer__text` at the right.\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-base`, in `--color-bar-alt-text` because it stands on the window list. 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 label on a block one text line high, with one cell of padding at each side. 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`: one text line a row, no rules between rows, under a head row on `--fill-bar`. `.ds-table__num` right-aligns a numeric column, `.ds-table__code` is a bold first column, `.ds-table__date` a muted one, `.ds-table__bar` a cell holding a meter, `tr.is-alt` an alternate row, `.ds-table__group` a group row, `tr.is-selected` the row under the cursor in inverse video (plain text only, no badge or link), `.ds-table__title` the link in a row, `.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 status badge may open the meta line.\n- `.ds-panel`: a tile: a `.ds-panel__title` line on `--color-surface-strong`, then a `.ds-panel__body` of `.ds-panel__text` paragraphs or a `.ds-log`. It always sits in a row or column of tiles.\n- `.ds-stat`: one figure tile: a `.ds-stat__label` in `--color-heading-alt`, the `.ds-stat__value` at `--text-display`, and a small muted `.ds-stat__note`. `.ds-stats` is the row of four.\n- `.ds-grid`: tiles four across (one column on a phone) on `--color-fill-1` (`--2`, `--3`, `--4` select the other fills, one per group): a `.ds-grid__state` badge at the right, a muted `.ds-grid__label`, a `.ds-grid__title` and `.ds-grid__text` lines that each hold a meter.\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`: a tile of the right rail: a `.ds-sidebar__block` with a `.ds-sidebar__title` line and a `.ds-sidebar__list` of `.ds-sidebar__link` items (`is-current` in inverse video) with a `.ds-sidebar__count`.\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 block without a frame, inside a tile, 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. Here a meter is typed in upright strokes and dots, and `.ds-meter__on--danger` is the red one. `.ds-gauges` is a `<dl>` of meter rows (name in `--color-accent-alt`, bar, a right-aligned `.ds-gauges__num`); `.ds-log` is a list of small lines each opening with a muted `.ds-log__time`; `.ds-keys` is a `<dl>` of a bold word and its explanation.\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-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 <= 36px`: the largest text is the banner title.\n- `font-size >= 15px`: small text is the meta size; nothing is set smaller.\n- `letter-spacing <= 5px`: only headings are tracked, and never by more than an eighth of their size.\n- `line-height <= 1.5`: lines sit as close as a terminal sets them.\n- `border-radius <= 0px`: a character cell has no round corner; every box, button and field is square.\n- `box-shadow-blur <= 0px`: nothing is soft and nothing floats; where a set has a shadow at all it is a hard offset block.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `border-width <= 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 is a tile: copy `.ds-tile` with its title line, put it in a `.ds-tiles` row of a `.ds-deck`, and never leave a gap or a second line between two tiles. A figure copies `.ds-stat`; a thing with a state copies a `.ds-grid__cell` with its badge and meters. 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 monitor: the whole window is one screen\n   of tiles that share their lines, with a rail of narrow tiles at the right.\n   Rows are tight; horizontal steps are written in ch. */\n:root {\n  --size-page: 1280px;\n  --size-side: 320px;\n  --size-label: 130px;\n  --size-field: 440px;\n  --size-dialog: 380px;\n  --size-date: 80px;\n  --space-1: 2px;\n  --space-2: 6px;\n  --space-3: 12px;\n  --space-4: 18px;\n  --space-5: 36px;\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-frame {\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-frame__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-frame__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-frame__title::after {\n  content: \"\";\n  flex: 1;\n  min-width: 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__body {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-2);\n}\n.ds-panel__text:last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- a section rule: the name, then a line to the right edge ---------- */\n.ds-section__title {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  margin: var(--space-3) 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-section__title:first-child {\n  margin-top: 0;\n}\n.ds-section__title::after {\n  content: \"\";\n  flex: 1;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-note:last-child {\n  margin-bottom: 0;\n}\n.ds-note {\n  margin: var(--space-2) 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- prompt, cursor, key hints, meters ---------- */\n.ds-prompt {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-weight: var(--weight-bold);\n  overflow-wrap: anywhere;\n}\n.ds-prompt__sign {\n  color: var(--color-accent-alt);\n}\n.ds-prompt__path {\n  color: var(--color-heading-alt);\n}\n/* The block cursor: one cell of inverse video. It holds a no-break space. */\n.ds-cursor {\n  background: currentColor;\n}\n@media (prefers-reduced-motion: no-preference) {\n  .ds-cursor {\n    animation: ds-blink 1.2s steps(1) infinite;\n  }\n}\n@keyframes ds-blink {\n  0% { opacity: 1; }\n  50% { opacity: 0; }\n  100% { opacity: 0; }\n}\n.ds-key {\n  white-space: nowrap;\n}\n.ds-key__cap {\n  font-weight: var(--weight-bold);\n}\n.ds-key__cap::before {\n  content: \"[\";\n}\n.ds-key__cap::after {\n  content: \"]\";\n}\n/* A progress bar typed in block characters. */\n.ds-meter {\n  color: var(--color-border);\n  white-space: nowrap;\n}\n.ds-meter__on {\n  color: var(--color-success);\n}\n.ds-meter__on--warning {\n  color: var(--color-warning);\n}\n.ds-code {\n  box-sizing: border-box;\n  max-width: 100%;\n  margin: 0 0 var(--space-3);\n  padding: var(--space-2) 2ch;\n  overflow-x: auto;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n  white-space: pre;\n}\n.ds-code:last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- links ---------- */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--quiet,\n.ds-link--quiet:visited,\n.ds-link--quiet.is-visited {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-link--quiet:hover,\n.ds-link--quiet.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n/* A link marked by brackets instead of an underline: [copy]. */\n.ds-link--bracket,\n.ds-link--bracket:visited {\n  color: var(--color-link);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-link--bracket::before {\n  content: \"[\";\n}\n.ds-link--bracket::after {\n  content: \"]\";\n}\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) 3ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* ---------- brand: the mark on a one-line tile dressed like the primary button ---------- */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: 1ch;\n  color: var(--color-heading);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  flex: none;\n  display: block;\n  box-sizing: border-box;\n  width: calc(var(--text-base) * var(--line-body));\n  height: calc(var(--text-base) * var(--line-body));\n  border: var(--border-width) var(--border-style) var(--color-button);\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--display-tracking);\n  text-shadow: var(--shadow-text);\n}\n.ds-brand:hover .ds-brand__name,\n.ds-brand.is-hover .ds-brand__name {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-brand:focus-visible,\n.ds-brand.is-focus {\n  outline: var(--focus-ring);\n}\n\n/* ---------- breadcrumb: a path ---------- */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 1ch;\n  margin: 0 0 var(--space-2);\n  padding: 0;\n  list-style: none;\n}\n.ds-breadcrumb__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__link:hover,\n.ds-breadcrumb__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-breadcrumb__sep {\n  color: var(--color-text-muted);\n}\n.ds-breadcrumb__current {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- page header: title, one line, an action at the right, a heavy rule ---------- */\n.ds-page-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: var(--space-2) 2ch;\n  margin: 0 0 var(--space-3);\n  padding: 0 0 var(--space-2);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-page-header__main {\n  min-width: 0;\n}\n.ds-page-header__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-page-header__text {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- stats ---------- */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  min-width: 0;\n}\n.ds-stat__value {\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-display);\n}\n.ds-stat__label {\n  color: var(--color-text-muted);\n}\n\n/* ---------- prose ---------- */\n.ds-prose {\n  max-width: 78ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-prose h1 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-4);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-3);\n  font-size: var(--text-h3);\n  color: var(--color-heading-alt);\n}\n.ds-prose p {\n  margin: 0 0 var(--space-3);\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: 0 0 var(--space-3);\n  padding: 0 0 0 3ch;\n}\n.ds-prose ul {\n  list-style-type: \"- \";\n  padding-left: 2ch;\n}\n.ds-prose code {\n  padding: 0 0.5ch;\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n}\n.ds-prose strong {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-prose > :first-child {\n  margin-top: 0;\n}\n.ds-prose > :last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- buttons: a word on a block, the primary one filled ---------- */\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:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-button-hover-text);\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border);\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border-strong);\n}\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  border-color: var(--color-border-muted);\n  background: var(--color-disabled);\n  box-shadow: none;\n  color: var(--color-disabled-text);\n  cursor: default;\n}\n\n/* ---------- form ---------- */\n.ds-form {\n  margin: 0;\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: var(--size-label) minmax(0, 1fr);\n  gap: 0 2ch;\n  align-items: start;\n  margin: 0 0 var(--space-2);\n}\n.ds-form__label {\n  padding: var(--space-1) 0;\n  color: var(--color-heading);\n}\n.ds-form__field {\n  min-width: 0;\n}\n.ds-form__input {\n  box-sizing: border-box;\n  width: 100%;\n  max-width: var(--size-field);\n  margin: 0;\n  padding: var(--space-1) 1ch;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  box-shadow: var(--shadow-control);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: var(--line-body);\n  transition: var(--transition);\n}\n.ds-form__input--auto {\n  width: auto;\n}\n.ds-form__input:focus-visible,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-form__input:disabled,\n.ds-form__input.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n}\n.ds-form__input.is-invalid {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  margin: var(--space-1) 0 0;\n  color: var(--color-danger);\n  font-weight: var(--weight-bold);\n}\n.ds-form__hint {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: 1ch;\n  padding: var(--space-1) 0;\n}\n/* A checkbox is one cell: an empty box, or a filled block when set. */\n.ds-form__checkbox {\n  appearance: none;\n  flex: none;\n  box-sizing: border-box;\n  width: 2ch;\n  height: 2ch;\n  margin: 0;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n}\n.ds-form__checkbox:checked {\n  border-style: solid;\n  background: var(--color-input-text);\n}\n.ds-form__checkbox:focus-visible {\n  outline: var(--focus-ring);\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) 2ch;\n  margin: var(--space-3) 0 0;\n  padding-left: calc(var(--size-label) + 2ch);\n}\n\n/* ---------- table: aligned columns under a head line in the bar colours ---------- */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-radius: var(--radius-panel);\n}\n.ds-table th,\n.ds-table td {\n  padding: var(--space-1) 1ch;\n  border-style: var(--border-style);\n  border-color: var(--color-border-muted);\n  border-width: 0 0 var(--border-width);\n  text-align: left;\n  vertical-align: top;\n}\n.ds-table th {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  border-color: var(--color-border);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-bold);\n  text-transform: var(--heading-transform);\n  white-space: nowrap;\n}\n.ds-table td {\n  background: var(--color-surface);\n}\n.ds-table tr.is-alt td,\n.ds-table__row--alt td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  text-align: right;\n  white-space: nowrap;\n}\n.ds-table td.ds-table__code {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-table td.ds-table__date {\n  color: var(--color-text-muted);\n  white-space: nowrap;\n}\n.ds-table__group td {\n  background: var(--color-surface-strong);\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n}\n/* The row under the cursor: inverse video. */\n.ds-table tr.is-selected td {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-table tr.is-selected .ds-table__title {\n  color: var(--color-inverse-text);\n}\n.ds-table tr.is-unread td {\n  font-weight: var(--weight-bold);\n}\n.ds-table__title {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-table__title:visited,\n.ds-table__title.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-table__title:hover,\n.ds-table__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- list ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: grid;\n  grid-template-columns: var(--size-date) minmax(0, 1fr);\n  gap: 0 2ch;\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-list__date {\n  color: var(--color-text-muted);\n  white-space: nowrap;\n}\n.ds-list__main {\n  min-width: 0;\n}\n.ds-list__title {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n}\n.ds-list__title:visited,\n.ds-list__title.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-list__excerpt {\n  margin: 0;\n}\n.ds-list__meta {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- grid: four framed cells on the block fills ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-2) 2ch;\n}\n.ds-grid__cell {\n  min-width: 0;\n  padding: var(--space-2) 2ch var(--space-3);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  background: var(--color-fill-1);\n}\n.ds-grid__cell--2 {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 {\n  background: var(--color-fill-4);\n}\n.ds-grid__label {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-grid__title {\n  margin: 0 0 var(--space-1);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-grid__text {\n  margin: 0;\n}\n\n/* ---------- tabs: words on a rule, the current one in inverse video ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0 1ch;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-tabs__tab {\n  display: block;\n  padding: var(--space-1) 1ch;\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-tabs__tab:focus-visible,\n.ds-tabs__tab.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tabs__tab.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-tabs__body {\n  padding: var(--space-2) 0 var(--space-3);\n}\n\n/* ---------- badge: a count on the accent fill; a tag; a status word in brackets ---------- */\n.ds-prose + .ds-links {\n  margin-top: var(--space-3);\n}\n.ds-badges {\n  margin: 0 0 var(--space-2);\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1) 2ch;\n}\n.ds-badge {\n  display: inline-block;\n  padding: 0 1ch;\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  white-space: nowrap;\n}\n.ds-badge--tag,\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  padding: 0;\n  background: transparent;\n  font-weight: var(--weight-body);\n}\n.ds-badge--tag {\n  color: var(--color-heading-alt);\n}\n.ds-badge--tag::before {\n  content: \"#\";\n}\n.ds-badge--success::before,\n.ds-badge--warning::before,\n.ds-badge--danger::before {\n  content: \"[\";\n}\n.ds-badge--success::after,\n.ds-badge--warning::after,\n.ds-badge--danger::after {\n  content: \"]\";\n}\n.ds-badge--success {\n  color: var(--color-success);\n}\n.ds-badge--warning {\n  color: var(--color-warning);\n}\n.ds-badge--danger {\n  color: var(--color-danger);\n}\n\n/* ---------- sidebar: framed blocks of links ---------- */\n.ds-sidebar {\n  display: grid;\n  gap: var(--space-2);\n  align-content: start;\n  min-width: 0;\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: var(--space-1) 1ch var(--space-2);\n  list-style: none;\n}\n.ds-sidebar__list li {\n  display: flex;\n  justify-content: space-between;\n  gap: 1ch;\n}\n.ds-sidebar__link {\n  flex: 1;\n  min-width: 0;\n  padding: 0 1ch;\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-sidebar__link.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-sidebar__count {\n  flex: none;\n  padding: 0 1ch 0 0;\n  color: var(--color-text-muted);\n}\n\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 5: a monitor: a window list, tiles that share their lines, a rail at the right, a status line ---------- */\n.ds-screen {\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  max-width: var(--size-page);\n  min-height: 100vh;\n  margin: 0 auto;\n  border-radius: var(--radius-page);\n  background: var(--color-canvas);\n}\n.ds-main {\n  flex: 1;\n  min-width: 0;\n  padding: var(--space-3) 2ch var(--space-4);\n}\n\n/* Tiles: every tile has its four lines and overlaps its neighbour by one line,\n   so two tiles share the line between them, whatever the border style. */\n.ds-deck {\n  margin: 0 0 var(--space-3);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-deck:last-child {\n  margin-bottom: 0;\n}\n.ds-tiles {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  padding: 0 var(--border-width) var(--border-width) 0;\n}\n.ds-deck > * + * {\n  margin-top: calc(var(--border-width) * -1);\n}\n.ds-tiles--top {\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n}\n.ds-tiles--work {\n  grid-template-columns: minmax(0, 1fr) var(--size-side);\n}\n.ds-tiles--even {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ds-tiles__col {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n}\n.ds-tiles__col > :last-child {\n  flex: 1;\n}\n.ds-tile,\n.ds-panel,\n.ds-sidebar__block,\n.ds-stat,\n.ds-grid__cell {\n  position: relative;\n  display: block;\n  box-sizing: border-box;\n  min-width: 0;\n  margin: 0 calc(var(--border-width) * -1) calc(var(--border-width) * -1) 0;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: 0;\n  background: var(--fill-panel);\n  box-shadow: none;\n}\n/* A tile's title is a line of its own on the strongest surface, as a pane names itself. */\n.ds-tile__title,\n.ds-panel__title,\n.ds-sidebar__title {\n  display: flex;\n  justify-content: space-between;\n  gap: 0 2ch;\n  margin: 0;\n  padding: 0 1ch;\n  overflow: hidden;\n  background: var(--color-surface-strong);\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  white-space: nowrap;\n}\n.ds-tile__title::before,\n.ds-tile__title::after,\n.ds-panel__title::before,\n.ds-panel__title::after,\n.ds-sidebar__title::before,\n.ds-sidebar__title::after {\n  content: none;\n}\n.ds-tile__aside {\n  color: var(--color-text-muted);\n  font-weight: var(--weight-body);\n  text-transform: none;\n}\n.ds-tile__body,\n.ds-panel__body {\n  padding: var(--space-2) 1ch var(--space-3);\n}\n.ds-tile__body--flush {\n  padding: 0;\n}\n.ds-tile__foot {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-1) 2ch;\n  padding: var(--space-1) 1ch;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n}\n.ds-tile__foot--bare {\n  border-top: 0;\n}\n.ds-tile__foot .ds-pagination {\n  margin: 0;\n}\n\n/* nav: the window list: number, name; the current window in inverse video; the clock at the right */\n.ds-nav {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 0 2ch;\n  padding: 0 2ch;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-nav .ds-brand,\n.ds-nav .ds-brand__name {\n  color: var(--color-bar-alt-text);\n}\n.ds-brand__name {\n  font-size: var(--text-base);\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-2) 1ch;\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n  text-transform: var(--ui-transform);\n}\n.ds-nav__num {\n  font-weight: var(--weight-bold);\n}\n.ds-nav__num::after {\n  content: \":\";\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\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=\"#overview\"],\n.ds-page:has(#overview:target) .ds-nav__link[href=\"#overview\"],\n.ds-page:has(#hosts:target) .ds-nav__link[href=\"#hosts\"],\n.ds-page:has(#alerts:target) .ds-nav__link[href=\"#alerts\"],\n.ds-page:has(#settings:target) .ds-nav__link[href=\"#settings\"] {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-nav__status {\n  margin: 0 0 0 auto;\n}\n\n/* hero: the state of the fleet in one sentence, beside its meters */\n.ds-hero__title {\n  margin: 0 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  margin: 0 0 var(--space-3);\n  font-size: var(--text-large);\n}\n.ds-hero .ds-tile__body {\n  padding: var(--space-3) 2ch;\n}\n/* Rows of a meter screen: a name, a bar of block characters, a figure. */\n.ds-gauges {\n  display: grid;\n  grid-template-columns: max-content minmax(0, 1fr) max-content;\n  gap: 0 1ch;\n  margin: 0;\n  padding: var(--space-3) 2ch;\n  font-family: var(--font-mono);\n}\n.ds-gauges dt {\n  color: var(--color-accent-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-gauges dd {\n  margin: 0;\n  overflow: hidden;\n  white-space: nowrap;\n}\n.ds-gauges dd.ds-gauges__num {\n  color: var(--color-heading);\n  text-align: right;\n}\n.ds-meter__on--danger {\n  color: var(--color-danger);\n}\n\n/* stats: four tiles in a row, a large figure over its label */\n.ds-stats {\n  padding: 0 var(--border-width) var(--border-width) 0;\n}\n.ds-stat {\n  padding: var(--space-2) 2ch var(--space-3);\n}\n.ds-stat__label {\n  display: block;\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-heading);\n  text-transform: var(--heading-transform);\n}\n.ds-stat__value {\n  display: block;\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  text-shadow: var(--shadow-text);\n}\n.ds-stat__note {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* tables are tight: one text line a row, no rules between rows */\n.ds-table th,\n.ds-table td {\n  padding: 0 1ch;\n  border-width: 0;\n}\n.ds-table td.ds-table__bar {\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n/* buttons are one line high: a label on a block */\n.ds-button {\n  padding: 0 1ch;\n}\n.ds-buttons {\n  gap: var(--space-2) 1ch;\n}\n\n/* grid: hosts as tiles on the block fills */\n.ds-grid {\n  gap: 0;\n  padding: 0 var(--border-width) var(--border-width) 0;\n}\n.ds-grid__cell {\n  padding: var(--space-2) 1ch var(--space-3);\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__state {\n  float: right;\n}\n.ds-grid__text {\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n/* the log: lines with a time, read from the bottom */\n.ds-log {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n}\n.ds-log li {\n  display: flex;\n  gap: 1ch;\n}\n.ds-log__time {\n  flex: none;\n  color: var(--color-text-muted);\n}\n\n.ds-sidebar {\n  display: block;\n}\n.ds-sidebar__list {\n  padding: var(--space-2) 0 var(--space-3);\n}\n.ds-tile > .ds-tabs {\n  padding: 0 1ch;\n}\n.ds-tabs {\n  margin: 0 0 var(--space-3);\n}\n.ds-tile .ds-notices {\n  margin: 0;\n}\n.ds-notices {\n  gap: var(--space-2);\n}\n.ds-list__item {\n  padding: var(--space-2) 0;\n}\n.ds-tile .ds-empty {\n  border: 0;\n}\n.ds-dialog__backdrop {\n  height: 100%;\n}\n.ds-keys {\n  display: grid;\n  grid-template-columns: 12ch minmax(0, 1fr);\n  gap: 0 1ch;\n  margin: 0;\n}\n.ds-keys dt {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-keys dd {\n  margin: 0;\n}\n\n/* footer: the status line: the session on the bar fill, key hints, the host at the right */\n.ds-footer {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 0 2ch;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-footer__session {\n  padding: 0 1ch;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-weight: var(--weight-bold);\n  text-shadow: var(--shadow-text);\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__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.ds-footer__text {\n  margin: 0 0 0 auto;\n  padding: 0 2ch 0 0;\n}\n\n/* ---------- narrow windows: one column of tiles, 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__on--danger {\n  color: var(--color-danger);\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-switch {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 2ch;\n  padding: var(--space-1) 0;\n  cursor: pointer;\n}\n.ds-switch__label {\n  min-width: 0;\n}\n.ds-switch__input {\n  position: absolute;\n  appearance: none;\n  margin: 0;\n  opacity: 0;\n}\n.ds-switch__track {\n  flex: none;\n  display: inline-flex;\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-size: var(--text-small);\n  white-space: nowrap;\n}\n.ds-switch__track::before {\n  content: \"on\";\n  padding: 0 1ch;\n}\n.ds-switch__track::after {\n  content: \"off\";\n  padding: 0 1ch;\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n}\n.ds-switch__input:checked + .ds-switch__track::before {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-weight: var(--weight-bold);\n}\n.ds-switch__input:checked + .ds-switch__track::after {\n  background: transparent;\n  color: inherit;\n  font-weight: var(--weight-body);\n}\n.ds-switch__input:focus-visible + .ds-switch__track {\n  outline: var(--focus-ring);\n}\n\n.ds-accordion {\n  margin: 0;\n}\n.ds-accordion__item {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__item:last-child {\n  border-bottom: 0;\n}\n.ds-accordion__title {\n  display: block;\n  padding: var(--space-1) 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__title::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__title::before {\n  content: \"[+] \";\n  color: var(--color-accent-alt);\n}\n.ds-accordion__item[open] > .ds-accordion__title::before {\n  content: \"[-] \";\n}\n.ds-accordion__title:hover,\n.ds-accordion__title.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-accordion__title:focus-visible,\n.ds-accordion__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  margin: 0;\n  padding: 0 0 var(--space-2) 4ch;\n}\n.ds-accordion__body p {\n  margin: 0 0 var(--space-1);\n}\n.ds-accordion__body code {\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n}\n\n.ds-form__field .ds-switch {\n  justify-content: flex-start;\n}\n\n@media (max-width: 900px) {\n  .ds-page-header {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-stats,\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-form__label {\n    padding: 0;\n  }\n  .ds-form__actions {\n    padding-left: 0;\n  }\n  .ds-table__extra {\n    display: none;\n  }\n  .ds-dialog__backdrop {\n    padding: var(--space-3) 1ch;\n  }\n  .ds-button {\n    white-space: normal;\n  }\n  .ds-table td.ds-table__code {\n    white-space: normal;\n    overflow-wrap: anywhere;\n  }\n\n  .ds-main {\n    padding: var(--space-3) 1ch;\n  }\n  .ds-nav {\n    padding: 0 1ch;\n  }\n  .ds-nav__status {\n    display: none;\n  }\n  .ds-tiles--top,\n  .ds-tiles--work,\n  .ds-tiles--even {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-list__item {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-footer__text {\n    margin: 0;\n    padding: 0 1ch;\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-between;\n    min-width: 0;\n    overflow-x: auto;\n  }\n  .ds-nav__list li {\n    flex: none;\n  }\n  .ds-nav__link {\n    padding-right: 0.5ch;\n    padding-left: 0.5ch;\n  }\n  .ds-gauges .ds-meter {\n    font-size: min(var(--text-small), 1.7vw);\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 monitor: twelve hosts on one screen. Terminal, 2015 to 2026: specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n<div class=\"ds-screen\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#overview\"><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=\"#overview\"><span class=\"ds-nav__num\">0</span>overview</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#hosts\"><span class=\"ds-nav__num\">1</span>hosts</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#alerts\"><span class=\"ds-nav__num\">2</span>alerts</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#settings\"><span class=\"ds-nav__num\">3</span>settings</a></li>\n  </ul>\n  <p class=\"ds-nav__status\">refresh 5 s | 14:02:07</p>\n</header>\n\n<main class=\"ds-main\">\n\n<!-- View 1, the overview: the state of the fleet, its meters, four figures, the busiest hosts, groups and the log. -->\n<section class=\"ds-view ds-view--home\" id=\"overview\">\n  <div class=\"ds-deck\">\n    <div class=\"ds-tiles ds-tiles--top\">\n      <section class=\"ds-tile ds-hero\" data-component=\"hero\">\n        <h2 class=\"ds-tile__title\">fleet <span class=\"ds-tile__aside\">12 hosts, 3 groups</span></h2>\n        <div class=\"ds-tile__body\">\n          <h1 class=\"ds-hero__title\">11 of 12 hosts answer; db-03 is out of disk.</h1>\n          <p class=\"ds-hero__lead\">One alert is firing and one is acknowledged. Everything else has been quiet for six days.</p>\n          <div class=\"ds-buttons\">\n            <a class=\"ds-button\" href=\"#alerts\">open the alert</a>\n            <a class=\"ds-button ds-button--secondary\" href=\"#hosts\">all hosts</a>\n          </div>\n        </div>\n      </section>\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">fleet average <span class=\"ds-tile__aside\">last 5 min</span></h2>\n        <dl class=\"ds-gauges\">\n          <dt>cpu</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||||||||</span>..........................................</span></dd><dd class=\"ds-gauges__num\">24.1%</dd>\n          <dt>mem</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||||||||||||||||||||||||||||</span>.........................</span></dd><dd class=\"ds-gauges__num\">55.8%</dd>\n          <dt>swp</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on\">||</span>......................................................</span></dd><dd class=\"ds-gauges__num\">3.0%</dd>\n          <dt>dsk</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--warning\">||||||||||||||||||||||||||||||||||||||||||</span>..............</span></dd><dd class=\"ds-gauges__num\">74.6%</dd>\n          <dt>net</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||||</span>..............................................</span></dd><dd class=\"ds-gauges__num\">182 Mb/s</dd>\n          <dt>err</dt><dd><span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--danger\">|</span>.......................................................</span></dd><dd class=\"ds-gauges__num\">0.4%</dd>\n        </dl>\n      </section>\n    </div>\n    <ul class=\"ds-stats\" data-component=\"stats\">\n      <li class=\"ds-stat\"><span class=\"ds-stat__label\">load, 1 min</span><span class=\"ds-stat__value\">0.42</span><span class=\"ds-stat__note\">0.38 an hour ago</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__label\">requests</span><span class=\"ds-stat__value\">1,284/s</span><span class=\"ds-stat__note\">peak today 2,910/s</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__label\"><span class=\"ds-tooltip\" tabindex=\"0\">slowest 5%<span class=\"ds-tooltip__tip\" role=\"tooltip\">The slowest twentieth of requests in the last five minutes.</span></span></span><span class=\"ds-stat__value\">212 ms</span><span class=\"ds-stat__note\">limit 400 ms</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__label\">uptime, 30 d</span><span class=\"ds-stat__value\">99.94%</span><span class=\"ds-stat__note\">26 min down</span></li>\n    </ul>\n    <div class=\"ds-tiles ds-tiles--work\">\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">busiest hosts <span class=\"ds-tile__aside\">sorted by cpu</span></h2>\n        <div class=\"ds-tile__body ds-tile__body--flush\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>host</th><th>state</th><th class=\"ds-table__num\">cpu%</th><th class=\"ds-table__extra\">cpu</th><th class=\"ds-table__num\">mem%</th><th class=\"ds-table__num\">load</th><th class=\"ds-table__num ds-table__extra\">up</th></tr>\n            </thead>\n            <tbody>\n              <tr class=\"is-selected\"><td class=\"ds-table__code\">web-02</td><td>ok</td><td class=\"ds-table__num\">71.3</td><td class=\"ds-table__extra ds-table__bar\">||||||||||||||......</td><td class=\"ds-table__num\">48.0</td><td class=\"ds-table__num\">2.14</td><td class=\"ds-table__num ds-table__extra\">41 d</td></tr>\n              <tr><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">web-01</a></td><td><span class=\"ds-badge ds-badge--success\">ok</span></td><td class=\"ds-table__num\">64.9</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||||||||||</span>.......</span></td><td class=\"ds-table__num\">51.2</td><td class=\"ds-table__num\">1.87</td><td class=\"ds-table__num ds-table__extra\">41 d</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">db-01</a></td><td><span class=\"ds-badge ds-badge--success\">ok</span></td><td class=\"ds-table__num\">38.2</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||</span>............</span></td><td class=\"ds-table__num\">82.5</td><td class=\"ds-table__num\">1.02</td><td class=\"ds-table__num ds-table__extra\">112 d</td></tr>\n              <tr><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">queue-01</a></td><td><span class=\"ds-badge ds-badge--warning\">slow</span></td><td class=\"ds-table__num\">31.0</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--warning\">||||||</span>..............</span></td><td class=\"ds-table__num\">67.4</td><td class=\"ds-table__num\">0.96</td><td class=\"ds-table__num ds-table__extra\">9 d</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">db-02</a></td><td><span class=\"ds-badge ds-badge--success\">ok</span></td><td class=\"ds-table__num\">22.7</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||</span>...............</span></td><td class=\"ds-table__num\">79.1</td><td class=\"ds-table__num\">0.61</td><td class=\"ds-table__num ds-table__extra\">112 d</td></tr>\n              <tr><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">cache-01</a></td><td><span class=\"ds-badge ds-badge--success\">ok</span></td><td class=\"ds-table__num\">12.4</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on\">||</span>..................</span></td><td class=\"ds-table__num\">90.3</td><td class=\"ds-table__num\">0.30</td><td class=\"ds-table__num ds-table__extra\">63 d</td></tr>\n              <tr class=\"is-alt\"><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#hosts\">mail-01</a></td><td><span class=\"ds-badge ds-badge--success\">ok</span></td><td class=\"ds-table__num\">4.8</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\"><span class=\"ds-meter__on\">|</span>...................</span></td><td class=\"ds-table__num\">33.6</td><td class=\"ds-table__num\">0.08</td><td class=\"ds-table__num ds-table__extra\">201 d</td></tr>\n              <tr><td class=\"ds-table__code\"><a class=\"ds-table__title\" href=\"#alerts\">db-03</a></td><td><span class=\"ds-badge ds-badge--danger\">down</span></td><td class=\"ds-table__num\">0.0</td><td class=\"ds-table__extra ds-table__bar\"><span class=\"ds-meter\">....................</span></td><td class=\"ds-table__num\">0.0</td><td class=\"ds-table__num\">0.00</td><td class=\"ds-table__num ds-table__extra\">0 d</td></tr>\n            </tbody>\n          </table>\n        </div>\n        <div class=\"ds-tile__foot\">\n          <span>8 of 12 hosts</span>\n          <a class=\"ds-link ds-link--bracket\" href=\"#hosts\">all hosts</a>\n        </div>\n      </section>\n      <div class=\"ds-tiles__col\">\n        <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">groups</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li><a class=\"ds-sidebar__link is-current\" href=\"#overview\">all hosts</a><span class=\"ds-sidebar__count\">12</span></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#hosts\">web</a><span class=\"ds-sidebar__count\">4</span></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#hosts\">data</a><span class=\"ds-sidebar__count\">5</span></li>\n              <li><a class=\"ds-sidebar__link\" href=\"#hosts\">mail and queue</a><span class=\"ds-sidebar__count\">3</span></li>\n            </ul>\n          </div>\n        </aside>\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <h2 class=\"ds-panel__title\">log</h2>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-log\">\n              <li><span class=\"ds-log__time\">14:01</span> <span>db-03 does not answer</span></li>\n              <li><span class=\"ds-log__time\">13:58</span> <span>db-03 disk at 100%</span></li>\n              <li><span class=\"ds-log__time\">13:40</span> <span>queue-01 slow, 9 s behind</span></li>\n              <li><span class=\"ds-log__time\">11:15</span> <span>web-02 restarted by deploy</span></li>\n              <li><span class=\"ds-log__time\">09:00</span> <span>daily report sent</span></li>\n            </ul>\n            <p class=\"ds-progress\"><span class=\"ds-progress__label\">db-03 disk</span><span class=\"ds-progress__bar\"><span class=\"ds-progress__on ds-progress__on--danger\">##########</span></span><span class=\"ds-progress__value\">100%</span></p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<!-- View 2, the hosts: every host as a tile, by state. -->\n<section class=\"ds-view\" id=\"hosts\">\n  <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n    <li><a class=\"ds-breadcrumb__link\" href=\"#overview\">fleet</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li><a class=\"ds-breadcrumb__link\" href=\"#hosts\">hosts</a></li>\n    <li class=\"ds-breadcrumb__sep\">/</li>\n    <li class=\"ds-breadcrumb__current\">all groups</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\">hosts</h1>\n      <p class=\"ds-page-header__text\">Twelve hosts in three groups, asked every five seconds.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#settings\">add a host</a></div>\n  </header>\n  <ul class=\"ds-tabs\" data-component=\"tabs\">\n    <li><span class=\"ds-tabs__tab is-current\">all 12</span></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#hosts\">ok 10</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#hosts\">slow 1</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#hosts\">down 1</a></li>\n    <li><a class=\"ds-tabs__tab\" href=\"#hosts\">paused 0</a></li>\n  </ul>\n  <div class=\"ds-deck\">\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <div class=\"ds-grid__cell\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">web</p><h3 class=\"ds-grid__title\">web-01</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||||</span>......</span> 64.9%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||</span>........</span> 51.2%</p></div>\n      <div class=\"ds-grid__cell\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">web</p><h3 class=\"ds-grid__title\">web-02</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||||||||</span>.....</span> 71.3%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||||</span>.........</span> 48.0%</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--2\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">data</p><h3 class=\"ds-grid__title\">db-01</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||</span>..........</span> 38.2%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--warning\">|||||||||||||</span>...</span> 82.5%</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--2\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">data</p><h3 class=\"ds-grid__title\">db-02</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||</span>............</span> 22.7%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||||||||</span>....</span> 79.1%</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--2\"><span class=\"ds-grid__state ds-badge ds-badge--danger\">down</span><p class=\"ds-grid__label\">data</p><h3 class=\"ds-grid__title\">db-03</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\">................</span> no answer</p><p class=\"ds-grid__text\">dsk <span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--danger\">||||||||||||||||</span></span> 100%</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--2\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">data</p><h3 class=\"ds-grid__title\">cache-01</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">||</span>..............</span> 12.4%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--warning\">||||||||||||||</span>..</span> 90.3%</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--3\"><span class=\"ds-grid__state ds-badge ds-badge--warning\">slow</span><p class=\"ds-grid__label\">mail and queue</p><h3 class=\"ds-grid__title\">queue-01</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">|||||</span>...........</span> 31.0%</p><p class=\"ds-grid__text\">lag <span class=\"ds-meter\"><span class=\"ds-meter__on ds-meter__on--warning\">|||||||</span>.........</span> 9 s</p></div>\n      <div class=\"ds-grid__cell ds-grid__cell--4\"><span class=\"ds-grid__state ds-badge ds-badge--success\">ok</span><p class=\"ds-grid__label\">mail and queue</p><h3 class=\"ds-grid__title\">mail-01</h3><p class=\"ds-grid__text\">cpu <span class=\"ds-meter\"><span class=\"ds-meter__on\">|</span>...............</span> 4.8%</p><p class=\"ds-grid__text\">mem <span class=\"ds-meter\"><span class=\"ds-meter__on\">||||||</span>..........</span> 33.6%</p></div>\n    </div>\n    <div class=\"ds-tiles\">\n      <div class=\"ds-tile\">\n        <div class=\"ds-tile__foot ds-tile__foot--bare\">\n          <span>hosts 1 to 8 of 12</span>\n          <ul class=\"ds-pagination\" data-component=\"pagination\">\n            <li><span class=\"ds-pagination__link is-disabled\">&lt; prev</span></li>\n            <li><span class=\"ds-pagination__link is-current\">1</span></li>\n            <li><a class=\"ds-pagination__link\" href=\"#hosts\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#hosts\">next &gt;</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n    <div class=\"ds-tiles ds-tiles--even\">\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">paused <span class=\"ds-tile__aside\">0 hosts</span></h2>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <p class=\"ds-empty__text\">No host is paused. A paused host is still asked, but raises no alert.</p>\n          <a class=\"ds-button ds-button--secondary\" href=\"#settings\">pause a host</a>\n        </div>\n      </section>\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">legend</h2>\n        <div class=\"ds-tile__body\">\n          <div class=\"ds-badges\" data-component=\"badge\">\n            <span class=\"ds-badge ds-badge--success\">ok</span>\n            <span class=\"ds-badge ds-badge--warning\">slow</span>\n            <span class=\"ds-badge ds-badge--danger\">down</span>\n            <span class=\"ds-badge ds-badge--tag\">data</span>\n            <span class=\"ds-badge\">2</span>\n          </div>\n          <dl class=\"ds-keys\">\n            <dt>ok</dt><dd>answered the last three questions in time.</dd>\n            <dt>slow</dt><dd>answered, but over a limit you set.</dd>\n            <dt>down</dt><dd>no answer for 15 seconds.</dd>\n            <dt>#group</dt><dd>the group a host belongs to; a count is its open alerts.</dd>\n          </dl>\n        </div>\n      </section>\n    </div>\n  </div>\n</section>\n\n<!-- View 3, the alerts: what is firing, and the runbook of the alert under the cursor. -->\n<section class=\"ds-view\" id=\"alerts\">\n  <header class=\"ds-page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">alerts</h1>\n      <p class=\"ds-page-header__text\">One firing, one acknowledged, none silenced.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#settings\">change limits</a></div>\n  </header>\n  <div class=\"ds-notices\" data-component=\"notice\">\n    <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Firing:</span> db-03 has not answered since 14:01. Its last report showed the disk at 100%.</p>\n    <p class=\"ds-notice\"><span class=\"ds-notice__title\">Acknowledged:</span> queue-01 is 9 seconds behind. <code>ops</code> took it at 13:44.</p>\n  </div>\n  <div class=\"ds-deck\">\n    <div class=\"ds-tiles ds-tiles--even\">\n      <div class=\"ds-tiles__col\">\n        <section class=\"ds-tile\">\n          <h2 class=\"ds-tile__title\">today <span class=\"ds-tile__aside\">4 alerts</span></h2>\n          <div class=\"ds-tile__body\">\n            <ul class=\"ds-list\" data-component=\"list\">\n              <li class=\"ds-list__item\">\n                <span class=\"ds-list__date\">14:01</span>\n                <div class=\"ds-list__main\">\n                  <a class=\"ds-list__title\" href=\"#alerts\">db-03 does not answer</a>\n                  <p class=\"ds-list__excerpt\">No answer to five questions in a row.</p>\n                  <p class=\"ds-list__meta\"><span class=\"ds-badge ds-badge--danger\">firing</span> for 1 min, group data</p>\n                </div>\n              </li>\n              <li class=\"ds-list__item\">\n                <span class=\"ds-list__date\">13:58</span>\n                <div class=\"ds-list__main\">\n                  <a class=\"ds-list__title\" href=\"#alerts\">db-03 disk nearly full</a>\n                  <p class=\"ds-list__excerpt\">/var at 100%, limit 90%.</p>\n                  <p class=\"ds-list__meta\"><span class=\"ds-badge ds-badge--danger\">firing</span> for 4 min, group data</p>\n                </div>\n              </li>\n              <li class=\"ds-list__item\">\n                <span class=\"ds-list__date\">13:40</span>\n                <div class=\"ds-list__main\">\n                  <a class=\"ds-list__title is-visited\" href=\"#alerts\">queue-01 is behind</a>\n                  <p class=\"ds-list__excerpt\">Oldest job waits 9 s, limit 5 s.</p>\n                  <p class=\"ds-list__meta\"><span class=\"ds-badge ds-badge--warning\">acknowledged</span> by ops at 13:44</p>\n                </div>\n              </li>\n              <li class=\"ds-list__item\">\n                <span class=\"ds-list__date\">11:15</span>\n                <div class=\"ds-list__main\">\n                  <a class=\"ds-list__title is-visited\" href=\"#alerts\">web-02 restarted</a>\n                  <p class=\"ds-list__excerpt\">Back after 40 s; a deploy was running.</p>\n                  <p class=\"ds-list__meta\"><span class=\"ds-badge ds-badge--success\">closed</span> at 11:16 by itself</p>\n                </div>\n              </li>\n            </ul>\n          </div>\n        </section>\n      </div>\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">runbook <span class=\"ds-tile__aside\">disk nearly full</span></h2>\n        <div class=\"ds-tile__body\">\n          <article class=\"ds-prose\" data-component=\"typography\">\n            <h1>Disk nearly full</h1>\n            <p>A data host that runs out of disk stops writing and then stops answering. <strong>Free space first</strong>, find the cause after.</p>\n            <h2>Free space</h2>\n            <ul>\n              <li>Remove rotated logs older than a week in <code>/var/log</code>.</li>\n              <li>Drop the oldest local dump; a copy is on the backup host.</li>\n            </ul>\n            <div class=\"ds-accordion\">\n            <details class=\"ds-accordion__item\" open>\n            <summary class=\"ds-accordion__title\">If the disk fills again</summary>\n            <div class=\"ds-accordion__body\">\n            <p>Lower the days of logs kept, then ask whether the dump can move.</p>\n            </div>\n            </details>\n            <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__title\">Who to tell</summary>\n            <div class=\"ds-accordion__body\">\n            <p>Whoever acknowledged the alert; the name is on its line.</p>\n            </div>\n            </details>\n            </div>\n            <h3>Check it worked</h3>\n            <p>Run <code>df -h /var</code>. The alert closes by itself under 90%.</p>\n          </article>\n          <ul class=\"ds-links\" data-component=\"links\">\n            <li><a class=\"ds-link\" href=\"#alerts\">full runbook</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#alerts\">last time, 12 March</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#hosts\">db-03</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#settings\">its limits</a></li>\n          </ul>\n        </div>\n      </section>\n    </div>\n  </div>\n</section>\n\n<!-- View 4, the settings of one host: its limits, the buttons, the question before removing it. -->\n<section class=\"ds-view\" id=\"settings\">\n  <header class=\"ds-page-header\">\n    <div class=\"ds-page-header__main\">\n      <h1 class=\"ds-page-header__title\">settings: db-03</h1>\n      <p class=\"ds-page-header__text\">How often the host is asked, and when it raises an alert.</p>\n    </div>\n    <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#hosts\">back to hosts</a></div>\n  </header>\n  <div class=\"ds-deck\">\n    <div class=\"ds-tiles ds-tiles--work\">\n      <section class=\"ds-tile\">\n        <h2 class=\"ds-tile__title\">host</h2>\n        <div class=\"ds-tile__body\">\n          <form class=\"ds-form\" data-component=\"form\" action=\"#settings\">\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__label\" for=\"f-name\">name:</label>\n              <div class=\"ds-form__field\">\n                <input class=\"ds-form__input\" id=\"f-name\" type=\"text\" value=\"db-03\">\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__label\" for=\"f-addr\">address:</label>\n              <div class=\"ds-form__field\">\n                <input class=\"ds-form__input is-invalid\" id=\"f-addr\" type=\"text\" value=\"10.0.4.300\">\n                <p class=\"ds-form__error\">error: 300 is not a part of an address.</p>\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__label\" for=\"f-every\">ask every:</label>\n              <div class=\"ds-form__field\">\n                <select class=\"ds-form__input ds-form__input--auto\" id=\"f-every\"><option>5 seconds</option><option>30 seconds</option><option>1 minute</option></select>\n                <p class=\"ds-form__hint\">Down means no answer to three questions in a row.</p>\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__label\" for=\"f-note\">note:</label>\n              <div class=\"ds-form__field\">\n                <textarea class=\"ds-form__input\" id=\"f-note\" rows=\"3\">Replica of db-01. Dumps to /var/dump every night.</textarea>\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <span class=\"ds-form__label\">alerts:</span>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> raise an alert when the disk passes 90%</label>\n                <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\"> pause this host</label>\n                <label class=\"ds-switch\"><span class=\"ds-switch__label\">send the daily report</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\">save</button>\n              <button class=\"ds-button ds-button--secondary is-hover\" type=\"button\">ask now</button>\n              <button class=\"ds-button ds-button--danger\" type=\"button\">remove host</button>\n              <button class=\"ds-button\" type=\"button\" disabled>restore</button>\n            </div>\n          </form>\n        </div>\n      </section>\n      <div class=\"ds-tiles__col\">\n        <section class=\"ds-tile\">\n          <h2 class=\"ds-tile__title\">confirm</h2>\n          <div class=\"ds-dialog__backdrop\">\n            <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-1\">\n              <h2 class=\"ds-dialog__title\" id=\"dlg-1\">remove db-03?</h2>\n              <div class=\"ds-dialog__body\">\n                <p class=\"ds-dialog__text\">Its 112 days of figures are deleted with it. Pausing keeps them.</p>\n                <div class=\"ds-dialog__actions\">\n                  <button class=\"ds-button ds-button--danger\" type=\"button\">remove</button>\n                  <button class=\"ds-button ds-button--secondary\" type=\"button\">cancel</button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </section>\n        <div class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">what is kept</h2>\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__text\">One line per answer for a day, one per minute for a month, one per hour after that.</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n</main>\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <span class=\"ds-footer__session\">chronoskin monitor</span>\n  <ul class=\"ds-footer__keys\">\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">0</span> <a class=\"ds-footer__link\" href=\"#overview\">overview</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">1</span> <a class=\"ds-footer__link\" href=\"#hosts\">hosts</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">2</span> <a class=\"ds-footer__link\" href=\"#alerts\">alerts</a></li>\n    <li class=\"ds-key\"><span class=\"ds-key__cap\">3</span> <a class=\"ds-footer__link\" href=\"#settings\">settings</a></li>\n  </ul>\n  <p class=\"ds-footer__text\">chronoskin 2.4 on ops-01 | 7 Oct 2026</p>\n</footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.terminal.app.s05.p02.t06.u02\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"terminal\",\n    \"years\": [\n      2015,\n      2026\n    ]\n  },\n  \"archetype\": \"app\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1280,\n    \"fluid\": false,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-tm-5262\",\n  \"short\": \"v1-tm-5262\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #efe6c8;\n  --color-canvas: #fbf5dc;\n  --color-surface: #fbf5dc;\n  --color-surface-alt: #f1e9c9;\n  --color-surface-strong: #e4d9b0;\n  --color-bar: #3b2a1a;\n  --color-bar-text: #fbf5dc;\n  --color-bar-alt: #e4d9b0;\n  --color-bar-alt-text: #3b2a1a;\n  --color-inverse: #3b2a1a;\n  --color-inverse-text: #fbf5dc;\n  --color-text: #3b2a1a;\n  --color-text-muted: #7a6748;\n  --color-heading: #1f140a;\n  --color-heading-alt: #9a4a00;\n  --color-link: #a64b00;\n  --color-link-quiet: #3b2a1a;\n  --color-link-visited: #6b4a6e;\n  --color-link-hover: #1f140a;\n  --color-link-active: #c2410c;\n  --color-border: #8c7a58;\n  --color-border-strong: #3b2a1a;\n  --color-border-muted: #cfc39c;\n  --color-accent: #c2410c;\n  --color-accent-text: #fffbdc;\n  --color-accent-alt: #1a6fb0;\n  --color-fill-1: #fbf5dc;\n  --color-fill-2: #f1e9c9;\n  --color-fill-3: #e4d9b0;\n  --color-fill-4: #f1e9c9;\n  --color-button: #3b2a1a;\n  --color-button-text: #fbf5dc;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #f1e9c9;\n  --color-button-secondary-text: #3b2a1a;\n  --color-input: #fffdf0;\n  --color-input-text: #1f140a;\n  --color-input-border: #8c7a58;\n  --color-disabled: #e4d9b0;\n  --color-disabled-text: #9c8c6a;\n  --color-danger: #b3123f;\n  --color-danger-surface: #f8e1d4;\n  --color-success: #3d7a1c;\n  --color-warning: #a86400;\n  --color-notice: #f1e9c9;\n  --color-notice-text: #3b2a1a;\n  --color-focus: #c2410c;\n  --color-shadow: #8c7a58;\n  --color-overlay: #e4d9b0;\n}\n\n/* @part type */\n:root {\n  --font-body: \"Fira Mono\", \"Ubuntu Mono\", \"PT Mono\", \"Courier New\", monospace;\n  --font-heading: \"Fira Mono\", \"Ubuntu Mono\", \"PT Mono\", \"Courier New\", monospace;\n  --font-ui: \"Fira Mono\", \"Ubuntu Mono\", \"PT Mono\", \"Courier New\", monospace;\n  --font-mono: \"Fira Mono\", \"Ubuntu Mono\", \"PT Mono\", \"Courier New\", monospace;\n  --text-base: 17px;\n  --text-small: 15px;\n  --text-ui: 17px;\n  --text-large: 19px;\n  --text-display: 36px;\n  --text-h1: 24px;\n  --text-h2: 19px;\n  --text-h3: 17px;\n  --line-body: 1.3;\n  --line-heading: 1.2;\n  --line-display: 1;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 400;\n  --weight-display: 400;\n  --weight-ui: 400;\n  --heading-transform: uppercase;\n  --heading-tracking: 0.08em;\n  --display-tracking: 0.12em;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 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"
  }
}
