{
  "id": "v1-br-8a11",
  "long_id": "v1.brutalism.landing.s08.p10.t01.u01",
  "name": "Web brutalism, programme",
  "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": "landing",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "The single column of web brutalism, as published between 2014 and 2019 by people who argued that a page needs seven declarations and no more: one narrow column of large serif text in the middle of the window, with nothing beside it, used here for a small conference and its timetable. This one is a blue screen: white Georgia on pure blue, links in terminal green, small monospaced capitals for everything that is a label, and rules drawn as rows of dots. Nothing is rounded, graded, blurred or animated and there are no pictures; structure is the order of the document, the size of the type and the dotted lines.",
  "url": "https://chrono.skin/s/v1-br-8a11",
  "preview_url": "https://chrono.skin/s/v1-br-8a11/specimen.html",
  "files": {
    "STYLE.md": "# Web brutalism, programme\n\n## Summary\n\nThe single column of web brutalism, as published between 2014 and 2019 by people who argued that a page needs seven declarations and no more: one narrow column of large serif text in the middle of the window, with nothing beside it, used here for a small conference and its timetable. This one is a blue screen: white Georgia on pure blue, links in terminal green, small monospaced capitals for everything that is a label, and rules drawn as rows of dots. Nothing is rounded, graded, blurred or animated and there are no pictures; structure is the order of the document, the size of the type and the dotted lines.\n\n## Layout\n\n- One centred column. `.ds-page` pads the window by `--space-4` (18px); `.ds-page__frame` is at most `--size-page` (756px) wide including its own 18px of padding at each side, which leaves 720px for text; it is centred and holds everything: header, views and footer. There is never a second column, a grid of the page or a sidebar beside the text.\n- `.ds-nav` is the head of the document, closed by a rule of `--border-width-strong`: `.ds-nav__head` with the `.ds-brand` at the left and a small `.ds-nav__tagline` at the right, then `.ds-nav__bar`, one line of `--fill-bar` holding the parts of the site as a numbered contents line (the stylesheet writes the numbers) and one `.ds-menu`.\n- Every view is one `.ds-page__body`, a stack. The home page opens with `.ds-hero` (a small line, a 72px sentence, a paragraph, one button and one link, a heavy rule below), then `.ds-stats` and the `.ds-progress` bar, then `.ds-page__section` parts `--space-6` (60px) apart. Each part opens with a `.ds-page__label`, a 26px heading on a rule that the stylesheet numbers within its view. On the home page: the day at a glance as a `.ds-list`, four speakers as a two by two `.ds-grid`, the tickets as a `.ds-panel`.\n- Inner pages (the programme, one session, the form, practical matters) keep the head and the footer and stay one column. `.ds-page__body` opens with the `.ds-breadcrumb` in small capitals, then `.ds-page-header` (34px title, one line, one button at the right, a heavy rule below); the hero and the figures are not used. Then the parts in order: `.ds-tabs` with the `.ds-table` in `.ds-tabs__body`, the `.ds-legend` and the centred `.ds-pagination` under it; or running text; or the messages, the form and the dialog one under the other. The only thing ever set beside text is `.ds-sidebar`, a small box floated into the right of the first part of a session page, `--size-aside` (230px) wide; the text runs round it.\n- Views. The specimen is one small site with five views, one showing at a time. `event` is the home page: what and when, figures and how full it is, Friday at a glance, four speakers, tickets. `programme` is the timetable of one day under the days as tabs, the marks, the days by number and the empty Sunday. `session` is one session: who gives it, its facts floated beside the abstract, and the switch that keeps it in your programme. `register` is the two messages the form can answer with, the form with its error and four buttons, and the question before withdrawing. `practical` is running text, the questions that open and close, and further links. 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` 3px is the padding of navigation links and the gap under a form label; `--space-2` 6px is the padding of buttons, inputs and table cells (vertical) and of badges; `--space-3` 12px is the padding of list rows, notices and table cells (horizontal) and the gap between buttons; `--space-4` 18px is the page margin, the padding of panels, grid cells and dialogs and the gap between paragraphs and form rows; `--space-5` 30px is the space round the hero and page header and the indent of lists; `--space-6` 60px is the gap between parts and the space at the foot of the page.\n- Fixed sizes: `--size-time` 150px is the hour column of the timetable (the list uses six tenths of it), `--size-field` 440px a text input, `--size-num` 70px a numeric table column, `--size-dialog` 460px a dialog, `--size-menu` 230px a dropped menu or tooltip.\n- Below 640px the column takes the whole window with 12px at each side, the headline and figures drop a size, figures go two to a line, the grid is one column, the sidebar stops floating and sits between two rules above the text, the hour column shrinks to its text and table cells marked `.ds-table__extra` are left out. Nothing scrolls sideways.\n- On a phone (560px and below) there is no menu button: `.ds-nav__bar` becomes a grid of three equal columns, the four links one cell each and the last item, the `earlier years` drop-down, two cells, so the five entries stand in two rows; link text wraps anywhere. The drop-down opens as it does on a wide screen 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-heading` are \"Times New Roman\", Times, serif: the browser's default. `--font-ui` is Arial, Helvetica, sans-serif at `--text-ui` 13px, the look of an unstyled form control; it is used for buttons, inputs, the count badge and the line of navigation links. `--font-mono` is \"Courier New\", Courier, monospace, for code and entry dates. All are system fonts; nothing was substituted.\n- `--text-base` 16px with `--line-body` 1.2 is all running text. `--text-small` 13px is meta lines, hints, the tagline, code and the footer. `--text-large` 18px is the hero's lead line and list titles.\n- Headings are the browser's: `--text-h1` 32px, `--text-h2` 24px, `--text-h3` 19px, all bold, `--line-heading` 1.1, never uppercased, never tracked. `--text-display` 48px bold at `--line-display` 1 is the hero headline and the largest text on a page; the name in the brand is 32px.\n- `--color-text` and `--color-heading` are #000000 on `--color-page` #ffffff. `--color-text-muted` #767676 is dates, counts and meta lines. `--color-heading-alt` #000080 (navy) is sidebar titles.\n- `--color-link` #0000ee, `--color-link-visited` #800080, `--color-link-hover` #000080, `--color-link-active` #ff0000: the browser's link colours. Every link is underlined at rest: `--link-decoration`, `--link-decoration-quiet` and `--link-decoration-hover` are all `underline`. `--color-link-quiet` equals the link colour.\n- `--color-bar` is #ffffff with #000000 text: the link bar, table heads and dialog titles are plain bold text on the page, told apart only by rules. `--color-bar-alt` (footer) is the same. Text on a bar is always `--color-bar-text`, on the footer `--color-bar-alt-text`.\n- `--color-inverse` #000000 with `--color-inverse-text` #ffffff is the one inverted block: the current item of the navigation.\n- `--color-border` and `--color-border-strong` are #000000. `--border-width` 1px is table cells, panels, grid cells, list rows and the sidebar rule; `--border-width-strong` 2px is the rule under the navigation, hero and page header, the top of the footer, and the outline of notices and dialogs. `--color-border-muted` #808080 is unused by the specimen and kept for faint dividers.\n- Surfaces: `--color-surface` #ffffff for table cells and panels, `--color-surface-alt` #f7f7f7 for alternate table rows, `--color-surface-strong` #efefef for panel titles and group rows. `--color-fill-1` to `--color-fill-4` repeat these three; grid cells are told apart by their rules, not their fills. Text on any surface or fill is `--color-text`.\n- `--color-accent` #000080 with `--color-accent-text` #ffffff is the count badge. `--color-accent-alt` #ff0000 is only the asterisk in front of a \"new\" marker, never text.\n- Status colours are the sixteen-colour set the links come from: `--color-success` #008000, `--color-warning` #808000, `--color-danger` #ff0000. They colour bold bracketed words and error text; `--color-danger` with `--color-danger-surface` is also the error notice and the destructive button. Green and olive were not measured in a reference; they are the nearest members of the same set.\n- Controls are the browser's, squared: buttons are `--color-button` #efefef with black 13px Arial and a `--border-width` edge in `--color-input-border` #767676 drawn in `--border-style`; inputs are white with the same edge. `--shadow-control` is a 1px bevel, two inset lines mixed from the button colour (lighter at the top and left, darker at the bottom and right) with no blur; `--shadow-control-pressed` turns it over and `--fill-button-hover` darkens the button a little. Another surface set may replace the bevel with nothing, an offset or a heavy underside; the layout only asks for the tokens. A pressed button takes `--color-border-strong`; a disabled one `--color-border-muted`.\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 page. Keep to this so that other palettes work with the same structure.\n- Hover, active and focus were not measurable on static captures; they use the browser's defaults. Focus is a 1px dotted outline. All radii are 0; panels and dialogs have no shadow; every fill is its plain palette colour.\n\n- A white page with two loud bands. `--color-page`, `--color-canvas` and `--color-surface` are #ffffff; `--color-surface-alt`, `--color-surface-strong`, `--color-notice` and `--color-overlay` are the one grey, #efefef.\n- `--color-bar` #6487dc (cornflower blue) with white `--color-bar-text` is the line of navigation, table heads and dialog titles. `--color-bar-alt` #ff6d06 (orange) with black text is the footer: the second band. `--color-inverse` #000000 with white text is the current navigation item.\n- Text is #000000; `--color-text-muted` is #555555. Headings are not black: `--color-heading` and `--color-heading-alt` are #0066cc, the colour of the links, and a heading is told from a link by its size and the rule under it.\n- `--color-link`, `--color-link-quiet` and `--color-link-visited` are #0066cc; `--color-link-hover` is #000000 and `--color-link-active` #ff6d06.\n- Rules are blue: `--color-border` #6487dc for cells, boxes and row dividers, `--color-border-strong` #0066cc for the rule under the header, hero and page header and around notices and dialogs. `--color-border-muted` is #dddddd.\n- `--color-accent` #ff6d06 with black text is the count badge; `--color-accent-alt` is the same orange, as a mark only.\n- Fills alternate #ffffff and #efefef; there are no tinted blocks. Buttons are #efefef with black text and white with blue text; inputs are white with a #767676 edge.\n- Status: `--color-danger` #c00000, `--color-success` #1e6e00, `--color-warning` #a04400. None was measured; they are dark enough to read on white and on #efefef.\n\n## Components\n\n- `.ds-page` on `<body>`: page colour, margin, base type. Everything goes in `.ds-page__frame`; a view's content in `.ds-page__body`. `.ds-page__section` is a part (`--last` drops its gap), `.ds-page__label` its numbered heading, `.ds-page__note` a small grey line under a part.\n- `.ds-nav`: the head. `.ds-nav__head` holds the brand and `.ds-nav__tagline`; `.ds-nav__bar` is a list of `.ds-nav__item` each holding one `.ds-nav__link`, numbered by the stylesheet, and may end with a `.ds-menu` in a plain `<li>`. The current part is an inverted block: the stylesheet marks the link whose `href` names the showing view (one selector per view, the home link when none is named); on a page of its own give the link `is-current`.\n- `.ds-brand`: the mark and name, a link to the home page. `.ds-brand__mark` is a square tile dressed like the primary button (`--fill-button`, `--color-button-text`, the control edge, radius and shadow) with the mark drawn in square caps; `.ds-brand__name` is 26px bold heading type. The name `chronoskin` and the mark are placeholders for the installing project's own.\n- `.ds-menu`: a `<details>` whose `<summary class=\"ds-menu__button\">` keeps the browser's own triangle and drops `.ds-menu__list`, a ruled box of `.ds-menu__link` items on `--color-surface`.\n- `.ds-breadcrumb`: a small line of `.ds-breadcrumb__link` items with `.ds-breadcrumb__sep` (`/`) between them, ending in `.ds-breadcrumb__current`.\n- `.ds-hero`: the introduction of the home page: `.ds-hero__kicker` (date and place), `.ds-hero__title` (72px), `.ds-hero__lead`, and `.ds-hero__actions` with one button and one text link. No box, no fill.\n- `.ds-page-header`: the head of an inner page: `.ds-page-header__main` with `.ds-page-header__title` (34px) and one `.ds-page-header__text` line; `.ds-page-header__action` holds one button. A heavy rule closes it.\n- `.ds-stat`: one figure, a 34px `.ds-stat__value` over a small `.ds-stat__label`. Three to five sit in a `.ds-stats` row, cut by upright rules.\n- `.ds-prose`: running text: h1 (34px, regular), h2, h3, paragraphs, square-bulleted lists, `code` in small monospace with no background.\n- `.ds-link`: text link with `is-visited`, `is-hover`, `is-active`, `is-focus`; `.ds-link--quiet` for secondary links. `.ds-links` is a square-bulleted list of links.\n- `.ds-button`: a flat block with a dotted edge, a `<button>` or an `<a>`. `.ds-button--secondary` on the secondary fill; `.ds-button--danger` is `--color-danger` on `--color-danger-surface` with a danger edge; `disabled` or `is-disabled` greys it; `is-hover` and `is-active` show the states. Group with `.ds-buttons`.\n- `.ds-form`: one control under the other. Each `.ds-form__row` is a small `.ds-form__label` over a `.ds-form__input` (`--wide` for textareas, `--auto` for selects); `is-invalid` plus a bold `.ds-form__error` marks an error; `.ds-form__hint` is help text; `.ds-form__check` with a native `.ds-form__checkbox`; `.ds-form__actions` holds the buttons. Messages about the whole form are `.ds-notice` blocks in the part above it.\n- `.ds-table`: the timetable: rows on rules with no upright lines, head on the bar fill, `.ds-table__row--alt` for alternate rows, `.ds-table__time` for the hour set at 34px, `.ds-table__title` and `.ds-table__meta` for the two lines of a session, `.ds-table__num` for the right-aligned numeric column, `.ds-table__group` for a group row, `.ds-table__extra` on cells a narrow window may drop.\n- `.ds-list`: rows on rules. Each `.ds-list__item` is a `.ds-list__time` and `.ds-list__main` with a bold `.ds-list__title` link and a `.ds-list__meta` line.\n- `.ds-panel`: a ruled box with a `.ds-panel__title` strip on the strong surface and a `.ds-panel__body`; `.ds-panel__text` is a paragraph, `.ds-panel__row` a line with a `.ds-panel__price` at its right end.\n- `.ds-grid`: two by two `.ds-grid__cell` blocks sharing their rules (`--2`, `--3`, `--4` select the other fills), each with a `.ds-grid__title` and a small `.ds-grid__text`.\n- `.ds-tabs`: a line of `.ds-tabs__tab` links on a rule; the current one is a `<span class=\"ds-tabs__tab is-current\">`, bold behind an arrow. Content goes in `.ds-tabs__body`.\n- `.ds-badge`: a small word on the accent fill. `.ds-badge--tag` is a word in a box; `.ds-badge--success`, `.ds-badge--warning` and `.ds-badge--danger` are a word in the status colour behind a small square. `.ds-legend` is a line that explains them under a table.\n- `.ds-sidebar`: a small box floated into the right of the text. Each `.ds-sidebar__block` has a `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__item` lines, plain or holding a `.ds-sidebar__link`; `.ds-sidebar__text` is a paragraph. Put it first inside a `.ds-page__section`, which contains the float.\n- `.ds-notice`: a paragraph between two heavy rules on the notice colour, starting with a bold `.ds-notice__title`. `.ds-notice--error` uses the danger colours. Stack several in `.ds-notices`.\n- `.ds-pagination`: a centred line of `.ds-pagination__link` items: earlier, numbers, later. The current one is a `<span>` with `is-current` on the inverse fill; `is-disabled` is muted.\n- `.ds-dialog`: a ruled box `--size-dialog` wide on `--color-surface` with a `.ds-dialog__title` on the bar fill, `.ds-dialog__body`, `.ds-dialog__text` and `.ds-dialog__actions`, centred in the page flow on `.ds-dialog__backdrop`, a flat block of `--color-overlay`.\n- `.ds-empty`: a ruled box with a grey `.ds-empty__title`, a `.ds-empty__text` sentence and one secondary button, centred.\n- `.ds-accordion`: `<details class=\"ds-accordion__item\">` elements between rules; `<summary class=\"ds-accordion__title\">` keeps the browser's triangle, `.ds-accordion__body` is the answer.\n- `.ds-tooltip`: a word with a dotted underline (give it `tabindex=\"0\"`) holding `.ds-tooltip__text`, an inverted hard-edged box shown under it on hover or focus, or with `is-open`. Below 1060px, where the column has no room at its right, a tooltip inside a `.ds-table` opens under its row, flush with the row's right end.\n- `.ds-switch`: a `<label>` holding a hidden `.ds-switch__input` checkbox, a `.ds-switch__track` (a two-cell box: empty when off, the right cell filled when on) and the text.\n- `.ds-progress`: a `.ds-progress__label` line over a `.ds-progress__track` whose `.ds-progress__bar` is filled with the accent to a quarter, or `--50`, `--75`, `--100`.\n- `.ds-avatar`: a ruled square with two monospace letters on the strong surface. `.ds-person` sets one beside a `.ds-person__name` and a `.ds-person__meta` line.\n- `.ds-footer`: a small centred block on the secondary bar fill: a `.ds-footer__row` sentence and `.ds-footer__links` of `.ds-footer__link` items.\n\n## Never\n\n- `content-width <= 60%`: one narrow column in the middle of a wide window.\n- `font-size <= 48px`: the largest text measured is a 48px headline.\n- `font-size >= 13px`: small text is the browser's 13px; nothing is set smaller.\n- `font-families <= 3`: the default serif, Arial in controls and a monospace.\n- `letter-spacing <= 0px`: no text is tracked.\n- `uppercase-text <= 0%`: nothing is uppercased by the stylesheet.\n- `underlined-links >= 95%`: links are underlined at rest, everywhere.\n- `line-height <= 1.3`: text is set at the browser's normal line height.\n- `border-radius <= 0px`: every box, button and input is square.\n- `box-shadow-blur <= 0px`: the only shadow is the hard 1px bevel of a control; nothing is soft and nothing floats.\n- `text-shadow = none`: text is flat.\n- `gradient-fills <= 0%`: every fill is one flat colour.\n- `border-width <= 2px`: rules are 1px, emphasised rules 2px.\n- `transition = none`: states change instantly.\n- `animation = none`: nothing moves.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: a new part of a page is a `.ds-page__section` under a `.ds-page__label`, placed in the one column and never beside another; anything with an hour is a row of `.ds-table` or `.ds-list`; a boxed offer copies `.ds-panel`; a set of choices copies `.ds-tabs` (words on a rule, an arrow before the chosen one); a status copies `.ds-badge--success` (a square and a word); a message copies `.ds-notice` (between two heavy rules). Labels of every kind use `--font-ui` with `--ui-transform`. 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 paragraph before a box, a rule before a fill, a native control before a custom one, and no radius, blur, gradient, picture, icon or transition at all.\n",
    "components.css": "/* Layout tokens (structure part). Read from the references: one column of\n   text between 560px and 680px wide in the middle of the window, a line of\n   space between paragraphs and two or three between parts. Nothing sits\n   beside the column. */\n:root {\n  --size-page: 756px;\n  --size-time: 150px;\n  --size-aside: 230px;\n  --size-field: 440px;\n  --size-num: 70px;\n  --size-dialog: 460px;\n  --size-menu: 230px;\n  --space-1: 3px;\n  --space-2: 6px;\n  --space-3: 12px;\n  --space-4: 18px;\n  --space-5: 30px;\n  --space-6: 60px;\n}\n\n/* ---------- shell: one column in the middle of the window ---------- */\n.ds-page {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) var(--space-6);\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  max-width: var(--size-page);\n  margin: 0 auto;\n  padding: 0 var(--space-4);\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-view {\n  counter-reset: part;\n}\n.ds-page__body {\n  padding: var(--space-5) 0 var(--space-6);\n}\n/* A part of the document, numbered by the stylesheet. */\n.ds-page__section {\n  display: flow-root;\n  margin: 0 0 var(--space-6);\n}\n.ds-page__section--last {\n  margin-bottom: 0;\n}\n.ds-page__label {\n  margin: 0 0 var(--space-4);\n  padding: 0 0 var(--space-2);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  counter-increment: part;\n}\n.ds-page__label::before {\n  content: counter(part) \".\";\n  margin-right: var(--space-3);\n  color: var(--color-text-muted);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n.ds-page__note {\n  margin: var(--space-3) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\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-links {\n  margin: 0;\n  padding: 0 0 0 var(--space-5);\n  list-style: square;\n}\n\n/* ---------- brand: the mark on a button-dressed 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: border-box;\n  width: calc(var(--text-h2) * 1.5);\n  height: calc(var(--text-h2) * 1.5);\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}\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-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-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 head of the document, then its contents as a numbered line ---------- */\n.ds-nav {\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  padding: 0 0 var(--space-3);\n}\n.ds-nav__head {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2) var(--space-4);\n  padding: 0 0 var(--space-3);\n}\n.ds-nav__tagline {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\n}\n.ds-nav__bar {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 0 var(--space-2);\n  margin: 0;\n  padding: var(--space-1) var(--space-2);\n  list-style: none;\n  counter-reset: item;\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}\n.ds-nav__item {\n  counter-increment: item;\n}\n.ds-nav__link {\n  display: block;\n  padding: var(--space-1) var(--space-2);\n  color: var(--color-bar-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-nav__link::before {\n  content: counter(item) \"\\00a0\";\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 part you are reading: an inverted block. One selector per view, and the\n   home link when the address names none; a session belongs to the programme. */\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#event\"],\n.ds-page:has(#event:target) .ds-nav__link[href=\"#event\"],\n.ds-page:has(#programme:target) .ds-nav__link[href=\"#programme\"],\n.ds-page:has(#session:target) .ds-nav__link[href=\"#programme\"],\n.ds-page:has(#register:target) .ds-nav__link[href=\"#register\"],\n.ds-page:has(#practical:target) .ds-nav__link[href=\"#practical\"] {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  text-decoration: none;\n}\n\n/* ---------- menu: a details element that drops a ruled list ---------- */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__button {\n  padding: var(--space-1) var(--space-2);\n  color: inherit;\n  cursor: pointer;\n}\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-menu__list {\n  position: absolute;\n  z-index: 2;\n  top: 100%;\n  left: 0;\n  box-sizing: border-box;\n  width: var(--size-menu);\n  max-width: 80vw;\n  margin: var(--space-1) 0 0;\n  padding: var(--space-2) 0;\n  list-style: none;\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-menu__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-menu__link:hover,\n.ds-menu__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- breadcrumb: a path in small type ---------- */\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-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\n}\n.ds-breadcrumb__link {\n  color: var(--color-link);\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: a date, one very large sentence, a paragraph, a button ---------- */\n.ds-hero {\n  margin: 0 0 var(--space-5);\n  padding: var(--space-4) 0 var(--space-5);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-hero__kicker {\n  margin: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-hero__title {\n  margin: 0 0 var(--space-4);\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 0 var(--space-4);\n  font-size: var(--text-large);\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3) var(--space-4);\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  margin: 0 0 var(--space-5);\n  padding: 0 0 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-h1);\n  font-weight: var(--weight-display);\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);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- stats: large figures over small labels, cut by rules ---------- */\n.ds-stats {\n  display: flex;\n  margin: 0 0 var(--space-4);\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  flex: 1;\n  min-width: 0;\n  padding: 0 var(--space-3);\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-stat:first-child {\n  padding-left: 0;\n  border-left: 0;\n}\n.ds-stat__value {\n  display: block;\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-stat__label {\n  display: block;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\n  color: var(--color-text-muted);\n}\n\n/* ---------- prose ---------- */\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  font-weight: var(--weight-display);\n}\n.ds-prose h2 {\n  margin-top: var(--space-5);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\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  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose > :first-child {\n  margin-top: 0;\n}\n.ds-prose > :last-child {\n  margin-bottom: 0;\n}\n\n/* ---------- buttons ---------- */\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-2) 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-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}\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.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  border-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  border-color: var(--color-border-muted);\n  background: var(--color-disabled);\n  box-shadow: none;\n  color: var(--color-disabled-text);\n  cursor: default;\n}\n\n/* ---------- form: a small label over each control, one under the other ---------- */\n.ds-form {\n  margin: 0;\n}\n.ds-form__row {\n  margin: 0 0 var(--space-4);\n}\n.ds-form__label {\n  display: block;\n  margin: 0 0 var(--space-1);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\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-2) var(--space-3);\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-body);\n  font-size: var(--text-base);\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  font-weight: var(--weight-bold);\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: baseline;\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-5) 0 0;\n}\n\n/* ---------- table: the timetable, rows on rules, the hour set large ---------- */\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);\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-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\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 td.ds-table__time {\n  width: var(--size-time);\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  white-space: nowrap;\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  white-space: nowrap;\n}\n.ds-table__title {\n  display: block;\n  font-size: var(--text-large);\n  line-height: var(--line-heading);\n}\n.ds-table__meta {\n  display: block;\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-table__group td {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\n}\n\n/* ---------- list: an hour, then a title and a line under it ---------- */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: baseline;\n  gap: var(--space-4);\n  padding: var(--space-3) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-list__time {\n  flex: none;\n  width: calc(var(--size-time) * 0.6);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-list__main {\n  flex: 1;\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-large);\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__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 ruled box, its title on a strip ---------- */\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-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  padding: var(--space-4);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-3);\n}\n.ds-panel__text:last-child {\n  margin-bottom: 0;\n}\n.ds-panel__row {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-4);\n  margin: 0;\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-panel__row:last-of-type {\n  margin-bottom: var(--space-4);\n}\n.ds-panel__price {\n  flex: none;\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n\n/* ---------- grid: two by two, blocks of the fill colours sharing their rules ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  border-style: var(--border-style);\n  border-color: var(--color-border);\n  border-width: var(--border-width) 0 0 var(--border-width);\n}\n.ds-grid__cell {\n  min-width: 0;\n  padding: var(--space-4);\n  background: var(--color-fill-1);\n  color: var(--color-text);\n  border-style: var(--border-style);\n  border-color: var(--color-border);\n  border-width: 0 var(--border-width) var(--border-width) 0;\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-1);\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  font-size: var(--text-small);\n}\n\n/* ---------- tabs: words on a rule, an arrow before the current one ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) var(--space-5);\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-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-tabs__tab {\n  color: var(--color-link);\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  color: var(--color-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n.ds-tabs__tab.is-current::before {\n  content: \"\\2192\\00a0\";\n}\n.ds-tabs__body {\n  padding: var(--space-4) 0 0;\n}\n\n/* ---------- badge: a block of the accent, or a status word behind a square ---------- */\n.ds-badge {\n  display: inline-block;\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-ui);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-badge--tag {\n  background: transparent;\n  border: var(--border-width) var(--border-style) var(--color-border);\n  color: var(--color-text);\n}\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  padding: 0;\n  background: transparent;\n  white-space: nowrap;\n}\n.ds-badge--success::before,\n.ds-badge--warning::before,\n.ds-badge--danger::before {\n  content: \"\\25A0\\00a0\";\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-legend {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-4);\n  margin: var(--space-3) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- sidebar: a box floated into the right of the text ---------- */\n.ds-sidebar {\n  float: right;\n  box-sizing: border-box;\n  width: var(--size-aside);\n  margin: 0 0 var(--space-4) var(--space-5);\n  padding: 0 0 0 var(--space-4);\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n  font-size: var(--text-small);\n}\n.ds-sidebar__block {\n  margin: 0 0 var(--space-4);\n}\n.ds-sidebar__block:last-child {\n  margin-bottom: 0;\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-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__item {\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:hover,\n.ds-sidebar__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-sidebar__text {\n  margin: 0;\n}\n\n/* ---------- notice: a paragraph between two heavy rules ---------- */\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-style: var(--border-style);\n  border-color: var(--color-border-strong);\n  border-width: var(--border-width-strong) 0;\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: earlier, the days by number, later ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  justify-content: center;\n  gap: var(--space-2) var(--space-3);\n  margin: var(--space-4) 0 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-pagination__link {\n  padding: 0 var(--space-2);\n  color: var(--color-link);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-pagination__link:focus-visible,\n.ds-pagination__link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  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 in the page flow ---------- */\n.ds-dialog__backdrop {\n  box-sizing: border-box;\n  padding: var(--space-5) 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  margin: 0 auto;\n  background: var(--color-surface);\n  border: var(--border-width) 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-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-body);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  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  flex-wrap: wrap;\n  gap: var(--space-3);\n}\n\n/* ---------- empty: a centred sentence and a button in a ruled box ---------- */\n.ds-empty {\n  padding: var(--space-5) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  text-align: center;\n}\n.ds-empty__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-display);\n  line-height: var(--line-heading);\n  color: var(--color-text-muted);\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-4);\n}\n\n/* ---------- accordion: details elements stacked between rules ---------- */\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-3) 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  margin: 0;\n  padding: 0 0 var(--space-4) var(--space-5);\n}\n\n/* ---------- tooltip: a hard inverted box under its trigger ---------- */\n.ds-tooltip {\n  position: relative;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  cursor: help;\n}\n.ds-tooltip:focus-visible {\n  outline: var(--focus-ring);\n}\n.ds-tooltip__text {\n  display: none;\n  position: absolute;\n  z-index: 2;\n  top: 100%;\n  left: 0;\n  box-sizing: border-box;\n  width: var(--size-menu);\n  margin: var(--space-2) 0 0;\n  padding: var(--space-2) var(--space-3);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  font-family: var(--font-body);\n  font-size: var(--text-small);\n  text-transform: none;\n  white-space: normal;\n}\n.ds-tooltip:hover .ds-tooltip__text,\n.ds-tooltip:focus .ds-tooltip__text,\n.ds-tooltip.is-open .ds-tooltip__text {\n  display: block;\n}\n\n/* windows without room at the right of the column: a hint in a table hangs under its row, from the row's right end */\n@media (max-width: 1060px) {\n  .ds-table tr:has(.ds-tooltip) {\n    position: relative;\n  }\n  .ds-table .ds-tooltip {\n    position: static;\n  }\n  .ds-table .ds-tooltip__text {\n    left: auto;\n    right: 0;\n    max-width: 100%;\n    margin-top: 0;\n  }\n}\n\n/* ---------- switch: a checkbox drawn as a two-cell box ---------- */\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-3);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  opacity: 0;\n  width: 0;\n  height: 0;\n  margin: 0;\n}\n.ds-switch__track {\n  flex: none;\n  box-sizing: content-box;\n  display: block;\n  width: calc(var(--text-base) * 2);\n  height: var(--text-base);\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-switch__track::after {\n  content: \"\";\n  display: block;\n  box-sizing: border-box;\n  width: 50%;\n  height: 100%;\n  border-right: var(--border-width) var(--border-style) var(--color-input-border);\n}\n.ds-switch__input:checked + .ds-switch__track::after {\n  margin-left: 50%;\n  border-right: 0;\n  background: var(--color-input-text);\n}\n.ds-switch__input:focus-visible + .ds-switch__track {\n  outline: var(--focus-ring);\n}\n\n/* ---------- progress: a blunt bar and its caption ---------- */\n.ds-progress {\n  margin: 0 0 var(--space-6);\n}\n.ds-progress__label {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: var(--space-1) var(--space-3);\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  text-transform: var(--ui-transform);\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/* ---------- avatar: a ruled square with two letters ---------- */\n.ds-avatar {\n  flex: none;\n  display: inline-block;\n  box-sizing: content-box;\n  width: calc(var(--text-base) * 2.5);\n  height: calc(var(--text-base) * 2.5);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-base);\n  line-height: calc(var(--text-base) * 2.5);\n  text-align: center;\n  text-transform: uppercase;\n}\n.ds-person {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  margin: 0 0 var(--space-3);\n}\n.ds-person__name {\n  display: block;\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n}\n.ds-person__meta {\n  display: block;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- footer ---------- */\n.ds-footer {\n  padding: var(--space-3) var(--space-4);\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__row {\n  margin: 0 0 var(--space-2);\n}\n.ds-footer__links {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: var(--space-1) var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  text-transform: var(--ui-transform);\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 ---------- */\n@media (max-width: 640px) {\n  .ds-page {\n    padding: var(--space-3) 0 var(--space-5);\n  }\n  .ds-page__frame {\n    padding: 0 var(--space-3);\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-hero__lead {\n    font-size: var(--text-base);\n  }\n  .ds-page-header {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-stats {\n    flex-wrap: wrap;\n    gap: var(--space-3) 0;\n  }\n  .ds-stat {\n    flex: none;\n    box-sizing: border-box;\n    width: 50%;\n    padding-left: 0;\n    border-left: 0;\n  }\n  .ds-stat__value,\n  .ds-page-header__title,\n  .ds-prose h1 {\n    font-size: var(--text-h2);\n  }\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-sidebar {\n    float: none;\n    width: auto;\n    margin: 0 0 var(--space-4);\n    padding: var(--space-3) 0;\n    border-left: 0;\n    border-style: var(--border-style);\n    border-color: var(--color-border);\n    border-width: var(--border-width) 0;\n  }\n  .ds-list__item {\n    gap: var(--space-3);\n  }\n  .ds-list__time {\n    width: auto;\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-2);\n  }\n  .ds-table td.ds-table__time {\n    width: auto;\n    font-size: var(--text-h3);\n    font-weight: var(--weight-bold);\n  }\n  .ds-table th.ds-table__num,\n  .ds-table td.ds-table__num {\n    width: auto;\n  }\n  .ds-table__title {\n    font-size: var(--text-base);\n  }\n  .ds-table__extra {\n    display: none;\n  }\n  .ds-dialog__backdrop {\n    padding: var(--space-4) var(--space-3);\n  }\n}\n\n/* ---------- phones: the bar is a grid of three, the menu word over two cells ---------- */\n@media (max-width: 560px) {\n  .ds-nav__bar {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n  .ds-nav__bar > :last-child {\n    grid-column: span 2;\n  }\n  .ds-nav__link {\n    overflow-wrap: anywhere;\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: two days on plain pages. Web brutalism, 2014 to 2019: specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n<div class=\"ds-page__frame\">\n\n  <header class=\"ds-nav\" data-component=\"nav\">\n    <div class=\"ds-nav__head\">\n      <a class=\"ds-brand\" data-component=\"brand\" href=\"#event\"><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\">14 + 15 September 2018</p>\n    </div>\n    <ul class=\"ds-nav__bar\">\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#event\">the event</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#programme\">programme</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#register\">register</a></li>\n      <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#practical\">practical</a></li>\n      <li>\n        <details class=\"ds-menu\" data-component=\"menu\">\n          <summary class=\"ds-menu__button\">earlier years</summary>\n          <ul class=\"ds-menu__list\">\n            <li><a class=\"ds-menu__link\" href=\"#programme\">2017: the programme</a></li>\n            <li><a class=\"ds-menu__link\" href=\"#programme\">2016: the programme</a></li>\n            <li><a class=\"ds-menu__link\" href=\"#practical\">2015: how it began</a></li>\n          </ul>\n        </details>\n      </li>\n    </ul>\n  </header>\n\n  <!-- View 1, the home page: what, when and where; the figures and how full it is; the first day at a glance; four speakers; tickets. -->\n  <section class=\"ds-view ds-view--home\" id=\"event\">\n    <div class=\"ds-page__body\">\n      <section class=\"ds-hero\" data-component=\"hero\">\n        <p class=\"ds-hero__kicker\">Friday 14 and Saturday 15 September 2018, the old print works</p>\n        <h1 class=\"ds-hero__title\">Two days on pages that are only pages.</h1>\n        <p class=\"ds-hero__lead\">chronoskin is a small conference for people who build for the web and suspect it needs less. Fourteen talks, two workshops, one room with good chairs, and nothing on a screen that a browser could not draw by itself.</p>\n        <div class=\"ds-hero__actions\">\n          <a class=\"ds-button\" href=\"#register\">Register, 90.00</a>\n          <a class=\"ds-link\" href=\"#programme\">or read the programme first</a>\n        </div>\n      </section>\n\n      <ul class=\"ds-stats\" data-component=\"stats\">\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">2</span> <span class=\"ds-stat__label\">days</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">14</span> <span class=\"ds-stat__label\">talks</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">180</span> <span class=\"ds-stat__label\">seats</span></li>\n        <li class=\"ds-stat\"><span class=\"ds-stat__value\">45</span> <span class=\"ds-stat__label\">still free</span></li>\n      </ul>\n      <div class=\"ds-progress\" data-component=\"progress\">\n        <p class=\"ds-progress__label\"><span>135 of 180 seats taken</span> <span>registration closes 1 September</span></p>\n        <div class=\"ds-progress__track\"><div class=\"ds-progress__bar ds-progress__bar--75\"></div></div>\n      </div>\n\n      <section class=\"ds-page__section\" data-component=\"list\">\n        <h2 class=\"ds-page__label\">Friday at a glance</h2>\n        <ul class=\"ds-list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__time\">09:30</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#session\">A page is a document</a>\n              <p class=\"ds-list__meta\">i. marek, opening talk, 40 minutes, the hall</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__time\">10:15</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title is-visited\" href=\"#session\">Forty kilobytes</a>\n              <p class=\"ds-list__meta\">t. okafor, 30 minutes, the hall</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__time\">13:15</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#session\">Tables were fine</a>\n              <p class=\"ds-list__meta\">r. sato, 30 minutes, the hall</p>\n            </div>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-list__time\">16:15</span>\n            <div class=\"ds-list__main\">\n              <a class=\"ds-list__title\" href=\"#session\">Blue links, and why</a>\n              <p class=\"ds-list__meta\">n. adeyemi, closing talk, 40 minutes, the hall</p>\n            </div>\n          </li>\n        </ul>\n        <p class=\"ds-page__note\"><a class=\"ds-link\" href=\"#programme\">The whole programme, both days</a></p>\n      </section>\n\n      <section class=\"ds-page__section\" data-component=\"grid\">\n        <h2 class=\"ds-page__label\">Four of the fourteen</h2>\n        <div class=\"ds-grid\">\n          <div class=\"ds-grid__cell\">\n            <p class=\"ds-person\"><span class=\"ds-avatar\" data-component=\"avatar\">im</span><span><span class=\"ds-grid__title\">i. marek</span><span class=\"ds-person__meta\">writes browsers</span></span></p>\n            <p class=\"ds-grid__text\">Has read the layout specification from end to end twice, the second time for pleasure.</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--2\">\n            <p class=\"ds-person\"><span class=\"ds-avatar\">to</span><span><span class=\"ds-grid__title\">t. okafor</span><span class=\"ds-person__meta\">newspaper developer</span></span></p>\n            <p class=\"ds-grid__text\">Took a front page from four megabytes to forty kilobytes and kept the job.</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--3\">\n            <p class=\"ds-person\"><span class=\"ds-avatar\">rs</span><span><span class=\"ds-grid__title\">r. sato</span><span class=\"ds-person__meta\">timetable maker</span></span></p>\n            <p class=\"ds-grid__text\">Maintains the timetables of three bus companies in one file of plain markup.</p>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--4\">\n            <p class=\"ds-person\"><span class=\"ds-avatar\">na</span><span><span class=\"ds-grid__title\">n. adeyemi</span><span class=\"ds-person__meta\">teacher</span></span></p>\n            <p class=\"ds-grid__text\">Teaches a first course on the web that does not mention a framework until week nine.</p>\n          </div>\n        </div>\n      </section>\n\n      <section class=\"ds-page__section ds-page__section--last\">\n        <h2 class=\"ds-page__label\">Tickets</h2>\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <h3 class=\"ds-panel__title\">One ticket, both days</h3>\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__row\"><span>Both days, lunch and coffee <span class=\"ds-badge\">45 left</span></span> <span class=\"ds-panel__price\">90.00</span></p>\n            <p class=\"ds-panel__row\"><span>Student or between jobs, same ticket</span> <span class=\"ds-panel__price\">40.00</span></p>\n            <p class=\"ds-panel__row\"><span>Saturday workshop, twenty seats <span class=\"ds-badge ds-badge--danger\">full</span></span> <span class=\"ds-panel__price\">+ 30.00</span></p>\n            <a class=\"ds-button\" href=\"#register\">Register</a>\n          </div>\n        </div>\n      </section>\n    </div>\n  </section>\n\n  <!-- View 2, the programme: the days as tabs over the timetable, what the marks mean, the days by number, and the day with nothing in it yet. -->\n  <section class=\"ds-view\" id=\"programme\">\n    <div class=\"ds-page__body\">\n      <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#event\">chronoskin 2018</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#programme\">programme</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">Friday</li>\n      </ol>\n      <header class=\"ds-page-header\" data-component=\"page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Programme</h1>\n          <p class=\"ds-page-header__text\">Friday 14 September. Doors at nine, last talk ends at five to five.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#register\">Register</a></div>\n      </header>\n      <section class=\"ds-page__section\" data-component=\"tabs\">\n        <ul class=\"ds-tabs\">\n          <li><span class=\"ds-tabs__tab is-current\">Friday</span></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#programme\">Saturday</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#programme\">Workshops</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#programme\">By speaker</a></li>\n        </ul>\n        <div class=\"ds-tabs__body\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th>Time</th><th>Session</th><th class=\"ds-table__extra\">Room</th><th class=\"ds-table__num\">Min.</th></tr>\n            </thead>\n            <tbody>\n              <tr><td class=\"ds-table__time\">09:00</td><td><span class=\"ds-table__title\">Doors, coffee, a name on a sticker</span></td><td class=\"ds-table__extra\">hall</td><td class=\"ds-table__num\">30</td></tr>\n              <tr class=\"ds-table__row--alt\"><td class=\"ds-table__time\">09:30</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">A page is a document</a></span><span class=\"ds-table__meta\">Opening talk. i. marek on what a browser does when you leave it alone. <span class=\"ds-badge ds-badge--success\">seats</span></span></td><td class=\"ds-table__extra\">hall</td><td class=\"ds-table__num\">40</td></tr>\n              <tr><td class=\"ds-table__time\">10:15</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">Forty kilobytes</a></span><span class=\"ds-table__meta\">t. okafor rebuilds a news front page in one file and counts every byte. <span class=\"ds-badge ds-badge--warning\">few seats</span></span></td><td class=\"ds-table__extra\">hall</td><td class=\"ds-table__num\">30</td></tr>\n              <tr class=\"ds-table__row--alt\"><td class=\"ds-table__time\">11:00</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">The default stylesheet, read aloud</a></span><span class=\"ds-table__meta\">A reading, with commentary, by l. brandt. Bring the specification.</span></td><td class=\"ds-table__extra\"><span class=\"ds-tooltip\" data-component=\"tooltip\" tabindex=\"0\">PR<span class=\"ds-tooltip__text\" role=\"tooltip\">The press room, first floor, up the iron stairs.</span></span></td><td class=\"ds-table__num\">45</td></tr>\n              <tr><td class=\"ds-table__time\">12:00</td><td><span class=\"ds-table__title\">Lunch</span><span class=\"ds-table__meta\">Soup and bread in the yard. Included.</span></td><td class=\"ds-table__extra\">yard</td><td class=\"ds-table__num\">75</td></tr>\n              <tr class=\"ds-table__row--alt\"><td class=\"ds-table__time\">13:15</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">Tables were fine</a></span><span class=\"ds-table__meta\">r. sato on laying out a timetable with the element made for timetables. <span class=\"ds-badge ds-badge--danger\">full</span></span></td><td class=\"ds-table__extra\">hall</td><td class=\"ds-table__num\">30</td></tr>\n              <tr><td class=\"ds-table__time\">14:00</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">Workshop: one stylesheet, no classes</a></span><span class=\"ds-table__meta\">Two hours, laptops, twenty seats. <span class=\"ds-badge ds-badge--danger\">full</span></span></td><td class=\"ds-table__extra\">PR</td><td class=\"ds-table__num\">120</td></tr>\n              <tr class=\"ds-table__row--alt\"><td class=\"ds-table__time\">16:15</td><td><span class=\"ds-table__title\"><a class=\"ds-link\" href=\"#session\">Blue links, and why</a></span><span class=\"ds-table__meta\">Closing talk of the day. n. adeyemi. <span class=\"ds-badge ds-badge--success\">seats</span></span></td><td class=\"ds-table__extra\">hall</td><td class=\"ds-table__num\">40</td></tr>\n            </tbody>\n          </table>\n          <p class=\"ds-legend\" data-component=\"badge\"><span><span class=\"ds-badge\">new</span> added this week</span> <span><span class=\"ds-badge ds-badge--success\">seats</span> room for you</span> <span><span class=\"ds-badge ds-badge--warning\">few seats</span> under ten</span> <span><span class=\"ds-badge ds-badge--danger\">full</span> a list at the door</span></p>\n          <ul class=\"ds-pagination\" data-component=\"pagination\">\n            <li><span class=\"ds-pagination__link is-disabled\">earlier</span></li>\n            <li><span class=\"ds-pagination__link is-current\">1</span></li>\n            <li><a class=\"ds-pagination__link\" href=\"#programme\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#programme\">3</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#programme\">later</a></li>\n          </ul>\n        </div>\n      </section>\n      <section class=\"ds-page__section ds-page__section--last\">\n        <h2 class=\"ds-page__label\">Sunday 16 September</h2>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <h3 class=\"ds-empty__title\">Nothing is planned.</h3>\n          <p class=\"ds-empty__text\">The room is ours until noon. If you would like to show something to whoever is still in town, say so.</p>\n          <a class=\"ds-button ds-button--secondary\" href=\"#register\">Offer a Sunday session</a>\n        </div>\n      </section>\n    </div>\n  </section>\n\n  <!-- View 3, one session: who gives it, the facts floated beside the text, the abstract, and what follows it in the room. -->\n  <section class=\"ds-view\" id=\"session\">\n    <div class=\"ds-page__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#event\">chronoskin 2018</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#programme\">programme</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">Friday, 13:15</li>\n      </ol>\n      <header class=\"ds-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\">Friday, 13:15 to 13:45, the hall. <span class=\"ds-badge ds-badge--danger\">full</span></p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#programme\">Back to Friday</a></div>\n      </header>\n      <section class=\"ds-page__section\">\n        <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n          <section class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">This session</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__item\">30 minutes, then ten of questions</li>\n              <li class=\"ds-sidebar__item\">Recorded, sound only</li>\n              <li class=\"ds-sidebar__item\"><a class=\"ds-sidebar__link\" href=\"#practical\">Slides as one page of markup</a></li>\n            </ul>\n          </section>\n          <section class=\"ds-sidebar__block\">\n            <h2 class=\"ds-sidebar__title\">Next in the hall</h2>\n            <ul class=\"ds-sidebar__list\">\n              <li class=\"ds-sidebar__item\"><a class=\"ds-sidebar__link\" href=\"#session\">14:00 Pause</a></li>\n              <li class=\"ds-sidebar__item\"><a class=\"ds-sidebar__link\" href=\"#session\">14:30 The form element</a></li>\n              <li class=\"ds-sidebar__item\"><a class=\"ds-sidebar__link\" href=\"#session\">16:15 Blue links, and why</a></li>\n            </ul>\n          </section>\n        </aside>\n        <p class=\"ds-person\"><span class=\"ds-avatar\">rs</span><span><span class=\"ds-person__name\">r. sato</span><span class=\"ds-person__meta\">timetable maker, third year at chronoskin</span></span></p>\n        <div class=\"ds-prose\">\n          <p>For ten years we were told not to use tables, and for ten years the bus timetable was a picture of a table. This talk is about the element that was made for rows and columns, what it still does better than anything built since, and the three things it never learned.</p>\n          <h2>What you will see</h2>\n          <p>One timetable, four hundred rows, set three ways: as a table, as a grid, and as a list that pretends. We will time each on a five-year-old phone and read each aloud with a screen reader.</p>\n          <h3>Bring</h3>\n          <ul>\n            <li>A timetable you dislike.</li>\n            <li>A browser with its inspector open on <code>display: table-cell</code>.</li>\n          </ul>\n        </div>\n      </section>\n      <section class=\"ds-page__section ds-page__section--last\">\n        <h2 class=\"ds-page__label\">Your programme</h2>\n        <p><label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>keep this session in my programme</span></label></p>\n        <p class=\"ds-page__note\">The room is full. Holding a place here keeps your seat; letting it go gives it to the first name on the list at the door.</p>\n      </section>\n    </div>\n  </section>\n\n  <!-- View 4, registering: what the form answered, the form with its error, and the question asked before a registration is withdrawn. -->\n  <section class=\"ds-view\" id=\"register\">\n    <div class=\"ds-page__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#event\">chronoskin 2018</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#register\">register</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">your details</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Register</h1>\n          <p class=\"ds-page-header__text\">One form, no account. You pay by transfer when the invoice arrives.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#practical\">What is included</a></div>\n      </header>\n      <section class=\"ds-page__section\">\n        <div class=\"ds-notices\" data-component=\"notice\">\n          <p class=\"ds-notice\"><span class=\"ds-notice__title\">A place is held for you until midnight.</span> 45 of 180 seats are free.</p>\n          <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not sent.</span> The address below cannot be right; everything else was kept.</p>\n        </div>\n      </section>\n      <section class=\"ds-page__section\">\n        <h2 class=\"ds-page__label\">Your details</h2>\n        <form class=\"ds-form\" data-component=\"form\" action=\"#register\">\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"r-name\">Name, as it should be on the sticker</label>\n            <input class=\"ds-form__input\" id=\"r-name\" type=\"text\" value=\"a. lindqvist\">\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"r-mail\">Address for the invoice</label>\n            <input class=\"ds-form__input is-invalid\" id=\"r-mail\" type=\"text\" value=\"a.lindqvist@example\" aria-invalid=\"true\" aria-describedby=\"r-mail-err\">\n            <p class=\"ds-form__error\" id=\"r-mail-err\">This address ends before it should. Is it .org, .net?</p>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"r-ticket\">Ticket</label>\n            <select class=\"ds-form__input ds-form__input--auto\" id=\"r-ticket\">\n              <option>Both days, 90.00</option>\n              <option>Student or between jobs, 40.00</option>\n            </select>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"r-note\">Anything we should know</label>\n            <textarea class=\"ds-form__input ds-form__input--wide\" id=\"r-note\" rows=\"3\">No meat at lunch, please. I will arrive on the 08:40 train.</textarea>\n            <p class=\"ds-form__hint\">Food, stairs, a chair near the door. It is read by a person.</p>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\"><span class=\"ds-switch__track\"></span><span>print my name in the list of people coming</span></label>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> <span>I have read the <a class=\"ds-link\" href=\"#practical\">house rules</a> and will keep to them.</span></label>\n          </div>\n          <div class=\"ds-form__actions ds-buttons\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"submit\">Send</button>\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Keep for later</button>\n            <button class=\"ds-button ds-button--danger\" type=\"button\">Withdraw</button>\n            <button class=\"ds-button\" type=\"button\" disabled>Add the workshop (full)</button>\n          </div>\n        </form>\n      </section>\n      <section class=\"ds-page__section ds-page__section--last\">\n        <h2 class=\"ds-page__label\">Withdrawing</h2>\n        <div class=\"ds-dialog__backdrop\">\n          <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-title\">\n            <h3 class=\"ds-dialog__title\" id=\"dlg-title\">Withdraw this registration?</h3>\n            <div class=\"ds-dialog__body\">\n              <p class=\"ds-dialog__text\">Your place goes to the next person on the list at once. Until 1 September you can register again if a seat is free.</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=\"#register\">Keep my place</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </section>\n    </div>\n  </section>\n\n  <!-- View 5, practical matters: getting there and the house rules as running text, questions that open and close, further links. -->\n  <section class=\"ds-view\" id=\"practical\">\n    <div class=\"ds-page__body\">\n      <ol class=\"ds-breadcrumb\">\n        <li><a class=\"ds-breadcrumb__link\" href=\"#event\">chronoskin 2018</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li><a class=\"ds-breadcrumb__link\" href=\"#practical\">practical</a></li>\n        <li class=\"ds-breadcrumb__sep\">/</li>\n        <li class=\"ds-breadcrumb__current\">getting there</li>\n      </ol>\n      <header class=\"ds-page-header\">\n        <div class=\"ds-page-header__main\">\n          <h1 class=\"ds-page-header__title\">Practical</h1>\n          <p class=\"ds-page-header__text\">Where it is, what to bring, how we behave.</p>\n        </div>\n        <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#register\">Register</a></div>\n      </header>\n      <section class=\"ds-page__section ds-prose\" data-component=\"typography\">\n        <h1>The old print works, by the canal</h1>\n        <p>The hall is the press room of a newspaper that stopped printing in 1994. It is ten minutes on foot from the station: leave by the north door, follow the canal with the water on your left, and stop at the brick chimney.</p>\n        <h2>What to bring</h2>\n        <p>A laptop only if you are in a workshop. Paper is provided. The network is slow on purpose and its name is <code>plain</code>.</p>\n        <h3>House rules</h3>\n        <ul>\n          <li>Speakers show pages, not slides of pages.</li>\n          <li>Questions are questions.</li>\n          <li>Nobody is photographed without being asked first.</li>\n        </ul>\n        <p>If something goes wrong, find anyone with a green sticker.</p>\n      </section>\n      <section class=\"ds-page__section\">\n        <h2 class=\"ds-page__label\">Asked every year</h2>\n        <div class=\"ds-accordion\" data-component=\"accordion\">\n          <details class=\"ds-accordion__item\" open>\n            <summary class=\"ds-accordion__title\">Is there somewhere to stay?</summary>\n            <p class=\"ds-accordion__body\">Two guest houses hold rooms for us until 1 August. Say the name of the conference when you write to them.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__title\">Can I give my ticket to someone else?</summary>\n            <p class=\"ds-accordion__body\">Yes. Tell us the new name by the Wednesday before, so the sticker is right.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__title\">Will the talks be recorded?</summary>\n            <p class=\"ds-accordion__body\">Sound only, and only where the speaker agrees. The files go up as plain links a month later.</p>\n          </details>\n        </div>\n      </section>\n      <section class=\"ds-page__section ds-page__section--last\" data-component=\"links\">\n        <h2 class=\"ds-page__label\">Further</h2>\n        <ul class=\"ds-links\">\n          <li><a class=\"ds-link\" href=\"#programme\">The programme, both days</a></li>\n          <li><a class=\"ds-link is-visited\" href=\"#event\">The front page, which you have read</a></li>\n          <li><a class=\"ds-link is-hover\" href=\"#register\">Register (a link under the pointer)</a></li>\n          <li><a class=\"ds-link is-active\" href=\"#register\">Register (a link being pressed)</a></li>\n        </ul>\n      </section>\n    </div>\n  </section>\n\n  <footer class=\"ds-footer\" data-component=\"footer\">\n    <p class=\"ds-footer__row\">chronoskin, two days on plain pages. Put on by six volunteers since 2015. This page is one file and no pictures.</p>\n    <ul class=\"ds-footer__links\">\n      <li><a class=\"ds-footer__link\" href=\"#event\">the event</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#programme\">programme</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#register\">register</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#practical\">practical</a></li>\n    </ul>\n  </footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.brutalism.landing.s08.p10.t01.u01\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"brutalism\",\n    \"years\": [\n      2014,\n      2019\n    ]\n  },\n  \"archetype\": \"landing\",\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-8a11\",\n  \"short\": \"v1-br-8a11\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #ffffff;\n  --color-canvas: #ffffff;\n  --color-surface: #ffffff;\n  --color-surface-alt: #efefef;\n  --color-surface-strong: #efefef;\n  --color-bar: #6487dc;\n  --color-bar-text: #ffffff;\n  --color-bar-alt: #ff6d06;\n  --color-bar-alt-text: #000000;\n  --color-inverse: #000000;\n  --color-inverse-text: #ffffff;\n  --color-text: #000000;\n  --color-text-muted: #555555;\n  --color-heading: #0066cc;\n  --color-heading-alt: #0066cc;\n  --color-link: #0066cc;\n  --color-link-quiet: #0066cc;\n  --color-link-visited: #0066cc;\n  --color-link-hover: #000000;\n  --color-link-active: #ff6d06;\n  --color-border: #6487dc;\n  --color-border-strong: #0066cc;\n  --color-border-muted: #dddddd;\n  --color-accent: #ff6d06;\n  --color-accent-text: #000000;\n  --color-accent-alt: #ff6d06;\n  --color-fill-1: #ffffff;\n  --color-fill-2: #efefef;\n  --color-fill-3: #ffffff;\n  --color-fill-4: #efefef;\n  --color-button: #efefef;\n  --color-button-text: #000000;\n  --color-button-hover-text: #0066cc;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #0066cc;\n  --color-input: #ffffff;\n  --color-input-text: #000000;\n  --color-input-border: #767676;\n  --color-disabled: #efefef;\n  --color-disabled-text: #767676;\n  --color-danger: #c00000;\n  --color-danger-surface: #ffffff;\n  --color-success: #1e6e00;\n  --color-warning: #a04400;\n  --color-notice: #efefef;\n  --color-notice-text: #000000;\n  --color-focus: #0066cc;\n  --color-shadow: #000000;\n  --color-overlay: #efefef;\n}\n\n/* @part type */\n:root {\n  --font-body: \"Times New Roman\", Times, serif;\n  --font-heading: \"Times New Roman\", Times, serif;\n  --font-ui: Arial, Helvetica, sans-serif;\n  --font-mono: \"Courier New\", Courier, monospace;\n  --text-base: 16px;\n  --text-small: 13px;\n  --text-ui: 13px;\n  --text-large: 18px;\n  --text-display: 48px;\n  --text-h1: 32px;\n  --text-h2: 24px;\n  --text-h3: 19px;\n  --line-body: 1.2;\n  --line-heading: 1.1;\n  --line-display: 1;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 700;\n  --weight-ui: 400;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: underline;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: inset 1px 1px 0 color-mix(in srgb, var(--color-button) 25%, white), inset -1px -1px 0 color-mix(in srgb, var(--color-button) 60%, black);\n  --shadow-control-hover: inset 1px 1px 0 color-mix(in srgb, var(--color-button) 25%, white), inset -1px -1px 0 color-mix(in srgb, var(--color-button) 60%, black), inset 0 0 0 2px color-mix(in srgb, var(--color-button) 25%, white);\n  --shadow-control-pressed: inset 1px 1px 0 color-mix(in srgb, var(--color-button) 60%, black), inset -1px -1px 0 color-mix(in srgb, var(--color-button) 25%, white);\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) 92%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 1px dotted var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
