{
  "id": "v1-nb-522a",
  "long_id": "v1.neubrutalism.app.s05.p02.t02.u10",
  "name": "Neubrutalism dashboard (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": "app",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "An application screen in the neubrutalist look: a white rail of navigation on the left, a filled strip across the top and a working area of outlined cards on a dotted page, every card standing on a hard, unblurred shadow. It was common from about 2021 to 2026 in admin templates, dashboards of small software products and the component kits that fed them. Figures sit in chunky filled cards, tables and tabs are closed by thick rules, and nothing is shaded, blurred or faded.",
  "url": "https://chrono.skin/s/v1-nb-522a",
  "preview_url": "https://chrono.skin/s/v1-nb-522a/specimen.html",
  "files": {
    "STYLE.md": "# Neubrutalism dashboard (2021 to 2026)\n\n## Summary\n\nAn application screen in the neubrutalist look: a white rail of navigation on the left, a filled strip across the top and a working area of outlined cards on a dotted page, every card standing on a hard, unblurred shadow. It was common from about 2021 to 2026 in admin templates, dashboards of small software products and the component kits that fed them. Figures sit in chunky filled cards, tables and tabs are closed by thick rules, and nothing is shaded, blurred or faded.\n\n## Layout\n\n- The page is fluid: `--size-page` is 100%. `.ds-page` is a grid of two columns, a `--size-rail` (248px) rail on the left that runs the full height of the page and the rest for the top bar, the screen and the footer. Designed at a 1440px viewport, where the screen is 1128px of content; the content is capped at `--size-content` (1180px) and centred beyond that.\n- The rail (`.ds-nav`) is the only navigation: the brand, a label, a column of links with icons and counts (the current one a filled, outlined, shadowed block), then a storage card on the inverse fill. It is closed on its right by a `--border-width-strong` rule.\n- The top bar (`.ds-topbar`) is a `--size-topbar` (64px) strip on `--fill-bar-alt`, closed by a `--border-width-strong` rule: a `--size-search` (300px) search field, a line of status text, one small primary button and the signed-in person.\n- The screen (`.ds-main`, then one `.ds-screen` per view) stacks its blocks `--space-6` (24px) apart with `--space-gutter` (32px) at the sides. The home screen is: the hero card, a row of four stat cards, then two rows split 2:1 (`.ds-split--wide`). There are no full-bleed bands and no rules between blocks; every block is a card on the page fill.\n- Inner pages keep the rail, the top bar and the footer and drop the hero and the stat cards. The screen starts with the `.ds-breadcrumb`, then a `.ds-page-header` (34px title and one line of description on the left, at most two buttons on the right, bottom-aligned, no rule), then the working components. A list screen is a `.ds-split`: the main column holds the `.ds-tabs` standing on their thick rule, the table and a `.ds-row` with the pagination and a count; the `--size-side` (304px) side column holds a `.ds-sidebar` and plain panels. A board screen is one `.ds-grid` of four columns across the whole width. A form screen puts notices first, then a `.ds-split` with the form in a panel and a side column, then the dialog on its `.ds-overlay` block.\n- Spacing scale: `--space-1` 4px (gap between wave bars, underline offset, inline code padding), `--space-2` 8px (badge padding, gap between rail links, label to control, pagination gaps), `--space-3` 12px (row and strip padding, gaps inside a card, gap between board cards), `--space-4` 16px (panel body padding, side padding of rows, gap between buttons and fields), `--space-5` 20px (gap inside a stack, gap between board columns, stat card side padding), `--space-6` 24px (gap between the blocks of a screen and between columns), `--space-7` 32px (hero padding, screen top padding, sheet padding), `--space-8` 48px (screen bottom padding, overlay padding). `--space-gutter` 32px is the side padding of the top bar, the screen and the footer.\n- Movement tokens: `--space-nudge` 2px (hover offset, focus outline offset) and `--space-press` 4px (pressed offset, offset of the red shadow under an invalid field). Hover and press move a control straight down, never sideways, so the movement is right whichever way the surface set throws its shadows.\n- Fixed sizes: `--size-control` 40px (buttons, inputs, rail links, tabs), `--size-control-large` 48px (hero buttons), `--size-control-small` 32px (small buttons, pagination squares, the dialog's close button), `--size-logo` 32px, `--size-icon` 20px (rail icons), `--size-avatar` 32px, `--size-check` 20px, `--size-chart` 184px (height of the bar chart), `--size-wave` 64px, `--size-player` 340px (the card in the hero), `--size-meter` 14px, `--size-dialog` 460px, `--size-measure` 620px (lead text).\n- Below 1100px the hero stacks, and the stat row and the board drop to two columns. Below 900px the rail becomes a block across the top (brand, then the links in a wrapping row; the labels, counts and storage card are hidden), and every split stacks. Below 600px the status line and the person's name are hidden, the search field fills the top bar, the board and the form rows are one column, hero buttons fill the width, titles step down, the tabs scroll sideways inside their own row, notices stack and table columns marked `.ds-table__extra` are hidden so a table never scrolls sideways. On a phone `.ds-nav__links` is a bar of five equal cells fixed to the bottom edge of the window, each `.ds-nav__link` an icon (`.ds-nav__icon`, shown again here) above its label and separated by rules, the current one without a shadow and in the heavier weight; the rest of the rail is not shown.\n- Views: the specimen is one example application, a podcast studio, with five views switched by plain `#name` links. `home` is the overview (hero with the latest cut, stat cards, the plays chart beside the most-played ranking, recent activity beside an empty release slot). `episodes` is a list screen (breadcrumb, page header, tabs, table, pagination, the shows sidebar and the key of status labels). `board` is the production board (four columns of task cards, one of them empty, and a notice). `settings` is a form screen (notices, the show form with its buttons, who can edit, and the delete dialog). `guide` is a handbook article on a sheet with further links. The rail marks 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- The page, the canvas and every surface are one white (`--color-page`, `--color-canvas`, `--color-surface` #ffffff); cells are told apart by black rules and by flat saturated fills, not by tints. Table rows do not alternate.\n- `--color-surface-strong` and `--color-accent` are pink #ff90e8 with black text: panel, dialog and hero card title strips, the current navigation item, tab and page, the default badge, the highlight behind a hovered link. `--color-surface-alt` is yellow #ffc900: the hero stage, the actions cell of the page header, the empty state, the current table row, inline code, a hovered tab. `--color-accent-alt` is lemon #f1f333: the marked words of the hero title and \"new\" badges.\n- `--color-fill-1` to `--color-fill-4` are pink #ff90e8, yellow #ffc900, teal #23a094 and periwinkle #90a8ed, always with black text: every second cell of the grid and the left half of the call to action. Use each once before repeating.\n- The primary button is black with white text (`--color-button` #000000, `--color-button-text` #ffffff), and so is the last navigation cell; the secondary button is white. The tag strip (`--color-bar-alt`) and the footer (`--color-inverse`) are the same black with white text; the navigation row and the table head (`--color-bar`) are white.\n- Text, headings, every link colour, borders, focus and shadow are #000000. `--color-text-muted` is #666666 (dates, hints, the count beside the tabs), `--color-border-muted` #b3b3b3 (dividers of the sidebar list), disabled is #aeaeae with #303030 text.\n- Status: `--color-success` teal #23a094, `--color-warning` yellow #ffc900, `--color-danger` red #dc341e (error text, the destructive button, the danger badge), `--color-danger-surface` #e2442f behind an error notice, `--color-notice` periwinkle #90a8ed. All carry black text.\n- One geometric sans for body, headings and controls (`--font-body`, `--font-heading`, `--font-ui`: Google Sans Flex, Albert Sans, then Avenir Next); `--font-mono` only for inline code.\n- Nothing is bold. `--weight-body`, `--weight-heading`, `--weight-display` and `--weight-ui` are 400; `--weight-bold` is 500 and is the only emphasis (buttons, labels, badges, strong text, the tag strip). Size carries the hierarchy.\n- `--text-base` 18px at `--line-body` 1.55; `--text-small` 14px for labels, meta, table heads, grid cell text and the footer; `--text-ui` 16px for navigation, buttons, inputs, tabs and the tag strip; `--text-large` 24px for leads, large buttons and the brand.\n- `--text-display` 60px at `--line-display` 1.1 for the hero title; `--text-h1` 48px (prose h1, the inner page title, stat figures, the call to action, the footer brand), `--text-h2` 36px (section heads, prose h2) and `--text-h3` 24px (grid cell, cell label, panel, sidebar, dialog and empty-state titles) at `--line-heading` 1.25. No tracking, no uppercase headings.\n- Uppercase is used only for 12px labels: `.ds-badge` and `.ds-footer__title`. 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`); navigation, titles and breadcrumbs are not (`--link-decoration-quiet`). Visited links are not marked.\n- `--border-width` is a 1px black hairline on every box and rule; `--border-width-strong` 2px only under the navigation.\n- Corners: `--radius-control` 4px on buttons, inputs and icon boxes; `--radius-panel` and `--radius-page` 0, so cards, panels and dialogs are square; `--radius-pill` 9999px, so badges and the current navigation item are full pills.\n- Nothing has a shadow at rest: `--shadow-panel` and `--shadow-control` are `none`, so the hero cards are told apart by their overlap and outline. A hard shadow appears with interaction only: `--shadow-control-hover` is `2px 2px 0 0` black (also the pagination squares and icon boxes), `--shadow-control-pressed` is `none`, and the dialog alone floats on `--shadow-dialog` `4px 4px 0 0`.\n- All fills are flat (`--fill-page` is the plain page colour, no grid); `--fill-button-hover` equals `--fill-button`, hover moves the button and gives it its shadow.\n- `--focus-ring` is `2px solid` black; `--transition` animates only `transform` and `box-shadow` over 0.14s.\n\n- Outlines are thin: `--border-width` 1px on every box and rule, `--border-width-strong` 2px under the navigation.\n- Corners are soft and grow with the box: `--radius-control` 14px, `--radius-panel` 18px, `--radius-page` 24px, `--radius-pill` 9999px so badges are full pills.\n- Shadows stay hard and unblurred, in pink, and fall straight down, so every box stands on a lip instead of a corner block: `--shadow-panel` `0 6px 0 0`, `--shadow-control` `0 4px 0 0`, `--shadow-control-hover` `0 2px 0 0`, `--shadow-control-pressed` zero offset, `--shadow-dialog` `0 10px 0 0`.\n- All fills are flat (`--fill-page` is the plain page colour, no grid).\n- `--focus-ring` is `2px solid` in `--color-focus`; `--transition` animates only `transform` and `box-shadow` over 0.12s.\n\n## Components\n\n- `.ds-page`: on `<body>`. The two-column grid, the page fill with its dots, the base font and colour. Its children are the `.ds-nav` rail, the `.ds-topbar`, `<main class=\"ds-main\">` and the `.ds-footer`.\n- `.ds-brand`: the site's mark and name at the top of the rail, a link to the overview. `.ds-brand__mark` is a `--size-logo` tile dressed like the primary button (`--fill-button`, mark in `--color-button-text`, outline, `--radius-control`, `--shadow-control`), so every palette and surface set reskins it. `.ds-brand__name` is the name in the heading font at `--text-large`. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the rail. `.ds-nav__label` is a small uppercase label over `.ds-nav__links`, a column of `.ds-nav__link` rows, each with a `.ds-nav__icon` (inline SVG in `currentColor`) and optionally a plain badge with `.ds-nav__count` pushed to the right. The current link (`is-current`) is filled with the accent, outlined and shadowed; `is-hover` shows the outline only. `.ds-nav__card` is the inverse card at the foot, with `.ds-nav__card-title`, `.ds-nav__card-text`, a meter and one small secondary button.\n- `.ds-topbar`: the filled strip over the screen. `.ds-topbar__search` is a `.ds-form__control` of fixed width, `.ds-topbar__note` one line of status text that takes the free space, then one small button and `.ds-topbar__user` (a `.ds-avatar` and `.ds-topbar__name`).\n- `.ds-avatar`: a 32px outlined circle with two initials on `--color-accent-alt`; `.ds-avatar--2` and `.ds-avatar--3` use `--color-fill-2` and `--color-fill-3`. For people in lists, cards and the top bar.\n- `.ds-main`, `.ds-screen`: the working area and its stack of blocks. `.ds-split` is a main column plus the 304px side column; `.ds-split--wide` is two columns 2:1 of equal height. `.ds-stack` stacks blocks 20px apart, `.ds-row` puts two things at the ends of one line, `.ds-label` is a 24px heading over a block without a title strip, `.ds-note` a muted small line.\n- `.ds-hero`: the welcome card of the overview, on `--color-fill-1` with the largest radius and `--shadow-dialog`: `.ds-hero__text` (a plain badge, `.ds-hero__title` at display size and at most 18ch, `.ds-hero__lead`, `.ds-hero__actions` with one primary and one secondary large button) beside a `.ds-player`. One per application, on the overview only.\n- `.ds-player`: a white card for one recording: a `.ds-row` with a badge and a note, `.ds-player__title`, a `.ds-wave` (24 empty `.ds-wave__bar` spans drawn in `currentColor` on `--color-surface-alt`) and a row with a small button and a link. Use it for one highlighted item, not for lists.\n- `.ds-page-header`: the head of an inner screen: a block with `.ds-page-header__title` and one `.ds-page-header__lead` line on the left, `.ds-page-header__actions` on the right. It follows the breadcrumb and has no fill and no rule.\n- `.ds-stat`: the row of summary figures, four `.ds-stat__card` in a grid. Each card is outlined, shadowed and filled by `.ds-stat__card--1` to `--4` (white without a modifier) and holds a bold `.ds-stat__label`, a 34px `.ds-stat__value` and a `.ds-stat__note` line of comparison.\n- `.ds-chart`: a bar chart for up to twelve values: `.ds-chart__col` items, each a `.ds-chart__bar` over its label. The bar's height is set by `.ds-chart__bar--30`, `--45`, `--60`, `--75`, `--90` or `--100` (percent of `--size-chart`); `is-current` on a column turns its bar yellow, shadowed and its label bold. Put it in a panel body.\n- `.ds-meter`: an outlined pill track with a `.ds-meter__fill` whose width is `.ds-meter__fill--20`, `--35`, `--62`, `--80` or `--95`. `.ds-rank` is a list of `.ds-rank__item`, each a `.ds-rank__head` (a title and a `.ds-rank__num`) over a meter.\n- `.ds-grid`: the board, four columns. Each `.ds-grid__cell` is an outlined, shadowed column on `--color-canvas`: a `.ds-grid__head` (filled by `.ds-grid__cell--1` to `--4`, holding `.ds-grid__title` and a plain count badge) over a thick rule, then `.ds-grid__body` with a stack of `.ds-card`. An empty column holds a `.ds-empty` instead.\n- `.ds-card`: a task card: white, outlined, on `--shadow-control`, with `.ds-card__title`, one `.ds-card__text` line and a `.ds-card__foot` holding a status badge and an avatar.\n- `.ds-prose`: long text: h1, h2, h3, p, ul, ol, strong, inline code (outlined, on `--color-surface-alt`) and links inside it are styled. On a handbook page it sits in a `.ds-sheet`, a white card with the largest radius.\n- `.ds-link`: any link in content: `--color-link`, medium weight, underlined. `.ds-link--quiet` removes the underline for titles, breadcrumbs and row links. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-links` stacks several in a column.\n- `.ds-button`: the primary button, 40px tall, outlined, on `--shadow-control`. `.ds-button--secondary` is white. `.ds-button--danger` is the destructive action (delete a show): flat `--color-danger` with `--color-text`; use it once per view, at the end of a form's button row or as the confirming button of a dialog. `.ds-button--large` (48px, 18px text) for the hero, `.ds-button--small` (32px, 13px text) for the top bar, cards and panels. `is-hover` sinks it 2px toward its shadow, `is-active` 4px with the pressed shadow, `is-disabled` is flat grey, `is-focus` adds the focus ring 2px away. `.ds-buttons` is a row of them.\n- `.ds-badge`: a small bold label in an outlined pill, on the accent by default. `.ds-badge--alt` yellow (new), `.ds-badge--plain` white (counts, neutral states). Status labels, in table rows and on task cards: `.ds-badge--success` (published), `.ds-badge--warning` (in review), `.ds-badge--danger` (late, taken down), all with `--color-text`. No shadow. `.ds-badges` is a wrapping row of them.\n- `.ds-form`: stacked fields 16px apart; `.ds-form__row` puts two fields side by side. A `.ds-form__field` is a bold 13px `.ds-form__label` above a `.ds-form__control` (input, select; `.ds-form__control--area` for a textarea), then `.ds-form__hint` or `.ds-form__error`. Controls have the outline and no shadow at rest; `is-focus` adds `--shadow-control` and the focus ring, `is-invalid` turns the border to `--color-danger` and puts a red shadow straight under the field, `is-disabled` greys it. `.ds-form__check` wraps a `.ds-form__checkbox` and its text. `.ds-form__foot` is the button row over a rule.\n- `.ds-table`: one outlined, shadowed box. The head row is on `--color-surface-strong` with bold 13px text and closed by a `--border-width-strong` rule; rows are divided by 2px rules; `is-current` on a row makes it pale and bold. `.ds-table__title` is the bold cell that names the row, `.ds-table__num` right-aligns numbers, and a cell with `.ds-table__extra` is dropped below 600px. A status column holds one badge per row.\n- `.ds-list`: one outlined, shadowed box of `.ds-list__item` rows divided by rules, each with an optional avatar, a `.ds-list__main` block (bold `.ds-list__title`, a `.ds-list__text` line) and a muted `.ds-list__meta` on the right.\n- `.ds-panel`: an outlined, shadowed box with a `.ds-panel__title` strip on `--color-surface-strong` over a rule (it may end with a plain badge) and a `.ds-panel__body`. `.ds-panel--plain` puts the strip on `--fill-bar` with `--color-bar-text`, for side columns.\n- `.ds-tabs`: a row of `.ds-tabs__tab` blocks with rounded top corners standing on a `--border-width-strong` rule; the current one (`is-current`) is on the accent and bold, `is-hover` is pale. Use for two to five views of one list; it is the first thing in the main column, directly over the table.\n- `.ds-sidebar`: an outlined, shadowed white block in the side column: a `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__item` rows divided by faint rules, each a link or a name with a badge at the right. It may hold a `.ds-links` column instead.\n- `.ds-notice`: a one-line message in an outlined box on `--shadow-control`, with a bold `.ds-notice__title` and `.ds-notice__text`, on `--color-notice`. `.ds-notice--error` is on `--color-danger-surface` with `--color-text`.\n- `.ds-pagination`: a row of 32px outlined squares (`.ds-pagination__link`) on `--shadow-control-hover`; the current page (`is-current`) is on the accent, `is-disabled` is grey and flat, `is-hover` sinks into its shadow. It shares a `.ds-row` with a count.\n- `.ds-breadcrumb`: a 13px trail of `.ds-breadcrumb__item` separated by a muted slash; the last has `is-current` and is bold. It is the first line of every inner screen.\n- `.ds-dialog`: a 460px outlined box on `--shadow-dialog`, with a `.ds-dialog__bar` on `--color-surface-strong` (holding `.ds-dialog__title` and a square `.ds-dialog__close`), a `.ds-dialog__body`, and a `.ds-dialog__actions` strip on `--color-canvas` over a rule with the buttons right-aligned. In the page flow it sits on a `.ds-overlay` block, an outlined area filled with `--color-overlay`.\n- `.ds-empty`: an outlined box on `--color-surface-alt`, centred: `.ds-empty__title`, `.ds-empty__text` and one small button. It has no shadow, so it can stand inside a board column as well as in a split.\n- `.ds-footer`: one inverse strip under the screen, closed above by a thick rule: `.ds-footer__brand`, a `.ds-footer__list` of `.ds-footer__link` in a line and `.ds-footer__legal` at the right.\n- `.ds-menu`: a chunky drop-down, a `<details>` whose `<summary>` is the `.ds-menu__trigger` (a small secondary button that ends in a plus sign). `.ds-menu__list` is an outlined, shadowed box of `.ds-menu__item` rows divided by rules, each a `.ds-menu__link`. Use it for a short list of pages under one button.\n- `.ds-progress`: how far something is: a `.ds-progress__label` line (what, and the figures) over a thick outlined `.ds-progress__track` holding a `.ds-progress__bar` (50% wide; `--25` and `--70` set other widths).\n- `.ds-switch`: an on and off control: a `<label>` holding a hidden `.ds-switch__input` checkbox, the `.ds-switch__track` and the text. On, the track is filled with the accent and takes a small hard shadow. `.ds-switch-row` puts a `.ds-tooltip` at the end of its line. Use it for a setting that applies at once.\n- `.ds-tooltip`: a hint like a sticker. `.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). One or two lines of text.\n- `.ds-accordion`: questions that open and close, one outlined, shadowed box of `<details class=\"ds-accordion__item\">` divided by rules. `.ds-accordion__head` is the `<summary>` with a square plus sign; open, it becomes a `--color-surface-strong` strip with a minus sign over `.ds-accordion__body`. Use it for frequently asked questions.\n- `.ds-follow`: on a block that comes after another in a column that has no gap of its own; it adds the space above.\n\n## Never\n\n- `row-gap <= 16px`: table and list rows touch and are divided by rules; rail links sit 8px apart and ranking rows 16px.\n- `palette-colours <= 14`: black, white, pink, two yellows, teal, periwinkle, two reds and the greys.\n- `font-weight <= 500`: nothing is bold; 500 is the strongest weight.\n- `font-weight >= 400`: no light weights.\n- `font-size <= 60px`: the hero title is the largest text.\n- `font-size >= 12px`: badge and footer labels are the smallest text.\n- `font-families <= 2`: one sans and a monospace for code.\n- `line-height <= 1.55`: body text is set at 1.55.\n- `letter-spacing = 0px`: nothing is tracked.\n- `uppercase-text <= 5%`: only 12px badges and footer labels are uppercase.\n- `underlined-links <= 20%`: only links in running text are underlined.\n- `box-shadow-blur <= 0px`: the outlines are thin but every shadow is still a hard offset block.\n- `border-width >= 1px`: every box keeps its navy outline.\n- `border-width <= 2px`: outlines are 1px, 2px under the navigation; nothing heavier.\n- `border-radius <= 24px`: 14px on controls, 18px on boxes, 24px on the largest; badges are pills.\n- `text-shadow = none`: no text shadow.\n- `gradient-fills <= 0%`: every fill is flat, including the page.\n- `animation = none`: nothing moves on its own.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. Anything new on a screen is a card on the page fill: a `--border-width` `--color-border` outline, a `--radius-panel` corner (`--radius-page` for the largest blocks) and the `--shadow-panel` hard shadow; things inside a card (task cards, notices, the empty state) get the outline and at most `--shadow-control`, so deep shadows never stack. Anything clickable that is a box sinks `--space-nudge` on hover and `--space-press` when pressed, straight down. Colour a block with one flat `--color-fill-*` or surface token and put `--color-text` on it; never tint, fade or blur. Close a group of tabs, a table head or a column head with the `--border-width-strong` rule, and divide rows with the ordinary one. A new figure is another `.ds-stat__card`, a new share a `.ds-meter`, a new series a `.ds-chart`; do not draw charts with gradients. A new screen keeps the rail and the top bar, starts with the breadcrumb and the page header and stacks its blocks `--space-6` apart. 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-rail: 248px;\n  --size-content: 1180px;\n  --size-side: 304px;\n  --size-measure: 620px;\n  --size-topbar: 64px;\n  --size-search: 300px;\n  --size-control: 40px;\n  --size-control-large: 48px;\n  --size-control-small: 32px;\n  --size-logo: 32px;\n  --size-icon: 20px;\n  --size-avatar: 32px;\n  --size-check: 20px;\n  --size-menu: 240px;\n  --size-tip: 220px;\n  --size-switch: 44px;\n  --size-bar: 16px;\n  --size-chart: 184px;\n  --size-wave: 64px;\n  --size-player: 340px;\n  --size-meter: 14px;\n  --size-dialog: 460px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 20px;\n  --space-6: 24px;\n  --space-7: 32px;\n  --space-8: 48px;\n  --space-gutter: 32px;\n  --space-nudge: 2px;\n  --space-press: 4px;\n}\n\n/* shell: a rail on the left, a top bar and the screen on the right */\n.ds-page {\n  display: grid;\n  grid-template-columns: var(--size-rail) minmax(0, 1fr);\n  grid-template-rows: auto 1fr auto;\n  grid-template-areas:\n    \"nav top\"\n    \"nav main\"\n    \"nav foot\";\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 rail. Brand, a column of links with icons, a storage card */\n.ds-nav {\n  grid-area: nav;\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-6);\n  min-width: 0;\n  padding: var(--space-5) var(--space-4) var(--space-6);\n  color: var(--color-bar-text);\n  background: var(--fill-bar);\n  border-right: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: 0 var(--space-2);\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-nudge);\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}\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-large);\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-bar-text);\n}\n.ds-nav__label {\n  margin: 0 0 var(--space-2);\n  padding: 0 var(--space-3);\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.4;\n  text-transform: uppercase;\n  color: var(--color-bar-text);\n}\n.ds-nav__links {\n  display: grid;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-height: var(--size-control);\n  padding: 0 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.2;\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  color: var(--color-bar-text);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  transition: var(--transition);\n}\n.ds-nav__icon {\n  display: block;\n  flex: none;\n  width: var(--size-icon);\n  height: var(--size-icon);\n}\n.ds-nav__count {\n  margin-left: auto;\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  border-color: var(--color-border);\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(#episodes:target) .ds-nav__link[href=\"#episodes\"],\n.ds-page:has(#board:target) .ds-nav__link[href=\"#board\"],\n.ds-page:has(#settings:target) .ds-nav__link[href=\"#settings\"],\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  border-color: var(--color-border);\n  box-shadow: var(--shadow-control);\n}\n.ds-nav__link:focus-visible,\n.ds-nav__link.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-nudge);\n}\n.ds-nav__card {\n  display: grid;\n  gap: var(--space-3);\n  padding: var(--space-4);\n  font-size: var(--text-small);\n  line-height: 1.4;\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}\n.ds-nav__card-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}\n.ds-nav__card-text {\n  margin: 0;\n}\n\n/* top bar: a filled strip over the screen with search and the account */\n.ds-topbar {\n  grid-area: top;\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  min-height: var(--size-topbar);\n  padding: var(--space-3) var(--space-gutter);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  color: var(--color-bar-alt-text);\n  background: var(--fill-bar-alt);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-topbar__search {\n  flex: 0 1 var(--size-search);\n  min-width: 0;\n}\n.ds-topbar__note {\n  margin: 0 auto 0 0;\n  line-height: 1.3;\n}\n.ds-topbar__user {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  font-weight: var(--weight-bold);\n  line-height: 1.2;\n}\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.9);\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: 50%;\n}\n.ds-avatar--2 {\n  background: var(--color-fill-2);\n}\n.ds-avatar--3 {\n  background: var(--color-fill-3);\n}\n\n/* screen: the working area of a view */\n.ds-main {\n  grid-area: main;\n  min-width: 0;\n  padding: var(--space-7) var(--space-gutter) var(--space-8);\n}\n.ds-screen {\n  display: grid;\n  gap: var(--space-6);\n  align-content: start;\n  max-width: var(--size-content);\n  margin: 0 auto;\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--wide {\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n  align-items: stretch;\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-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 welcome card of the overview, text beside a player card */\n.ds-hero {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-player);\n  gap: var(--space-7);\n  align-items: center;\n  padding: var(--space-7);\n  color: var(--color-text);\n  background: var(--color-fill-1);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-hero__text {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-hero__title {\n  max-width: 18ch;\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n  color: var(--color-text);\n}\n.ds-hero__lead {\n  max-width: var(--size-measure);\n  margin: 0;\n  font-size: var(--text-large);\n  font-weight: var(--weight-ui);\n  line-height: 1.4;\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-4);\n  margin-top: var(--space-3);\n}\n.ds-player {\n  display: grid;\n  gap: var(--space-3);\n  min-width: 0;\n  padding: var(--space-4);\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}\n.ds-player__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-heading-alt);\n}\n.ds-wave {\n  display: flex;\n  align-items: center;\n  gap: var(--space-1);\n  height: var(--size-wave);\n  padding: var(--space-2);\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-control);\n}\n.ds-wave__bar {\n  flex: 1;\n  height: 45%;\n  background: currentColor;\n  border-radius: var(--radius-pill);\n}\n.ds-wave__bar:nth-child(3n + 2) {\n  height: 80%;\n}\n.ds-wave__bar:nth-child(4n) {\n  height: 60%;\n}\n.ds-wave__bar:nth-child(5n) {\n  height: 100%;\n}\n.ds-wave__bar:nth-child(7n) {\n  height: 25%;\n}\n\n/* page header: the head of an inner screen */\n.ds-page-header {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-5);\n  color: var(--color-text);\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  color: var(--color-heading);\n}\n.ds-page-header__lead {\n  max-width: var(--size-measure);\n  margin: var(--space-2) 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  align-items: center;\n  gap: var(--space-4);\n}\n\n/* stats: a row of chunky filled cards */\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-6);\n  margin: 0;\n}\n.ds-stat__card {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  min-width: 0;\n  padding: var(--space-4) var(--space-5) var(--space-5);\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.ds-stat__card--1 {\n  background: var(--color-fill-1);\n}\n.ds-stat__card--2 {\n  background: var(--color-fill-2);\n}\n.ds-stat__card--3 {\n  background: var(--color-fill-3);\n}\n.ds-stat__card--4 {\n  background: var(--color-fill-4);\n}\n.ds-stat__label {\n  margin: 0;\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-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  color: var(--color-text);\n}\n.ds-stat__note {\n  margin: var(--space-2) 0 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n}\n\n/* chart: outlined bars standing on a rule */\n.ds-chart {\n  display: grid;\n  grid-auto-flow: column;\n  grid-auto-columns: minmax(0, 1fr);\n  gap: var(--space-3);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-chart__col {\n  display: grid;\n  grid-template-rows: var(--size-chart) auto;\n  gap: var(--space-2);\n  min-width: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n  text-align: center;\n}\n.ds-chart__bar {\n  align-self: end;\n  height: 50%;\n  background: var(--fill-accent);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\n}\n.ds-chart__bar--30 {\n  height: 30%;\n}\n.ds-chart__bar--45 {\n  height: 45%;\n}\n.ds-chart__bar--60 {\n  height: 60%;\n}\n.ds-chart__bar--75 {\n  height: 75%;\n}\n.ds-chart__bar--90 {\n  height: 90%;\n}\n.ds-chart__bar--100 {\n  height: 100%;\n}\n.ds-chart__col.is-current .ds-chart__bar {\n  background: var(--color-accent-alt);\n  box-shadow: var(--shadow-control);\n}\n.ds-chart__col.is-current {\n  font-weight: var(--weight-bold);\n}\n\n/* meter: a filled track for a share of something */\n.ds-meter {\n  display: block;\n  height: var(--size-meter);\n  background: var(--color-canvas);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  overflow: hidden;\n}\n.ds-meter__fill {\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-meter__fill--20 {\n  width: 20%;\n}\n.ds-meter__fill--35 {\n  width: 35%;\n}\n.ds-meter__fill--62 {\n  width: 62%;\n}\n.ds-meter__fill--80 {\n  width: 80%;\n}\n.ds-meter__fill--95 {\n  width: 95%;\n}\n.ds-rank {\n  display: grid;\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-rank__item {\n  display: grid;\n  gap: var(--space-2);\n}\n.ds-rank__head {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n  font-weight: var(--weight-ui);\n  line-height: 1.3;\n}\n.ds-rank__num {\n  flex: none;\n  font-weight: var(--weight-bold);\n  font-variant-numeric: tabular-nums;\n}\n\n/* grid: the board. Columns with a filled head and a stack of task cards */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5);\n  align-items: start;\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(--color-canvas);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-grid__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n  color: var(--color-text);\n  background: var(--color-surface-alt);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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__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-grid__body {\n  display: grid;\n  gap: var(--space-3);\n  align-content: start;\n  padding: var(--space-3);\n}\n.ds-card {\n  display: grid;\n  gap: var(--space-2);\n  padding: var(--space-3);\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}\n.ds-card__title {\n  margin: 0;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-card__text {\n  margin: 0;\n  font-size: var(--text-small);\n  line-height: 1.4;\n}\n.ds-card__foot {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  margin-top: var(--space-1);\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  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-6);\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  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\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-7);\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(--border-width);\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-accent-text);\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: grid;\n  gap: var(--space-2);\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}\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.9);\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/* 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: var(--radius-control);\n  transition: var(--transition);\n}\n.ds-form__control--area {\n  min-height: calc(var(--size-control) * 2.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);\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  margin-top: var(--space-2);\n  padding-top: var(--space-4);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n\n/* table: one outlined box; a thick rule under the head, thinner ones between rows */\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);\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-text);\n  background: var(--color-surface-strong);\n  border-bottom-width: var(--border-width-strong);\n  border-bottom-color: var(--color-border-strong);\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}\n.ds-table__title {\n  font-weight: var(--weight-bold);\n}\n\n/* list: one outlined box of ruled rows */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\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-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n}\n.ds-list__item + .ds-list__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border);\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.ds-table__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: outlined box with a filled title strip */\n.ds-panel {\n  display: flex;\n  flex-direction: column;\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  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\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  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  flex: 1;\n  padding: var(--space-4);\n}\n.ds-panel__body p {\n  margin: 0 0 var(--space-3);\n}\n.ds-panel__body p:last-child {\n  margin-bottom: 0;\n}\n.ds-panel--plain .ds-panel__title {\n  color: var(--color-bar-text);\n  background: var(--fill-bar);\n}\n\n/* tabs: blocks standing on a thick rule */\n.ds-tabs {\n  display: flex;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0 var(--space-3);\n  list-style: none;\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n}\n.ds-tabs__tab {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  min-height: var(--size-control);\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  background: var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-bottom: 0;\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\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: var(--space-nudge);\n}\n\n/* sidebar: an outlined block of links with counts */\n.ds-sidebar {\n  padding: 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: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  color: var(--color-heading-alt);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n\n/* notice */\n.ds-notice {\n  display: flex;\n  align-items: baseline;\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: var(--radius-panel);\n  box-shadow: var(--shadow-control);\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\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  margin-right: var(--space-2);\n  color: var(--color-text-muted);\n}\n.ds-breadcrumb__item.is-current {\n  font-weight: var(--weight-bold);\n}\n\n/* dialog: an outlined box with a title strip, on a filled backdrop block */\n.ds-overlay {\n  padding: var(--space-8) 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  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  background: var(--color-canvas);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\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}\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/* footer: one inverted strip under the screen */\n.ds-footer {\n  grid-area: foot;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2) var(--space-6);\n  padding: var(--space-4) var(--space-gutter);\n  font-size: var(--text-small);\n  line-height: 1.4;\n  color: var(--color-inverse-text);\n  background: var(--fill-inverse);\n  border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\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;\n}\n.ds-footer__list {\n  display: flex;\n  flex: 1;\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-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration);\n  text-underline-offset: var(--space-1);\n}\n.ds-footer__legal {\n  margin: 0;\n}\n\n/* menu: a chunky drop-down, a details element whose summary is the trigger */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__trigger {\n  list-style: none;\n  cursor: pointer;\n}\n.ds-menu__trigger::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__trigger::after {\n  content: \"+\";\n  margin-left: var(--space-2);\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);\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/* follow: a block that comes after another in a plain column */\n.ds-follow {\n  margin-top: var(--space-5);\n}\n/* progress: a thick 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  justify-content: space-between;\n  gap: var(--space-3);\n  margin: 0;\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\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/* switch: an on and off control drawn over a checkbox */\n.ds-switch-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-switch {\n  position: relative;\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/* tooltip: a sticker of 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  box-sizing: content-box;\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/* accordion: questions that open and close, one outlined box, a big plus sign */\n.ds-accordion {\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-accordion__item + .ds-accordion__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border);\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-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  list-style: none;\n  cursor: pointer;\n  color: var(--color-heading-alt);\n}\n.ds-accordion__head::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__head::after {\n  content: \"\";\n  display: block;\n  flex: none;\n  width: var(--size-check);\n  height: var(--size-check);\n  color: var(--color-button-secondary-text);\n  background: linear-gradient(currentColor, currentColor) center / calc(var(--space-1) * 2.5) calc(var(--space-1) / 2) no-repeat,\n    linear-gradient(currentColor, currentColor) center / calc(var(--space-1) / 2) calc(var(--space-1) * 2.5) no-repeat,\n    var(--fill-button-secondary);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-sizing: content-box;\n}\n.ds-accordion__head:hover,\n.ds-accordion__head.is-hover {\n  color: var(--color-text);\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-heading-alt);\n  background: var(--color-surface-strong);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__item[open] .ds-accordion__head::after {\n  background: linear-gradient(currentColor, currentColor) center / calc(var(--space-1) * 2.5) calc(var(--space-1) / 2) no-repeat,\n    var(--fill-button-secondary);\n}\n.ds-accordion__body {\n  padding: var(--space-4);\n}\n.ds-accordion__body p {\n  margin: 0;\n}\n\n@media (max-width: 1100px) {\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-stat {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-hero {\n    grid-template-columns: minmax(0, 1fr);\n  }\n}\n\n@media (max-width: 900px) {\n  .ds-page {\n    grid-template-columns: minmax(0, 1fr);\n    grid-template-rows: auto;\n    grid-template-areas:\n      \"nav\"\n      \"top\"\n      \"main\"\n      \"foot\";\n  }\n  .ds-nav {\n    gap: var(--space-3);\n    padding: var(--space-3) var(--space-4);\n    border-right: 0;\n    border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  }\n  .ds-nav__label,\n  .ds-nav__card,\n  .ds-nav__count {\n    display: none;\n  }\n  .ds-nav__links {\n    display: flex;\n    flex-wrap: wrap;\n    gap: var(--space-1);\n  }\n  .ds-nav__link {\n    min-height: var(--size-control-small);\n    padding: 0 var(--space-2);\n    gap: var(--space-2);\n  }\n  .ds-topbar {\n    padding: var(--space-2) var(--space-4);\n  }\n  .ds-main {\n    padding: var(--space-6) var(--space-4) var(--space-7);\n  }\n  .ds-split,\n  .ds-split--wide {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-footer {\n    padding: var(--space-4);\n  }\n}\n\n@media (max-width: 600px) {\n  .ds-nav__icon,\n  .ds-topbar__note,\n  .ds-topbar__name,\n  .ds-table .ds-table__extra {\n    display: none;\n  }\n  .ds-nav__link {\n    font-size: var(--text-small);\n  }\n  .ds-topbar__search {\n    flex: 1 1 auto;\n  }\n  .ds-hero {\n    padding: var(--space-5);\n    gap: var(--space-5);\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-hero__actions,\n  .ds-hero__actions .ds-button {\n    width: 100%;\n  }\n  .ds-page-header__title,\n  .ds-prose h1 {\n    font-size: calc(var(--text-h1) * 0.85);\n  }\n  .ds-page-header__actions .ds-button {\n    flex: 1 1 auto;\n  }\n  .ds-stat {\n    gap: var(--space-4);\n  }\n  .ds-stat__card {\n    padding: var(--space-3) var(--space-4) var(--space-4);\n  }\n  .ds-stat__value {\n    font-size: calc(var(--text-h1) * 0.8);\n  }\n  .ds-grid,\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-chart {\n    gap: var(--space-2);\n  }\n  .ds-sheet {\n    padding: var(--space-5) var(--space-4);\n  }\n  .ds-tabs {\n    padding: 0;\n    overflow-x: auto;\n  }\n  .ds-tabs__tab {\n    padding: 0 var(--space-3);\n  }\n  .ds-table {\n    font-size: var(--text-small);\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-2);\n  }\n  .ds-notice {\n    flex-direction: column;\n    gap: var(--space-1);\n  }\n  .ds-list__item {\n    flex-wrap: wrap;\n  }\n  .ds-overlay {\n    padding: var(--space-6) var(--space-3);\n  }\n}\n/* phone: the bar keeps the brand; the five views are a dock of equal cells at the foot of the window */\n@media (max-width: 600px) {\n  .ds-page {\n    padding-bottom: calc(var(--size-control) + var(--space-6));\n  }\n  .ds-nav .ds-nav__links {\n    position: fixed;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    z-index: 6;\n    display: grid;\n    grid-template-columns: repeat(5, minmax(0, 1fr));\n    gap: 0;\n    color: var(--color-bar-text);\n    background: var(--fill-bar);\n    border-top: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  }\n  .ds-nav__links li {\n    display: flex;\n    min-width: 0;\n  }\n  .ds-nav__links li + li {\n    border-left: var(--border-width) var(--border-style) var(--color-border);\n  }\n  .ds-nav__link {\n    flex: 1;\n    flex-direction: column;\n    justify-content: center;\n    gap: var(--space-1);\n    min-width: 0;\n    min-height: calc(var(--size-control) + var(--space-4));\n    padding: var(--space-1);\n    text-align: center;\n    overflow-wrap: anywhere;\n    border: 0;\n    border-radius: 0;\n  }\n  .ds-nav__icon {\n    display: block;\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(#episodes:target) .ds-nav__link[href=\"#episodes\"],\n  .ds-page:has(#board:target) .ds-nav__link[href=\"#board\"],\n  .ds-page:has(#settings:target) .ds-nav__link[href=\"#settings\"],\n  .ds-page:has(#guide:target) .ds-nav__link[href=\"#guide\"] {\n    font-weight: var(--weight-ui);\n    box-shadow: none;\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 app specimen, dashboard layout</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  <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  <nav aria-label=\"Main\">\n    <p class=\"ds-nav__label\">Studio</p>\n    <ul class=\"ds-nav__links\">\n      <li><a class=\"ds-nav__link\" href=\"#home\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"5\"/><rect x=\"13\" y=\"12\" width=\"8\" height=\"9\"/><rect x=\"3\" y=\"15\" width=\"8\" height=\"6\"/></svg>Overview</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#episodes\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" aria-hidden=\"true\"><path d=\"M8 6h13M8 12h13M8 18h13\"/><path d=\"M3 5v2M3 11v2M3 17v2\"/></svg>Episodes <span class=\"ds-badge ds-badge--plain ds-nav__count\">48</span></a></li>\n      <li><a class=\"ds-nav__link\" href=\"#board\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"5\" height=\"18\"/><rect x=\"10\" y=\"3\" width=\"5\" height=\"11\"/><rect x=\"17\" y=\"3\" width=\"4\" height=\"15\"/></svg>Board <span class=\"ds-badge ds-badge--plain ds-nav__count\">9</span></a></li>\n      <li><a class=\"ds-nav__link\" href=\"#settings\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" aria-hidden=\"true\"><path d=\"M3 7h10M17 7h4M3 17h4M11 17h10\"/><circle cx=\"15\" cy=\"7\" r=\"2.4\"/><circle cx=\"9\" cy=\"17\" r=\"2.4\"/></svg>Show settings</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#guide\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" aria-hidden=\"true\"><path d=\"M5 3h11l3 3v15H5z\"/><path d=\"M9 10h6M9 14h6\"/></svg>Handbook</a></li>\n    </ul>\n  </nav>\n  <div class=\"ds-nav__card\">\n    <p class=\"ds-nav__card-title\">Storage</p>\n    <span class=\"ds-meter\"><span class=\"ds-meter__fill ds-meter__fill--62\"></span></span>\n    <p class=\"ds-nav__card-text\">6.2 of 10 GB of audio used. Old drafts count too.</p>\n    <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#settings\">Make room</a>\n  </div>\n</header>\n\n<div class=\"ds-topbar\">\n  <input class=\"ds-form__control ds-topbar__search\" type=\"search\" placeholder=\"Search episodes and guests\" aria-label=\"Search\">\n  <p class=\"ds-topbar__note\">Week 14, three recordings booked</p>\n  <a class=\"ds-button ds-button--small\" href=\"#board\">New episode</a>\n  <span class=\"ds-topbar__user\"><span class=\"ds-avatar\">MK</span><span class=\"ds-topbar__name\">Mira K.</span></span>\n</div>\n\n<main class=\"ds-main\">\n<section class=\"ds-view ds-view--home\" id=\"home\">\n<div class=\"ds-screen\">\n  <section class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-hero__text\">\n      <span class=\"ds-badge ds-badge--plain\">Tuesday morning</span>\n      <h1 class=\"ds-hero__title\">Three episodes are waiting for you.</h1>\n      <p class=\"ds-hero__lead\">chronoskin keeps the recordings, the edit notes and the release dates of your show in one place. Two cuts need your ears today.</p>\n      <div class=\"ds-hero__actions\">\n        <a class=\"ds-button ds-button--large\" href=\"#board\">Open the board &rarr;</a>\n        <a class=\"ds-button ds-button--secondary ds-button--large\" href=\"#episodes\">All episodes</a>\n      </div>\n    </div>\n    <div class=\"ds-player\">\n      <div class=\"ds-row\">\n        <span class=\"ds-badge ds-badge--alt\">Latest cut</span>\n        <span class=\"ds-note\">41 min</span>\n      </div>\n      <h2 class=\"ds-player__title\">48. The ferry that never left</h2>\n      <div class=\"ds-wave\" aria-hidden=\"true\">\n        <span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span><span class=\"ds-wave__bar\"></span>\n      </div>\n      <div class=\"ds-row\">\n        <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#episodes\">Listen to the cut</a>\n        <a class=\"ds-link\" href=\"#board\">Edit notes</a>\n      </div>\n    </div>\n  </section>\n\n  <dl class=\"ds-stat\" data-component=\"stats\">\n    <div class=\"ds-stat__card ds-stat__card--1\">\n      <dt class=\"ds-stat__label\">Plays this week</dt>\n      <dd class=\"ds-stat__value\">48,210</dd>\n      <dd class=\"ds-stat__note\">4,100 more than last week</dd>\n    </div>\n    <div class=\"ds-stat__card ds-stat__card--2\">\n      <dt class=\"ds-stat__label\">Followers</dt>\n      <dd class=\"ds-stat__value\">9,634</dd>\n      <dd class=\"ds-stat__note\">212 new since Monday</dd>\n    </div>\n    <div class=\"ds-stat__card ds-stat__card--3\">\n      <dt class=\"ds-stat__label\">Listened to the end</dt>\n      <dd class=\"ds-stat__value\">71%</dd>\n      <dd class=\"ds-stat__note\">Best: episode 44, 83%</dd>\n    </div>\n    <div class=\"ds-stat__card ds-stat__card--4\">\n      <dt class=\"ds-stat__label\">Episodes in the works</dt>\n      <dd class=\"ds-stat__value\">9</dd>\n      <dd class=\"ds-stat__note\">Two are past their date</dd>\n    </div>\n  </dl>\n\n  <div class=\"ds-split ds-split--wide\">\n    <section class=\"ds-panel\" data-component=\"panel\">\n      <h2 class=\"ds-panel__title\">Plays, last seven days <span class=\"ds-badge ds-badge--plain\">All shows</span></h2>\n      <div class=\"ds-panel__body\">\n        <ul class=\"ds-chart\" aria-label=\"Plays per day\">\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--45\"></span>Wed</li>\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--60\"></span>Thu</li>\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--100\"></span>Fri</li>\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--75\"></span>Sat</li>\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--30\"></span>Sun</li>\n          <li class=\"ds-chart__col\"><span class=\"ds-chart__bar ds-chart__bar--60\"></span>Mon</li>\n          <li class=\"ds-chart__col is-current\"><span class=\"ds-chart__bar ds-chart__bar--90\"></span>Today</li>\n        </ul>\n      </div>\n    </section>\n    <section class=\"ds-panel ds-panel--plain\">\n      <h2 class=\"ds-panel__title\">Most played this month</h2>\n      <div class=\"ds-panel__body\">\n        <ol class=\"ds-rank\">\n          <li class=\"ds-rank__item\">\n            <div class=\"ds-rank__head\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">44. Salt in the tea</a><span class=\"ds-rank__num\">12,480</span></div>\n            <span class=\"ds-meter\"><span class=\"ds-meter__fill ds-meter__fill--95\"></span></span>\n          </li>\n          <li class=\"ds-rank__item\">\n            <div class=\"ds-rank__head\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">47. A map with no north</a><span class=\"ds-rank__num\">10,912</span></div>\n            <span class=\"ds-meter\"><span class=\"ds-meter__fill ds-meter__fill--80\"></span></span>\n          </li>\n          <li class=\"ds-rank__item\">\n            <div class=\"ds-rank__head\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">45. The night bus choir</a><span class=\"ds-rank__num\">8,077</span></div>\n            <span class=\"ds-meter\"><span class=\"ds-meter__fill ds-meter__fill--62\"></span></span>\n          </li>\n          <li class=\"ds-rank__item\">\n            <div class=\"ds-rank__head\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">46. Borrowed umbrellas</a><span class=\"ds-rank__num\">4,530</span></div>\n            <span class=\"ds-meter\"><span class=\"ds-meter__fill ds-meter__fill--35\"></span></span>\n          </li>\n        </ol>\n      </div>\n    </section>\n  </div>\n\n  <div class=\"ds-split ds-split--wide\">\n    <div class=\"ds-stack\">\n      <div class=\"ds-row\">\n        <h2 class=\"ds-label\">Since you were last here</h2>\n        <a class=\"ds-link\" href=\"#episodes\">See every episode</a>\n      </div>\n      <ul class=\"ds-list\" data-component=\"list\">\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar ds-avatar--2\">JO</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">Jonas uploaded the second cut of episode 48</a></h3>\n            <p class=\"ds-list__text\">Six minutes shorter, the intro music is back.</p>\n          </div>\n          <span class=\"ds-list__meta\">20 minutes ago</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar ds-avatar--3\">AL</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">Alba booked a guest for episode 51</a></h3>\n            <p class=\"ds-list__text\">Recording on Thursday at ten, in the small room.</p>\n          </div>\n          <span class=\"ds-list__meta\">Yesterday</span>\n        </li>\n        <li class=\"ds-list__item\">\n          <span class=\"ds-avatar\">MK</span>\n          <div class=\"ds-list__main\">\n            <h3 class=\"ds-list__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">You published episode 47</a></h3>\n            <p class=\"ds-list__text\">It reached 5,000 plays in its first two days.</p>\n          </div>\n          <span class=\"ds-list__meta\">Friday</span>\n        </li>\n      </ul>\n    </div>\n    <div class=\"ds-empty\">\n      <h3 class=\"ds-empty__title\">Nothing goes out this week</h3>\n      <p class=\"ds-empty__text\">Episode 48 has no release date yet. Pick one and it shows up here.</p>\n      <a class=\"ds-button ds-button--small\" href=\"#board\">Set a date</a>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"episodes\">\n<div class=\"ds-screen\">\n  <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\" aria-label=\"Breadcrumb\">\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Studio</a></li>\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Harbour Stories</a></li>\n    <li class=\"ds-breadcrumb__item is-current\" aria-current=\"page\">Episodes</li>\n  </ol>\n  <section class=\"ds-page-header\" data-component=\"page-header\">\n    <div>\n      <h1 class=\"ds-page-header__title\">Episodes</h1>\n      <p class=\"ds-page-header__lead\">Every episode of Harbour Stories, newest first.</p>\n    </div>\n    <div class=\"ds-page-header__actions\">\n      <a class=\"ds-button ds-button--secondary\" href=\"#episodes\">Export list</a>\n      <a class=\"ds-button\" href=\"#board\">New episode</a>\n    </div>\n  </section>\n  <div class=\"ds-split\">\n    <div class=\"ds-stack\">\n      <ul class=\"ds-tabs\" data-component=\"tabs\" role=\"tablist\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#episodes\" role=\"tab\" aria-selected=\"true\">All <span class=\"ds-badge ds-badge--plain\">48</span></a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#episodes\" role=\"tab\">Published</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#episodes\" role=\"tab\">Scheduled</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#board\" role=\"tab\">Drafts</a></li>\n      </ul>\n      <table class=\"ds-table\" data-component=\"table\">\n        <thead>\n          <tr><th>No.</th><th>Title</th><th>Status</th><th class=\"ds-table__extra\">Released</th><th class=\"ds-table__num ds-table__extra\">Length</th><th class=\"ds-table__num\">Plays</th></tr>\n        </thead>\n        <tbody>\n          <tr><td>49</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">The lighthouse keeper's radio</a></td><td><span class=\"ds-badge ds-badge--plain\">Draft</span></td><td class=\"ds-table__extra\">Not set</td><td class=\"ds-table__num ds-table__extra\">0:00</td><td class=\"ds-table__num\">0</td></tr>\n          <tr class=\"is-current\"><td>48</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#board\">The ferry that never left</a></td><td><span class=\"ds-badge ds-badge--warning\">In review</span></td><td class=\"ds-table__extra\">Not set</td><td class=\"ds-table__num ds-table__extra\">41:12</td><td class=\"ds-table__num\">0</td></tr>\n          <tr><td>47</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">A map with no north</a></td><td><span class=\"ds-badge ds-badge--success\">Published</span></td><td class=\"ds-table__extra\">4 April</td><td class=\"ds-table__num ds-table__extra\">38:40</td><td class=\"ds-table__num\">10,912</td></tr>\n          <tr><td>46</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Borrowed umbrellas</a></td><td><span class=\"ds-badge ds-badge--success\">Published</span></td><td class=\"ds-table__extra\">28 March</td><td class=\"ds-table__num ds-table__extra\">29:05</td><td class=\"ds-table__num\">4,530</td></tr>\n          <tr><td>45</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">The night bus choir</a></td><td><span class=\"ds-badge ds-badge--success\">Published</span></td><td class=\"ds-table__extra\">21 March</td><td class=\"ds-table__num ds-table__extra\">44:18</td><td class=\"ds-table__num\">8,077</td></tr>\n          <tr><td>44</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Salt in the tea</a></td><td><span class=\"ds-badge ds-badge--success\">Published</span></td><td class=\"ds-table__extra\">14 March</td><td class=\"ds-table__num ds-table__extra\">36:51</td><td class=\"ds-table__num\">12,480</td></tr>\n          <tr><td>43</td><td class=\"ds-table__title\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Two keys, one door</a></td><td><span class=\"ds-badge ds-badge--danger\">Taken down</span></td><td class=\"ds-table__extra\">7 March</td><td class=\"ds-table__num ds-table__extra\">33:27</td><td class=\"ds-table__num\">2,204</td></tr>\n        </tbody>\n      </table>\n      <div class=\"ds-row\">\n        <ul class=\"ds-pagination\" data-component=\"pagination\" aria-label=\"Pages\">\n          <li><a class=\"ds-pagination__link is-disabled\" href=\"#episodes\" aria-disabled=\"true\">&larr; Newer</a></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#episodes\" aria-current=\"page\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#episodes\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#episodes\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#episodes\">7</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#episodes\">Older &rarr;</a></li>\n        </ul>\n        <p class=\"ds-note\">Showing 1 to 7 of 48</p>\n      </div>\n    </div>\n    <div class=\"ds-stack\">\n      <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n        <h2 class=\"ds-sidebar__title\">Your shows</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Harbour Stories</a><span class=\"ds-badge ds-badge--plain\">48</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">The Short Walk</a><span class=\"ds-badge ds-badge--plain\">21</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Kitchen Table Maths</a><span class=\"ds-badge ds-badge--plain\">6</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#settings\">Show settings</a></li>\n        </ul>\n      </aside>\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">What the labels mean</h2>\n        <div class=\"ds-panel__body\">\n          <div class=\"ds-badges\" data-component=\"badge\">\n            <span class=\"ds-badge\">Recording</span>\n            <span class=\"ds-badge ds-badge--alt\">New</span>\n            <span class=\"ds-badge ds-badge--plain\">Draft</span>\n            <span class=\"ds-badge ds-badge--success\">Published</span>\n            <span class=\"ds-badge ds-badge--warning\">In review</span>\n            <span class=\"ds-badge ds-badge--danger\">Taken down</span>\n          </div>\n        </div>\n      </section>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"board\">\n<div class=\"ds-screen\">\n  <ol class=\"ds-breadcrumb\" aria-label=\"Breadcrumb\">\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Studio</a></li>\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Harbour Stories</a></li>\n    <li class=\"ds-breadcrumb__item is-current\" aria-current=\"page\">Board</li>\n  </ol>\n  <section class=\"ds-page-header\">\n    <div>\n      <h1 class=\"ds-page-header__title\">Production board</h1>\n      <p class=\"ds-page-header__lead\">Nine episodes between an idea and a release date.</p>\n    </div>\n    <div class=\"ds-page-header__actions\">\n      <a class=\"ds-button ds-button--secondary\" href=\"#episodes\">View as a list</a>\n      <a class=\"ds-button\" href=\"#board\">Add a card</a>\n    </div>\n  </section>\n  <ul class=\"ds-grid\" data-component=\"grid\">\n    <li class=\"ds-grid__cell ds-grid__cell--1\">\n      <div class=\"ds-grid__head\"><h2 class=\"ds-grid__title\">Ideas</h2><span class=\"ds-badge ds-badge--plain\">3</span></div>\n      <div class=\"ds-grid__body\">\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">52. The clock repair shop</h3>\n          <p class=\"ds-card__text\">Ask about the tower clock that runs backwards.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--alt\">New</span><span class=\"ds-avatar ds-avatar--3\">AL</span></div>\n        </article>\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">53. Letters from the pier</h3>\n          <p class=\"ds-card__text\">Needs a second voice. Maybe the postmaster.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--plain\">No date</span><span class=\"ds-avatar\">MK</span></div>\n        </article>\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">54. Winter swimmers</h3>\n          <p class=\"ds-card__text\">Record outside, bring the wind shield.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--plain\">No date</span><span class=\"ds-avatar ds-avatar--2\">JO</span></div>\n        </article>\n      </div>\n    </li>\n    <li class=\"ds-grid__cell ds-grid__cell--2\">\n      <div class=\"ds-grid__head\"><h2 class=\"ds-grid__title\">Recording</h2><span class=\"ds-badge ds-badge--plain\">2</span></div>\n      <div class=\"ds-grid__body\">\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">51. The bridge painter</h3>\n          <p class=\"ds-card__text\">Guest booked for Thursday at ten.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge\">Recording</span><span class=\"ds-avatar ds-avatar--3\">AL</span></div>\n        </article>\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">50. Fog signals</h3>\n          <p class=\"ds-card__text\">Second half still to record.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--danger\">Late</span><span class=\"ds-avatar\">MK</span></div>\n        </article>\n      </div>\n    </li>\n    <li class=\"ds-grid__cell ds-grid__cell--3\">\n      <div class=\"ds-grid__head\"><h2 class=\"ds-grid__title\">Editing</h2><span class=\"ds-badge ds-badge--plain\">4</span></div>\n      <div class=\"ds-grid__body\">\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">48. The ferry that never left</h3>\n          <p class=\"ds-card__text\">Second cut is up. Waiting for your ears.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--warning\">In review</span><span class=\"ds-avatar ds-avatar--2\">JO</span></div>\n        </article>\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">49. The lighthouse keeper's radio</h3>\n          <p class=\"ds-card__text\">Rough cut, 58 minutes. Aim for 40.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--plain\">Draft</span><span class=\"ds-avatar ds-avatar--2\">JO</span></div>\n        </article>\n        <article class=\"ds-card\">\n          <h3 class=\"ds-card__title\">Trailer for the spring season</h3>\n          <p class=\"ds-card__text\">Ninety seconds, three clips.</p>\n          <div class=\"ds-card__foot\"><span class=\"ds-badge ds-badge--danger\">Late</span><span class=\"ds-avatar\">MK</span></div>\n        </article>\n      </div>\n    </li>\n    <li class=\"ds-grid__cell ds-grid__cell--4\">\n      <div class=\"ds-grid__head\"><h2 class=\"ds-grid__title\">Scheduled</h2><span class=\"ds-badge ds-badge--plain\">0</span></div>\n      <div class=\"ds-grid__body\">\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <h3 class=\"ds-empty__title\">Nothing scheduled</h3>\n          <p class=\"ds-empty__text\">An episode lands here when it has a release date.</p>\n          <a class=\"ds-button ds-button--small\" href=\"#episodes\">Pick an episode</a>\n        </div>\n      </div>\n    </li>\n  </ul>\n  <div class=\"ds-notice\" role=\"status\">\n    <strong class=\"ds-notice__title\">Two cards are late</strong>\n    <p class=\"ds-notice__text\">Fog signals and the spring trailer are past the dates you set. Move the dates or move the cards.</p>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"settings\">\n<div class=\"ds-screen\">\n  <ol class=\"ds-breadcrumb\" aria-label=\"Breadcrumb\">\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Studio</a></li>\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#episodes\">Harbour Stories</a></li>\n    <li class=\"ds-breadcrumb__item is-current\" aria-current=\"page\">Settings</li>\n  </ol>\n  <section class=\"ds-page-header\">\n    <div>\n      <h1 class=\"ds-page-header__title\">Show settings</h1>\n      <p class=\"ds-page-header__lead\">What listeners see and where the feed lives.</p>\n    </div>\n    <div class=\"ds-page-header__actions\">\n      <a class=\"ds-button ds-button--secondary\" href=\"#guide\">How feeds work</a>\n    </div>\n  </section>\n  <div class=\"ds-stack\" data-component=\"notice\">\n    <div class=\"ds-notice ds-notice--error\" role=\"alert\">\n      <strong class=\"ds-notice__title\">Not saved</strong>\n      <p class=\"ds-notice__text\">The feed address is already taken by another show. Choose a different one below.</p>\n    </div>\n    <div class=\"ds-notice\" role=\"status\">\n      <strong class=\"ds-notice__title\">Good to know</strong>\n      <p class=\"ds-notice__text\">Changes reach the podcast apps within a day of saving.</p>\n    </div>\n  </div>\n  <div class=\"ds-split\">\n    <section class=\"ds-panel\">\n      <h2 class=\"ds-panel__title\">About the show</h2>\n      <div class=\"ds-panel__body\">\n        <form class=\"ds-form\" data-component=\"form\">\n          <div class=\"ds-form__row\">\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-name\">Show name</label>\n              <input class=\"ds-form__control\" id=\"f-name\" type=\"text\" value=\"Harbour Stories\">\n            </div>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-feed\">Feed address</label>\n              <input class=\"ds-form__control is-invalid\" id=\"f-feed\" type=\"text\" value=\"harbour\" aria-invalid=\"true\" aria-describedby=\"f-feed-err\">\n              <p class=\"ds-form__error\" id=\"f-feed-err\">This address is taken. Try harbour-stories.</p>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-lang\">Language</label>\n              <select class=\"ds-form__control\" id=\"f-lang\">\n                <option>English</option>\n                <option>Portuguese</option>\n                <option>German</option>\n              </select>\n            </div>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"f-day\">Release day</label>\n              <select class=\"ds-form__control\" id=\"f-day\">\n                <option>Friday</option>\n                <option>Tuesday</option>\n                <option>No fixed day</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"ds-form__field\">\n            <label class=\"ds-form__label\" for=\"f-about\">Description</label>\n            <textarea class=\"ds-form__control ds-form__control--area\" id=\"f-about\">Short true stories from a small port town, told by the people who were there.</textarea>\n            <p class=\"ds-form__hint\">Shown under the title in every podcast app. Two sentences are plenty.</p>\n          </div>\n          <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Email me when an episode passes 5,000 plays</label>\n<div class=\"ds-switch-row\"><label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Show play counts to guests</span></label><span class=\"ds-tooltip\" data-component=\"tooltip\"><button class=\"ds-tooltip__trigger\" type=\"button\" aria-describedby=\"tip-1\">?</button><span class=\"ds-tooltip__tip\" id=\"tip-1\" role=\"tooltip\">Guests see totals only, never who listened.</span></span></div>\n          <div class=\"ds-form__foot\" data-component=\"buttons\">\n            <button class=\"ds-button\" type=\"button\">Save changes</button>\n            <a class=\"ds-button ds-button--secondary\" href=\"#episodes\">Discard</a>\n            <a class=\"ds-button ds-button--danger\" href=\"#settings\">Delete show</a>\n            <button class=\"ds-button\" type=\"button\" disabled>Publish feed</button>\n          </div>\n        </form>\n      </div>\n    </section>\n    <div class=\"ds-stack\">\n      <aside class=\"ds-sidebar\">\n        <h2 class=\"ds-sidebar__title\">Who can edit</h2>\n        <ul class=\"ds-sidebar__list\">\n          <li class=\"ds-sidebar__item\">Mira K. <span class=\"ds-badge\">Owner</span></li>\n          <li class=\"ds-sidebar__item\">Jonas O. <span class=\"ds-badge ds-badge--plain\">Editor</span></li>\n          <li class=\"ds-sidebar__item\">Alba L. <span class=\"ds-badge ds-badge--plain\">Producer</span></li>\n          <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#settings\">Invite someone</a></li>\n        </ul>\n      </aside>\n      <section class=\"ds-panel ds-panel--plain\">\n        <h2 class=\"ds-panel__title\">Feed</h2>\n        <div class=\"ds-panel__body\">\n          <p>The feed is paused until the address is fixed. Listeners keep the episodes they already have.</p>\n          <a class=\"ds-link\" href=\"#guide\">Moving a feed</a>\n        </div>\n      </section>\n<section class=\"ds-panel\"><h2 class=\"ds-panel__title\">Feed check</h2><div class=\"ds-panel__body\"><div class=\"ds-progress\" data-component=\"progress\"><p class=\"ds-progress__label\"><span>Apps that follow the feed</span><span>3 of 4</span></p><span class=\"ds-progress__track\"><span class=\"ds-progress__bar ds-progress__bar--70\"></span></span></div></div></section>\n    </div>\n  </div>\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\">Delete Harbour Stories?</h2>\n        <a class=\"ds-dialog__close\" href=\"#settings\" aria-label=\"Close\">&times;</a>\n      </div>\n      <div class=\"ds-dialog__body\">\n        <p>All 48 episodes, their notes and the feed go with it. Listeners lose the show within a day. This cannot be undone.</p>\n      </div>\n      <div class=\"ds-dialog__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#settings\">Keep the show</a>\n        <button class=\"ds-button ds-button--danger\" type=\"button\">Delete show</button>\n      </div>\n    </div>\n  </div>\n</div>\n</section>\n\n<section class=\"ds-view\" id=\"guide\">\n<div class=\"ds-screen\">\n  <ol class=\"ds-breadcrumb\" aria-label=\"Breadcrumb\">\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#home\">Studio</a></li>\n    <li class=\"ds-breadcrumb__item\"><a class=\"ds-link ds-link--quiet\" href=\"#guide\">Handbook</a></li>\n    <li class=\"ds-breadcrumb__item is-current\" aria-current=\"page\">Moving a feed</li>\n  </ol>\n  <section class=\"ds-page-header\">\n    <div>\n      <h1 class=\"ds-page-header__title\">Handbook</h1>\n      <p class=\"ds-page-header__lead\">Short answers for the days when something has to go out.</p>\n    </div>\n    <div class=\"ds-page-header__actions\">\n      <a class=\"ds-button\" href=\"#settings\">Open show settings</a>\n    </div>\n  </section>\n  <div class=\"ds-split\">\n    <div class=\"ds-sheet\">\n      <article class=\"ds-prose\" data-component=\"typography\">\n        <h1>Moving a feed</h1>\n        <p>A feed is the address podcast apps ask for new episodes. Move it carefully and no listener notices; move it carelessly and they all have to follow again.</p>\n        <h2>Before you change the address</h2>\n        <p>Set the old address to forward for at least a month. In the feed file this is the line <code>new-feed-url</code>, and chronoskin writes it for you.</p>\n        <ul>\n          <li>Keep the episode numbers exactly as they were</li>\n          <li>Publish nothing on the day you move</li>\n          <li>Check one app on a phone, not only the website</li>\n        </ul>\n        <h3>If plays drop afterwards</h3>\n        <p>Give it a week. Apps fetch on their own schedule, and <strong>a quiet weekend is not a broken feed</strong>.</p>\n      </article>\n    </div>\n    <div class=\"ds-stack\">\n      <aside class=\"ds-sidebar\">\n        <h2 class=\"ds-sidebar__title\">More in the handbook</h2>\n        <ul class=\"ds-links\" data-component=\"links\">\n          <li><a class=\"ds-link\" href=\"#guide\">Recording with a guest</a></li>\n          <li><a class=\"ds-link is-visited\" href=\"#guide\">Loudness, in plain words</a></li>\n          <li><a class=\"ds-link is-hover\" href=\"#board\">Using the board</a></li>\n          <li><a class=\"ds-link is-active\" href=\"#settings\">Show settings</a></li>\n        </ul>\n      </aside>\n      <section class=\"ds-panel\">\n        <h2 class=\"ds-panel__title\">Still stuck?</h2>\n        <div class=\"ds-panel__body\">\n          <p>Write to the studio desk with the name of your show. A person answers on weekdays.</p>\n          <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#settings\">Write to the desk</a>\n        </div>\n      </section>\n<div class=\"ds-accordion\" data-component=\"accordion\">\n<details class=\"ds-accordion__item\" open><summary class=\"ds-accordion__head\">Will I lose listeners?</summary><div class=\"ds-accordion__body\"><p>Not if the old address forwards for a month.</p></div></details>\n<details class=\"ds-accordion__item\"><summary class=\"ds-accordion__head\">How long does a move take?</summary><div class=\"ds-accordion__body\"><p>Most apps follow within a day.</p></div></details>\n<details class=\"ds-accordion__item\"><summary class=\"ds-accordion__head\">Can I move back?</summary><div class=\"ds-accordion__body\"><p>Yes, the same way, with the addresses swapped.</p></div></details>\n</div>\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=\"#home\">Overview</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#episodes\">Episodes</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#board\">Board</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#guide\">Handbook</a></li>\n  </ul>\n  <p class=\"ds-footer__legal\">Specimen page. All names and figures are placeholders.</p>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.neubrutalism.app.s05.p02.t02.u10\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"neubrutalism\",\n    \"years\": [\n      2021,\n      2026\n    ]\n  },\n  \"archetype\": \"app\",\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-522a\",\n  \"short\": \"v1-nb-522a\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #ffffff;\n  --color-canvas: #ffffff;\n  --color-surface: #ffffff;\n  --color-surface-alt: #ffc900;\n  --color-surface-strong: #ff90e8;\n  --color-bar: #ffffff;\n  --color-bar-text: #000000;\n  --color-bar-alt: #000000;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #000000;\n  --color-inverse-text: #ffffff;\n  --color-text: #000000;\n  --color-text-muted: #666666;\n  --color-heading: #000000;\n  --color-heading-alt: #000000;\n  --color-link: #000000;\n  --color-link-quiet: #000000;\n  --color-link-visited: #000000;\n  --color-link-hover: #000000;\n  --color-link-active: #000000;\n  --color-border: #000000;\n  --color-border-strong: #000000;\n  --color-border-muted: #b3b3b3;\n  --color-accent: #ff90e8;\n  --color-accent-text: #000000;\n  --color-accent-alt: #f1f333;\n  --color-fill-1: #ff90e8;\n  --color-fill-2: #ffc900;\n  --color-fill-3: #23a094;\n  --color-fill-4: #90a8ed;\n  --color-button: #000000;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #000000;\n  --color-input: #ffffff;\n  --color-input-text: #000000;\n  --color-input-border: #000000;\n  --color-disabled: #aeaeae;\n  --color-disabled-text: #303030;\n  --color-danger: #dc341e;\n  --color-danger-surface: #e2442f;\n  --color-success: #23a094;\n  --color-warning: #ffc900;\n  --color-notice: #90a8ed;\n  --color-notice-text: #000000;\n  --color-focus: #000000;\n  --color-shadow: #000000;\n  --color-overlay: rgb(0 0 0 / 0.75);\n}\n\n/* @part type */\n:root {\n  --font-body: \"Google Sans Flex\", \"Albert Sans\", \"Avenir Next\", Avenir, \"Century Gothic\", sans-serif;\n  --font-heading: \"Google Sans Flex\", \"Albert Sans\", \"Avenir Next\", Avenir, \"Century Gothic\", sans-serif;\n  --font-ui: \"Google Sans Flex\", \"Albert Sans\", \"Avenir Next\", Avenir, \"Century Gothic\", sans-serif;\n  --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n  --text-base: 18px;\n  --text-small: 14px;\n  --text-ui: 16px;\n  --text-large: 24px;\n  --text-display: 60px;\n  --text-h1: 48px;\n  --text-h2: 36px;\n  --text-h3: 24px;\n  --line-body: 1.55;\n  --line-heading: 1.25;\n  --line-display: 1.1;\n  --weight-body: 400;\n  --weight-bold: 500;\n  --weight-heading: 400;\n  --weight-display: 400;\n  --weight-ui: 400;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 14px;\n  --radius-panel: 18px;\n  --radius-pill: 9999px;\n  --radius-page: 24px;\n  --shadow-panel: 0 6px 0 0 var(--color-shadow);\n  --shadow-control: 0 4px 0 0 var(--color-shadow);\n  --shadow-control-hover: 0 2px 0 0 var(--color-shadow);\n  --shadow-control-pressed: 0 0 0 0 var(--color-shadow);\n  --shadow-dialog: 0 10px 0 0 var(--color-shadow);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: var(--color-button);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px solid var(--color-focus);\n  --transition: transform 0.12s ease-out, box-shadow 0.12s ease-out;\n  --backdrop-blur: 0px;\n}\n"
  }
}
