{
  "id": "v1-sg-8317",
  "long_id": "v1.saas-gradient.landing.s08.p03.t01.u07",
  "name": "SaaS gradient event page",
  "era": {
    "slug": "saas-gradient",
    "code": "sg",
    "name": "SaaS gradient",
    "years": [
      2016,
      2021
    ],
    "description": "The start-up product page of 2016 to 2021: slanted or curved bands of purple-to-blue gradient, white rounded cards with soft wide shadows, friendly geometric sans, pill buttons and flat illustration blocks."
  },
  "archetype": "landing",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is the event page of a start-up product of 2016 to 2021, made for a conference, a webinar or a launch: the gradient is one large curve that sweeps in from the top left, a white bar of navigation floats on it, and the claim, a countdown and the faces of those already coming stand beside a sign-up card that hangs over the curve's edge. Below come four tinted figures, the speakers as cards under blocks of flat colour, the day as a timed list, last year's praise as a slide on the gradient and the questions as an accordion. Products of the period ran such a page every spring, and the registration form was always in the first screen.",
  "url": "https://chrono.skin/s/v1-sg-8317",
  "preview_url": "https://chrono.skin/s/v1-sg-8317/specimen.html",
  "files": {
    "STYLE.md": "# SaaS gradient event page\n\n## Summary\n\nThis is the event page of a start-up product of 2016 to 2021, made for a conference, a webinar or a launch: the gradient is one large curve that sweeps in from the top left, a white bar of navigation floats on it, and the claim, a countdown and the faces of those already coming stand beside a sign-up card that hangs over the curve's edge. Below come four tinted figures, the speakers as cards under blocks of flat colour, the day as a timed list, last year's praise as a slide on the gradient and the questions as an accordion. Products of the period ran such a page every spring, and the registration form was always in the first screen.\n\n## Layout\n\n- The page is designed for a 1440px viewport and is not fluid: content sits in `.ds-wrap`, centred, at most `--size-page` (1120px) wide with `--space-5` side padding. The curve, the white sections and the footer run the full width of the window.\n- Navigation is a floating bar: `.ds-nav__inner` is a card on `--fill-panel` with `--radius-page` corners and the panel shadow, as wide as the content and `--space-4` below the top of the window. It holds the `.ds-brand`, three links (the current one on a grey pill), then at the right one `.ds-menu`, the date and one small primary button. The hero or the page header is pulled up under it by a negative margin, so the bar lies on the gradient.\n- The home view stacks: `.ds-hero`, in two columns (7 to 5): kicker, title, one paragraph, the `.ds-countdown` and the `.ds-hero__crowd` at the left, the `.ds-signup` card at the right. The gradient is drawn behind them by `::before` and cut to an ellipse centred near the top left, so it is deepest under the copy and gives way under the card. Then `.ds-section--first` with `.ds-about` (6 to 5): copy and ticked points beside `.ds-stat`, four tinted figures two by two, the right pair stepped down; a white section with the `.ds-grid` of four speakers; a section of `.ds-cols--half`, the day's list in a card beside the `.ds-carousel` and the accordion; and a white section with `.ds-cta`, a centred gradient card. Sections have `--space-7` above and below.\n- Inner pages have no hero. They open with `.ds-page-header`: the same curve, shallower, holding the breadcrumb, the page title, one line of text and at most one button at the right. `.ds-main` follows with `.ds-cols` (2 to 1) for a session, `--side` (1 to 3) with the `.ds-sidebar` at the left for the programme, or `--even` (7 to 5) for the form. On the programme a `.ds-toolbar` puts the `.ds-tabs`, here chips, at the left and a switch at the right, above the card with the table.\n- Views. The specimen is the page of a two-day online conference about teaching courses, with four views. `home` is the event page. `agenda` is the programme: tracks, the label key and an empty personal schedule at the left; the day chips, the time zone switch and the table of sessions with the pagination in its foot at the right. `session` is one talk as running text with later sessions under it, beside the speaker, her workshop's places, a notice and related links. `register` is the form with its notices and buttons beside what the ticket holds and the open dialog for giving up a place.\n- Below 960px the columns stack, the gradient ends above the foot of the sign-up card and speakers stand two across; below 640px the bar `.ds-nav__inner` wraps to two rows, the brand and `.ds-nav__actions` above and `.ds-nav__links` across the full width below, scrolling sideways, with the current link still on its grey pill, everything is one column and a wide table scrolls inside `.ds-table__wrap`. The page never scrolls sideways.\n- Spacing scale: `--space-1` 4px (label to field, pagination gaps), `--space-2` 8px (icon to text, between badges and chips), `--space-3` 12px (button and cell vertical padding, between countdown tiles), `--space-4` 16px (between form rows, list row padding), `--space-5` 24px (card padding, grid gap, page gutter), `--space-6` 36px (under a section head, page top of inner pages), `--space-7` 60px (section padding, column gap of the hero), `--space-8` 100px (foot of the hero, end of the page).\n- Other sizes: `--size-nav` 64px, `--size-mark` 30px, `--size-icon` 44px, `--size-control` 36px (pagination), `--size-avatar` 36px, `--size-face` 76px (a speaker), `--size-menu` 200px, `--size-tip` 220px, `--size-dialog` 440px.\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\nThese are the conventions of the era; every layout and token set keeps them.\n\n- The gradient is `--fill-inverse`, made in the surface part from `--color-fill-1` and `--color-fill-2`; only its angle and stops change between surface sets. Text on it is always `--color-inverse-text`, here white. `--color-inverse` is the solid middle of the gradient: the text of a white button on the band.\n- On the gradient there are two buttons only: `.ds-button--inverse` (fill `--color-inverse-text`, text `--color-inverse`) and `.ds-button--ghost` (outline in `--color-inverse-text`). The primary button never stands on the gradient, so `--color-button` may be any colour, close to the gradient or far from it.\n- `--color-fill-1` to `--color-fill-4` are saturated mid tones: icon tiles, avatars, sparklines, chart lines and illustration shapes. A fill carries an icon or initials in `--color-inverse-text`, never running text. Illustration blocks are a fill mixed at about 20% into `--color-surface`.\n- `--color-page` is the pale page, `--color-surface` the card, `--color-surface-alt` the quiet inset (dialog foot, hovered row, empty state), `--color-surface-strong` the strongest neutral (quiet badge, inline code, current sidebar row, progress track).\n- `--fill-bar` with `--color-bar-text` is the table head only. `--fill-bar-alt` with `--color-bar-alt-text` is the footer, which a palette may make pale or dark; nothing else stands on it.\n- Text is `--color-text` (`#525f7f`), meta `--color-text-muted`, headings and figures `--color-heading` (`#32325d`); kickers, sidebar titles and h3 in prose are `--color-heading-alt`.\n- Links are `--color-link`, medium weight, never underlined (`--link-decoration` none); quiet links are `--color-link-quiet`.\n- `--color-button` (coral `#ff5a6e`, white text) is the one action colour on cards: the primary button, the current pill of the switch, the current page number, the top edge of the chosen plan. The secondary button is `--color-button-secondary-text` on `--fill-button-secondary` with a `--color-border` edge. The destructive button is `--color-danger` with `--color-button-text`.\n- `--fill-accent` with `--color-accent-text` is the default badge. `--alt` and the status badges are tints: the colour mixed at 16 to 22% into `--color-surface`, with text mixed from the colour and `--color-heading`, so they work on any palette. `--color-success` is also the tick of a feature point.\n- `--color-notice` with `--color-notice-text` is the information notice; the error notice is `--color-danger` on `--color-danger-surface` with a faint edge.\n- One family for body, headings and controls (`--font-body`: Nunito Sans, Avenir Next; the references used commercial geometric sans faces), `--font-mono` for code. `--text-base` 17px at `--line-body` 1.65; `--text-ui` 15px (controls, tables, card text); `--text-small` 13px (meta, badges, labels, breadcrumb); `--text-large` 21px (leads); `--text-display` 46px (hero title, plan price); `--text-h1` 36px (section and page titles, figures); `--text-h2` 26px; `--text-h3` 18px (card titles).\n- Headings are medium, not bold: `--weight-heading` and `--weight-display` 500. `--weight-bold` and `--weight-ui` are 600. Nothing is uppercase.\n- Surface: buttons, inputs and badges are pills (`--radius-control`, `--radius-pill` 100px); cards are `--radius-panel` 8px; the largest containers `--radius-page` 12px. `--border-width` 1px in `--color-border-muted` is almost invisible: cards are set off by `--shadow-panel`, two wide soft layers in the tinted `--color-shadow`. `--shadow-control` is a small lift that grows on hover while the button rises by 1px; `--shadow-dialog` is the deepest and is also used under the drawn product screen. `--transition` is 0.15s.\n- One-off values made with `calc()` and `color-mix()` because the vocabulary has no token: the slants (8vw and 4vw), the washes on the gradient (`--color-inverse-text` at 14 to 18%, the ghost border at 55%), tinted badges and illustration blocks, the brand tile's edge (`--color-button-text` at 35%), the error notice's edge (`--color-danger` at 35%), the footer rule (`--color-bar-alt-text` at 22%). Opacity 0.75 to 0.9 dims secondary text on the gradient.\n\n## Components\n\n- `.ds-page`: on `<body>`. Sets font, text colour and `--fill-page`.\n- `.ds-wrap`: the centred content column.\n- `.ds-brand`: the site's mark and name, first in the bar and again in the footer. `.ds-brand__mark` is a 30px tile dressed like the primary button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) holding the mark as inline SVG; `.ds-brand__name` is the name in bold. Name and mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the floating bar. `.ds-nav__inner` is the card; `.ds-nav__links` holds `.ds-nav__link`, the current one on a grey pill (`is-current`); `.ds-nav__actions` holds the menu, `.ds-nav__date` and one `.ds-button--small`. In the specimen the showing view marks its link with one `:has()` rule per view; a project sets `is-current` itself.\n- `.ds-menu`: a drop-down, a `<details>` whose `.ds-menu__button` is the summary and whose `.ds-menu__list` of `.ds-menu__link` opens as a small card under it, aligned to the right.\n- `.ds-hero`: the curve of the home view. `.ds-hero__inner` is two columns: `.ds-hero__copy` with `.ds-hero__kicker`, `.ds-hero__title`, `.ds-hero__lead`, the countdown and `.ds-hero__crowd` (a `.ds-avatars` stack and a line), and the `.ds-signup` card. One per site.\n- `.ds-countdown`: the time left, a row of `.ds-countdown__item` tiles washed onto the gradient, each a `.ds-countdown__figure` over a `.ds-countdown__label`.\n- `.ds-signup`: the card in the hero: `.ds-signup__title`, two `.ds-form__field`s, one `--wide` primary button, a `.ds-meter` and `.ds-signup__note`.\n- `.ds-page-header`: head of an inner page, used instead of `.ds-hero`: `.ds-page-header__inner` holds the breadcrumb, `.ds-page-header__title`, `.ds-page-header__text` and `.ds-page-header__actions` (one `--inverse` button).\n- `.ds-section`: a full-width block of the home view; `--alt` white, `--first` closer to the hero. `.ds-section__head` holds a `.ds-section__kicker`, `.ds-section__title` and `.ds-section__lead`, left-aligned. `.ds-main` is the area under a page header.\n- `.ds-cols`: main and side column, 2 to 1; `--side` 1 to 3, `--even` 7 to 5, `--half` 1 to 1. `.ds-stack` stacks cards 24px apart.\n- `.ds-about`: copy beside the figures. `.ds-points` is a list of ticked `.ds-points__item`.\n- `.ds-stat`: the figures, four `.ds-stat__item` tiles two by two, each tinted with one of the fills and holding a `.ds-stat__figure` over a `.ds-stat__label`.\n- `.ds-grid`: four cards across. Each `.ds-grid__cell` has a `.ds-grid__top` (a tinted block, `--2`, `--3`, `--4`, with a `.ds-avatar--face` and a badge) and a `.ds-grid__body`: `.ds-grid__title`, `.ds-grid__meta`, `.ds-grid__text` and a link.\n- `.ds-slot`: on a `.ds-list__item`, puts a `.ds-slot__time` before the item.\n- `.ds-carousel`: a row of slides of which one shows: `.ds-carousel__track` scrolls and snaps, each `.ds-carousel__slide` fills it; `.ds-carousel__bar` holds a caption and the `.ds-carousel__dots`, the current `.ds-carousel__dot` (`is-current`) longer and in the action colour.\n- `.ds-quote`: a slide on the gradient: `.ds-quote__text` and `.ds-quote__by` with a washed `.ds-avatar` and `.ds-quote__name`.\n- `.ds-speaker`: a `.ds-avatar--face` beside `.ds-speaker__name` and `.ds-speaker__role`, at the head of a card.\n- `.ds-rows`: plain rows in a card, each `.ds-rows__item` a `.ds-rows__name` with a value or badge at the right.\n- `.ds-cta`: the closing call to action, a centred gradient card with `.ds-cta__title`, `.ds-cta__text` and the two gradient buttons.\n- `.ds-prose`: running text: h1, h2, h3, p, lists, `code`, `strong`. `.ds-prose__lead` for the first paragraph.\n- `.ds-link`: text link. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `--quiet` for meta; `--more` appends an arrow. `.ds-linkrow` lays links in a row.\n- `.ds-button`: pill button, 14px bold, with a solid lip. Variants: `--secondary`, `--danger` (destructive actions only), `--inverse` and `--ghost` (on the gradient only), `--small`, `--wide`. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. `.ds-buttonrow` spaces buttons.\n- `.ds-form`: vertical form with labels above the fields. `.ds-form__row` puts two fields side by side; `.ds-form__field` wraps `.ds-form__label` and one of `.ds-form__input`, `.ds-form__select`, `.ds-form__textarea`. Error: `is-error` on the input plus `.ds-form__error`. `.ds-form__hint`, `.ds-form__check` with `.ds-form__checkbox`, `.ds-form__actions`.\n- `.ds-table`: data table inside a card: a small bold head on `--fill-bar`, rules between rows; `is-hover` tints a row. `.ds-table__num` right-aligns numbers; `.ds-table__title` is a row's link and `.ds-table__sub` a small line under it. Wrap it in `.ds-table__wrap`; `.ds-table__foot` is a last row for a count and the pagination.\n- `.ds-list`: rows parted by rules. `.ds-list__item` holds a `.ds-list__title` (alone or in a `.ds-list__head` with a badge at the right), an optional `.ds-list__text` and `.ds-list__meta`.\n- `.ds-panel`: the white card with the lip and the soft shadow. `.ds-panel__head` holds the `.ds-panel__title` and an optional badge, link or `.ds-panel__tools` above a rule; `.ds-panel__body` is padded; `.ds-panel__text` is a small paragraph.\n- `.ds-tabs`: here a row of chips: `.ds-tabs__tab` pills with an edge, the current one (`is-current`) filled with `--fill-button`. `.ds-toolbar` sets them at the left with a tool at the right.\n- `.ds-badge`: pill tag, 13px bold, on `--fill-accent`. `--alt` tinted, `--quiet` grey. Status variants: `--success`, `--warning`, `--danger`. `.ds-badgerow` for several.\n- `.ds-sidebar`: a block of links: `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__item` with an optional `.ds-sidebar__count`; the current row (`is-current`) is a grey pill.\n- `.ds-notice`: tinted rounded message; `--error` in the danger colours. `.ds-notice__title` for the bold lead-in. `.ds-noticerow` stacks notices.\n- `.ds-pagination`: `.ds-pagination__link` pills; `is-current` is filled with `--fill-button`, `is-disabled` is grey.\n- `.ds-breadcrumb`: a small trail of `.ds-breadcrumb__item` parted by slashes; the last is `.ds-breadcrumb__current`. It takes the colour of what it stands on.\n- `.ds-dialog`: a dimmed block (`--color-overlay`) centring `.ds-dialog__box`, a card in `--shadow-dialog`: `.ds-dialog__head` (`.ds-dialog__title`, `.ds-dialog__close`), `.ds-dialog__body`, and `.ds-dialog__actions` right-aligned on `--color-surface-alt`.\n- `.ds-empty`: a centred message on `--color-surface-alt`: `.ds-empty__icon` (a circle of `--color-fill-3`), `.ds-empty__title`, `.ds-empty__text` and one small secondary button.\n- `.ds-accordion`: sections that open and close: each `.ds-accordion__item` is a `<details>` with a `.ds-accordion__title` summary (a plus that turns to a minus) and a `.ds-accordion__body`. Used for the questions people ask before they register.\n- `.ds-tooltip`: a hint shown on hover or focus of its trigger; `.ds-tooltip__text` is the hint, above the trigger. `--mark` draws the trigger as a small round question mark; `--end` aligns the hint to the trigger's right edge; `is-open` shows it.\n- `.ds-switch`: an on/off control, a `<label>` with a hidden `.ds-switch__input` checkbox, the `.ds-switch__track` and the text; on, the track takes `--fill-button`.\n- `.ds-progress`: a thin track with a `.ds-progress__bar` in the gradient (`--33`, `--62`, `--82`, `--90` set its width; `--over` fills it in `--color-danger`). `.ds-meter` puts a `.ds-meter__row` (`.ds-meter__name` and the figures) over one.\n- `.ds-avatar`: a person as initials on a round fill (`--1`, `--2`, `--4`). `--face` is the large one of a speaker, ringed in the card colour; `.ds-avatars` overlaps several in a row; `.ds-who` sets one beside a name.\n- `.ds-tile`: an icon tile on one of the fills (`--2`, `--3`, `--4`; `--round` for a circle), for a new block that needs an icon.\n- `.ds-footer`: the closing band on `--fill-bar-alt`, centred: the brand, a `.ds-footer__list` of `.ds-footer__link` and `.ds-footer__legal` over a rule.\n\n## Never\n\n- `font-weight <= 600`: headings are medium and labels semibold, never heavy.\n- `font-size >= 13px`: meta, badges and labels are the smallest text.\n- `font-size <= 46px`: the hero title and the plan price are the largest text.\n- `font-families <= 2`: one sans-serif family, plus monospace for code.\n- `line-height <= 1.65`: body text is set at 1.65.\n- `uppercase-text <= 0%`: navigation, buttons and labels are in sentence case.\n- `underlined-links <= 0%`: links are told apart by colour and weight.\n- `text-shadow = none`: text is flat, also on the gradient and in code.\n- `animation = none`: nothing moves by itself; only hover states ease.\n- `border-width <= 3px`: borders are hairlines; 3px marks the current tab and stands beside a figure.\n- `border-radius <= 10px`: cards are 6px and the largest blocks 10px; only circles are rounder.\n- `box-shadow-blur <= 60px`: shadows are close and end at 60px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. A new block of the event page is a `.ds-section` with a `.ds-section__head`, alternating plain and `--alt`; a person is a `.ds-avatar`, large and ringed when it is their card; anything that holds data is a `.ds-panel`. Text goes on cards, on the page and, in `--color-inverse-text`, on the gradient; the four fills take initials or an icon only, and their tints take ordinary text. Put only the `--inverse` and `--ghost` buttons on the gradient, and at most one primary button in a card. Keep corners, shadows and borders on their tokens, spacing on the `--space-*` scale, and note any one-off `color-mix()` shade next to its rule.\n",
    "components.css": ":root {\n  --size-page: 1120px;\n  --size-nav: 64px;\n  --size-mark: 30px;\n  --size-icon: 44px;\n  --size-control: 36px;\n  --size-dialog: 440px;\n  --size-avatar: 36px;\n  --size-face: 76px;\n  --size-menu: 200px;\n  --size-tip: 220px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 24px;\n  --space-6: 36px;\n  --space-7: 60px;\n  --space-8: 100px;\n}\n\n/* views: one screen of the example site shows at a time */\n.ds-view { display: none; }\n.ds-view:target, .ds-page:not(:has(.ds-view:target)) .ds-view--home { display: block; }\n.ds-view:target { scroll-margin-top: 100vh; }\n\n.ds-page {\n  margin: 0;\n  padding: 0;\n  min-height: 100vh;\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n.ds-page *,\n.ds-page *::before,\n.ds-page *::after {\n  box-sizing: border-box;\n}\n\n/* brand: the mark on a tile dressed like the primary button */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: inherit;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  letter-spacing: var(--heading-tracking);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-brand__mark {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-mark);\n  height: var(--size-mark);\n  padding: var(--space-1);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-button-text) 35%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  display: inline-block;\n}\n\n/* typography */\n.ds-prose {\n  color: var(--color-text);\n  max-width: 68ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0;\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 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-6);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-5);\n  color: var(--color-heading-alt);\n  font-size: var(--text-h3);\n}\n.ds-prose p {\n  margin: var(--space-3) 0 0;\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: var(--space-3) 0 0;\n  padding-left: var(--space-5);\n}\n.ds-prose li {\n  margin-top: var(--space-1);\n}\n.ds-prose strong {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose a {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-prose__lead {\n  color: var(--color-text);\n  font-size: var(--text-large);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--more::after {\n  content: \" \\2192\";\n}\n.ds-linkrow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* buttons */\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n  transform: translateY(calc(var(--space-1) * -0.25));\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n  transform: none;\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border);\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--color-danger);\n  color: var(--color-button-text);\n}\n.ds-button--inverse,\n.ds-button--inverse:hover,\n.ds-button--inverse.is-hover {\n  background: var(--color-inverse-text);\n  color: var(--color-inverse);\n}\n.ds-button--ghost,\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  border-color: color-mix(in srgb, var(--color-inverse-text) 55%, transparent);\n  background: transparent;\n  color: var(--color-inverse-text);\n  box-shadow: none;\n}\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  background: color-mix(in srgb, var(--color-inverse-text) 14%, transparent);\n}\n.ds-button--small {\n  padding: var(--space-2) var(--space-4);\n  font-size: var(--text-small);\n}\n.ds-button--wide {\n  width: 100%;\n}\n.ds-button:disabled,\n.ds-button.is-disabled,\n.ds-button.is-disabled:hover {\n  border-color: transparent;\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  box-shadow: none;\n  text-shadow: none;\n  transform: none;\n  cursor: default;\n}\n.ds-buttonrow {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* form */\n.ds-form {\n  display: flex;\n  flex-direction: column;\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 {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  min-width: 0;\n}\n.ds-form__label {\n  color: var(--color-heading);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-form__input,\n.ds-form__select,\n.ds-form__textarea {\n  width: 100%;\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-form__textarea {\n  min-height: calc(var(--space-8) + var(--space-6));\n  border-radius: var(--radius-panel);\n  line-height: var(--line-body);\n  resize: vertical;\n}\n.ds-form__input:focus,\n.ds-form__select:focus,\n.ds-form__textarea:focus,\n.ds-form__input.is-focus {\n  border-color: var(--color-focus);\n  outline: var(--focus-ring);\n}\n.ds-form__input.is-error {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  color: var(--color-danger);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n}\n.ds-form__hint {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-form__checkbox {\n  width: var(--space-4);\n  height: var(--space-4);\n  margin: 0;\n  accent-color: var(--color-button);\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin-top: var(--space-2);\n}\n\n/* table */\n.ds-table__wrap {\n  max-width: 100%;\n  overflow-x: auto;\n}\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-align: left;\n  white-space: nowrap;\n}\n.ds-table td {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text);\n  vertical-align: middle;\n}\n.ds-table tr:last-child td {\n  border-bottom: 0;\n}\n.ds-table tbody tr:hover td,\n.ds-table tr.is-hover td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n.ds-table__title {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-table__foot {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  padding: var(--space-4) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-list__head {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-list__title {\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__text {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-list__meta {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* panel: the white card with the soft wide shadow */\n.ds-panel {\n  min-width: 0;\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-panel__title {\n  margin: 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  padding: var(--space-5);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-4);\n  font-size: var(--text-ui);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.7;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.ds-badge--alt {\n  background: color-mix(in srgb, var(--color-accent-alt) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-accent-alt) 60%, var(--color-heading));\n}\n.ds-badge--quiet {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n}\n.ds-badge--success {\n  background: color-mix(in srgb, var(--color-success) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-success) 60%, var(--color-heading));\n}\n.ds-badge--warning {\n  background: color-mix(in srgb, var(--color-warning) 22%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-warning) 50%, var(--color-heading));\n}\n.ds-badge--danger {\n  background: color-mix(in srgb, var(--color-danger) 16%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-danger) 70%, var(--color-heading));\n}\n.ds-badgerow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n\n/* sidebar block */\n.ds-sidebar {\n  min-width: 0;\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__item:hover,\n.ds-sidebar__item.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-sidebar__item.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__count {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n\n/* notice */\n.ds-notice {\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n}\n.ds-notice--error {\n  border-color: color-mix(in srgb, var(--color-danger) 35%, transparent);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n}\n.ds-noticerow {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-pagination__link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\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 {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\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  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n}\n.ds-breadcrumb__item {\n  color: inherit;\n  opacity: 0.8;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__item::after {\n  content: \"/\";\n  margin-left: var(--space-2);\n  opacity: 0.6;\n}\n.ds-breadcrumb__current {\n  font-weight: var(--weight-bold);\n}\n\n/* dialog: shown open in the page flow on its dimmed backdrop */\n.ds-dialog {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-7) var(--space-4);\n  border-radius: var(--radius-page);\n  background: var(--color-overlay);\n}\n.ds-dialog__box {\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__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-5) var(--space-5) 0;\n}\n.ds-dialog__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-dialog__close {\n  position: relative;\n  display: inline-block;\n  flex: none;\n  width: calc(var(--text-large) * 0.8);\n  height: calc(var(--text-large) * 0.8);\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-dialog__close::before, .ds-dialog__close::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  margin: auto;\n  width: 100%;\n  height: max(var(--border-width), calc(var(--text-large) * 0.12));\n  background: currentColor;\n  transform: rotate(45deg);\n}\n.ds-dialog__close::after {\n  transform: rotate(-45deg);\n}\n.ds-dialog__body {\n  padding: var(--space-3) var(--space-5) var(--space-5);\n  font-size: var(--text-ui);\n}\n.ds-dialog__body p {\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: 0 0 var(--radius-panel) var(--radius-panel);\n  background: var(--color-surface-alt);\n}\n\n/* empty state */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-6) var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  text-align: center;\n}\n.ds-empty__icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n}\n.ds-empty__icon svg {\n  width: 50%;\n  height: 50%;\n}\n.ds-empty__title {\n  margin: var(--space-1) 0 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}\n.ds-empty__text {\n  max-width: 44ch;\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) var(--space-5);\n  margin: 0;\n  padding: 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  list-style: none;\n}\n.ds-tabs__tab {\n  display: inline-block;\n  padding: var(--space-3) 0;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  margin-bottom: calc(var(--border-width) * -1);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-tabs__tab.is-current {\n  border-bottom-color: var(--color-button);\n  color: var(--color-heading);\n}\n\n/* shared small pieces: an icon tile on one of the four fills, a sparkline */\n.ds-tile {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: var(--radius-panel);\n  background: var(--color-fill-1);\n  color: var(--color-inverse-text);\n}\n.ds-tile svg {\n  width: 55%;\n  height: 55%;\n}\n\n@media (max-width: 640px) {\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-3);\n  }\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-dialog {\n    padding: var(--space-5) var(--space-3);\n  }\n}\n\n/* ---- components of the period: avatar, progress, switch, tooltip, accordion, menu ---- */\n.ds-avatar {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-avatar--1 { background: var(--color-fill-1); }\n.ds-avatar--2 { background: var(--color-fill-2); }\n.ds-avatar--4 { background: var(--color-fill-4); }\n.ds-who {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  white-space: nowrap;\n}\n.ds-progress {\n  display: block;\n  height: var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  overflow: hidden;\n}\n.ds-progress__bar {\n  display: block;\n  width: 50%;\n  height: 100%;\n  border-radius: var(--radius-pill);\n  background: var(--fill-inverse);\n}\n.ds-progress__bar--82 { width: 82%; }\n.ds-progress__bar--90 { width: 90%; }\n.ds-meter {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  font-size: var(--text-small);\n}\n.ds-meter + .ds-meter {\n  margin-top: var(--space-4);\n}\n.ds-meter__row {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n  color: var(--color-text-muted);\n}\n.ds-meter__name {\n  color: var(--color-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n}\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n.ds-switch__track {\n  position: relative;\n  flex: none;\n  width: calc(var(--space-5) * 1.75);\n  height: var(--space-5);\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: calc(var(--space-1) / 2);\n  left: calc(var(--space-1) / 2);\n  width: calc(var(--space-5) - var(--space-1));\n  height: calc(var(--space-5) - var(--space-1));\n  border-radius: var(--radius-pill);\n  background: var(--color-button-text);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track {\n  background: var(--fill-button);\n}\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: calc(var(--space-5) * 0.75 + var(--space-1) / 2);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch.is-focus .ds-switch__track {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  cursor: help;\n}\n.ds-tooltip--mark {\n  width: calc(var(--space-4) + var(--space-1));\n  height: calc(var(--space-4) + var(--space-1));\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-tooltip:focus-visible,\n.ds-tooltip.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tooltip__text {\n  position: absolute;\n  bottom: calc(100% + var(--space-2));\n  left: 50%;\n  z-index: 6;\n  display: none;\n  width: max-content;\n  max-width: var(--size-tip);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-panel);\n  background: var(--color-heading);\n  color: var(--color-surface);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  text-align: left;\n  white-space: normal;\n  box-shadow: var(--shadow-control);\n  transform: translateX(-50%);\n}\n.ds-tooltip:hover .ds-tooltip__text,\n.ds-tooltip:focus .ds-tooltip__text,\n.ds-tooltip.is-open .ds-tooltip__text {\n  display: block;\n}\n.ds-accordion {\n  min-width: 0;\n}\n.ds-accordion__item {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__item:first-child > .ds-accordion__title {\n  padding-top: 0;\n}\n.ds-accordion__item:last-child {\n  border-bottom: 0;\n}\n.ds-accordion__item:last-child:not([open]) > .ds-accordion__title {\n  padding-bottom: 0;\n}\n.ds-accordion__title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__title::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__title::after {\n  content: \"\";\n  flex: none;\n  width: calc(var(--text-large) * 0.7);\n  height: calc(var(--text-large) * 0.7);\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-large) * 0.12)) no-repeat, linear-gradient(currentColor, currentColor) center / max(var(--border-width), calc(var(--text-large) * 0.12)) 100% no-repeat;\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-accordion__item[open] > .ds-accordion__title::after {\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-large) * 0.12)) no-repeat;\n}\n.ds-accordion__title:hover,\n.ds-accordion__title.is-hover {\n  color: var(--color-link);\n}\n.ds-accordion__title:focus-visible,\n.ds-accordion__title.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-accordion__body {\n  padding: 0 0 var(--space-4);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-accordion__body p {\n  margin: 0;\n}\n.ds-menu {\n  position: relative;\n}\n.ds-menu__button {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  padding: var(--space-1) var(--space-3);\n  border-radius: var(--radius-control);\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n  list-style: none;\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-menu__button::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__button::after {\n  content: \"\";\n  display: inline-block;\n  flex: none;\n  width: 0;\n  height: 0;\n  border: calc(var(--text-small) * 0.3) solid transparent;\n  border-top: calc(var(--text-small) * 0.36) solid currentColor;\n  border-bottom-width: 0;\n  font-size: var(--text-small);\n  vertical-align: calc(var(--text-small) * 0.14);\n}\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  right: 0;\n  z-index: 5;\n  min-width: var(--size-menu);\n  margin: var(--space-2) 0 0;\n  padding: var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  list-style: none;\n}\n.ds-menu__link {\n  display: block;\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover {\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n}\n\n/* carousel: one slide showing, the row scrolls and snaps */\n.ds-carousel {\n  min-width: 0;\n}\n.ds-carousel__track {\n  display: flex;\n  gap: var(--space-4);\n  overflow-x: auto;\n  scroll-snap-type: x mandatory;\n  scrollbar-width: none;\n}\n.ds-carousel__slide {\n  flex: 0 0 100%;\n  min-width: 0;\n  scroll-snap-align: start;\n}\n.ds-carousel__bar {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin-top: var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-carousel__dots {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n}\n.ds-carousel__dot {\n  display: block;\n  width: var(--space-2);\n  height: var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--color-border-strong);\n  transition: var(--transition);\n}\n.ds-carousel__dot:hover,\n.ds-carousel__dot.is-hover {\n  background: color-mix(in srgb, var(--color-border-strong), var(--color-button));\n}\n.ds-carousel__dot.is-current {\n  width: var(--space-5);\n  background: var(--fill-button);\n}\n.ds-avatar--face {\n  width: var(--size-face);\n  height: var(--size-face);\n  border: var(--border-width-strong) var(--border-style) var(--color-surface);\n  font-size: var(--text-large);\n  box-shadow: var(--shadow-control);\n}\n.ds-avatars {\n  display: inline-flex;\n  align-items: center;\n}\n.ds-avatars .ds-avatar {\n  border: var(--border-width) var(--border-style) var(--color-surface);\n}\n.ds-avatars .ds-avatar + .ds-avatar {\n  margin-left: calc(var(--space-2) * -1);\n}\n\n/* ---- layout: event landing page ---- */\n.ds-wrap {\n  width: 100%;\n  max-width: var(--size-page);\n  margin: 0 auto;\n  padding: 0 var(--space-5);\n}\n\n/* nav: a white bar that floats on the top of the gradient */\n.ds-nav {\n  position: relative;\n  z-index: 3;\n  padding: var(--space-4) var(--space-5) 0;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-nav__inner {\n  display: flex;\n  align-items: center;\n  gap: var(--space-5);\n  min-height: var(--size-nav);\n  max-width: calc(var(--size-page) - var(--space-5) * 2);\n  margin: 0 auto;\n  padding: var(--space-2) var(--space-3) var(--space-2) var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-page);\n  background: var(--fill-panel);\n  color: var(--color-heading);\n  box-shadow: var(--shadow-panel);\n}\n.ds-nav__links {\n  display: flex;\n  flex: 1;\n  gap: var(--space-1);\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link,\n.ds-nav .ds-menu__button {\n  display: block;\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-nav .ds-menu__button::after {\n  margin-left: var(--space-1);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover,\n.ds-nav .ds-menu__button:hover,\n.ds-nav .ds-menu[open] .ds-menu__button {\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#home:target) .ds-nav__link[href=\"#home\"],\n.ds-page:has(#agenda:target) .ds-nav__link[href=\"#agenda\"],\n.ds-page:has(#session:target) .ds-nav__link[href=\"#session\"],\n.ds-page:has(#register:target) .ds-nav__link[href=\"#register\"] {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-nav__actions {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-nav__date {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n}\n\n/* hero: the gradient as one large curve from the top left (the page fill masks what lies outside it); the sign-up card hangs over its edge */\n.ds-hero {\n  position: relative;\n  margin-top: calc((var(--size-nav) + var(--space-4)) * -1);\n  padding: calc(var(--size-nav) + var(--space-4) + var(--space-7)) 0 var(--space-8);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-hero::before,\n.ds-page-header::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: var(--fill-page);\n  -webkit-mask: radial-gradient(ellipse 95% 100% at 10% 0, transparent 99.8%, black 100%);\n  mask: radial-gradient(ellipse 95% 100% at 10% 0, transparent 99.8%, black 100%);\n}\n.ds-hero__inner {\n  position: relative;\n  display: grid;\n  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);\n  align-items: start;\n  gap: var(--space-7);\n}\n.ds-hero__copy {\n  min-width: 0;\n}\n.ds-hero__kicker {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-4);\n  padding: var(--space-1) var(--space-3) var(--space-1) var(--space-1);\n  border-radius: var(--radius-pill);\n  background: color-mix(in srgb, var(--color-inverse-text) 14%, transparent);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n}\n.ds-hero__title {\n  max-width: 14ch;\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: 40ch;\n  margin: var(--space-4) 0 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-countdown {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n  margin: var(--space-5) 0 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-countdown__item {\n  min-width: calc(var(--space-7) + var(--space-5));\n  padding: var(--space-3) var(--space-3) var(--space-2);\n  border-radius: var(--radius-panel);\n  background: color-mix(in srgb, var(--color-inverse-text) 14%, transparent);\n  text-align: center;\n}\n.ds-countdown__figure {\n  display: block;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: 1.1;\n  letter-spacing: var(--heading-tracking);\n  font-variant-numeric: tabular-nums;\n}\n.ds-countdown__label {\n  display: block;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  opacity: 0.85;\n}\n.ds-hero__crowd {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  margin: var(--space-5) 0 0;\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n\n/* sign-up: the card in the hero */\n.ds-signup {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n  padding: var(--space-5);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  color: var(--color-text);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-signup__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-signup__note {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  text-align: center;\n}\n\n/* page header: the same curve, shorter, on inner pages */\n.ds-page-header {\n  position: relative;\n  margin-top: calc((var(--size-nav) + var(--space-4)) * -1);\n  padding: calc(var(--size-nav) + var(--space-4) + var(--space-6)) 0 var(--space-7);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-page-header::before {\n  -webkit-mask: radial-gradient(ellipse 130% 100% at 10% 0, transparent 99.8%, black 100%);\n  mask: radial-gradient(ellipse 130% 100% at 10% 0, transparent 99.8%, black 100%);\n}\n.ds-page-header__inner {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-5);\n}\n.ds-page-header__title {\n  margin: var(--space-2) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-page-header__text {\n  max-width: 52ch;\n  margin: var(--space-2) 0 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  gap: var(--space-3);\n}\n\n/* sections of the page */\n.ds-section {\n  padding: var(--space-7) 0;\n}\n.ds-section--first {\n  padding-top: var(--space-6);\n}\n.ds-section--alt {\n  background: var(--color-surface);\n}\n.ds-section__head {\n  max-width: 56ch;\n  margin: 0 0 var(--space-6);\n}\n.ds-section__kicker {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-section__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-section__lead {\n  margin: var(--space-3) 0 0;\n  font-size: var(--text-large);\n}\n.ds-main {\n  padding: var(--space-6) 0 var(--space-8);\n}\n.ds-stack {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-cols {\n  display: grid;\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n  align-items: start;\n  gap: var(--space-5);\n}\n.ds-cols--side {\n  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);\n}\n.ds-cols--even {\n  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);\n}\n.ds-cols--half {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n/* about: copy beside four tinted figures, two by two and stepped */\n.ds-about {\n  display: grid;\n  grid-template-columns: minmax(0, 6fr) minmax(0, 5fr);\n  align-items: center;\n  gap: var(--space-7);\n}\n.ds-about .ds-section__head {\n  margin-bottom: var(--space-4);\n}\n.ds-points {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  margin: 0 0 var(--space-5);\n  padding: 0;\n  list-style: none;\n}\n.ds-points__item {\n  display: flex;\n  align-items: baseline;\n  gap: var(--space-2);\n}\n.ds-points__item::before {\n  content: \"\\2713\";\n  color: var(--color-success);\n  font-weight: var(--weight-bold);\n}\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-4);\n  padding-bottom: var(--space-5);\n}\n.ds-stat__item {\n  padding: var(--space-5);\n  border-radius: var(--radius-panel);\n  background: color-mix(in srgb, var(--color-fill-1) 24%, var(--color-surface));\n}\n.ds-stat__item:nth-child(2) { background: color-mix(in srgb, var(--color-fill-3) 24%, var(--color-surface)); }\n.ds-stat__item:nth-child(3) { background: color-mix(in srgb, var(--color-fill-4) 24%, var(--color-surface)); }\n.ds-stat__item:nth-child(4) { background: color-mix(in srgb, var(--color-fill-2) 24%, var(--color-surface)); }\n.ds-stat__item:nth-child(even) {\n  transform: translateY(var(--space-5));\n}\n.ds-stat__figure {\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}\n.ds-stat__label {\n  margin: 0;\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n\n/* grid: the speakers, four across, each under a tinted block with a face */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n  overflow: hidden;\n}\n.ds-grid__top {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  padding: var(--space-5) var(--space-5) var(--space-3);\n  background: color-mix(in srgb, var(--color-fill-1) 24%, var(--color-surface));\n}\n.ds-grid__top--2 { background: color-mix(in srgb, var(--color-fill-2) 24%, var(--color-surface)); }\n.ds-grid__top--3 { background: color-mix(in srgb, var(--color-fill-3) 24%, var(--color-surface)); }\n.ds-grid__top--4 { background: color-mix(in srgb, var(--color-fill-4) 24%, var(--color-surface)); }\n.ds-grid__body {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: var(--space-4) var(--space-5) var(--space-5);\n}\n.ds-grid__title {\n  margin: 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}\n.ds-grid__meta {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-grid__text {\n  flex: 1;\n  margin: var(--space-3) 0;\n  font-size: var(--text-ui);\n}\n\n/* programme rows: a time before a list item */\n.ds-slot {\n  display: grid;\n  grid-template-columns: calc(var(--space-7) + var(--space-2)) minmax(0, 1fr);\n  gap: var(--space-4);\n}\n.ds-slot__time {\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  font-variant-numeric: tabular-nums;\n  line-height: var(--line-body);\n}\n\n/* quote: a slide on the gradient */\n.ds-quote {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n  height: 100%;\n  margin: 0;\n  padding: var(--space-5);\n  border-radius: var(--radius-panel);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-quote__text {\n  flex: 1;\n  margin: 0;\n  font-size: var(--text-large);\n  line-height: var(--line-body);\n}\n.ds-quote__by {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  font-size: var(--text-small);\n}\n.ds-quote__name {\n  display: block;\n  font-weight: var(--weight-bold);\n}\n.ds-quote .ds-avatar {\n  background: color-mix(in srgb, var(--color-inverse-text) 18%, transparent);\n}\n\n/* speaker: a face beside a name */\n.ds-speaker {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  margin-bottom: var(--space-4);\n}\n.ds-speaker__name {\n  margin: 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}\n.ds-speaker__role {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* rows: a name with a value at the right */\n.ds-rows {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-ui);\n}\n.ds-rows__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-rows__item:first-child {\n  padding-top: 0;\n}\n.ds-rows__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-rows__name {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n\n/* tabs: here a row of chips, with the tools of the list at the right */\n.ds-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-5);\n}\n.ds-tabs {\n  gap: var(--space-2);\n  border-bottom: 0;\n}\n.ds-tabs__tab {\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-panel);\n}\n.ds-tabs__tab.is-current {\n  border-color: transparent;\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-panel__tools {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-table__sub {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* call to action: a gradient card, centred */\n.ds-cta {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--space-4);\n  padding: var(--space-7) var(--space-5);\n  border-radius: var(--radius-page);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  text-align: center;\n  box-shadow: var(--shadow-panel);\n}\n.ds-cta__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-cta__text {\n  max-width: 48ch;\n  margin: 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-cta .ds-buttonrow {\n  justify-content: center;\n}\n\n/* footer: centred, in the secondary bar's colours */\n.ds-footer {\n  padding: var(--space-7) 0 var(--space-5);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-ui);\n  text-align: center;\n}\n.ds-footer__list {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: var(--space-2) var(--space-5);\n  margin: var(--space-4) 0 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: inherit;\n  text-decoration: var(--link-decoration-quiet);\n  opacity: 0.85;\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n  opacity: 1;\n}\n.ds-footer__legal {\n  margin: var(--space-5) 0 0;\n  padding-top: var(--space-4);\n  border-top: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-bar-alt-text) 22%, transparent);\n  font-size: var(--text-small);\n  opacity: 0.8;\n}\n\n@media (max-width: 960px) {\n  .ds-hero__inner,\n  .ds-about,\n  .ds-cols,\n  .ds-cols--side,\n  .ds-cols--even,\n  .ds-cols--half {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-hero {\n    padding-bottom: var(--space-6);\n  }\n  .ds-hero::before {\n    -webkit-mask: linear-gradient(black, black) bottom / 100% calc(var(--space-8) + var(--space-7)) no-repeat, radial-gradient(ellipse 170% 100% at 15% 0, transparent 99.8%, black 100%) top / 100% calc(100% - var(--space-8) - var(--space-7)) no-repeat;\n    mask: linear-gradient(black, black) bottom / 100% calc(var(--space-8) + var(--space-7)) no-repeat, radial-gradient(ellipse 170% 100% at 15% 0, transparent 99.8%, black 100%) top / 100% calc(100% - var(--space-8) - var(--space-7)) no-repeat;\n  }\n  .ds-about {\n    gap: var(--space-5);\n  }\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-nav__date {\n    display: none;\n  }\n}\n@media (max-width: 640px) {\n  .ds-wrap {\n    padding: 0 var(--space-4);\n  }\n  .ds-nav {\n    padding: var(--space-3) var(--space-4) 0;\n  }\n  .ds-nav__inner {\n    flex-wrap: wrap;\n    justify-content: space-between;\n    gap: var(--space-1) var(--space-2);\n    padding: var(--space-2) var(--space-3);\n    border-radius: var(--radius-panel);\n  }\n  .ds-nav__links {\n    order: 3;\n    flex: none;\n    width: 100%;\n    overflow-x: auto;\n  }\n  .ds-nav__link,\n  .ds-nav .ds-menu__button {\n    padding: var(--space-1) var(--space-2);\n  }\n  .ds-brand {\n    font-size: var(--text-base);\n  }\n  .ds-hero,\n  .ds-page-header {\n    margin-top: calc((var(--size-nav) + var(--space-7)) * -1);\n    padding-top: calc(var(--size-nav) + var(--space-7) + var(--space-5));\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n    letter-spacing: var(--heading-tracking);\n  }\n  .ds-countdown {\n    gap: var(--space-2);\n  }\n  .ds-countdown__item {\n    flex: 1;\n    min-width: 0;\n    padding: var(--space-2) var(--space-1);\n  }\n  .ds-countdown__figure {\n    font-size: var(--text-h2);\n  }\n  .ds-page-header {\n    padding-bottom: var(--space-6);\n  }\n  .ds-page-header__inner {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-page-header::before {\n    -webkit-mask: radial-gradient(ellipse 200% 100% at 10% 0, transparent 99.8%, black 100%);\n    mask: radial-gradient(ellipse 200% 100% at 10% 0, transparent 99.8%, black 100%);\n  }\n  .ds-section {\n    padding: var(--space-6) 0;\n  }\n  .ds-section--first {\n    padding-top: var(--space-5);\n  }\n  .ds-main {\n    padding: var(--space-5) 0 var(--space-7);\n  }\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-stat {\n    gap: var(--space-3);\n  }\n  .ds-stat__item {\n    padding: var(--space-4);\n  }\n  .ds-stat__figure {\n    font-size: var(--text-h2);\n  }\n  .ds-slot {\n    grid-template-columns: calc(var(--space-7) - var(--space-2)) minmax(0, 1fr);\n    gap: var(--space-3);\n  }\n  .ds-cta {\n    padding: var(--space-6) var(--space-4);\n  }\n  .ds-cta__title {\n    font-size: var(--text-h2);\n  }\n  .ds-table__title,\n  .ds-table__sub {\n    white-space: nowrap;\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: SaaS gradient event page specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <div class=\"ds-nav__inner\">\n    <a class=\"ds-brand\" data-component=\"brand\" href=\"#home\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"13.6\" cy=\"10\" r=\"7.6\" opacity=\".45\"/><circle cx=\"9.2\" cy=\"15\" r=\"5.8\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <ul class=\"ds-nav__links\">\n      <li><a class=\"ds-nav__link\" href=\"#home\">The event</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#agenda\">Programme</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#session\">Sessions</a></li>\n    </ul>\n    <div class=\"ds-nav__actions\">\n      <details class=\"ds-menu\" data-component=\"menu\">\n        <summary class=\"ds-menu__button\">More</summary>\n        <ul class=\"ds-menu__list\">\n          <li><a class=\"ds-menu__link\" href=\"#agenda\">Workshops</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#session\">Last year's talks</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#home\">Code of conduct</a></li>\n          <li><a class=\"ds-menu__link\" href=\"#register\">My ticket</a></li>\n        </ul>\n      </details>\n      <span class=\"ds-nav__date\">12 and 13 June</span>\n      <a class=\"ds-button ds-button--small\" href=\"#register\">Save my seat</a>\n    </div>\n  </div>\n</header>\n\n<section class=\"ds-view ds-view--home\" id=\"home\">\n  <div class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-wrap ds-hero__inner\">\n      <div class=\"ds-hero__copy\">\n        <p class=\"ds-hero__kicker\"><span class=\"ds-badge\">Online</span> 12 and 13 June 2019, free to join</p>\n        <h1 class=\"ds-hero__title\">Two days on teaching well online</h1>\n        <p class=\"ds-hero__lead\">The chronoskin conference for people who make courses: 24 talks, six workshops and a room full of teachers who have tried it all.</p>\n        <ul class=\"ds-countdown\" aria-label=\"Time until the first talk\">\n          <li class=\"ds-countdown__item\"><span class=\"ds-countdown__figure\">23</span><span class=\"ds-countdown__label\">days</span></li>\n          <li class=\"ds-countdown__item\"><span class=\"ds-countdown__figure\">07</span><span class=\"ds-countdown__label\">hours</span></li>\n          <li class=\"ds-countdown__item\"><span class=\"ds-countdown__figure\">41</span><span class=\"ds-countdown__label\">minutes</span></li>\n          <li class=\"ds-countdown__item\"><span class=\"ds-countdown__figure\">09</span><span class=\"ds-countdown__label\">seconds</span></li>\n        </ul>\n        <p class=\"ds-hero__crowd\"><span class=\"ds-avatars\"><span class=\"ds-avatar\" data-component=\"avatar\">IL</span><span class=\"ds-avatar ds-avatar--4\">TO</span><span class=\"ds-avatar\">MP</span><span class=\"ds-avatar ds-avatar--4\">AR</span></span> 1,840 teachers are coming</p>\n      </div>\n      <form class=\"ds-signup\" action=\"#register\">\n        <h2 class=\"ds-signup__title\">Save your seat</h2>\n        <div class=\"ds-form__field\">\n          <label class=\"ds-form__label\" for=\"h-name\">Your name</label>\n          <input class=\"ds-form__input\" id=\"h-name\" type=\"text\" placeholder=\"As it should appear on your badge\">\n        </div>\n        <div class=\"ds-form__field\">\n          <label class=\"ds-form__label\" for=\"h-mail\">Email</label>\n          <input class=\"ds-form__input\" id=\"h-mail\" type=\"email\" placeholder=\"you@school.example\">\n        </div>\n        <a class=\"ds-button ds-button--wide\" href=\"#register\">Register, it is free</a>\n        <div class=\"ds-meter\"><div class=\"ds-meter__row\"><span class=\"ds-meter__name\">Workshop places</span><span>492 of 600 taken</span></div><span class=\"ds-progress\" data-component=\"progress\"><span class=\"ds-progress__bar ds-progress__bar--82\"></span></span></div>\n        <p class=\"ds-signup__note\">Talks are open to all. Workshops are small and fill up.</p>\n      </form>\n    </div>\n  </div>\n\n  <div class=\"ds-section ds-section--first\">\n    <div class=\"ds-wrap ds-about\">\n      <div>\n        <div class=\"ds-section__head\">\n          <p class=\"ds-section__kicker\">What it is</p>\n          <h2 class=\"ds-section__title\">A conference you can attend from the staff room</h2>\n          <p class=\"ds-section__lead\">Short talks in the morning, hands-on workshops after lunch, and every recording is yours the same evening.</p>\n        </div>\n        <ul class=\"ds-points\">\n          <li class=\"ds-points__item\">Three tracks: planning a course, filming it, keeping learners going</li>\n          <li class=\"ds-points__item\">Live captions in four languages</li>\n          <li class=\"ds-points__item\">Questions answered by the speaker, not a moderator</li>\n        </ul>\n        <a class=\"ds-link ds-link--more\" href=\"#agenda\">See the whole programme</a>\n      </div>\n      <div class=\"ds-stat\" data-component=\"stats\">\n        <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">24</p><p class=\"ds-stat__label\">talks of twenty minutes</p></div>\n        <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">6</p><p class=\"ds-stat__label\">workshops of 100 places</p></div>\n        <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">31</p><p class=\"ds-stat__label\">speakers from 12 countries</p></div>\n        <div class=\"ds-stat__item\"><p class=\"ds-stat__figure\">0</p><p class=\"ds-stat__label\">cost of a ticket</p></div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-section ds-section--alt\">\n    <div class=\"ds-wrap\">\n      <div class=\"ds-section__head\">\n        <p class=\"ds-section__kicker\">Speakers</p>\n        <h2 class=\"ds-section__title\">People who teach for a living</h2>\n      </div>\n      <div class=\"ds-grid\" data-component=\"grid\">\n        <div class=\"ds-grid__cell\">\n          <div class=\"ds-grid__top\"><span class=\"ds-avatar ds-avatar--face ds-avatar--2\">IL</span><span class=\"ds-badge ds-badge--quiet\">Keynote</span></div>\n          <div class=\"ds-grid__body\">\n            <h3 class=\"ds-grid__title\">Ingrid Lindqvist</h3>\n            <p class=\"ds-grid__meta\">Teaches illustration to 9,000 learners</p>\n            <p class=\"ds-grid__text\">The first five minutes: why most learners leave before lesson two.</p>\n            <a class=\"ds-link ds-link--more\" href=\"#session\">Her talk</a>\n          </div>\n        </div>\n        <div class=\"ds-grid__cell\">\n          <div class=\"ds-grid__top ds-grid__top--3\"><span class=\"ds-avatar ds-avatar--face ds-avatar--4\">TO</span><span class=\"ds-badge ds-badge--quiet\">Filming</span></div>\n          <div class=\"ds-grid__body\">\n            <h3 class=\"ds-grid__title\">Tomas Okafor</h3>\n            <p class=\"ds-grid__meta\">Records woodwork lessons in a shed</p>\n            <p class=\"ds-grid__text\">Good sound with a cheap microphone and a duvet.</p>\n            <a class=\"ds-link ds-link--more\" href=\"#session\">His talk</a>\n          </div>\n        </div>\n        <div class=\"ds-grid__cell\">\n          <div class=\"ds-grid__top ds-grid__top--4\"><span class=\"ds-avatar ds-avatar--face ds-avatar--1\">MP</span><span class=\"ds-badge ds-badge--quiet\">Planning</span></div>\n          <div class=\"ds-grid__body\">\n            <h3 class=\"ds-grid__title\">Maya Prentice</h3>\n            <p class=\"ds-grid__meta\">Wrote a maths course used in 300 schools</p>\n            <p class=\"ds-grid__text\">Cut it in half: planning a course people finish.</p>\n            <a class=\"ds-link ds-link--more\" href=\"#session\">Her talk</a>\n          </div>\n        </div>\n        <div class=\"ds-grid__cell\">\n          <div class=\"ds-grid__top ds-grid__top--2\"><span class=\"ds-avatar ds-avatar--face\">AR</span><span class=\"ds-badge ds-badge--quiet\">Learners</span></div>\n          <div class=\"ds-grid__body\">\n            <h3 class=\"ds-grid__title\">Ana Reyes</h3>\n            <p class=\"ds-grid__meta\">Runs a language school with no classroom</p>\n            <p class=\"ds-grid__text\">Homework people hand in: what we changed in week three.</p>\n            <a class=\"ds-link ds-link--more\" href=\"#session\">Her talk</a>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-section\">\n    <div class=\"ds-wrap ds-cols ds-cols--half\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Day one at a glance</h2><a class=\"ds-link ds-link--more\" href=\"#agenda\">Programme</a></div>\n        <div class=\"ds-panel__body\">\n          <ul class=\"ds-list\" data-component=\"list\">\n            <li class=\"ds-list__item ds-slot\">\n              <span class=\"ds-slot__time\">09:30</span>\n              <div><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#session\">The first five minutes</a><span class=\"ds-badge\">Keynote</span></div><p class=\"ds-list__meta\">Ingrid Lindqvist, main stage</p></div>\n            </li>\n            <li class=\"ds-list__item ds-slot\">\n              <span class=\"ds-slot__time\">10:15</span>\n              <div><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#session\">Cut it in half</a><span class=\"ds-badge ds-badge--alt\">Planning</span></div><p class=\"ds-list__meta\">Maya Prentice, 20 minutes and questions</p></div>\n            </li>\n            <li class=\"ds-list__item ds-slot\">\n              <span class=\"ds-slot__time\">11:00</span>\n              <div><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#session\">Good sound, cheap microphone</a><span class=\"ds-badge ds-badge--alt\">Filming</span></div><p class=\"ds-list__meta\">Tomas Okafor, with a live demonstration</p></div>\n            </li>\n            <li class=\"ds-list__item ds-slot\">\n              <span class=\"ds-slot__time\">14:00</span>\n              <div><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#agenda\">Workshop: your first lesson plan</a><span class=\"ds-badge ds-badge--warning\">8 places left</span></div><p class=\"ds-list__meta\">Two hours, bring a course idea</p></div>\n            </li>\n          </ul>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-carousel\" data-component=\"carousel\">\n          <div class=\"ds-carousel__track\">\n            <blockquote class=\"ds-carousel__slide ds-quote\">\n              <p class=\"ds-quote__text\">I rewrote my opening lesson on the train home and the drop-off after week one halved. Best free day I have spent.</p>\n              <footer class=\"ds-quote__by\"><span class=\"ds-avatar\">JB</span><span><span class=\"ds-quote__name\">Jonas Berg</span>Teaches bread baking, came in 2018</span></footer>\n            </blockquote>\n            <blockquote class=\"ds-carousel__slide ds-quote\">\n              <p class=\"ds-quote__text\">The workshop was twelve of us and one patient speaker. I left with a filmed lesson, not just notes.</p>\n              <footer class=\"ds-quote__by\"><span class=\"ds-avatar\">SK</span><span><span class=\"ds-quote__name\">Sara Kim</span>Teaches spreadsheets, came in 2018</span></footer>\n            </blockquote>\n            <blockquote class=\"ds-carousel__slide ds-quote\">\n              <p class=\"ds-quote__text\">Nobody tried to sell me anything. People simply showed what worked for them and what did not.</p>\n              <footer class=\"ds-quote__by\"><span class=\"ds-avatar\">DN</span><span><span class=\"ds-quote__name\">Dele Nwosu</span>Teaches guitar, came in 2017</span></footer>\n            </blockquote>\n          </div>\n          <div class=\"ds-carousel__bar\">\n            <span>What people said last year, 1 of 3</span>\n            <span class=\"ds-carousel__dots\"><a class=\"ds-carousel__dot is-current\" href=\"#home\" aria-label=\"First\"></a><a class=\"ds-carousel__dot\" href=\"#home\" aria-label=\"Second\"></a><a class=\"ds-carousel__dot\" href=\"#home\" aria-label=\"Third\"></a></span>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Good to know</h2></div>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-accordion\" data-component=\"accordion\">\n              <details class=\"ds-accordion__item\" open>\n                <summary class=\"ds-accordion__title\">Is it really free?</summary>\n                <div class=\"ds-accordion__body\"><p>Yes. Talks and recordings cost nothing. A workshop place is free too, but there are only 100 in each.</p></div>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__title\">What if I miss a talk?</summary>\n                <div class=\"ds-accordion__body\"><p>Every talk is on your ticket page by eight the same evening, with captions.</p></div>\n              </details>\n              <details class=\"ds-accordion__item\">\n                <summary class=\"ds-accordion__title\">Do I need a chronoskin account?</summary>\n                <div class=\"ds-accordion__body\"><p>No. An email address is enough to register and to watch.</p></div>\n              </details>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-section ds-section--alt\">\n    <div class=\"ds-wrap\">\n      <div class=\"ds-cta\">\n        <h2 class=\"ds-cta__title\">See you on 12 June</h2>\n        <p class=\"ds-cta__text\">Register once and both days, all three tracks and every recording are yours.</p>\n        <div class=\"ds-buttonrow\">\n          <a class=\"ds-button ds-button--inverse\" href=\"#register\">Save my seat</a>\n          <a class=\"ds-button ds-button--ghost\" href=\"#agenda\">Read the programme</a>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"agenda\">\n  <div class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">chronoskin</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">The event</a></li>\n          <li class=\"ds-breadcrumb__current\">Programme</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Programme</h1>\n        <p class=\"ds-page-header__text\">Thirty sessions over two days. Pick what you like; nothing overlaps within a track.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#register\">Save my seat</a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-cols ds-cols--side\">\n      <div class=\"ds-stack\">\n        <nav class=\"ds-sidebar\" data-component=\"sidebar\">\n          <h2 class=\"ds-sidebar__title\">Tracks</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__item is-current\" href=\"#agenda\">All sessions <span class=\"ds-sidebar__count\">30</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#agenda\">Planning a course <span class=\"ds-sidebar__count\">9</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#agenda\">Filming it <span class=\"ds-sidebar__count\">8</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#agenda\">Keeping learners <span class=\"ds-sidebar__count\">7</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#agenda\">Workshops <span class=\"ds-sidebar__count\">6</span></a></li>\n          </ul>\n        </nav>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__text\">What the labels on a session mean.</p>\n            <div class=\"ds-badgerow\" data-component=\"badge\">\n              <span class=\"ds-badge\">Keynote</span>\n              <span class=\"ds-badge ds-badge--alt\">Talk</span>\n              <span class=\"ds-badge ds-badge--quiet\">Break</span>\n              <span class=\"ds-badge ds-badge--success\">Places free</span>\n              <span class=\"ds-badge ds-badge--warning\">Nearly full</span>\n              <span class=\"ds-badge ds-badge--danger\">Full</span>\n            </div>\n          </div>\n        </div>\n        <div class=\"ds-empty\" data-component=\"empty\">\n          <span class=\"ds-empty__icon\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 5h14v12H3z M3 9h14 M7 3v4 M13 3v4\"/></svg></span>\n          <h2 class=\"ds-empty__title\">Your schedule is empty</h2>\n          <p class=\"ds-empty__text\">Add sessions and we remind you ten minutes before each.</p>\n          <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#session\">Add the keynote</a>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-toolbar\">\n          <ul class=\"ds-tabs\" data-component=\"tabs\">\n            <li><a class=\"ds-tabs__tab is-current\" href=\"#agenda\">Wednesday 12</a></li>\n            <li><a class=\"ds-tabs__tab\" href=\"#agenda\">Thursday 13</a></li>\n            <li><a class=\"ds-tabs__tab\" href=\"#agenda\">Workshops</a></li>\n          </ul>\n          <label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Times in my time zone</span></label>\n        </div>\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Wednesday 12 June</h2><span class=\"ds-badge ds-badge--quiet\">Stockholm time</span></div>\n          <div class=\"ds-table__wrap\">\n            <table class=\"ds-table\" data-component=\"table\">\n              <thead>\n                <tr><th>Time</th><th>Session</th><th>Track</th><th class=\"ds-table__num\">Minutes</th><th class=\"ds-table__num\">Places left</th></tr>\n              </thead>\n              <tbody>\n                <tr><td>09:30</td><td><a class=\"ds-table__title\" href=\"#session\">The first five minutes</a><span class=\"ds-table__sub\">Ingrid Lindqvist</span></td><td><span class=\"ds-badge\">Keynote</span></td><td class=\"ds-table__num\">40</td><td class=\"ds-table__num\">Open</td></tr>\n                <tr><td>10:15</td><td><a class=\"ds-table__title\" href=\"#session\">Cut it in half</a><span class=\"ds-table__sub\">Maya Prentice</span></td><td><span class=\"ds-badge ds-badge--alt\">Planning</span></td><td class=\"ds-table__num\">30</td><td class=\"ds-table__num\">Open</td></tr>\n                <tr class=\"is-hover\"><td>11:00</td><td><a class=\"ds-table__title\" href=\"#session\">Good sound, cheap microphone</a><span class=\"ds-table__sub\">Tomas Okafor</span></td><td><span class=\"ds-badge ds-badge--alt\">Filming</span></td><td class=\"ds-table__num\">30</td><td class=\"ds-table__num\">Open</td></tr>\n                <tr><td>12:00</td><td>Lunch, and the hallway chat<span class=\"ds-table__sub\">Tables of eight, by subject</span></td><td><span class=\"ds-badge ds-badge--quiet\">Break</span></td><td class=\"ds-table__num\">120</td><td class=\"ds-table__num\">Open</td></tr>\n                <tr><td>14:00</td><td><a class=\"ds-table__title\" href=\"#session\">Workshop: your first lesson plan</a><span class=\"ds-table__sub\">Maya Prentice</span></td><td><span class=\"ds-badge ds-badge--warning\">Nearly full</span></td><td class=\"ds-table__num\">120</td><td class=\"ds-table__num\">8</td></tr>\n                <tr><td>14:00</td><td><a class=\"ds-table__title\" href=\"#session\">Workshop: light a room with one lamp</a><span class=\"ds-table__sub\">Tomas Okafor</span></td><td><span class=\"ds-badge ds-badge--danger\">Full</span></td><td class=\"ds-table__num\">120</td><td class=\"ds-table__num\">0</td></tr>\n              </tbody>\n            </table>\n          </div>\n          <div class=\"ds-table__foot\">\n            <span>Sessions 1 to 6 of 30</span>\n            <ul class=\"ds-pagination\" data-component=\"pagination\">\n              <li><a class=\"ds-pagination__link is-disabled\" href=\"#agenda\">Previous</a></li>\n              <li><a class=\"ds-pagination__link is-current\" href=\"#agenda\">1</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#agenda\">2</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#agenda\">3</a></li>\n              <li><a class=\"ds-pagination__link\" href=\"#agenda\">Next</a></li>\n            </ul>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"session\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">chronoskin</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#agenda\">Programme</a></li>\n          <li class=\"ds-breadcrumb__current\">Keynote</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">The first five minutes</h1>\n        <p class=\"ds-page-header__text\">Wednesday 12 June, 09:30, main stage. Forty minutes with questions.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#agenda\">Add to my schedule</a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-cols\">\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__body\">\n            <article class=\"ds-prose\" data-component=\"typography\">\n              <h1>Why most learners leave before lesson two</h1>\n              <p class=\"ds-prose__lead\">Half of the people who start an online course never open its second lesson. Ingrid has watched nine thousand of them go, and found that the reason is almost always in the first five minutes.</p>\n              <h2>What the talk covers</h2>\n              <p>The opening of a course has one job: to let the learner make something small before the doubt arrives. Ingrid shows three openings of her own, two that failed and one that kept <strong>eight in ten</strong> learners.</p>\n              <h3>You will leave with</h3>\n              <ul>\n                <li>A five-minute opening you can film this week</li>\n                <li>The one sentence to cut from every welcome</li>\n                <li>A way to measure it: look for <code>lesson_2_opened</code> in your reports</li>\n              </ul>\n              <h3>Who it is for</h3>\n              <p>Anyone with a course that is planned or already running. No equipment and no experience of filming needed.</p>\n            </article>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Later in this track</h2></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item ds-slot\">\n                <span class=\"ds-slot__time\">10:15</span>\n                <div><a class=\"ds-list__title\" href=\"#session\">Cut it in half</a><p class=\"ds-list__meta\">Maya Prentice on planning a course people finish</p></div>\n              </li>\n              <li class=\"ds-list__item ds-slot\">\n                <span class=\"ds-slot__time\">14:00</span>\n                <div><a class=\"ds-list__title\" href=\"#agenda\">Workshop: your first lesson plan</a><p class=\"ds-list__meta\">Two hours, 8 places left</p></div>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-speaker\"><span class=\"ds-avatar ds-avatar--face ds-avatar--2\">IL</span><div><h2 class=\"ds-speaker__name\">Ingrid Lindqvist</h2><p class=\"ds-speaker__role\">Illustrator and teacher, Gothenburg</p></div></div>\n            <p class=\"ds-panel__text\">Ingrid has taught drawing online since 2014. Her beginners' course has been finished by more people than started her first three together.</p>\n            <ul class=\"ds-rows\">\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Captions</span><span>4 languages</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Recording <span class=\"ds-tooltip ds-tooltip--mark\" tabindex=\"0\" data-component=\"tooltip\">?<span class=\"ds-tooltip__text\">On your ticket page by eight the same evening.</span></span></span><span class=\"ds-badge ds-badge--success\">Yes</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Level</span><span>Everyone</span></li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Her workshop</h2><span class=\"ds-badge ds-badge--warning\">Nearly full</span></div>\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__text\">Film your opening, Thursday at 14:00. Twelve people at a table, one speaker each.</p>\n            <div class=\"ds-meter\"><div class=\"ds-meter__row\"><span class=\"ds-meter__name\">Places</span><span>90 of 100 taken</span></div><span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--90\"></span></span></div>\n          </div>\n        </div>\n        <p class=\"ds-notice\"><span class=\"ds-notice__title\">Starts at 09:30 sharp.</span> The room opens ten minutes before.</p>\n        <nav class=\"ds-sidebar\">\n          <h2 class=\"ds-sidebar__title\">Related</h2>\n          <ul class=\"ds-linkrow\" data-component=\"links\">\n            <li><a class=\"ds-link\" href=\"#agenda\">The planning track</a></li>\n            <li><a class=\"ds-link is-visited\" href=\"#session\">Her talk from 2018</a></li>\n            <li><a class=\"ds-link is-hover\" href=\"#agenda\">All keynotes</a></li>\n            <li><a class=\"ds-link is-active\" href=\"#register\">Register</a></li>\n          </ul>\n        </nav>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"register\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-wrap ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">chronoskin</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#home\">The event</a></li>\n          <li class=\"ds-breadcrumb__current\">Register</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Save your seat</h1>\n        <p class=\"ds-page-header__text\">One short form. Your ticket and a calendar file arrive by email at once.</p>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"ds-main\">\n    <div class=\"ds-wrap ds-cols ds-cols--even\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">About you</h2><a class=\"ds-link\" href=\"#register\">I have a ticket already</a></div>\n        <div class=\"ds-panel__body\">\n          <form class=\"ds-form\" data-component=\"form\" action=\"#register\">\n            <div class=\"ds-noticerow\" data-component=\"notice\">\n              <p class=\"ds-notice\"><span class=\"ds-notice__title\">Free, and no card.</span> We only ask what the speakers need to know.</p>\n              <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not saved yet.</span> One field below needs another look.</p>\n            </div>\n            <div class=\"ds-form__row\">\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"r-name\">Your name</label>\n                <input class=\"ds-form__input\" id=\"r-name\" type=\"text\" value=\"Jonas Berg\">\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"r-mail\">Email</label>\n                <input class=\"ds-form__input is-error\" id=\"r-mail\" type=\"email\" value=\"jonas@bread\">\n                <span class=\"ds-form__error\">This address is missing its ending, such as .com or .se.</span>\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"r-teach\">What do you teach?</label>\n                <input class=\"ds-form__input\" id=\"r-teach\" type=\"text\" placeholder=\"Bread baking, for beginners\">\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"r-shop\">Workshop</label>\n                <select class=\"ds-form__select\" id=\"r-shop\"><option>Your first lesson plan (8 left)</option><option>Film your opening (10 left)</option><option>No workshop, talks only</option></select>\n                <span class=\"ds-form__hint\">One workshop each, so that everyone gets a place.</span>\n              </div>\n            </div>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"r-ask\">A question for the speakers (optional)</label>\n              <textarea class=\"ds-form__textarea\" id=\"r-ask\" placeholder=\"The best ones are answered on stage\"></textarea>\n            </div>\n            <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Remind me the day before and ten minutes before</label>\n            <div class=\"ds-form__actions\" data-component=\"buttons\">\n              <button class=\"ds-button\" type=\"submit\">Get my ticket</button>\n              <a class=\"ds-button ds-button--secondary\" href=\"#agenda\">Back to the programme</a>\n              <button class=\"ds-button ds-button--danger\" type=\"button\">Cancel my ticket</button>\n              <button class=\"ds-button is-disabled\" type=\"button\" disabled>Send it again</button>\n            </div>\n          </form>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Your ticket</h2><span class=\"ds-badge ds-badge--success\">Free</span></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-rows\">\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Both days of talks</span><span>24 talks</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">One workshop</span><span>2 hours</span></li>\n              <li class=\"ds-rows__item\"><span class=\"ds-rows__name\">Recordings</span><span>For a year</span></li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"ds-dialog\" data-component=\"dialog\">\n          <div class=\"ds-dialog__box\" role=\"dialog\" aria-labelledby=\"r-dialog\">\n            <div class=\"ds-dialog__head\"><h2 class=\"ds-dialog__title\" id=\"r-dialog\">Give up your place?</h2><a class=\"ds-dialog__close\" href=\"#register\" aria-label=\"Close\"></a></div>\n            <div class=\"ds-dialog__body\"><p>Your workshop place goes to the next person waiting. You can still watch every talk.</p></div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#register\">Keep my place</a>\n              <a class=\"ds-button ds-button--danger ds-button--small\" href=\"#home\">Give it up</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-wrap\">\n    <a class=\"ds-brand\" href=\"#home\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"13.6\" cy=\"10\" r=\"7.6\" opacity=\".45\"/><circle cx=\"9.2\" cy=\"15\" r=\"5.8\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <ul class=\"ds-footer__list\">\n      <li><a class=\"ds-footer__link\" href=\"#home\">The event</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#agenda\">Programme</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#session\">Sessions</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#register\">Register</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#home\">Code of conduct</a></li>\n    </ul>\n    <p class=\"ds-footer__legal\">The chronoskin conference, 12 and 13 June 2019. Made by a small team that builds tools for online courses.</p>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.saas-gradient.landing.s08.p03.t01.u07\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"saas-gradient\",\n    \"years\": [\n      2016,\n      2021\n    ]\n  },\n  \"archetype\": \"landing\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": false,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-sg-8317\",\n  \"short\": \"v1-sg-8317\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #f8f5f3;\n  --color-canvas: #f8f5f3;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f3f0ee;\n  --color-surface-strong: #eae4df;\n  --color-bar: #f3f0ee;\n  --color-bar-text: #46585c;\n  --color-bar-alt: #17262b;\n  --color-bar-alt-text: #c8d3d5;\n  --color-inverse: #fb5a62;\n  --color-inverse-text: #ffffff;\n  --color-text: #46585c;\n  --color-text-muted: #8d9a9c;\n  --color-heading: #17262b;\n  --color-heading-alt: #2f4347;\n  --color-link: #f0336b;\n  --color-link-quiet: #5b6c70;\n  --color-link-visited: #b8517f;\n  --color-link-hover: #f27a3e;\n  --color-link-active: #c22f62;\n  --color-border: #e6dfd9;\n  --color-border-strong: #cbc2ba;\n  --color-border-muted: #f1ebe6;\n  --color-accent: #f27a3e;\n  --color-accent-text: #ffffff;\n  --color-accent-alt: #7b5fd3;\n  --color-fill-1: #ff3d6e;\n  --color-fill-2: #ff9440;\n  --color-fill-3: #7b5fd3;\n  --color-fill-4: #23b5a3;\n  --color-button: #5b4bd6;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #17262b;\n  --color-input: #ffffff;\n  --color-input-text: #17262b;\n  --color-input-border: #cbc2ba;\n  --color-disabled: #efe8e3;\n  --color-disabled-text: #a9a29c;\n  --color-danger: #d6344a;\n  --color-danger-surface: #fdf0f1;\n  --color-success: #23a586;\n  --color-warning: #eda02b;\n  --color-notice: #fff1e6;\n  --color-notice-text: #9a4a17;\n  --color-focus: #5b4bd6;\n  --color-shadow: rgb(23 38 43 / 0.1);\n  --color-overlay: rgb(23 38 43 / 0.6);\n}\n\n/* @part type */\n:root {\n  --font-body: \"Nunito Sans\", \"Avenir Next\", Avenir, \"Segoe UI\", sans-serif;\n  --font-heading: \"Nunito Sans\", \"Avenir Next\", Avenir, \"Segoe UI\", sans-serif;\n  --font-ui: \"Nunito Sans\", \"Avenir Next\", Avenir, \"Segoe UI\", sans-serif;\n  --font-mono: \"Source Code Pro\", Menlo, Consolas, monospace;\n  --text-base: 17px;\n  --text-small: 13px;\n  --text-ui: 15px;\n  --text-large: 21px;\n  --text-display: 46px;\n  --text-h1: 36px;\n  --text-h2: 26px;\n  --text-h3: 18px;\n  --line-body: 1.65;\n  --line-heading: 1.3;\n  --line-display: 1.2;\n  --weight-body: 400;\n  --weight-bold: 600;\n  --weight-heading: 500;\n  --weight-display: 500;\n  --weight-ui: 600;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: -0.3px;\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: 3px;\n  --border-style: solid;\n  --radius-control: 4px;\n  --radius-panel: 6px;\n  --radius-pill: 3px;\n  --radius-page: 10px;\n  --shadow-panel: 0 1px 2px var(--color-shadow), 0 12px 24px -12px var(--color-shadow);\n  --shadow-control: 0 1px 2px var(--color-shadow), inset 0 -2px 0 color-mix(in srgb, black 12%, transparent);\n  --shadow-control-hover: 0 4px 10px var(--color-shadow), inset 0 -2px 0 color-mix(in srgb, black 12%, transparent);\n  --shadow-control-pressed: inset 0 2px 3px color-mix(in srgb, black 18%, transparent);\n  --shadow-dialog: 0 0 0 1px var(--color-border-muted), 0 30px 60px -20px var(--color-shadow), 0 18px 36px -18px var(--color-shadow);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: linear-gradient(to right, var(--color-bar-alt), color-mix(in srgb, var(--color-bar-alt) 90%, white));\n  --fill-inverse: linear-gradient(115deg, var(--color-fill-1) 30%, var(--color-fill-2) 115%);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: linear-gradient(to right, var(--color-button), color-mix(in srgb, var(--color-button) 82%, white));\n  --fill-button-hover: linear-gradient(to right, color-mix(in srgb, var(--color-button) 90%, black), var(--color-button));\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px solid color-mix(in srgb, var(--color-focus) 50%, transparent);\n  --transition: background-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;\n  --backdrop-blur: 0px;\n}\n"
  }
}
