{
  "id": "v1-md-8331",
  "long_id": "v1.material-design.app.s08.p03.t03.u01",
  "name": "Material media player, 2016",
  "era": {
    "slug": "material-design",
    "code": "md",
    "name": "Material Design",
    "years": [
      2014,
      2018
    ],
    "description": "Paper and ink, 2014 to 2018: flat sheets that cast soft shadows, a coloured app bar, uppercase medium-weight buttons, two-pixel corners and one bright accent for the floating action."
  },
  "archetype": "app",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": true,
    "responsive": true
  },
  "summary": "A signed-in listening application in the paper-and-ink manner: a low coloured app bar with the views, a queue sheet that runs down the right edge of the window, and a player bar fixed along the bottom whose round play button, the floating action button, rides its top edge. The home screen opens with a band in the secondary bar colour that holds a square cover and the featured title, then a row of tabs and a tight grid list of square colour tiles with a caption strip along the foot of each. Music, podcast and video applications built on the 2014 guidelines looked like this from about 2015 to 2018.",
  "url": "https://chrono.skin/s/v1-md-8331",
  "preview_url": "https://chrono.skin/s/v1-md-8331/specimen.html",
  "files": {
    "STYLE.md": "# Material media player, 2016\n\n## Summary\n\nA signed-in listening application in the paper-and-ink manner: a low coloured app bar with the views, a queue sheet that runs down the right edge of the window, and a player bar fixed along the bottom whose round play button, the floating action button, rides its top edge. The home screen opens with a band in the secondary bar colour that holds a square cover and the featured title, then a row of tabs and a tight grid list of square colour tiles with a caption strip along the foot of each. Music, podcast and video applications built on the 2014 guidelines looked like this from about 2015 to 2018.\n\n## Layout\n\n- The page is fluid: `--size-page` is `100%` and nothing is centred or capped; tiles and sheets stretch with the window, as in an application. Designed at 1440px. Running text is capped at `--size-measure` (620px).\n- Order: `.ds-nav` (one row, `--size-bar` 56px: brand, the view links directly after it, `.ds-nav__search` of `--size-search` and the round `.ds-avatar` at the right), then the view, then the one-line `.ds-footer`, then `.ds-player`, which is the last element of the page and sticks to the bottom of the window (`--size-player` 72px).\n- A listening view is `.ds-app`, a two-column grid: `.ds-main` and the `.ds-sidebar` queue (`--size-queue` 320px), which is flush with the right edge of the window and as tall as the view. On the home screen `.ds-main` holds `.ds-hero`, flush with the bar and the queue, and then `.ds-content`, the padded stack: `.ds-toolbar` (tabs and one filter field), the `.ds-grid`, and a `.ds-columns` row (2 to 1) with the recently played sheet and one card.\n- `.ds-grid` is four square tiles to a row with only `--space-1` (4px) between them; each tile is one flat fill with a drawn disc or diamond and a `.ds-grid__caption` strip across its foot. Tiles have no shadow: the grid reads as one surface.\n- `.ds-content` stacks its blocks `--space-4` (24px) apart, with `--space-5` at the sides (`--space-6` in `.ds-content--wide`, the form of a view without the queue).\n- Everything is on an 8px grid. `--space-1` 4px (gap between tiles, label to field, list padding), `--space-2` 8px (between buttons, card action padding, player controls), `--space-3` 16px (list and queue row padding, button side padding, gap between figure cards), `--space-4` 24px (gap between blocks, sheet padding, bar and player side padding), `--space-5` 32px (band padding, content side padding), `--space-6` 48px (bottom of the content, wide side padding), `--space-7` 64px and `--space-8` 80px (spare steps).\n- Heights: bar `--size-bar` 56px; player `--size-player` 72px; tabs, table rows, queue rows and sheet heads `--size-row` 48px; table head and icon buttons `--size-row-dense` 40px; list rows 56px; buttons, the search field and the avatar `--size-control` 36px, fields 40px; floating button `--size-fab` 56px. Other sizes: `--size-brand` 30px, `--size-cover` 216px (featured cover), `--size-thumb` 40px (small cover), `--size-meter` 4px (progress and volume lines), `--size-volume` 96px, `--size-stripe` 4px, `--size-icon` 24px, `--size-check` 18px, `--size-badge` 22px, `--size-dialog` 440px, `--size-area` 96px.\n- Inner pages (one record, its notes, an upload form, the library) have no `.ds-hero`. The bar, the footer and the player stay. `.ds-content` opens with `.ds-breadcrumb`, then `.ds-page-header` set directly on the page (title, one grey line, raised buttons at the right), then the working sheets. A record page keeps `.ds-app` with the queue: `.ds-stats`, then one `.ds-panel` with the `.ds-table` and a `.ds-panel__foot` holding the row count and `.ds-pagination`. Pages without the queue use `.ds-content--wide` and `.ds-columns--detail` (7 to 5): the text sheet or form sheet at the left, a `.ds-stack` of notices, cards and the dialog at the right; `.ds-columns--even` stretches both columns to one height. Tabs on an inner page run along the top edge of a sheet.\n- Views: the specimen is one application with five views. `listen` is the home view: featured band, tabs, the grid of records, recently played, and the queue. `record` is one record: page header, figures, the table of recordings with pagination and labels, and the queue. `notes` is the text about a record beside two notices and related links. `upload` is the form for a recording with its page actions, the file card and the delete dialog. `library` is the listener's playlists, shown empty under its tabs, beside the saved records.\n- Below 1100px the `.ds-columns` row becomes one column and the filter field hides. Below 900px the queue drops under the main column, the search field and the volume line hide, and the page header stacks. Below 600px the bar wraps into a brand row and a full-width `.ds-nav__links` row whose items are equal cells with centred links (the current one keeps `.is-current`), the band stacks a half-size cover over its text, the grid has two tiles to a row, figures sit two by two, the player keeps only the title and the controls, and table cells marked `.ds-table__extra` are hidden.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\n- `--color-bar` soft teal `#80cbc4` with dark `--color-bar-text` `#212121`: navigation bar and header band carry dark text, not white. `--color-bar-alt` and `--color-inverse` are blue-grey `#455a64` with white text (toolbar, footer).\n- Green is the colour of action: `--color-button`, `--color-link`, `--color-focus` and `--color-success` are `#46873b` with white button text; `--color-link-hover` stays `#46873b`, so hover is shown by elevation; `--color-link-active` is `#455a64`.\n- `--color-accent` mint `#64ffda` with `#212121` text: floating button, count badges. The 3px indicator under the current toolbar link and tab is `--color-link`, which reads on a white sheet under every palette. `--color-accent-alt` is blue-grey `#455a64`.\n- Page `#f3f3f3`, sheets white, `--color-surface-alt` `#fafafa`, `--color-surface-strong` `#e3e3e3`; borders `#dcdcdc`, inner dividers `#ebebec`. Text `#212121`, secondary `#757575`, section titles `#444444`.\n- Block fills: teal `#80cbc4`, mint `#64ffda`, light green `#6ab344` (all with dark text), blue-grey `#455a64` (white text). `--color-danger` `#c2185b`, `--color-warning` amber `#ffc400`, notice `#e3e3e3`.\n- One family, Roboto, for body, headings and UI; `--font-mono` for code only.\n- Dense text: `--text-base` 13px on a 24px line (`--line-body` 1.85), `--text-small` 12px, `--text-ui` 14px.\n- Small regular headings: `--text-display` 34px, `--text-h1` 24px, `--text-h2` 20px, `--text-h3` 15px at `--weight-bold` 500; `--text-large` 18px for the lead.\n- `--ui-transform` is `none`: buttons, navigation and tabs are sentence case at `--weight-ui` 500. No uppercase anywhere, no underlines, no tracking.\n- Raised paper: every sheet floats visibly. `--shadow-panel` is a three-layer shadow (10px blur, 4px drop); `--shadow-control` a deeper one (14px blur, 6px drop) on resting buttons; `--shadow-control-hover` drops 8px; `--shadow-control-pressed` falls back to two tight layers; `--shadow-dialog` is two layers, 14px blur with a 12px drop.\n- All corners are 2px, including `--radius-pill`: badges, chips and pagination cells are small rectangles, not pills.\n- Fills are flat; depth comes from shadow only. `--border-width` 1px, `--border-width-strong` 3px for indicators, stat rules and the focus and error line of a field. A hovered button darkens: `--fill-button-hover` is the button colour mixed with 12% black. `--fill-input` is transparent, so fields are a bottom line only; `--focus-ring` is a solid 3px line; `--transition` is a quick 0.15s ease-out.\n- In this layout the toolbar is a white sheet (`--fill-panel`) with `--color-text-muted` links and a `--color-heading` brand name; `--fill-bar` with `--color-bar-text` fills the hero and the inner page header instead. `--fill-inverse` with `--color-inverse-text` is the dark band and the footer. `--color-surface-strong` is the grey band and the table head, both with `--color-text`.\n- Text on fills follows fixed pairs: `--color-bar-text` on the hero, the page header, `--color-fill-1` and `--color-fill-3`; `--color-accent-text` on the accent, `--color-fill-2` and the warning badge; `--color-inverse-text` on `--color-fill-4`, the dark band and the footer; `--color-button-text` on the primary and danger buttons and on the new, success and danger badges. Links and muted text are used only on the page and on white sheets, never on a grey, coloured or dark band.\n- One-off values built with `color-mix()`, `calc()` or `opacity` because the vocabulary has no token: 87% and 70% of the bar text colour for the hero lead, the page header text and its breadcrumb; 14%, 22% and 40% washes of it for the hero shapes; 87% opacity for card text on a colour block; 87%, 70% and 40% of the inverse text in the dark band and footer; 66% of the quiet link colour for rail links; a 20% grey wash behind a hovered flat button; line heights 1.18, 1.2, 1.43, 1.6 and 1.85.\n\n## Components\n\n- `.ds-page` on `<body>`: the page fill, family and 14px text.\n- `.ds-nav`: the app bar. `.ds-nav__links` > `.ds-nav__item` > `.ds-nav__link` follow the brand; `is-current` has a `--border-width-strong` line in `--color-bar-text`. `.ds-nav__search` is a pill holding an icon and a borderless `.ds-nav__field`; `.ds-avatar` is the account disc, the button of the account `.ds-menu`.\n- `.ds-brand`: the site's mark and name at the left of the bar, one link. `.ds-brand__mark` is a `--size-brand` tile dressed like the primary button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) with a hairline ring of the bar text at 70%; `.ds-brand__name` is the name at `--text-large` in the heading font. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-hero`: the featured band: a `.ds-cover--large` at the left and `.ds-hero__body` with `.ds-hero__label`, `.ds-hero__title`, `.ds-hero__lead` and a `.ds-buttons` row of one `.ds-button--secondary` and one `.ds-button--onbar`. Never put a primary or a flat button on the band: their colours are not chosen for it.\n- `.ds-cover`: a square drawn cover, `--size-thumb` wide (`--2`, `--3`, `--4` pick the fill; `--large` is the featured size). Used in lists, the queue and the player.\n- `.ds-app`, `.ds-main`, `.ds-content` (`--wide`), `.ds-columns` (2 to 1; `--detail` 7 to 5; `--even` equal heights), `.ds-stack` and `.ds-caption` (a small uppercase caption on the page).\n- `.ds-page-header`: the head of an inner page, unboxed. `.ds-page-header__body` holds `.ds-page-header__title` and `.ds-page-header__text`; `.ds-page-header__actions` sits at the right.\n- `.ds-prose`: long-form text inside a `.ds-panel--pad`; styles h1 to h3, paragraphs, lists, `strong`, inline `code` and links. `.ds-prose__lead` is the opening paragraph.\n- `.ds-link`: inline link with `is-visited`, `is-hover`, `is-active`, `is-focus`; `--quiet` is text-coloured. `.ds-links` stacks several.\n- `.ds-button`: the primary button, 36px, uppercase, may start with a `.ds-icon`. `--secondary` is the light button, `--flat` has no fill (cards, dialogs, empty states), `--danger` is filled with `--color-danger` (with `--flat`, danger-coloured text), `--onbar` is the outlined button in `--color-bar-alt-text` for the featured band, `--small` and `--wide` change its size, `--fab` is the 56px accent disc. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. Group with `.ds-buttons`. `.ds-iconbutton` is a 40px round button with one icon and no fill.\n- `.ds-icon`: 24px stroked inline SVG in the current colour; `--solid` fills it instead.\n- `.ds-form`: stacked fields; `.ds-form__row` puts two side by side. `.ds-form__field` wraps a `.ds-form__label` and a `.ds-form__control` (filled, bottom line only; `--area` for a textarea; inside `.ds-form__select` for a select). `is-focus` thickens the line in `--color-focus`; `is-invalid` on the field plus `.ds-form__error` shows an error; `.ds-form__hint` is help text; `.ds-form__check` with `.ds-form__checkbox` is a checkbox; `.ds-form__actions` right-aligns buttons; `.ds-form__inline` puts one field and one button on a line.\n- `.ds-table`: sits in a `.ds-panel`; 48px rows divided by hairlines, `.ds-table__index` the centred row number, `.ds-table__name` a bold title, `.ds-table__num` right-aligned numbers, `.ds-table__extra` cells a phone can do without, `tr.is-current` tinted with its number in `--color-link`.\n- `.ds-list`: dense rows inside a `.ds-panel`, without dividers. `.ds-list__item` holds a `.ds-cover`, `.ds-list__body` with `.ds-list__title` and `.ds-list__text` (one line each, cut with an ellipsis), and `.ds-list__meta` at the right.\n- `.ds-panel`: a card with `.ds-panel__title`, `.ds-panel__body` and optional `.ds-panel__actions` (`--end` for raised buttons at the right). `.ds-panel__head` is a ruled head with the title and one flat button; `.ds-panel__foot` a foot with a count and pagination; `--form` holds a form, `--pad` pads the sheet for prose. `.ds-meter` with `.ds-meter__bar` (`--2` for the longer one) is a thin progress line.\n- `.ds-stat`: one figure card with a `--size-stripe` line in `--color-accent` at its left; four sit in a `.ds-stats` row. `.ds-stat__value` is the number, `.ds-stat__label` the small caption under it.\n- `.ds-grid`: the grid list. Each `.ds-grid__cell` is a square link (`--2`, `--3`, `--4` pick the fill, `--square` draws a diamond instead of a disc) with a `.ds-grid__caption` holding `.ds-grid__text`, `.ds-grid__title` and a play icon.\n- `.ds-tabs`: a hairline-ruled row of uppercase `.ds-tabs__tab`; `is-current` is text-coloured with a line in `--color-accent`. `.ds-toolbar` puts the tabs and a `.ds-toolbar__field` on one rule.\n- `.ds-badge`: accent count label; `--new` for new items; `--success`, `--warning`, `--danger` for the state of a recording; `--chip` is a 32px grey chip, `is-current` when chosen. Group with `.ds-badges`.\n- `.ds-sidebar`: the queue sheet at the right edge. `.ds-sidebar__title` is a small uppercase heading, `.ds-sidebar__list` a group of `.ds-sidebar__link` rows, each a cover, a `.ds-sidebar__name` and a `.ds-sidebar__count`; `is-current` is the playing row, with a stripe in `--color-accent`. `.ds-sidebar__actions` holds two buttons at its foot.\n- `.ds-notice`: tinted block with a left stripe and a `.ds-notice__title`; `--error` uses the danger surface and colour. Group with `.ds-notices`.\n- `.ds-pagination`: a row of round `.ds-pagination__link` in a sheet foot; `is-current` is filled, `is-disabled` grey.\n- `.ds-breadcrumb`: small grey trail of `.ds-breadcrumb__item` with `.ds-breadcrumb__link`, separated by drawn chevrons; the last carries `is-current`.\n- `.ds-dialog`: a sheet with the deepest shadow, `.ds-dialog__title`, `.ds-dialog__body` and right-aligned flat buttons in `.ds-dialog__actions`. Sits on `.ds-overlay`.\n- `.ds-player`: the bar fixed to the bottom of the window. `.ds-player__progress` is a meter along its top edge; `.ds-player__now` holds a cover and the title; `.ds-player__controls` two icon buttons around the floating play button, which is raised by half its height; `.ds-player__extra` the time and `.ds-player__volume`.\n- `.ds-empty`: centred `.ds-empty__mark` disc, `.ds-empty__title`, `.ds-empty__text` and one flat button, inside a sheet under its tabs.\n- `.ds-footer`: one inverse line with a `.ds-footer__list` of `.ds-footer__link` at the left and `.ds-footer__legal` at the right.\n- `.ds-menu`: a `<details>` whose `.ds-menu__button` (the `<summary>`: an icon, or the account's `.ds-avatar`) opens `.ds-menu__list`, a white sheet with the dialog shadow holding 48px `.ds-menu__link` rows. Use it for the account menu and the overflow (three dots) at the end of the bar; `--start` hangs the sheet from the left, for the menu button that carries the navigation on a phone.\n- `.ds-tooltip`: on an icon-only button, with a `.ds-tooltip__text` child naming it; the small dark label shows on hover and focus (`is-open` statically). It sits below; `--left`, `--right` and `--above` move it. Use it on the floating button and bar icons, never on a button that already has a text label.\n- `.ds-switch`: an on-off setting that takes effect at once: a `<span>` or `<label>` holding `.ds-switch__input` (a checkbox) and `.ds-switch__track`, which draws the track and the round thumb; `is-on` shows the on state statically. Keep the checkbox for choices that are saved with a form.\n- `.ds-progress`: a `--size-progress` line with `.ds-progress__bar` (`--low`, `--high`) for work whose length is known; `--ring` is the small ring for work whose length is not. Put it inside the card or notice it reports on.\n- `.ds-accordion`: expansion panels inside a card: `<details class=\"ds-accordion__item\">` with a `.ds-accordion__head` summary (a chevron is drawn at its right) and a `.ds-accordion__body` paragraph. Use it for short questions and answers, closed by default.\n\n## Never\n\n- `row-gap <= 4px`: list, queue and table rows touch.\n- `uppercase-text = 0%`: labels, buttons and navigation are sentence case.\n- `underlined-links = 0%`: links are marked by colour and weight.\n- `font-weight <= 500`: emphasis is medium, never bold.\n- `font-size >= 12px`: captions are the smallest text.\n- `font-size <= 34px`: the header band title is the largest text.\n- `letter-spacing = 0px`: no tracking.\n- `font-families <= 2`: one sans-serif plus the mono for code.\n- `gradient-fills = 0%`: every fill is one flat colour; depth comes from shadow only.\n- `text-shadow = none`: no text has a shadow.\n- `border-width <= 4px`: hairline dividers are 1px, indicators 2px, and the widest line is the 4px stripe of a notice.\n- `box-shadow-blur <= 14px`: shadows are tight; nothing has a wide, diffuse glow.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: anything that holds data is a sheet like `.ds-panel` with `--radius-panel` and `--shadow-panel`; anything pressed is a `.ds-button` variant or a `.ds-iconbutton`; a new picture is a `.ds-cover` or a tile, one `--color-fill-*` with shapes in its text colour; a new strip that must stay in view is built like `.ds-player`. Use tokens only. Pick heights and gaps from the `--size-*` and `--space-*` scale so everything stays on the 8px grid, keep the text colour that belongs to each fill, and never assume the sheets are darker or lighter than the page. Never add a gradient, an outline around a card, an underline, tracking or a radius between 8px and a full disc.\n",
    "components.css": ":root {\n  --size-page: 100%;\n  --size-menu: 208px;\n  --size-switch: 36px;\n  --size-switch-track: 14px;\n  --size-switch-knob: 20px;\n  --size-progress: 4px;\n  --size-ring: 32px;\n  --size-measure: 620px;\n  --size-bar: 56px;\n  --size-player: 72px;\n  --size-queue: 320px;\n  --size-row: 48px;\n  --size-row-dense: 40px;\n  --size-control: 36px;\n  --size-fab: 56px;\n  --size-brand: 30px;\n  --size-icon: 24px;\n  --size-check: 18px;\n  --size-badge: 22px;\n  --size-stripe: 4px;\n  --size-meter: 4px;\n  --size-cover: 216px;\n  --size-thumb: 40px;\n  --size-search: 280px;\n  --size-volume: 96px;\n  --size-dialog: 440px;\n  --size-area: 96px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 16px;\n  --space-4: 24px;\n  --space-5: 32px;\n  --space-6: 48px;\n  --space-7: 64px;\n  --space-8: 80px;\n}\n\n/* menu: a sheet of choices that drops from a button in the bar */\n.ds-menu {\n  position: relative;\n  display: flex;\n  align-items: center;\n  align-self: center;\n  flex: none;\n}\n.ds-menu__button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  min-width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  border-radius: var(--radius-pill);\n  color: inherit;\n  font-size: var(--text-small);\n  list-style: none;\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-menu__button::-webkit-details-marker { display: none; }\n.ds-menu__button:hover,\n.ds-menu__button.is-hover,\n.ds-menu[open] > .ds-menu__button { background: color-mix(in srgb, currentColor 16%, transparent); }\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus { outline: var(--focus-ring); }\n.ds-menu__list {\n  position: absolute;\n  z-index: 20;\n  top: 100%;\n  right: 0;\n  min-width: var(--size-menu);\n  margin: var(--space-1) 0 0;\n  padding: var(--space-2) 0;\n  list-style: none;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  color: var(--color-text);\n}\n.ds-menu__link,\n.ds-menu__link:hover {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-row);\n  padding: 0 var(--space-3);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  text-decoration: none;\n  text-transform: none;\n  white-space: nowrap;\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover { background: var(--color-surface-alt); }\n.ds-menu__link:focus-visible { outline: var(--focus-ring); outline-offset: calc(var(--border-width-strong) * -1); }\n\n/* tooltip: the name of an icon button, shown on hover and focus */\n.ds-tooltip { position: relative; }\n.ds-tooltip__text {\n  position: absolute;\n  z-index: 30;\n  top: calc(100% + var(--space-2));\n  left: 50%;\n  transform: translateX(-50%);\n  padding: var(--space-1) var(--space-2);\n  border-radius: var(--radius-control);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-family: var(--font-body);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n  text-transform: none;\n  white-space: nowrap;\n  visibility: hidden;\n  opacity: 0;\n  pointer-events: none;\n}\n.ds-tooltip:hover > .ds-tooltip__text,\n.ds-tooltip:focus-visible > .ds-tooltip__text,\n.ds-tooltip.is-open > .ds-tooltip__text { visibility: visible; opacity: 1; }\n.ds-tooltip--above > .ds-tooltip__text { top: auto; bottom: calc(100% + var(--space-2)); }\n\n/* switch: an on-off setting drawn over a checkbox */\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  flex: none;\n  width: var(--size-switch);\n  height: var(--size-switch-knob);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  margin: 0;\n  opacity: 0;\n  cursor: pointer;\n}\n.ds-switch__track {\n  width: 100%;\n  height: var(--size-switch-track);\n  border-radius: var(--radius-pill);\n  background: var(--color-border-strong);\n  transition: var(--transition);\n}\n.ds-switch__track::after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: var(--size-switch-knob);\n  height: var(--size-switch-knob);\n  border-radius: 50%;\n  background: var(--fill-button-secondary);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track { background: color-mix(in srgb, var(--color-button) 50%, transparent); }\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: calc(100% - var(--size-switch-knob));\n  background: var(--fill-button);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch.is-focus .ds-switch__track { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n\n/* progress: a thin line, or a ring while the length is unknown */\n.ds-progress {\n  display: block;\n  height: var(--size-progress);\n  margin: var(--space-3) 0 var(--space-1);\n  overflow: hidden;\n  background: color-mix(in srgb, var(--color-button) 30%, transparent);\n}\n.ds-progress__bar {\n  display: block;\n  width: 60%;\n  height: 100%;\n  background: var(--fill-button);\n}\n.ds-progress__bar--high { width: 85%; }\n\n/* accordion: expansion panels inside a sheet */\n.ds-accordion {\n  margin: var(--space-3) 0 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__item + .ds-accordion__item { border-top: var(--border-width) var(--border-style) var(--color-border); }\n.ds-accordion__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  min-height: var(--size-row);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__head::-webkit-details-marker { display: none; }\n.ds-accordion__head::after {\n  content: \"\";\n  flex: none;\n  width: var(--space-2);\n  height: var(--space-2);\n  margin: 0 var(--space-1);\n  border-right: var(--border-width-strong) var(--border-style) var(--color-text-muted);\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-text-muted);\n  transform: rotate(45deg);\n}\n.ds-accordion__item[open] > .ds-accordion__head::after { transform: rotate(-135deg); }\n.ds-accordion__head:focus-visible { outline: var(--focus-ring); }\n.ds-accordion__body {\n  margin: 0;\n  padding: 0 0 var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* shell */\n.ds-page {\n  margin: 0;\n  min-width: 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  -webkit-font-smoothing: antialiased;\n}\n.ds-page *,\n.ds-page *::before,\n.ds-page *::after { box-sizing: border-box; }\n.ds-icon {\n  width: var(--size-icon);\n  height: var(--size-icon);\n  flex: none;\n  fill: none;\n  stroke: currentColor;\n  stroke-width: 2;\n}\n.ds-icon--solid { fill: currentColor; stroke: none; }\n\n/* nav */\n.ds-nav {\n  position: relative;\n  z-index: 2;\n  display: flex;\n  align-items: stretch;\n  gap: var(--space-4);\n  height: var(--size-bar);\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  text-shadow: var(--shadow-text);\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  flex: none;\n  color: var(--color-bar-text);\n  font-size: var(--text-large);\n  line-height: 1.2;\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-brand);\n  height: var(--size-brand);\n  flex: none;\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-text) 70%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--color-button);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 70%;\n  height: 70%;\n}\n.ds-brand__name {\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-nav__links {\n  display: flex;\n  flex: 1 1 auto;\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__item { display: flex; }\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  padding: 0 var(--space-3);\n  border-top: var(--border-width-strong) var(--border-style) transparent;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  color: color-mix(in srgb, var(--color-bar-text) 74%, transparent);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover { color: var(--color-bar-text); }\n.ds-nav__link.is-current {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-bar-text);\n}\n.ds-nav__search {\n  display: flex;\n  align-items: center;\n  align-self: center;\n  gap: var(--space-2);\n  flex: none;\n  width: var(--size-search);\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-pill);\n  background: color-mix(in srgb, var(--color-bar-text) 16%, transparent);\n  color: var(--color-bar-text);\n  transition: var(--transition);\n}\n.ds-nav__search:focus-within,\n.ds-nav__search.is-focus { background: color-mix(in srgb, var(--color-bar-text) 26%, transparent); }\n.ds-nav__field {\n  flex: 1 1 auto;\n  min-width: 0;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  outline: 0;\n  background: transparent;\n  color: inherit;\n  font-family: var(--font-body);\n  font-size: var(--text-ui);\n  appearance: none;\n}\n.ds-nav__field::placeholder { color: color-mix(in srgb, var(--color-bar-text) 72%, transparent); opacity: 1; }\n.ds-avatar {\n  display: flex;\n  align-items: center;\n  align-self: center;\n  justify-content: center;\n  width: var(--size-control);\n  height: var(--size-control);\n  flex: none;\n  border-radius: 50%;\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n\n/* layout */\n.ds-app {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-queue);\n  align-items: stretch;\n}\n.ds-main { min-width: 0; }\n.ds-content {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n  align-content: start;\n  padding: var(--space-4) var(--space-5) var(--space-6);\n}\n.ds-content--wide { padding-left: var(--space-6); padding-right: var(--space-6); }\n.ds-columns {\n  display: grid;\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n  gap: var(--space-4);\n  align-items: stretch;\n}\n.ds-columns--detail { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); align-items: start; }\n.ds-columns--even { align-items: stretch; }\n.ds-stack {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n  align-content: start;\n}\n.ds-caption {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-transform: var(--ui-transform);\n}\n\n/* hero */\n.ds-hero {\n  display: flex;\n  align-items: flex-end;\n  gap: var(--space-5);\n  padding: var(--space-5);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n}\n.ds-cover {\n  position: relative;\n  display: block;\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  flex: none;\n  overflow: hidden;\n  border-radius: var(--radius-panel);\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n}\n.ds-cover::before,\n.ds-cover::after {\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 68%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: color-mix(in srgb, currentColor 22%, transparent);\n  transform: translate(-50%, -50%);\n}\n.ds-cover::after {\n  width: 20%;\n  background: color-mix(in srgb, currentColor 70%, transparent);\n}\n.ds-cover--2 { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-cover--3 { background: var(--color-fill-3); }\n.ds-cover--4 { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-cover--large {\n  width: var(--size-cover);\n  height: var(--size-cover);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-hero__body { flex: 1 1 0; min-width: 0; }\n.ds-hero__label {\n  margin: 0 0 var(--space-1);\n  color: color-mix(in srgb, var(--color-bar-alt-text) 80%, transparent);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-transform: var(--ui-transform);\n}\n.ds-hero__title {\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}\n.ds-hero__lead {\n  max-width: var(--size-measure);\n  margin: var(--space-2) 0 var(--space-4);\n  color: color-mix(in srgb, var(--color-bar-alt-text) 86%, transparent);\n  font-size: var(--text-large);\n  line-height: 1.45;\n}\n\n/* page header */\n.ds-page-header {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-4);\n  padding: var(--space-2) 0 0;\n}\n.ds-page-header__body { flex: 1 1 0; min-width: 0; }\n.ds-page-header__title {\n  margin: 0;\n  color: var(--color-heading);\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}\n.ds-page-header__text {\n  max-width: var(--size-measure);\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n\n/* typography */\n.ds-prose { max-width: var(--size-measure); }\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: var(--space-4) 0 var(--space-2);\n  color: var(--color-heading);\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}\n.ds-prose h1 { margin-top: 0; font-size: var(--text-h1); }\n.ds-prose h2 { font-size: var(--text-h2); }\n.ds-prose h3 { font-size: var(--text-h3); }\n.ds-prose p { margin: 0 0 var(--space-3); }\n.ds-prose ul,\n.ds-prose ol { margin: 0 0 var(--space-3); padding-left: var(--space-4); }\n.ds-prose li { margin-bottom: var(--space-1); }\n.ds-prose strong { font-weight: var(--weight-bold); }\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-control);\n  background: var(--color-surface-strong);\n  font-family: var(--font-mono);\n  font-size: var(--text-ui);\n}\n.ds-prose__lead {\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n  line-height: 1.5;\n}\n.ds-prose a { color: var(--color-link); text-decoration: var(--link-decoration); }\n.ds-prose a:hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n\n/* links */\n.ds-links {\n  display: grid;\n  gap: var(--space-2);\n  justify-items: start;\n}\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited { color: var(--color-link-visited); }\n.ds-link:hover,\n.ds-link.is-hover { color: var(--color-link-hover); text-decoration: var(--link-decoration-hover); }\n.ds-link:active,\n.ds-link.is-active { color: var(--color-link-active); }\n.ds-link:focus-visible,\n.ds-link.is-focus { outline: var(--focus-ring); }\n.ds-link--quiet,\n.ds-link--quiet:visited {\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-body);\n  text-decoration: var(--link-decoration-quiet);\n}\n\n/* buttons */\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  min-width: calc(var(--size-control) + var(--size-control) + var(--space-3));\n  height: var(--size-control);\n  margin: 0;\n  padding: 0 var(--space-3);\n  border: 0;\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: 1;\n  white-space: nowrap;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-button-hover-text);\n}\n.ds-button:active,\n.ds-button.is-active { box-shadow: var(--shadow-control-pressed); }\n.ds-button:focus-visible,\n.ds-button.is-focus { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--secondary { border: var(--border-width) var(--border-style) var(--color-border); }\n.ds-button--flat,\n.ds-button--flat:active,\n.ds-button--flat.is-active {\n  background: transparent;\n  box-shadow: none;\n  color: var(--color-link);\n}\n.ds-button--flat:hover,\n.ds-button--flat.is-hover {\n  background: color-mix(in srgb, var(--color-text-muted) 18%, transparent);\n  box-shadow: none;\n  color: var(--color-link);\n}\n.ds-button--danger {\n  background: var(--color-danger);\n  color: var(--color-button-text);\n}\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: color-mix(in srgb, var(--color-danger) 86%, var(--color-shadow));\n  color: var(--color-button-hover-text);\n}\n.ds-button--flat.ds-button--danger,\n.ds-button--flat.ds-button--danger:active,\n.ds-button--flat.ds-button--danger.is-active {\n  background: transparent;\n  color: var(--color-danger);\n}\n.ds-button--flat.ds-button--danger:hover,\n.ds-button--flat.ds-button--danger.is-hover {\n  background: color-mix(in srgb, var(--color-danger) 12%, transparent);\n  color: var(--color-danger);\n}\n.ds-button--onbar,\n.ds-button--onbar:hover,\n.ds-button--onbar.is-hover {\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 60%, transparent);\n  background: transparent;\n  box-shadow: none;\n  color: var(--color-bar-alt-text);\n}\n.ds-button--onbar:hover,\n.ds-button--onbar.is-hover { background: color-mix(in srgb, var(--color-bar-alt-text) 14%, transparent); }\n.ds-button--fab,\n.ds-button--fab:hover,\n.ds-button--fab.is-hover {\n  width: var(--size-fab);\n  min-width: 0;\n  height: var(--size-fab);\n  padding: 0;\n  border-radius: 50%;\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n}\n.ds-button--fab { box-shadow: var(--shadow-control-hover); }\n.ds-button--fab:hover,\n.ds-button--fab.is-hover { box-shadow: var(--shadow-control-pressed); }\n.ds-button:disabled,\n.ds-button.is-disabled,\n.ds-button.is-disabled:hover {\n  background: var(--color-disabled);\n  box-shadow: none;\n  color: var(--color-disabled-text);\n  cursor: default;\n}\n\n.ds-iconbutton {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-row-dense);\n  height: var(--size-row-dense);\n  flex: none;\n  border-radius: 50%;\n  color: var(--color-text-muted);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-iconbutton:hover,\n.ds-iconbutton.is-hover {\n  background: color-mix(in srgb, var(--color-text-muted) 18%, transparent);\n  color: var(--color-text);\n}\n\n/* form */\n.ds-form {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-4);\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-4);\n}\n.ds-form__field { display: block; min-width: 0; }\n.ds-form__label {\n  display: block;\n  margin-bottom: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.3;\n}\n.ds-form__control {\n  display: block;\n  width: 100%;\n  height: calc(var(--size-control) + var(--space-1));\n  margin: 0;\n  padding: var(--space-1) calc(var(--space-2) + var(--space-1));\n  border: 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  line-height: var(--line-body);\n  appearance: none;\n  transition: var(--transition);\n}\n.ds-form__control:focus,\n.ds-form__control.is-focus {\n  outline: 0;\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-focus);\n  padding-bottom: calc(var(--space-1) - var(--border-width));\n}\n.ds-form__control--area {\n  height: var(--size-area);\n  resize: vertical;\n}\n.ds-form__select {\n  position: relative;\n  display: block;\n}\n.ds-form__select::after {\n  content: \"\";\n  position: absolute;\n  right: var(--space-3);\n  top: calc(var(--size-control) / 2);\n  border: var(--size-stripe) var(--border-style) transparent;\n  border-top-color: var(--color-text-muted);\n  border-bottom: 0;\n  pointer-events: none;\n}\n.ds-form__hint,\n.ds-form__error {\n  display: block;\n  margin-top: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.3;\n}\n.ds-form__field.is-invalid .ds-form__label,\n.ds-form__error { color: var(--color-danger); }\n.ds-form__field.is-invalid .ds-form__control {\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-danger);\n  padding-bottom: calc(var(--space-1) - var(--border-width));\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  font-size: var(--text-ui);\n}\n.ds-form__checkbox {\n  width: var(--size-check);\n  height: var(--size-check);\n  margin: 0;\n  flex: none;\n  accent-color: var(--color-button);\n}\n.ds-form__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--space-2);\n}\n.ds-form__inline {\n  display: flex;\n  align-items: flex-end;\n  gap: var(--space-2);\n}\n.ds-form__inline .ds-form__field { flex: 1 1 0; }\n\n/* table */\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th,\n.ds-table td {\n  height: var(--size-row);\n  padding: 0 var(--space-3);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  text-align: left;\n  vertical-align: middle;\n}\n.ds-table th {\n  height: var(--size-row-dense);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-table tbody tr:hover,\n.ds-table tbody tr.is-hover { background: var(--color-surface-alt); }\n.ds-table tbody tr.is-current { background: var(--color-surface-alt); }\n.ds-table tbody tr.is-current .ds-table__index { color: var(--color-link); font-weight: var(--weight-bold); }\n.ds-table .ds-table__num { text-align: right; font-variant-numeric: tabular-nums; }\n.ds-table .ds-table__index { width: var(--size-row); color: var(--color-text-muted); text-align: center; font-variant-numeric: tabular-nums; }\n.ds-table__name { color: var(--color-text); font-weight: var(--weight-bold); }\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: var(--space-1) 0;\n  list-style: none;\n}\n.ds-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-height: calc(var(--size-row) + var(--space-2));\n  padding: var(--space-1) var(--space-3);\n}\n.ds-list__item:hover,\n.ds-list__item.is-hover { background: var(--color-surface-alt); }\n.ds-list__body { flex: 1 1 0; min-width: 0; }\n.ds-list__title {\n  display: block;\n  overflow: hidden;\n  color: var(--color-link-quiet);\n  font-size: var(--text-base);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:hover { color: var(--color-link-hover); }\n.ds-list__text {\n  display: block;\n  overflow: hidden;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: 1.4;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.ds-list__meta {\n  flex: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-variant-numeric: tabular-nums;\n}\n\n/* panel */\n.ds-panel {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  flex: 1 1 auto;\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  line-height: 1.5;\n}\n.ds-panel__body p { margin: 0 0 var(--space-3); }\n.ds-panel__body p:last-child { margin-bottom: 0; }\n.ds-panel__actions {\n  display: flex;\n  gap: var(--space-2);\n  padding: var(--space-2);\n  border-top: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__actions--end { justify-content: flex-end; padding: var(--space-3) var(--space-4); }\n.ds-panel--form .ds-panel__body { color: var(--color-text); padding-top: var(--space-4); }\n.ds-panel--pad { padding: var(--space-4); }\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  min-height: var(--size-row);\n  padding: 0 var(--space-2) 0 var(--space-3);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-panel__head .ds-panel__title { padding: 0; }\n.ds-panel__foot {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-meter {\n  display: block;\n  height: var(--size-meter);\n  overflow: hidden;\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n}\n.ds-meter__bar {\n  display: block;\n  width: 38%;\n  height: 100%;\n  background: var(--color-link);\n}\n.ds-meter__bar--2 { width: 70%; }\n\n/* stats */\n.ds-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-3);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-stat {\n  min-width: 0;\n  padding: var(--space-2) var(--space-3);\n  border-left: var(--size-stripe) var(--border-style) var(--color-accent);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-stat__value {\n  display: block;\n  color: var(--color-heading);\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  font-variant-numeric: tabular-nums;\n}\n.ds-stat__label {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* grid */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-1);\n}\n.ds-grid__cell {\n  position: relative;\n  display: block;\n  aspect-ratio: 1;\n  overflow: hidden;\n  border-radius: var(--radius-page);\n  background: var(--color-fill-1);\n  color: var(--color-bar-text);\n  text-decoration: none;\n}\n.ds-grid__cell::before,\n.ds-grid__cell::after {\n  content: \"\";\n  position: absolute;\n  left: 50%;\n  top: 40%;\n  width: 56%;\n  aspect-ratio: 1;\n  border-radius: 50%;\n  background: color-mix(in srgb, currentColor 20%, transparent);\n  transform: translate(-50%, -50%);\n}\n.ds-grid__cell::after {\n  width: 16%;\n  background: color-mix(in srgb, currentColor 70%, transparent);\n}\n.ds-grid__cell--2 { background: var(--color-fill-2); color: var(--color-accent-text); }\n.ds-grid__cell--3 { background: var(--color-fill-3); }\n.ds-grid__cell--4 { background: var(--color-fill-4); color: var(--color-inverse-text); }\n.ds-grid__cell--square::before { border-radius: var(--radius-page); transform: translate(-50%, -50%) rotate(45deg); }\n.ds-grid__caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  min-height: calc(var(--size-row) + var(--space-3));\n  padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3);\n  background: color-mix(in srgb, var(--color-shadow) 24%, transparent);\n}\n.ds-grid__text { min-width: 0; font-size: var(--text-small); line-height: 1.4; }\n.ds-grid__title {\n  display: block;\n  overflow: hidden;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n/* tabs */\n.ds-toolbar {\n  display: flex;\n  align-items: flex-end;\n  gap: var(--space-4);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-toolbar .ds-tabs { flex: 1 1 auto; border-bottom: 0; }\n.ds-toolbar__field { flex: none; width: var(--size-search); margin-bottom: var(--space-1); }\n.ds-tabs {\n  display: flex;\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  overflow: auto;\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  font-family: var(--font-ui);\n}\n.ds-tabs__tab {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  height: var(--size-row);\n  padding: 0 var(--space-4);\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover { color: var(--color-text); }\n.ds-tabs__tab.is-current {\n  color: var(--color-text);\n  border-bottom-color: var(--color-accent);\n}\n\n/* badge */\n.ds-badges {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-badge {\n  position: relative;\n  z-index: 1;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-badge);\n  height: var(--size-badge);\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  white-space: nowrap;\n  text-decoration: none;\n}\n.ds-badge--new { background: var(--color-accent-alt); color: var(--color-button-text); }\n.ds-badge--success { background: var(--color-success); color: var(--color-button-text); }\n.ds-badge--warning { background: var(--color-warning); color: var(--color-accent-text); }\n.ds-badge--danger { background: var(--color-danger); color: var(--color-button-text); }\n.ds-badge--chip {\n  height: var(--space-5);\n  padding: 0 calc(var(--space-2) + var(--space-1));\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-weight: var(--weight-body);\n  transition: var(--transition);\n}\n.ds-badge--chip.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n}\n.ds-badge--chip.is-focus,\n.ds-badge--chip:focus-visible { outline: var(--focus-ring); outline-offset: var(--border-width-strong); }\n\n/* sidebar */\n.ds-sidebar {\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  padding: var(--space-2) 0 var(--space-4);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  font-family: var(--font-ui);\n}\n.ds-sidebar__title {\n  margin: 0;\n  padding: var(--space-3) var(--space-3) var(--space-2);\n  color: var(--color-heading-alt);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-body);\n  text-transform: var(--ui-transform);\n}\n.ds-sidebar__list {\n  margin: 0 0 var(--space-2);\n  padding: 0 0 var(--space-2);\n  list-style: none;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-height: var(--size-row);\n  padding: 0 var(--space-3);\n  border-left: var(--size-stripe) var(--border-style) transparent;\n  color: var(--color-link-quiet);\n  font-size: var(--text-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover { background: var(--color-surface-strong); }\n.ds-sidebar__link.is-current {\n  border-left-color: var(--color-accent);\n  background: var(--color-surface-alt);\n  color: var(--color-link);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__name { flex: 1 1 0; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n.ds-sidebar__count { flex: none; color: var(--color-text-muted); font-size: var(--text-small); font-weight: var(--weight-body); font-variant-numeric: tabular-nums; }\n.ds-sidebar__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin-top: auto;\n  padding: var(--space-3) var(--space-3) 0;\n}\n\n/* notice */\n.ds-notices {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: var(--space-3);\n}\n.ds-notice {\n  padding: var(--space-3) var(--space-4);\n  border-left: var(--size-stripe) var(--border-style) var(--color-link);\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n  line-height: 1.5;\n}\n.ds-notice__title {\n  display: block;\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n}\n.ds-notice--error {\n  border-left-color: var(--color-danger);\n  background: var(--color-danger-surface);\n  box-shadow: var(--shadow-panel);\n  color: var(--color-danger);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n}\n.ds-pagination__link {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  height: var(--size-control);\n  padding: 0 var(--space-2);\n  border-radius: 50%;\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover { background: color-mix(in srgb, var(--color-text-muted) 18%, transparent); }\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n}\n.ds-pagination__link.is-disabled {\n  background: transparent;\n  color: var(--color-disabled-text);\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  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-breadcrumb__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before {\n  content: \"\";\n  width: calc(var(--space-1) + var(--border-width-strong));\n  height: calc(var(--space-1) + var(--border-width-strong));\n  border-top: var(--border-width) var(--border-style) currentColor;\n  border-right: var(--border-width) var(--border-style) currentColor;\n  transform: rotate(45deg);\n}\n.ds-breadcrumb__link { color: inherit; text-decoration: var(--link-decoration-quiet); }\n.ds-breadcrumb__link:hover { color: var(--color-link-hover); }\n.ds-breadcrumb__item.is-current { color: var(--color-text); }\n\n/* dialog */\n.ds-overlay {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-5) var(--space-4);\n  border-radius: var(--radius-panel);\n  background: var(--color-overlay);\n}\n.ds-dialog {\n  width: 100%;\n  max-width: var(--size-dialog);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-dialog__body {\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n}\n.ds-dialog__body p { margin: 0; }\n.ds-dialog__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: var(--space-2);\n  padding: var(--space-2);\n}\n\n/* player */\n.ds-player {\n  position: sticky;\n  bottom: 0;\n  z-index: 3;\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n  align-items: center;\n  gap: var(--space-4);\n  height: var(--size-player);\n  padding: 0 var(--space-4);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-player__progress {\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  border-radius: 0;\n}\n.ds-player__now {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-player__controls {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-player__controls .ds-button--fab { margin-top: calc(var(--size-fab) / -2); }\n.ds-player__extra {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-variant-numeric: tabular-nums;\n}\n.ds-player__volume { width: var(--size-volume); }\n\n/* empty */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: var(--space-6) var(--space-4);\n  color: var(--color-text-muted);\n  text-align: center;\n}\n.ds-empty__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-fab);\n  height: var(--size-fab);\n  margin-bottom: var(--space-3);\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-text-muted);\n}\n.ds-empty__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-empty__text {\n  max-width: var(--size-dialog);\n  margin: var(--space-1) 0 var(--space-3);\n  font-size: var(--text-ui);\n}\n\n/* footer */\n.ds-footer {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2) var(--space-5);\n  padding: var(--space-4) var(--space-5);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-small);\n}\n.ds-footer__list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: color-mix(in srgb, var(--color-inverse-text) 78%, transparent);\n  font-weight: var(--weight-bold);\n  text-transform: var(--ui-transform);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover { color: var(--color-inverse-text); }\n.ds-footer__legal {\n  margin: 0;\n  color: color-mix(in srgb, var(--color-inverse-text) 78%, transparent);\n}\n\n/* views */\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.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#listen\"],\n.ds-page:has(#listen:target) .ds-nav__link[href=\"#listen\"],\n.ds-page:has(#record:target) .ds-nav__link[href=\"#listen\"],\n.ds-page:has(#notes:target) .ds-nav__link[href=\"#listen\"],\n.ds-page:has(#upload:target) .ds-nav__link[href=\"#upload\"],\n.ds-page:has(#library:target) .ds-nav__link[href=\"#library\"] {\n  color: var(--color-bar-text);\n  border-bottom-color: var(--color-bar-text);\n}\n\n@media (max-width: 1100px) {\n  .ds-columns { grid-template-columns: minmax(0, 1fr); }\n  .ds-toolbar__field { display: none; }\n}\n@media (max-width: 900px) {\n  .ds-app { grid-template-columns: minmax(0, 1fr); }\n  .ds-nav__search { display: none; }\n  .ds-nav__links { justify-content: flex-end; }\n  .ds-columns--detail { grid-template-columns: minmax(0, 1fr); }\n  .ds-content,\n  .ds-content--wide { padding: var(--space-4) var(--space-4) var(--space-5); }\n  .ds-page-header { flex-direction: column; align-items: flex-start; }\n  .ds-player__volume { display: none; }\n}\n@media (max-width: 600px) {\n  .ds-nav {\n    flex-wrap: wrap;\n    gap: 0;\n    height: auto;\n    padding: 0 var(--space-2);\n  }\n  .ds-brand { flex: 1 1 auto; height: var(--size-bar); padding: 0 var(--space-2); }\n  .ds-avatar { margin-right: var(--space-2); }\n  .ds-nav__links { order: 1; flex: 1 1 100%; justify-content: flex-start; height: var(--size-row); }\n  .ds-nav__link { padding: 0 var(--space-2); }\n  .ds-hero { flex-direction: column; align-items: flex-start; gap: var(--space-3); padding: var(--space-4) var(--space-3); }\n  .ds-cover--large { width: calc(var(--size-cover) / 2); height: calc(var(--size-cover) / 2); }\n  .ds-hero__title { font-size: var(--text-h1); }\n  .ds-hero__lead { font-size: var(--text-base); }\n  .ds-content,\n  .ds-content--wide { padding: var(--space-3) var(--space-3) var(--space-5); }\n  .ds-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .ds-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); }\n  .ds-notices { grid-template-columns: minmax(0, 1fr); }\n  .ds-form__row { grid-template-columns: minmax(0, 1fr); }\n  .ds-table th,\n  .ds-table td { padding: 0 var(--space-2); }\n  .ds-table .ds-table__extra { display: none; }\n  .ds-tabs__tab { padding: 0 var(--space-3); }\n  .ds-panel--pad { padding: var(--space-3); }\n  .ds-panel__foot { flex-direction: column; align-items: flex-start; }\n  .ds-overlay { padding: var(--space-4) var(--space-3); }\n  .ds-player { grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-2); padding: 0 var(--space-3); }\n  .ds-player__extra { display: none; }\n  .ds-footer { padding: var(--space-3); }\n}\n\n/* phones: the links are tabs of equal width across the bar */\n@media (max-width: 600px) {\n  .ds-nav__links {\n    flex: 1 1 100%;\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .ds-nav__links > li {\n    flex: 1 1 0;\n  }\n  .ds-nav__link {\n    justify-content: center;\n    width: 100%;\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 player</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=\"#\">\n    <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M4 3h8.5v8.5H21V21H4z\"/><path d=\"M14.5 3l6.5 6.5h-6.5z\" fill-opacity=\"0.55\"/></svg></span>\n    <span class=\"ds-brand__name\">chronoskin</span>\n  </a>\n  <ul class=\"ds-nav__links\">\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#listen\">Listen</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#library\">Library</a></li>\n    <li class=\"ds-nav__item\"><a class=\"ds-nav__link\" href=\"#upload\">Upload</a></li>\n  </ul>\n  <label class=\"ds-nav__search\">\n    <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"6\" stroke=\"currentColor\" fill=\"none\"/><path d=\"M16 16l4 4\" stroke=\"currentColor\" fill=\"none\"/></svg>\n    <input class=\"ds-nav__field\" type=\"search\" placeholder=\"Search recordings\" aria-label=\"Search\">\n  </label>\n  <details class=\"ds-menu\" data-component=\"menu\">\n    <summary class=\"ds-menu__button\" aria-label=\"Account\"><span class=\"ds-avatar\" data-component=\"avatar\">M</span></summary>\n    <ul class=\"ds-menu__list\">\n      <li><a class=\"ds-menu__link\" href=\"#library\">Your library</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#upload\">Upload a recording</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#notes\">Notes on the record</a></li>\n    </ul>\n  </details>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"listen\">\n  <div class=\"ds-app\">\n    <div class=\"ds-main\">\n\n      <div class=\"ds-hero\" data-component=\"hero\">\n        <span class=\"ds-cover ds-cover--2 ds-cover--large\" aria-hidden=\"true\"></span>\n        <div class=\"ds-hero__body\">\n          <p class=\"ds-hero__label\">Record of the week</p>\n          <h1 class=\"ds-hero__title\">Harbour at dawn</h1>\n          <p class=\"ds-hero__lead\">Twelve field recordings from a working harbour, from the first gulls to the morning ferry. 48 minutes.</p>\n          <div class=\"ds-buttons\">\n            <a class=\"ds-button ds-button--secondary\" href=\"#record\">\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg>\n              Play record\n            </a>\n            <a class=\"ds-button ds-button--onbar\" href=\"#notes\">Read the notes</a>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"ds-content\">\n\n        <div class=\"ds-toolbar\">\n          <ul class=\"ds-tabs\" data-component=\"tabs\">\n            <li><a class=\"ds-tabs__tab is-current\" href=\"#listen\">For you</a></li>\n            <li><a class=\"ds-tabs__tab\" href=\"#listen\">New</a></li>\n            <li><a class=\"ds-tabs__tab\" href=\"#listen\">Places</a></li>\n            <li><a class=\"ds-tabs__tab\" href=\"#listen\">Weather</a></li>\n          </ul>\n          <input class=\"ds-form__control ds-toolbar__field\" type=\"text\" placeholder=\"Filter records\" aria-label=\"Filter records\">\n        </div>\n\n        <div class=\"ds-grid\" data-component=\"grid\">\n          <a class=\"ds-grid__cell\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Night trains</span>9 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--2 ds-grid__cell--square\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Harbour at dawn</span>12 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--3\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Rain on a tin roof</span>6 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--4 ds-grid__cell--square\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Snow, no wind</span>4 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--3 ds-grid__cell--square\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Market hall</span>8 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--4\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Pine wood, midday</span>10 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--square\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Ferry crossing</span>5 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n          <a class=\"ds-grid__cell ds-grid__cell--2\" href=\"#record\">\n            <span class=\"ds-grid__caption\"><span class=\"ds-grid__text\"><span class=\"ds-grid__title\">Kitchen radio</span>7 recordings</span>\n              <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg></span>\n          </a>\n        </div>\n\n        <div class=\"ds-columns\">\n          <div class=\"ds-panel\">\n            <div class=\"ds-panel__head\">\n              <h3 class=\"ds-panel__title\">Recently played</h3>\n              <a class=\"ds-button ds-button--flat\" href=\"#library\">History</a>\n            </div>\n            <ul class=\"ds-list\" data-component=\"list\">\n              <li class=\"ds-list__item\">\n                <span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span>\n                <span class=\"ds-list__body\">\n                  <a class=\"ds-list__title\" href=\"#record\">First gulls</a>\n                  <span class=\"ds-list__text\">Harbour at dawn, recorded by Ines Okafor</span>\n                </span>\n                <span class=\"ds-list__meta\">4:30</span>\n              </li>\n              <li class=\"ds-list__item\">\n                <span class=\"ds-cover\" aria-hidden=\"true\"></span>\n                <span class=\"ds-list__body\">\n                  <a class=\"ds-list__title\" href=\"#record\">Goods yard, two in the morning</a>\n                  <span class=\"ds-list__text\">Night trains, recorded by Tomas Lind</span>\n                </span>\n                <span class=\"ds-list__meta\">6:12</span>\n              </li>\n              <li class=\"ds-list__item\">\n                <span class=\"ds-cover ds-cover--3\" aria-hidden=\"true\"></span>\n                <span class=\"ds-list__body\">\n                  <a class=\"ds-list__title\" href=\"#record\">Gutter and downpipe</a>\n                  <span class=\"ds-list__text\">Rain on a tin roof, recorded by Mira Okafor</span>\n                </span>\n                <span class=\"ds-list__meta\">3:48</span>\n              </li>\n            </ul>\n          </div>\n          <div class=\"ds-panel\" data-component=\"panel\">\n            <h3 class=\"ds-panel__title\">Your week</h3>\n            <div class=\"ds-panel__body\">\n              <p>You listened for 3 hours and 20 minutes, mostly to water and weather.</p>\n              <span class=\"ds-progress\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Listening this week\"><span class=\"ds-progress__bar\"></span></span>\n            </div>\n            <div class=\"ds-panel__actions\">\n              <a class=\"ds-button ds-button--flat\" href=\"#library\">Open library</a>\n            </div>\n          </div>\n        </div>\n\n      </div>\n    </div>\n\n    <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n      <h2 class=\"ds-sidebar__title\">Up next</h2>\n      <ul class=\"ds-sidebar__list\">\n        <li><a class=\"ds-sidebar__link is-current\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">First gulls</span><span class=\"ds-sidebar__count\">4:30</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Ropes and fenders</span><span class=\"ds-sidebar__count\">3:05</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Signal box</span><span class=\"ds-sidebar__count\">5:41</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--3\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Gutter and downpipe</span><span class=\"ds-sidebar__count\">3:48</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--4\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Boots on fresh snow</span><span class=\"ds-sidebar__count\">2:56</span></a></li>\n      </ul>\n      <h2 class=\"ds-sidebar__title\">Playlists</h2>\n      <ul class=\"ds-sidebar__list\">\n        <li><a class=\"ds-sidebar__link\" href=\"#library\"><span class=\"ds-sidebar__name\">For reading</span><span class=\"ds-sidebar__count\">24</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#library\"><span class=\"ds-sidebar__name\">Falling asleep</span><span class=\"ds-sidebar__count\">17</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#library\"><span class=\"ds-sidebar__name\">Long walks</span><span class=\"ds-badge ds-badge--new\">New</span></a></li>\n      </ul>\n      <div class=\"ds-sidebar__actions\">\n        <a class=\"ds-button is-hover\" href=\"#library\">Save queue</a>\n        <a class=\"ds-button ds-button--secondary is-active\" href=\"#listen\">Clear</a>\n      </div>\n    </aside>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"record\">\n  <div class=\"ds-app\">\n    <div class=\"ds-main\">\n      <div class=\"ds-content\">\n\n        <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n          <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#listen\">Listen</a></li>\n          <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#listen\">Places</a></li>\n          <li class=\"ds-breadcrumb__item is-current\">Harbour at dawn</li>\n        </ol>\n\n        <header class=\"ds-page-header\" data-component=\"page-header\">\n          <div class=\"ds-page-header__body\">\n            <h1 class=\"ds-page-header__title\">Harbour at dawn</h1>\n            <p class=\"ds-page-header__text\">Twelve recordings by Ines Okafor, made over one week in March.</p>\n          </div>\n          <div class=\"ds-page-header__actions\">\n            <a class=\"ds-button ds-button--secondary\" href=\"#notes\">Notes</a>\n            <a class=\"ds-button\" href=\"#record\">Play all</a>\n          </div>\n        </header>\n\n        <ul class=\"ds-stats\" data-component=\"stats\">\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">12</span><span class=\"ds-stat__label\">Recordings</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">48</span><span class=\"ds-stat__label\">Minutes</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">18,204</span><span class=\"ds-stat__label\">Plays</span></li>\n          <li class=\"ds-stat\"><span class=\"ds-stat__value\">1,310</span><span class=\"ds-stat__label\">Saves</span></li>\n        </ul>\n\n        <div class=\"ds-panel\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th class=\"ds-table__index\">#</th><th>Recording</th><th class=\"ds-table__extra\">Place</th><th>Status</th><th class=\"ds-table__num ds-table__extra\">Plays</th><th class=\"ds-table__num\">Length</th></tr>\n            </thead>\n            <tbody>\n              <tr class=\"is-current\"><td class=\"ds-table__index\">1</td><td class=\"ds-table__name\">First gulls</td><td class=\"ds-table__extra\">Outer pier</td><td><span class=\"ds-badge ds-badge--success\">Playing</span></td><td class=\"ds-table__num ds-table__extra\">4,812</td><td class=\"ds-table__num\">4:30</td></tr>\n              <tr><td class=\"ds-table__index\">2</td><td class=\"ds-table__name\">Ropes and fenders</td><td class=\"ds-table__extra\">Fish quay</td><td><span class=\"ds-badge ds-badge--chip\">Free</span></td><td class=\"ds-table__num ds-table__extra\">3,377</td><td class=\"ds-table__num\">3:05</td></tr>\n              <tr><td class=\"ds-table__index\">3</td><td class=\"ds-table__name\">Ice machine</td><td class=\"ds-table__extra\">Fish quay</td><td><span class=\"ds-badge ds-badge--warning\">Preview</span></td><td class=\"ds-table__num ds-table__extra\">2,950</td><td class=\"ds-table__num\">2:41</td></tr>\n              <tr><td class=\"ds-table__index\">4</td><td class=\"ds-table__name\">Morning ferry</td><td class=\"ds-table__extra\">Ferry slip</td><td><span class=\"ds-badge ds-badge--chip\">Free</span></td><td class=\"ds-table__num ds-table__extra\">4,120</td><td class=\"ds-table__num\">6:02</td></tr>\n              <tr><td class=\"ds-table__index\">5</td><td class=\"ds-table__name\">Auction bell</td><td class=\"ds-table__extra\">Market shed</td><td><span class=\"ds-badge ds-badge--danger\">Withdrawn</span></td><td class=\"ds-table__num ds-table__extra\">2,945</td><td class=\"ds-table__num\">1:58</td></tr>\n            </tbody>\n          </table>\n          <div class=\"ds-panel__foot\">\n            <span>Recordings 1 to 5 of 12</span>\n            <ul class=\"ds-pagination\" data-component=\"pagination\">\n              <li><a class=\"ds-pagination__link is-disabled\" href=\"#record\" aria-label=\"Previous\">\n                <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n              </a></li>\n              <li><a class=\"ds-pagination__link is-current\" href=\"#record\">1</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#record\">2</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#record\">3</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#record\" aria-label=\"Next\">\n                <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n              </a></li>\n            </ul>\n          </div>\n        </div>\n\n        <p class=\"ds-caption\">Labels</p>\n        <div class=\"ds-badges\" data-component=\"badge\">\n          <span class=\"ds-badge\">12</span>\n          <span class=\"ds-badge ds-badge--success\">Playing</span>\n          <span class=\"ds-badge ds-badge--warning\">Preview</span>\n          <span class=\"ds-badge ds-badge--danger\">Withdrawn</span>\n          <span class=\"ds-badge ds-badge--new\">New</span>\n          <span class=\"ds-badge ds-badge--chip\">Water</span>\n          <span class=\"ds-badge ds-badge--chip\">Morning</span>\n        </div>\n\n      </div>\n    </div>\n\n    <aside class=\"ds-sidebar\">\n      <h2 class=\"ds-sidebar__title\">Up next</h2>\n      <ul class=\"ds-sidebar__list\">\n        <li><a class=\"ds-sidebar__link is-current\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">First gulls</span><span class=\"ds-sidebar__count\">4:30</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Ropes and fenders</span><span class=\"ds-sidebar__count\">3:05</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Ice machine</span><span class=\"ds-sidebar__count\">2:41</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Morning ferry</span><span class=\"ds-sidebar__count\">6:02</span></a></li>\n      </ul>\n      <h2 class=\"ds-sidebar__title\">More by this recordist</h2>\n      <ul class=\"ds-sidebar__list\">\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--4\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Snow, no wind</span><span class=\"ds-sidebar__count\">4</span></a></li>\n        <li><a class=\"ds-sidebar__link\" href=\"#record\"><span class=\"ds-cover ds-cover--3\" aria-hidden=\"true\"></span><span class=\"ds-sidebar__name\">Market hall</span><span class=\"ds-sidebar__count\">8</span></a></li>\n      </ul>\n      <div class=\"ds-sidebar__actions\">\n        <a class=\"ds-button\" href=\"#library\">Save queue</a>\n        <a class=\"ds-button ds-button--secondary\" href=\"#record\">Clear</a>\n      </div>\n    </aside>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"notes\">\n  <div class=\"ds-content ds-content--wide\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#listen\">Listen</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#record\">Harbour at dawn</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Notes</li>\n    </ol>\n\n    <div class=\"ds-columns ds-columns--detail\">\n      <div class=\"ds-panel ds-panel--pad\">\n        <article class=\"ds-prose\" data-component=\"typography\">\n          <h1>Notes on the record</h1>\n          <p class=\"ds-prose__lead\">A harbour is loudest before anyone is awake to hear it. These recordings start at half past four.</p>\n          <h2>How it was recorded</h2>\n          <p>Two small microphones on a rail, a recorder in a dry bag and a week of early mornings. Nothing was added afterwards; the <a href=\"#record\">twelve recordings</a> are in the order they were made.</p>\n          <ul>\n            <li>Stereo pair, about one metre above the water.</li>\n            <li>No filtering apart from a gentle cut below 40 Hz.</li>\n            <li>Best on headphones, at a low volume.</li>\n          </ul>\n          <h3>Files</h3>\n          <p>Each recording can be downloaded as a lossless file named like <code>harbour-01.flac</code>. Previews are limited to ninety seconds.</p>\n        </article>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-notices\" data-component=\"notice\">\n          <div class=\"ds-notice\">\n            <strong class=\"ds-notice__title\">Three recordings are previews</strong>\n            Sign in to hear them in full and to download the files.\n          </div>\n          <div class=\"ds-notice ds-notice--error\">\n            <strong class=\"ds-notice__title\">One recording was withdrawn</strong>\n            Auction bell cannot be played at the recordist's request.\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">Listen next</h3>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-links\" data-component=\"links\">\n              <a class=\"ds-link\" href=\"#record\">Ferry crossing</a>\n              <a class=\"ds-link is-visited\" href=\"#record\">Night trains</a>\n              <a class=\"ds-link is-hover\" href=\"#record\">Rain on a tin roof</a>\n              <a class=\"ds-link is-active\" href=\"#record\">Market hall</a>\n              <a class=\"ds-link ds-link--quiet\" href=\"#listen\">All places</a>\n            </div>\n          </div>\n          <div class=\"ds-panel__actions\">\n            <a class=\"ds-button ds-button--flat\" href=\"#record\">Back to the record</a>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"upload\">\n  <div class=\"ds-content ds-content--wide\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#library\">Library</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#upload\">Uploads</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">New recording</li>\n    </ol>\n\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Upload a recording</h1>\n        <p class=\"ds-page-header__text\">Describe where and when it was made. You can publish it later.</p>\n      </div>\n      <div class=\"ds-page-header__actions ds-buttons\" data-component=\"buttons\">\n        <button class=\"ds-button ds-button--danger\" type=\"button\">Delete draft</button>\n        <a class=\"ds-button ds-button--secondary\" href=\"#library\">Save draft</a>\n        <button class=\"ds-button is-disabled\" type=\"button\" disabled>Publish</button>\n        <a class=\"ds-button\" href=\"#record\">Preview</a>\n      </div>\n    </header>\n\n    <div class=\"ds-columns ds-columns--detail\">\n      <div class=\"ds-panel ds-panel--form\">\n        <div class=\"ds-panel__body\">\n          <form class=\"ds-form\" data-component=\"form\">\n            <div class=\"ds-form__row\">\n              <label class=\"ds-form__field\">\n                <span class=\"ds-form__label\">Title</span>\n                <input class=\"ds-form__control is-focus\" type=\"text\" value=\"Tide under the pier\">\n              </label>\n              <label class=\"ds-form__field is-invalid\">\n                <span class=\"ds-form__label\">Recorded on</span>\n                <input class=\"ds-form__control\" type=\"text\" value=\"31 June\">\n                <span class=\"ds-form__error\">Enter a date that exists.</span>\n              </label>\n            </div>\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Record</span>\n              <span class=\"ds-form__select\">\n                <select class=\"ds-form__control\">\n                  <option>Harbour at dawn</option>\n                  <option>Ferry crossing</option>\n                  <option>A new record</option>\n                </select>\n              </span>\n            </label>\n            <label class=\"ds-form__field\">\n              <span class=\"ds-form__label\">Notes</span>\n              <textarea class=\"ds-form__control ds-form__control--area\">Low tide, no wind. A rope creaks about halfway through.</textarea>\n              <span class=\"ds-form__hint\">Shown under the recording, up to 300 characters.</span>\n            </label>\n            <label class=\"ds-form__check\">\n              <input class=\"ds-form__checkbox\" type=\"checkbox\" checked>\n              <span>Let listeners download the file</span>\n            </label>\n            <label class=\"ds-form__check\"><span class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span></span><span>Show on my public page</span></label>\n          </form>\n        </div>\n        <div class=\"ds-panel__actions ds-panel__actions--end\">\n          <a class=\"ds-button ds-button--flat\" href=\"#library\">Cancel</a>\n          <a class=\"ds-button\" href=\"#record\">Save recording</a>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <h3 class=\"ds-panel__title\">File received</h3>\n          <div class=\"ds-panel__body\">\n            <p>One lossless file, 4 minutes 10 seconds, 41 MB. Checking levels.</p>\n            <span class=\"ds-progress\" data-component=\"progress\" role=\"progressbar\" aria-label=\"Checking levels\"><span class=\"ds-progress__bar ds-progress__bar--high\"></span></span>\n            <div class=\"ds-accordion\" data-component=\"accordion\">\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">Which files are accepted?</summary>\n                <p class=\"ds-accordion__body\">Lossless files up to 200 MB, in one or two channels.</p>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">What is checked?</summary>\n                <p class=\"ds-accordion__body\">Peak level and silence at the start and the end.</p>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__head\">Who can listen?</summary>\n                <p class=\"ds-accordion__body\">Only you, until you publish the recording.</p>\n              </details>\n            </div>\n          </div>\n        </div>\n        <div class=\"ds-overlay\">\n          <div class=\"ds-dialog\" role=\"dialog\" aria-labelledby=\"dialog-title\" data-component=\"dialog\">\n            <h3 class=\"ds-dialog__title\" id=\"dialog-title\">Delete this draft?</h3>\n            <div class=\"ds-dialog__body\">\n              <p>The file and its notes are removed. This cannot be undone.</p>\n            </div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--flat\" href=\"#upload\">Keep it</a>\n              <a class=\"ds-button ds-button--flat ds-button--danger\" href=\"#library\">Delete</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"library\">\n  <div class=\"ds-content ds-content--wide\">\n\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#listen\">Listen</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#library\">Library</a></li>\n      <li class=\"ds-breadcrumb__item is-current\">Playlists</li>\n    </ol>\n\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__body\">\n        <h1 class=\"ds-page-header__title\">Your library</h1>\n        <p class=\"ds-page-header__text\">Saved records, playlists and your own uploads, for Mira Okafor.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#upload\">Upload a recording</a>\n      </div>\n    </header>\n\n    <div class=\"ds-columns ds-columns--detail ds-columns--even\">\n      <div class=\"ds-panel\">\n        <ul class=\"ds-tabs\">\n          <li><a class=\"ds-tabs__tab\" href=\"#library\">Saved</a></li>\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#library\">Playlists</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#library\">Uploads</a></li>\n        </ul>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <span class=\"ds-empty__mark\">\n            <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 7h10M5 12h10M5 17h6M16 14v6l4-3z\" stroke=\"currentColor\" fill=\"none\"/></svg>\n          </span>\n          <h3 class=\"ds-empty__title\">No playlists yet</h3>\n          <p class=\"ds-empty__text\">Save the queue or add a recording to a playlist and it appears here.</p>\n          <a class=\"ds-button ds-button--flat\" href=\"#listen\">Find something to play</a>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\">\n          <h3 class=\"ds-panel__title\">Saved records</h3>\n          <a class=\"ds-button ds-button--flat\" href=\"#listen\">Browse</a>\n        </div>\n        <ul class=\"ds-list\">\n          <li class=\"ds-list__item\">\n            <span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#record\">Harbour at dawn</a>\n              <span class=\"ds-list__text\">12 recordings, saved today</span>\n            </span>\n            <span class=\"ds-list__meta\">48 min</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-cover\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#record\">Night trains</a>\n              <span class=\"ds-list__text\">9 recordings, saved 3 March</span>\n            </span>\n            <span class=\"ds-list__meta\">52 min</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-cover ds-cover--4\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#record\">Snow, no wind</a>\n              <span class=\"ds-list__text\">4 recordings, saved 20 February</span>\n            </span>\n            <span class=\"ds-list__meta\">31 min</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <span class=\"ds-cover ds-cover--3\" aria-hidden=\"true\"></span>\n            <span class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#record\">Market hall</a>\n              <span class=\"ds-list__text\">8 recordings, saved 11 February</span>\n            </span>\n            <span class=\"ds-list__meta\">44 min</span>\n          </li>\n        </ul>\n      </div>\n    </div>\n\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <ul class=\"ds-footer__list\">\n    <li><a class=\"ds-footer__link\" href=\"#listen\">Listen</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#library\">Library</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#upload\">Upload</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#notes\">Notes</a></li>\n  </ul>\n  <p class=\"ds-footer__legal\">chronoskin is a sample player. The recordings named here do not exist.</p>\n</footer>\n\n<div class=\"ds-player\">\n  <span class=\"ds-meter ds-player__progress\"><span class=\"ds-meter__bar\"></span></span>\n  <div class=\"ds-player__now\">\n    <span class=\"ds-cover ds-cover--2\" aria-hidden=\"true\"></span>\n    <span class=\"ds-list__body\">\n      <a class=\"ds-list__title\" href=\"#record\">First gulls</a>\n      <span class=\"ds-list__text\">Harbour at dawn</span>\n    </span>\n  </div>\n  <div class=\"ds-player__controls\">\n    <a class=\"ds-iconbutton\" href=\"#record\" aria-label=\"Previous\">\n      <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6h2v12H6zM19 6v12l-9-6z\" fill=\"currentColor\"/></svg>\n    </a>\n    <a class=\"ds-button ds-button--fab ds-tooltip ds-tooltip--above\" href=\"#record\" aria-label=\"Play\"><span class=\"ds-tooltip__text\" role=\"tooltip\">Play</span>\n      <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14l11-7z\" fill=\"currentColor\"/></svg>\n    </a>\n    <a class=\"ds-iconbutton\" href=\"#record\" aria-label=\"Next\">\n      <svg class=\"ds-icon ds-icon--solid\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M16 6h2v12h-2zM5 6v12l9-6z\" fill=\"currentColor\"/></svg>\n    </a>\n  </div>\n  <div class=\"ds-player__extra\">\n    <span>1:42 / 4:30</span>\n    <svg class=\"ds-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 10v4h4l5 4V6l-5 4zM17 9a4 4 0 0 1 0 6\" stroke=\"currentColor\" fill=\"none\"/></svg>\n    <span class=\"ds-meter ds-player__volume\"><span class=\"ds-meter__bar ds-meter__bar--2\"></span></span>\n  </div>\n</div>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.material-design.app.s08.p03.t03.u01\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"material-design\",\n    \"years\": [\n      2014,\n      2018\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-md-8331\",\n  \"short\": \"v1-md-8331\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #f3f3f3;\n  --color-canvas: #f3f3f3;\n  --color-surface: #ffffff;\n  --color-surface-alt: #fafafa;\n  --color-surface-strong: #e3e3e3;\n  --color-bar: #80cbc4;\n  --color-bar-text: #212121;\n  --color-bar-alt: #455a64;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #455a64;\n  --color-inverse-text: #ffffff;\n  --color-text: #212121;\n  --color-text-muted: #757575;\n  --color-heading: #212121;\n  --color-heading-alt: #444444;\n  --color-link: #46873b;\n  --color-link-quiet: #212121;\n  --color-link-visited: #46873b;\n  --color-link-hover: #46873b;\n  --color-link-active: #455a64;\n  --color-border: #dcdcdc;\n  --color-border-strong: #757575;\n  --color-border-muted: #ebebec;\n  --color-accent: #64ffda;\n  --color-accent-text: #212121;\n  --color-accent-alt: #455a64;\n  --color-fill-1: #80cbc4;\n  --color-fill-2: #64ffda;\n  --color-fill-3: #6ab344;\n  --color-fill-4: #455a64;\n  --color-button: #46873b;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #212121;\n  --color-input: #ffffff;\n  --color-input-text: #212121;\n  --color-input-border: #757575;\n  --color-disabled: #e3e3e3;\n  --color-disabled-text: #767777;\n  --color-danger: #c2185b;\n  --color-danger-surface: #ffffff;\n  --color-success: #46873b;\n  --color-warning: #ffc400;\n  --color-notice: #e3e3e3;\n  --color-notice-text: #212121;\n  --color-focus: #46873b;\n  --color-shadow: #000000;\n  --color-overlay: rgb(0 0 0 / 0.4);\n}\n\n/* @part type */\n:root {\n  --font-body: Roboto, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-heading: Roboto, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-ui: Roboto, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --font-mono: \"Roboto Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n  --text-base: 13px;\n  --text-small: 12px;\n  --text-ui: 14px;\n  --text-large: 18px;\n  --text-display: 34px;\n  --text-h1: 24px;\n  --text-h2: 20px;\n  --text-h3: 15px;\n  --line-body: 1.85;\n  --line-heading: 1.33;\n  --line-display: 1.18;\n  --weight-body: 400;\n  --weight-bold: 500;\n  --weight-heading: 400;\n  --weight-display: 400;\n  --weight-ui: 500;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: none;\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: 2px;\n  --radius-panel: 2px;\n  --radius-pill: 9999px;\n  --radius-page: 2px;\n  --shadow-panel: 0 0 2px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 2px 2px 0 color-mix(in srgb, var(--color-shadow) 24%, transparent);\n  --shadow-control: 0 3px 1px -2px color-mix(in srgb, var(--color-shadow) 20%, transparent), 0 2px 2px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 1px 5px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent);\n  --shadow-control-hover: 0 4px 5px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 1px 10px 0 color-mix(in srgb, var(--color-shadow) 12%, transparent), 0 2px 4px -1px color-mix(in srgb, var(--color-shadow) 20%, transparent);\n  --shadow-control-pressed: 0 0 4px 0 color-mix(in srgb, var(--color-shadow) 14%, transparent), 0 4px 8px 0 color-mix(in srgb, var(--color-shadow) 28%, transparent);\n  --shadow-dialog: 0 13px 14px 0 color-mix(in srgb, var(--color-shadow) 30%, transparent);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button) 86%, black);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: transparent;\n  --focus-ring: 2px solid var(--color-focus);\n  --transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n  --backdrop-blur: 0px;\n}\n"
  }
}
