{
  "id": "v1-w9-7348",
  "long_id": "v1.windows-9x.forum.s07.p03.t04.u08",
  "name": "Desktop grey chat and message boards, canary, 1998",
  "era": {
    "slug": "windows-9x",
    "code": "w9",
    "name": "Desktop grey",
    "years": [
      1995,
      2001
    ],
    "description": "Web pages dressed as the desktop of 1995 to 2001: silver-grey windows with a navy title bar, raised and sunken bevels on every button and field, a small pixel-sized sans, and dialogs, tabs and tree lists borrowed from the operating system."
  },
  "archetype": "forum",
  "mode": "mix",
  "viewport": {
    "width": 800,
    "fluid": false
  },
  "summary": "A community site laid out as the chat program of a late 1990s desktop: one window with a switch bar of window keys under the title bar, the open board or conversation at the left and the list of who is here in a rail at the right, closed by a status bar. This pack shows it in a canary scheme taken from the download sites of the time: pale yellow windows on a blue striped desktop, black title bars with yellow lettering, red selection and headings, every edge a flat black line with a second line inside it, and rounded hand-drawn headings over a 12px system sans. Support boards, hobby communities and web chat rooms took this form between 1996 and 2001, when visitors already knew a chat program and a newsgroup reader and a site could borrow both.",
  "url": "https://chrono.skin/s/v1-w9-7348",
  "preview_url": "https://chrono.skin/s/v1-w9-7348/specimen.html",
  "files": {
    "STYLE.md": "# Desktop grey chat and message boards, canary, 1998\n\n## Summary\n\nA community site laid out as the chat program of a late 1990s desktop: one window with a switch bar of window keys under the title bar, the open board or conversation at the left and the list of who is here in a rail at the right, closed by a status bar. This pack shows it in a canary scheme taken from the download sites of the time: pale yellow windows on a blue striped desktop, black title bars with yellow lettering, red selection and headings, every edge a flat black line with a second line inside it, and rounded hand-drawn headings over a 12px system sans. Support boards, hobby communities and web chat rooms took this form between 1996 and 2001, when visitors already knew a chat program and a newsgroup reader and a site could borrow both.\n\n## Layout\n\n- Fixed, not fluid: `--size-page` is 768px, one window (`.ds-page__window`, also a `.ds-window`) centred on the desktop of an 800px screen with a `--space-6` margin above and below.\n- The specimen is one example site, the boards, of five views. `.ds-nav` (title bar and switch bar), the rail and `.ds-footer` (status bar) are written once, inside the window and outside the views; each view is a `.ds-view` and one shows at a time.\n- Under the switch bar comes `.ds-page__columns`: `.ds-page__main` at the left, which holds the views, and `.ds-page__rail` at the right (`--size-rail`, 168px), `--space-2` apart and stretched to the same height. The rail is the only side column and it is at the right: a caption strip, the `.ds-nicks` list of names, which takes the spare height, and the `.ds-sidebar` block of links at its foot.\n- Every view is a `.ds-stack`, a column of blocks `--space-4` apart.\n- Home view (the lobby): the `.ds-hero` (a well with a band in the selection colours at its left, the title, a lead, one line and two keys), the `.ds-stat` line of four read-outs, the `.ds-grid` of six boards, two to a row, and a `.ds-split` of two `.ds-panel`s: the latest messages as a `.ds-list` and the house rules.\n- Inner pages keep the title bar, the switch bar, the rail and the status bar and drop the hero, the read-outs and the boards. They open with the `.ds-breadcrumb` (small links), then the `.ds-page-header`: title and one line at the left, one key at the right, closed by a thick rule in the accent colour. Tabs come straight after the page header, with their `.ds-sheet`.\n- Views: `home` is the lobby. `board` is one board: page header, four tabs over a sheet with the list view of topics (status labels, a selected row, a total row), then the pagination keys beside the key of status labels. `topic` is a conversation: `.ds-posts` with the name of the writer in a column at the left of each message, a line the program says itself, and the Say line under it. `write` is the form for a new message under two notices, with the confirmation dialog beside a panel of advice. `members` is a member's card beside the empty state of the private messages, over the list view of members. The key of the view that is showing stays pressed and bold; the Lobby key is marked when the address names no view.\n- Fixed sizes: `--size-nick` 96px name column of a message; `--size-ctl` 16px caption button and `--size-glyph` 8px glyph and lamp; `--size-icon` 32px and `--size-icon-small` 16px icons; `--size-check` 13px check box and radio button; `--size-label` 96px form label column; `--size-field` 200px text field; `--size-dialog` 316px; `--size-button` 75px least key width; `--size-block` 8px progress block.\n- Spacing scale: `--space-0` 1px is the hairline step (row padding in the list of names); `--space-1` 2px the gap between keys and the padding of bars; `--space-2` 4px the padding of keys, the gap between an icon and its word, between boards and between the working pane and the rail; `--space-3` 6px cell and field padding and the gap between keys in a row; `--space-4` 8px the gap between blocks and the padding of panels; `--space-5` 12px the padding of the hero, sheets and dialogs; `--space-6` 16px the margin of the desktop round 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- Two families and a monospace: `--font-body` and `--font-ui` are a wide humanist sans (Lucida Sans Unicode, then Lucida Grande, Geneva); `--font-heading` is Arial Black at weight 900 for the folder banner, page titles, the brand and the read-outs; `--font-mono` is Lucida Console. The references set their text in Arial and Verdana at 10px to 13px with titles in a black weight; the stacks here are the nearest faces that shipped with the desktops of the time.\n- Sizes: `--text-base` and `--text-ui` 11px for everything; `--text-small` 10px for counts and dates; `--text-large` 12px for a lead line; `--text-h2` 12px and `--text-h3` 11px for headings; `--text-h1` 15px for a page title and a read-out; `--text-display` 20px for the folder banner only. Line height 1.45 in text, 1.25 in keys and bars. Bold is 700, headings 900; keys are regular weight. No transform and no tracking. Links in text are underlined; quiet links are not.\n- Colour: blue-grey `--color-canvas` windows on a dark storm blue `--color-page`, white wells, a slate title bar and slate selection, a mid grey-blue `--color-inverse` for the banner and the rail, ink blue links with violet visited and brick active, near-black blue text. Block colours are pale blue, sea green, lavender and straw. Status colours are deep green, ochre and dark red, all legible on white.\n- Surface: nothing is bevelled. A raised part is one hairline of `--color-border` with a 2px pale edge inside its top and left; a sunken part is the same hairline with a 2px grey shade inside its top and left; a window is a hairline of `--color-border-strong`, and a dialog adds a hard 2px shadow. `--border-width-strong` is 2px. Thin lines (`--border-style`) are dotted: group boxes, rules, the frame of notices and badges, the extra line of the default button. The desktop and the inverse fill carry thin slanting rain lines; the title bar runs from a near-black mix of `--color-bar` at the left to `--color-bar` at the right. A key under the pointer turns paler (`--fill-button-hover`) and its label takes `--color-button-hover-text`.\n- The era's rule for which text sits on which fill, the same in every layout of the era and to be kept by every token set:\n  - The desktop (`--fill-page` over `--color-page`) is always dark enough to carry `--color-bar-text`. Text written straight on the desktop (icon labels, small print) uses `--color-bar-text`.\n  - The window face is `--color-canvas`; raised parts inside a window (sheets, notes, dialogs) are `--fill-panel`. Both carry `--color-text`, `--color-text-muted`, `--color-heading`, `--color-heading-alt` and the link colours.\n  - A sunken well (list view, tree, document, read-out, empty list) is `--color-surface` and carries the same text and link tokens as the window face, so every palette keeps text and links legible on both. `--color-surface-alt` is the alternate row and the fill of inline code and of a pressed toolbar key; `--color-surface-strong` is a group or total row. They carry `--color-text`.\n  - A title bar is `--fill-bar` with `--color-bar-text`; the title bar of a window without the focus is `--fill-inverse` with `--color-inverse-text`.\n  - Menu bar, toolbar and column heads are `--fill-bar-alt` with `--color-bar-alt-text`.\n  - The selection (current tree row, selected table row, open menu, selected list-box row, progress blocks, the plain badge) is `--fill-accent` with `--color-accent-text`. Links and icons inside a selection inherit that colour.\n  - Keys are `--fill-button` with `--color-button-text` (`--color-button-hover-text` under the pointer); the lesser key is `--fill-button-secondary` with `--color-button-secondary-text`; a disabled key is `--color-disabled` with `--color-disabled-text`. The destructive key is `--fill-button` with a bold label in `--color-danger`.\n  - Fields and the path field are `--fill-input` with `--color-input-text`; links inside the path field use the link tokens, so a palette keeps `--color-input` close to `--color-surface`. `--color-input-border` outlines the check box.\n  - `--color-fill-1` to `--color-fill-4` carry `--color-text` (icons drawn on them) and, in the help layout, `--color-link`.\n  - Notices are `--color-notice` with `--color-notice-text` inside a line of `--color-border-strong`; the error notice is `--color-danger` on `--color-danger-surface`.\n  - Status labels print `--color-success`, `--color-warning` and `--color-danger` as text and frame on `--color-surface`, so each status colour must read on the well colour; none of them is used as a fill under text.\n  - Icons are inline SVG painted with `currentColor`: `--color-heading-alt` by default, the surrounding text colour on keys, title bars, block colours and selections.\n- Edges, the same in every layout of the era. Nothing has a border of its own except thin lines; every raised or sunken edge is a `box-shadow` token drawn inside the box:\n  - `--shadow-panel`: the raised frame of a window. `--shadow-dialog`: the frame of a dialog.\n  - `--shadow-control`: every raised key: buttons, toolbar keys, caption buttons, column heads, tabs and their sheet, pagination keys, the brand tile.\n  - `--shadow-control-pressed`: everything sunken: fields, the path field, wells, read-outs, status cells, the check box, the progress bar, a pressed key, the current pagination key. Note that fields take the pressed token, not `--shadow-control`.\n  - `--border-width-strong` is the thickness of those edges: padding that must clear an edge is written `calc(var(--border-width-strong) + var(--space-N))`.\n  - `--border-width`, `--border-style` and `--color-border` draw the thin lines: group boxes, the etched rule (`--color-border` over `--color-border-muted`), toolbar separators, table row lines (`--color-surface-alt`), the frame of notices, badges and the default button (`--color-border-strong`).\n  - `--color-border`, `--color-border-strong` and `--color-border-muted` are the three shades the edge tokens are built from: the mid shadow, the darkest outer line and the light edge. A palette sets them as a bevel set for its window face.\n- Not expressible by a token and written literally in `components.css`: the `dotted` guide lines of the tree (and of topic lists), the `solid` strokes of the caption-button glyphs, and `clip-path` on the current tab, which cuts off its lower edge so that it joins the sheet; and the `dotted` guide lines are written literally whatever `--border-style` is.\n- All radii are 0 and are still applied through `--radius-control`, `--radius-panel`, `--radius-pill` and `--radius-page`. `--shadow-text` is applied to title bars and buttons. `--transition` is `none`; `--backdrop-blur` is `0px`: no surface blurs what lies behind it.\n\n## Components\n\nThe name `chronoskin` and its mark are placeholders for the installing project's own name and mark.\n\n- `.ds-page`: the desktop, on `<body>`; `.ds-page__window` is the one window, `.ds-page__columns` the working pane (`.ds-page__main`) and the rail (`.ds-page__rail`).\n- `.ds-window`: a raised frame; `.ds-window__title` is its title bar (`--inactive` for a window without the focus) with `.ds-window__caption` and the `.ds-window__ctl` caption buttons (`--min`, `--max`, `--close`).\n- `.ds-nav`: the title bar and the switch bar. `.ds-nav__links` is the bar, each `.ds-nav__item` an equal share of it, `.ds-nav__link` a raised window key with an icon; the current one is pressed and bold. `.ds-nav__state` is the sunken connection read-out at the right, with its `.ds-nav__lamp`.\n- `.ds-brand`: the mark and the name at the left of the title bar. `.ds-brand__mark` is a small key dressed like the default button, `.ds-brand__name` the name in the heading face.\n- `.ds-hero`: the welcome of the lobby, a well. `.ds-hero__band` is the block in the selection colours with a large icon, `.ds-hero__body` holds `.ds-hero__title`, `.ds-hero__lead`, `.ds-hero__text` and `.ds-hero__action`. Home view only.\n- `.ds-page-header`: the head of an inner page: `.ds-page-header__text` with `.ds-page-header__title` and `.ds-page-header__lead` at the left, `.ds-page-header__action` at the right, a thick accent rule under it.\n- `.ds-view`: one screen of the example site; `.ds-view--home` shows when the address names none.\n- `.ds-prose`: running text inside a message: `h1`, `h2`, `h3`, `p`, `ul`, `ol`, `li`, `strong`, `code`; `.ds-prose__lead` is the lead line.\n- `.ds-link`: every link in text. States `is-visited`, `is-hover`, `is-active`, `is-focus`; `.ds-link--quiet` for tool and footer links, `.ds-link--strong` for a bold one. `.ds-links` wraps a line of links.\n- `.ds-button`: a raised key at least `--size-button` wide; the plain class is the default key, inside one more line. `.ds-button--secondary` is every other key, `.ds-button--danger` the destructive one, `.ds-button--large` a bigger one. States `is-hover`, `is-pressed`, `is-focus`, `is-disabled` or `disabled`. `.ds-buttons` lays out a row; a `.ds-find__fill` spacer pushes keys apart.\n- `.ds-form`: two columns, `.ds-form__label` and `.ds-form__field`. Controls: `.ds-form__input` (`--short`, `--wide`), `.ds-form__select`, `.ds-form__textarea`, `.ds-form__check` and `.ds-form__radio` inside a `.ds-form__option`. `.ds-form__hint` is a small line under a field, `.ds-form__error` a bold line in the danger colour, `.ds-form__actions` the row of keys.\n- `.ds-table`: a list view: a well whose `.ds-table__head` cells are raised (`--num` right-aligned). `.ds-table__row` (`--alt` tinted, `is-selected` in the selection colours), `.ds-table__cell` (`--num`, `--group` for a total row), `.ds-table__caption`.\n- `.ds-list`: lines of a log. Each `.ds-list__item` is a `.ds-list__meta` (the time, monospace), a `.ds-list__who` (the name, bold) and a `.ds-list__text`; an icon may stand in place of the first two.\n- `.ds-panel`: a raised caption strip (`.ds-panel__title`) over a well (`.ds-panel__body`). `.ds-panel--fill` takes spare height.\n- `.ds-stat`: the line of read-outs; each `.ds-stat__item` is a sunken cell with the `.ds-stat__value` (heading face, `--text-h1`) before its `.ds-stat__label` on one line.\n- `.ds-grid`: the boards, two to a row. A `.ds-grid__cell` is a framed row: `.ds-grid__icon` is the block of colour (`.ds-grid__cell--2` to `--4` take the other block colours), `.ds-grid__body` holds `.ds-grid__title`, `.ds-grid__text` and `.ds-grid__meta`.\n- `.ds-tabs`: a property sheet: `.ds-tabs__item` holds a `.ds-tabs__tab`; the current one (`is-current`) is taller, bold and joined to the `.ds-sheet` that always follows.\n- `.ds-badge`: a small bold label in the selection colours. `.ds-badge--count` is a plain muted count. Status: `.ds-badge--success`, `.ds-badge--warning`, `.ds-badge--danger`. `.ds-badges` lays out a row.\n- `.ds-sidebar`: a well at the foot of the rail with a `.ds-sidebar__title` and a `.ds-sidebar__list` of links.\n- `.ds-notice`: the tip box inside a dark line; `.ds-notice__label` is the bold lead word, `.ds-notice--error` the error form. `.ds-notices` stacks several.\n- `.ds-pagination`: a row of small keys: `.ds-pagination__label`, then `.ds-pagination__link`s; `is-current` is pressed and bold, `is-disabled` greyed.\n- `.ds-breadcrumb`: the path in small type, the `.ds-breadcrumb__item`s parted by a double angle; the last is `is-current`.\n- `.ds-dialog`: a small window `--size-dialog` wide, shown where it would open: `.ds-dialog__title`, `.ds-dialog__content` with a large icon and the `.ds-dialog__body`, `.ds-dialog__actions`.\n- `.ds-empty`: an empty well with a large icon, `.ds-empty__title`, `.ds-empty__text` and one secondary key.\n- `.ds-footer`: the status bar, a `.ds-status` row of sunken `.ds-status__cell`s (`--wide` takes the free width).\n- `.ds-nicks`: the list of who is here: `.ds-nicks__group` is a small caption, `.ds-nicks__item` a name with its icon (`--host` bold, `--away` muted, `is-selected` in the selection colours).\n- `.ds-posts`: a conversation in a well. Each `.ds-post` has `.ds-post__who` (`.ds-post__name`, `.ds-post__role`) at the left and `.ds-post__body` (`.ds-post__head`, then `.ds-post__text` or a `.ds-prose`) at the right; `.ds-post__event` is a line the program says itself.\n- `.ds-icon` (`--large`, `--plain`), `.ds-well`, `.ds-rule`, `.ds-group` with `.ds-group__title`, `.ds-props` with `.ds-props__label` and `.ds-props__value`, `.ds-progress` with `.ds-progress__block`: the small parts every layout of the era shares.\n- `.ds-heading`: a section title. `.ds-split`: two equal columns of the same height. `.ds-stack`: a column of blocks (`--tight` closer). `.ds-find`: a row of a label, a field and keys.\n\n## Never\n\n- `row-gap <= 8px`: rows of lists and list views touch or sit 1px to 4px apart.\n- `block-gap <= 16px`: blocks inside the window are 8px apart, never more than 16px.\n- `content-width <= 768px`: everything is inside the one 768px window.\n- `font-size >= 10px`: counts and dates are 10px, nothing smaller.\n- `font-size <= 20px`: the folder banner is the largest text; page titles stop at 15px.\n- `font-weight >= 400`: regular, bold and the black weight of headings; nothing light.\n- `font-families <= 3`: the text sans, the black heading face and a monospace.\n- `letter-spacing = 0`: no tracking.\n- `uppercase-text <= 0%`: no text-transform.\n- `border-radius <= 0px`: the desktop had no rounded corner; the radio button is a circle.\n- `box-shadow-blur <= 0px`: edges are hard lines and the shadow of a window is hard; nothing is blurred.\n- `text-shadow = none`: no text shadow anywhere.\n- `gradient-fills <= 20%`: keys, bars, displays and lamps are shaded; wells, panels and the window face are flat.\n- `border-width <= 3px`: thin lines are 1px; nothing is drawn thicker than the 3px edge of a key.\n- `transition = none`: nothing eases on hover.\n- `animation = none`: no CSS animation.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. Anything that holds content is a `.ds-panel` (caption strip over a well) or a `.ds-well`; anything that lists is a `.ds-table`, a `.ds-list` or the `.ds-nicks` list; a new kind of conversation is a `.ds-posts`. Anything pressed or typed into takes `--shadow-control-pressed`, anything pushed takes `--shadow-control`. Clear every edge with `calc(var(--border-width-strong) + ...)` padding, keep the rail at the right and the same on every view, keep text at `--text-base` or `--text-ui`, and never add a radius, a blurred shadow, a gradient outside the `--fill-*` tokens, a hover animation or a colour of your own.\n",
    "components.css": "/* Layout tokens (structure part). A message board laid out as a chat\n   program, 768px wide on an 800px screen: a switch bar of window keys, the\n   open board or conversation at the left and the list of who is here in a\n   rail at the right. */\n:root {\n  --size-page: 768px;\n  --size-rail: 168px;\n  --size-nick: 96px;\n  --size-ctl: 16px;\n  --size-glyph: 8px;\n  --size-icon: 32px;\n  --size-icon-small: 16px;\n  --size-check: 13px;\n  --size-label: 96px;\n  --size-field: 200px;\n  --size-dialog: 316px;\n  --size-button: 75px;\n  --size-block: 8px;\n  --space-0: 1px;\n  --space-1: 2px;\n  --space-2: 4px;\n  --space-3: 6px;\n  --space-4: 8px;\n  --space-5: 12px;\n  --space-6: 16px;\n}\n\n/* ---------- shell: the desktop and the chat window ---------- */\n.ds-page {\n  margin: 0;\n  padding: var(--space-6) 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.ds-page__window {\n  width: var(--size-page);\n  margin: 0 auto;\n  background: var(--color-canvas);\n  border-radius: var(--radius-page);\n}\n/* The working pane at the left and the rail at the right, the same height. */\n.ds-page__columns {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-rail);\n  gap: var(--space-2);\n  align-items: stretch;\n  padding: var(--space-2) 0;\n}\n.ds-page__main {\n  min-width: 0;\n}\n.ds-page__rail {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  min-width: 0;\n}\n.ds-split {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n  gap: var(--space-4);\n  align-items: stretch;\n}\n.ds-stack {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n  min-width: 0;\n}\n.ds-heading {\n  margin: 0 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\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/* ---------- window: a raised frame with a title bar ---------- */\n.ds-window {\n  box-sizing: border-box;\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-1));\n  background: var(--fill-panel);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-window__title {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-1) var(--space-1) var(--space-1) var(--space-2);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-shadow: var(--shadow-text);\n}\n/* A window that does not have the focus. */\n.ds-window__caption {\n  flex: 1;\n  min-width: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ds-window__controls {\n  display: flex;\n  flex: none;\n  gap: var(--space-1);\n}\n/* Caption buttons: small raised squares, the glyph drawn in CSS. */\n.ds-window__ctl {\n  position: relative;\n  box-sizing: border-box;\n  width: var(--size-ctl);\n  height: calc(var(--size-ctl) - var(--space-1));\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n}\n.ds-window__ctl::before,\n.ds-window__ctl::after {\n  content: \"\";\n  position: absolute;\n  box-sizing: border-box;\n}\n.ds-window__ctl--min::before {\n  left: var(--space-2);\n  bottom: calc(var(--space-1) + var(--space-0));\n  width: calc(var(--size-glyph) - var(--space-1));\n  height: var(--space-1);\n  background: currentColor;\n}\n.ds-window__ctl--max::before {\n  left: calc(50% - var(--size-glyph) / 2);\n  top: calc(50% - var(--size-glyph) / 2);\n  width: var(--size-glyph);\n  height: var(--size-glyph);\n  border: var(--space-0) solid currentColor;\n  border-top-width: var(--space-1);\n}\n.ds-window__ctl--close::before,\n.ds-window__ctl--close::after {\n  left: calc(50% - var(--size-glyph) / 2 - var(--space-0));\n  top: calc(50% - var(--space-0));\n  width: calc(var(--size-glyph) + var(--space-1));\n  height: var(--space-1);\n  background: currentColor;\n  transform: rotate(45deg);\n}\n.ds-window__ctl--close::after {\n  transform: rotate(-45deg);\n}\n\n/* ---------- small things used everywhere ---------- */\n/* Etched line: a dark rule over a light one. */\n.ds-rule {\n  height: 0;\n  margin: var(--space-4) 0;\n  border: 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n/* Pixel icon: inline SVG painted with the text colour of its place. */\n.ds-icon {\n  display: inline-block;\n  flex: none;\n  width: var(--size-icon-small);\n  height: var(--size-icon-small);\n  vertical-align: text-bottom;\n  color: var(--color-heading-alt);\n}\n.ds-icon svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-icon--large {\n  width: var(--size-icon);\n  height: var(--size-icon);\n}\n.ds-icon--plain {\n  color: inherit;\n}\n/* Sunken well: the white field that holds lists, trees and documents. */\n.ds-well {\n  box-sizing: border-box;\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-3));\n  background: var(--color-surface);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-control-pressed);\n}\n/* Progress bar made of blocks. */\n.ds-progress {\n  display: inline-flex;\n  gap: var(--space-1);\n  box-sizing: border-box;\n  padding: calc(var(--border-width-strong) + var(--space-0));\n  background: var(--color-surface);\n  box-shadow: var(--shadow-control-pressed);\n  vertical-align: middle;\n}\n.ds-progress__block {\n  width: var(--size-block);\n  height: calc(var(--size-block) + var(--space-2));\n  background: var(--fill-accent);\n}\n.ds-progress__block--empty {\n  background: transparent;\n}\n/* Status bar: sunken cells. */\n.ds-status {\n  display: flex;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-status__cell {\n  padding: calc(var(--border-width-strong) + var(--space-0)) var(--space-3);\n  box-shadow: var(--shadow-control-pressed);\n  white-space: nowrap;\n}\n.ds-status__cell--wide {\n  flex: 1;\n  min-width: 0;\n  white-space: normal;\n}\n/* Group box: a thin frame with its caption cut into the top edge. */\n.ds-group {\n  box-sizing: border-box;\n  min-width: 0;\n  margin: 0;\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n}\n.ds-group__title {\n  padding: 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n}\n/* Property rows: a label column and a value column. */\n.ds-props {\n  display: grid;\n  grid-template-columns: max-content minmax(0, 1fr);\n  column-gap: var(--space-5);\n  row-gap: var(--space-2);\n  align-items: center;\n  margin: 0;\n}\n.ds-props__label {\n  color: var(--color-text-muted);\n}\n.ds-props__value {\n  margin: 0;\n}\n/* Tree list: nested rows joined by dotted guide lines. */\n.ds-tree__link:hover,\n.ds-tree__link.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-tree__link.is-current {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-tree__link.is-current .ds-icon {\n  color: inherit;\n}\n\n/* ---------- links ---------- */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\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}\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--strong {\n  font-weight: var(--weight-bold);\n}\n.ds-links {\n  margin: 0;\n}\n\n/* ---------- prose ---------- */\n.ds-prose {\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  line-height: var(--line-body);\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: var(--space-5) 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  margin-top: 0;\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  font-size: var(--text-h3);\n  color: var(--color-heading-alt);\n}\n.ds-prose p {\n  margin: 0 0 var(--space-4);\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: 0 0 var(--space-4);\n  padding: 0 0 0 calc(var(--space-6) + var(--space-4));\n}\n.ds-prose li {\n  padding: 0 0 var(--space-1);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  background: var(--color-surface-alt);\n  font-family: var(--font-mono);\n  font-size: var(--text-base);\n}\n.ds-prose__lead {\n  font-size: var(--text-large);\n}\n\n/* ---------- buttons ---------- */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n/* The primary button is the default button of a dialog: the same raised key\n   as every other, inside one more dark line. */\n.ds-button {\n  display: inline-block;\n  box-sizing: border-box;\n  min-width: var(--size-button);\n  margin: 0;\n  padding: var(--space-2) var(--space-5);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-align: center;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  transition: var(--transition);\n  cursor: default;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-button:active,\n.ds-button.is-pressed {\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-2) * -1);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--fill-button-secondary);\n  background-clip: padding-box;\n  color: var(--color-button-secondary-text);\n  border-color: transparent;\n}\n.ds-button--large {\n  padding: var(--space-3) var(--space-6);\n  font-size: var(--text-large);\n}\n/* Destructive action: the same key, the label in the bold danger colour. */\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--fill-button);\n  background-clip: padding-box;\n  color: var(--color-danger);\n  border-color: transparent;\n  font-weight: var(--weight-bold);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  background: var(--color-disabled);\n  background-clip: padding-box;\n  color: var(--color-disabled-text);\n  border-color: transparent;\n}\n\n/* ---------- form ---------- */\n.ds-form {\n  display: grid;\n  grid-template-columns: var(--size-label) minmax(0, 1fr);\n  column-gap: var(--space-4);\n  row-gap: var(--space-3);\n  align-items: baseline;\n  margin: 0;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-form__label {\n  color: var(--color-text);\n}\n.ds-form__field {\n  min-width: 0;\n}\n.ds-form__input,\n.ds-form__select,\n.ds-form__textarea {\n  box-sizing: border-box;\n  max-width: 100%;\n  margin: 0;\n  padding: calc(var(--border-width-strong) + var(--space-1)) calc(var(--border-width-strong) + var(--space-2));\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  border: 0;\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-pressed);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  transition: var(--transition);\n}\n.ds-form__input {\n  width: var(--size-field);\n}\n.ds-form__input--wide {\n  width: 100%;\n}\n.ds-form__textarea {\n  display: block;\n  width: 100%;\n  resize: none;\n}\n.ds-form__input:focus-visible,\n.ds-form__select:focus-visible,\n.ds-form__textarea:focus-visible,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--border-width-strong) * -1 - var(--space-0));\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__option {\n  display: inline-flex;\n  align-items: center;\n  margin: 0 var(--space-5) 0 0;\n}\n.ds-form__check {\n  appearance: none;\n  box-sizing: border-box;\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0 var(--space-3) 0 0;\n  padding: calc(var(--border-width-strong) + var(--space-0));\n  background: var(--fill-input);\n  border: 0;\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-pressed);\n  outline: var(--border-width) var(--border-style) var(--color-input-border);\n  outline-offset: calc(var(--border-width) * -1);\n}\n/* The tick is a block of the field's text colour inside the field's fill. */\n.ds-form__check:checked::before,\n.ds-form__check.is-checked::before {\n  content: \"\";\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: var(--color-input-text);\n}\n.ds-form__hint {\n  display: block;\n  padding: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__error {\n  display: block;\n  padding: var(--space-1) 0 0;\n  color: var(--color-danger);\n  font-weight: var(--weight-bold);\n}\n.ds-form__actions {\n  grid-column: 1 / -1;\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  padding: var(--space-2) 0 0;\n}\n\n/* ---------- table: a list view in a sunken well, raised column heads ---------- */\n.ds-table {\n  box-sizing: border-box;\n  width: 100%;\n  padding: var(--border-width-strong);\n  border-collapse: separate;\n  border-spacing: 0;\n  background: var(--color-surface);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-control-pressed);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n}\n.ds-table__head {\n  padding: calc(var(--border-width-strong) + var(--space-0)) var(--space-3);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-align: left;\n  white-space: nowrap;\n}\n.ds-table__head--num {\n  text-align: right;\n}\n.ds-table__cell {\n  padding: var(--space-1) var(--space-3);\n  border-bottom: var(--border-width) var(--border-style) var(--color-surface-alt);\n  text-align: left;\n  vertical-align: baseline;\n}\n.ds-table__cell--num {\n  text-align: right;\n  white-space: nowrap;\n}\n.ds-table__cell--group {\n  background: var(--color-surface-strong);\n  font-weight: var(--weight-bold);\n}\n.ds-table__row--alt .ds-table__cell {\n  background: var(--color-surface-alt);\n}\n/* The selected row of a list view. */\n.ds-table__row.is-selected .ds-table__cell {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-table__row.is-selected .ds-link,\n.ds-table__row.is-selected .ds-icon {\n  color: inherit;\n}\n.ds-table__caption {\n  caption-side: bottom;\n  padding: var(--space-2) 0 0;\n  color: var(--color-text);\n  font-size: var(--text-small);\n  text-align: left;\n}\n\n/* ---------- tabs: a property sheet ---------- */\n.ds-tabs {\n  display: flex;\n  align-items: flex-end;\n  margin: 0;\n  padding: 0 var(--space-1);\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-tabs__item {\n  display: flex;\n  align-items: flex-end;\n}\n/* A tab is a raised key whose lower edge slides under the sheet. */\n.ds-tabs__tab {\n  display: block;\n  margin: 0 0 calc(var(--border-width-strong) * -1);\n  padding: var(--space-2) var(--space-4) calc(var(--space-2) + var(--border-width-strong));\n  background: var(--fill-panel);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control);\n  line-height: var(--line-heading);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n}\n/* The current tab is taller, stands in front of the sheet and loses its own\n   lower edge, so it reads as one piece with the sheet. */\n.ds-tabs__tab.is-current {\n  position: relative;\n  z-index: 1;\n  margin: 0 0 calc(var(--border-width-strong) * -2);\n  padding: var(--space-3) var(--space-4) calc(var(--space-2) + var(--border-width-strong) * 2);\n  color: var(--color-text);\n  font-weight: var(--weight-bold);\n  clip-path: inset(0 0 var(--border-width-strong) 0);\n}\n.ds-sheet {\n  box-sizing: border-box;\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-5));\n  background: var(--fill-panel);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control);\n}\n\n/* ---------- badge ---------- */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-2);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-pill);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  white-space: nowrap;\n}\n.ds-badge--count {\n  padding: 0;\n  background: transparent;\n  color: var(--color-text-muted);\n  border-color: transparent;\n  font-weight: var(--weight-body);\n}\n/* Status labels: the status colour as text and frame on the well colour. */\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  background: var(--color-surface);\n  border-color: currentColor;\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.ds-badges {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n\n/* ---------- notice: the pale tip box with a dark line round it ---------- */\n.ds-notices {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n}\n.ds-notice {\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-notice--error {\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n  border-color: var(--color-danger);\n}\n.ds-notice__label {\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- pagination: a row of small keys ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-pagination__label {\n  padding: 0 var(--space-3) 0 0;\n}\n.ds-pagination__link {\n  display: block;\n  padding: calc(var(--border-width-strong) + var(--space-0)) calc(var(--border-width-strong) + var(--space-3));\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n  line-height: var(--line-heading);\n  text-decoration: none;\n  cursor: default;\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-button-hover-text);\n}\n.ds-pagination__link.is-current {\n  box-shadow: var(--shadow-control-pressed);\n  font-weight: var(--weight-bold);\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-disabled-text);\n}\n\n/* ---------- dialog: a small window with an icon, a message and keys ---------- */\n.ds-dialog {\n  position: static;\n  box-sizing: border-box;\n  width: var(--size-dialog);\n  max-width: 100%;\n  margin: var(--space-5) auto var(--space-2);\n  padding: calc(var(--border-width-strong) + var(--space-1));\n  background: var(--fill-panel);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-dialog__title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-1) var(--space-1) var(--space-1) var(--space-2);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-shadow: var(--shadow-text);\n}\n.ds-dialog__content {\n  display: flex;\n  align-items: flex-start;\n  gap: var(--space-5);\n  padding: var(--space-5);\n}\n.ds-dialog__body {\n  flex: 1;\n  min-width: 0;\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  justify-content: center;\n  gap: var(--space-3);\n  padding: 0 var(--space-5) var(--space-5);\n}\n\n/* ---------- search row ---------- */\n.ds-find {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-find__fill {\n  flex: 1;\n}\n\n/* ---------- radio button: the round sunken field ---------- */\n.ds-form__radio {\n  appearance: none;\n  box-sizing: border-box;\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0 var(--space-3) 0 0;\n  padding: calc(var(--border-width-strong) + var(--space-0));\n  background: var(--fill-input);\n  border: 0;\n  border-radius: 50%;\n  box-shadow: var(--shadow-control-pressed);\n  outline: var(--border-width) var(--border-style) var(--color-input-border);\n  outline-offset: calc(var(--border-width) * -1);\n}\n.ds-form__radio:checked::before,\n.ds-form__radio.is-checked::before {\n  content: \"\";\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: var(--color-input-text);\n  border-radius: 50%;\n}\n\n/* ---------- footer: the status bar of the window ---------- */\n.ds-footer {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n\n/* ---------- nav: the title bar and the switch bar of window keys ---------- */\n.ds-nav {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: inherit;\n  text-decoration: none;\n}\n/* The mark is the window's icon: a small key dressed like the default button. */\n.ds-brand__mark {\n  display: flex;\n  flex: none;\n  box-sizing: border-box;\n  width: calc(var(--size-ctl) + var(--space-2));\n  height: calc(var(--size-ctl) + var(--space-2));\n  padding: var(--border-width-strong);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\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-ui);\n  font-weight: var(--weight-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-nav__links {\n  display: flex;\n  align-items: stretch;\n  gap: var(--space-1);\n  margin: 0;\n  padding: var(--space-1);\n  list-style: none;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-nav__item {\n  display: flex;\n  flex: 1;\n  min-width: 0;\n}\n/* A window key: raised, one for every window that is open. */\n.ds-nav__link {\n  display: flex;\n  flex: 1;\n  align-items: center;\n  gap: var(--space-2);\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-1)) var(--space-3);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n  line-height: var(--line-heading);\n  text-decoration: none;\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n  overflow: hidden;\n}\n.ds-nav__link .ds-icon {\n  color: inherit;\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n}\n/* The key of the window that is showing stays pressed. */\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#board:target) .ds-nav__link[href=\"#board\"],\n.ds-page:has(#topic:target) .ds-nav__link[href=\"#topic\"],\n.ds-page:has(#write:target) .ds-nav__link[href=\"#write\"],\n.ds-page:has(#members:target) .ds-nav__link[href=\"#members\"] {\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n  font-weight: var(--weight-bold);\n}\n/* The connection read-out at the right end of the switch bar. */\n.ds-nav__state {\n  display: flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-2);\n  padding: 0 var(--space-3);\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n  white-space: nowrap;\n}\n.ds-nav__lamp {\n  width: var(--size-glyph);\n  height: var(--size-glyph);\n  background: var(--color-success);\n}\n\n/* ---------- hero: the welcome message of the lobby ---------- */\n.ds-hero {\n  display: flex;\n  align-items: stretch;\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n  padding: var(--border-width-strong);\n}\n/* A band in the selection colours that carries the large icon. */\n.ds-hero__band {\n  display: flex;\n  flex: none;\n  align-items: flex-start;\n  justify-content: center;\n  padding: var(--space-5) var(--space-4);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-hero__body {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-2);\n  min-width: 0;\n  padding: var(--space-4) var(--space-5) var(--space-5);\n}\n.ds-hero__title {\n  margin: 0;\n  color: var(--color-heading-alt);\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}\n.ds-hero__lead {\n  margin: 0;\n  font-size: var(--text-large);\n  line-height: var(--line-heading);\n}\n.ds-hero__text {\n  margin: 0;\n  color: var(--color-text-muted);\n}\n.ds-hero__action {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n  padding: var(--space-2) 0 0;\n}\n\n/* ---------- stats: one line of read-outs, the figure before its label ---------- */\n.ds-stat {\n  display: flex;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat__item {\n  display: flex;\n  flex: 1;\n  align-items: baseline;\n  gap: var(--space-3);\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-1)) calc(var(--border-width-strong) + var(--space-3));\n  background: var(--color-surface);\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-stat__value {\n  color: var(--color-heading-alt);\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}\n.ds-stat__label {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- grid: the boards, two to a row ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-2);\n}\n/* A board: a block of colour with the icon, then the name and the counts. */\n.ds-grid__cell {\n  display: flex;\n  align-items: stretch;\n  min-width: 0;\n  background: var(--color-surface);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  text-decoration: none;\n}\n.ds-grid__icon {\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-fill-1);\n  color: var(--color-text);\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-grid__cell--2 .ds-grid__icon {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 .ds-grid__icon {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 .ds-grid__icon {\n  background: var(--color-fill-4);\n}\n.ds-grid__body {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  min-width: 0;\n  padding: var(--space-2) var(--space-4) var(--space-3);\n}\n.ds-grid__title {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n}\n.ds-grid__text {\n  color: var(--color-text);\n}\n.ds-grid__meta {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- list: lines of a log: the time, who, and what was said ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: baseline;\n  gap: var(--space-3);\n  padding: var(--space-1) 0;\n}\n.ds-list__meta {\n  flex: none;\n  color: var(--color-text-muted);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  white-space: nowrap;\n}\n.ds-list__who {\n  flex: none;\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-list__text {\n  flex: 1;\n  min-width: 0;\n}\n\n/* ---------- panel: a caption strip over a framed body ---------- */\n.ds-panel {\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  min-width: 0;\n  margin: 0;\n}\n.ds-panel--fill {\n  flex: 1;\n}\n.ds-panel__title {\n  margin: 0;\n  padding: calc(var(--border-width-strong) + var(--space-0)) var(--space-3);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n}\n.ds-panel__body {\n  flex: 1;\n  margin: 0;\n  padding: calc(var(--border-width-strong) + var(--space-3)) calc(var(--border-width-strong) + var(--space-4));\n  background: var(--color-surface);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-control-pressed);\n}\n\n/* ---------- breadcrumb: the path of rooms above a page ---------- */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 0;\n  padding: 0 var(--space-1);\n  list-style: none;\n  color: var(--color-text-muted);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  line-height: var(--line-heading);\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before {\n  content: \"\\00BB\";\n  padding: 0 var(--space-2);\n}\n.ds-breadcrumb__item.is-current {\n  color: var(--color-text);\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- page header: the title of a board, its topic line and one key ---------- */\n.ds-page-header {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-5);\n  padding: 0 var(--space-1) var(--space-3);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-accent);\n}\n.ds-page-header__text {\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}\n.ds-page-header__lead {\n  margin: var(--space-1) 0 0;\n}\n.ds-page-header__action {\n  display: flex;\n  flex: none;\n  gap: var(--space-3);\n}\n\n/* ---------- sidebar: a block of links at the foot of the rail ---------- */\n.ds-sidebar {\n  min-width: 0;\n  padding: calc(var(--border-width-strong) + var(--space-3));\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n}\n.ds-sidebar__list {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* ---------- who is here: the list of names in the rail ---------- */\n.ds-nicks {\n  flex: 1;\n  margin: 0;\n  padding: calc(var(--border-width-strong) + var(--space-2));\n  list-style: none;\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-nicks__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-0) var(--space-1);\n}\n.ds-nicks__item--host {\n  font-weight: var(--weight-bold);\n}\n.ds-nicks__item--away {\n  color: var(--color-text-muted);\n}\n.ds-nicks__item.is-selected {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-nicks__item.is-selected .ds-icon {\n  color: inherit;\n}\n.ds-nicks__group {\n  padding: var(--space-2) var(--space-1) var(--space-0);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* ---------- posts: a conversation, the name at the left of every message ---------- */\n.ds-posts {\n  padding: var(--border-width-strong);\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-post {\n  display: grid;\n  grid-template-columns: var(--size-nick) minmax(0, 1fr);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-post__who {\n  display: flex;\n  flex-direction: column;\n  padding: var(--space-3) var(--space-3) var(--space-4);\n  background: var(--color-surface-alt);\n  color: var(--color-text);\n}\n.ds-post__name {\n  color: var(--color-heading-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-post__role {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-post__body {\n  min-width: 0;\n  padding: var(--space-3) var(--space-4) var(--space-2);\n}\n.ds-post__head {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-4);\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-post__text {\n  margin: 0 0 var(--space-3);\n}\n/* A line the program says itself: someone joined, the topic was moved. */\n.ds-post__event {\n  grid-column: 1 / -1;\n  padding: var(--space-1) var(--space-3);\n  color: var(--color-accent-alt);\n  font-size: var(--text-small);\n}\n\n/* ---------- empty state: a message in an empty well ---------- */\n.ds-empty {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-6) var(--space-5);\n  background: var(--color-surface);\n  color: var(--color-text);\n  box-shadow: var(--shadow-control-pressed);\n  text-align: center;\n  font-size: var(--text-base);\n}\n.ds-empty__title {\n  margin: var(--space-2) 0;\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-empty__text {\n  margin: 0 0 var(--space-4);\n  color: var(--color-text-muted);\n}\n/* A dialog shown beside another block starts level with it. */\n.ds-split > .ds-dialog {\n  margin: 0;\n}\n\n/* ---------- menu: a pull-down under a menu-bar entry (details), opened by a click ---------- */\n.ds-menu {\n  position: relative;\n}\n.ds-menu summary {\n  list-style: none;\n  cursor: default;\n}\n.ds-menu summary::-webkit-details-marker {\n  display: none;\n}\n.ds-menu details[open] > summary {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 30;\n  box-sizing: border-box;\n  min-width: 100%;\n  margin: 0;\n  padding: var(--space-1);\n  list-style: none;\n  background: var(--fill-panel);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-dialog);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-transform: none;\n  white-space: nowrap;\n}\n.ds-menu__item {\n  display: block;\n  padding: var(--space-1) var(--space-5);\n  color: inherit;\n  text-decoration: none;\n}\n.ds-menu__item:hover,\n.ds-menu__item:focus {\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n\n/* ---------- tooltip: the pale yellow tip under the pointer, on hover or focus ---------- */\n.ds-tooltip {\n  position: relative;\n}\n.ds-tooltip__text {\n  display: none;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 40;\n  margin-top: var(--space-1);\n  padding: var(--space-1) var(--space-2);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  text-transform: none;\n  white-space: nowrap;\n}\n.ds-tooltip:hover > .ds-tooltip__text,\n.ds-tooltip:focus-within > .ds-tooltip__text {\n  display: block;\n}\n\n/* On an inner view the working pane is as tall as the rail: the sheet under the tabs, or the panel, takes the height left over. */\n.ds-page__main {\n  display: flex;\n  flex-direction: column;\n}\n.ds-page__main > .ds-view:not(.ds-view--home):target {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n}\n.ds-view > .ds-stack {\n  flex: 1;\n}\n.ds-stack > div:has(> .ds-sheet) {\n  display: flex;\n  flex: 1 0 auto;\n  flex-direction: column;\n}\n.ds-stack > div > .ds-sheet,\n.ds-stack > .ds-panel {\n  flex: 1 0 auto;\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 Boards: desktop grey chat and message boards, 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\n<div class=\"ds-page__window ds-window\">\n\n  <header class=\"ds-nav\" data-component=\"nav\">\n    <div class=\"ds-window__title\">\n      <a class=\"ds-brand\" data-component=\"brand\" href=\"#home\">\n        <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><rect x=\"4\" y=\"3\" width=\"16\" height=\"2\"/><rect x=\"6\" y=\"5\" width=\"12\" height=\"2\"/><rect x=\"8\" y=\"7\" width=\"8\" height=\"2\"/><rect x=\"10\" y=\"9\" width=\"4\" height=\"2\"/><rect x=\"11\" y=\"11\" width=\"2\" height=\"2\"/><rect x=\"10\" y=\"13\" width=\"4\" height=\"2\"/><rect x=\"8\" y=\"15\" width=\"8\" height=\"2\"/><rect x=\"6\" y=\"17\" width=\"12\" height=\"2\"/><rect x=\"4\" y=\"19\" width=\"16\" height=\"2\"/></svg></span>\n        <span class=\"ds-brand__name\">chronoskin</span>\n      </a>\n      <span class=\"ds-window__caption\">Boards [connected as marlowe]</span>\n      <span class=\"ds-window__controls\" aria-hidden=\"true\"><span class=\"ds-window__ctl ds-window__ctl--min\"></span><span class=\"ds-window__ctl ds-window__ctl--max\"></span><span class=\"ds-window__ctl ds-window__ctl--close\"></span></span>\n    </div>\n    <ul class=\"ds-nav__links\">\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#home\"><span class=\"ds-icon ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2l7 6h-2v6H9v-4H7v4H3V8H1z\"/></svg></span>Lobby</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#board\"><span class=\"ds-icon ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 3h5l1 2h8v9H1z M2 6v7h12V6z\"/></svg></span>Hardware</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#topic\"><span class=\"ds-icon ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span>Topic 4127</a></li>\n      <li class=\"ds-nav__item ds-tooltip\"><a class=\"ds-nav__link\" href=\"#write\"><span class=\"ds-icon ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M11 1l4 4-9 9H2v-4z M3 10.5V13h2.5z\"/></svg></span>New message</a><span class=\"ds-tooltip__text\" role=\"tooltip\">Start a new topic</span></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#members\"><span class=\"ds-icon ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M5.5 3a2.5 2.5 0 1 0 0 5a2.5 2.5 0 0 0 0-5z M11 4a2 2 0 1 0 0 4a2 2 0 0 0 0-4z M1 14c0-3 2-5 4.5-5S10 11 10 14z M11 9c2.2 0 4 1.8 4 5h-4c0-2-.6-3.6-1.6-4.6.5-.3 1-.4 1.6-.4z\"/></svg></span>Members</a></li>\n      <li class=\"ds-nav__item ds-menu\"><details><summary class=\"ds-nav__link\">Help</summary><ul class=\"ds-menu__list\"><li><a class=\"ds-menu__item\" href=\"#write\">Start a topic</a></li><li><a class=\"ds-menu__item\" href=\"#members\">Who is here</a></li></ul></details></li>\n      <li class=\"ds-nav__state\"><span class=\"ds-nav__lamp\"></span>Connected 0:42</li>\n    </ul>\n  </header>\n\n  <div class=\"ds-page__columns\">\n  <div class=\"ds-page__main\">\n\n  <section class=\"ds-view ds-view--home\" id=\"home\">\n    <div class=\"ds-stack\">\n      <section class=\"ds-hero\" data-component=\"hero\">\n        <div class=\"ds-hero__band\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span></div>\n        <div class=\"ds-hero__body\">\n          <h1 class=\"ds-hero__title\">Welcome to the boards</h1>\n          <p class=\"ds-hero__lead\">Six boards about computers and the people who keep them running, open day and night.</p>\n          <p class=\"ds-hero__text\">Read as a guest, or pick a name and join in. Message of the day: the scanner drivers board has moved into Hardware.</p>\n          <div class=\"ds-hero__action\">\n            <a class=\"ds-button\" href=\"#members\">Pick a name</a>\n            <a class=\"ds-button ds-button--secondary\" href=\"#board\">Read the boards</a>\n          </div>\n        </div>\n      </section>\n\n      <ul class=\"ds-stat\" data-component=\"stats\">\n        <li class=\"ds-stat__item\"><span class=\"ds-stat__value\">14</span><span class=\"ds-stat__label\">here now</span></li>\n        <li class=\"ds-stat__item\"><span class=\"ds-stat__value\">2,318</span><span class=\"ds-stat__label\">members</span></li>\n        <li class=\"ds-stat__item\"><span class=\"ds-stat__value\">4,127</span><span class=\"ds-stat__label\">topics</span></li>\n        <li class=\"ds-stat__item\"><span class=\"ds-stat__value\">31,860</span><span class=\"ds-stat__label\">messages</span></li>\n      </ul>\n\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <a class=\"ds-grid__cell\" href=\"#board\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M4 4h8v8H4z M6 6v4h4V6z M5 1h1v2H5z M10 1h1v2h-1z M5 13h1v2H5z M10 13h1v2h-1z M1 5h2v1H1z M1 10h2v1H1z M13 5h2v1h-2z M13 10h2v1h-2z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">Hardware and drivers</span><span class=\"ds-grid__text\">Cards, modems, printers and the files they need.</span><span class=\"ds-grid__meta\">1,204 topics, 9 new today</span></span></a>\n        <a class=\"ds-grid__cell ds-grid__cell--2\" href=\"#board\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M8 2.2a5.8 5.8 0 0 1 2 .4L9 5H6L5 3.2A5.8 5.8 0 0 1 8 2.2z M2.3 7l2.2-.6L7 8l-1 3 1.5 2.7A5.8 5.8 0 0 1 2.3 7z M13.7 7.5a5.8 5.8 0 0 1-3 5.5L10 10l1.2-2.5z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">Getting online</span><span class=\"ds-grid__text\">Dial-up settings, browsers and mail programs.</span><span class=\"ds-grid__meta\">986 topics, 4 new today</span></span></a>\n        <a class=\"ds-grid__cell ds-grid__cell--3\" href=\"#board\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M3 1h7l3 3v11H3z M4 2v12h8V5H9V2z M5 7h6v1H5z M5 9h6v1H5z M5 11h4v1H5z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">Home pages</span><span class=\"ds-grid__text\">Writing pages by hand, counters and guest books.</span><span class=\"ds-grid__meta\">742 topics, 6 new today</span></span></a>\n        <a class=\"ds-grid__cell ds-grid__cell--4\" href=\"#board\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M3 5h10a3 3 0 0 1 3 3v2a2 2 0 0 1-3.6 1.2L11.5 10h-7l-.9 1.2A2 2 0 0 1 0 10V8a3 3 0 0 1 3-3z M4 6.5v1H3v1h1v1h1v-1h1v-1H5v-1z M11 7h1v1h-1z M12.5 8.5h1v1h-1z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">Games</span><span class=\"ds-grid__text\">Hints, patches and somebody to play against.</span><span class=\"ds-grid__meta\">655 topics, 11 new today</span></span></a>\n        <a class=\"ds-grid__cell ds-grid__cell--3\" href=\"#board\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 4l7-3 7 3v8l-7 3-7-3z M2.5 4.6L8 7l5.5-2.4L8 2.2z M2 5.7v5.6l5.4 2.3V8z M14 5.7L8.6 8v5.6l5.4-2.3z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">Swap shop</span><span class=\"ds-grid__text\">Parts wanted and parts looking for a home.</span><span class=\"ds-grid__meta\">318 topics, 2 new today</span></span></a>\n        <a class=\"ds-grid__cell\" href=\"#topic\"><span class=\"ds-grid__icon\"><span class=\"ds-icon ds-icon--large ds-icon--plain\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M2 3h10v2h2a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2h-1.4A4 4 0 0 1 8 12H6a4 4 0 0 1-4-4z M12 6v3h1a1 1 0 0 0 1-1V6z M2 13h10v1H2z\"/></svg></span></span><span class=\"ds-grid__body\"><span class=\"ds-grid__title\">The coffee room</span><span class=\"ds-grid__text\">Everything that fits nowhere else.</span><span class=\"ds-grid__meta\">222 topics, 3 new today</span></span></a>\n      </div>\n\n      <div class=\"ds-split\">\n        <section class=\"ds-panel\" data-component=\"panel\">\n          <h2 class=\"ds-panel__title\">Latest messages</h2>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\" data-component=\"list\">\n              <li class=\"ds-list__item\"><span class=\"ds-list__meta\">21:38</span><span class=\"ds-list__who\">okafor</span><span class=\"ds-list__text\"><a class=\"ds-link\" href=\"#topic\">Sound card silent after the update</a></span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-list__meta\">21:31</span><span class=\"ds-list__who\">lindqvist</span><span class=\"ds-list__text\"><a class=\"ds-link\" href=\"#topic\">Which modem string for a noisy line?</a></span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-list__meta\">21:12</span><span class=\"ds-list__who\">tanaka</span><span class=\"ds-list__text\"><a class=\"ds-link is-visited\" href=\"#topic\">Frames or tables for a menu</a></span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-list__meta\">20:57</span><span class=\"ds-list__who\">marlowe</span><span class=\"ds-list__text\"><a class=\"ds-link\" href=\"#topic\">Wanted: 16 MB of memory, 72 pin</a></span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-list__meta\">20:40</span><span class=\"ds-list__who\">abara</span><span class=\"ds-list__text\"><a class=\"ds-link is-visited\" href=\"#topic\">Best keyboard you ever owned</a></span></li>\n            </ul>\n          </div>\n        </section>\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">House rules</h2>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">One question to a topic, and say what you have tried.</span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">No serial numbers and no copied programs.</span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">Hosts are marked with a star. Their word is final.</span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 10h2v2H7z M5.4 6a2.6 2.6 0 1 1 4.2 2c-.5.5-.6.7-.6 1.4H7c0-1.2.3-1.7 1-2.3a.8.8 0 1 0-1.3-.6z\"/></svg></span><span class=\"ds-list__text\"><a class=\"ds-link\" href=\"#write\">Ask a host</a> when in doubt.</span></li>\n            </ul>\n          </div>\n        </section>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"board\">\n    <div class=\"ds-stack\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Lobby</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Boards</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Hardware and drivers</li>\n      </ol>\n      <header class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__text\">\n          <h1 class=\"ds-page-header__title\">Hardware and drivers</h1>\n          <p class=\"ds-page-header__lead\">Cards, modems, printers and the files they need. Hosted by okafor and reyes.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#write\">New topic</a></div>\n      </header>\n      <div>\n        <ul class=\"ds-tabs\" data-component=\"tabs\">\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab is-current\" href=\"#board\">All topics</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#board\">Unanswered</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#board\">My topics</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#board\">Kept by the hosts</a></li>\n        </ul>\n        <div class=\"ds-sheet\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th class=\"ds-table__head\">Topic</th><th class=\"ds-table__head\">Started by</th><th class=\"ds-table__head ds-table__head--num\">Replies</th><th class=\"ds-table__head\">Last message</th></tr>\n            </thead>\n            <tbody>\n              <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M5 7V5a3 3 0 0 1 6 0v2h1v7H4V7z M6.5 7h3V5a1.5 1.5 0 0 0-3 0z\"/></svg></span> <a class=\"ds-link ds-link--strong\" href=\"#topic\">Read first: how to ask about a driver</a></td><td class=\"ds-table__cell\">reyes</td><td class=\"ds-table__cell ds-table__cell--num\">0</td><td class=\"ds-table__cell\">2 Feb, reyes</td></tr>\n              <tr class=\"ds-table__row is-selected\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link\" href=\"#topic\">Sound card silent after the update</a></td><td class=\"ds-table__cell\">okafor</td><td class=\"ds-table__cell ds-table__cell--num\">12</td><td class=\"ds-table__cell\">21:38, okafor</td></tr>\n              <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link\" href=\"#topic\">Which modem string for a noisy line?</a> <span class=\"ds-badge\">new</span></td><td class=\"ds-table__cell\">lindqvist</td><td class=\"ds-table__cell ds-table__cell--num\">3</td><td class=\"ds-table__cell\">21:31, abara</td></tr>\n              <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link is-visited\" href=\"#topic\">Printer prints one line and stops</a></td><td class=\"ds-table__cell\">tanaka</td><td class=\"ds-table__cell ds-table__cell--num\">7</td><td class=\"ds-table__cell\">19:05, reyes</td></tr>\n              <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link\" href=\"#topic\">Second hard disk not found at start</a> <span class=\"ds-badge ds-badge--success\">solved</span></td><td class=\"ds-table__cell\">abara</td><td class=\"ds-table__cell ds-table__cell--num\">21</td><td class=\"ds-table__cell\">18:44, abara</td></tr>\n              <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link is-visited\" href=\"#topic\">Monitor hums at 800 by 600</a></td><td class=\"ds-table__cell\">marlowe</td><td class=\"ds-table__cell ds-table__cell--num\">4</td><td class=\"ds-table__cell\">Yesterday, okafor</td></tr>\n              <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 2h14v9H7l-4 3v-3H1z M2 3v7h2v2l2.6-2H14V3z\"/></svg></span> <a class=\"ds-link\" href=\"#topic\">Scanner asks for a card I do not have</a> <span class=\"ds-badge ds-badge--warning\">waiting</span></td><td class=\"ds-table__cell\">novak</td><td class=\"ds-table__cell ds-table__cell--num\">1</td><td class=\"ds-table__cell\">Yesterday, novak</td></tr>\n              <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M5 7V5a3 3 0 0 1 6 0v2h1v7H4V7z M6.5 7h3V5a1.5 1.5 0 0 0-3 0z\"/></svg></span> <a class=\"ds-link is-visited\" href=\"#topic\">Where to send the serial cable</a> <span class=\"ds-badge ds-badge--danger\">closed</span></td><td class=\"ds-table__cell\">guest</td><td class=\"ds-table__cell ds-table__cell--num\">2</td><td class=\"ds-table__cell\">11 Mar, reyes</td></tr>\n              <tr class=\"ds-table__row\"><td class=\"ds-table__cell ds-table__cell--group\" colspan=\"2\">Topics 1 to 8 of 1,204</td><td class=\"ds-table__cell ds-table__cell--group ds-table__cell--num\">50</td><td class=\"ds-table__cell ds-table__cell--group\">replies on this page</td></tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n      <div class=\"ds-find\">\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li class=\"ds-pagination__label\">Page</li>\n          <li><a class=\"ds-pagination__link is-disabled\" href=\"#board\">Previous</a></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#board\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#board\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#board\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#board\">151</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#board\">Next</a></li>\n        </ul>\n        <span class=\"ds-find__fill\"></span>\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">new</span>\n          <span class=\"ds-badge ds-badge--success\">solved</span>\n          <span class=\"ds-badge ds-badge--warning\">waiting</span>\n          <span class=\"ds-badge ds-badge--danger\">closed</span>\n          <span class=\"ds-badge ds-badge--count\">(4 marks)</span>\n        </div>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"topic\">\n    <div class=\"ds-stack\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Lobby</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">Hardware and drivers</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Topic 4127</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__text\">\n          <h1 class=\"ds-page-header__title\">Sound card silent after the update</h1>\n          <p class=\"ds-page-header__lead\">12 replies, 3 people in this topic now. <span class=\"ds-badge\">new</span></p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#write\">Reply</a></div>\n      </header>\n      <div class=\"ds-posts\">\n        <article class=\"ds-post\">\n          <div class=\"ds-post__who\"><span class=\"ds-post__name\">okafor</span><span class=\"ds-post__role\">Host, 1,402 messages</span></div>\n          <div class=\"ds-post__body\">\n            <p class=\"ds-post__head\"><span>Saturday 14 March 1998, 19:02</span><span>Message 1 of 13</span></p>\n            <div class=\"ds-prose\" data-component=\"typography\">\n              <h1>No sound since the driver update</h1>\n              <p class=\"ds-prose__lead\">The mixer opens, the bars move, and the speakers stay quiet.</p>\n              <p>I put in the new driver disk on Friday. The card is found at start and nothing is marked with a warning, but no program makes a sound. The line <code>SET BLASTER=A220 I5 D1</code> is still in the start file.</p>\n              <h2>What I have tried</h2>\n              <ul>\n                <li>Taking the card out and putting it in the next slot</li>\n                <li>The old driver, from the disk that came in the box</li>\n                <li>Another pair of speakers</li>\n              </ul>\n              <h3>What the machine is</h3>\n              <p>A 166 with 32 MB, <strong>one</strong> sound card and a modem that wants the same interrupt.</p>\n            </div>\n          </div>\n        </article>\n        <article class=\"ds-post\">\n          <div class=\"ds-post__who\"><span class=\"ds-post__name\">reyes</span><span class=\"ds-post__role\">Host, 3,077 messages</span></div>\n          <div class=\"ds-post__body\">\n            <p class=\"ds-post__head\"><span>Saturday 14 March 1998, 19:20</span><span>Message 2 of 13</span></p>\n            <p class=\"ds-post__text\">That last line is your answer. Move the modem to interrupt 3 and the card will speak again.</p>\n            <p class=\"ds-links ds-post__text\" data-component=\"links\">\n              See <a class=\"ds-link\" href=\"#board\">the list of free interrupts</a>,\n              <a class=\"ds-link is-visited\" href=\"#board\">a topic you have read</a>,\n              <a class=\"ds-link is-hover\" href=\"#board\">a link under the pointer</a>,\n              <a class=\"ds-link is-active\" href=\"#board\">a link as you click it</a> and\n              <a class=\"ds-link ds-link--quiet\" href=\"#members\">who the hosts are</a>.\n            </p>\n          </div>\n        </article>\n        <article class=\"ds-post\">\n          <p class=\"ds-post__event\">* lindqvist has come into the topic (21:30)</p>\n          <div class=\"ds-post__who\"><span class=\"ds-post__name\">lindqvist</span><span class=\"ds-post__role\">Member, 58 messages</span></div>\n          <div class=\"ds-post__body\">\n            <p class=\"ds-post__head\"><span>Saturday 14 March 1998, 21:33</span><span>Message 13 of 13</span></p>\n            <p class=\"ds-post__text\">Same card here, same cure. It took ten minutes and one jumper.</p>\n          </div>\n        </article>\n      </div>\n      <div class=\"ds-find\">\n        <label class=\"ds-form__label\" for=\"say\">Say:</label>\n        <span class=\"ds-find__fill\"><input class=\"ds-form__input ds-form__input--wide\" id=\"say\" type=\"text\" value=\"Thank you both, it sings again.\"></span>\n        <a class=\"ds-button\" href=\"#topic\">Send</a>\n        <a class=\"ds-button ds-button--secondary\" href=\"#write\">Long reply</a>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"write\">\n    <div class=\"ds-stack\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Lobby</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">Hardware and drivers</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">New message</li>\n      </ol>\n      <div class=\"ds-notices\" data-component=\"notice\">\n        <p class=\"ds-notice\"><span class=\"ds-notice__label\">Tip:</span> say which card, which driver and what you have tried. Topics with those three get answered first.</p>\n        <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__label\">Not sent:</span> the message has no subject. Give it one and send again.</p>\n      </div>\n      <section class=\"ds-panel\">\n        <h1 class=\"ds-panel__title\">New message to Hardware and drivers</h1>\n        <div class=\"ds-panel__body\">\n          <form class=\"ds-form\" data-component=\"form\" action=\"#write\">\n            <label class=\"ds-form__label\" for=\"w-name\">Your name:</label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input\" id=\"w-name\" type=\"text\" value=\"marlowe\"></div>\n            <label class=\"ds-form__label\" for=\"w-board\">Board:</label>\n            <div class=\"ds-form__field\">\n              <select class=\"ds-form__select\" id=\"w-board\"><option>Hardware and drivers</option><option>Getting online</option><option>Home pages</option></select>\n            </div>\n            <label class=\"ds-form__label\" for=\"w-subject\">Subject:</label>\n            <div class=\"ds-form__field\">\n              <input class=\"ds-form__input ds-form__input--wide\" id=\"w-subject\" type=\"text\" value=\"\">\n              <span class=\"ds-form__error\">A message needs a subject of at least four letters.</span>\n            </div>\n            <label class=\"ds-form__label\" for=\"w-text\">Message:</label>\n            <div class=\"ds-form__field\">\n              <textarea class=\"ds-form__textarea\" id=\"w-text\" rows=\"5\">The monitor hums when the screen is set to 800 by 600 and is quiet at 640 by 480.</textarea>\n              <span class=\"ds-form__hint\">Plain text. Lines are wrapped at 72 letters.</span>\n            </div>\n            <span class=\"ds-form__label\">Options:</span>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__option\"><input class=\"ds-form__check\" type=\"checkbox\" checked>Send replies to my mailbox</label>\n              <label class=\"ds-form__option\"><input class=\"ds-form__check\" type=\"checkbox\">Add my signature</label>\n            </div>\n            <div class=\"ds-form__actions ds-buttons\" data-component=\"buttons\">\n              <button class=\"ds-button ds-button--danger\" type=\"button\">Discard</button>\n              <span class=\"ds-find__fill\"></span>\n              <button class=\"ds-button ds-button--secondary\" type=\"button\" disabled>Attach a file</button>\n              <a class=\"ds-button ds-button--secondary\" href=\"#topic\">Preview</a>\n              <a class=\"ds-button\" href=\"#board\">Send message</a>\n            </div>\n          </form>\n        </div>\n      </section>\n      <div class=\"ds-split\">\n        <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-title\">\n          <h2 class=\"ds-dialog__title\" id=\"dlg-title\">Discard message<span class=\"ds-window__controls\" aria-hidden=\"true\"><span class=\"ds-window__ctl ds-window__ctl--close\"></span></span></h2>\n          <div class=\"ds-dialog__content\">\n            <span class=\"ds-icon ds-icon--large\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1l7 13H1z M7 6h2v4H7z M7 11h2v2H7z\"/></svg></span>\n            <p class=\"ds-dialog__body\">Throw away this message? What you have written will be lost.</p>\n          </div>\n          <div class=\"ds-dialog__actions\">\n            <a class=\"ds-button\" href=\"#write\">Keep writing</a>\n            <a class=\"ds-button ds-button--danger\" href=\"#board\">Discard</a>\n          </div>\n        </div>\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Before you send</h2>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">Look for the question first: <a class=\"ds-link\" href=\"#board\">search this board</a>.</span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">One topic, one question.</span></li>\n              <li class=\"ds-list__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1z M7 4h2v2H7z M7 7h2v5H7z\"/></svg></span><span class=\"ds-list__text\">Come back and say what cured it.</span></li>\n            </ul>\n          </div>\n        </section>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"members\">\n    <div class=\"ds-stack\">\n      <ol class=\"ds-breadcrumb\">\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Lobby</a></li>\n        <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">People</a></li>\n        <li class=\"ds-breadcrumb__item is-current\">Members</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__text\">\n          <h1 class=\"ds-page-header__title\">Members</h1>\n          <p class=\"ds-page-header__lead\">2,318 names, 14 of them here now. Yours is marlowe.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#write\">Write to a host</a></div>\n      </header>\n      <div class=\"ds-split\">\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Your card</h2>\n          <div class=\"ds-panel__body\">\n            <dl class=\"ds-props\">\n              <dt class=\"ds-props__label\">Name</dt><dd class=\"ds-props__value\"><strong>marlowe</strong></dd>\n              <dt class=\"ds-props__label\">Member since</dt><dd class=\"ds-props__value\">9 November 1997</dd>\n              <dt class=\"ds-props__label\">Messages</dt><dd class=\"ds-props__value\">212</dd>\n              <dt class=\"ds-props__label\">Standing</dt><dd class=\"ds-props__value\"><span class=\"ds-badge ds-badge--success\">in good standing</span></dd>\n              <dt class=\"ds-props__label\">Time online</dt><dd class=\"ds-props__value\"><span class=\"ds-progress\"><span class=\"ds-progress__block\"></span><span class=\"ds-progress__block\"></span><span class=\"ds-progress__block\"></span><span class=\"ds-progress__block\"></span><span class=\"ds-progress__block\"></span><span class=\"ds-progress__block ds-progress__block--empty\"></span><span class=\"ds-progress__block ds-progress__block--empty\"></span><span class=\"ds-progress__block ds-progress__block--empty\"></span></span> 12 of 20 hours</dd>\n            </dl>\n          </div>\n        </section>\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Private messages</h2>\n          <div class=\"ds-empty\" data-component=\"empty\">\n            <span class=\"ds-icon ds-icon--large\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M1 3h14v10H1z M2.6 4L8 8.4 13.4 4z M2 5v7h12V5L8 9.8z\"/></svg></span>\n            <h3 class=\"ds-empty__title\">No private messages</h3>\n            <p class=\"ds-empty__text\">Nobody has written to you since your last visit.</p>\n            <a class=\"ds-button ds-button--secondary\" href=\"#write\">Write one</a>\n          </div>\n        </section>\n      </div>\n      <table class=\"ds-table\">\n        <thead>\n          <tr><th class=\"ds-table__head\">Name</th><th class=\"ds-table__head\">Member since</th><th class=\"ds-table__head ds-table__head--num\">Messages</th><th class=\"ds-table__head\">Now</th></tr>\n        </thead>\n        <tbody>\n          <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1l2 5h5l-4 3 1.5 5L8 11l-4.5 3L5 9 1 6h5z\"/></svg></span> <a class=\"ds-link ds-link--strong\" href=\"#members\">reyes</a></td><td class=\"ds-table__cell\">March 1996</td><td class=\"ds-table__cell ds-table__cell--num\">3,077</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--success\">here</span></td></tr>\n          <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1l2 5h5l-4 3 1.5 5L8 11l-4.5 3L5 9 1 6h5z\"/></svg></span> <a class=\"ds-link ds-link--strong\" href=\"#members\">okafor</a></td><td class=\"ds-table__cell\">June 1996</td><td class=\"ds-table__cell ds-table__cell--num\">1,402</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--success\">here</span></td></tr>\n          <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span> <a class=\"ds-link\" href=\"#members\">abara</a></td><td class=\"ds-table__cell\">January 1997</td><td class=\"ds-table__cell ds-table__cell--num\">640</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--warning\">away</span></td></tr>\n          <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span> <a class=\"ds-link\" href=\"#members\">marlowe</a></td><td class=\"ds-table__cell\">November 1997</td><td class=\"ds-table__cell ds-table__cell--num\">212</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--success\">here</span></td></tr>\n          <tr class=\"ds-table__row\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span> <a class=\"ds-link\" href=\"#members\">lindqvist</a></td><td class=\"ds-table__cell\">February 1998</td><td class=\"ds-table__cell ds-table__cell--num\">58</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--success\">here</span></td></tr>\n          <tr class=\"ds-table__row ds-table__row--alt\"><td class=\"ds-table__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span> <a class=\"ds-link is-visited\" href=\"#members\">novak</a></td><td class=\"ds-table__cell\">March 1998</td><td class=\"ds-table__cell ds-table__cell--num\">3</td><td class=\"ds-table__cell\"><span class=\"ds-badge ds-badge--danger\">barred</span></td></tr>\n        </tbody>\n      </table>\n    </div>\n  </section>\n\n  </div>\n\n  <div class=\"ds-page__rail\">\n    <h2 class=\"ds-panel__title\">Who is here (14)</h2>\n    <ul class=\"ds-nicks\">\n      <li class=\"ds-nicks__group\">Hosts</li>\n      <li class=\"ds-nicks__item ds-nicks__item--host\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1l2 5h5l-4 3 1.5 5L8 11l-4.5 3L5 9 1 6h5z\"/></svg></span>reyes</li>\n      <li class=\"ds-nicks__item ds-nicks__item--host\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 1l2 5h5l-4 3 1.5 5L8 11l-4.5 3L5 9 1 6h5z\"/></svg></span>okafor</li>\n      <li class=\"ds-nicks__group\">Members</li>\n      <li class=\"ds-nicks__item is-selected\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>marlowe</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>lindqvist</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>tanaka</li>\n      <li class=\"ds-nicks__item ds-nicks__item--away\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>abara (away)</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>petrov</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>hale</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>imani</li>\n      <li class=\"ds-nicks__item ds-nicks__item--away\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>costa (away)</li>\n      <li class=\"ds-nicks__group\">Guests</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>guest 0417</li>\n      <li class=\"ds-nicks__item\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M8 2a3 3 0 1 0 0 6a3 3 0 0 0 0-6z M3 14c0-3 2-5 5-5s5 2 5 5z\"/></svg></span>guest 0420</li>\n    </ul>\n    <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n      <h2 class=\"ds-sidebar__title\">Shortcuts</h2>\n      <ul class=\"ds-sidebar__list\">\n        <li><a class=\"ds-link\" href=\"#write\">Start a topic</a></li>\n        <li><a class=\"ds-link\" href=\"#board\">Topics without a reply</a></li>\n        <li><a class=\"ds-link is-visited\" href=\"#members\">Your card</a></li>\n        <li><a class=\"ds-link\" href=\"#home\">Message of the day</a></li>\n      </ul>\n    </aside>\n  </div>\n  </div>\n\n  <footer class=\"ds-footer\" data-component=\"footer\">\n    <ul class=\"ds-status\">\n      <li class=\"ds-status__cell ds-status__cell--wide\">chronoskin Boards, 1998. <a class=\"ds-link ds-link--quiet\" href=\"#home\">Lobby</a>, <a class=\"ds-link ds-link--quiet\" href=\"#board\">boards</a>, <a class=\"ds-link ds-link--quiet\" href=\"#members\">members</a> and <a class=\"ds-link ds-link--quiet\" href=\"#home\">house rules</a>.</li>\n      <li class=\"ds-status__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M5.5 3a2.5 2.5 0 1 0 0 5a2.5 2.5 0 0 0 0-5z M11 4a2 2 0 1 0 0 4a2 2 0 0 0 0-4z M1 14c0-3 2-5 4.5-5S10 11 10 14z M11 9c2.2 0 4 1.8 4 5h-4c0-2-.6-3.6-1.6-4.6.5-.3 1-.4 1.6-.4z\"/></svg></span> 14 here</li>\n      <li class=\"ds-status__cell\"><span class=\"ds-icon\"><svg viewBox=\"0 0 16 16\" fill=\"currentColor\" fill-rule=\"evenodd\" aria-hidden=\"true\"><path d=\"M5 7V5a3 3 0 0 1 6 0v2h1v7H4V7z M6.5 7h3V5a1.5 1.5 0 0 0-3 0z\"/></svg></span> marlowe</li>\n    </ul>\n  </footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.windows-9x.forum.s07.p03.t04.u08\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"windows-9x\",\n    \"years\": [\n      1995,\n      2001\n    ]\n  },\n  \"archetype\": \"forum\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 800,\n    \"fluid\": false\n  },\n  \"source\": \"https://chrono.skin/s/v1-w9-7348\",\n  \"short\": \"v1-w9-7348\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #2a2a2a;\n  --color-canvas: #000000;\n  --color-surface: #000000;\n  --color-surface-alt: #1c1c1c;\n  --color-surface-strong: #383838;\n  --color-bar: #800080;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #000000;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #ffffff;\n  --color-inverse-text: #000000;\n  --color-text: #ffffff;\n  --color-text-muted: #c0c0c0;\n  --color-heading: #ffff00;\n  --color-heading-alt: #00ffff;\n  --color-link: #ffff00;\n  --color-link-quiet: #ffffff;\n  --color-link-visited: #ff80ff;\n  --color-link-hover: #00ff00;\n  --color-link-active: #ff8000;\n  --color-border: #808080;\n  --color-border-strong: #ffffff;\n  --color-border-muted: #c0c0c0;\n  --color-accent: #ffff00;\n  --color-accent-text: #000000;\n  --color-accent-alt: #00ff00;\n  --color-fill-1: #000080;\n  --color-fill-2: #004a4a;\n  --color-fill-3: #4a004a;\n  --color-fill-4: #4a3a00;\n  --color-button: #000000;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffff00;\n  --color-button-secondary: #383838;\n  --color-button-secondary-text: #ffffff;\n  --color-input: #000000;\n  --color-input-text: #ffffff;\n  --color-input-border: #ffffff;\n  --color-disabled: #1c1c1c;\n  --color-disabled-text: #808080;\n  --color-danger: #ff5050;\n  --color-danger-surface: #2a0000;\n  --color-success: #00ff00;\n  --color-warning: #ffb000;\n  --color-notice: #000080;\n  --color-notice-text: #ffffff;\n  --color-focus: #ffff00;\n  --color-shadow: #808080;\n  --color-overlay: rgba(255, 255, 255, 0.25);\n}\n\n/* @part type */\n:root {\n  --font-body: \"Lucida Sans Unicode\", \"Lucida Grande\", \"Lucida Sans\", Geneva, sans-serif;\n  --font-heading: \"Arial Black\", \"Arial Bold\", Arial, Helvetica, sans-serif;\n  --font-ui: \"Lucida Sans Unicode\", \"Lucida Grande\", \"Lucida Sans\", Geneva, sans-serif;\n  --font-mono: \"Lucida Console\", \"Courier New\", monospace;\n  --text-base: 11px;\n  --text-small: 10px;\n  --text-ui: 11px;\n  --text-large: 12px;\n  --text-display: 20px;\n  --text-h1: 15px;\n  --text-h2: 12px;\n  --text-h3: 11px;\n  --line-body: 1.45;\n  --line-heading: 1.25;\n  --line-display: 1.15;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 900;\n  --weight-display: 900;\n  --weight-ui: 400;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 3px;\n  --border-style: solid;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: inset 0 0 0 1px var(--color-border-strong), inset 0 2px 0 0 color-mix(in srgb, var(--color-border-muted) 70%, white), inset 0 -3px 0 0 color-mix(in srgb, var(--color-shadow) 30%, transparent), 4px 4px 0 0 color-mix(in srgb, var(--color-shadow) 50%, transparent);\n  --shadow-control: inset 0 0 0 1px var(--color-border-strong), inset 0 2px 0 0 color-mix(in srgb, var(--color-border-muted) 70%, white), inset 0 -3px 0 0 color-mix(in srgb, var(--color-shadow) 30%, transparent);\n  --shadow-control-hover: inset 0 0 0 1px var(--color-border-strong), inset 0 2px 0 0 var(--color-accent), inset 0 -3px 0 0 color-mix(in srgb, var(--color-shadow) 30%, transparent);\n  --shadow-control-pressed: inset 0 0 0 1px var(--color-border-strong), inset 0 3px 0 0 color-mix(in srgb, var(--color-shadow) 35%, transparent), inset 0 -2px 0 0 color-mix(in srgb, var(--color-border-muted) 45%, transparent);\n  --shadow-dialog: inset 0 0 0 1px var(--color-border-strong), inset 0 0 0 3px var(--color-accent), 6px 6px 0 0 color-mix(in srgb, var(--color-shadow) 50%, transparent);\n  --shadow-text: none;\n  --fill-page: linear-gradient(color-mix(in srgb, var(--color-page), white 10%) 1px, transparent 1px) 0 0 / 16px 16px, linear-gradient(90deg, color-mix(in srgb, var(--color-page), white 10%) 1px, transparent 1px) 0 0 / 16px 16px, var(--color-page);\n  --fill-bar: linear-gradient(180deg, color-mix(in srgb, var(--color-bar), white 32%), var(--color-bar) 48%, color-mix(in srgb, var(--color-bar), black 28%));\n  --fill-bar-alt: linear-gradient(180deg, color-mix(in srgb, var(--color-bar-alt), white 12%), color-mix(in srgb, var(--color-bar-alt), black 12%));\n  --fill-inverse: repeating-linear-gradient(0deg, var(--color-inverse) 0 2px, color-mix(in srgb, var(--color-inverse), black 7%) 2px 3px);\n  --fill-accent: linear-gradient(180deg, color-mix(in srgb, var(--color-accent), white 35%), var(--color-accent) 60%);\n  --fill-panel: var(--color-canvas);\n  --fill-button: linear-gradient(180deg, color-mix(in srgb, var(--color-button), white 18%), var(--color-button) 50%, color-mix(in srgb, var(--color-button), black 16%));\n  --fill-button-hover: linear-gradient(180deg, color-mix(in srgb, var(--color-button), white 32%), color-mix(in srgb, var(--color-button), white 8%));\n  --fill-button-secondary: linear-gradient(180deg, color-mix(in srgb, var(--color-button-secondary), white 18%), var(--color-button-secondary) 50%, color-mix(in srgb, var(--color-button-secondary), black 16%));\n  --fill-input: var(--color-input);\n  --focus-ring: 1px solid var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
