{
  "id": "v1-nb-8837",
  "long_id": "v1.neubrutalism.portal.s08.p08.t03.u07",
  "name": "Neubrutalism portal, events sheet with folder tabs (2021 to 2026)",
  "era": {
    "slug": "neubrutalism",
    "code": "nb",
    "name": "Neubrutalism",
    "years": [
      2021,
      2026
    ],
    "description": "Loud and flat, 2021 to 2026: thick black outlines, hard offset shadows with no blur, saturated colour blocks and bold type."
  },
  "archetype": "portal",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "A community notice board in the rounded, friendly strand of neubrutalism: the brand stands on the page colour, a row of folder tabs is the navigation, and every view is laid out inside one big outlined sheet that stands on a hard, unblurred shadow. It was common from about 2021 to 2026 for event calendars, meetup and club pages, community directories and the small portals of neighbourhood groups. Dates are the pictures: a tilted ticket with a filled stub, a week of day cells with coloured heads, list rows led by a date square.",
  "url": "https://chrono.skin/s/v1-nb-8837",
  "preview_url": "https://chrono.skin/s/v1-nb-8837/specimen.html",
  "files": {
    "STYLE.md": "# Neubrutalism portal, events sheet with folder tabs (2021 to 2026)\n\n## Summary\n\nA community notice board in the rounded, friendly strand of neubrutalism: the brand stands on the page colour, a row of folder tabs is the navigation, and every view is laid out inside one big outlined sheet that stands on a hard, unblurred shadow. It was common from about 2021 to 2026 for event calendars, meetup and club pages, community directories and the small portals of neighbourhood groups. Dates are the pictures: a tilted ticket with a filled stub, a week of day cells with coloured heads, list rows led by a date square.\n\n## Layout\n\n- The page is fluid in its background only: `--size-page` is 100%, and the brand row, the tabs, the sheet and the footer share one centred width of `--size-content` (1180px), with at least `--space-gutter` (28px) at the sides. Designed at a 1440px viewport; the page colour and its pattern always show left and right of the sheet.\n- Order of a page: a full-width ticker line on `--fill-bar-alt`, the brand row (the `.ds-brand` at the left, an avatar and two small buttons at the right, standing on the page), the folder tabs, the sheet (`.ds-main`), and the footer as an inverted card under it.\n- Navigation is the row of folder tabs: each `.ds-nav__link` is a `--fill-bar` tab with an outline on three sides and rounded top corners, standing on the sheet's top edge. The current tab is filled with the accent and stands `--space-2` taller. The last tab is a `.ds-menu`. The tabs start `calc(var(--radius-page) / 2 + var(--space-4))` in from the sheet's corner.\n- The sheet is `--color-canvas` with a `--border-width-strong` outline, `--radius-page` corners, the `--shadow-dialog` shadow and `--space-7` (40px) of padding. Blocks inside it are `--space-7` apart (`.ds-column`); blocks in a `.ds-stack` are `--space-5` (20px) apart.\n- The home view: the `.ds-hero` (the claim at the left, the next event as a tilted `.ds-ticket` at the right), the inverted `.ds-stat` strip of four figures, the week (`.ds-row` with a `.ds-label`, then the `.ds-grid` of five day cells), and a `.ds-split` with the `.ds-list` of new events beside a `.ds-panel`.\n- Inner pages keep everything outside the sheet and drop the hero. Inside the sheet they start with a `.ds-page-header`: a `--color-surface-alt` box holding the breadcrumb, then the `--text-h1` title and one line of lead on the left and the page's actions on the right, centred on the row. Below it comes one `.ds-split`: a main column and a `--size-side` (320px) column on the right. Tabs are the first row of the main column, above the table; filters, the small month and the kinds of event are in the side column.\n- Spacing scale: `--space-1` 4px (gap between tabs and between month squares, inline code), `--space-2` 8px (badge padding, gaps between chips, label to control, overlap of stacked avatars), `--space-3` 12px (gap between list rows and accordion bars, row padding), `--space-4` 16px (panel and card padding, gap between buttons and between day cells), `--space-5` 20px (gap between stacked blocks, button side padding), `--space-6` 28px (gap between split columns, page header side padding), `--space-7` 40px (sheet padding, gap between the blocks of a view, hero gap), `--space-8` 56px (space under the footer).\n- Movement tokens: `--space-nudge` 2px (hover offset, focus offset) and `--space-press` 4px (pressed offset, the red shadow of an invalid field). A control sinks straight down.\n- Fixed sizes: `--size-control` 44px (buttons, inputs, folder tabs), `--size-control-large` 54px (hero buttons), `--size-control-small` 34px (small buttons, tab segments, pagination, step numbers), `--size-logo` 38px, `--size-avatar` 36px, `--size-date` 60px (the date square of a list row), `--size-stub` 150px (the ticket's stub), `--size-check` 20px, `--size-switch` 44px, `--size-bar` 14px, `--size-menu` 220px, `--size-tip` 200px, `--size-dialog` 440px.\n- Below 1000px the hero and every split stack, the ticket is no longer tilted, the week goes to three columns and the stat strip to two. Below 600px the side margins shrink to `--space-3`, the folder tabs become a wrapping row of fully outlined chips above the sheet, the sheet's outline thins to `--border-width` and its padding to `--space-3`, the week and form rows are one column, titles step down (`calc()` over `--text-h1` and `--text-h2`), hero and page header buttons fill the width, the tab bar stretches across, list rows wrap their meta line, and table columns marked `.ds-table__extra` are hidden so that a table never scrolls sideways. On a phone `.ds-nav__links` is one strip of cells, each 29% of the width, that scrolls sideways with the scrollbar hidden and ruled top and bottom; the current link keeps its mark, and on the last two views the strip starts at its far end so that the current cell is in view. The drop-down item (\"Places\") leaves the strip, because a menu cannot open inside a scrolling strip, and its places are reached from the calendar view.\n- Views: the specimen is one example site, a neighbourhood events board, with five views switched by plain `#name` links. `home` is this week (hero with the next event's ticket, stat strip, the next five days, newly pinned events beside the host of the month). `calendar` is the month as a list: page header with the breadcrumb, tabs, the events table, pagination and the key of labels, with the small month, two switches and the kinds of event in the side column. `event` is one event: a notice, what happens, who is coming and the booking dialog, with the details, a short accordion and an empty questions box at the side. `post` is the form to post an event: notices, the form with its switches and buttons, the three steps and the reader at the side. `guide` is the host guide on a sheet with further links, beside the questions accordion and a panel. The tabs mark the current view through `:has()` rules in `components.css`, one per view; `is-current` on a link does the same by hand.\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- `--color-page` and `--color-canvas` are pale blue #dcebfe; `--color-surface` is white #ffffff for the rail, cards, stat tiles, tables, lists and the sheet. A plain card stage and even table rows take the pale blue.\n- `--color-button`, `--color-surface-strong` and `--color-bar-alt` are blue #5294ff with black text: the primary button, the brand mark, the title strips of cards and dialogs, the highlight behind a hovered link.\n- `--color-accent` is green #05e17a with black text: the current navigation item, rail link, filter chip and page, and the default badge. `--color-accent-alt` is yellow #facc00: the marked words of the intro title and \"new\" badges.\n- `--color-surface-alt` is sky #88c5ee: a hovered rail link, the empty state, the current table row, inline code.\n- `--color-fill-1` to `--color-fill-4` are blue #5294ff, green #05e17a, yellow #facc00 and lavender #b6ace4: the stages of demo cards whose content brings its own surface. Use each once before repeating.\n- Text, headings, every link colour, borders, focus and shadow are #000000; `--color-text-muted` #666666 (section notes, list meta, hints), `--color-border-muted` #b3b3b3 (the page grid). The navigation bar, the table head and the panel title (`--color-bar`) are white. The footer (`--color-inverse`) is black with white text.\n- Status: `--color-success` green #05e17a, `--color-warning` yellow #facc00, `--color-danger` red #dc341e, `--color-danger-surface` salmon #ee8888 behind an error notice, `--color-notice` lavender #b6ace4. All carry black text.\n- One grotesque sans for everything (`--font-body`, `--font-heading`, `--font-ui`: Public Sans, then DM Sans, Helvetica Neue); `--font-mono` for inline code, the command chip and class names in a table.\n- The whole page is heavy: `--weight-body` 500, `--weight-ui` 600 (navigation, rail links, chips, inputs, leads), `--weight-bold` 700 (buttons, labels, badges, the current rail link), `--weight-heading` 800 and `--weight-display` 900. Nothing is lighter than 500.\n- `--text-base` 16px at `--line-body` 1.5; `--text-small` 14px (rail headings, counts, notes, stat labels, table heads, list text, the footer); `--text-ui` 16px (navigation, rail links, chips, buttons, inputs); `--text-large` 24px for leads, the large button and the brand.\n- `--text-display` 72px at `--line-display` 1.1 for the intro title; `--text-h1` 48px (the inner page title, prose h1), `--text-h2` 36px (section titles, stat figures, prose h2), `--text-h3` 22px (card, panel, dialog and empty-state titles) at `--line-heading` 1.1. No tracking, no uppercase headings.\n- Uppercase is used only for the 12px `.ds-badge`. That size is `calc(var(--text-small) * 0.857)`; the vocabulary has no token for it.\n- Links in running text are underlined (`--link-decoration`) and lose the underline on hover (`--link-decoration-hover: none`), where the flat highlight replaces it; quiet links are never underlined.\n- `--border-width` is 3px on every box and rule; `--border-width-strong` 4px under the navigation.\n- All four radius tokens are 8px: buttons, inputs, cards, tiles, dialogs and badges share one rounded corner; badges are rounded rectangles, not pills.\n- Boxes that stand on the page sit on a second sheet, not a plain block: `--shadow-panel` is two hard shadows at the same `5px 5px` offset, a `--color-surface-strong` one on top and a `--color-shadow` one spread 3px behind it, so a filled, outlined copy of the box shows at its right and bottom edge like the next card in a stack. `--shadow-control` is the same at `4px 4px`, `--shadow-dialog` at `8px 8px`. No shadow is blurred. Filter chips and pagination squares carry the smaller `3px 3px` (`--shadow-control-hover`), as does a hovered button; a pressed one keeps `1px 1px` (`--shadow-control-pressed`). A box shown inside a card stage (the panel, the form box) has an outline but no shadow.\n- `--fill-page` draws a 70px grid of 1px lines (`--color-border-muted` at 50%) over the page colour; every other fill is flat.\n- `--focus-ring` is `3px solid` in `--color-focus`; `--transition` animates only `transform` and `box-shadow` over 0.2s.\n\n## Components\n\n- `.ds-page`: on `<body>`. Sets the page fill with its pattern, the base font and colour. The header, `.ds-main` and the footer are its children.\n- `.ds-brand`: the site's mark and name, first in the brand row and a link to the home view. `.ds-brand__mark` is a round `--size-logo` tile dressed like the primary button (`--fill-button`, `--color-button-text`, the outline, a small hard shadow); the mark is drawn with round caps and a 2.6 stroke. `.ds-brand__name` is the name in the heading face at `--text-h2`. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the header. `.ds-nav__strip` is the ticker line with a `.ds-nav__strip-link`. `.ds-nav__top` holds the brand and `.ds-nav__actions` (an avatar and two small buttons). `.ds-nav__links` is the row of folder tabs, each a `.ds-nav__link` (`is-current`, `is-hover`, `is-focus`).\n- `.ds-menu`: a drop-down under the last folder tab, a `<details>` whose `<summary>` is a `.ds-nav__link` with `.ds-menu__trigger` (it shows a plus, a minus when open). `.ds-menu__list` is an outlined, shadowed box of `.ds-menu__item` rows divided by faint rules, each a `.ds-menu__link` that may end in a plain badge. Use it for places or categories that would not fit the tab row.\n- `.ds-main`: the sheet. Every `.ds-view` is inside it; `.ds-column` spaces a view's blocks.\n- `.ds-hero`: the introduction of the home view, standing directly on the sheet: `.ds-hero__text` with an optional badge, `.ds-hero__title` at display size, `.ds-hero__lead` and `.ds-hero__actions` (one primary and one secondary large button), beside a `.ds-ticket`. One per site.\n- `.ds-ticket`: one event as a ticket turned 2 degrees, with the dialog shadow: `.ds-ticket__stub` is the filled left part with `.ds-ticket__day` lines around a `.ds-ticket__number`; `.ds-ticket__body` holds badges, `.ds-ticket__title`, a `.ds-ticket__meta` line, a progress bar and the people going. Only the ticket is tilted; never turn a card, a row or text.\n- `.ds-stat`: the row of summary figures, one inverted strip (`--fill-inverse`) of four `.ds-stat__cell`, each a `.ds-stat__value` (`--text-h1`) over a `.ds-stat__label`, centred. Use under the hero.\n- `.ds-grid`: the week, five day cells. Each `.ds-grid__cell` (`--1` to `--4` set the head's fill; without one the head is `--color-surface-alt`) has a `.ds-grid__head` with `.ds-grid__day` and `.ds-grid__date`, and a `.ds-grid__body` list of `.ds-grid__event` items divided by faint rules: a `.ds-grid__time` in the monospace face over a `.ds-grid__title`. `.ds-grid__text` is a muted line for a day with room left.\n- `.ds-month`: a small calendar, a seven-column grid of `.ds-month__day` squares (`--head` for the weekday letters). `is-busy` outlines a day that has events, `is-current` fills today with the accent.\n- `.ds-page-header`: the head of an inner page, a filled outlined box: the `.ds-breadcrumb`, then `.ds-page-header__row` with `.ds-page-header__main` (`.ds-page-header__title`, `.ds-page-header__lead`) and `.ds-page-header__actions`. One per inner view.\n- `.ds-split`, `.ds-stack`, `.ds-row`, `.ds-label`, `.ds-note`: layout helpers. `.ds-split` is a main column and the 320px side column (`.ds-split--even` for halves); `.ds-stack` stacks blocks; `.ds-row` puts a heading and a link, or tabs and a count, on one line; `.ds-label` is a section heading; `.ds-note` is a muted line.\n- `.ds-prose`: long text: h1, h2, h3, p, ul, ol, strong, inline code (outlined, on `--color-surface-alt`) and links are styled. `.ds-sheet` is the outlined box an article sits on, inside the big sheet.\n- `.ds-link`: a link in content: lemon, underlined. `.ds-link--quiet` is cream without the underline, for titles, breadcrumbs and sidebar items. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-links` lays several out in a row.\n- `.ds-button`: lemon, indigo bold text, 2px outline, hard shadow, 44px tall, 12px corners. `.ds-button--secondary` is cream. `.ds-button--danger` is the destructive action, flat red with `--color-text`; use it once per view. `.ds-button--large` for the hero, `.ds-button--small` for the brand row and empty states, `.ds-button--wide` fills its box. `is-hover` sinks it 2px, `is-active` 4px with no shadow left, `is-disabled` is flat and dim, `is-focus` adds the dashed ring. `.ds-buttons` is a row of them.\n- `.ds-badge`: a small pill label, coral with indigo text by default. `.ds-badge--alt` deep green, `.ds-badge--plain` on the surface colour (counts). Status labels: `.ds-badge--success` (open, going), `.ds-badge--warning` (few left, not sure), `.ds-badge--danger` (full), all with `--color-text` and the outline. `.ds-badges` is a row of them.\n- `.ds-avatar`: a neighbour as initials on a filled circle (`--2`, `--3`, `--4` change the fill; `--small` for the brand row, `--large` with a shadow for a profile). `.ds-person` puts one beside a `.ds-person__name` and a `.ds-person__role`. `.ds-avatars` overlaps several in a row and ends with `.ds-avatars__more`.\n- `.ds-progress`: how far something is: a `.ds-progress__label` line over a `.ds-progress__track` pill holding a `.ds-progress__bar` whose width is set by `--10`, `--25`, `--70` or `--85` (50% without one). Use for places taken and for how complete a form is. `.ds-steps` is a numbered list of stages: `is-done` turns the number green, `is-current` fills it with the accent.\n- `.ds-switch`: an on and off control: a `<label>` holding a hidden `.ds-switch__input` checkbox, the `.ds-switch__track` pill and the text. On, the track is filled with the accent and the knob moves right. Use for filters and for yes or no settings of an event.\n- `.ds-tooltip`: a hint. `.ds-tooltip__trigger` is a small round button with a question mark; `.ds-tooltip__tip` is an inverted outlined box that shows above it on hover or focus (`is-open` on the wrapper shows it by hand).\n- `.ds-accordion`: questions that open and close. Each `<details class=\"ds-accordion__item\">` is its own outlined bar with a small shadow, `--space-3` from the next; `.ds-accordion__head` is the `<summary>`, bold, with a plus sign; open, the head is filled with `--color-surface-alt`, shows a minus and stands over `.ds-accordion__body`.\n- `.ds-form`: stacked fields: `.ds-form__field` with a bold small `.ds-form__label` over a `.ds-form__control` (input, select; `.ds-form__control--area` for a textarea), then `.ds-form__hint` or `.ds-form__error`. `.ds-form__row` puts two fields side by side, `.ds-form__toggles` a row of switches, `.ds-form__foot` the buttons over a faint rule. `is-focus` adds the ring and a small shadow, `is-invalid` turns the border red with a red shadow below, `is-disabled` dims it. `.ds-form__check` wraps a `.ds-form__checkbox` and its text.\n- `.ds-table`: one outlined, shadowed box. The head row is filled like a bar (`--fill-bar`) with bold small text over a full rule; rows are divided by faint `--color-border-muted` rules; `is-current` on a row fills it with `--color-surface-alt` and makes it bold. `.ds-table__num` right-aligns numbers; a cell with `.ds-table__extra` is dropped below 600px.\n- `.ds-list`: separate rows, each a small outlined ticket (`.ds-list__item`) led by a `.ds-list__date` square (the month over a `.ds-list__number`) or an avatar, then `.ds-list__main` (`.ds-list__title`, `.ds-list__text`) and a muted `.ds-list__meta` or a badge at the right.\n- `.ds-panel`: outlined, shadowed box with a `--color-surface-strong` `.ds-panel__title` strip over a rule and a `.ds-panel__body` that spaces its children. `.ds-panel--plain` makes the strip `--fill-bar` with `--color-bar-text`. `.ds-facts` is a two-column list of `.ds-facts__term` and `.ds-facts__value` for a panel.\n- `.ds-tabs`: one outlined bar cut into segments (`.ds-tabs__item` holding a `.ds-tabs__tab`); the current one (`is-current`) is filled with the accent, `is-hover` with `--color-surface-alt`. Use for two to four cuts of one list. Not to be confused with the folder tabs, which are the site navigation.\n- `.ds-sidebar`: a `.ds-sidebar__title` over a `.ds-sidebar__list` of separate outlined chips (`.ds-sidebar__item`), each a quiet link and a count badge; `is-current` fills the chosen one and gives it a small shadow. It has no box of its own.\n- `.ds-notice`: a one-line message in an outlined bar with a small shadow, led by a round sign (an i, or an exclamation mark for an error): a bold `.ds-notice__title` and `.ds-notice__text`. `.ds-notice--error` is `--color-danger-surface`.\n- `.ds-pagination`: a row of small outlined squares (`.ds-pagination__link`) with a small shadow; the current page (`is-current`) is filled with the accent, `is-disabled` is dim and flat, `is-hover` sinks.\n- `.ds-breadcrumb`: a small trail of `.ds-breadcrumb__item` separated by a muted slash; the last has `is-current`. The first line of a page header.\n- `.ds-dialog`: a `--size-dialog` outlined box with the dialog shadow: a `--color-surface-strong` `.ds-dialog__bar` (holding `.ds-dialog__title` and a square `.ds-dialog__close`), `.ds-dialog__body`, and a canvas-coloured `.ds-dialog__actions` strip over a rule with the buttons right-aligned. It sits on `.ds-overlay`, an outlined block filled with `--color-overlay`.\n- `.ds-empty`: an outlined, shadowed box on `--color-surface-alt`, centred: `.ds-empty__title`, `.ds-empty__text` and one small button.\n- `.ds-footer`: an inverted card under the sheet, one row: `.ds-footer__brand`, a `.ds-footer__list` of `.ds-footer__link`, and `.ds-footer__legal`.\n\n## Never\n\n- `row-gap <= 12px`: table rows touch; list rows and accordion bars are 12px apart.\n- `block-gap <= 64px`: stacked blocks are 20px apart, the blocks of a view 40px.\n- `content-width <= 85%`: everything is inside the 1180px sheet; the page colour always shows at the sides.\n- `font-weight >= 500`: no regular or light text; the page is set in medium and heavier.\n- `font-size <= 72px`: the intro title is the largest text.\n- `font-size >= 12px`: badge labels are the smallest text.\n- `font-families <= 2`: one sans and a monospace for code.\n- `line-height <= 1.5`: body text is set at 1.5.\n- `letter-spacing = 0px`: nothing is tracked.\n- `uppercase-text <= 5%`: only 12px badges are uppercase.\n- `underlined-links <= 20%`: only links in running text are underlined.\n- `box-shadow-blur <= 0px`: every shadow is a hard offset block; a blurred shadow breaks the style at once.\n- `border-radius <= 0px`: boxes and controls are square; only pills and circles are round.\n- `border-width >= 3px`: every outline and rule is 3px or the 6px thick rule; no hairlines.\n- `border-width <= 6px`: nothing heavier than the 6px rule.\n- `text-shadow = none`: no text shadow.\n- `gradient-fills <= 1%`: fills are flat; the only gradient is the ruling drawn on the page background.\n- `animation = none`: nothing moves on its own; only hover and press shift a control.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. Everything new goes inside the sheet; nothing but the ticker is full-bleed. A new box takes a `--border-width` `--color-border` outline, the `--radius-panel` corner and the `--shadow-panel` hard shadow; small things in a column (rows, bars, chips, notices) take `--radius-control` and `--shadow-control-hover`; only the sheet, the ticket and a dialog take `--shadow-dialog`. Anything clickable sinks `--space-nudge` on hover and `--space-press` when pressed, straight down. Show a date as a filled block (a stub, a head, a square), not as a line of text. Colour a block with one flat `--color-fill-*` or surface token and put `--color-text` on it; never tint, fade or blur. A new view starts with a `.ds-page-header` and one `.ds-split`, and gets its own folder tab. Inside a box, divide with a `--color-border-muted` rule rather than nesting shadowed cards. For a size the vocabulary lacks, use `calc()` over an existing token, as the badge text does.\n",
    "components.css": "/* Layout tokens (structure part) */\n:root {\n  --size-page: 100%;\n  --size-content: 1180px;\n  --size-side: 320px;\n  --size-measure: 560px;\n  --size-menu: 220px;\n  --size-tip: 200px;\n  --size-control: 44px;\n  --size-control-large: 54px;\n  --size-control-small: 34px;\n  --size-logo: 38px;\n  --size-avatar: 36px;\n  --size-date: 60px;\n  --size-check: 20px;\n  --size-switch: 44px;\n  --size-bar: 14px;\n  --size-stub: 150px;\n  --size-dialog: 440px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 20px;\n  --space-6: 28px;\n  --space-7: 40px;\n  --space-8: 56px;\n  --space-gutter: 28px;\n  --space-nudge: 2px;\n  --space-press: 4px;\n}\n\n/* shell: a ticker line, the brand row, folder tabs, then one big sheet that holds every view */\n.ds-page {\n  margin: 0;\n  width: var(--size-page);\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 *,\n.ds-page *::before,\n.ds-page *::after {\n  box-sizing: border-box;\n}\n\n/* views: one screen 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/* nav: the ticker, the brand row on the page colour, and a row of folder tabs standing on the sheet */\n.ds-nav {\n  color: var(--color-text);\n}\n.ds-nav__strip {\n  margin: 0;\n  padding: var(--space-2) var(--space-gutter);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.4;\n  text-align: center;\n  color: var(--color-bar-alt-text);\n  background: var(--fill-bar-alt);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-nav__strip-link {\n  color: inherit;\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n  text-underline-offset: var(--space-1);\n}\n.ds-nav__top {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-5);\n  width: calc(100% - 2 * var(--space-gutter));\n  max-width: var(--size-content);\n  margin: 0 auto;\n  padding: var(--space-6) 0 var(--space-5);\n}\n.ds-brand {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-3);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-logo);\n  height: var(--size-logo);\n  padding: var(--space-1);\n  color: var(--color-button-text);\n  background: var(--fill-button);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: 1;\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-heading);\n}\n.ds-nav__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-nav__links {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  gap: var(--space-1);\n  width: calc(100% - 2 * var(--space-gutter));\n  max-width: var(--size-content);\n  margin: 0 auto;\n  padding: 0 calc(var(--radius-page) / 2 + var(--space-4));\n  list-style: none;\n}\n.ds-nav__link {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  min-height: var(--size-control);\n  padding: 0 var(--space-5);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  cursor: pointer;\n  color: var(--color-bar-text);\n  background: var(--fill-bar);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-bottom: 0;\n  border-radius: min(var(--radius-panel), var(--space-4)) min(var(--radius-panel), var(--space-4)) 0 0;\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#calendar:target) .ds-nav__link[href=\"#calendar\"],\n.ds-page:has(#event:target) .ds-nav__link[href=\"#event\"],\n.ds-page:has(#post:target) .ds-nav__link[href=\"#post\"],\n.ds-page:has(#guide:target) .ds-nav__link[href=\"#guide\"] {\n  font-weight: var(--weight-bold);\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(-1 * var(--space-press));\n}\n\n/* menu: a drop-down under a strip item, a details element */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__trigger {\n  list-style: none;\n}\n.ds-menu__trigger::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__trigger::after {\n  content: \"+\";\n  font-weight: var(--weight-bold);\n}\n.ds-menu[open] .ds-menu__trigger::after {\n  content: \"-\";\n}\n.ds-menu__list {\n  position: absolute;\n  top: calc(100% + var(--space-2));\n  left: 0;\n  z-index: 3;\n  width: var(--size-menu);\n  max-width: 80vw;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  color: var(--color-text);\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  overflow: hidden;\n}\n.ds-menu__item + .ds-menu__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-menu__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-4);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  color: var(--color-text);\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover {\n  background: var(--color-surface-alt);\n}\n\n/* sheet: the one big box under the tabs. Every view is laid out inside it */\n.ds-main {\n  display: block;\n  width: calc(100% - 2 * var(--space-gutter));\n  max-width: var(--size-content);\n  margin: 0 auto;\n  padding: var(--space-7);\n  color: var(--color-text);\n  background: var(--color-canvas);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-column {\n  display: grid;\n  gap: var(--space-7);\n  align-content: start;\n}\n.ds-split {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-side);\n  gap: var(--space-6);\n  align-items: start;\n}\n.ds-split--even {\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n}\n.ds-stack {\n  display: grid;\n  gap: var(--space-5);\n  align-content: start;\n  min-width: 0;\n}\n.ds-row {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-4);\n}\n.ds-label {\n  margin: 0;\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-note {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n\n/* hero: the claim on the left, the next event as a tilted ticket on the right */\n.ds-hero {\n  display: grid;\n  grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);\n  gap: var(--space-7);\n  align-items: center;\n  color: var(--color-text);\n}\n.ds-hero__text {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-4);\n  min-width: 0;\n}\n.ds-hero__title {\n  margin: 0;\n  max-width: 100%;\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  overflow-wrap: break-word;\n  color: var(--color-heading);\n}\n.ds-hero__lead {\n  max-width: var(--size-measure);\n  margin: 0;\n  font-size: var(--text-large);\n  line-height: 1.45;\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-4);\n  margin-top: var(--space-2);\n}\n\n/* ticket: one event as a stub with the date and a body with the rest */\n.ds-ticket {\n  display: grid;\n  grid-template-columns: var(--size-stub) minmax(0, 1fr);\n  min-width: 0;\n  color: var(--color-text);\n  background: var(--fill-panel);\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  overflow: hidden;\n  transform: rotate(2deg);\n}\n.ds-ticket__stub {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-1);\n  padding: var(--space-4) var(--space-2);\n  text-align: center;\n  color: var(--color-text);\n  background: var(--color-fill-2);\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-ticket__day {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n}\n.ds-ticket__number {\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: 1;\n}\n.ds-ticket__body {\n  display: grid;\n  gap: var(--space-3);\n  align-content: center;\n  min-width: 0;\n  padding: var(--space-5);\n}\n.ds-ticket__title {\n  margin: 0;\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  overflow-wrap: break-word;\n  color: var(--color-heading);\n}\n.ds-ticket__meta {\n  margin: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.4;\n}\n\n/* stats: one inverted strip of four figures */\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  margin: 0;\n  color: var(--color-inverse-text);\n  background: var(--fill-inverse);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-stat__cell {\n  display: flex;\n  flex-direction: column-reverse;\n  align-items: center;\n  min-width: 0;\n  padding: var(--space-4) var(--space-3);\n  text-align: center;\n}\n.ds-stat__value {\n  margin: 0;\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}\n.ds-stat__label {\n  margin: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n}\n\n/* grid: the week. One cell per day, a filled head with the date over that day's events */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(5, minmax(0, 1fr));\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  color: var(--color-text);\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-control);\n  overflow: hidden;\n}\n.ds-grid__head {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2) var(--space-4);\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-grid__cell--1 .ds-grid__head {\n  background: var(--color-fill-1);\n}\n.ds-grid__cell--2 .ds-grid__head {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 .ds-grid__head {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 .ds-grid__head {\n  background: var(--color-fill-4);\n}\n.ds-grid__day {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n}\n.ds-grid__date {\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-display);\n  line-height: 1.1;\n}\n.ds-grid__body {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  margin: 0;\n  padding: var(--space-1) var(--space-4) var(--space-2);\n  list-style: none;\n}\n.ds-grid__event {\n  padding: var(--space-2) 0;\n}\n.ds-grid__event + .ds-grid__event {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-grid__time {\n  display: block;\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: 1.3;\n  color: var(--color-text-muted);\n}\n.ds-grid__title {\n  display: block;\n  margin: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n  overflow-wrap: break-word;\n}\n.ds-grid__title .ds-link {\n  font-weight: inherit;\n}\n.ds-grid__text {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n\n/* month: a small calendar, a square per day */\n.ds-month {\n  display: grid;\n  grid-template-columns: repeat(7, minmax(0, 1fr));\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-month__day {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  aspect-ratio: 1;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: min(var(--radius-control), var(--space-2));\n}\n.ds-month__day--head {\n  font-weight: var(--weight-bold);\n  color: var(--color-text-muted);\n}\n.ds-month__day.is-busy {\n  background: var(--color-surface-alt);\n  border-color: var(--color-border);\n}\n.ds-month__day.is-current {\n  font-weight: var(--weight-bold);\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n  border-color: var(--color-border);\n}\n\n/* typography */\n.ds-prose {\n  max-width: 66ch;\n  color: var(--color-text);\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\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  overflow-wrap: break-word;\n  color: var(--color-heading);\n}\n.ds-prose h1 {\n  margin: 0 0 var(--space-4);\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin: var(--space-6) 0 var(--space-3);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin: var(--space-5) 0 var(--space-2);\n  font-size: var(--text-h3);\n}\n.ds-prose p,\n.ds-prose ul,\n.ds-prose ol {\n  margin: 0 0 var(--space-4);\n}\n.ds-prose ul,\n.ds-prose ol {\n  padding-left: var(--space-5);\n}\n.ds-prose li {\n  margin-bottom: var(--space-1);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  white-space: nowrap;\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-1));\n}\n.ds-prose a {\n  color: var(--color-link);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration);\n  text-underline-offset: var(--space-1);\n}\n.ds-prose a:hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n  background: var(--color-surface-strong);\n}\n.ds-sheet {\n  padding: var(--space-6);\n  color: var(--color-text);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-panel);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration);\n  text-decoration-thickness: var(--space-nudge);\n  text-underline-offset: var(--space-1);\n}\n.ds-link--quiet {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\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  background: var(--color-surface-strong);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n  background: var(--fill-accent);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n}\n.ds-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* buttons: flat fill, outline, hard shadow; a pressed button sinks straight down */\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  min-height: var(--size-control);\n  margin: 0;\n  padding: 0 var(--space-5);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  cursor: pointer;\n  color: var(--color-button-text);\n  background: var(--fill-button);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n\n/* a block that moves down onto its shadow carries a strip above itself, so a pointer at its top edge stays on it */\n.ds-button {\n  position: relative;\n}\n.ds-button::before {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 100%;\n  height: calc(2 * var(--space-press));\n}\n.ds-button--secondary {\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n}\n.ds-button--danger {\n  color: var(--color-text);\n  background: var(--color-danger);\n}\n.ds-button--large {\n  min-height: var(--size-control-large);\n  padding: 0 var(--space-6);\n  font-size: var(--text-large);\n}\n.ds-button--small {\n  min-height: var(--size-control-small);\n  padding: 0 var(--space-3);\n  font-size: var(--text-small);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-button--wide {\n  width: 100%;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  color: var(--color-button-hover-text);\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  transform: translateY(var(--space-nudge));\n}\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n}\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  color: var(--color-text);\n  background: var(--color-danger);\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n  transform: translateY(var(--space-press));\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  color: var(--color-disabled-text);\n  background: var(--color-disabled);\n  box-shadow: var(--shadow-control-pressed);\n  transform: none;\n  cursor: not-allowed;\n}\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-4);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-flex;\n  align-items: center;\n  padding: 0 var(--space-2);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.87);\n  font-weight: var(--weight-bold);\n  line-height: 1.6;\n  white-space: nowrap;\n  vertical-align: middle;\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n}\n.ds-badge--alt {\n  color: var(--color-text);\n  background: var(--color-accent-alt);\n}\n.ds-badge--plain {\n  color: var(--color-text);\n  background: var(--color-surface);\n}\n.ds-badge--success {\n  color: var(--color-text);\n  background: var(--color-success);\n}\n.ds-badge--warning {\n  color: var(--color-text);\n  background: var(--color-warning);\n}\n.ds-badge--danger {\n  color: var(--color-text);\n  background: var(--color-danger);\n}\n.ds-badges {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n\n/* avatar: a person or maker, drawn as initials on a fill */\n.ds-avatar {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.87);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  color: var(--color-text);\n  background: var(--color-accent-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n}\n.ds-avatar--2 {\n  background: var(--color-fill-2);\n}\n.ds-avatar--3 {\n  background: var(--color-fill-4);\n}\n.ds-avatar--4 {\n  background: var(--color-fill-1);\n}\n.ds-avatar--small {\n  width: var(--size-control-small);\n  height: var(--size-control-small);\n}\n.ds-avatar--large {\n  width: calc(var(--size-avatar) * 1.6);\n  height: calc(var(--size-avatar) * 1.6);\n  font-size: var(--text-large);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-person {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-person__name {\n  display: block;\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-person__role {\n  display: block;\n  font-size: var(--text-small);\n  line-height: 1.3;\n  color: var(--color-text-muted);\n}\n.ds-avatars {\n  display: flex;\n  align-items: center;\n  margin: 0;\n  padding: 0 0 0 var(--space-2);\n  list-style: none;\n}\n.ds-avatars .ds-avatar {\n  margin-left: calc(-1 * var(--space-2));\n}\n.ds-avatars__more {\n  margin-left: var(--space-2);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n\n/* progress: an outlined track with a filled bar */\n.ds-progress {\n  display: grid;\n  gap: var(--space-2);\n}\n.ds-progress__label {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-progress__track {\n  display: block;\n  height: var(--size-bar);\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  overflow: hidden;\n}\n.ds-progress__bar {\n  display: block;\n  width: 50%;\n  height: 100%;\n  background: var(--fill-accent);\n  border-right: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-progress__bar--70 {\n  width: 70%;\n}\n.ds-progress__bar--85 {\n  width: 85%;\n}\n.ds-steps {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  counter-reset: step;\n}\n.ds-steps__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n  counter-increment: step;\n}\n.ds-steps__item::before {\n  content: counter(step);\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-control-small);\n  height: var(--size-control-small);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n}\n.ds-steps__item.is-done::before {\n  color: var(--color-text);\n  background: var(--color-success);\n}\n.ds-steps__item.is-current {\n  font-weight: var(--weight-bold);\n}\n.ds-steps__item.is-current::before {\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n  box-shadow: var(--shadow-control-hover);\n}\n\n/* switch: an on and off control drawn over a checkbox */\n.ds-switch {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  opacity: 0;\n}\n.ds-switch__track {\n  position: relative;\n  display: block;\n  flex: none;\n  width: var(--size-switch);\n  height: calc(var(--size-check) + 2 * var(--border-width));\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  transition: var(--transition);\n}\n.ds-switch__track::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: var(--size-check);\n  height: var(--size-check);\n  background: var(--color-text);\n  border-radius: var(--radius-pill);\n  transform: scale(0.64);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch__track.is-on {\n  background: var(--fill-accent);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-switch__input:checked + .ds-switch__track::before,\n.ds-switch__track.is-on::before {\n  left: calc(100% - var(--size-check));\n  background: var(--color-accent-text);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch__track.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n}\n\n/* tooltip: a hint over its trigger, on hover or focus */\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n}\n.ds-tooltip__trigger {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  padding: 0;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  cursor: help;\n  color: var(--color-text);\n  background: var(--color-accent-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n}\n.ds-tooltip__tip {\n  position: absolute;\n  bottom: calc(100% + var(--space-2));\n  right: 0;\n  z-index: 2;\n  width: var(--size-tip);\n  max-width: 70vw;\n  padding: var(--space-2) var(--space-3);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.35;\n  text-align: left;\n  color: var(--color-inverse-text);\n  background: var(--fill-inverse);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-4));\n  box-shadow: var(--shadow-control-hover);\n  visibility: hidden;\n}\n.ds-tooltip:hover .ds-tooltip__tip,\n.ds-tooltip:focus-within .ds-tooltip__tip,\n.ds-tooltip.is-open .ds-tooltip__tip {\n  visibility: visible;\n}\n\n/* accordion: each question its own outlined bar; the open one drops its answer below */\n.ds-accordion {\n  display: grid;\n  gap: var(--space-3);\n}\n.ds-accordion__item {\n  color: var(--color-text);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-4));\n  box-shadow: var(--shadow-control-hover);\n  overflow: hidden;\n}\n.ds-accordion__item[open] {\n  box-shadow: var(--shadow-control);\n}\n.ds-accordion__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-3) var(--space-4);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n  list-style: none;\n  cursor: pointer;\n  color: var(--color-text);\n}\n.ds-accordion__head::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__head::after {\n  content: \"+\";\n  flex: none;\n  font-family: var(--font-mono);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-accordion__head:hover,\n.ds-accordion__head.is-hover {\n  background: var(--color-surface-alt);\n}\n.ds-accordion__head:focus-visible,\n.ds-accordion__head.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(-1 * var(--space-press));\n}\n.ds-accordion__item[open] .ds-accordion__head {\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__item[open] .ds-accordion__head::after {\n  content: \"-\";\n}\n.ds-accordion__body {\n  padding: var(--space-3) var(--space-4);\n  font-size: var(--text-small);\n  line-height: 1.5;\n}\n.ds-accordion__body p {\n  margin: 0;\n}\n\n/* form */\n.ds-form {\n  display: grid;\n  gap: var(--space-4);\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n  gap: var(--space-4);\n  align-items: start;\n}\n.ds-form__field {\n  display: grid;\n  gap: var(--space-2);\n  min-width: 0;\n}\n.ds-form__label {\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.4;\n}\n.ds-form__control {\n  width: 100%;\n  min-height: var(--size-control);\n  margin: 0;\n  padding: var(--space-2) var(--space-3);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1.4;\n  color: var(--color-input-text);\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: min(var(--radius-control), calc(var(--size-control) / 2));\n  transition: var(--transition);\n}\n.ds-form__control--area {\n  min-height: calc(var(--size-control) * 2);\n  resize: vertical;\n}\n.ds-form__control:focus,\n.ds-form__control.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-form__control:disabled,\n.ds-form__control.is-disabled {\n  color: var(--color-disabled-text);\n  background: var(--color-disabled);\n}\n.ds-form__control.is-invalid {\n  border-color: var(--color-danger);\n  box-shadow: 0 var(--space-press) 0 0 var(--color-danger);\n}\n.ds-form__error {\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.4;\n  color: var(--color-danger);\n}\n.ds-form__hint {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  font-weight: var(--weight-ui);\n}\n.ds-form__checkbox {\n  appearance: none;\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: min(var(--radius-control), var(--space-1));\n}\n.ds-form__checkbox:checked,\n.ds-form__checkbox.is-checked {\n  background: var(--color-text);\n  box-shadow: inset 0 0 0 var(--space-nudge) var(--color-input);\n}\n.ds-form__checkbox:focus-visible,\n.ds-form__checkbox.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n}\n.ds-form__foot {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-4);\n  padding-top: var(--space-4);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-form__toggles {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3) var(--space-6);\n}\n\n/* notice: a round sign and one line of text in a filled bar */\n.ds-notice {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n  color: var(--color-notice-text);\n  background: var(--color-notice);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-4));\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-notice::before {\n  content: \"i\";\n  display: block;\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  box-sizing: content-box;\n  align-content: center;\n  text-align: center;\n  text-box: trim-both cap alphabetic;\n  font-variant-numeric: tabular-nums;\n}\n.ds-notice__title {\n  flex: none;\n  font-weight: var(--weight-bold);\n}\n.ds-notice__text {\n  margin: 0;\n}\n.ds-notice--error {\n  color: var(--color-text);\n  background: var(--color-danger-surface);\n}\n.ds-notice--error::before {\n  content: \"!\";\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-pagination__link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control-small);\n  min-height: var(--size-control-small);\n  padding: 0 var(--space-3);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  text-decoration: none;\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-hover);\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-pagination__link.is-current {\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n}\n.ds-pagination__link.is-disabled {\n  color: var(--color-disabled-text);\n  background: var(--color-disabled);\n  box-shadow: var(--shadow-control-pressed);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.4;\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before {\n  content: \"/\";\n  color: var(--color-text-muted);\n  margin-right: var(--space-2);\n  font-weight: var(--weight-bold);\n}\n.ds-breadcrumb__item.is-current {\n  font-weight: var(--weight-bold);\n}\n\n/* page header: the head of an inner page, a filled box with the title on the left and the actions on the right */\n.ds-page-header {\n  display: grid;\n  gap: var(--space-3);\n  padding: var(--space-5) var(--space-6);\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n}\n.ds-page-header__row {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4) var(--space-6);\n}\n.ds-page-header__main {\n  min-width: 0;\n}\n.ds-page-header__title {\n  margin: 0;\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  overflow-wrap: break-word;\n  color: var(--color-text);\n}\n.ds-page-header__lead {\n  max-width: var(--size-measure);\n  margin: var(--space-1) 0 0;\n  font-size: var(--text-large);\n  line-height: 1.4;\n}\n.ds-page-header__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-4);\n}\n\n/* empty state */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  padding: var(--space-6) var(--space-4);\n  text-align: center;\n  color: var(--color-text);\n  background: var(--color-surface-alt);\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-empty__title {\n  margin: 0;\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  color: var(--color-text);\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-2);\n  font-size: var(--text-small);\n  line-height: 1.4;\n}\n\n/* table: one outlined box; the head is filled like a bar, rows are divided by faint rules */\n.ds-table {\n  width: 100%;\n  border-collapse: separate;\n  border-spacing: 0;\n  font-size: var(--text-base);\n  color: var(--color-text);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-table th,\n.ds-table td {\n  padding: var(--space-3) var(--space-4);\n  text-align: left;\n  vertical-align: middle;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-table th {\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  color: var(--color-bar-text);\n  background: var(--fill-bar);\n  border-bottom-color: var(--color-border);\n}\n.ds-table tbody tr:last-child td {\n  border-bottom: 0;\n}\n.ds-table tbody tr.is-current td {\n  background: var(--color-surface-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-table .ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n\n/* list: separate rows, each a small ticket led by its date */\n.ds-list {\n  display: grid;\n  gap: var(--space-3);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  padding: var(--space-2) var(--space-4) var(--space-2) var(--space-2);\n  color: var(--color-text);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-4));\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-list__date {\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-date);\n  height: var(--size-date);\n  font-family: var(--font-ui);\n  font-size: calc(var(--text-small) * 0.9);\n  font-weight: var(--weight-bold);\n  line-height: 1.1;\n  color: var(--color-text);\n  background: var(--color-accent-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-3));\n}\n.ds-list__number {\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-display);\n  line-height: 1.1;\n}\n.ds-list__main {\n  flex: 1;\n  min-width: 0;\n}\n.ds-list__title {\n  margin: 0;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-list__title .ds-link {\n  font-weight: inherit;\n}\n.ds-list__text {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n}\n.ds-list__meta {\n  flex: none;\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-text-muted);\n}\n\n/* panel: an outlined box; the title sits on a strip filled with the second surface */\n.ds-panel {\n  min-width: 0;\n  background: var(--fill-panel);\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\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  color: var(--color-heading-alt);\n  background: var(--color-surface-strong);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__body {\n  display: grid;\n  gap: var(--space-4);\n  padding: var(--space-4);\n}\n.ds-panel__body p {\n  margin: 0;\n}\n.ds-panel--plain .ds-panel__title {\n  color: var(--color-bar-text);\n  background: var(--fill-bar);\n}\n.ds-facts {\n  display: grid;\n  grid-template-columns: auto minmax(0, 1fr);\n  gap: var(--space-2) var(--space-4);\n  margin: 0;\n}\n.ds-facts__term {\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.6;\n  color: var(--color-text-muted);\n}\n.ds-facts__value {\n  margin: 0;\n  font-weight: var(--weight-ui);\n}\n\n/* tabs: one outlined bar cut into segments; the current one is filled */\n.ds-tabs {\n  display: inline-flex;\n  max-width: 100%;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-hover);\n  overflow: hidden;\n}\n.ds-tabs__item + .ds-tabs__item {\n  border-left: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-tabs__tab {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  min-height: var(--size-control-small);\n  padding: 0 var(--space-4);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  color: var(--color-button-secondary-text);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n}\n.ds-tabs__tab.is-current {\n  font-weight: var(--weight-bold);\n  color: var(--color-accent-text);\n  background: var(--fill-accent);\n}\n.ds-tabs__tab:focus-visible,\n.ds-tabs__tab.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(-1 * var(--space-press));\n}\n\n/* sidebar: a heading over a column of outlined chips, each a kind of event with its count */\n.ds-sidebar {\n  color: var(--color-text);\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-3);\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  color: var(--color-heading);\n}\n.ds-sidebar__list {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-3) var(--space-2) var(--space-4);\n  color: var(--color-text);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: min(var(--radius-control), var(--space-4));\n}\n.ds-sidebar__item.is-current {\n  background: var(--color-surface-alt);\n  box-shadow: var(--shadow-control-hover);\n}\n\n/* dialog: an outlined box with a title strip, on a filled backdrop block */\n.ds-overlay {\n  padding: var(--space-7) var(--space-5);\n  background: var(--color-overlay);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n}\n.ds-dialog {\n  max-width: var(--size-dialog);\n  margin: 0 auto;\n  color: var(--color-text);\n  background: var(--fill-panel);\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  overflow: hidden;\n}\n.ds-dialog__bar {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface-strong);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-dialog__title {\n  margin: 0;\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  color: var(--color-heading-alt);\n}\n.ds-dialog__close {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-control-small);\n  height: var(--size-control-small);\n  padding: 0;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  text-decoration: none;\n  cursor: pointer;\n  color: var(--color-button-secondary-text);\n  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-hover);\n}\n.ds-dialog__body {\n  padding: var(--space-5) var(--space-4);\n}\n.ds-dialog__body p {\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-4);\n  padding: var(--space-4);\n  color: var(--color-text);\n  background: var(--color-canvas);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n\n/* footer: an inverted card under the sheet */\n.ds-footer {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-6);\n  width: calc(100% - 2 * var(--space-gutter));\n  max-width: var(--size-content);\n  margin: var(--space-7) auto var(--space-8);\n  padding: var(--space-5) var(--space-7);\n  font-size: var(--text-small);\n  line-height: 1.45;\n  color: var(--color-inverse-text);\n  background: var(--fill-inverse);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n}\n.ds-footer__brand {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: 1.1;\n  letter-spacing: var(--heading-tracking);\n}\n.ds-footer__list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  font-weight: var(--weight-ui);\n  color: var(--color-inverse-text);\n  text-decoration: var(--link-decoration);\n  text-underline-offset: var(--space-1);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-footer__legal {\n  margin: 0;\n}\n\n@media (min-width: 601px) {\n  .ds-nav__link:hover,\n  .ds-nav__link.is-hover {\n    min-height: calc(var(--size-control) + var(--space-1));\n  }\n  .ds-nav__link.is-current,\n  .ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n  .ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n  .ds-page:has(#calendar:target) .ds-nav__link[href=\"#calendar\"],\n  .ds-page:has(#event:target) .ds-nav__link[href=\"#event\"],\n  .ds-page:has(#post:target) .ds-nav__link[href=\"#post\"],\n  .ds-page:has(#guide:target) .ds-nav__link[href=\"#guide\"] {\n    min-height: calc(var(--size-control) + var(--space-2));\n  }\n}\n\n@media (max-width: 1000px) {\n  .ds-hero,\n  .ds-split,\n  .ds-split--even {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-ticket {\n    transform: none;\n  }\n  .ds-grid {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n  .ds-stat {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-main {\n    padding: var(--space-6);\n  }\n}\n\n@media (max-width: 600px) {\n  .ds-nav__top,\n  .ds-nav__links,\n  .ds-main,\n  .ds-footer {\n    width: calc(100% - 2 * var(--space-3));\n  }\n  .ds-nav__top {\n    padding: var(--space-4) 0 var(--space-3);\n  }\n  .ds-brand__name {\n    font-size: var(--text-h3);\n  }\n  .ds-nav__links {\n    gap: var(--space-1);\n    padding: 0 0 var(--space-3);\n  }\n  .ds-nav__link {\n    min-height: var(--size-control-small);\n    padding: 0 var(--space-2);\n    font-size: var(--text-small);\n    border-bottom: var(--border-width) var(--border-style) var(--color-border);\n    border-radius: min(var(--radius-control), var(--space-3));\n  }\n  .ds-main {\n    padding: var(--space-4) var(--space-3) var(--space-5);\n    border-width: var(--border-width);\n  }\n  .ds-column {\n    gap: var(--space-6);\n  }\n  .ds-hero__title {\n    font-size: calc(var(--text-h1) * 0.8);\n  }\n  .ds-page-header {\n    padding: var(--space-4);\n  }\n  .ds-page-header__title,\n  .ds-prose h1 {\n    font-size: calc(var(--text-h1) * 0.72);\n  }\n  .ds-label,\n  .ds-prose h2 {\n    font-size: calc(var(--text-h2) * 0.85);\n  }\n  .ds-hero__lead,\n  .ds-page-header__lead {\n    font-size: var(--text-base);\n  }\n  .ds-hero__actions,\n  .ds-hero__actions .ds-button,\n  .ds-page-header__actions,\n  .ds-page-header__actions .ds-button {\n    width: 100%;\n  }\n  .ds-ticket {\n    grid-template-columns: calc(var(--size-stub) * 0.6) minmax(0, 1fr);\n  }\n  .ds-ticket__number {\n    font-size: var(--text-h1);\n  }\n  .ds-ticket__body {\n    padding: var(--space-4) var(--space-3);\n  }\n  .ds-grid,\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-stat__value {\n    font-size: var(--text-h2);\n  }\n  .ds-sheet {\n    padding: var(--space-4);\n  }\n  .ds-tabs {\n    display: flex;\n  }\n  .ds-tabs__item {\n    flex: 1;\n  }\n  .ds-tabs__tab {\n    justify-content: center;\n    padding: 0 var(--space-2);\n    font-size: var(--text-small);\n  }\n  .ds-table {\n    font-size: var(--text-small);\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2);\n  }\n  .ds-table .ds-table__extra {\n    display: none;\n  }\n  .ds-notice {\n    align-items: flex-start;\n    flex-wrap: wrap;\n    gap: var(--space-1) var(--space-2);\n  }\n  .ds-list__item {\n    flex-wrap: wrap;\n    gap: var(--space-2) var(--space-3);\n  }\n  .ds-list__meta {\n    flex-basis: 100%;\n  }\n  .ds-overlay {\n    padding: var(--space-5) var(--space-3);\n  }\n  .ds-dialog__actions .ds-button {\n    flex: 1;\n  }\n  .ds-footer {\n    margin: var(--space-5) auto var(--space-6);\n    padding: var(--space-4);\n  }\n}\n/* phone: the tabs are one strip of blocks from edge to edge that scrolls sideways; the window cuts a block where there is more */\n@media (max-width: 600px) {\n  .ds-nav .ds-nav__links {\n    flex-wrap: nowrap;\n    align-items: stretch;\n    gap: 0;\n    width: 100%;\n    max-width: none;\n    margin: 0;\n    padding: 0;\n    overflow-x: auto;\n    scrollbar-width: none;\n    border-top: var(--border-width) var(--border-style) var(--color-border);\n    border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  }\n  .ds-nav__links li {\n    display: flex;\n    flex: 0 0 29%;\n    direction: ltr;\n    border-right: var(--border-width) var(--border-style) var(--color-border);\n  }\n  /* the drop-down cannot open inside a scrolling strip; its places are reached from the calendar */\n  .ds-nav__links li:has(.ds-menu) {\n    display: none;\n  }\n  .ds-nav__link {\n    flex: 1;\n    justify-content: center;\n    min-height: var(--size-control);\n    white-space: nowrap;\n    border: 0;\n    border-radius: 0;\n  }\n  /* on the last two views the strip starts at its far end, so the current block is in view */\n  .ds-page:has(#post:target) .ds-nav__links,\n  .ds-page:has(#guide:target) .ds-nav__links {\n    direction: rtl;\n    flex-direction: row-reverse;\n    justify-content: flex-end;\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: neubrutalism portal specimen, neighbourhood events sheet</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<header class=\"ds-nav\" data-component=\"nav\">\n  <p class=\"ds-nav__strip\">Fourteen things are on this week, nine of them free. <a class=\"ds-nav__strip-link\" href=\"#calendar\">See them all</a></p>\n  <div class=\"ds-nav__top\">\n    <a class=\"ds-brand\" data-component=\"brand\" href=\"#home\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linejoin=\"miter\" aria-hidden=\"true\"><polygon points=\"16.9,6.85 20,6.5 21.5,20 8,21.5 7.6,17.65 18,16.5\" fill=\"currentColor\" stroke=\"none\"/><polygon points=\"3,4.5 16.5,3 18,16.5 4.5,18\"/><circle cx=\"10.5\" cy=\"10.7\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <div class=\"ds-nav__actions\">\n      <span class=\"ds-person\"><span class=\"ds-avatar ds-avatar--small ds-avatar--3\">JR</span></span>\n      <a class=\"ds-button ds-button--small ds-button--secondary\" href=\"#guide\">Host guide</a>\n      <a class=\"ds-button ds-button--small\" href=\"#post\">Post an event</a>\n    </div>\n  </div>\n  <ul class=\"ds-nav__links\" aria-label=\"Main\">\n    <li><a class=\"ds-nav__link\" href=\"#home\">This week</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#calendar\">Calendar</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#event\">Next up</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#post\">Post</a></li>\n    <li><a class=\"ds-nav__link\" href=\"#guide\">Guide</a></li>\n    <li>\n      <details class=\"ds-menu\" data-component=\"menu\">\n        <summary class=\"ds-nav__link ds-menu__trigger\">Places</summary>\n        <ul class=\"ds-menu__list\">\n          <li class=\"ds-menu__item\"><a class=\"ds-menu__link\" href=\"#calendar\">The old dairy <span class=\"ds-badge ds-badge--plain\">6</span></a></li>\n          <li class=\"ds-menu__item\"><a class=\"ds-menu__link\" href=\"#calendar\">Canal library <span class=\"ds-badge ds-badge--plain\">4</span></a></li>\n          <li class=\"ds-menu__item\"><a class=\"ds-menu__link\" href=\"#calendar\">Bandstand <span class=\"ds-badge ds-badge--plain\">3</span></a></li>\n          <li class=\"ds-menu__item\"><a class=\"ds-menu__link\" href=\"#calendar\">Online <span class=\"ds-badge ds-badge--plain\">1</span></a></li>\n        </ul>\n      </details>\n    </li>\n  </ul>\n</header>\n\n<main class=\"ds-main\">\n<section class=\"ds-view ds-view--home\" id=\"home\">\n<div class=\"ds-column\">\n  <section class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-hero__text\">\n      <span class=\"ds-badge ds-badge--alt\">Week of 16 October</span>\n      <h1 class=\"ds-hero__title\">Things to do within a ten minute walk.</h1>\n      <p class=\"ds-hero__lead\">chronoskin is the notice board for the streets between the canal and the park: workshops, swaps, quizzes and one very serious choir.</p>\n      <div class=\"ds-hero__actions\">\n        <a class=\"ds-button ds-button--large\" href=\"#calendar\">Open the calendar</a>\n        <a class=\"ds-button ds-button--large ds-button--secondary\" href=\"#post\">Post an event</a>\n      </div>\n    </div>\n    <article class=\"ds-ticket\">\n      <div class=\"ds-ticket__stub\">\n        <span class=\"ds-ticket__day\">Sat</span>\n        <span class=\"ds-ticket__number\">18</span>\n        <span class=\"ds-ticket__day\">October</span>\n      </div>\n      <div class=\"ds-ticket__body\">\n        <div class=\"ds-badges\"><span class=\"ds-badge\">Next up</span><span class=\"ds-badge ds-badge--warning\">8 places left</span></div>\n        <h2 class=\"ds-ticket__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Mend your bike night</a></h2>\n        <p class=\"ds-ticket__meta\">18:30 at the old dairy. Free, bring the bike.</p>\n        <div class=\"ds-progress\" data-component=\"progress\">\n          <p class=\"ds-progress__label\"><span>Places taken</span><span>22 of 30</span></p>\n          <span class=\"ds-progress__track\"><span class=\"ds-progress__bar ds-progress__bar--70\"></span></span>\n        </div>\n        <ul class=\"ds-avatars\" aria-label=\"People going\">\n          <li class=\"ds-avatar\" data-component=\"avatar\">HN</li>\n          <li class=\"ds-avatar ds-avatar--2\">PA</li>\n          <li class=\"ds-avatar ds-avatar--3\">KO</li>\n          <li class=\"ds-avatar ds-avatar--4\">ML</li>\n          <li class=\"ds-avatars__more\">and 18 more</li>\n        </ul>\n      </div>\n    </article>\n  </section>\n\n  <dl class=\"ds-stat\" data-component=\"stats\">\n    <div class=\"ds-stat__cell\">\n      <dt class=\"ds-stat__label\">events this week</dt>\n      <dd class=\"ds-stat__value\">14</dd>\n    </div>\n    <div class=\"ds-stat__cell\">\n      <dt class=\"ds-stat__label\">of them free</dt>\n      <dd class=\"ds-stat__value\">9</dd>\n    </div>\n    <div class=\"ds-stat__cell\">\n      <dt class=\"ds-stat__label\">neighbours hosting</dt>\n      <dd class=\"ds-stat__value\">31</dd>\n    </div>\n    <div class=\"ds-stat__cell\">\n      <dt class=\"ds-stat__label\">places to meet</dt>\n      <dd class=\"ds-stat__value\">12</dd>\n    </div>\n  </dl>\n\n  <div class=\"ds-stack\">\n    <div class=\"ds-row\">\n      <h2 class=\"ds-label\">The next five days</h2>\n      <a class=\"ds-link\" href=\"#calendar\">Whole month</a>\n    </div>\n    <ul class=\"ds-grid\" data-component=\"grid\">\n      <li class=\"ds-grid__cell ds-grid__cell--1\">\n        <div class=\"ds-grid__head\"><span class=\"ds-grid__day\">Thu</span><span class=\"ds-grid__date\">16</span></div>\n        <ul class=\"ds-grid__body\">\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">10:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Toddler story hour</a></span></li>\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">19:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Seed swap</a></span></li>\n        </ul>\n      </li>\n      <li class=\"ds-grid__cell ds-grid__cell--2\">\n        <div class=\"ds-grid__head\"><span class=\"ds-grid__day\">Fri</span><span class=\"ds-grid__date\">17</span></div>\n        <ul class=\"ds-grid__body\">\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">17:30</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Canal litter pick</a></span></li>\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">20:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Quiz at the bandstand</a></span></li>\n        </ul>\n      </li>\n      <li class=\"ds-grid__cell ds-grid__cell--3\">\n        <div class=\"ds-grid__head\"><span class=\"ds-grid__day\">Sat</span><span class=\"ds-grid__date\">18</span></div>\n        <ul class=\"ds-grid__body\">\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">09:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Car boot at the yard</a></span></li>\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">18:30</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Mend your bike night</a></span></li>\n        </ul>\n      </li>\n      <li class=\"ds-grid__cell ds-grid__cell--4\">\n        <div class=\"ds-grid__head\"><span class=\"ds-grid__day\">Sun</span><span class=\"ds-grid__date\">19</span></div>\n        <ul class=\"ds-grid__body\">\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">11:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Choir, open rehearsal</a></span></li>\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">15:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Bread for beginners</a></span></li>\n        </ul>\n      </li>\n      <li class=\"ds-grid__cell\">\n        <div class=\"ds-grid__head\"><span class=\"ds-grid__day\">Mon</span><span class=\"ds-grid__date\">20</span></div>\n        <ul class=\"ds-grid__body\">\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__time\">18:00</span><span class=\"ds-grid__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Street plan meeting</a></span></li>\n          <li class=\"ds-grid__event\"><span class=\"ds-grid__text\">Nothing else yet. <a class=\"ds-link\" href=\"#post\">Add one</a></span></li>\n        </ul>\n      </li>\n    </ul>\n  </div>\n\n  <div class=\"ds-split\">\n    <div class=\"ds-stack\">\n      <h2 class=\"ds-label\">Just pinned up</h2>\n      <ul class=\"ds-list\" data-component=\"list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">Oct<span class=\"ds-list__number\">23</span></span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Lino printing for the nervous</a></h3>\n            <p class=\"ds-list__text\">Two hours, one potato, then real lino. Canal library.</p>\n          </div>\n          <span class=\"ds-list__meta\">Pinned 2 hours ago</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">Oct<span class=\"ds-list__number\">25</span></span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Pumpkin soup cook-off</a></h3>\n            <p class=\"ds-list__text\">Bring a pot and a ladle. Judged by the under tens.</p>\n          </div>\n          <span class=\"ds-list__meta\">Pinned yesterday</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-list__date\">Nov<span class=\"ds-list__number\">1</span></span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#event\">Lantern walk along the towpath</a></h3>\n            <p class=\"ds-list__text\">Meet at the lock at dusk. Jam jars welcome.</p>\n          </div>\n          <span class=\"ds-list__meta\">Pinned 2 days ago</span>\n        </li>\n      </ul>\n    </div>\n    <section class=\"ds-panel\" data-component=\"panel\">\n      <h2 class=\"ds-panel__title\">Host of the month</h2>\n      <div class=\"ds-panel__body\">\n        <div class=\"ds-person\">\n          <span class=\"ds-avatar ds-avatar--large ds-avatar--2\">PA</span>\n          <span><span class=\"ds-person__name\">Priya Anand</span><span class=\"ds-person__role\">Runs the bike nights, 14 so far</span></span>\n        </div>\n        <p>Priya keeps a box of spare inner tubes and has never let anyone leave on a flat.</p>\n        <a class=\"ds-button ds-button--secondary ds-button--wide\" href=\"#guide\">Host something yourself</a>\n      </div>\n    </section>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"calendar\">\n<div class=\"ds-column\">\n  <header class=\"ds-page-header\" data-component=\"page-header\">\n    <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">This week</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">Calendar</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">October</li>\n    </ol>\n    <div class=\"ds-page-header__row\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">October</h1>\n        <p class=\"ds-page-header__lead\">46 events at 12 places. Tap one to book.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#post\">Post an event</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-split\">\n    <div class=\"ds-stack\">\n      <div class=\"ds-row\">\n        <ul class=\"ds-tabs\" data-component=\"tabs\">\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab is-current\" href=\"#calendar\">List</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#calendar\">Week</a></li>\n          <li class=\"ds-tabs__item\"><a class=\"ds-tabs__tab\" href=\"#calendar\">Month</a></li>\n        </ul>\n        <span class=\"ds-note\">Showing 1 to 9 of 46</span>\n      </div>\n      <table class=\"ds-table\" data-component=\"table\">\n        <thead>\n          <tr><th>When</th><th>Event</th><th class=\"ds-table__extra\">Where</th><th>Places</th><th class=\"ds-table__num\">Left</th></tr>\n        </thead>\n        <tbody>\n          <tr><td>Thu 16, 10:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Toddler story hour</a></td><td class=\"ds-table__extra\">Canal library</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">14</td></tr>\n          <tr><td>Thu 16, 19:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Seed swap</a></td><td class=\"ds-table__extra\">The old dairy</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">40</td></tr>\n          <tr><td>Fri 17, 17:30</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Canal litter pick</a></td><td class=\"ds-table__extra\">Lock 4</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">25</td></tr>\n          <tr><td>Fri 17, 20:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Quiz at the bandstand</a></td><td class=\"ds-table__extra\">Bandstand</td><td><span class=\"ds-badge ds-badge--danger\">Full</span></td><td class=\"ds-table__num\">0</td></tr>\n          <tr class=\"is-current\"><td>Sat 18, 18:30</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Mend your bike night</a></td><td class=\"ds-table__extra\">The old dairy</td><td><span class=\"ds-badge ds-badge--warning\">Few left</span></td><td class=\"ds-table__num\">8</td></tr>\n          <tr><td>Sun 19, 11:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Choir, open rehearsal</a></td><td class=\"ds-table__extra\">Chapel hall</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">30</td></tr>\n          <tr><td>Sun 19, 15:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Bread for beginners</a></td><td class=\"ds-table__extra\">The old dairy</td><td><span class=\"ds-badge ds-badge--warning\">Few left</span></td><td class=\"ds-table__num\">2</td></tr>\n          <tr><td>Mon 20, 18:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Street plan meeting</a></td><td class=\"ds-table__extra\">Chapel hall</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">52</td></tr>\n          <tr><td>Thu 23, 19:00</td><td><a class=\"ds-link ds-link--quiet\" href=\"#event\">Lino printing for the nervous</a></td><td class=\"ds-table__extra\">Canal library</td><td><span class=\"ds-badge ds-badge--success\">Open</span></td><td class=\"ds-table__num\">9</td></tr>\n        </tbody>\n      </table>\n      <div class=\"ds-row\">\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li><span class=\"ds-pagination__link is-disabled\">Previous</span></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#calendar\" aria-current=\"page\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#calendar\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#calendar\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#calendar\">Next</a></li>\n        </ul>\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">Today</span>\n          <span class=\"ds-badge ds-badge--success\">Open</span>\n          <span class=\"ds-badge ds-badge--warning\">Few left</span>\n          <span class=\"ds-badge ds-badge--danger\">Full</span>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"ds-stack\">\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">October at a glance</h2>\n        <div class=\"ds-panel__body\">\n          <ol class=\"ds-month\" aria-label=\"October\">\n            <li class=\"ds-month__day ds-month__day--head\">M</li><li class=\"ds-month__day ds-month__day--head\">T</li><li class=\"ds-month__day ds-month__day--head\">W</li><li class=\"ds-month__day ds-month__day--head\">T</li><li class=\"ds-month__day ds-month__day--head\">F</li><li class=\"ds-month__day ds-month__day--head\">S</li><li class=\"ds-month__day ds-month__day--head\">S</li>\n            <li class=\"ds-month__day\"></li><li class=\"ds-month__day\"></li><li class=\"ds-month__day\">1</li><li class=\"ds-month__day is-busy\">2</li><li class=\"ds-month__day\">3</li><li class=\"ds-month__day is-busy\">4</li><li class=\"ds-month__day\">5</li>\n            <li class=\"ds-month__day\">6</li><li class=\"ds-month__day\">7</li><li class=\"ds-month__day is-busy\">8</li><li class=\"ds-month__day\">9</li><li class=\"ds-month__day is-busy\">10</li><li class=\"ds-month__day is-busy\">11</li><li class=\"ds-month__day\">12</li>\n            <li class=\"ds-month__day\">13</li><li class=\"ds-month__day is-busy\">14</li><li class=\"ds-month__day\">15</li><li class=\"ds-month__day is-current\">16</li><li class=\"ds-month__day is-busy\">17</li><li class=\"ds-month__day is-busy\">18</li><li class=\"ds-month__day is-busy\">19</li>\n            <li class=\"ds-month__day is-busy\">20</li><li class=\"ds-month__day\">21</li><li class=\"ds-month__day\">22</li><li class=\"ds-month__day is-busy\">23</li><li class=\"ds-month__day\">24</li><li class=\"ds-month__day is-busy\">25</li><li class=\"ds-month__day\">26</li>\n            <li class=\"ds-month__day\">27</li><li class=\"ds-month__day\">28</li><li class=\"ds-month__day is-busy\">29</li><li class=\"ds-month__day\">30</li><li class=\"ds-month__day is-busy\">31</li><li class=\"ds-month__day\"></li><li class=\"ds-month__day\"></li>\n          </ol>\n          <div class=\"ds-row\">\n            <label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Free only</span></label>\n            <span class=\"ds-tooltip\" data-component=\"tooltip\"><button class=\"ds-tooltip__trigger\" type=\"button\" aria-describedby=\"tip-free\">?</button><span class=\"ds-tooltip__tip\" id=\"tip-free\" role=\"tooltip\">Free means no ticket. Some hosts pass a hat at the end.</span></span>\n          </div>\n          <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\"><span class=\"ds-switch__track\"></span><span>Hide full events</span></label>\n        </div>\n      </section>\n      <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n        <h2 class=\"ds-sidebar__title\">Kinds of thing</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li class=\"ds-sidebar__item is-current\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">Everything</a><span class=\"ds-badge\">46</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">Workshops</a><span class=\"ds-badge ds-badge--plain\">17</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">Swaps and sales</a><span class=\"ds-badge ds-badge--plain\">9</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">Music and quizzes</a><span class=\"ds-badge ds-badge--plain\">11</span></li>\n        </ul>\n      </aside>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"event\">\n<div class=\"ds-column\">\n  <header class=\"ds-page-header\">\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">This week</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#calendar\">October</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Mend your bike night</li>\n    </ol>\n    <div class=\"ds-page-header__row\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Mend your bike night</h1>\n        <p class=\"ds-page-header__lead\">Saturday 18 October, 18:30, at the old dairy.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#calendar\">Back to October</a>\n        <a class=\"ds-button\" href=\"#event\">Book a place</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-notice\" role=\"status\"><strong class=\"ds-notice__title\">Doors at 18:15.</strong><p class=\"ds-notice__text\">The yard gate is the green one on Mill Lane, not the front door.</p></div>\n\n  <div class=\"ds-split\">\n    <div class=\"ds-stack\">\n      <section class=\"ds-panel\">\n        <h2 class=\"ds-panel__title\">What happens</h2>\n        <div class=\"ds-panel__body\">\n          <p>Bring a bike with something wrong with it. Priya and two volunteers show you how to fix it yourself: punctures, brakes that squeal, gears that skip. Tools and tea are on the bench.</p>\n          <p>Children are welcome with an adult. Parts are sold at cost from the box by the door.</p>\n        </div>\n      </section>\n      <div class=\"ds-row\">\n        <h2 class=\"ds-label\">Who is coming</h2>\n        <span class=\"ds-note\">22 going, 3 not sure</span>\n      </div>\n      <ul class=\"ds-list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar\">HN</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\">Hana Novak</h3>\n            <p class=\"ds-list__text\">Bringing a tandem with no chain.</p>\n          </div>\n          <span class=\"ds-badge ds-badge--success\">Going</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar ds-avatar--3\">KO</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\">Kofi Owusu</h3>\n            <p class=\"ds-list__text\">Can lend a truing stand.</p>\n          </div>\n          <span class=\"ds-badge ds-badge--success\">Going</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar ds-avatar--4\">ML</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\">Marta Lind</h3>\n            <p class=\"ds-list__text\">Depends on the babysitter.</p>\n          </div>\n          <span class=\"ds-badge ds-badge--warning\">Not sure</span>\n        </li>\n      </ul>\n      <div class=\"ds-overlay\">\n        <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"dlg-title\">\n          <div class=\"ds-dialog__bar\">\n            <h2 class=\"ds-dialog__title\" id=\"dlg-title\">Book one place?</h2>\n            <a class=\"ds-dialog__close\" href=\"#event\" aria-label=\"Close\">&times;</a>\n          </div>\n          <div class=\"ds-dialog__body\"><p>We hold it under your name until 18:45 on the night, then give it to the next person waiting.</p></div>\n          <div class=\"ds-dialog__actions\">\n            <a class=\"ds-button ds-button--secondary\" href=\"#event\">Not now</a>\n            <a class=\"ds-button\" href=\"#calendar\">Book it</a>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"ds-stack\">\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">The details</h2>\n        <div class=\"ds-panel__body\">\n          <dl class=\"ds-facts\">\n            <dt class=\"ds-facts__term\">When</dt><dd class=\"ds-facts__value\">Sat 18 Oct, 18:30 to 21:00</dd>\n            <dt class=\"ds-facts__term\">Where</dt><dd class=\"ds-facts__value\">The old dairy, Mill Lane</dd>\n            <dt class=\"ds-facts__term\">Cost</dt><dd class=\"ds-facts__value\">Free</dd>\n            <dt class=\"ds-facts__term\">Host</dt><dd class=\"ds-facts__value\">Priya Anand</dd>\n          </dl>\n          <div class=\"ds-progress\">\n            <p class=\"ds-progress__label\"><span>Places taken</span><span>22 of 30</span></p>\n            <span class=\"ds-progress__track\"><span class=\"ds-progress__bar ds-progress__bar--70\"></span></span>\n          </div>\n          <ul class=\"ds-avatars\" aria-label=\"People going\">\n            <li class=\"ds-avatar\">HN</li>\n            <li class=\"ds-avatar ds-avatar--2\">PA</li>\n            <li class=\"ds-avatar ds-avatar--3\">KO</li>\n            <li class=\"ds-avatars__more\">and 19 more</li>\n          </ul>\n          <a class=\"ds-button ds-button--wide\" href=\"#event\">Book a place</a>\n        </div>\n      </section>\n      <div class=\"ds-accordion\">\n        <details class=\"ds-accordion__item\" open>\n          <summary class=\"ds-accordion__head\">Is there step-free access?</summary>\n          <div class=\"ds-accordion__body\"><p>Yes, through the yard gate. The bench is at wheelchair height.</p></div>\n        </details>\n        <details class=\"ds-accordion__item\">\n          <summary class=\"ds-accordion__head\">Where do I lock up?</summary>\n          <div class=\"ds-accordion__body\"><p>Six hoops by the gate.</p></div>\n        </details>\n      </div>\n      <div class=\"ds-empty\" data-component=\"empty\">\n        <h2 class=\"ds-empty__title\">No questions yet</h2>\n        <p class=\"ds-empty__text\">Ask the host anything before the night.</p>\n        <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#post\">Ask a question</a>\n      </div>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"post\">\n<div class=\"ds-column\">\n  <header class=\"ds-page-header\">\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">This week</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Post an event</li>\n    </ol>\n    <div class=\"ds-page-header__row\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">Post an event</h1>\n        <p class=\"ds-page-header__lead\">It goes on the board as soon as a neighbour has read it over.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#guide\">Read the host guide</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-stack\" data-component=\"notice\">\n    <div class=\"ds-notice\" role=\"status\"><strong class=\"ds-notice__title\">Saved as a draft.</strong><p class=\"ds-notice__text\">You can close this page and come back to it.</p></div>\n    <div class=\"ds-notice ds-notice--error\" role=\"alert\"><strong class=\"ds-notice__title\">One thing to fix.</strong><p class=\"ds-notice__text\">The start time is missing, so we cannot put it on a day yet.</p></div>\n  </div>\n\n  <div class=\"ds-split\">\n    <section class=\"ds-panel\">\n      <h2 class=\"ds-panel__title\">About the event</h2>\n      <div class=\"ds-panel__body\">\n        <form class=\"ds-form\" data-component=\"form\">\n          <div class=\"ds-form__field\">\n            <label class=\"ds-form__label\" for=\"f-title\">What is it called?</label>\n            <input class=\"ds-form__control\" id=\"f-title\" type=\"text\" value=\"Jam jar lantern making\">\n          </div>\n          <div class=\"ds-form__row\">\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-time\">Starts at</label>\n              <input class=\"ds-form__control is-invalid\" id=\"f-time\" type=\"text\" value=\"evening\" aria-invalid=\"true\" aria-describedby=\"f-time-err\">\n              <p class=\"ds-form__error\" id=\"f-time-err\">Give a time such as 18:30.</p>\n            </div>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-place\">Where</label>\n              <select class=\"ds-form__control\" id=\"f-place\">\n                <option>Canal library</option>\n                <option>The old dairy</option>\n                <option>Bandstand</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"ds-form__field\">\n            <label class=\"ds-form__label\" for=\"f-about\">What should people expect?</label>\n            <textarea class=\"ds-form__control ds-form__control--area\" id=\"f-about\">Bring a clean jar. We have wire, tissue paper and glue. Ready in time for the lantern walk.</textarea>\n            <p class=\"ds-form__hint\">Two or three sentences is plenty.</p>\n          </div>\n          <div class=\"ds-form__toggles\">\n            <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Free to come</span></label>\n            <label class=\"ds-switch\"><input class=\"ds-switch__input\" type=\"checkbox\"><span class=\"ds-switch__track\"></span><span>Limit the places</span></label>\n          </div>\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Children are welcome with an adult</label>\n          <div class=\"ds-form__foot ds-buttons\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"button\">Send for a read</button>\n            <button class=\"ds-button ds-button--secondary\" type=\"button\">Save draft</button>\n            <button class=\"ds-button ds-button--danger\" type=\"button\">Throw away</button>\n            <button class=\"ds-button is-disabled\" type=\"button\" disabled>Pin it now</button>\n          </div>\n        </form>\n      </div>\n    </section>\n\n    <div class=\"ds-stack\">\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">Three steps</h2>\n        <div class=\"ds-panel__body\">\n          <ol class=\"ds-steps\">\n            <li class=\"ds-steps__item is-done\">Pick a day and a place</li>\n            <li class=\"ds-steps__item is-current\">Describe it</li>\n            <li class=\"ds-steps__item\">A neighbour reads it over</li>\n          </ol>\n          <div class=\"ds-progress\">\n            <p class=\"ds-progress__label\"><span>Nearly ready</span><span>4 of 5 fields</span></p>\n            <span class=\"ds-progress__track\"><span class=\"ds-progress__bar ds-progress__bar--85\"></span></span>\n          </div>\n        </div>\n      </section>\n      <section class=\"ds-panel\">\n        <h2 class=\"ds-panel__title\">Your reader</h2>\n        <div class=\"ds-panel__body\">\n          <div class=\"ds-person\">\n            <span class=\"ds-avatar ds-avatar--4\">ML</span>\n            <span><span class=\"ds-person__name\">Marta Lind</span><span class=\"ds-person__role\">Usually replies within a day</span></span>\n          </div>\n          <p class=\"ds-note\">Readers only check that the day, the place and the price are clear.</p>\n        </div>\n      </section>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"guide\">\n<div class=\"ds-column\">\n  <header class=\"ds-page-header\">\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">This week</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#guide\">Guide</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Hosting</li>\n    </ol>\n    <div class=\"ds-page-header__row\">\n      <div class=\"ds-page-header__main\">\n        <h1 class=\"ds-page-header__title\">The host guide</h1>\n        <p class=\"ds-page-header__lead\">Everything we have learned from 300 evenings in borrowed rooms.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#post\">Post an event</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"ds-split\">\n    <article class=\"ds-sheet\">\n      <div class=\"ds-prose\" data-component=\"typography\">\n        <h1>Hosting on chronoskin</h1>\n        <p>Anyone who lives or works between the canal and the park can pin an event. It does not have to be big: <strong>six people around a table</strong> counts.</p>\n        <h2>Before you pin it</h2>\n        <p>Check the room is free and pick a day. Give the event a short tag such as <code>bike-night</code> so that regulars can follow it.</p>\n        <ul>\n          <li>Say what it costs, even when the answer is nothing</li>\n          <li>Say whether children and dogs can come</li>\n          <li>Say where the door is</li>\n        </ul>\n        <h3>On the night</h3>\n        <p>Open the list on your phone and tick people in. Unclaimed places go to the waiting list after fifteen minutes. See <a href=\"#event\">how a booking looks</a> to a guest.</p>\n      </div>\n      <ul class=\"ds-links\" data-component=\"links\">\n        <li><a class=\"ds-link\" href=\"#guide\">Borrowing a room</a></li>\n        <li><a class=\"ds-link is-visited\" href=\"#guide\">Writing the notice</a></li>\n        <li><a class=\"ds-link is-hover\" href=\"#guide\">When nobody comes</a></li>\n        <li><a class=\"ds-link is-active\" href=\"#post\">Post an event</a></li>\n      </ul>\n    </article>\n    <div class=\"ds-stack\">\n      <h2 class=\"ds-label\">Asked a lot</h2>\n      <div class=\"ds-accordion\" data-component=\"accordion\">\n        <details class=\"ds-accordion__item\" open>\n          <summary class=\"ds-accordion__head\">Does it cost anything to post?</summary>\n          <div class=\"ds-accordion__body\"><p>No. The board is paid for by the street fund.</p></div>\n        </details>\n        <details class=\"ds-accordion__item\">\n          <summary class=\"ds-accordion__head\">Can I charge for tickets?</summary>\n          <div class=\"ds-accordion__body\"><p>Yes, at the door. We do not take payments.</p></div>\n        </details>\n        <details class=\"ds-accordion__item\">\n          <summary class=\"ds-accordion__head\">What if I have to cancel?</summary>\n          <div class=\"ds-accordion__body\"><p>Mark it cancelled and everyone booked gets a message.</p></div>\n        </details>\n        <details class=\"ds-accordion__item\">\n          <summary class=\"ds-accordion__head\">Who reads my event over?</summary>\n          <div class=\"ds-accordion__body\"><p>One of nine volunteer neighbours, in turn.</p></div>\n        </details>\n      </div>\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">Still stuck?</h2>\n        <div class=\"ds-panel__body\">\n          <p>Come to the street plan meeting on Monday and ask in person.</p>\n          <a class=\"ds-button ds-button--secondary ds-button--wide\" href=\"#event\">See the meeting</a>\n        </div>\n      </section>\n    </div>\n  </div>\n</div>\n</section>\n</main>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <p class=\"ds-footer__brand\">chronoskin</p>\n  <ul class=\"ds-footer__list\">\n    <li><a class=\"ds-footer__link\" href=\"#calendar\">Calendar</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#post\">Post an event</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#guide\">Host guide</a></li>\n  </ul>\n  <p class=\"ds-footer__legal\">chronoskin, 2025. Kept by the neighbours.</p>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.neubrutalism.portal.s08.p08.t03.u07\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"neubrutalism\",\n    \"years\": [\n      2021,\n      2026\n    ]\n  },\n  \"archetype\": \"portal\",\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-nb-8837\",\n  \"short\": \"v1-nb-8837\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #14163f;\n  --color-canvas: #14163f;\n  --color-surface: #1f2260;\n  --color-surface-alt: #2d3184;\n  --color-surface-strong: #3d43b8;\n  --color-bar: #14163f;\n  --color-bar-text: #fff6dc;\n  --color-bar-alt: #ffe14d;\n  --color-bar-alt-text: #14163f;\n  --color-inverse: #fff6dc;\n  --color-inverse-text: #14163f;\n  --color-text: #fff6dc;\n  --color-text-muted: #b4b6e0;\n  --color-heading: #fff6dc;\n  --color-heading-alt: #ffe14d;\n  --color-link: #ffe14d;\n  --color-link-quiet: #fff6dc;\n  --color-link-visited: #ffe14d;\n  --color-link-hover: #fff6dc;\n  --color-link-active: #14163f;\n  --color-border: #fff6dc;\n  --color-border-strong: #fff6dc;\n  --color-border-muted: #5a5da8;\n  --color-accent: #ff7a59;\n  --color-accent-text: #14163f;\n  --color-accent-alt: #16755e;\n  --color-fill-1: #2b59e0;\n  --color-fill-2: #c2402c;\n  --color-fill-3: #16755e;\n  --color-fill-4: #7a3fd6;\n  --color-button: #ffe14d;\n  --color-button-text: #14163f;\n  --color-button-hover-text: #14163f;\n  --color-button-secondary: #fff6dc;\n  --color-button-secondary-text: #14163f;\n  --color-input: #1f2260;\n  --color-input-text: #fff6dc;\n  --color-input-border: #fff6dc;\n  --color-disabled: #2d3184;\n  --color-disabled-text: #9a9cc8;\n  --color-danger: #e8492f;\n  --color-danger-surface: #a32a1c;\n  --color-success: #19803f;\n  --color-warning: #a35f00;\n  --color-notice: #2d3184;\n  --color-notice-text: #fff6dc;\n  --color-focus: #5ecbff;\n  --color-shadow: #5ecbff;\n  --color-overlay: rgb(8 9 36 / 0.86);\n}\n\n/* @part type */\n:root {\n  --font-body: \"Public Sans\", \"DM Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-heading: \"Public Sans\", \"DM Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-ui: \"Public Sans\", \"DM Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --text-base: 16px;\n  --text-small: 14px;\n  --text-ui: 16px;\n  --text-large: 24px;\n  --text-display: 72px;\n  --text-h1: 48px;\n  --text-h2: 36px;\n  --text-h3: 22px;\n  --line-body: 1.5;\n  --line-heading: 1.1;\n  --line-display: 1.1;\n  --weight-body: 500;\n  --weight-bold: 700;\n  --weight-heading: 800;\n  --weight-display: 900;\n  --weight-ui: 600;\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: none;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 3px;\n  --border-width-strong: 6px;\n  --border-style: solid;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 9999px;\n  --radius-page: 0;\n  --shadow-panel: 7px 7px 0 0 var(--color-shadow);\n  --shadow-control: 5px 5px 0 0 var(--color-shadow);\n  --shadow-control-hover: 3px 3px 0 0 var(--color-shadow);\n  --shadow-control-pressed: 0 0 0 0 var(--color-shadow);\n  --shadow-dialog: 11px 11px 0 0 var(--color-shadow);\n  --shadow-text: none;\n  --fill-page:\n    linear-gradient(color-mix(in srgb, var(--color-border) 16%, transparent) 2px, transparent 0) 0 0 / 100% 34px,\n    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: var(--color-button);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 4px solid var(--color-focus);\n  --transition: transform 0.08s steps(2), box-shadow 0.08s steps(2);\n  --backdrop-blur: 0px;\n}\n"
  }
}
