{
  "id": "v1-br-4574",
  "long_id": "v1.brutalism.blog.s04.p05.t07.u04",
  "name": "Web brutalism, poster",
  "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": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "The poster page of web brutalism, as published between 2014 and 2019 by pamphleteers, studios and writers of guidelines who wanted a page to be one statement and then the evidence: a single headline in bold system sans set as large as the window will take, and everything else hanging under it in four narrow columns of plain serif text. The paper is a warm off-white, the ink black, links are underlined and stay underlined, one black band carries the navigation and one red block marks where you are. Nothing is rounded, shadowed, graded or animated and there are no pictures; the only ornament is size and a thin double rule.",
  "url": "https://chrono.skin/s/v1-br-4574",
  "preview_url": "https://chrono.skin/s/v1-br-4574/specimen.html",
  "files": {
    "STYLE.md": "# Web brutalism, poster\n\n## Summary\n\nThe poster page of web brutalism, as published between 2014 and 2019 by pamphleteers, studios and writers of guidelines who wanted a page to be one statement and then the evidence: a single headline in bold system sans set as large as the window will take, and everything else hanging under it in four narrow columns of plain serif text. The paper is a warm off-white, the ink black, links are underlined and stay underlined, one black band carries the navigation and one red block marks where you are. Nothing is rounded, shadowed, graded or animated and there are no pictures; the only ornament is size and a thin double rule.\n\n## Layout\n\n- The page fills the window: `.ds-page` has no margin and `.ds-page__frame` is `--size-page` (100%) wide with no maximum. Every part is padded `--space-4` (24px) from the window edge and nothing is centred.\n- Order from the top: `.ds-nav`, then the hero or the page header, then one or more `.ds-page__cols`, then `.ds-footer` across the window. The header and the footer are written once; the views change between them.\n- `.ds-nav` is two lines. `.ds-nav__top` is an open line on the canvas with the `.ds-brand` at the left and a small `.ds-nav__tagline` at the right. Under it `.ds-nav__list` is a band of `--fill-bar` in which the navigation words, at `--text-large`, are spread from the left edge of the window to the right with equal space between them. There is no sidebar navigation and no second row.\n- `.ds-hero` holds the headline alone on its lines, then `.ds-hero__foot`, a row in the four-column grid: the lead across two columns, the actions in the third, a small note in the fourth. A heavy rule closes the hero.\n- `.ds-page__cols` is the body: four equal columns, `--space-4` (24px) apart, rows `--space-5` (48px) apart, with no rules between columns and no fills behind them. A block takes one column (`.ds-page__col`), two (`--2`) or all four (`--4`). Each block opens with a `.ds-page__label`: a heavy rule with a small bold line hanging from it. Blocks stacked in one column are `.ds-page__section`, 48px apart.\n- On the home page the first row is: the `.ds-sidebar` in column one, the numbered `.ds-list` across columns two and three, short blocks (notices, a panel) in column four. The `.ds-grid` follows across all four columns, one block to a column.\n- Inner pages (one essay, the letters, the method, the archive) keep the name line and the band. The hero is replaced by the `.ds-breadcrumb` and `.ds-page-header`, whose title is `--text-display` (not multiplied), with one line of description and one button at the right over a heavy rule. Under it, on a page of figures, `.ds-stats` sets four large figures, one to a column, and a `.ds-page__cols` carries `.ds-tabs`, the `.ds-table` and `.ds-pagination` across all four columns. Every other inner page is one `.ds-page__cols--foot`: the main thing (running text, the form) in the left two columns and short captioned blocks, a panel or `.ds-sidebar` lists in the right two, filled so that the columns end near each other.\n- Views. The specimen is one small site with five views, one showing at a time. `issue` is the home page: the headline, then the sidebar, the numbered list of essays, a boxed note with this week's letters, and the four standing subjects. `essay` is one essay across two columns with the letters on it and further reading beside it. `letters` is the form under the two messages it can answer with, beside the letters printed this month and the confirmation for withdrawing one. `method` is running text, the house rules in a box, the marks and the writers. `archive` is a year: four figures, tabs over the table, pagination, and the empty state of a subject with no essays. A view is `<section class=\"ds-view\" id=\"...\">`; links between views are plain `href=\"#id\"`.\n- Spacing scale: `--space-1` 4px is the padding of badges and the gap under a control; `--space-2` 8px is the padding of buttons, inputs, table cells and the band (vertical) and the gap between buttons; `--space-3` 16px is the padding of panels, notices, grid blocks and dialogs, the gap between paragraphs and the padding of list rows; `--space-4` 24px is the page margin and the gap between columns; `--space-5` 48px is the gap between blocks and the padding above and below the hero; `--space-6` 96px is the space at the foot of the last columns of a page.\n- Fixed sizes: `--size-rank` 72px is the numeral column of the list, `--size-label` 150px the label column of a form, `--size-field` 360px a text input, `--size-num` 120px a numeric table column, `--size-dialog` 440px a dialog, `--size-block` 176px the least height of a grid block.\n- Below 900px the four columns become two and the headline is half its size. From there down a column marked `.ds-page__col--lead` (the list of the home page) comes before the sidebar that precedes it in the source. Below 600px there is one column: the band's words run from the left and wrap, headlines and page titles are 48px, the page header puts its button under the text, form labels sit above their fields and table cells marked `.ds-table__extra` are left out.\n- On a phone (600px and below) there is no menu button: `.ds-nav__list` becomes a grid of six columns, the first three `.ds-nav__item` spanning two columns each and the last two spanning three, so five links stand in two rows of three and two, the text of each centred. The tagline is left-aligned and the current page stays an inverted block.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\n- `--font-body` and `--font-ui` are Arial at `--text-base` 14px, `--line-body` 1.3; `--font-heading` is \"Arial Black\" at weight 900 for the name, the headline, page titles, block captions, panel titles and prices. `--font-mono` (\"Andale Mono\", \"Lucida Console\") is notice numbers, picture captions, avatars and code. All are system fonts; one reference used a hosted humanist sans at 14px, for which Arial stands in.\n- `--text-display` 56px at `--line-display` 0.95 with `--display-tracking` -1px is the hero headline, the largest text; `--text-h1` 30px is page titles, the name and the figures; `--text-h2` 20px block captions, grid titles and prices; `--text-h3` 15px panel and sidebar titles; `--text-large` 17px list titles and the lead; `--text-small` 12px counts, meta lines, badges and the footer. Buttons and navigation are bold (`--weight-ui` 700) and keep their case.\n- `--color-page`, `--color-canvas` and `--color-surface` are #ffff00; `--color-surface-alt` #ffff99 is alternate rows, the figures and the empty state; `--color-surface-strong` #ffcc00 is panel titles, form label cells, avatars and code. Text and headings on any of these, and on the `--color-fill-*` blocks, are `--color-text` and `--color-heading` (#000000); `--color-text-muted` #555500 is counts and meta lines.\n- `--color-link` #0000ff with `--color-link-visited` #800080, `--color-link-hover` #cc0000 and `--color-link-active` #800000. Links are not underlined at rest (`--link-decoration` none) and are underlined under the pointer. `--color-link-quiet` #000000 is filter links, tabs and page numbers. `--color-heading-alt` #0000ff is sidebar titles.\n- `--fill-bar` (#000000, text `--color-bar-text` #ffff00) is the section bar, table heads, dialog titles and the current page number. `--fill-bar-alt` (#ffffff, black text) is the footer. `--fill-inverse` (#0000ff, text `--color-inverse-text` #ffffff) is the hero band, the current section in the bar, the current tab and tooltips. `--fill-accent` (#ff0000, text `--color-accent-text` #000000) is the \"new\" badge and the filled part of a progress bar. `--color-accent-alt` is not used by the specimen.\n- `--color-fill-1` to `--color-fill-4` (yellow, white, amber, pale blue) are the grid cells and carousel slides.\n- Controls: the primary button is `--fill-button` (#000000) with `--color-button-text` (#ffff00) and an edge in `--color-input-border`; the secondary is `--fill-button-secondary` (transparent here) with `--color-button-secondary-text`; inputs are `--fill-input` (#ffffff) with `--color-input-text`. The hero carries only a primary button, because only that brings its own fill onto the inverted band.\n- Status: `--color-success` #006600, `--color-warning` #804000, `--color-danger` #cc0000 colour a boxed word and its box; `--color-danger` on `--color-danger-surface` is the error notice and the destructive button. They were not measured in a reference; they are dark enough to read on yellow and on white.\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-input-text` on `--color-input`, `--color-danger` on `--color-danger-surface` or the page. Keep to this so that other palettes work with the same structure.\n- Surface: `--border-width` 2px solid black is every box, cell and control edge; `--border-width-strong` 8px is the slab under the header and page header, over the footer and down the left of a notice. `--shadow-panel` is a 6px black lid on top of every panel, with no blur; controls have no shadow at rest, a 2px inner ring on hover and a 4px one when pressed; `--shadow-dialog` is a hard block 8px down and to the left. All radii are 0, every fill is flat, `--focus-ring` is a 4px solid outline, `--transition` is none.\n- One-off sizes built with `calc()` over tokens: the brand tile (1.3 times `--text-h1`), the avatar (2.5 times `--text-base`) and the switch (2 by 1 times `--text-base`).\n\n## Components\n\n- `.ds-page` on `<body>`: page colour and base type, no margin. Each page is a `.ds-page__frame`. `.ds-page__cols` is the four-column body (`--foot` adds 96px below the last one); `.ds-page__col` is a block of one column, `--2` of two, `--4` of four; `.ds-page__section` stacks blocks in one column (`--last` drops the gap); `.ds-page__label` is the 2px rule and small bold caption that opens a block.\n- `.ds-brand`: the site's mark and name, a link to the home page, at the left of the name line. `.ds-brand__mark` is a plain ruled square as tall as the name (`--text-h1`), dressed like the button: `--fill-button`, a `--border-width-strong` edge in `--color-border-strong`, 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 36px bold sans in `--color-heading`, on the canvas. The name `chronoskin` and the mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the header. `.ds-nav__top` holds the brand and a `.ds-nav__tagline`; `.ds-nav__list` is the band, one `.ds-nav__item` per word, each a `.ds-nav__link`, spread across the window. 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-breadcrumb`: a 14px sans line of `.ds-breadcrumb__link` items with `.ds-breadcrumb__sep` (`/`) between them, ending in a bold `.ds-breadcrumb__current`, directly above the page header.\n- `.ds-hero`: the home page's statement. `.ds-hero__title` is the headline at three times the display size: keep it to a few short words. `.ds-hero__foot` holds `.ds-hero__lead` (21px, two columns), `.ds-hero__actions` (one button over one text link) and `.ds-hero__note` (small grey text). No fill, no picture, no centring.\n- `.ds-page-header`: the head of an inner page, instead of the hero: `.ds-page-header__main` with `.ds-page-header__title` (64px) and one `.ds-page-header__text` line; `.ds-page-header__action` at the right holds one button. A heavy rule closes it.\n- `.ds-stat`: one figure: a 96px bold `.ds-stat__value` under a heavy rule with a small grey `.ds-stat__label` below. `.ds-stats` sets exactly four, one to a column; keep the values to a few digits.\n- `.ds-prose`: running text, at most 66 characters wide: h1, h2, h3 in bold sans, serif paragraphs, square-bulleted and numbered lists, `code` in 14px monospace with no background, `blockquote` behind a heavy rule. `.ds-prose__meta` is the grey sans 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 `<button>`, or an `<a>` when it only leads to another page: a rectangle with a heavy (double) edge in `--color-border-strong`, bold 16px sans. `.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. Group with `.ds-buttons`.\n- `.ds-form`: a form with no box: `.ds-form__title`, rows (`.ds-form__row`) of a small bold `.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 a bold `.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.\n- `.ds-table`: a data table in 16px sans: bold `th` on the bar fill, rows on 1px rules, no upright rules and no outer border, `.ds-table__row--alt` for alternate rows, `.ds-table__num` for right-aligned numeric columns, `.ds-table__group` for a group row.\n- `.ds-list`: the numbered contents list, an `<ol>`. Each `.ds-list__item` has a 36px bold `.ds-list__rank` numeral and a `.ds-list__body`: a 27px bold `.ds-list__title` link, a serif `.ds-list__excerpt` sentence and a grey sans `.ds-list__meta` line. Rows are divided by 1px rules.\n- `.ds-panel`: a box with a heavy rule all round, a 21px bold `.ds-panel__title` as its first line and a `.ds-panel__body`. Use it once on a page, for the thing you want answered.\n- `.ds-grid`: four flat blocks, one to a column, 24px apart, each at least `--size-block` tall with a 1px edge (`--2`, `--3`, `--4` select the other fills): a `.ds-grid__title`, a `.ds-grid__text` sentence and a `.ds-grid__meta` line held at the bottom of the block.\n- `.ds-tabs`: a line of `.ds-tabs__item`, each a bold 21px `.ds-tabs__tab` link in the quiet link colour, on a 1px rule. The current one is a `<span class=\"ds-tabs__tab is-current\">`: an inverted block. Content goes in `.ds-tabs__body`.\n- `.ds-badge`: a count: bold 14px sans on the accent fill, square. `.ds-badge--alt` is a bold word with an asterisk in `--color-accent-alt` before it (\"new\"); `.ds-badge--tag` is a word in a 1px box. Status labels are `.ds-badge--success`, `.ds-badge--warning` and `.ds-badge--danger`: a bold lowercase word in the status colour standing on a 2px rule of the same colour. No fill, no pill, no icon.\n- `.ds-sidebar`: one column of the body, in 16px sans. Each `.ds-sidebar__block` opens with a `.ds-sidebar__title` under a heavy rule and holds a `.ds-sidebar__list` of `.ds-sidebar__row` lines: a `.ds-sidebar__link` at the left and an optional grey `.ds-sidebar__count` at the right. `.ds-sidebar__text` is a small grey paragraph; `.ds-sidebar__search` is an input with a button.\n- `.ds-notice`: a sentence in a flat block of `--color-notice` with a 1px edge, starting with a bold sans `.ds-notice__title`. `.ds-notice--error` uses the danger colour for text and edge on `--color-danger-surface`. Stack several in `.ds-notices`.\n- `.ds-pagination`: a line of bold 21px `.ds-pagination__link` items under the table: later, numbers, earlier. The current page is a `<span>` with `is-current`: an inverted block. `is-disabled` is grey and not underlined.\n- `.ds-dialog`: a box with a heavy rule, `--size-dialog` wide, with a bold 21px `.ds-dialog__title` on the bar fill, `.ds-dialog__body`, `.ds-dialog__text` and left-aligned `.ds-dialog__actions`. It sits on `.ds-dialog__backdrop`, a flat block of `--color-overlay` only 24px wider than the dialog on each side. No soft shadow, no dimming of the page.\n- `.ds-empty`: a 36px bold `.ds-empty__title` statement, a grey `.ds-empty__text` sentence and one secondary button, left-aligned, with no box.\n- `.ds-footer`: a band of `--fill-bar-alt` in the four-column grid: `.ds-footer__name` (the site name at 64px, two columns), a `.ds-footer__text` paragraph and a stacked `.ds-footer__links` list of `.ds-footer__link` items, in 14px sans.\n- `.ds-accordion`: questions and answers between rules. Each `<details class=\"ds-accordion__item\">` has a `<summary class=\"ds-accordion__title\">` that keeps the browser's own triangle and a `.ds-accordion__body`. Use it for a short list of questions, never for navigation.\n- `.ds-progress`: a `.ds-progress__label` line (what is counted at the left, the figure at the right) over a ruled `.ds-progress__track` whose `.ds-progress__bar` is filled with the accent to a quarter, or `--50`, `--75`, `--100`. Use it for one count against a known whole.\n\n## Never\n\n- `content-width >= 90%`: the page fills the window; there is no centred column.\n- `font-size <= 56px`: the largest text is the 56px headline.\n- `font-size >= 12px`: small print is 12px; nothing is set smaller.\n- `font-families <= 3`: Arial, Arial Black and one monospace.\n- `letter-spacing <= 1px`: text is never spaced out; only the headline is drawn together, by 1px.\n- `uppercase-text <= 5%`: only the two letters of an avatar are uppercased.\n- `underlined-links <= 10%`: links are told by colour and underlined only under the pointer.\n- `line-height <= 1.4`: text is set tight.\n- `border-radius <= 0px`: every box and control is square.\n- `box-shadow-blur <= 0px`: the only shadow is the hard keyline inside a hovered or pressed button; nothing is soft and nothing floats.\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 <= 3px`: rules are 1px, heavy rules a 3px double line.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: a new block takes one, two or four of the columns and opens with a `.ds-page__label`; a set of things copies `.ds-list` (a large numeral, a bold sans title, a serif sentence, a grey sans meta line) or, for four equal things, `.ds-grid`; a line of choices copies `.ds-tabs` (bold words, the current one inverted); a status copies `.ds-badge--success`. Size is the only emphasis: make the one thing that matters larger, in bold sans, and leave the rest at text size in serif. 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. When in doubt do less: a rule before a box, a word before an icon, and no radius, shadow, gradient or transition at all.\n",
    "components.css": "/* Layout tokens (structure part). Read from the references: a headline set\n   several times the size of anything else, running text in a narrow measure,\n   and wide open space between parts: 16 and 24px inside a block, 48px between\n   blocks, 96px at the foot of a page. Four equal columns carry everything. */\n:root {\n  --size-page: 100%;\n  --size-rank: 72px;\n  --size-label: 150px;\n  --size-field: 360px;\n  --size-dialog: 440px;\n  --size-num: 120px;\n  --size-block: 176px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 48px;\n  --space-6: 96px;\n}\n\n/* ---------- shell: the whole window, four columns, nothing boxed ---------- */\n.ds-page {\n  margin: 0;\n  padding: 0;\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n.ds-page__frame {\n  box-sizing: border-box;\n  width: var(--size-page);\n  background: var(--color-canvas);\n  border-radius: var(--radius-page);\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__cols {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5) var(--space-4);\n  align-items: start;\n  padding: var(--space-5) var(--space-4);\n}\n.ds-page__cols--foot {\n  padding-bottom: var(--space-6);\n}\n.ds-page__col {\n  min-width: 0;\n}\n.ds-page__col--2 {\n  grid-column: span 2;\n}\n.ds-page__col--4 {\n  grid-column: span 4;\n}\n.ds-page__section {\n  margin: 0 0 var(--space-5);\n}\n.ds-page__section--last {\n  margin-bottom: 0;\n}\n/* The head of a block: a heavy rule with a small bold line hanging from it. */\n.ds-page__label {\n  margin: 0 0 var(--space-3);\n  padding: var(--space-2) 0 0;\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\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-4);\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-heading);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  flex: none;\n  display: block;\n  box-sizing: content-box;\n  width: var(--text-h1);\n  height: var(--text-h1);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--display-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: the name on an open line, then a band of words spread across the window ---------- */\n.ds-nav {\n  margin: 0;\n}\n.ds-nav__top {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-2) var(--space-4);\n  padding: var(--space-3) var(--space-4);\n}\n.ds-nav__tagline {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  text-align: right;\n}\n.ds-nav__list {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: baseline;\n  gap: var(--space-1) var(--space-4);\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  list-style: none;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-large);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-transform: var(--ui-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-nav__item {\n  margin: 0;\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. */\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#issue\"],\n.ds-page:has(#issue:target) .ds-nav__link[href=\"#issue\"],\n.ds-page:has(#essay:target) .ds-nav__link[href=\"#essay\"],\n.ds-page:has(#letters:target) .ds-nav__link[href=\"#letters\"],\n.ds-page:has(#method:target) .ds-nav__link[href=\"#method\"],\n.ds-page:has(#archive:target) .ds-nav__link[href=\"#archive\"] {\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;\n  padding: var(--space-4) var(--space-4) 0;\n  list-style: none;\n  font-family: var(--font-heading);\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  font-weight: var(--weight-bold);\n  color: var(--color-text);\n}\n\n/* ---------- hero: one headline as large as the window allows, the rest hangs off it ---------- */\n.ds-hero {\n  padding: var(--space-5) var(--space-4);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-hero__title {\n  margin: 0 0 var(--space-5);\n  font-family: var(--font-heading);\n  font-size: calc(var(--text-display) * 3);\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  overflow-wrap: break-word;\n}\n.ds-hero__foot {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-4);\n  align-items: start;\n}\n.ds-hero__lead {\n  grid-column: span 2;\n  margin: 0;\n  font-size: var(--text-large);\n}\n.ds-hero__actions {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-3);\n}\n.ds-hero__note {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\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-4);\n  padding: var(--space-3) var(--space-4) var(--space-4);\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-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-page-header__text {\n  margin: 0;\n  font-size: var(--text-large);\n  color: var(--color-text);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- stats: four large figures, one to a column ---------- */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-4);\n  margin: 0;\n  padding: var(--space-5) var(--space-4) 0;\n  list-style: none;\n}\n.ds-stat {\n  min-width: 0;\n  padding: var(--space-2) 0 0;\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-stat__value {\n  display: block;\n  font-family: var(--font-heading);\n  font-size: calc(var(--text-display) * 1.5);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  color: var(--color-heading);\n}\n.ds-stat__label {\n  display: block;\n  margin: var(--space-2) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- prose ---------- */\n.ds-prose {\n  max-width: 66ch;\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-4);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-4);\n  font-size: var(--text-h3);\n}\n.ds-prose p {\n  margin: 0 0 var(--space-3);\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: 0 0 var(--space-3);\n  padding: 0 0 0 var(--space-4);\n}\n.ds-prose ul {\n  list-style: square;\n}\n.ds-prose code {\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose blockquote {\n  margin: 0 0 var(--space-3);\n  padding: 0 0 0 var(--space-3);\n  border-left: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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-family: var(--font-heading);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- buttons: a heavy-ruled rectangle ---------- */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-button {\n  display: inline-block;\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-3);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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-heading);\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);\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: bold label left, control right ---------- */\n.ds-form {\n  margin: 0;\n}\n.ds-form__title {\n  margin: 0 0 var(--space-3);\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  box-sizing: border-box;\n  width: var(--size-label);\n  padding: var(--space-2) var(--space-3) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-text);\n}\n.ds-form__field {\n  flex: 1;\n  min-width: 0;\n}\n.ds-form__input {\n  display: block;\n  box-sizing: border-box;\n  width: var(--size-field);\n  max-width: 100%;\n  margin: 0;\n  padding: 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  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\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  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-danger);\n}\n.ds-form__hint {\n  margin: var(--space-1) 0 0;\n  font-family: var(--font-heading);\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-2);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n}\n.ds-form__checkbox {\n  margin: 0;\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: var(--space-4) 0 0;\n  padding-left: var(--size-label);\n}\n\n/* ---------- table: a filled head, rows on thin rules, no upright rules ---------- */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-radius: var(--radius-panel);\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\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);\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  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\n/* ---------- list: large numerals, a title, a sentence ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: grid;\n  grid-template-columns: var(--size-rank) minmax(0, 1fr);\n  align-items: baseline;\n  padding: var(--space-3) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n  border-top: 0;\n}\n.ds-list__rank {\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  color: var(--color-heading);\n}\n.ds-list__body {\n  min-width: 0;\n}\n.ds-list__title {\n  color: var(--color-link);\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  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__excerpt {\n  margin: var(--space-2) 0 0;\n}\n.ds-list__meta {\n  margin: var(--space-2) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- panel: a heavy-ruled box ---------- */\n.ds-panel {\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-panel);\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-3) 0;\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  padding: var(--space-2) var(--space-3) var(--space-3);\n}\n\n/* ---------- grid: four flat blocks, one to a column ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-4);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  min-width: 0;\n  min-height: var(--size-block);\n  padding: var(--space-3);\n  background: var(--color-fill-1);\n  border: var(--border-width) var(--border-style) var(--color-border);\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-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-grid__text {\n  margin: 0;\n}\n.ds-grid__meta {\n  margin: auto 0 0;\n  padding: var(--space-3) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- tabs: large words on a rule, the current one inverted ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: var(--space-1) var(--space-4);\n  margin: 0;\n  padding: 0 0 var(--space-2);\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n  font-size: var(--text-large);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n}\n.ds-tabs__item {\n  margin: 0;\n}\n.ds-tabs__tab {\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  padding: 0 var(--space-2);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  text-decoration: none;\n}\n.ds-tabs__body {\n  padding: var(--space-3) 0 0;\n}\n\n/* ---------- badge: a count, a tag, a status word on a heavy coloured rule ---------- */\n.ds-badge {\n  white-space: nowrap;\n  padding: 0 var(--space-1);\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}\n.ds-badge--alt::before {\n  content: \"*\";\n  margin-right: var(--space-1);\n  color: var(--color-accent-alt);\n}\n.ds-badge--tag {\n  padding: 0 var(--space-1);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  font-weight: var(--weight-body);\n}\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  border-style: var(--border-style);\n  border-color: currentColor;\n  border-width: 0 0 var(--border-width-strong);\n}\n.ds-badge--success {\n  color: var(--color-success);\n}\n.ds-badge--warning {\n  color: var(--color-warning);\n}\n.ds-badge--danger {\n  color: var(--color-danger);\n}\n\n/* ---------- sidebar: one of the four columns, lists under heavy rules ---------- */\n.ds-sidebar {\n  min-width: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\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-3);\n  padding: var(--space-2) 0 0;\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\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-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-2);\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  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-sidebar__search {\n  display: flex;\n  gap: var(--space-1);\n}\n.ds-sidebar__search .ds-form__input {\n  flex: 1;\n  min-width: 0;\n  width: auto;\n}\n\n/* ---------- notice: a flat block with a thin edge ---------- */\n.ds-notices {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n}\n.ds-notice {\n  margin: 0;\n  padding: var(--space-3);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n}\n.ds-notice__title {\n  font-family: var(--font-heading);\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: large numerals ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: var(--space-1) var(--space-3);\n  margin: 0;\n  padding: var(--space-4) 0 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-large);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n}\n.ds-pagination__link {\n  color: var(--color-link-quiet);\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  padding: 0 var(--space-2);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  text-decoration: none;\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-text-muted);\n  text-decoration: none;\n}\n\n/* ---------- dialog: a heavy-ruled box on a flat block no wider than it needs ---------- */\n.ds-dialog__backdrop {\n  box-sizing: border-box;\n  width: fit-content;\n  max-width: 100%;\n  padding: var(--space-4);\n  background: var(--color-overlay);\n}\n.ds-dialog {\n  box-sizing: border-box;\n  width: var(--size-dialog);\n  max-width: 100%;\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-2) 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-large);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-dialog__body {\n  padding: var(--space-3);\n}\n.ds-dialog__text {\n  margin: 0 0 var(--space-3);\n}\n.ds-dialog__actions {\n  display: flex;\n  gap: var(--space-2);\n}\n\n/* ---------- empty: a large plain statement ---------- */\n.ds-empty {\n  padding: 0;\n}\n.ds-empty__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-empty__text {\n  margin: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n}\n\n/* ---------- footer: a band, the name set large, two narrow columns ---------- */\n.ds-footer {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-4);\n  align-items: start;\n  padding: var(--space-5) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n}\n.ds-footer__name {\n  grid-column: span 2;\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-footer__text {\n  margin: 0;\n}\n.ds-footer__links {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- narrow windows: two columns, then one ---------- */\n/* ---------- components of the period ---------- */\n.ds-accordion {\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__item {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__title {\n  padding: var(--space-2) 0;\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  cursor: pointer;\n}\n.ds-accordion__title:focus-visible,\n.ds-accordion__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  max-width: 86ch;\n  margin: 0;\n  padding: 0 0 var(--space-3) var(--space-4);\n}\n.ds-progress {\n  margin: 0 0 var(--space-4);\n}\n.ds-progress__label {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin: 0 0 var(--space-2);\n  font-weight: var(--weight-bold);\n}\n.ds-progress__track {\n  height: var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--color-input);\n}\n.ds-progress__bar {\n  width: 25%;\n  height: 100%;\n  background: var(--fill-accent);\n}\n.ds-progress__bar--75 {\n  width: 75%;\n}\n\n@media (max-width: 900px) {\n  .ds-page__cols,\n  .ds-hero__foot,\n  .ds-stats,\n  .ds-grid,\n  .ds-footer {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-page__col--4 {\n    grid-column: span 2;\n  }\n  /* The main block of a row comes before the sidebar once the columns fold. */\n  .ds-page__col--lead {\n    order: -1;\n  }\n  .ds-hero__title {\n    font-size: calc(var(--text-display) * 1.5);\n  }\n  .ds-stat__value {\n    font-size: var(--text-display);\n  }\n}\n@media (max-width: 600px) {\n  .ds-page__cols,\n  .ds-hero__foot,\n  .ds-footer {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-page__col--2,\n  .ds-page__col--4,\n  .ds-hero__lead,\n  .ds-footer__name {\n    grid-column: auto;\n  }\n  .ds-page__cols--foot {\n    padding-bottom: var(--space-5);\n  }\n  .ds-nav__tagline {\n    text-align: left;\n  }\n  /* Five links on a phone: a grid, so every view wraps the same way; the columns are set below. */\n  .ds-nav__list {\n    display: grid;\n    font-size: var(--text-base);\n  }\n  .ds-hero__title,\n  .ds-page-header__title,\n  .ds-footer__name {\n    font-size: calc(var(--text-display) * 0.75);\n  }\n  .ds-page-header {\n    flex-direction: column;\n    align-items: flex-start;\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-3);\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-1);\n  }\n}\n\n/* ---------- phones: five links in two even rows, three over two, each centred in its cell ---------- */\n@media (max-width: 600px) {\n  .ds-nav__list {\n    grid-template-columns: repeat(6, minmax(0, 1fr));\n    justify-content: stretch;\n    justify-items: center;\n  }\n  .ds-nav__item {\n    grid-column: span 2;\n  }\n  .ds-nav__item:nth-child(n + 4) {\n    grid-column: span 3;\n  }\n}\n",
    "specimen.html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>chronoskin: a pamphlet about plain pages. Web brutalism, poster: 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<!-- One frame: the name line and the band are written once, the views change under them. -->\n<div class=\"ds-page__frame\">\n\n  <header class=\"ds-nav\" data-component=\"nav\">\n    <div class=\"ds-nav__top\">\n      <a class=\"ds-brand\" data-component=\"brand\" href=\"#issue\"><span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.8\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\" aria-hidden=\"true\"><rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\"/><line x1=\"3.5\" y1=\"20.5\" x2=\"20.5\" y2=\"3.5\"/></svg></span><span class=\"ds-brand__name\">chronoskin</span></a>\n      <p class=\"ds-nav__tagline\">A pamphlet about plain pages. Issue 31, March 2017.</p>\n    </div>\n    <ul class=\"ds-nav__list\">\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#issue\">Issue 31</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#essay\">Essays</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#letters\">Letters</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#method\">Method</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#archive\">Archive</a></li>\n    </ul>\n  </header>\n\n  <main>\n\n    <!-- View 1, the home page: the cover of the current issue. One headline, then four columns. -->\n    <section class=\"ds-view ds-view--home\" id=\"issue\">\n\n    <section class=\"ds-hero\" data-component=\"hero\">\n      <h1 class=\"ds-hero__title\">Say it in text.</h1>\n      <div class=\"ds-hero__foot\">\n        <p class=\"ds-hero__lead\">Five essays this month on pages that are nothing but their words: why they load at once, why they last, and why almost nobody is paid to make them.</p>\n        <div class=\"ds-hero__actions\">\n          <a class=\"ds-button\" href=\"#essay\">Read the first essay</a>\n          <a class=\"ds-link\" href=\"#archive\">or go through the back issues</a>\n        </div>\n        <p class=\"ds-hero__note\">Printed nowhere. Written by six people who have never met. Out on the first Tuesday of the month since 2014.</p>\n      </div>\n    </section>\n\n    <div class=\"ds-page__cols\">\n      <aside class=\"ds-page__col ds-sidebar\" data-component=\"sidebar\">\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">Find an essay</h2>\n          <form class=\"ds-sidebar__search\" action=\"#\">\n            <input class=\"ds-form__input\" type=\"text\" value=\"tables\" aria-label=\"Search the essays\">\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\">Subjects</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Speed</a> <span class=\"ds-sidebar__count\">41</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Type</a> <span class=\"ds-sidebar__count\">36</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#essay\">Links</a> <span class=\"ds-sidebar__count\">29</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-hover\" href=\"#essay\">Forms</a> <span class=\"ds-sidebar__count\">18</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Money</a> <span class=\"ds-sidebar__count\">12</span></li>\n          </ul>\n        </div>\n        <div class=\"ds-sidebar__block\">\n          <h2 class=\"ds-sidebar__title\">Back issues</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">30. The default serif</a> <span class=\"ds-sidebar__count\">Feb</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">29. No pictures</a> <span class=\"ds-sidebar__count\">Jan</span></li>\n            <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">28. Blue and purple</a> <span class=\"ds-sidebar__count\">Dec</span></li>\n          </ul>\n        </div>\n      </aside>\n\n      <section class=\"ds-page__col ds-page__col--2 ds-page__col--lead\" data-component=\"list\">\n        <p class=\"ds-page__label\">In this issue</p>\n        <ol class=\"ds-list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__rank\">01</span>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#essay\">A page is a letter, not a room</a> <span class=\"ds-badge ds-badge--alt\">new</span>\n              <p class=\"ds-list__excerpt\">You do not furnish a letter. You write it, and the reader decides where to sit.</p>\n              <p class=\"ds-list__meta\">Ines Varga, 1,900 words, 14 replies</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__rank\">02</span>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#essay\">Forty kilobytes is plenty</a>\n              <p class=\"ds-list__excerpt\">We weighed two hundred front pages. The heaviest was a recipe for toast.</p>\n              <p class=\"ds-list__meta\">Jonas Pell, 2,400 words, 31 replies</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__rank\">03</span>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title is-visited\" href=\"#essay\">The underline is the interface</a>\n              <p class=\"ds-list__excerpt\">A link that looks like a link needs no instructions and no hover state.</p>\n              <p class=\"ds-list__meta\">Tove Lindqvist, 1,200 words, 9 replies</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__rank\">04</span>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#essay\">Who pays for a page with nothing on it</a>\n              <p class=\"ds-list__excerpt\">Mostly nobody, which is both the trouble and the point.</p>\n              <p class=\"ds-list__meta\">Halvard Moe, 3,100 words, 52 replies</p>\n            </div>\n          </li>\n        </ol>\n      </section>\n\n      <div class=\"ds-page__col\">\n        <section class=\"ds-page__section\" data-component=\"panel\">\n          <div class=\"ds-panel\">\n            <h3 class=\"ds-panel__title\">Write for us</h3>\n            <div class=\"ds-panel__body\">One idea, under three thousand words, in a plain text file. We answer every one. <a class=\"ds-link\" href=\"#method\">How it works</a>\n              <div class=\"ds-progress\" data-component=\"progress\">\n                <p class=\"ds-progress__label\"><span>Issue 32, in proof</span> <span>3 of 4</span></p>\n                <div class=\"ds-progress__track\"><div class=\"ds-progress__bar ds-progress__bar--75\"></div></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\">Letters this week</p>\n          <div class=\"ds-prose\">\n            <p>&ldquo;I still use a spacer image and I am not sorry.&rdquo; Marit Aas, on issue 26.</p>\n            <p>&ldquo;Forty kilobytes is a luxury. Try four.&rdquo; Dov Peretz, on this issue.</p>\n            <p><a class=\"ds-link\" href=\"#letters\">Read them all or send one</a></p>\n          </div>\n        </section>\n      </div>\n\n      <section class=\"ds-page__col ds-page__col--4\" data-component=\"grid\">\n        <p class=\"ds-page__label\">Four standing subjects</p>\n        <div class=\"ds-grid\">\n          <div class=\"ds-grid__cell\">\n            <h3 class=\"ds-grid__title\">Speed</h3>\n            <p class=\"ds-grid__text\">What a page weighs and what the weight buys.</p>\n            <p class=\"ds-grid__meta\">41 essays</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--2\">\n            <h3 class=\"ds-grid__title\">Type</h3>\n            <p class=\"ds-grid__text\">The fonts already on the machine, and nothing else.</p>\n            <p class=\"ds-grid__meta\">36 essays</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--3\">\n            <h3 class=\"ds-grid__title\">Links</h3>\n            <p class=\"ds-grid__text\">Blue, underlined, and going where they say.</p>\n            <p class=\"ds-grid__meta\">29 essays</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--4\">\n            <h3 class=\"ds-grid__title\">Forms</h3>\n            <p class=\"ds-grid__text\">A label, a box, a button that says what it does.</p>\n            <p class=\"ds-grid__meta\">18 essays</p>\n          </div>\n        </div>\n      </section>\n    </div>\n\n    </section>\n\n    <!-- View 2, an inner page: one essay. Breadcrumb, a large title, the text across two columns. -->\n    <section class=\"ds-view\" id=\"essay\">\n\n    <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n      <li><a class=\"ds-breadcrumb__link\" href=\"#issue\">Issues</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li><a class=\"ds-breadcrumb__link\" href=\"#archive\">Issue 26</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li class=\"ds-breadcrumb__current\">Tables were fine</li>\n    </ol>\n\n    <div class=\"ds-page-header\" data-component=\"page-header\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Tables were fine</h1>\n        <p class=\"ds-page-header__text\">Jonas Pell, issue 26, October 2016. 2,400 words and 31 letters.</p>\n      </div>\n      <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#letters\">Send a letter</a></div>\n    </div>\n\n    <div class=\"ds-page__cols ds-page__cols--foot\">\n      <article class=\"ds-page__col ds-page__col--2\" data-component=\"typography\">\n        <p class=\"ds-page__label\">The essay</p>\n        <div class=\"ds-prose\">\n          <h1>Nobody misses the spacer image</h1>\n          <p class=\"ds-prose__meta\">First printed 2016-10-04, corrected once.</p>\n          <p>But the grid of numbers that a table gives you for nothing is still the clearest thing a browser can draw, and <a class=\"ds-link\" href=\"#archive\">the first essay in this issue</a> counts how often we rebuild it badly.</p>\n          <h2>What a table already does</h2>\n          <ul>\n            <li>Lines its columns up without being asked.</li>\n            <li>Reads aloud in the right order.</li>\n            <li>Prints.</li>\n          </ul>\n          <h3>Try it</h3>\n          <p>Open any page of figures and run <code>view-source</code> on it. If the numbers are not in a <strong>table</strong>, ask what was gained.</p>\n        </div>\n      </article>\n      <div class=\"ds-page__col\">\n        <p class=\"ds-page__label\">Letters on this essay</p>\n        <div class=\"ds-prose\">\n          <p>&ldquo;I still use a spacer image and I am not sorry.&rdquo;<br>Marit Aas</p>\n          <p>&ldquo;A table prints. That alone should have settled it.&rdquo;<br>Halvard Moe</p>\n          <p>&ldquo;You have never had to read one aloud on a phone.&rdquo;<br>Tove Lindqvist</p>\n          <p><a class=\"ds-link\" href=\"#letters\">All 31 letters</a></p>\n        </div>\n      </div>\n      <aside class=\"ds-page__col ds-sidebar\">\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">Also in issue 26</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">What a column is for</a> <span class=\"ds-sidebar__count\">01</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#essay\">Tables were fine</a> <span class=\"ds-sidebar__count\">02</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">The cell that would not wrap</a> <span class=\"ds-sidebar__count\">03</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">A calendar is a table</a> <span class=\"ds-sidebar__count\">04</span></li>\n            </ul>\n          </div>\n        <div class=\"ds-sidebar__block\" data-component=\"links\">\n          <h2 class=\"ds-sidebar__title\">Read next</h2>\n          <ul class=\"ds-links\">\n            <li><a class=\"ds-link\" href=\"#essay\">The underline is the interface</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#essay\">Forty kilobytes is plenty</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#archive\">Every essay on type</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#archive\">Issue 26 as one text file</a></li>\n            <li><a class=\"ds-link ds-link--quiet\" href=\"#method\">How we choose essays</a></li>\n            <li><a class=\"ds-link ds-link--strong\" href=\"#issue\">Back to issue 31</a></li>\n          </ul>\n        </div>\n      </aside>\n    </div>\n\n    </section>\n\n    <!-- View 3: letters. The form and its messages at the left, printed letters and a confirmation at the right. -->\n    <section class=\"ds-view\" id=\"letters\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li><a class=\"ds-breadcrumb__link\" href=\"#issue\">Issues</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li class=\"ds-breadcrumb__current\">Letters</li>\n    </ol>\n\n    <div class=\"ds-page-header\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Letters</h1>\n        <p class=\"ds-page-header__text\">Printed as they arrive, spelling included. One letter an issue from each reader.</p>\n      </div>\n      <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#method\">Read the method</a></div>\n    </div>\n\n    <div class=\"ds-page__cols ds-page__cols--foot\">\n      <div class=\"ds-page__col ds-page__col--2\">\n        <section class=\"ds-page__section\" data-component=\"notice\">\n          <p class=\"ds-page__label\">Send a letter</p>\n          <div class=\"ds-notices\">\n            <p class=\"ds-notice\"><span class=\"ds-notice__title\">Received.</span> Your letter on issue 31 will be read before the next issue.</p>\n            <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not sent.</span> The letter below has no address we can answer.</p>\n          </div>\n        </section>\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-name\">Name</label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input\" id=\"f-name\" type=\"text\" value=\"Marit Aas\"></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-mail\">E-mail</label>\n            <div class=\"ds-form__field\">\n              <input class=\"ds-form__input is-invalid\" id=\"f-mail\" type=\"text\" value=\"marit at example\">\n              <p class=\"ds-form__error\">That is not an e-mail address.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-about\">About</label>\n            <div class=\"ds-form__field\">\n              <select class=\"ds-form__input ds-form__input--auto\" id=\"f-about\">\n                <option>Issue 26</option>\n                <option>An earlier letter</option>\n                <option>Something else</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"f-text\">Letter</label>\n            <div class=\"ds-form__field\">\n              <textarea class=\"ds-form__input ds-form__input--wide\" id=\"f-text\" rows=\"5\">I still use a spacer image and I am not sorry.</textarea>\n              <p class=\"ds-form__hint\">Plain text. We print letters as they arrive, spelling included.</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> Print my name with the letter</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>Closed</button>\n          </div>\n        </form>\n        </section>\n      </div>\n      <div class=\"ds-page__col ds-page__col--2\">\n        <section class=\"ds-page__section\">\n          <p class=\"ds-page__label\">Printed this month</p>\n          <ol class=\"ds-list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">01</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title\" href=\"#essay\">On &ldquo;Tables were fine&rdquo;</a>\n                <p class=\"ds-list__excerpt\">I still use a spacer image and I am not sorry.</p>\n                <p class=\"ds-list__meta\">Marit Aas, 9 words</p>\n              </div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__rank\">02</span>\n              <div class=\"ds-list__body\">\n                <a class=\"ds-list__title is-visited\" href=\"#essay\">On &ldquo;Forty kilobytes is plenty&rdquo;</a>\n                <p class=\"ds-list__excerpt\">Forty is a luxury. Try four, and see what you keep.</p>\n                <p class=\"ds-list__meta\">Dov Peretz, 11 words</p>\n              </div>\n            </li>\n          </ol>\n        </section>\n        <section class=\"ds-page__section ds-page__section--last\" data-component=\"dialog\">\n          <p class=\"ds-page__label\">Your letter on issue 31</p>\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\">Withdraw your letter?</h3>\n              <div class=\"ds-dialog__body\">\n                <p class=\"ds-dialog__text\">The letter you sent on issue 31 will not be printed. This cannot be undone.</p>\n                <div class=\"ds-dialog__actions\">\n                  <button class=\"ds-button ds-button--danger\" type=\"button\">Withdraw</button>\n                  <a class=\"ds-button ds-button--secondary\" href=\"#letters\">Keep it</a>\n                </div>\n              </div>\n            </div>\n          </div>\n        </section>\n      </div>\n    </div>\n\n    </section>\n\n    <!-- View 4: the method. Running text, the house rules in a box, the marks and the people. -->\n    <section class=\"ds-view\" id=\"method\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li><a class=\"ds-breadcrumb__link\" href=\"#issue\">Issues</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li class=\"ds-breadcrumb__current\">Method</li>\n    </ol>\n\n    <div class=\"ds-page-header\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Method</h1>\n        <p class=\"ds-page-header__text\">How a page with nothing on it gets written, read and printed once a month.</p>\n      </div>\n      <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#letters\">Write to us</a></div>\n    </div>\n\n    <div class=\"ds-page__cols ds-page__cols--foot\">\n      <article class=\"ds-page__col ds-page__col--2\">\n        <p class=\"ds-page__label\">How an issue is made</p>\n        <div class=\"ds-prose\">\n          <p>Six people who have never met send each other text files. On the last Friday of the month the files that everyone has read become an issue, and the rest wait.</p>\n          <h2>The order of work</h2>\n          <ol>\n            <li>An idea, in one sentence, to all six.</li>\n            <li>A draft under three thousand words.</li>\n            <li>Two readers, neither of them the writer.</li>\n            <li>Proof, then print, then leave it alone.</li>\n          </ol>\n          <h3>What print means here</h3>\n          <p>An essay is printed when its address will never change. After that only a <strong>correction</strong> is allowed, dated, at the foot.</p>\n        </div>\n      </article>\n      <div class=\"ds-page__col\">\n        <section class=\"ds-page__section\">\n          <div class=\"ds-panel\">\n            <h3 class=\"ds-panel__title\">House rules</h3>\n            <div class=\"ds-panel__body\">Text only. No picture unless the essay is about that picture. Every link goes where it says. Nothing moves.\n              <div class=\"ds-accordion\" data-component=\"accordion\">\n                <details class=\"ds-accordion__item\" open>\n                  <summary class=\"ds-accordion__title\">May an essay carry code?</summary>\n                  <p class=\"ds-accordion__body\">Yes, as text, in the fixed face. Never as a picture of code.</p>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__title\">Who decides what is printed?</summary>\n                  <p class=\"ds-accordion__body\">All six. One refusal sends a draft back to its writer with the reason.</p>\n                </details>\n                <details class=\"ds-accordion__item\">\n                  <summary class=\"ds-accordion__title\">Can a printed essay change?</summary>\n                  <p class=\"ds-accordion__body\">Only by a dated correction at its foot.</p>\n                </details>\n              </div>\n            </div>\n          </div>\n        </section>\n        <section class=\"ds-page__section ds-page__section--last\">\n          <p class=\"ds-page__label\">Marks</p>\n          <p class=\"ds-list__meta\" data-component=\"badge\">Letters waiting <span class=\"ds-badge\">12</span>, a subject <span class=\"ds-badge ds-badge--tag\">type</span>, an essay out this week <span class=\"ds-badge ds-badge--alt\">new</span>, and the state of a draft: <span class=\"ds-badge ds-badge--success\">printed</span> <span class=\"ds-badge ds-badge--warning\">in proof</span> <span class=\"ds-badge ds-badge--danger\">spiked</span></p>\n        </section>\n      </div>\n      <aside class=\"ds-page__col ds-sidebar\">\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">The six</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Ines Varga</a> <span class=\"ds-sidebar__count\">41</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Jonas Pell</a> <span class=\"ds-sidebar__count\">38</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Tove Lindqvist</a> <span class=\"ds-sidebar__count\">33</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Halvard Moe</a> <span class=\"ds-sidebar__count\">29</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Marit Aas</a> <span class=\"ds-sidebar__count\">22</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#essay\">Dov Peretz</a> <span class=\"ds-sidebar__count\">17</span></li>\n            </ul>\n          </div>\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">In proof now</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#issue\">Against the modal</a> <span class=\"ds-sidebar__count\">April</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#issue\">A form is a letter back</a> <span class=\"ds-sidebar__count\">April</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#issue\">The page that printed itself</a> <span class=\"ds-sidebar__count\">May</span></li>\n            </ul>\n          </div>\n      </aside>\n    </div>\n\n    </section>\n\n    <!-- View 5: the archive. Four figures, tabs over the table, and what a subject with nothing in it shows. -->\n    <section class=\"ds-view\" id=\"archive\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li><a class=\"ds-breadcrumb__link\" href=\"#issue\">Issues</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li><a class=\"ds-breadcrumb__link\" href=\"#archive\">Archive</a></li>\n      <li class=\"ds-breadcrumb__sep\" aria-hidden=\"true\">/</li>\n      <li class=\"ds-breadcrumb__current\">2016</li>\n    </ol>\n\n    <div class=\"ds-page-header\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Archive, 2016</h1>\n        <p class=\"ds-page-header__text\">Twelve issues, every essay still at its first address.</p>\n      </div>\n      <div class=\"ds-page-header__action\"><button class=\"ds-button\" type=\"button\">Download the year</button></div>\n    </div>\n\n    <ul class=\"ds-stats\" data-component=\"stats\">\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">12</span> <span class=\"ds-stat__label\">issues</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">58</span> <span class=\"ds-stat__label\">essays</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">611</span> <span class=\"ds-stat__label\">letters printed</span></li>\n      <li class=\"ds-stat\"><span class=\"ds-stat__value\">0</span> <span class=\"ds-stat__label\">pictures</span></li>\n    </ul>\n\n    <div class=\"ds-page__cols\">\n      <section class=\"ds-page__col ds-page__col--4\" data-component=\"tabs\">\n        <ul class=\"ds-tabs\">\n          <li class=\"ds-tabs__item\"><span class=\"ds-tabs__tab is-current\" aria-current=\"true\">By issue</span></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#archive\">By writer</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab is-hover\" href=\"#archive\">By subject</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#archive\">Most letters</a></li>\n        </ul>\n        <div class=\"ds-tabs__body\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>Issue</th><th>Title</th><th class=\"ds-table__extra\">Out</th><th>Letters</th><th class=\"ds-table__num ds-table__extra\">Essays</th><th class=\"ds-table__num\">Words</th></tr>\n            </thead>\n            <tbody>\n              <tr><td>28</td><td><a class=\"ds-link\" href=\"#essay\">Blue and purple</a></td><td class=\"ds-table__extra\">2016-12-06</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num ds-table__extra\">5</td><td class=\"ds-table__num\">9,800</td></tr>\n              <tr class=\"ds-table__row--alt\"><td>27</td><td><a class=\"ds-link\" href=\"#essay\">The view source issue</a></td><td class=\"ds-table__extra\">2016-11-01</td><td><span class=\"ds-badge ds-badge--success\">open</span></td><td class=\"ds-table__num ds-table__extra\">6</td><td class=\"ds-table__num\">12,400</td></tr>\n              <tr><td>26</td><td><a class=\"ds-link\" href=\"#essay\">Tables were fine</a></td><td class=\"ds-table__extra\">2016-10-04</td><td><span class=\"ds-badge ds-badge--warning\">closing</span></td><td class=\"ds-table__num ds-table__extra\">4</td><td class=\"ds-table__num\">8,100</td></tr>\n              <tr class=\"ds-table__row--alt\"><td>25</td><td><a class=\"ds-link\" href=\"#essay\">Against the hamburger</a></td><td class=\"ds-table__extra\">2016-09-06</td><td><span class=\"ds-badge ds-badge--danger\">closed</span></td><td class=\"ds-table__num ds-table__extra\">5</td><td class=\"ds-table__num\">10,300</td></tr>\n              <tr><td>24</td><td><a class=\"ds-link\" href=\"#essay\">Read it on a train</a></td><td class=\"ds-table__extra\">2016-08-02</td><td><span class=\"ds-badge ds-badge--danger\">closed</span></td><td class=\"ds-table__num ds-table__extra\">5</td><td class=\"ds-table__num\">9,200</td></tr>\n            </tbody>\n          </table>\n          <ul class=\"ds-pagination\" data-component=\"pagination\">\n            <li><a class=\"ds-pagination__link\" href=\"#archive\">Later</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#archive\">1</a></li>\n            <li><span class=\"ds-pagination__link is-current\" aria-current=\"page\">2</span></li>\n            <li><a class=\"ds-pagination__link\" href=\"#archive\">3</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#archive\">4</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#archive\">Earlier</a></li>\n          </ul>\n        </div>\n      </section>\n    </div>\n\n    <div class=\"ds-page__cols ds-page__cols--foot\">\n      <section class=\"ds-page__col ds-page__col--2\">\n        <p class=\"ds-page__label\">Subject: carousels</p>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <h3 class=\"ds-empty__title\">No essays on &ldquo;carousels&rdquo;.</h3>\n          <p class=\"ds-empty__text\">Nobody has wanted to write one.</p>\n          <a class=\"ds-button ds-button--secondary\" href=\"#issue\">Back to the issue</a>\n        </div>\n      </section>\n      <aside class=\"ds-page__col ds-sidebar\">\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">Other years</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">2017</a> <span class=\"ds-sidebar__count\">3 issues</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">2015</a> <span class=\"ds-sidebar__count\">12 issues</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">2014</a> <span class=\"ds-sidebar__count\">4 issues</span></li>\n            </ul>\n          </div>\n      </aside>\n      <aside class=\"ds-page__col ds-sidebar\">\n          <div class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">Subjects</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">Speed</a> <span class=\"ds-sidebar__count\">41</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">Type</a> <span class=\"ds-sidebar__count\">36</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link is-visited\" href=\"#archive\">Links</a> <span class=\"ds-sidebar__count\">29</span></li>\n              <li class=\"ds-sidebar__row\"><a class=\"ds-sidebar__link\" href=\"#archive\">Forms</a> <span class=\"ds-sidebar__count\">18</span></li>\n            </ul>\n          </div>\n      </aside>\n    </div>\n\n    </section>\n\n  </main>\n</div>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <span class=\"ds-footer__name\">chronoskin</span>\n  <p class=\"ds-footer__text\">Written since 2014 by six people and their readers. No tracking, no fonts to fetch, nothing that moves. Copy what you like.</p>\n  <ul class=\"ds-footer__links\">\n    <li><a class=\"ds-footer__link\" href=\"#issue\">This issue</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#archive\">Every issue</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#letters\">Write to us</a></li>\n  </ul>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.brutalism.blog.s04.p05.t07.u04\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"brutalism\",\n    \"years\": [\n      2014,\n      2019\n    ]\n  },\n  \"archetype\": \"blog\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": true,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-br-4574\",\n  \"short\": \"v1-br-4574\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #000000;\n  --color-canvas: #000000;\n  --color-surface: #000000;\n  --color-surface-alt: #101010;\n  --color-surface-strong: #181818;\n  --color-bar: #1177aa;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #101010;\n  --color-bar-alt-text: #bdbdbd;\n  --color-inverse: #56c8ff;\n  --color-inverse-text: #000000;\n  --color-text: #bdbdbd;\n  --color-text-muted: #808080;\n  --color-heading: #ffffff;\n  --color-heading-alt: #56c8ff;\n  --color-link: #56c8ff;\n  --color-link-quiet: #56c8ff;\n  --color-link-visited: #9e9eff;\n  --color-link-hover: #ffffff;\n  --color-link-active: #ffffff;\n  --color-border: #555555;\n  --color-border-strong: #1177aa;\n  --color-border-muted: #303030;\n  --color-accent: #1177aa;\n  --color-accent-text: #ffffff;\n  --color-accent-alt: #9e9eff;\n  --color-fill-1: #000000;\n  --color-fill-2: #101010;\n  --color-fill-3: #181818;\n  --color-fill-4: #101010;\n  --color-button: #1177aa;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #101010;\n  --color-button-secondary-text: #56c8ff;\n  --color-input: #101010;\n  --color-input-text: #ffffff;\n  --color-input-border: #555555;\n  --color-disabled: #181818;\n  --color-disabled-text: #555555;\n  --color-danger: #ff6060;\n  --color-danger-surface: #000000;\n  --color-success: #60d060;\n  --color-warning: #e0b040;\n  --color-notice: #101010;\n  --color-notice-text: #bdbdbd;\n  --color-focus: #56c8ff;\n  --color-shadow: #555555;\n  --color-overlay: #181818;\n}\n\n/* @part type */\n:root {\n  --font-body: Arial, \"Liberation Sans\", Helvetica, sans-serif;\n  --font-heading: \"Arial Black\", \"Arial Bold\", Arial, \"Liberation Sans\", sans-serif;\n  --font-ui: Arial, \"Liberation Sans\", Helvetica, sans-serif;\n  --font-mono: \"Andale Mono\", \"Lucida Console\", \"Liberation Mono\", monospace;\n  --text-base: 14px;\n  --text-small: 12px;\n  --text-ui: 14px;\n  --text-large: 17px;\n  --text-display: 56px;\n  --text-h1: 30px;\n  --text-h2: 20px;\n  --text-h3: 15px;\n  --line-body: 1.3;\n  --line-heading: 1.05;\n  --line-display: 0.95;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 900;\n  --weight-display: 900;\n  --weight-ui: 700;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: -1px;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 3px;\n  --border-style: double;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: none;\n  --shadow-control-hover: inset 0 0 0 2px var(--color-button), inset 0 0 0 3px var(--color-button-hover-text);\n  --shadow-control-pressed: inset 0 0 0 3px var(--color-button-hover-text);\n  --shadow-dialog: none;\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 85%, white);\n  --fill-button-secondary: transparent;\n  --fill-input: transparent;\n  --focus-ring: 3px double var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
