{
  "id": "v1-br-2222-dr",
  "long_id": "v1.brutalism.blog.s02.p02.t02.u02.dr",
  "name": "Web brutalism, link list",
  "era": {
    "slug": "brutalism",
    "code": "br",
    "name": "Web brutalism",
    "years": [
      2014,
      2019
    ],
    "description": "The reaction to polish, 2014 to 2019: raw default-looking pages, system and monospace type, hard black rules, harsh or absent colour, and layouts that show their structure instead of hiding it."
  },
  "archetype": "blog",
  "mode": "pure",
  "viewport": {
    "width": 1440,
    "fluid": true
  },
  "density": "roomy",
  "summary": "The reader-sorted link list of web brutalism, as kept between 2014 and 2019 by small communities that wanted a front page to be nothing but titles: one filled line of navigation, then numbered two-line rows in small grey Helvetica in a column that keeps a margin of empty window at both sides, with one pale blue line of navigation, dark blue links and a red word here and there. Nothing is rounded, shadowed, graded or animated, there are no pictures and no cards; structure comes from the numbers, from dotted hairlines and from grey 11px meta lines under blue titles. It was the look of link aggregators, bookmark logs and the comment sites built by programmers for themselves.",
  "url": "https://chrono.skin/s/v1-br-2222-dr",
  "preview_url": "https://chrono.skin/s/v1-br-2222-dr/specimen.html",
  "files": {
    "STYLE.md": "# Web brutalism, link list\n\n## Summary\n\nThe reader-sorted link list of web brutalism, as kept between 2014 and 2019 by small communities that wanted a front page to be nothing but titles: one filled line of navigation, then numbered two-line rows in small grey Helvetica in a column that keeps a margin of empty window at both sides, with one pale blue line of navigation, dark blue links and a red word here and there. Nothing is rounded, shadowed, graded or animated, there are no pictures and no cards; structure comes from the numbers, from dotted hairlines and from grey 11px meta lines under blue titles. It was the look of link aggregators, bookmark logs and the comment sites built by programmers for themselves.\n\n## Layout\n\n- The page is a sheet: `.ds-page__frame` is `--size-page` (85% of the window) wide, centred, filled with `--color-canvas`, and starts `--space-3` (8px) below the top of the window. `--fill-page` is `--color-surface-alt` (#f7f7f7), so the white sheet stands on a faintly grey page and its margins left and right are seen. The sheet has no border and no maximum width.\n- Order inside the sheet: `.ds-nav` (one filled line, closed by a hairline in `--color-border-strong`), `.ds-page__body` (padding `--space-4` 12px), `.ds-footer`. There is no wordmark above the line and no second navigation row: the brand (a small square mark and the bold site name) opens the line and the account links sit at its right end. The header, the sheet's padding and the footer are written once; the views change between them.\n- The home page opens with `.ds-hero` across the sheet (headline and lead at the left, the two buttons stacked in a `--size-sidebar` column at the right, a hairline below). Under it `.ds-page__columns` holds `.ds-page__main` and, `--space-6` (40px) to its right, `.ds-sidebar` at `--size-sidebar` (220px). The sidebar has no rule and no fill; it is told from the list by its smaller type.\n- The main column is the list: `.ds-list` rows numbered down the page and grouped under `.ds-list__day` lines, then `.ds-pagination` indented to the titles. Rows are `--space-3` (8px) apart and have no rules between them; only the day lines and block captions (`.ds-page__label`) carry a hairline.\n- Blocks below the list are `.ds-page__section`, `--space-5` (20px) apart, each under a small bold `.ds-page__label`. Short blocks go side by side in `.ds-page__pair` (two equal columns, 40px apart) so the sheet is never half empty. `.ds-page__rule` is a hairline across the sheet between unrelated parts.\n- Inner pages (one discussion, the sending form, a member's page, the tags, the rules) keep the same line of navigation and the same footer, in one column: no hero and no sidebar. `.ds-page__body` opens with the `.ds-breadcrumb` in 11px, then `.ds-page-header` (18px title, a grey line of description, one button at the right, a hairline below), then the `.ds-stats` line when there is one, then `.ds-tabs` with the table or list in `.ds-tabs__body`. Everything else goes in a `.ds-page__pair`: the main thing (the comments, the form, the running text, a table) in the left half and the short blocks that belong to it (a dialog, a panel, a small list under a `.ds-page__label`) in the right half, so that the halves end near each other.\n- Views. The specimen is one small site with six views, one showing at a time. `front` is the home page: hero, the numbered list by day with the sidebar, pagination. `thread` is one question and its comments, with the confirmation for deleting a comment and the box for adding one. `send` is the form for sending a link, under the two messages it can answer with, beside the boxed advice. `member` is a member's page: figures, tabs over the table of links sent, latest comments. `tags` is the four busiest tags as blocks, all tags as a table, and the empty state of a tag with no links. `rules` is running text with the marks, a boxed list and further links beside it. A view is `<section class=\"ds-view\" id=\"...\">` holding one `.ds-page__body`; links between views are plain `href=\"#id\"`.\n- Spacing scale: `--space-1` 2px is the vertical padding of the navigation line, buttons, inputs and tabs and the gap between a title and its meta line; `--space-2` 4px is the padding of tags, table cells and the gap between tabs; `--space-3` 8px is the page margin, the gap between rows and between buttons, and the side padding of the navigation line; `--space-4` 12px is the padding of the sheet, panels, notices and grid cells, the gap between paragraphs and between navigation links; `--space-5` 20px is the gap between blocks; `--space-6` 40px is the gap between columns.\n- Fixed sizes: `--size-rank` 36px is the number column of the list, `--size-label` 96px the label column of a form, `--size-field` 380px a text input, `--size-num` 96px a numeric table column, `--size-dialog` 400px a dialog.\n- Below 800px the sheet takes the whole window, the columns and pairs stack, the page header puts its button under the text, form labels sit above their fields, the grid is two columns, the figures of `.ds-stats` are set apart by space with no `|` (a wrapped line never opens with one) and table cells marked `.ds-table__extra` are left out.\n\n## Typography and colour roles\n\n- White on white: `--color-page`, `--color-canvas` and `--color-surface` are #ffffff; `--color-surface-alt` #f7f7f7 is alternate table rows, `--color-surface-strong` #efefef the current tab and page number, tags and inline code.\n- `--color-bar` #ddeeff with `--color-bar-text` #333333 is the pale blue line of navigation, table heads and dialog titles. `--color-bar-alt` (footer) is white with #555555 text. `--color-inverse` #1111aa with white text marks the current navigation item.\n- Text is dark grey, not black: `--color-text` #444444, `--color-heading` #333333, `--color-text-muted` #808080 for meta lines, counts and captions. `--color-heading-alt` #ff0000 is the red of sidebar and panel titles.\n- `--color-link` and `--color-link-quiet` are #1111aa, so a list title, a sidebar link and a link in a meta line are all dark blue and always told from the grey text and counts beside them; `--color-link-visited` is #800080; hover and active are #ff0000.\n- Rules are grey: `--color-border` #aaaaaa under day lines, captions and tabs and around panels; `--color-border-muted` #dddddd between table rows. `--color-border-strong` #8899cc is the blue-grey hairline under the navigation, hero and page header, above each grid column and the footer and around notices and dialogs.\n- `--color-accent` #ddffaa with `--color-accent-text` #333333 is the count badge and, as `--color-button`, the pale green primary button; `--color-accent-alt` #ff0000 is only a mark (the asterisk of \"new\").\n- Fills are the three pale tints and a grey: `--color-fill-1` #ddeeff, `--color-fill-2` #ddffaa, `--color-fill-3` #ffffaa, `--color-fill-4` #f7f7f7; `--color-notice` is #ffffaa. `--color-text` is readable on all of them. The secondary button, inputs and `--color-danger-surface` are white.\n- Status: `--color-danger` #cc0000, `--color-success` #2a7a00, `--color-warning` #9a5b00. The references have a red but no green or amber text; these two are derived, dark enough to read on white.\n- One family: `--font-body`, `--font-heading` and `--font-ui` are Helvetica, Arial, sans-serif; `--font-mono` is Monaco, \"Courier New\", monospace, for inline code only.\n- Small and even: `--text-base` and `--text-ui` 13px with `--line-body` 1.4 is titles, running text, navigation and controls; `--text-small` 11px is meta lines, site names, tags, captions, the sidebar, the breadcrumb and the footer; `--text-large` 16px is the hero's lead and the figures of the stats line. Headings are bold and barely larger than the text: `--text-h1` 18px (page header, article title), `--text-h2` 16px, `--text-h3` 13px; `--text-display` 28px at regular weight (`--weight-display` 400) is the hero headline and the largest text on a page.\n- Links in running text are underlined (`--link-decoration` underline) and must stay so, because other palettes of the era give them the colour of the text. List titles, navigation, tabs, sidebar, meta, breadcrumb and footer links are bare (`--link-decoration-quiet` none) and gain the underline on hover. Current navigation items, tabs and page numbers are `<span>`, not links.\n- Nothing is uppercased or tracked; `--weight-ui` is 400, so only the brand name and headings are bold.\n- Hairlines only: `--border-width` and `--border-width-strong` are both 1px and `--border-style` is dotted, so every rule and box is a 1px dotted line and emphasis comes from the colour of the strong border, not its weight. Buttons, inputs and the brand mark follow it too: their edge in `--color-input-border` is `--border-width` in `--border-style`, a dotted hairline here. Their fills, not their edges, tell them from the text around them.\n- All radii are 0, all shadows `none`, every fill is its plain palette colour; `--focus-ring` is a 1px solid outline; `--transition` none.\n- Each text token is used only on its own fill: `--color-bar-text` on `--fill-bar`, `--color-bar-alt-text` on `--fill-bar-alt`, `--color-inverse-text` on `--fill-inverse`, `--color-accent-text` on `--fill-accent`, `--color-button-text` on `--fill-button`, `--color-notice-text` on `--color-notice`, `--color-danger` on `--color-danger-surface` or the sheet, `--color-text` and the muted and heading colours on the canvas, the surfaces and the four fills. Keep to this so that other palettes work with the same structure.\n\nSpacing is roomy: every `--space-*` token of the layout was multiplied by 1.25. Where the Layout section names a spacing in pixels, the tokens are right.\n\n## Components\n\n- `.ds-page` on `<body>`: page colour, 8px top margin and base type. Each page is one `.ds-page__frame` (the sheet; `--last` drops the gap below it) holding the navigation, `.ds-page__body` and the footer. `.ds-page__columns` with `.ds-page__main` first is the home page's list and sidebar; `.ds-page__pair` sets two blocks side by side; `.ds-page__section` is a block (`--last` drops its bottom gap), `.ds-page__label` its small bold caption on a hairline, `.ds-page__rule` a hairline across the sheet.\n- `.ds-nav`: the one filled line at the top of the sheet. The `.ds-brand` comes first; `.ds-nav__list` holds `.ds-nav__item` entries, each one `.ds-nav__link`, separated by 12px of space and nothing else. `.ds-nav__item--end` pushes itself and the items after it to the right end (account, log out). The current page is an inverted block: the stylesheet marks the link whose `href` names the view that is showing (one selector per view, and the home link when the address names none); on a page of its own, give the link `is-current`.\n- `.ds-brand`: the site's mark and name, a link to the front page, the first thing on the navigation line. `.ds-brand__mark` is a small plain ruled square (1.2 times `--text-ui`, about 16px, so the line stays one line tall), dressed like the push button: `--fill-button`, the same hairline edge in `--color-input-border`, the mark drawn in `--color-button-text` with square line caps; no radius and no shadow beyond what the tokens give. `.ds-brand__name` is bold 13px in `--color-bar-text`, because it stands on `--fill-bar`. The name `chronoskin` and the mark are placeholders for the installing project's own name and logo.\n- `.ds-breadcrumb`: an 11px line of `.ds-breadcrumb__link` items with `.ds-breadcrumb__sep` (`/`) between them, ending in `.ds-breadcrumb__current`, the first thing in the body of an inner page.\n- `.ds-hero`: the introduction of the home page. `.ds-hero__copy` holds `.ds-hero__title` (28px, regular weight) and one `.ds-hero__lead` paragraph at 16px; `.ds-hero__actions` at the right stacks one primary and one secondary button, both as wide as the sidebar, over a grey `.ds-hero__note`. No fill, no box, no centring; a hairline closes it.\n- `.ds-page-header`: the head of an inner page, instead of the hero: `.ds-page-header__main` with `.ds-page-header__title` (18px) and one grey `.ds-page-header__text` line; `.ds-page-header__action` at the right holds one button. A hairline closes it.\n- `.ds-stat`: one figure: a bold 16px `.ds-stat__value` followed on the same line by a grey `.ds-stat__label`. Three to five sit in a `.ds-stats` line, cut by `|` that the stylesheet draws. A line of text, never boxes.\n- `.ds-prose`: running text, at most 84 characters wide: h1, h2, h3, paragraphs, square-bulleted and numbered lists, `code` in 11px monospace on `--color-surface-strong`, `blockquote` behind a hairline in grey. `.ds-prose__meta` is the grey 11px line under a title.\n- `.ds-link`: text link with `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-link--quiet` is for meta and tool links; `.ds-link--strong` is bold. `.ds-links` lays links out in a wrapping row.\n- `.ds-button`: a flat square push button, 13px, with a hairline edge in `--border-style`; a `<button>`, or an `<a>` when it only leads to another page. `.ds-button--secondary` is the same on the secondary fill. `.ds-button--danger` is the destructive action: `--color-danger` text and edge on `--color-danger-surface`. `disabled` or `is-disabled` greys it; `is-hover` underlines the label; `is-active` takes the strong border colour. Group with `.ds-buttons`.\n- `.ds-form`: a form with no box: `.ds-form__title`, rows (`.ds-form__row`) of a grey lowercase `.ds-form__label` and a `.ds-form__field`. Controls take `.ds-form__input` (`--wide` fills the field, for textareas; `--auto` for selects); `is-invalid` plus `.ds-form__error` marks a validation error; `.ds-form__hint` is help text; `.ds-form__check` with a native `.ds-form__checkbox`; `.ds-form__actions` lines the buttons up with the fields (`--flush` when the form has no label column).\n- `.ds-table`: a data table with no upright rules: bold `th` on the bar fill, rows on 1px `--color-border-muted` hairlines, `.ds-table__row--alt` for alternate rows, `.ds-table__num` for right-aligned numeric columns, `.ds-table__group` for a group row, `.ds-table__sub` for a grey 11px note inside a cell, `.ds-table__extra` on the cells of a column that a narrow window leaves out.\n- `.ds-list`: the numbered link list, an `<ol>`. `.ds-list__day` is a bold 11px date line on a hairline that opens a group. Each `.ds-list__item` has a right-aligned grey `.ds-list__rank` and a `.ds-list__body`: first line the `.ds-list__title` link at body size and weight, a grey `.ds-list__site` in brackets and any tags; an optional `.ds-list__excerpt`; then the grey `.ds-list__meta` line with quiet links cut by `|`. No rules between rows. Comments use the same rows without a rank: the meta line first, the text under it, and `.ds-list__item--reply` to hang a reply one number column in.\n- `.ds-panel`: a 1px hairline box with a bold `.ds-panel__title` as its first line (no title strip) and a `.ds-panel__body`. Use it for an aside next to a form; the list itself is never boxed.\n- `.ds-grid`: four columns of `.ds-grid__cell`, 12px apart, each hanging from a hairline in `--color-border-strong` (`--2`, `--3`, `--4` select the other fills), with `.ds-grid__title`, `.ds-grid__text` and a grey `.ds-grid__meta` line. No side or bottom borders.\n- `.ds-tabs`: a line of `.ds-tabs__item`, each holding a `.ds-tabs__tab` link in the quiet link colour, standing on a hairline. The current one is a `<span class=\"ds-tabs__tab is-current\">`: bold text on a `--color-surface-strong` block. Content goes in `.ds-tabs__body`.\n- `.ds-badge`: a count: bold 11px on the accent fill, square. `.ds-badge--alt` is a word with an asterisk in `--color-accent-alt` before it (\"new\"); `.ds-badge--tag` is a word in a hairline box on `--color-surface-strong`. Status labels are `.ds-badge--success`, `.ds-badge--warning` and `.ds-badge--danger`: a lowercase word in the status colour behind a small square that the stylesheet draws. No pill, no icon.\n- `.ds-sidebar`: the narrow right column of the home page, in 11px. Each `.ds-sidebar__block` has a `.ds-sidebar__title` on a hairline and a `.ds-sidebar__list` of `.ds-sidebar__row` lines: a `.ds-sidebar__link` at the left and an optional `.ds-sidebar__count` at the right. `.ds-sidebar__text` is a grey paragraph; `.ds-sidebar__search` is an input with a button.\n- `.ds-notice`: a sentence in a hairline box, starting with a bold `.ds-notice__title`. `.ds-notice--error` uses the danger colour for text and box. Stack several in `.ds-notices`.\n- `.ds-pagination`: a line of `.ds-pagination__link` items, indented to the list titles: newer, numbers, older. The current page is a `<span>` with `is-current`: bold on a `--color-surface-strong` block. `is-disabled` is grey; `--first` drops the left padding of the first word.\n- `.ds-dialog`: a hairline box in the strong border colour, `--size-dialog` wide, with a bold `.ds-dialog__title` on the bar fill, `.ds-dialog__body`, `.ds-dialog__text` and right-aligned `.ds-dialog__actions` (cancel first, the action last). It sits centred on `.ds-dialog__backdrop`, a flat block of `--color-overlay` in the page flow. No shadow, no dimming of the page.\n- `.ds-empty`: a grey centred `.ds-empty__text` sentence and one secondary button between two hairlines.\n- `.ds-footer`: centred 11px lines under a hairline in the strong border colour: `.ds-footer__links` of `.ds-footer__item` entries cut by `|`, each a `.ds-footer__link`, then a `.ds-footer__text` sentence.\n\n## Never\n\n- `content-width <= 86%`: the sheet leaves a margin of page colour at both sides.\n- `row-gap <= 15px`: rows of the list sit close; there is no air between them.\n- `block-gap <= 50px`: blocks are a hairline or 20px apart.\n- `letter-spacing <= 0px`: no text is tracked.\n- `font-size <= 28px`: the hero headline is 28px; titles are 18px.\n- `font-size >= 11px`: meta text stops at 11px.\n- `font-families <= 2`: Helvetica and a monospace.\n- `line-height >= 1.3`: small text is set a little open, at 1.4.\n- `line-height <= 1.5`: and no looser.\n- `uppercase-text <= 0%`: nothing is uppercased.\n- `underlined-links <= 40%`: only links inside running text are underlined.\n- `border-radius <= 0px`: every box and control is square.\n- `box-shadow = none`: nothing casts a shadow.\n- `text-shadow = none`: text is flat.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `transition = none`: states change instantly.\n- `animation = none`: nothing moves.\n- `border-width <= 1px`: every line is a hairline.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: a row type copies `.ds-list__item` (a number or date at the left, a title line, a grey 11px meta line, 8px to the next row, no rule), a block gets a `.ds-page__label` caption on a hairline, a boxed aside copies `.ds-panel`, a line of choices copies `.ds-tabs` (bare words, the current one bold on `--color-surface-strong`), a status copies `.ds-badge--success`. Use only the tokens in `tokens.css` and the `--size-*` and `--space-*` tokens in `components.css`, and pair each text token with its own fill as listed above. Keep links in running text on `--link-decoration`, since their colour may equal the text colour. When in doubt do less: a grey line of text before a label, a hairline before a box, and no radius, shadow, gradient, icon or transition at all.\n",
    "components.css": "/* Layout tokens (structure part). Read from the references: a sheet 85% of the\n   window wide, the browser's 8px margin above it, 2px of padding in the\n   header line, 5 to 8px between rows of the link list, 12px between\n   paragraphs and 20px between blocks. */\n:root {\n  --size-page: 85%;\n  --size-sidebar: 220px;\n  --size-rank: 36px;\n  --size-label: 96px;\n  --size-field: 380px;\n  --size-dialog: 400px;\n  --size-num: 96px;\n  --space-1: 3px;\n  --space-2: 5px;\n  --space-3: 10px;\n  --space-4: 15px;\n  --space-5: 25px;\n  --space-6: 50px;\n}\n\n/* ---------- shell: a centred sheet on the page ---------- */\n.ds-page {\n  margin: 0;\n  padding: var(--space-3) 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__frame {\n  box-sizing: border-box;\n  width: var(--size-page);\n  margin: 0 auto var(--space-5);\n  background: var(--color-canvas);\n  border-radius: var(--radius-page);\n}\n.ds-page__frame--last {\n  margin-bottom: 0;\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.ds-page__body {\n  padding: var(--space-4) var(--space-4) var(--space-5);\n}\n.ds-page__columns {\n  display: flex;\n  align-items: flex-start;\n  gap: var(--space-6);\n}\n.ds-page__main {\n  flex: 1;\n  min-width: 0;\n}\n/* Two equal columns for blocks that are too short to fill the sheet. */\n.ds-page__pair {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: var(--space-5) var(--space-6);\n  align-items: start;\n}\n.ds-page__section {\n  margin: 0 0 var(--space-5);\n}\n.ds-page__section--last {\n  margin-bottom: 0;\n}\n/* A block that follows a last block in the same column. */\n.ds-page__section--after {\n  margin-top: var(--space-5);\n}\n/* Small bold caption on a hairline, the head of a block. */\n.ds-page__label {\n  margin: 0 0 var(--space-3);\n  padding: 0 0 var(--space-1);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-heading);\n}\n.ds-page__rule {\n  height: 0;\n  margin: var(--space-5) 0;\n  border-style: var(--border-style);\n  border-color: var(--color-border-strong);\n  border-width: var(--border-width-strong) 0 0;\n}\n\n/* ---------- links ---------- */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--quiet,\n.ds-link--quiet:visited,\n.ds-link--quiet.is-visited {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-link--quiet:hover,\n.ds-link--quiet.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link--strong {\n  font-weight: var(--weight-bold);\n}\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* ---------- brand: the mark on a plain ruled square, then the name ---------- */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-3);\n  color: var(--color-bar-text);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  flex: none;\n  display: block;\n  box-sizing: content-box;\n  width: calc(var(--text-ui) * 1.2);\n  height: calc(var(--text-ui) * 1.2);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background-color: var(--color-button);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-display);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-brand:hover .ds-brand__name,\n.ds-brand.is-hover .ds-brand__name {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-brand:focus-visible,\n.ds-brand.is-focus {\n  outline: var(--focus-ring);\n}\n\n/* ---------- nav: everything on one filled line ---------- */\n.ds-nav {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1) var(--space-4);\n  padding: var(--space-1) var(--space-3);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-shadow: var(--shadow-text);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-nav__list {\n  display: flex;\n  flex-wrap: wrap;\n  flex: 1;\n  align-items: baseline;\n  gap: var(--space-1) var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__item {\n  margin: 0;\n}\n.ds-nav__item--end {\n  margin-left: auto;\n}\n.ds-nav__link {\n  color: var(--color-bar-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n}\n/* The page you are on: an inverted block. One selector per view, and the home\n   link when the address names no view; a discussion belongs to the front page. */\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#front\"],\n.ds-page:has(#front:target) .ds-nav__link[href=\"#front\"],\n.ds-page:has(#thread:target) .ds-nav__link[href=\"#front\"],\n.ds-page:has(#tags:target) .ds-nav__link[href=\"#tags\"],\n.ds-page:has(#rules:target) .ds-nav__link[href=\"#rules\"],\n.ds-page:has(#send:target) .ds-nav__link[href=\"#send\"],\n.ds-page:has(#member:target) .ds-nav__link[href=\"#member\"] {\n  padding: 0 var(--space-2);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  text-decoration: none;\n}\n\n/* ---------- breadcrumb ---------- */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-4);\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n}\n.ds-breadcrumb__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__link:hover,\n.ds-breadcrumb__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-breadcrumb__sep {\n  color: var(--color-text-muted);\n}\n.ds-breadcrumb__current {\n  color: var(--color-text);\n}\n\n/* ---------- hero: words on the left, the two ways in on the right ---------- */\n.ds-hero {\n  display: flex;\n  align-items: center;\n  gap: var(--space-6);\n  margin: 0 0 var(--space-5);\n  padding: var(--space-3) 0 var(--space-5);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-hero__copy {\n  flex: 1;\n  min-width: 0;\n}\n.ds-hero__title {\n  margin: 0 0 var(--space-3);\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  color: var(--color-heading);\n}\n.ds-hero__lead {\n  margin: 0;\n  max-width: 76ch;\n  font-size: var(--text-large);\n}\n.ds-hero__actions {\n  flex: none;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  gap: var(--space-3);\n  width: var(--size-sidebar);\n  text-align: center;\n}\n.ds-hero__note {\n  margin: 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- page header ---------- */\n.ds-page-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: var(--space-5);\n  margin: 0 0 var(--space-4);\n  padding: 0 0 var(--space-3);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-page-header__main {\n  min-width: 0;\n}\n.ds-page-header__title {\n  margin: 0 0 var(--space-2);\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  color: var(--color-heading);\n}\n.ds-page-header__text {\n  margin: 0;\n  color: var(--color-text-muted);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- stats: one line of figures, cut by pipes ---------- */\n.ds-stats {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  margin: 0 0 var(--space-5);\n  padding: 0;\n  list-style: none;\n}\n.ds-stat + .ds-stat::before {\n  content: \"|\";\n  margin: 0 var(--space-4);\n  color: var(--color-text-muted);\n}\n.ds-stat__value {\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-heading);\n  color: var(--color-heading);\n}\n.ds-stat__label {\n  color: var(--color-text-muted);\n}\n\n/* ---------- prose ---------- */\n.ds-prose {\n  max-width: 84ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0 0 var(--space-3);\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  color: var(--color-heading);\n}\n.ds-prose h1 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-5);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-5);\n  font-size: var(--text-h3);\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 var(--space-5);\n}\n.ds-prose ul {\n  list-style: square;\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  background: var(--color-surface-strong);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose blockquote {\n  margin: 0 0 var(--space-4);\n  padding: 0 0 0 var(--space-4);\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-text-muted);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose > :last-child {\n  margin-bottom: 0;\n}\n.ds-prose__meta {\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- buttons: a flat square push button ---------- */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-button {\n  display: inline-block;\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-1) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-body);\n  text-align: center;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-button-hover-text);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-button:active,\n.ds-button.is-active {\n  border-color: var(--color-border-strong);\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n/* Destructive: the error message's colours on a button. */\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  border-color: var(--color-border-muted);\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  text-decoration: none;\n  cursor: default;\n}\n\n/* ---------- form: a short label column, plain controls ---------- */\n.ds-form {\n  margin: 0;\n}\n.ds-form__title {\n  margin: 0 0 var(--space-4);\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  color: var(--color-heading);\n}\n.ds-form__row {\n  display: flex;\n  align-items: flex-start;\n  margin: 0 0 var(--space-3);\n}\n.ds-form__label {\n  flex: none;\n  width: var(--size-label);\n  padding-top: var(--space-1);\n  color: var(--color-text-muted);\n}\n.ds-form__field {\n  flex: 1;\n  min-width: 0;\n}\n.ds-form__input {\n  box-sizing: border-box;\n  width: var(--size-field);\n  max-width: 100%;\n  margin: 0;\n  padding: var(--space-1) var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  box-shadow: var(--shadow-control);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: var(--line-body);\n  transition: var(--transition);\n}\n.ds-form__input--wide {\n  width: 100%;\n}\n.ds-form__input--auto {\n  width: auto;\n}\n.ds-form__input:focus-visible,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-form__input:disabled,\n.ds-form__input.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n}\n.ds-form__input.is-invalid {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  margin: var(--space-1) 0 0;\n  color: var(--color-danger);\n}\n.ds-form__hint {\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-form__checkbox {\n  margin: 0;\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n  margin: var(--space-4) 0 0;\n  padding-left: var(--size-label);\n}\n/* Under a control that has no label column. */\n.ds-form__actions--flush {\n  padding-left: 0;\n}\n\n/* ---------- table: rows on hairlines, no upright rules ---------- */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-radius: var(--radius-panel);\n}\n.ds-table th,\n.ds-table td {\n  padding: var(--space-2) var(--space-3);\n  border-style: var(--border-style);\n  border-color: var(--color-border-muted);\n  border-width: 0 0 var(--border-width);\n  text-align: left;\n  vertical-align: top;\n}\n.ds-table th {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  border-color: var(--color-border-strong);\n  font-weight: var(--weight-bold);\n  text-shadow: var(--shadow-text);\n}\n.ds-table td {\n  background: var(--color-surface);\n}\n.ds-table tr.is-alt td,\n.ds-table__row--alt td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  width: var(--size-num);\n  text-align: right;\n}\n.ds-table__group td {\n  background: var(--color-surface-strong);\n  font-weight: var(--weight-bold);\n}\n.ds-table__sub {\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- list: numbered rows, two lines each, grouped by day ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__day {\n  margin: var(--space-5) 0 var(--space-3);\n  padding: 0 0 var(--space-1);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-heading);\n}\n.ds-list__day:first-child {\n  margin-top: 0;\n}\n.ds-list__item {\n  display: flex;\n  align-items: baseline;\n  padding: 0 0 var(--space-3);\n}\n/* A reply hangs one number column in from the comment it answers. */\n.ds-list__item--reply {\n  padding-left: var(--size-rank);\n}\n.ds-list__rank {\n  flex: none;\n  box-sizing: border-box;\n  width: var(--size-rank);\n  padding-right: var(--space-3);\n  text-align: right;\n  color: var(--color-text-muted);\n}\n.ds-list__body {\n  flex: 1;\n  min-width: 0;\n}\n.ds-list__title {\n  color: var(--color-link);\n  font-size: var(--text-base);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:visited,\n.ds-list__title.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-list__site {\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-list__excerpt {\n  margin: var(--space-1) 0 0;\n}\n.ds-list__meta {\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- panel: a hairline box, title in the first line ---------- */\n.ds-panel {\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-4) 0;\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  padding: var(--space-2) var(--space-4) var(--space-4);\n}\n\n/* ---------- grid: four columns, each hanging from a rule ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: var(--space-4);\n}\n.ds-grid__cell {\n  min-width: 0;\n  padding: var(--space-3) var(--space-4) var(--space-4);\n  background: var(--color-fill-1);\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-page);\n}\n.ds-grid__cell--2 {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 {\n  background: var(--color-fill-4);\n}\n.ds-grid__title {\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-heading);\n}\n.ds-grid__text {\n  margin: 0;\n}\n.ds-grid__meta {\n  margin: var(--space-2) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- tabs: words on a hairline, the current one a filled block ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-tabs__item {\n  margin: 0;\n}\n.ds-tabs__tab {\n  display: block;\n  padding: var(--space-1) var(--space-3);\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-tabs__tab:focus-visible,\n.ds-tabs__tab.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tabs__tab.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-tabs__body {\n  padding: var(--space-4) 0 0;\n}\n\n/* ---------- badge: a count, a tag, a status word behind a square ---------- */\n.ds-badge {\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-badge--alt,\n.ds-badge--tag,\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  padding: 0;\n  background: transparent;\n  color: var(--color-text);\n  font-weight: var(--weight-body);\n}\n.ds-badge--alt::before {\n  content: \"*\";\n  margin-right: var(--space-1);\n  color: var(--color-accent-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-badge--tag {\n  padding: 0 var(--space-2);\n  background: var(--color-surface-strong);\n  border: var(--border-width) var(--border-style) var(--color-border);\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-badge--success::before,\n.ds-badge--warning::before,\n.ds-badge--danger::before {\n  content: \"\\25A0\";\n  margin-right: var(--space-2);\n}\n\n/* ---------- sidebar: a narrow column of small lists, no rule ---------- */\n.ds-sidebar {\n  flex: none;\n  box-sizing: border-box;\n  width: var(--size-sidebar);\n  font-size: var(--text-small);\n}\n.ds-sidebar__block {\n  margin: 0 0 var(--space-5);\n}\n.ds-sidebar__block:last-child {\n  margin-bottom: 0;\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  padding: 0 0 var(--space-1);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-heading-alt);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__row {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-1) 0;\n}\n.ds-sidebar__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-sidebar__link:visited,\n.ds-sidebar__link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-sidebar__count {\n  color: var(--color-text-muted);\n}\n.ds-sidebar__text {\n  margin: 0;\n  color: var(--color-text-muted);\n}\n.ds-sidebar__search {\n  display: flex;\n  gap: var(--space-2);\n}\n.ds-sidebar__search .ds-form__input {\n  flex: 1;\n  min-width: 0;\n  width: auto;\n}\n\n/* ---------- notice: a sentence in a hairline box ---------- */\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-3) var(--space-4);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n}\n.ds-notice--error {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n\n/* ---------- pagination ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0 0 0 var(--size-rank);\n  list-style: none;\n}\n.ds-pagination__link {\n  display: block;\n  padding: var(--space-1) var(--space-3);\n  color: var(--color-link);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-pagination__link:focus-visible,\n.ds-pagination__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-pagination__link.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-text-muted);\n  text-decoration: none;\n}\n.ds-pagination__link--first {\n  padding-left: 0;\n}\n\n/* ---------- dialog: a ruled box in the middle of a flat block ---------- */\n.ds-dialog__backdrop {\n  padding: var(--space-5);\n  background: var(--color-overlay);\n}\n.ds-dialog {\n  box-sizing: border-box;\n  width: var(--size-dialog);\n  max-width: 100%;\n  margin: 0 auto;\n  background: var(--fill-panel);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__title {\n  margin: 0;\n  padding: var(--space-1) var(--space-3);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-base);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-dialog__body {\n  padding: var(--space-4);\n}\n.ds-dialog__text {\n  margin: 0 0 var(--space-4);\n}\n.ds-dialog__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--space-3);\n}\n\n/* ---------- empty: a centred sentence between two hairlines ---------- */\n.ds-empty {\n  padding: var(--space-5) var(--space-4);\n  border-style: var(--border-style);\n  border-color: var(--color-border);\n  border-width: var(--border-width) 0;\n  text-align: center;\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n}\n\n/* ---------- footer: a rule, then centred small lines ---------- */\n.ds-footer {\n  padding: var(--space-4) var(--space-3) var(--space-5);\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  text-align: center;\n}\n.ds-footer__links {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  margin: 0 0 var(--space-3);\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__item + .ds-footer__item::before {\n  content: \"|\";\n  margin: 0 var(--space-3);\n}\n.ds-footer__link {\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-footer__text {\n  margin: 0;\n}\n\n/* ---------- narrow windows: the sheet takes the window, one column ---------- */\n@media (max-width: 800px) {\n  /* A wrapped line of figures must not open with a pipe: the figures are\n     set apart by space alone. */\n  .ds-stats {\n    gap: var(--space-1) var(--space-5);\n  }\n  .ds-stat + .ds-stat::before {\n    content: none;\n  }\n  .ds-page__frame {\n    width: 100%;\n  }\n  .ds-page__columns,\n  .ds-hero {\n    flex-direction: column;\n    align-items: stretch;\n  }\n  .ds-page__columns,\n  .ds-hero {\n    gap: var(--space-5);\n  }\n  .ds-page__pair {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-sidebar,\n  .ds-hero__actions {\n    width: auto;\n  }\n  .ds-nav__item--end {\n    margin-left: 0;\n  }\n  .ds-page-header {\n    flex-direction: column;\n    align-items: flex-start;\n    gap: var(--space-3);\n  }\n  .ds-grid {\n    grid-template-columns: repeat(2, 1fr);\n  }\n  .ds-form__row {\n    flex-direction: column;\n    align-items: stretch;\n  }\n  .ds-form__label {\n    width: auto;\n    padding: 0 0 var(--space-1);\n  }\n  .ds-form__actions {\n    padding-left: 0;\n  }\n  .ds-table__extra {\n    display: none;\n  }\n  .ds-table th.ds-table__num,\n  .ds-table td.ds-table__num {\n    width: auto;\n  }\n  .ds-dialog__backdrop {\n    padding: var(--space-4);\n  }\n}\n",
    "specimen.html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>chronoskin: links for people who mend things. Web brutalism, link list: 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__frame\">\n\n  <header class=\"ds-nav\" data-component=\"nav\">\n    <a class=\"ds-brand\" data-component=\"brand\" href=\"#front\"><span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.8\" stroke-linecap=\"square\" aria-hidden=\"true\"><path d=\"M12 3a9 9 0 1 1-9 9\"/><path d=\"M12 17a5 5 0 1 1 5-5\"/><circle cx=\"12\" cy=\"12\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\"/></svg></span><span class=\"ds-brand__name\">chronoskin</span></a>\n    <ul class=\"ds-nav__list\">\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#front\">front</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#tags\">tags</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#rules\">rules</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#send\">send a link</a></li>\n      <li class=\"ds-nav__item ds-nav__item--end\"><a class=\"ds-nav__link\" href=\"#member\">marit (214)</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#\">log out</a></li>\n    </ul>\n  </header>\n\n  <!-- View 1, the home page: the front page of a shared link log. -->\n  <section class=\"ds-view ds-view--home\" id=\"front\">\n    <div class=\"ds-page__body\">\n\n    <section class=\"ds-hero\" data-component=\"hero\">\n      <div class=\"ds-hero__copy\">\n        <h1 class=\"ds-hero__title\">Links for people who mend things.</h1>\n        <p class=\"ds-hero__lead\">A list of pages about repair, joinery and small machines, sent in by readers and sorted by how many of them found each one useful. No pictures, no feed that follows you, nothing to install.</p>\n      </div>\n      <div class=\"ds-hero__actions\">\n        <a class=\"ds-button\" href=\"#send\">Send a link</a>\n        <a class=\"ds-button ds-button--secondary\" href=\"#rules\">Read the rules</a>\n        <p class=\"ds-hero__note\">Reading needs no account.</p>\n      </div>\n    </section>\n\n    <div class=\"ds-page__columns\">\n      <div class=\"ds-page__main\">\n\n        <section class=\"ds-page__section\" data-component=\"list\">\n          <ol class=\"ds-list\">\n            <li class=\"ds-list__day\">Tuesday 14 March 2017</li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">1.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">Regrinding a plane iron on a paving slab</a> <span class=\"ds-list__site\">(greybench.example)</span> <span class=\"ds-badge ds-badge--alt\">new</span>\n                <p class=\"ds-list__meta\">142 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">halvard</a> 3 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">38 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">2.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">Why the old drill press runs backwards after a rewire</a> <span class=\"ds-list__site\">(threephase.example)</span> <span class=\"ds-badge ds-badge--tag\">motors</span>\n                <p class=\"ds-list__meta\">97 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">ootje</a> 5 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">61 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">3.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title is-visited\" href=\"#thread\">A drawer that closes itself, with no hardware</a> <span class=\"ds-list__site\">(slowjoinery.example)</span> <span class=\"ds-badge ds-badge--tag\">joinery</span>\n                <p class=\"ds-list__meta\">88 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">pernille_k</a> 6 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">19 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">4.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">Ask: which glue survives a dishwasher?</a> <span class=\"ds-badge ds-badge--tag\">question</span>\n                <p class=\"ds-list__excerpt\">The handle of a bread knife, beech, split along the tang. Epoxy lasted a month.</p>\n                <p class=\"ds-list__meta\">54 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">marit</a> 7 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">86 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">5.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">Measuring runout with a feeler gauge and patience</a> <span class=\"ds-list__site\">(tenthou.example)</span>\n                <p class=\"ds-list__meta\">41 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">dov</a> 9 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">7 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__day\">Monday 13 March 2017</li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">6.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">The bandsaw that a village shared for forty years</a> <span class=\"ds-list__site\">(parishtools.example)</span> <span class=\"ds-badge ds-badge--tag\">history</span>\n                <p class=\"ds-list__meta\">216 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">ansgar</a> 1 day ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">104 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">7.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title is-visited\" href=\"#thread\">Cutting a thread without a die (1931)</a> <span class=\"ds-list__site\">(scannedmanuals.example)</span>\n                <p class=\"ds-list__meta\">73 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">ootje</a> 1 day ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">12 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">8.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">Notes on linseed oil, after ruining two chairs</a> <span class=\"ds-list__site\">(pernille.example)</span> <span class=\"ds-badge ds-badge--tag\">finishing</span>\n                <p class=\"ds-list__meta\">65 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">pernille_k</a> 1 day ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">33 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">9.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">A bench vise from two scaffold clamps</a> <span class=\"ds-list__site\">(greybench.example)</span>\n                <p class=\"ds-list__meta\">39 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">halvard</a> 1 day ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">5 comments</a></p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">10.</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#thread\">What a 1 mm error in a mitre looks like at two metres</a> <span class=\"ds-list__site\">(tenthou.example)</span> <span class=\"ds-badge ds-badge--tag\">joinery</span>\n                <p class=\"ds-list__meta\">28 points, sent by <a class=\"ds-link ds-link--quiet\" href=\"#member\">dov</a> 1 day ago | <a class=\"ds-link ds-link--quiet\" href=\"#front\">hide</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">9 comments</a></p>\n              </div>\n            </li>\n          </ol>\n        </section>\n\n        <section class=\"ds-page__section ds-page__section--last\" data-component=\"pagination\">\n          <ul class=\"ds-pagination\">\n            <li><a class=\"ds-pagination__link ds-pagination__link--first is-disabled\" href=\"#front\">newer</a></li>\n            <li><span class=\"ds-pagination__link is-current\" aria-current=\"page\">1</span></li>\n            <li><a class=\"ds-pagination__link\" href=\"#front\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#front\">3</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#front\">4</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#front\">older</a></li>\n          </ul>\n        </section>\n\n      </div>\n\n      <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">Search</h2>\n          <form class=\"ds-sidebar__search\" action=\"#\">\n            <input class=\"ds-form__input\" type=\"text\" value=\"dovetail\" aria-label=\"Search the links\">\n            <button class=\"ds-button\" type=\"button\">go</button>\n          </form>\n        </div>\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">Tags</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">joinery</a> <span class=\"ds-sidebar__count\">1,204</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">motors</a> <span class=\"ds-sidebar__count\">811</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-hover\" href=\"#tags\">finishing</a> <span class=\"ds-sidebar__count\">640</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">sharpening</a> <span class=\"ds-sidebar__count\">522</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#tags\">history</a> <span class=\"ds-sidebar__count\">377</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">question</a> <span class=\"ds-sidebar__count\">298</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">all 46 tags</a></li>\n          </ul>\n        </div>\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">Talking now</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">which glue survives a dishwasher?</a> <span class=\"ds-sidebar__count\">86</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">the bandsaw a village shared</a> <span class=\"ds-sidebar__count\">104</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">drill press runs backwards</a> <span class=\"ds-sidebar__count\">61</span></li>\n          </ul>\n        </div>\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">About</h2>\n          <p class=\"ds-sidebar__text\">Kept by four volunteers since 2014. One page of markup, one stylesheet, no scripts. <a class=\"ds-sidebar__link\" href=\"#rules\">The rules</a></p>\n        </div>\n      </aside>\n    </div>\n\n    </div>\n  </section>\n\n  <!-- View 2, an inner page: one question and the discussion under it. One column, no sidebar. -->\n  <section class=\"ds-view\" id=\"thread\">\n    <div class=\"ds-page__body\">\n\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#front\">front</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#tags\">question</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li class=\"ds-breadcrumb__current\">which glue survives a dishwasher?</li>\n      </ol>\n      <div class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Ask: which glue survives a dishwasher?</h1>\n          <p class=\"ds-page-header__text\">54 points, sent by marit 7 hours ago, tagged question. 86 comments.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#send\">Send a link</a></div>\n      </div>\n\n      <div class=\"ds-page__pair\">\n        <div>\n          <section class=\"ds-page__section\">\n            <div class=\"ds-prose\">\n              <p>The handle of a bread knife, beech, split along the tang. Epoxy lasted a month. The knife goes in the machine every day and nobody in this house is going to start washing it by hand.</p>\n              <p>What has held for you, for years and not weeks?</p>\n            </div>\n          </section>\n          <section class=\"ds-page__section ds-page__section--last\">\n            <p class=\"ds-page__label\">86 comments, best first</p>\n            <ul class=\"ds-list\">\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">ootje</a> 6 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">None of them. The wood moves more than any glue line can follow. Rivet it and oil it.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item ds-list__item--reply\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">marit</a> 6 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a> | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">delete</a></p>\n                <p class=\"ds-list__excerpt\">Rivets through a split handle just make two splits.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item ds-list__item--reply\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">ootje</a> 5 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">Then it is time for a new handle, which is an afternoon and a nicer knife.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">pernille_k</a> 5 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">Resorcinol. It is what they use on boat frames. The glue line is dark red, so call it a feature.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item ds-list__item--reply\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">halvard</a> 4 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">Seconded. My grandmother's ladle has been through forty years of it.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">dov</a> 3 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">Polyurethane held eighteen months for me and then let go all at once, in the cutlery basket.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\"><a class=\"ds-link ds-link--quiet\" href=\"#member\">ansgar</a> 2 hours ago | <a class=\"ds-link ds-link--quiet\" href=\"#thread\">reply</a></p>\n                <p class=\"ds-list__excerpt\">The real answer is a handle without a joint: one piece, slotted, pinned.</p>\n              </div>\n            </li>\n            </ul>\n            <ul class=\"ds-pagination\">\n              <li><span class=\"ds-pagination__link ds-pagination__link--first is-current\" aria-current=\"page\">1</span></li>\n              <li><a class=\"ds-pagination__link\" href=\"#thread\">2</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#thread\">3</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#thread\">more</a></li>\n            </ul>\n          </section>\n        </div>\n        <div>\n        <section class=\"ds-page__section\" data-component=\"dialog\">\n          <div class=\"ds-dialog__backdrop\">\n            <div class=\"ds-dialog\" role=\"dialog\" aria-labelledby=\"dlg-title\">\n              <h3 class=\"ds-dialog__title\" id=\"dlg-title\">Delete your comment?</h3>\n              <div class=\"ds-dialog__body\">\n                <p class=\"ds-dialog__text\">The comment you posted at 22:05 will be removed, and the two replies under it will stay. This cannot be undone.</p>\n                <div class=\"ds-dialog__actions\">\n                  <a class=\"ds-button ds-button--secondary\" href=\"#thread\">Cancel</a>\n                  <button class=\"ds-button ds-button--danger\" type=\"button\">Delete</button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </section>\n          <section class=\"ds-page__section ds-page__section--last\">\n            <p class=\"ds-page__label\">Add a comment</p>\n            <form class=\"ds-form\" action=\"#\">\n              <textarea class=\"ds-form__input ds-form__input--wide\" rows=\"6\" aria-label=\"Your comment\">Resorcinol it is. I will report back in a year.</textarea>\n              <p class=\"ds-form__hint\">Plain text. A blank line starts a paragraph; addresses become links.</p>\n              <div class=\"ds-form__actions ds-form__actions--flush\">\n                <button class=\"ds-button\" type=\"button\">Add comment</button>\n                <a class=\"ds-button ds-button--secondary\" href=\"#front\">Back to the front page</a>\n              </div>\n            </form>\n          </section>\n          <section class=\"ds-page__section ds-page__section--last ds-page__section--after\">\n            <p class=\"ds-page__label\">More questions</p>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">Ask: is a cracked cast iron vise worth brazing?</a> <span class=\"ds-sidebar__count\">41</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#thread\">Ask: what do you oil a workbench with?</a> <span class=\"ds-sidebar__count\">133</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">Ask: a first lathe for a small flat</a> <span class=\"ds-sidebar__count\">58</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#tags\">all 298 questions</a></li>\n            </ul>\n          </section>\n        </div>\n      </div>\n\n    </div>\n  </section>\n\n  <!-- View 3: the form for sending a link, with the messages it can answer with. -->\n  <section class=\"ds-view\" id=\"send\">\n    <div class=\"ds-page__body\">\n\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#front\">front</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li class=\"ds-breadcrumb__current\">send a link</li>\n      </ol>\n      <div class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Send a link</h1>\n          <p class=\"ds-page-header__text\">One page that other people who mend things would want to read. One a day is plenty.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#rules\">Read the rules</a></div>\n      </div>\n\n      <section class=\"ds-page__section\" data-component=\"notice\">\n        <div class=\"ds-notices\">\n          <p class=\"ds-notice\"><span class=\"ds-notice__title\">Held.</span> Your last link, the lathe steady, is waiting for a volunteer to read it. You can send another meanwhile.</p>\n          <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not sent.</span> The address below is not one we can fetch. Nothing has been posted.</p>\n        </div>\n      </section>\n\n      <div class=\"ds-page__pair\">\n      <section class=\"ds-page__section ds-page__section--last\" data-component=\"form\">\n        <form class=\"ds-form\" action=\"#\">\n                    <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-title\">title</label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input\" id=\"f-title\" type=\"text\" value=\"Fitting a new handle to an old file\"></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-url\">address</label>\n            <div class=\"ds-form__field\">\n              <input class=\"ds-form__input is-invalid\" id=\"f-url\" type=\"text\" value=\"greybench example/handles\">\n              <p class=\"ds-form__error\">That is not a web address.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-tag\">tag</label>\n            <div class=\"ds-form__field\">\n              <select class=\"ds-form__input ds-form__input--auto\" id=\"f-tag\">\n                <option>sharpening</option>\n                <option>joinery</option>\n                <option>question</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-text\">text</label>\n            <div class=\"ds-form__field\">\n              <textarea class=\"ds-form__input ds-form__input--wide\" id=\"f-text\" rows=\"5\">Leave the address empty to ask a question instead.</textarea>\n              <p class=\"ds-form__hint\">Plain text. A blank line starts a paragraph; addresses become links.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <span class=\"ds-form__label\"></span>\n            <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Mail me when someone replies</label>\n          </div>\n          <div class=\"ds-form__actions\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"button\">Send</button>\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Preview</button>\n            <button class=\"ds-button ds-button--danger\" type=\"button\">Discard</button>\n            <button class=\"ds-button is-disabled\" type=\"button\" disabled>Sending is paused</button>\n          </div>\n        </form>\n      </section>\n        <div>\n        <section class=\"ds-page__section\" data-component=\"panel\">\n          <div class=\"ds-panel\">\n            <h3 class=\"ds-panel__title\">Before you send</h3>\n            <div class=\"ds-panel__body ds-prose\">\n              <p>Send the page itself, not a page about the page. Keep the title the author gave it. One link a day is plenty, and a shop's own offers are removed without discussion.</p>\n            </div>\n          </div>\n        </section>\n          <section class=\"ds-page__section ds-page__section--last\">\n            <p class=\"ds-page__label\">Sent by you lately</p>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">Ask: which glue survives a dishwasher?</a> <span class=\"ds-badge ds-badge--success\">listed</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#thread\">Sharpening a card scraper, slowly</a> <span class=\"ds-badge ds-badge--success\">listed</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">A lathe steady from skateboard wheels</a> <span class=\"ds-badge ds-badge--warning\">held</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#member\">all 37 links</a></li>\n            </ul>\n          </section>\n        </div>\n      </div>\n\n    </div>\n  </section>\n\n  <!-- View 4: a member's own page. Figures, tabs over the table of what they sent. -->\n  <section class=\"ds-view\" id=\"member\">\n    <div class=\"ds-page__body\">\n\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#front\">front</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#member\">members</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li class=\"ds-breadcrumb__current\">marit</li>\n      </ol>\n      <div class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Links sent by marit</h1>\n          <p class=\"ds-page-header__text\">Everything this member has sent since joining in May 2014, newest first.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#send\">Send a link</a></div>\n      </div>\n\n      <ul class=\"ds-stats\" data-component=\"stats\">\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">214</span> <span class=\"ds-stat__label\">points</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">37</span> <span class=\"ds-stat__label\">links sent</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">412</span> <span class=\"ds-stat__label\">comments</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">1,035</span> <span class=\"ds-stat__label\">days a member</span></li>\n      </ul>\n\n\n      <section class=\"ds-page__section\" data-component=\"tabs\">\n        <ul class=\"ds-tabs\">\n          <li class=\"ds-tabs__item\"><span class=\"ds-tabs__tab is-current\" aria-current=\"true\">links</span></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#member\">comments</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab is-hover\" href=\"#member\">saved</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#member\">settings</a></li>\n        </ul>\n        <div class=\"ds-tabs__body\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>Link</th><th class=\"ds-table__extra\">Tag</th><th class=\"ds-table__extra\">Sent</th><th>State</th><th class=\"ds-table__num\">Comments</th><th class=\"ds-table__num\">Points</th></tr>\n            </thead>\n            <tbody>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#thread\">Ask: which glue survives a dishwasher?</a> <span class=\"ds-table__sub\">(text post)</span></td><td class=\"ds-table__extra\">question</td><td class=\"ds-table__extra\">2017-03-14</td><td><span class=\"ds-badge ds-badge--success\">listed</span></td><td class=\"ds-table__num\">86</td><td class=\"ds-table__num\">54</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#thread\">Sharpening a card scraper, slowly</a> <span class=\"ds-table__sub\">(greybench.example)</span></td><td class=\"ds-table__extra\">sharpening</td><td class=\"ds-table__extra\">2017-03-02</td><td><span class=\"ds-badge ds-badge--success\">listed</span></td><td class=\"ds-table__num\">23</td><td class=\"ds-table__num\">71</td></tr>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#thread\">A lathe steady from skateboard wheels</a> <span class=\"ds-table__sub\">(tenthou.example)</span></td><td class=\"ds-table__extra\">jigs</td><td class=\"ds-table__extra\">2017-02-19</td><td><span class=\"ds-badge ds-badge--warning\">held</span></td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num\">1</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#thread\">Hide glue in a baby bottle warmer</a> <span class=\"ds-table__sub\">(slowjoinery.example)</span></td><td class=\"ds-table__extra\">joinery</td><td class=\"ds-table__extra\">2017-02-07</td><td><span class=\"ds-badge ds-badge--success\">listed</span></td><td class=\"ds-table__num\">48</td><td class=\"ds-table__num\">62</td></tr>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#thread\">Ten percent off all chisels this week</a> <span class=\"ds-table__sub\">(toolbarn.example)</span></td><td class=\"ds-table__extra\">none</td><td class=\"ds-table__extra\">2017-01-28</td><td><span class=\"ds-badge ds-badge--danger\">removed</span></td><td class=\"ds-table__num\">2</td><td class=\"ds-table__num\">0</td></tr>\n            </tbody>\n          </table>\n        </div>\n      </section>\n\n      <div class=\"ds-page__pair\">\n        <section class=\"ds-page__section ds-page__section--last\">\n          <p class=\"ds-page__label\">Latest comments</p>\n          <ul class=\"ds-list\">\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\">6 hours ago, on <a class=\"ds-link ds-link--quiet\" href=\"#thread\">which glue survives a dishwasher?</a></p>\n                <p class=\"ds-list__excerpt\">Rivets through a split handle just make two splits.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\">2 days ago, on <a class=\"ds-link ds-link--quiet\" href=\"#thread\">the bandsaw that a village shared</a></p>\n                <p class=\"ds-list__excerpt\">Ours had a rota pinned to the guard. It is still there, and so is the saw.</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <div class=\"ds-list__body\">\n                <p class=\"ds-list__meta\">5 days ago, on <a class=\"ds-link ds-link--quiet\" href=\"#thread\">notes on linseed oil</a></p>\n                <p class=\"ds-list__excerpt\">Thin coats. Then thinner ones. Then wait longer than you want to.</p>\n              </div>\n            </li>\n          </ul>\n        </section>\n        <section class=\"ds-page__section ds-page__section--last\">\n          <p class=\"ds-page__label\">About</p>\n          <div class=\"ds-prose\">\n            <p>Mends kitchen things and the odd bicycle. Joined in May 2014, the week the site opened. Sends about one link a month and argues about glue.</p>\n            <p><a class=\"ds-link\" href=\"#member\">Change this text</a> or <a class=\"ds-link\" href=\"#front\">go back to the front page</a>.</p>\n          </div>\n        </section>\n      </div>\n\n    </div>\n  </section>\n\n  <!-- View 5: every tag. The busiest four as blocks, the rest as a table, and what an empty tag looks like. -->\n  <section class=\"ds-view\" id=\"tags\">\n    <div class=\"ds-page__body\">\n\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#front\">front</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li class=\"ds-breadcrumb__current\">tags</li>\n      </ol>\n      <div class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Tags</h1>\n          <p class=\"ds-page-header__text\">46 tags, chosen by the volunteers. A link carries one tag or none.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#send\">Send a link</a></div>\n      </div>\n\n      <section class=\"ds-page__section\" data-component=\"grid\">\n        <p class=\"ds-page__label\">Busiest tags this week</p>\n        <div class=\"ds-grid\">\n          <div class=\"ds-grid__cell\">\n            <h3 class=\"ds-grid__title\">joinery</h3>\n            <p class=\"ds-grid__text\">Joints, jigs and the mistakes that taught them.</p>\n            <p class=\"ds-grid__meta\">63 links, 918 comments</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--2\">\n            <h3 class=\"ds-grid__title\">motors</h3>\n            <p class=\"ds-grid__text\">Rewinding, rewiring and the smell of warm varnish.</p>\n            <p class=\"ds-grid__meta\">41 links, 702 comments</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--3\">\n            <h3 class=\"ds-grid__title\">finishing</h3>\n            <p class=\"ds-grid__text\">Oil, wax, shellac and how long to really wait.</p>\n            <p class=\"ds-grid__meta\">29 links, 344 comments</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--4\">\n            <h3 class=\"ds-grid__title\">question</h3>\n            <p class=\"ds-grid__text\">Text posts that ask instead of link.</p>\n            <p class=\"ds-grid__meta\">22 links, 1,160 comments</p>\n          </div>\n        </div>\n      </section>\n\n      <div class=\"ds-page__pair\">\n        <section class=\"ds-page__section ds-page__section--last\">\n          <p class=\"ds-page__label\">All tags, by name</p>\n          <table class=\"ds-table\">\n            <thead>\n              <tr><th>Tag</th><th class=\"ds-table__extra\">Newest link</th><th>State</th><th class=\"ds-table__num\">Links</th><th class=\"ds-table__num\">Comments</th></tr>\n            </thead>\n            <tbody>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">finishing</a></td><td class=\"ds-table__extra\">Notes on linseed oil</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">640</td><td class=\"ds-table__num\">7,118</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">history</a></td><td class=\"ds-table__extra\">The bandsaw that a village shared</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">377</td><td class=\"ds-table__num\">5,902</td></tr>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">jigs</a></td><td class=\"ds-table__extra\">A lathe steady from skateboard wheels</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">214</td><td class=\"ds-table__num\">1,560</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">joinery</a></td><td class=\"ds-table__extra\">A drawer that closes itself</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">1,204</td><td class=\"ds-table__num\">14,377</td></tr>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">motors</a></td><td class=\"ds-table__extra\">Why the old drill press runs backwards</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">811</td><td class=\"ds-table__num\">9,046</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">offers</a></td><td class=\"ds-table__extra\">Ten percent off all chisels</td><td><span class=\"ds-badge ds-badge--danger\">closed</span></td><td class=\"ds-table__num\">12</td><td class=\"ds-table__num\">31</td></tr>\n              <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">sharpening</a></td><td class=\"ds-table__extra\">Regrinding a plane iron on a paving slab</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num\">522</td><td class=\"ds-table__num\">6,230</td></tr>\n              <tr class=\"ds-table__row--alt\"><td><a class=\"ds-link ds-link--quiet\" href=\"#tags\">upholstery</a></td><td class=\"ds-table__extra\">none yet</td><td><span class=\"ds-badge ds-badge--warning\">new</span></td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num\">0</td></tr>\n            </tbody>\n          </table>\n        </section>\n        <div>\n        <section class=\"ds-page__section\">\n          <p class=\"ds-page__label\">Tagged upholstery</p>\n          <div class=\"ds-empty\" data-component=\"empty\">\n            <p class=\"ds-empty__text\">No links are tagged &ldquo;upholstery&rdquo; yet.</p>\n            <a class=\"ds-button ds-button--secondary\" href=\"#send\">Send the first one</a>\n          </div>\n          <p class=\"ds-form__hint\">A tag is opened when three members ask for it and closed when it fills with offers. Ask in <a class=\"ds-link ds-link--quiet\" href=\"#thread\">the questions</a>.</p>\n        </section>\n        <section class=\"ds-page__section ds-page__section--last\">\n          <p class=\"ds-page__label\">Asked for, not opened yet</p>\n          <ul class=\"ds-sidebar__list\">\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">bicycles</a> <span class=\"ds-sidebar__count\">2 of 3 members</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">clocks</a> <span class=\"ds-sidebar__count\">2 of 3 members</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#thread\">bookbinding</a> <span class=\"ds-sidebar__count\">1 of 3 members</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#thread\">electronics</a> <span class=\"ds-sidebar__count\">turned down twice</span></li>\n          </ul>\n        </section>\n        </div>\n      </div>\n\n    </div>\n  </section>\n\n  <!-- View 6: the rules. Running text at the left, short reference blocks at the right. -->\n  <section class=\"ds-view\" id=\"rules\">\n    <div class=\"ds-page__body\">\n\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#front\">front</a></li>\n        <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n        <li class=\"ds-breadcrumb__current\">rules</li>\n      </ol>\n      <div class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Rules</h1>\n          <p class=\"ds-page-header__text\">Short enough to read before you send anything.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#send\">Send a link</a></div>\n      </div>\n\n      <div class=\"ds-page__pair\">\n        <article class=\"ds-prose\" data-component=\"typography\">\n          <h1>How the front page is sorted</h1>\n          <p class=\"ds-prose__meta\">Written by the volunteers, last changed 2017-01-09.</p>\n          <p>Every link starts with one point from the person who sent it. Readers add points; time takes them away. The whole rule is short enough to read in <a class=\"ds-link\" href=\"#rules\">the source of this page</a>, and nothing else decides the order.</p>\n          <h2>What counts</h2>\n          <ul>\n            <li>One point for each reader who found the link useful.</li>\n            <li>The age of the link in hours, plus two.</li>\n            <li>Nothing else: no names, no tags, no payment.</li>\n          </ul>\n          <h3>The arithmetic</h3>\n          <p>The score is <code>points / (hours + 2) ^ 1.6</code>, worked out again every five minutes. A link <strong>held</strong> by a volunteer keeps its points but is left out of the list.</p>\n        </article>\n        <div>\n          <section class=\"ds-page__section\" data-component=\"badge\">\n            <p class=\"ds-page__label\">Marks you will see</p>\n            <p class=\"ds-list__meta\">Unread replies <span class=\"ds-badge\">12</span>, a tag <span class=\"ds-badge ds-badge--tag\">joinery</span>, a fresh link <span class=\"ds-badge ds-badge--alt\">new</span>, and the state of a link: <span class=\"ds-badge ds-badge--success\">listed</span> <span class=\"ds-badge ds-badge--warning\">held</span> <span class=\"ds-badge ds-badge--danger\">removed</span></p>\n          </section>\n          <section class=\"ds-page__section\">\n            <div class=\"ds-panel\">\n              <h3 class=\"ds-panel__title\">What gets a link removed</h3>\n              <div class=\"ds-panel__body ds-prose\">\n                <p>A shop's own offers. A page about a page. A title rewritten to argue. The same address twice in thirty days.</p>\n              </div>\n            </div>\n          </section>\n          <section class=\"ds-page__section ds-page__section--last\" data-component=\"links\">\n            <p class=\"ds-page__label\">Read next</p>\n            <ul class=\"ds-links\">\n              <li><a class=\"ds-link\" href=\"#rules\">Questions and answers</a></li>\n              <li><a class=\"ds-link is-visited\" href=\"#tags\">All 46 tags</a></li>\n              <li><a class=\"ds-link is-hover\" href=\"#rules\">Who the volunteers are</a></li>\n              <li><a class=\"ds-link is-active\" href=\"#rules\">The source of this page</a></li>\n              <li><a class=\"ds-link ds-link--quiet\" href=\"#member\">Your own page</a></li>\n              <li><a class=\"ds-link ds-link--strong\" href=\"#send\">Send a link</a></li>\n            </ul>\n          </section>\n        </div>\n      </div>\n\n    </div>\n  </section>\n\n  <footer class=\"ds-footer\" data-component=\"footer\">\n    <ul class=\"ds-footer__links\">\n      <li class=\"ds-footer__item\"><a class=\"ds-footer__link\" href=\"#front\">front page</a></li>\n      <li class=\"ds-footer__item\"><a class=\"ds-footer__link\" href=\"#rules\">rules</a></li>\n      <li class=\"ds-footer__item\"><a class=\"ds-footer__link\" href=\"#tags\">all tags</a></li>\n      <li class=\"ds-footer__item\"><a class=\"ds-footer__link\" href=\"#send\">send a link</a></li>\n      <li class=\"ds-footer__item\"><a class=\"ds-footer__link\" href=\"#member\">your page</a></li>\n    </ul>\n    <p class=\"ds-footer__text\">chronoskin has been run by its readers since 2014. Copy what you like.</p>\n  </footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.brutalism.blog.s02.p02.t02.u02.dr\",\n  \"library\": \"2026.10.07-2111\",\n  \"era\": {\n    \"slug\": \"brutalism\",\n    \"years\": [\n      2014,\n      2019\n    ]\n  },\n  \"archetype\": \"blog\",\n  \"mode\": \"pure\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-br-2222-dr\",\n  \"short\": \"v1-br-2222-dr\",\n  \"density\": \"roomy\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #ffffff;\n  --color-canvas: #ffffff;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f7f7f7;\n  --color-surface-strong: #efefef;\n  --color-bar: #ddeeff;\n  --color-bar-text: #333333;\n  --color-bar-alt: #ffffff;\n  --color-bar-alt-text: #555555;\n  --color-inverse: #1111aa;\n  --color-inverse-text: #ffffff;\n  --color-text: #444444;\n  --color-text-muted: #808080;\n  --color-heading: #333333;\n  --color-heading-alt: #ff0000;\n  --color-link: #1111aa;\n  --color-link-quiet: #1111aa;\n  --color-link-visited: #800080;\n  --color-link-hover: #ff0000;\n  --color-link-active: #ff0000;\n  --color-border: #aaaaaa;\n  --color-border-strong: #8899cc;\n  --color-border-muted: #dddddd;\n  --color-accent: #ddffaa;\n  --color-accent-text: #333333;\n  --color-accent-alt: #ff0000;\n  --color-fill-1: #ddeeff;\n  --color-fill-2: #ddffaa;\n  --color-fill-3: #ffffaa;\n  --color-fill-4: #f7f7f7;\n  --color-button: #ddffaa;\n  --color-button-text: #333333;\n  --color-button-hover-text: #000000;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #444444;\n  --color-input: #ffffff;\n  --color-input-text: #333333;\n  --color-input-border: #808080;\n  --color-disabled: #efefef;\n  --color-disabled-text: #808080;\n  --color-danger: #cc0000;\n  --color-danger-surface: #ffffff;\n  --color-success: #2a7a00;\n  --color-warning: #9a5b00;\n  --color-notice: #ffffaa;\n  --color-notice-text: #333333;\n  --color-focus: #1111aa;\n  --color-shadow: #aaaaaa;\n  --color-overlay: #efefef;\n}\n\n/* @part type */\n:root {\n  --font-body: Helvetica, Arial, sans-serif;\n  --font-heading: Helvetica, Arial, sans-serif;\n  --font-ui: Helvetica, Arial, sans-serif;\n  --font-mono: Monaco, \"Courier New\", monospace;\n  --text-base: 13px;\n  --text-small: 11px;\n  --text-ui: 13px;\n  --text-large: 16px;\n  --text-display: 28px;\n  --text-h1: 18px;\n  --text-h2: 16px;\n  --text-h3: 13px;\n  --line-body: 1.4;\n  --line-heading: 1.2;\n  --line-display: 1.2;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 400;\n  --weight-ui: 400;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\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: 1px;\n  --border-style: dotted;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: none;\n  --shadow-control-hover: none;\n  --shadow-control-pressed: none;\n  --shadow-dialog: none;\n  --shadow-text: none;\n  --fill-page: var(--color-surface-alt);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: transparent;\n  --fill-button: var(--color-button);\n  --fill-button-hover: var(--color-button);\n  --fill-button-secondary: transparent;\n  --fill-input: var(--color-input);\n  --focus-ring: 1px solid var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
