{
  "id": "v1-gl-7665",
  "long_id": "v1.glassmorphism.app.s07.p06.t06.u05",
  "name": "Glassmorphism weather app",
  "era": {
    "slug": "glassmorphism",
    "code": "gl",
    "name": "Glassmorphism",
    "years": [
      2020,
      2026
    ],
    "description": "Frosted glass, 2020 to 2026: translucent panels with a blurred backdrop, a thin light border and a soft shadow, floating over a colourful gradient."
  },
  "archetype": "app",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": false,
    "responsive": true
  },
  "summary": "Glassmorphism is the frosted-glass interface style of 2020 to 2026: translucent cards with a blurred backdrop, a thin light edge and a soft shadow, floating over a field of colour. Weather and wallet apps of those years used it in its plainest form: no bar at all, the navigation written straight on the sky, one glass card for the present reading and a column of smaller cards under it. This pack is that weather app, on a deep teal night with bands of green, violet and blue light, pale mint buttons and an amber accent.",
  "url": "https://chrono.skin/s/v1-gl-7665",
  "preview_url": "https://chrono.skin/s/v1-gl-7665/specimen.html",
  "files": {
    "STYLE.md": "# Glassmorphism weather app\n\n## Summary\n\nGlassmorphism is the frosted-glass interface style of 2020 to 2026: translucent cards with a blurred backdrop, a thin light edge and a soft shadow, floating over a field of colour. Weather and wallet apps of those years used it in its plainest form: no bar at all, the navigation written straight on the sky, one glass card for the present reading and a column of smaller cards under it. This pack is that weather app, on a deep teal night with bands of green, violet and blue light, pale mint buttons and an amber accent.\n\n## Layout\n\n- Content column: `--size-page` (1080px), centred, with `--space-4` (22px) side padding below that width. The backdrop (`--fill-page` on `.ds-page`) fills the viewport; only the column is capped.\n- Navigation: there is no bar. `.ds-nav` is a three-part row on the backdrop: the brand at the left, a centred row of text links whose current item carries a 3px rule in the accent colour, and at the right a pill-shaped search field and the account avatar. One link opens a `.ds-menu`. The row and the footer are written once, around the views.\n- Home page, top to bottom: the hero (a `--size-now` (320px) glass card with the present reading at the left, title, lead and two buttons on the backdrop at the right); the hour-by-hour `.ds-carousel` across the full column; then `.ds-page__layout`, a main column with a `--size-side` (300px) column on the right. The main column holds the four reading tiles (`.ds-grid`), a `.ds-page__heading` and the list of coming days; the side column holds the saved places (`.ds-sidebar`), the inverted daylight panel and a notice. Both columns should end near each other.\n- Inner pages have no hero. Under the navigation come the `.ds-breadcrumb` and, 8px below it, the `.ds-page-header` on the backdrop: title at `--text-h1` and one muted line on the left, at most two buttons on the right. Below it either one `.ds-page__main` stack across the full column (the `.ds-stat` cards, the `.ds-tabs` pills, the table, its pagination and a `.ds-page__note`), or `.ds-page__layout--even` (two equal columns, for lists beside forms), or `.ds-page__layout--flush` (main column and the 300px side column, for reading pages).\n- Views: the specimen is one site with four screens, one showing at a time. `today` is the home view. `forecast` is the week: four figures, the tabs, the table of seven days and the pagination by week. `places` is the working screen: notices, the saved places with their status, the open dialog that removing a place raises and the empty list of sent alerts on the left; the form for a new place and the alert switches on the right. `guide` is the reading page: running text with the link states and an accordion of questions beside a contents sidebar, the author and the units. Each view is a `.ds-view` section; `.ds-nav__link` is marked current from the address.\n- Spacing scale: `--space-1` 4px (inside tiles, between pagination cells), `--space-2` 8px (label to control, between tabs, icon to text), `--space-3` 14px (row padding, tile padding and the gap between tiles and between stat cards, gaps between buttons), `--space-4` 22px (panel padding, the gap between every pair of neighbouring cards and between the columns), `--space-5` 36px (hero bottom padding, gap before an h2), `--space-6` 56px (gap between the present card and the hero text, dialog padding, gap above the footer), `--space-7` 92px (textarea height only).\n- Glass: cards use `backdrop-filter: blur(var(--backdrop-blur))` (20px in this pack's surface set); menus, dialogs and the error notice use three times that with `saturate(180%)`. Never put a blurred element inside another; hour cells, switches and inputs inside a card are plain translucent fills.\n- Below 900px the hero and every two-column layout stack, and the tiles and stat cards go two by two. Below 720px the navigation wraps: brand, search and avatar on the first row, the links spread across a second; the hero title drops to `--text-h1`, the hours show four to a row, columns marked `.ds-table__opt` are hidden and the page header's buttons move under its text. Nothing scrolls sideways at 390px except the carousel's own track.\n- On a phone (720px and below) the row of `.ds-nav__inner` wraps: the brand and `.ds-nav__tools` (the search pill, which keeps its room, and the avatar) on the first row and `.ds-nav__list` spread across the second. A `.ds-menu` among the links opens aligned to its right edge. There is no menu button. A tooltip on a form label opens at the left edge of the label, at most 26 characters wide.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\n- `--font-body` and `--font-ui` are the system sans; `--font-heading` is its display cut (SF Pro Display, Segoe UI Variable Display, then Helvetica Neue), used light. The references set their titles in commercial grotesques at light and medium weights; these are the closest system stacks. `--font-mono` is for code and key names.\n- Sizes: `--text-base` 15px body, `--text-ui` 14px for controls, navigation, rows and card text, `--text-small` 12px for meta text, badges and uppercase labels, `--text-large` 19px for the hero lead, the brand and prose leads, `--text-h3` 17px (card and tile titles, set bold), `--text-h2` 26px (section headings, dialog title), `--text-h1` 34px (page title, stat figures), `--text-display` 72px for the hero title only.\n- Weights: 400 body and headings, 300 for the display size and the stat figures (`--weight-display`), 500 controls (`--weight-ui`), 600 bold and small titles. Display text is tracked -0.02em and set solid (`--line-display` 1).\n- Links in running text are `--color-link` (pink) and underlined (`--link-decoration`); titles, rows and navigation are `--color-link-quiet` with no underline.\n- Uppercase is used only on small labels: `.ds-sidebar__heading`, `.ds-stat__label`, `.ds-form__group-title` and table head cells, written in the component.\n- Text is `--color-text` on glass, `--color-text-muted` for meta and card text, `--color-heading-alt` for uppercase labels.\n- Glass: `--fill-panel` for cards. `--color-surface` is chips and pagination cells, `--color-surface-alt` the current row, the current navigation and sidebar item and key caps, `--color-surface-strong` progress and slider tracks and hovered controls.\n- Bar glass: `--fill-bar` with `--color-bar-text` for the navigation card, the player bar and code blocks; `--fill-bar-alt` with `--color-bar-alt-text` for the table head, status badges and the footer.\n- `--fill-inverse` with `--color-inverse-text` is the small `.ds-page__promo` card only; a button on it is `.ds-button--inverse`, which swaps the two colours.\n- `--color-fill-1` to `--color-fill-4` (magenta, blue, orange, green) are the points of colour in the backdrop, the cover art (`.ds-hero__cover`, `.ds-page-header__art`) and, at 55% under glass, the tints of album tiles and row thumbnails.\n- `--color-button` is hot pink with near-black text: primary buttons, the brand tile, the current tab, the current page and the play button. `--color-accent` (amber) is badges, progress, the checked box and the 3px marker of the current navigation item and of a notice (`--border-width-strong`). `--color-accent-alt` (blue) marks \"new\".\n- Status colours appear as a ring and a dot on status badges, as the edge and title of an error, and at 70% as the tint of the destructive button; never as large fills.\n- Shadows: `--shadow-panel` on cards (in this surface set an inner glow and a short drop), `--shadow-dialog` on the hero, the dialog box and the player bar, `--shadow-control` on buttons and inputs. `--shadow-text` is on the brand, the hero title, page titles and stat figures (here a soft halo of the accent).\n- One-off values with no token: `saturate(180%)` and `saturate(160%)` on the strongest glass, tints and the destructive button through `color-mix()` with `transparent`, the grooves of `.ds-grid__art` (a repeating radial gradient of `--color-border-muted`), `calc(var(--radius-page) - var(--space-3))` for the inner corner of a tile, and `opacity` on the navigation note, tab counts and the player's second line.\n\n## Components\n\n- `.ds-page`: on `<body>`; paints the backdrop and sets the base type. `.ds-page__inner` is the width container, `.ds-page__layout` the main-plus-side grid (`--even` for two equal columns, `--flush` without the top margin), `.ds-page__main` and `.ds-page__side` vertical stacks, `.ds-page__heading` a small heading on the backdrop with an optional link or badge at its right end, `.ds-page__note` a centred small line under a table. `.ds-view` is one screen of the specimen; in an application each is its own document.\n- `.ds-nav`: the row on the backdrop. `.ds-nav__list` holds `.ds-nav__link` items; the current one is `is-current` (the specimen sets it from the address). `.ds-nav__tools` holds `.ds-nav__search` (a `.ds-form__input` made a pill, with `.ds-nav__search-icon`) and the account `.ds-avatar`.\n- `.ds-brand`: the site's mark and name at the left of the navigation: `.ds-brand__mark` is a small tile dressed like the primary button (`--fill-button`, `--color-button-text`, a 1px `--color-border` edge, `--radius-control`, `--shadow-control`) holding the mark as inline SVG, `.ds-brand__name` the name in the heading font at `--text-h3`. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo.\n- `.ds-hero`: the home page's introduction. `.ds-hero__now` is the glass card of the present reading (`.ds-hero__place`, `.ds-hero__reading` with `.ds-hero__figure` and `.ds-hero__glyph`, `.ds-hero__caption`, and `.ds-hero__facts` with `.ds-hero__fact` and `.ds-hero__fact-label`); `.ds-hero__text` holds `.ds-hero__title`, `.ds-hero__lead` and `.ds-hero__actions`. Use it once, on the home page.\n- `.ds-page-header`: head of an inner page: `.ds-page-header__text` with `.ds-page-header__title` and `.ds-page-header__lead`, and `.ds-page-header__actions` at the right. No fill of its own. The breadcrumb goes directly above it.\n- `.ds-prose`: running text: h1 to h3, paragraphs, lists, inline `code`; `.ds-prose__lead` for a lead paragraph, `.ds-prose__code` for a code block. Put it inside a `.ds-panel`.\n- `.ds-link`: link in running text; states `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-link--quiet` for undecorated links in tables and titles. `.ds-link__sample` lays several out in a row.\n- `.ds-button`: primary, a pale solid pill 40px high. `.ds-button--secondary` is glass with a light edge; `.ds-button--danger` is the destructive action, tinted with `--color-danger`, used once at the end of a group or as the confirming button of a dialog; `.ds-button--large` for the hero; `is-disabled` or `disabled` for the disabled state. `.ds-button__row` lays buttons out. One primary button per group.\n- `.ds-form`: vertical form inside a panel. `.ds-form__field` wraps a `.ds-form__label` and a control: `.ds-form__input`, `.ds-form__textarea`, `.ds-form__select` (in `.ds-form__select-wrap` with a `.ds-form__chevron`), `.ds-form__range`, `.ds-form__check` with `.ds-form__checkbox`. An invalid input takes `is-error` and is followed by `.ds-form__error`; `.ds-form__hint` is help text; `.ds-form__actions` holds the buttons.\n- `.ds-table`: one sheet of glass with a `--fill-bar` head and hairline rows. `.ds-table__num` right-aligns figures, `.ds-table__opt` marks a column hidden on a phone, `.ds-table__meta` is muted text.\n- `.ds-list`: rows in one sheet of glass. `.ds-list__item` holds an optional `.ds-list__icon`, a `.ds-list__body` (`.ds-list__title`, `.ds-list__meta`), an optional badge and a `.ds-list__value` figure (with `.ds-list__value-low` for the lower of a pair). `.ds-list__dot` is a status dot.\n- `.ds-panel`: the basic sheet of glass: `.ds-panel__title` strip, `.ds-panel__body`. `.ds-panel--dark` is the bar-coloured variant, `.ds-panel--inverse` the inverted block (pale on this palette) for one fact that should stand out. `.ds-panel__pair` with `.ds-panel__pair-value` is a label and its value on one line; `.ds-panel__text` a closing paragraph.\n- `.ds-grid`: four tinted glass tiles, one reading each. `.ds-grid__cell` with `--1` to `--4` takes its tint from `--color-fill-*`; inside, `.ds-grid__label`, `.ds-grid__value`, `.ds-grid__meta` and a `.ds-progress` at the foot.\n- `.ds-stat`: the row of figures on an inner page; `.ds-stat` is the row and each `.ds-stat__item` a separate small glass card with `.ds-stat__label`, `.ds-stat__value` and a `.ds-stat__meta` line under the figure. Three or four items.\n- `.ds-tabs`: a row of separate pills on `--fill-bar-alt`; `.ds-tabs__tab` with `is-current` filled with the accent. For switching what a page shows, not for site navigation.\n- `.ds-badge`: pill for counts and markers in the accent; `.ds-badge--alt` for \"new\", `.ds-badge--glass` for quiet labels, and the status labels `.ds-badge--success`, `.ds-badge--warning`, `.ds-badge--danger`: a `--fill-bar-alt` pill with a 1px ring and a dot in the status colour.\n- `.ds-sidebar`: glass block in the side column: `.ds-sidebar__heading`, `.ds-sidebar__list`, `.ds-sidebar__link` with `is-current`, and `.ds-sidebar__value` for a figure at the right of a link.\n- `.ds-notice`: information notice on `--color-notice`; `.ds-notice--error` on `--color-danger-surface` with a danger border, icon and title. `.ds-notice__icon`, `.ds-notice__title`; `.ds-notice__stack` stacks several.\n- `.ds-pagination`: centred row of small glass cells, `.ds-pagination__link`; the current page is `is-current` and takes the primary button fill, `is-disabled` greys an end.\n- `.ds-breadcrumb`: small trail above the page header, `.ds-breadcrumb__item` separated by slashes, `.ds-breadcrumb__link` for the linked levels.\n- `.ds-dialog`: a dimmed sheet (`--color-overlay`) with a centred `.ds-dialog__box` of the strongest glass: `.ds-dialog__title`, `.ds-dialog__body`, `.ds-dialog__actions`.\n- `.ds-empty`: empty state on a glass panel: `.ds-empty__icon`, `.ds-empty__title`, `.ds-empty__text` and one secondary button.\n- `.ds-footer`: a floating strip of glass at the end of the column, `.ds-footer__inner` with `.ds-footer__links` and `.ds-footer__link`.\n- `.ds-menu`: a drop-down under a navigation item, shown on hover or focus (or with `is-open`): `.ds-menu__trigger` with a `.ds-menu__caret`, `.ds-menu__list` of the strongest glass, `.ds-menu__link` rows with an optional `.ds-menu__meta` at the right.\n- `.ds-accordion`: one sheet of glass of `<details>` sections: `.ds-accordion__item`, `.ds-accordion__summary` with a chevron that turns when open, `.ds-accordion__body`. For questions and help.\n- `.ds-tooltip`: a round hint mark beside a label; `.ds-tooltip__tip` is an inverted block above it, shown on hover or focus (or with `is-open`). Keep the tip to one sentence.\n- `.ds-carousel`: one slide showing in a sheet of glass: `.ds-carousel__head` (a `--fill-bar` strip with the title and `.ds-carousel__arrows` of `.ds-carousel__arrow` buttons), `.ds-carousel__track` of `.ds-carousel__slide` items that snap as they scroll, and `.ds-carousel__dots` with `.ds-carousel__dot`, the current one `is-current`. Here a slide is `.ds-carousel__hours`: eight `.ds-carousel__hour` cells with `.ds-carousel__time`, `.ds-carousel__glyph`, `.ds-carousel__temp` and `.ds-carousel__rain`; the present hour is `is-current`.\n- `.ds-switch`: an on/off row: `.ds-switch__text` with a `.ds-switch__hint`, the hidden `.ds-switch__input` checkbox and the drawn `.ds-switch__track`, which takes the accent fill when on. Consecutive switches are divided by a hairline.\n- `.ds-progress`: a thin track with a `.ds-progress__bar` in the accent fill; width classes `--15`, `--25`, `--40`, `--65`, `--75`, `--90`. `.ds-progress__label` is an optional line above it.\n- `.ds-avatar`: a round account picture drawn from initials, in the accent fill; `--2` to `--4` take a tint from `--color-fill-*`, `--large` is the profile size. `.ds-avatar__row` sets it beside `.ds-avatar__name` and `.ds-avatar__meta`.\n\n## Never\n\n- `row-gap <= 4px`: rows of a table or list touch and are divided by a hairline.\n- `block-gap <= 56px`: neighbouring cards sit 22px apart; 56px is the largest gap on the page.\n- `content-width <= 1080px`: the column is capped while the backdrop fills the viewport.\n- `font-size <= 72px`: the hero title is the largest text.\n- `font-size >= 12px`: meta text and badges are the smallest text.\n- `font-weight <= 600`: titles are light or regular; 600 is for small titles and bold.\n- `font-families <= 3`: the system sans, its display cut and one monospace.\n- `line-height <= 1.5`: body text is set at 1.45.\n- `letter-spacing <= 1.5px`: only the display size is tracked, tightened by 2% of its size (1.4px at 72px); nothing is spaced out.\n- `uppercase-text <= 10%`: uppercase is for small labels only.\n- `border-width <= 2px`: edges are 1px hairlines; 2px is the hero card and the featured plan.\n- `border-radius <= 40px`: cards are 24px, the hero, tiles and bands 36px; only pills go higher.\n- `box-shadow-blur <= 96px`: card shadows blur 60px, the hero, the pill and the dialog 96px.\n- `text-shadow = none`: no text shadow anywhere.\n- `gradient-fills <= 40%`: one soft fade per card and nothing else; controls, rows and bars are flat.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: a new container starts from `.ds-panel` (fill, 1px edge, radius, shadow and blur together, never one without the others), a new control from `.ds-button--secondary` or `.ds-form__input`, a new overlay from `.ds-menu__list` or `.ds-dialog__box`, a new reading from a `.ds-grid__cell`. Use tokens only; for a shade or size with no token use `color-mix()` over tokens with `transparent`, or `calc()` over `--space-*` and `--size-*`. Keep opaque fills to buttons, badges and the one inverted panel, keep the navigation free of any bar, and place glass only where the backdrop behind it has colour to show through.\n",
    "components.css": "/* Layout tokens (structure part) */\n:root {\n  --size-page: 1080px;\n  --size-side: 300px;\n  --size-now: 320px;\n  --size-search: 200px;\n  --size-dialog: 440px;\n  --size-control: 40px;\n  --size-glyph: 56px;\n  --size-icon: 18px;\n  --size-dot: 8px;\n  --size-thumb: 20px;\n  --size-track: 4px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 14px;\n  --space-4: 22px;\n  --space-5: 36px;\n  --space-6: 56px;\n  --space-7: 92px;\n}\n\n/* shell: the sky fills the viewport, everything sits in one centred column */\n.ds-page {\n  margin: 0;\n  min-height: 100vh;\n  background: var(--fill-page);\n  background-color: var(--color-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.ds-page__inner {\n  width: 100%;\n  max-width: calc(var(--size-page) + 2 * var(--space-4));\n  margin: 0 auto;\n  padding: 0 var(--space-4);\n}\n.ds-page__layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) var(--size-side);\n  gap: var(--space-4);\n  align-items: start;\n  margin-top: var(--space-4);\n}\n.ds-page__layout--even {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  margin-top: 0;\n}\n.ds-page__layout--flush {\n  margin-top: 0;\n}\n.ds-page__main,\n.ds-page__side {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n  min-width: 0;\n}\n.ds-page__heading {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin: var(--space-2) 0 calc(-1 * var(--space-2));\n  color: var(--color-heading-alt);\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-page__heading .ds-link {\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-page__note {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  text-align: center;\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.ds-page__icon {\n  width: var(--size-icon);\n  height: var(--size-icon);\n  flex: none;\n}\n\n/* nav: no bar; brand, a centred row of text links and the tools sit straight on the sky */\n.ds-nav {\n  position: relative;\n  z-index: 4;\n  color: var(--color-text);\n}\n.ds-nav__inner {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n  align-items: center;\n  gap: var(--space-4);\n  max-width: calc(var(--size-page) + 2 * var(--space-4));\n  min-height: calc(var(--size-control) + 2 * var(--space-4));\n  margin: 0 auto;\n  padding: 0 var(--space-4);\n}\n.ds-brand {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  justify-self: start;\n  color: var(--color-heading);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: calc(var(--size-control) - var(--space-2));\n  height: calc(var(--size-control) - var(--space-2));\n  flex: none;\n  padding: var(--space-1);\n  background-color: var(--color-button);\n  background: var(--fill-button);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  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  text-shadow: var(--shadow-text);\n}\n.ds-nav__list {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration-quiet);\n  text-transform: var(--ui-transform);\n  text-shadow: var(--shadow-text);\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  border-bottom-color: var(--color-border-strong);\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#today\"],\n.ds-page:has(#today:target) .ds-nav__link[href=\"#today\"],\n.ds-page:has(#forecast:target) .ds-nav__link[href=\"#forecast\"],\n.ds-page:has(#places:target) .ds-nav__link[href=\"#places\"],\n.ds-page:has(#guide:target) .ds-nav__link[href=\"#guide\"] {\n  border-bottom-color: var(--color-accent);\n  color: var(--color-heading);\n}\n.ds-nav__tools {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  min-width: 0;\n}\n.ds-nav__search {\n  position: relative;\n  display: block;\n  width: var(--size-search);\n  min-width: 0;\n}\n.ds-nav__search .ds-form__input {\n  padding-left: calc(var(--size-icon) + 2 * var(--space-3));\n  border-radius: var(--radius-pill);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-nav__search-icon {\n  position: absolute;\n  top: 50%;\n  left: var(--space-3);\n  z-index: 1;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  transform: translateY(-50%);\n  color: var(--color-input-text);\n  opacity: 0.7;\n  pointer-events: none;\n}\n\n/* hero: a glass card with the present weather on the left, title, lead and actions on the sky beside it */\n.ds-hero {\n  display: grid;\n  grid-template-columns: var(--size-now) minmax(0, 1fr);\n  gap: var(--space-6);\n  align-items: center;\n  padding: var(--space-4) 0 var(--space-5);\n}\n.ds-hero__now {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  padding: var(--space-4);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-dialog);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-hero__place {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-hero__reading {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-hero__glyph {\n  width: var(--size-glyph);\n  height: var(--size-glyph);\n  flex: none;\n  color: var(--color-accent);\n}\n.ds-hero__figure {\n  color: var(--color-heading);\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  font-variant-numeric: tabular-nums;\n  text-shadow: var(--shadow-text);\n}\n.ds-hero__caption {\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n.ds-hero__facts {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: var(--space-2);\n  margin: var(--space-2) 0 0;\n  padding: var(--space-3) 0 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-hero__fact {\n  margin: 0;\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-hero__fact-label {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n.ds-hero__text {\n  min-width: 0;\n}\n.ds-hero__title {\n  margin: 0;\n  color: var(--color-heading);\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-shadow: var(--shadow-text);\n}\n.ds-hero__lead {\n  max-width: 52ch;\n  margin: var(--space-3) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-hero__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n  margin-top: var(--space-4);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: var(--space-4) 0 0;\n  padding: 0;\n  list-style: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-breadcrumb__item + .ds-breadcrumb__item::before {\n  content: \"/\";\n  margin-right: var(--space-2);\n  opacity: 0.6;\n}\n.ds-breadcrumb__link {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__link:hover,\n.ds-breadcrumb__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* page header: head of an inner page, set on the backdrop like the hero, one size down */\n.ds-page-header {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-3) var(--space-5);\n  padding: var(--space-2) 0 var(--space-4);\n}\n.ds-page-header__text {\n  flex: 1;\n  min-width: 0;\n}\n.ds-page-header__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-page-header__lead {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-base);\n}\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* typography */\n.ds-prose {\n  color: var(--color-text);\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-5);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-4);\n  font-size: var(--text-h3);\n}\n.ds-prose p,\n.ds-prose ul,\n.ds-prose ol {\n  margin: var(--space-3) 0 0;\n}\n.ds-prose ul,\n.ds-prose ol {\n  padding-left: var(--space-4);\n}\n.ds-prose li + li {\n  margin-top: var(--space-1);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  background: var(--color-bar-alt);\n  border-radius: var(--radius-control);\n  color: var(--color-accent);\n  font-family: var(--font-mono);\n  font-size: var(--text-ui);\n}\n.ds-prose__lead {\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-prose__code {\n  margin: var(--space-3) 0 0;\n  padding: var(--space-3) var(--space-4);\n  overflow-x: auto;\n  background: var(--color-bar);\n  border-radius: var(--radius-control);\n  color: var(--color-bar-text);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-1);\n}\n.ds-link--quiet,\n.ds-link--quiet:visited {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-link__sample {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-4);\n  margin-top: var(--space-3);\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  min-height: var(--size-control);\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-button);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-decoration: none;\n  text-transform: var(--ui-transform);\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-button-hover-text);\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-1);\n}\n.ds-button--secondary {\n  background: var(--fill-button-secondary);\n  border-color: var(--color-border-strong);\n  color: var(--color-button-secondary-text);\n  text-shadow: var(--shadow-text);\n}\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: linear-gradient(var(--color-surface-strong), var(--color-surface-strong)), var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--danger {\n  background: color-mix(in srgb, var(--color-danger) 70%, transparent);\n  border-color: var(--color-danger);\n  color: var(--color-button-secondary-text);\n  text-shadow: var(--shadow-text);\n}\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--color-danger);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--large {\n  padding: var(--space-3) var(--space-5);\n  font-size: var(--text-base);\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  background: var(--color-disabled);\n  border-color: transparent;\n  box-shadow: none;\n  color: var(--color-disabled-text);\n  text-shadow: none;\n  cursor: not-allowed;\n}\n.ds-button__row {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin-top: var(--space-3);\n}\n\n/* panel: the basic sheet of glass */\n.ds-panel {\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-panel__title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-transform: uppercase;\n}\n.ds-panel__body {\n  padding: var(--space-4);\n}\n.ds-panel__body > :first-child {\n  margin-top: 0;\n}\n.ds-panel--dark {\n  background: var(--fill-bar);\n  border-color: var(--color-border-muted);\n  -webkit-backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n  backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n}\n\n/* form */\n.ds-form {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n}\n.ds-form__field {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n}\n.ds-form__label {\n  display: flex;\n  justify-content: space-between;\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: uppercase;\n}\n.ds-form__input,\n.ds-form__textarea,\n.ds-form__select {\n  width: 100%;\n  min-height: var(--size-control);\n  padding: var(--space-2) var(--space-3);\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  line-height: var(--line-heading);\n  transition: var(--transition);\n}\n.ds-form__input::placeholder,\n.ds-form__textarea::placeholder {\n  color: var(--color-disabled-text);\n  opacity: 1;\n}\n.ds-form__textarea {\n  min-height: var(--space-7);\n  resize: vertical;\n}\n.ds-form__select {\n  appearance: none;\n  -webkit-appearance: none;\n  padding-right: var(--space-5);\n}\n.ds-form__select-wrap {\n  position: relative;\n  display: block;\n}\n.ds-form__chevron {\n  position: absolute;\n  top: 50%;\n  right: var(--space-3);\n  width: var(--size-icon);\n  height: var(--size-icon);\n  transform: translateY(-50%);\n  color: var(--color-input-text);\n  pointer-events: none;\n}\n.ds-form__input:focus,\n.ds-form__textarea:focus,\n.ds-form__select:focus,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: 0;\n  border-color: var(--color-focus);\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-bold);\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  font-size: var(--text-ui);\n}\n.ds-form__checkbox {\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  margin: 0;\n  accent-color: var(--color-accent);\n}\n.ds-form__range {\n  width: 100%;\n  height: var(--size-thumb);\n  margin: 0;\n  background: transparent;\n  appearance: none;\n  -webkit-appearance: none;\n}\n.ds-form__range::-webkit-slider-runnable-track {\n  height: var(--size-track);\n  background: var(--color-surface-strong);\n  border-radius: var(--radius-pill);\n}\n.ds-form__range::-webkit-slider-thumb {\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  margin-top: calc((var(--size-track) - var(--size-thumb)) / 2);\n  background: var(--color-surface-strong);\n  border: var(--border-width) var(--border-style) var(--color-text);\n  border-radius: 50%;\n  box-shadow: var(--shadow-control);\n  -webkit-appearance: none;\n}\n.ds-form__range::-moz-range-track {\n  height: var(--size-track);\n  background: var(--color-surface-strong);\n  border-radius: var(--radius-pill);\n}\n.ds-form__range::-moz-range-thumb {\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  background: var(--color-surface-strong);\n  border: var(--border-width) var(--border-style) var(--color-text);\n  border-radius: 50%;\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n}\n\n/* table: glass sheet, dark glass head, hairline rows */\n.ds-table {\n  width: 100%;\n  overflow: hidden;\n  border-collapse: separate;\n  border-spacing: 0;\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n  font-size: var(--text-ui);\n}\n.ds-table th,\n.ds-table td {\n  padding: var(--space-3) var(--space-4);\n  text-align: left;\n  vertical-align: middle;\n}\n.ds-table th {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-weight: var(--weight-bold);\n  text-transform: uppercase;\n}\n.ds-table td {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-table tbody tr:hover td,\n.ds-table tr.is-hover td {\n  background: var(--color-border-muted);\n}\n.ds-table .ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n.ds-table__meta {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* list: rows inside a sheet of glass, divided by hairlines */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n}\n.ds-list__item + .ds-list__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__body {\n  flex: 1;\n  min-width: 0;\n}\n.ds-list__title {\n  display: block;\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-list__meta {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-list__dot {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  border-radius: 50%;\n  background: var(--color-accent-alt);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-2);\n  background: var(--fill-accent);\n  border-radius: var(--radius-pill);\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: var(--line-body);\n  text-transform: none;\n  vertical-align: middle;\n}\n.ds-badge--alt {\n  background: var(--color-accent-alt);\n  color: var(--color-text);\n}\n.ds-badge--glass {\n  background: var(--color-surface-alt);\n  box-shadow: inset 0 0 0 var(--border-width) var(--color-border-strong);\n  color: var(--color-text);\n}\n/* status badges: a dark glass pill with a 1px ring and a dot in the status colour, like the error notice */\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  background: var(--fill-bar-alt);\n  color: var(--color-text);\n}\n.ds-badge--success::before,\n.ds-badge--warning::before,\n.ds-badge--danger::before {\n  content: \"\";\n  width: var(--size-dot);\n  height: var(--size-dot);\n  flex: none;\n  border-radius: 50%;\n}\n.ds-badge--success {\n  box-shadow: inset 0 0 0 var(--border-width) var(--color-success);\n}\n.ds-badge--success::before {\n  background: var(--color-success);\n}\n.ds-badge--warning {\n  box-shadow: inset 0 0 0 var(--border-width) var(--color-warning);\n}\n.ds-badge--warning::before {\n  background: var(--color-warning);\n}\n.ds-badge--danger {\n  box-shadow: inset 0 0 0 var(--border-width) var(--color-danger);\n}\n.ds-badge--danger::before {\n  background: var(--color-danger);\n}\n\n/* notice */\n.ds-notice {\n  display: flex;\n  align-items: flex-start;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-notice);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n}\n.ds-notice__icon {\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  flex: none;\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n}\n.ds-notice--error {\n  background: var(--color-danger-surface);\n  border-color: var(--color-danger);\n  color: var(--color-text);\n  -webkit-backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n  backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n}\n.ds-notice--error .ds-notice__icon,\n.ds-notice--error .ds-notice__title {\n  color: var(--color-danger);\n}\n.ds-notice__stack {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  justify-content: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-pagination__link {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  min-height: var(--size-control);\n  padding: 0 var(--space-3);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\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  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  background: var(--color-surface-strong);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  border-color: transparent;\n  color: var(--color-button-text);\n}\n.ds-pagination__link.is-disabled {\n  background: transparent;\n  color: var(--color-disabled-text);\n}\n\n/* dialog: strongly blurred glass box on a dimmed sheet, shown in the page flow */\n.ds-dialog {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-6) var(--space-4);\n  background: var(--color-overlay);\n  border-radius: var(--radius-page);\n}\n.ds-dialog__box {\n  width: 100%;\n  max-width: var(--size-dialog);\n  background: linear-gradient(var(--color-surface-alt), var(--color-surface-alt)), color-mix(in srgb, var(--color-canvas) 82%, transparent);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-dialog);\n  -webkit-backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n  backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n}\n.ds-dialog__title {\n  margin: 0;\n  padding: var(--space-4) var(--space-4) 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  text-align: center;\n}\n.ds-dialog__body {\n  padding: var(--space-2) var(--space-4) var(--space-4);\n  color: var(--color-text-muted);\n  text-align: center;\n}\n.ds-dialog__actions {\n  display: flex;\n  justify-content: center;\n  gap: var(--space-3);\n  padding: 0 var(--space-4) var(--space-4);\n}\n\n/* empty state */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  padding: var(--space-6) var(--space-4);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n  text-align: center;\n}\n.ds-empty__icon {\n  width: var(--space-6);\n  height: var(--space-6);\n  color: var(--color-text-muted);\n}\n.ds-empty__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-ui);\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/* sidebar */\n.ds-sidebar {\n  padding: var(--space-4);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-sidebar__heading {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-transform: uppercase;\n}\n.ds-sidebar__heading + .ds-sidebar__list + .ds-sidebar__heading {\n  margin-top: var(--space-4);\n}\n.ds-sidebar__list {\n  margin: 0 calc(-1 * var(--space-2));\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2);\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: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__link:hover,\n.ds-sidebar__link.is-hover {\n  background: var(--color-border-muted);\n}\n.ds-sidebar__link.is-current {\n  background: var(--color-surface-alt);\n}\n\n/* menu: a drop-down of strong glass under a navigation item, shown on hover or focus */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__trigger {\n  cursor: pointer;\n}\n.ds-menu__caret {\n  width: var(--space-2);\n  height: var(--space-2);\n  flex: none;\n  margin-bottom: var(--space-1);\n  border-right: var(--border-width) var(--border-style) currentColor;\n  border-bottom: var(--border-width) var(--border-style) currentColor;\n  transform: rotate(45deg);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  min-width: 24ch;\n  margin: 0;\n  padding: var(--space-1);\n  list-style: none;\n  background: linear-gradient(var(--color-surface-alt), var(--color-surface-alt)), color-mix(in srgb, var(--color-canvas) 82%, transparent);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n  -webkit-backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n  backdrop-filter: blur(calc(var(--backdrop-blur) * 3)) saturate(180%);\n}\n.ds-menu:hover .ds-menu__list,\n.ds-menu:focus-within .ds-menu__list,\n.ds-menu.is-open .ds-menu__list {\n  display: block;\n}\n.ds-menu__link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover {\n  background: var(--color-border-muted);\n}\n.ds-menu__meta {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n\n/* accordion: one sheet of glass, sections that open and close */\n.ds-accordion {\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-accordion__item + .ds-accordion__item {\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-accordion__summary {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-4);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  list-style: none;\n  cursor: pointer;\n}\n.ds-accordion__summary::-webkit-details-marker {\n  display: none;\n}\n.ds-accordion__summary::after {\n  content: \"\";\n  width: var(--space-2);\n  height: var(--space-2);\n  flex: none;\n  border-right: var(--border-width) var(--border-style) currentColor;\n  border-bottom: var(--border-width) var(--border-style) currentColor;\n  transform: rotate(45deg);\n  transition: var(--transition);\n}\n.ds-accordion__item[open] > .ds-accordion__summary::after {\n  transform: rotate(-135deg);\n}\n.ds-accordion__summary:focus-visible,\n.ds-accordion__summary.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(-1 * var(--space-1));\n}\n.ds-accordion__body {\n  margin: 0;\n  padding: 0 var(--space-4) var(--space-3);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* tooltip: a round hint mark; the tip is an inverted block above it, shown on hover or focus */\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-thumb);\n  height: var(--size-thumb);\n  flex: none;\n  background: var(--color-surface-alt);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: 50%;\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  text-transform: none;\n  cursor: help;\n}\n.ds-tooltip__tip {\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: 26ch;\n  padding: var(--space-2) var(--space-3);\n  transform: translateX(-50%);\n  background: var(--fill-inverse);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control-hover);\n  color: var(--color-inverse-text);\n  font-family: var(--font-body);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n  letter-spacing: 0;\n  text-align: left;\n}\n.ds-tooltip:hover .ds-tooltip__tip,\n.ds-tooltip:focus .ds-tooltip__tip,\n.ds-tooltip.is-open .ds-tooltip__tip {\n  display: block;\n}\n.ds-tooltip:focus-visible {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-1);\n}\n\n/* carousel: one slide showing in a sheet of glass, the rest reached by scrolling sideways; dots under it */\n.ds-carousel {\n  overflow: hidden;\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-carousel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-carousel__arrows {\n  display: flex;\n  gap: var(--space-1);\n}\n.ds-carousel__arrow {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: calc(var(--size-control) - var(--space-2));\n  height: calc(var(--size-control) - var(--space-2));\n  padding: 0;\n  background: var(--color-border-muted);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: 50%;\n  color: var(--color-bar-text);\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-carousel__arrow:hover,\n.ds-carousel__arrow.is-hover {\n  background: var(--color-surface-strong);\n}\n.ds-carousel__arrow.is-disabled {\n  opacity: 0.45;\n  cursor: default;\n}\n.ds-carousel__track {\n  display: flex;\n  margin: 0;\n  padding: 0;\n  overflow-x: auto;\n  list-style: none;\n  scroll-snap-type: x mandatory;\n  scrollbar-width: none;\n}\n.ds-carousel__track::-webkit-scrollbar {\n  display: none;\n}\n.ds-carousel__slide {\n  flex: 0 0 100%;\n  min-width: 0;\n  padding: var(--space-4);\n  scroll-snap-align: start;\n}\n.ds-carousel__dots {\n  display: flex;\n  justify-content: center;\n  gap: var(--space-2);\n  padding: 0 0 var(--space-3);\n}\n.ds-carousel__dot {\n  width: var(--size-dot);\n  height: var(--size-dot);\n  border-radius: var(--radius-pill);\n  background: color-mix(in srgb, var(--color-text) 28%, transparent);\n}\n.ds-carousel__dot.is-current {\n  width: calc(var(--size-dot) * 3);\n  background: var(--color-accent);\n}\n\n/* switch: an on/off control drawn over a checkbox */\n.ds-switch {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n  cursor: pointer;\n}\n.ds-switch + .ds-switch {\n  margin-top: var(--space-3);\n  padding-top: var(--space-3);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-switch__text {\n  min-width: 0;\n}\n.ds-switch__hint {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-switch__input {\n  position: absolute;\n  right: 0;\n  width: calc(var(--size-thumb) * 2);\n  height: var(--size-thumb);\n  margin: 0;\n  opacity: 0;\n  cursor: pointer;\n}\n.ds-switch__track {\n  position: relative;\n  width: calc(var(--size-thumb) * 2);\n  height: calc(var(--size-thumb) + var(--space-1));\n  flex: none;\n  background: var(--fill-input);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-pill);\n  transition: var(--transition);\n}\n.ds-switch__track::after {\n  content: \"\";\n  position: absolute;\n  top: 50%;\n  left: var(--space-1);\n  width: calc(var(--size-thumb) - var(--space-1));\n  height: calc(var(--size-thumb) - var(--space-1));\n  transform: translateY(-50%);\n  background: var(--color-input-text);\n  border-radius: 50%;\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch__track.is-on {\n  background: var(--fill-accent);\n  border-color: transparent;\n}\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch__track.is-on::after {\n  left: calc(100% - var(--size-thumb));\n  background: var(--color-accent-text);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch__track.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: var(--space-1);\n}\n.ds-switch__input:disabled + .ds-switch__track,\n.ds-switch__track.is-disabled {\n  background: var(--color-disabled);\n  border-color: transparent;\n}\n\n/* progress: a thin track with the accent fill */\n.ds-progress {\n  display: block;\n  height: calc(var(--size-track) * 2);\n  overflow: hidden;\n  background: color-mix(in srgb, var(--color-text) 18%, transparent);\n  border-radius: var(--radius-pill);\n}\n.ds-progress__bar {\n  display: block;\n  width: 50%;\n  height: 100%;\n  background: var(--fill-accent);\n  border-radius: var(--radius-pill);\n}\n.ds-progress__bar--25 { width: 25%; }\n.ds-progress__bar--40 { width: 40%; }\n.ds-progress__bar--65 { width: 65%; }\n.ds-progress__bar--75 { width: 75%; }\n.ds-progress__label {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-2);\n  margin-bottom: var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* avatar: a round account picture drawn from initials */\n.ds-avatar {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-control);\n  height: var(--size-control);\n  flex: none;\n  background: var(--fill-accent);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: 50%;\n  box-shadow: var(--shadow-control);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n  text-decoration: none;\n}\n.ds-avatar--2,\n.ds-avatar--3,\n.ds-avatar--4 {\n  color: var(--color-text);\n}\n.ds-avatar--2 {\n  background: color-mix(in srgb, var(--color-fill-2) 55%, transparent);\n}\n.ds-avatar__row {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-avatar__name {\n  display: block;\n  color: var(--color-text);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n}\n.ds-avatar__meta {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* panel variants and small parts of this layout */\n.ds-panel--inverse {\n  background: var(--fill-inverse);\n  border-color: transparent;\n  color: var(--color-inverse-text);\n  -webkit-backdrop-filter: none;\n  backdrop-filter: none;\n}\n.ds-panel--inverse .ds-panel__title {\n  border-bottom-color: color-mix(in srgb, var(--color-inverse-text) 18%, transparent);\n  color: var(--color-inverse-text);\n}\n.ds-panel--inverse .ds-progress {\n  background: color-mix(in srgb, var(--color-inverse-text) 18%, transparent);\n}\n.ds-panel__pair {\n  display: flex;\n  justify-content: space-between;\n  gap: var(--space-3);\n  margin: 0 0 var(--space-2);\n  font-size: var(--text-ui);\n}\n.ds-panel__pair-value {\n  font-weight: var(--weight-bold);\n  font-variant-numeric: tabular-nums;\n}\n.ds-panel__text {\n  margin: var(--space-3) 0 0;\n  font-size: var(--text-ui);\n}\n.ds-list__icon {\n  width: calc(var(--size-icon) + var(--space-2));\n  height: calc(var(--size-icon) + var(--space-2));\n  flex: none;\n  color: var(--color-accent);\n}\n.ds-list__value {\n  flex: none;\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  font-variant-numeric: tabular-nums;\n}\n.ds-list__value-low {\n  color: var(--color-text-muted);\n  font-weight: var(--weight-body);\n}\n.ds-sidebar__value {\n  color: var(--color-text-muted);\n  font-variant-numeric: tabular-nums;\n}\n\n/* hours: the cells of one carousel slide */\n.ds-carousel__hours {\n  display: grid;\n  grid-template-columns: repeat(8, minmax(0, 1fr));\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-carousel__hour {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--space-1);\n  padding: var(--space-3) var(--space-1);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  text-align: center;\n}\n.ds-carousel__hour.is-current {\n  background: var(--color-surface-alt);\n  border-color: var(--color-border);\n}\n.ds-carousel__time {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-carousel__glyph {\n  width: calc(var(--size-icon) + var(--space-2));\n  height: calc(var(--size-icon) + var(--space-2));\n  color: var(--color-accent);\n}\n.ds-carousel__temp {\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  font-variant-numeric: tabular-nums;\n}\n.ds-carousel__rain {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* grid: four tinted glass tiles, one reading each, with its bar */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-3);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  padding: var(--space-3);\n  background: linear-gradient(200deg, var(--color-surface-alt), transparent 60%), var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-grid__cell--1 {\n  background-color: color-mix(in srgb, var(--color-fill-1) 55%, transparent);\n}\n.ds-grid__cell--2 {\n  background-color: color-mix(in srgb, var(--color-fill-2) 55%, transparent);\n}\n.ds-grid__cell--3 {\n  background-color: color-mix(in srgb, var(--color-fill-3) 55%, transparent);\n}\n.ds-grid__cell--4 {\n  background-color: color-mix(in srgb, var(--color-fill-4) 55%, transparent);\n}\n.ds-grid__label {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-grid__value {\n  margin-top: var(--space-3);\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  font-variant-numeric: tabular-nums;\n}\n.ds-grid__meta {\n  margin-bottom: var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-grid__cell .ds-progress {\n  margin-top: auto;\n}\n\n/* stats: a row of separate small glass cards, one figure each */\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-3);\n  margin: 0;\n}\n.ds-stat__item {\n  padding: var(--space-3) var(--space-4);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-stat__label {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-stat__value {\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  font-variant-numeric: tabular-nums;\n}\n.ds-stat__meta {\n  display: block;\n  color: var(--color-text-muted);\n  font-family: var(--font-body);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  letter-spacing: 0;\n}\n\n/* tabs: a row of separate pills; the current one takes the accent fill */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-tabs__tab {\n  display: block;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar-alt);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-pill);\n  color: var(--color-bar-alt-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-decoration: none;\n  text-transform: var(--ui-transform);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  border-color: var(--color-border-strong);\n}\n.ds-tabs__tab.is-current {\n  background: var(--fill-accent);\n  border-color: transparent;\n  box-shadow: var(--shadow-control);\n  color: var(--color-accent-text);\n}\n\n/* footer: a floating strip of glass at the end of the column */\n.ds-footer {\n  max-width: calc(var(--size-page) + 2 * var(--space-4));\n  margin: var(--space-6) auto 0;\n  padding: 0 var(--space-4) var(--space-4);\n}\n.ds-footer__inner {\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-4);\n  background: var(--fill-bar-alt);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-page);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  -webkit-backdrop-filter: blur(var(--backdrop-blur));\n  backdrop-filter: blur(var(--backdrop-blur));\n}\n.ds-footer__links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-4);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  text-decoration: underline;\n}\n\n/* adjustments to the shared parts for this layout */\n.ds-breadcrumb {\n  margin-top: var(--space-2);\n}\n.ds-panel__title {\n  text-transform: none;\n}\n.ds-form__label,\n.ds-table th {\n  text-transform: none;\n}\n.ds-sidebar__heading {\n  text-transform: none;\n}\n.ds-nav .ds-menu__list {\n  left: 50%;\n  transform: translateX(-50%);\n}\n.ds-notice .ds-link--quiet {\n  color: inherit;\n  text-decoration: underline;\n}\n.ds-empty {\n  padding: var(--space-5) var(--space-4);\n}\n\n@media (max-width: 900px) {\n  .ds-page__layout,\n  .ds-hero {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-hero {\n    gap: var(--space-4);\n  }\n  .ds-stat,\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n}\n@media (max-width: 720px) {\n  .ds-nav__inner {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    gap: var(--space-2) var(--space-3);\n    padding-top: var(--space-3);\n  }\n  .ds-nav__list {\n    order: 3;\n    flex-basis: 100%;\n    justify-content: space-between;\n    gap: var(--space-3);\n  }\n  .ds-nav__tools {\n    flex: 1;\n  }\n  .ds-nav__search {\n    flex: 1;\n    width: auto;\n    max-width: var(--size-search);\n  }\n  .ds-nav .ds-menu__list {\n    left: auto;\n    right: 0;\n    transform: none;\n  }\n  .ds-hero__title {\n    font-size: var(--text-h1);\n  }\n  .ds-hero__lead {\n    font-size: var(--text-base);\n  }\n  .ds-carousel__hours {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n  .ds-carousel__slide {\n    padding: var(--space-3);\n  }\n  .ds-stat__value {\n    font-size: var(--text-h2);\n  }\n  .ds-stat__item {\n    padding: var(--space-3);\n  }\n  .ds-tabs__tab {\n    padding: var(--space-2) var(--space-3);\n  }\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-3) var(--space-2);\n  }\n  .ds-table .ds-table__opt {\n    display: none;\n  }\n  .ds-list__item {\n    flex-wrap: wrap;\n  }\n  .ds-page-header__text {\n    flex-basis: 100%;\n  }\n  .ds-dialog {\n    padding: var(--space-5) var(--space-3);\n  }\n  .ds-dialog__actions,\n  .ds-pagination {\n    flex-wrap: wrap;\n  }\n  .ds-footer__inner {\n    border-radius: var(--radius-panel);\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: weather for Harbour Point</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=\"#today\">\n      <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"2.5\" width=\"13\" height=\"13\" rx=\"4\" fill=\"currentColor\" opacity=\".5\"/><rect x=\"8.5\" y=\"8.5\" width=\"12.5\" height=\"12.5\" rx=\"4\" fill=\"currentColor\" fill-opacity=\".25\" stroke=\"currentColor\" stroke-width=\"1.8\"/></svg></span>\n      <span class=\"ds-brand__name\">chronoskin</span>\n    </a>\n    <ul class=\"ds-nav__list\">\n      <li><a class=\"ds-nav__link\" href=\"#today\">Today</a></li>\n      <li><a class=\"ds-nav__link\" href=\"#forecast\">Forecast</a></li>\n      <li class=\"ds-menu\" data-component=\"menu\">\n        <a class=\"ds-nav__link ds-menu__trigger\" href=\"#places\">Places <span class=\"ds-menu__caret\"></span></a>\n        <ul class=\"ds-menu__list\">\n          <li><a class=\"ds-menu__link\" href=\"#today\">Harbour Point <span class=\"ds-menu__meta\">14°</span></a></li>\n          <li><a class=\"ds-menu__link\" href=\"#forecast\">Port Aldous <span class=\"ds-menu__meta\">11°</span></a></li>\n          <li><a class=\"ds-menu__link\" href=\"#forecast\">Wren Hill <span class=\"ds-menu__meta\">9°</span></a></li>\n          <li><a class=\"ds-menu__link\" href=\"#places\">Manage places</a></li>\n        </ul>\n      </li>\n      <li><a class=\"ds-nav__link\" href=\"#guide\">Guide</a></li>\n    </ul>\n    <div class=\"ds-nav__tools\">\n      <label class=\"ds-nav__search\">\n        <svg class=\"ds-nav__search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"M20 20l-4.5-4.5\"/></svg>\n        <input class=\"ds-form__input\" type=\"search\" placeholder=\"Find a place\" aria-label=\"Find a place\">\n      </label>\n      <a class=\"ds-avatar\" href=\"#places\" aria-label=\"Account of Mara Ellison\">ME</a>\n    </div>\n  </div>\n</header>\n\n<main class=\"ds-page__inner\">\n\n  <section class=\"ds-view ds-view--home\" id=\"today\">\n    <section class=\"ds-hero\" data-component=\"hero\">\n      <div class=\"ds-hero__now\">\n        <div class=\"ds-hero__place\">Harbour Point <span class=\"ds-badge\">Now</span></div>\n        <div class=\"ds-hero__reading\">\n          <span class=\"ds-hero__figure\">14°</span>\n          <svg class=\"ds-hero__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg>\n        </div>\n        <span class=\"ds-hero__caption\">Clear sky. Feels like 12°.</span>\n        <dl class=\"ds-hero__facts\">\n          <div><dt class=\"ds-hero__fact-label\">High</dt><dd class=\"ds-hero__fact\">17°</dd></div>\n          <div><dt class=\"ds-hero__fact-label\">Low</dt><dd class=\"ds-hero__fact\">8°</dd></div>\n          <div><dt class=\"ds-hero__fact-label\">Rain</dt><dd class=\"ds-hero__fact\">3.1 mm</dd></div>\n        </dl>\n      </div>\n      <div class=\"ds-hero__text\">\n        <h1 class=\"ds-hero__title\">Clear until four, rain by six</h1>\n        <p class=\"ds-hero__lead\">Thursday 7 October in Harbour Point. A dry, bright day with a west wind at 18 km/h; showers arrive in the early evening and last past midnight.</p>\n        <div class=\"ds-hero__actions\">\n          <a class=\"ds-button ds-button--large\" href=\"#forecast\">See the week</a>\n          <a class=\"ds-button ds-button--secondary ds-button--large\" href=\"#places\">Change place</a>\n        </div>\n      </div>\n    </section>\n\n    <section class=\"ds-carousel\" data-component=\"carousel\" aria-label=\"Hour by hour\">\n      <div class=\"ds-carousel__head\">\n        <span>Hour by hour</span>\n        <span class=\"ds-carousel__arrows\">\n          <button class=\"ds-carousel__arrow is-disabled\" type=\"button\" aria-label=\"Earlier\"><svg class=\"ds-page__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M14 6l-6 6 6 6\"/></svg></button>\n          <button class=\"ds-carousel__arrow\" type=\"button\" aria-label=\"Later\"><svg class=\"ds-page__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 6l6 6-6 6\"/></svg></button>\n        </span>\n      </div>\n      <ul class=\"ds-carousel__track\">\n        <li class=\"ds-carousel__slide\">\n            <ol class=\"ds-carousel__hours\">\n              <li class=\"ds-carousel__hour is-current\"><span class=\"ds-carousel__time\">Now</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg><span class=\"ds-carousel__temp\">14°</span><span class=\"ds-carousel__rain\">5%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">11:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg><span class=\"ds-carousel__temp\">15°</span><span class=\"ds-carousel__rain\">5%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">12:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg><span class=\"ds-carousel__temp\">16°</span><span class=\"ds-carousel__rain\">0%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">13:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg><span class=\"ds-carousel__temp\">17°</span><span class=\"ds-carousel__rain\">0%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">14:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg><span class=\"ds-carousel__temp\">17°</span><span class=\"ds-carousel__rain\">10%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">15:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg><span class=\"ds-carousel__temp\">16°</span><span class=\"ds-carousel__rain\">20%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">16:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg><span class=\"ds-carousel__temp\">15°</span><span class=\"ds-carousel__rain\">35%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">17:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 15h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 8.1 3.5 3.5 0 0 0 7 15z\"/><path d=\"M8 18v3M12 18v3M16 18v3\"/></svg><span class=\"ds-carousel__temp\">13°</span><span class=\"ds-carousel__rain\">60%</span></li>\n            </ol>\n        </li>\n        <li class=\"ds-carousel__slide\">\n            <ol class=\"ds-carousel__hours\">\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">18:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 15h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 8.1 3.5 3.5 0 0 0 7 15z\"/><path d=\"M8 18v3M12 18v3M16 18v3\"/></svg><span class=\"ds-carousel__temp\">12°</span><span class=\"ds-carousel__rain\">80%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">19:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 15h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 8.1 3.5 3.5 0 0 0 7 15z\"/><path d=\"M8 18v3M12 18v3M16 18v3\"/></svg><span class=\"ds-carousel__temp\">11°</span><span class=\"ds-carousel__rain\">85%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">20:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 15h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 8.1 3.5 3.5 0 0 0 7 15z\"/><path d=\"M8 18v3M12 18v3M16 18v3\"/></svg><span class=\"ds-carousel__temp\">11°</span><span class=\"ds-carousel__rain\">70%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">21:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg><span class=\"ds-carousel__temp\">10°</span><span class=\"ds-carousel__rain\">40%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">22:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg><span class=\"ds-carousel__temp\">9°</span><span class=\"ds-carousel__rain\">25%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">23:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5z\"/></svg><span class=\"ds-carousel__temp\">9°</span><span class=\"ds-carousel__rain\">10%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">00:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5z\"/></svg><span class=\"ds-carousel__temp\">8°</span><span class=\"ds-carousel__rain\">5%</span></li>\n              <li class=\"ds-carousel__hour\"><span class=\"ds-carousel__time\">01:00</span><svg class=\"ds-carousel__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5z\"/></svg><span class=\"ds-carousel__temp\">8°</span><span class=\"ds-carousel__rain\">5%</span></li>\n            </ol>\n        </li>\n      </ul>\n      <div class=\"ds-carousel__dots\"><span class=\"ds-carousel__dot is-current\"></span><span class=\"ds-carousel__dot\"></span><span class=\"ds-carousel__dot\"></span></div>\n    </section>\n\n    <div class=\"ds-page__layout\">\n      <div class=\"ds-page__main\">\n        <section class=\"ds-grid\" data-component=\"grid\">\n          <div class=\"ds-grid__cell ds-grid__cell--1\">\n            <span class=\"ds-grid__label\">Wind</span>\n            <span class=\"ds-grid__value\">18 km/h</span>\n            <span class=\"ds-grid__meta\">West, gusts to 31</span>\n            <span class=\"ds-progress\" data-component=\"progress\"><span class=\"ds-progress__bar ds-progress__bar--25\"></span></span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--2\">\n            <span class=\"ds-grid__label\">Humidity</span>\n            <span class=\"ds-grid__value\">64%</span>\n            <span class=\"ds-grid__meta\">Dew point 7°</span>\n            <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--65\"></span></span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--3\">\n            <span class=\"ds-grid__label\">UV index <span class=\"ds-tooltip\" data-component=\"tooltip\" tabindex=\"0\">?<span class=\"ds-tooltip__tip\" role=\"tooltip\">From 0 to 11. Above 3, cover up around midday.</span></span></span>\n            <span class=\"ds-grid__value\">3 of 11</span>\n            <span class=\"ds-grid__meta\">Moderate at noon</span>\n            <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--25\"></span></span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--4\">\n            <span class=\"ds-grid__label\">Pressure</span>\n            <span class=\"ds-grid__value\">1016 hPa</span>\n            <span class=\"ds-grid__meta\">Falling slowly</span>\n            <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--75\"></span></span>\n          </div>\n        </section>\n        <h2 class=\"ds-page__heading\">The next four days <a class=\"ds-link\" href=\"#forecast\">Full forecast</a></h2>\n        <ul class=\"ds-list\" data-component=\"list\">\n          <li class=\"ds-list__item\">\n            <svg class=\"ds-list__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 15h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 8.1 3.5 3.5 0 0 0 7 15z\"/><path d=\"M8 18v3M12 18v3M16 18v3\"/></svg>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#forecast\">Friday: showers, heavier before noon</a>\n              <span class=\"ds-list__meta\">9.4 mm of rain, wind W 24 km/h</span>\n            </div>\n            <span class=\"ds-list__value\">13° <span class=\"ds-list__value-low\">8°</span></span>\n          </li>\n          <li class=\"ds-list__item\">\n            <svg class=\"ds-list__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 11.1 3.5 3.5 0 0 0 7 18z\"/></svg>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#forecast\">Saturday: grey and still</a>\n              <span class=\"ds-list__meta\">1.2 mm of rain, wind SW 9 km/h</span>\n            </div>\n            <span class=\"ds-list__value\">12° <span class=\"ds-list__value-low\">7°</span></span>\n          </li>\n          <li class=\"ds-list__item\">\n            <svg class=\"ds-list__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#forecast\">Sunday: bright spells</a>\n              <span class=\"ds-list__meta\">0.0 mm of rain, wind S 11 km/h</span>\n            </div>\n            <span class=\"ds-list__value\">15° <span class=\"ds-list__value-low\">6°</span></span>\n          </li>\n          <li class=\"ds-list__item\">\n            <svg class=\"ds-list__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg>\n            <div class=\"ds-list__body\">\n              <a class=\"ds-list__title\" href=\"#forecast\">Monday: clear from dawn</a>\n              <span class=\"ds-list__meta\">0.0 mm of rain, wind SE 8 km/h</span>\n            </div>\n            <span class=\"ds-list__value\">17° <span class=\"ds-list__value-low\">7°</span></span>\n          </li>\n        </ul>\n      </div>\n      <div class=\"ds-page__side\">\n        <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n          <h2 class=\"ds-sidebar__heading\">Saved places</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__link is-current\" href=\"#today\">Harbour Point <span class=\"ds-sidebar__value\">14°</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#forecast\">Port Aldous <span class=\"ds-sidebar__value\">11°</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#forecast\">Wren Hill <span class=\"ds-sidebar__value\">9°</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#forecast\">Saltmarsh Row <span class=\"ds-badge ds-badge--alt\">New</span></a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#places\">Manage places</a></li>\n          </ul>\n        </aside>\n        <section class=\"ds-panel ds-panel--inverse\">\n          <h2 class=\"ds-panel__title\">Daylight</h2>\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__pair\"><span>Sunrise</span> <span class=\"ds-panel__pair-value\">07:02</span></p>\n            <p class=\"ds-panel__pair\"><span>Sunset</span> <span class=\"ds-panel__pair-value\">18:14</span></p>\n            <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--40\"></span></span>\n            <p class=\"ds-panel__text\">11 h 12 min of daylight, 3 minutes less than yesterday.</p>\n          </div>\n        </section>\n        <div class=\"ds-notice\">\n          <svg class=\"ds-notice__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n          <div><span class=\"ds-notice__title\">Rain after 18:00.</span> About 3 mm before midnight. <a class=\"ds-link ds-link--quiet\" href=\"#forecast\">See the hours</a></div>\n        </div>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"forecast\">\n    <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#today\">Today</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#places\">Harbour Point</a></li>\n      <li class=\"ds-breadcrumb__item\">Seven days</li>\n    </ol>\n    <header class=\"ds-page-header\" data-component=\"page-header\">\n      <div class=\"ds-page-header__text\">\n        <h1 class=\"ds-page-header__title\">Seven days in Harbour Point</h1>\n        <p class=\"ds-page-header__lead\">Updated at 10:40 from the harbour mast and two models.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#places\">Change place</a>\n        <a class=\"ds-button\" href=\"#places\">Set an alert</a>\n      </div>\n    </header>\n    <div class=\"ds-page__main\">\n      <dl class=\"ds-stat\" data-component=\"stats\">\n        <div class=\"ds-stat__item\"><dt class=\"ds-stat__label\">Warmest day</dt><dd class=\"ds-stat__value\">17° <span class=\"ds-stat__meta\">Monday</span></dd></div>\n        <div class=\"ds-stat__item\"><dt class=\"ds-stat__label\">Coldest night</dt><dd class=\"ds-stat__value\">6° <span class=\"ds-stat__meta\">Sunday</span></dd></div>\n        <div class=\"ds-stat__item\"><dt class=\"ds-stat__label\">Rain in total</dt><dd class=\"ds-stat__value\">23.2 <span class=\"ds-stat__meta\">mm over 5 days</span></dd></div>\n        <div class=\"ds-stat__item\"><dt class=\"ds-stat__label\">Strongest gust</dt><dd class=\"ds-stat__value\">61 <span class=\"ds-stat__meta\">km/h on Tuesday</span></dd></div>\n      </dl>\n      <ul class=\"ds-tabs\" data-component=\"tabs\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#forecast\">Overview</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#forecast\">Rain</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#forecast\">Wind</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#forecast\">Sun and UV</a></li>\n      </ul>\n      <table class=\"ds-table\" data-component=\"table\">\n        <thead>\n          <tr><th>Day</th><th class=\"ds-table__opt\">Sky</th><th>Outlook</th><th class=\"ds-table__num\">High</th><th class=\"ds-table__num\">Low</th><th class=\"ds-table__num\">Rain, mm</th><th class=\"ds-table__num ds-table__opt\">Wind, km/h</th></tr>\n        </thead>\n        <tbody>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Thu 7</a></td><td class=\"ds-table__opt\">Clear, rain late</td><td><span class=\"ds-badge ds-badge--success\">Fine</span></td><td class=\"ds-table__num\">16°</td><td class=\"ds-table__num\">9°</td><td class=\"ds-table__num\">3.1</td><td class=\"ds-table__num ds-table__opt\">W 18</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Fri 8</a></td><td class=\"ds-table__opt\">Showers</td><td><span class=\"ds-badge ds-badge--warning\">Wet</span></td><td class=\"ds-table__num\">13°</td><td class=\"ds-table__num\">8°</td><td class=\"ds-table__num\">9.4</td><td class=\"ds-table__num ds-table__opt\">W 24</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Sat 9</a></td><td class=\"ds-table__opt\">Overcast</td><td><span class=\"ds-badge ds-badge--glass\">Dull</span></td><td class=\"ds-table__num\">12°</td><td class=\"ds-table__num\">7°</td><td class=\"ds-table__num\">1.2</td><td class=\"ds-table__num ds-table__opt\">SW 9</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Sun 10</a></td><td class=\"ds-table__opt\">Bright spells</td><td><span class=\"ds-badge ds-badge--success\">Fine</span></td><td class=\"ds-table__num\">15°</td><td class=\"ds-table__num\">6°</td><td class=\"ds-table__num\">0.0</td><td class=\"ds-table__num ds-table__opt\">S 11</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Mon 11</a></td><td class=\"ds-table__opt\">Clear</td><td><span class=\"ds-badge ds-badge--success\">Fine</span></td><td class=\"ds-table__num\">17°</td><td class=\"ds-table__num\">7°</td><td class=\"ds-table__num\">0.0</td><td class=\"ds-table__num ds-table__opt\">SE 8</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Tue 12</a></td><td class=\"ds-table__opt\">Gale from the west</td><td><span class=\"ds-badge ds-badge--danger\">Storm</span></td><td class=\"ds-table__num\">14°</td><td class=\"ds-table__num\">10°</td><td class=\"ds-table__num\">8.6</td><td class=\"ds-table__num ds-table__opt\">W 61</td></tr>\n          <tr><td><a class=\"ds-link ds-link--quiet\" href=\"#today\">Wed 13</a></td><td class=\"ds-table__opt\">Clearing</td><td><span class=\"ds-badge ds-badge--glass\">Dull</span></td><td class=\"ds-table__num\">13°</td><td class=\"ds-table__num\">8°</td><td class=\"ds-table__num\">0.9</td><td class=\"ds-table__num ds-table__opt\">NW 22</td></tr>\n        </tbody>\n      </table>\n      <ul class=\"ds-pagination\" data-component=\"pagination\">\n        <li><a class=\"ds-pagination__link is-disabled\" href=\"#forecast\">Previous</a></li>\n        <li><a class=\"ds-pagination__link is-current\" href=\"#forecast\">1</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#forecast\">2</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#forecast\">3</a></li>\n        <li><a class=\"ds-pagination__link\" href=\"#forecast\">Next</a></li>\n      </ul>\n      <p class=\"ds-page__note\">Week 1 of 3. Beyond ten days the forecast is a range, not a figure; the <a class=\"ds-link\" href=\"#guide\">guide</a> explains why.</p>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"places\">\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#today\">Today</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#places\">Account</a></li>\n      <li class=\"ds-breadcrumb__item\">Places and alerts</li>\n    </ol>\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__text\">\n        <h1 class=\"ds-page-header__title\">Places and alerts</h1>\n        <p class=\"ds-page-header__lead\">Four saved places, one of them out of reach.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button\" href=\"#places\">Add a place</a>\n      </div>\n    </header>\n    <div class=\"ds-page__layout ds-page__layout--even\">\n      <div class=\"ds-page__main\">\n        <div class=\"ds-notice__stack\" data-component=\"notice\">\n          <div class=\"ds-notice\">\n            <svg class=\"ds-notice__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n            <div><span class=\"ds-notice__title\">Readings refresh every ten minutes.</span> Alerts are sent as soon as a threshold is crossed.</div>\n          </div>\n          <div class=\"ds-notice ds-notice--error\">\n            <svg class=\"ds-notice__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 4l9 15H3z\"/><path d=\"M12 10v4M12 17h.01\"/></svg>\n            <div><span class=\"ds-notice__title\">Wren Hill has not reported since 06:20.</span> Its figures are from the model only.</div>\n          </div>\n        </div>\n        <h2 class=\"ds-page__heading\">Saved <span class=\"ds-badge\" data-component=\"badge\">4</span></h2>\n        <ul class=\"ds-list\">\n          <li class=\"ds-list__item\">\n            <div class=\"ds-list__body\"><a class=\"ds-list__title\" href=\"#today\">Harbour Point</a><span class=\"ds-list__meta\">Mast at 12 m, read at 10:40</span></div>\n            <span class=\"ds-badge ds-badge--success\">Live</span>\n            <span class=\"ds-list__value\">14°</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <div class=\"ds-list__body\"><a class=\"ds-list__title\" href=\"#forecast\">Port Aldous</a><span class=\"ds-list__meta\">Gale expected on Tuesday</span></div>\n            <span class=\"ds-badge ds-badge--warning\">Watch</span>\n            <span class=\"ds-list__value\">11°</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <div class=\"ds-list__body\"><a class=\"ds-list__title\" href=\"#forecast\">Wren Hill</a><span class=\"ds-list__meta\">No signal for 4 h 20 min</span></div>\n            <span class=\"ds-badge ds-badge--danger\">Silent</span>\n            <span class=\"ds-list__value\">9°</span>\n          </li>\n          <li class=\"ds-list__item\">\n            <div class=\"ds-list__body\"><a class=\"ds-list__title\" href=\"#forecast\">Saltmarsh Row</a><span class=\"ds-list__meta\">Added yesterday by Tobias Renn</span></div>\n            <span class=\"ds-badge ds-badge--alt\">New</span>\n            <span class=\"ds-list__value\">13°</span>\n          </li>\n        </ul>\n        <section class=\"ds-dialog\" data-component=\"dialog\">\n          <div class=\"ds-dialog__box\" role=\"dialog\" aria-label=\"Remove place\">\n            <h2 class=\"ds-dialog__title\">Remove Wren Hill?</h2>\n            <p class=\"ds-dialog__body\">Its two alerts and 30 days of readings go with it. Tobias Renn will lose it as well.</p>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--secondary\" href=\"#places\">Keep it</a>\n              <a class=\"ds-button ds-button--danger\" href=\"#places\">Remove</a>\n            </div>\n          </div>\n        </section>\n        <section class=\"ds-empty\" data-component=\"empty\">\n          <svg class=\"ds-empty__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 16V11a6 6 0 0 1 12 0v5l1.5 2h-15z\"/><path d=\"M10 21h4\"/></svg>\n          <h2 class=\"ds-empty__title\">No alerts sent this week</h2>\n          <p class=\"ds-empty__text\">Nothing has crossed a threshold since Sunday. Alerts you receive are listed here for 30 days.</p>\n          <a class=\"ds-button ds-button--secondary\" href=\"#forecast\">Check Tuesday's gale</a>\n        </section>\n      </div>\n      <div class=\"ds-page__main\">\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Add a place</h2>\n          <div class=\"ds-panel__body\">\n            <form class=\"ds-form\" data-component=\"form\">\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"p-name\">Name</label>\n                <input class=\"ds-form__input\" id=\"p-name\" type=\"text\" value=\"Kestrel Sands\">\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"p-coord\">Coordinates</label>\n                <input class=\"ds-form__input is-error\" id=\"p-coord\" type=\"text\" value=\"54.41, 181.20\">\n                <span class=\"ds-form__error\">Longitude must lie between -180 and 180.</span>\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"p-units\">Units</label>\n                <span class=\"ds-form__select-wrap\">\n                  <select class=\"ds-form__select\" id=\"p-units\"><option>Celsius, km/h, mm</option><option>Fahrenheit, mph, inches</option></select>\n                  <svg class=\"ds-form__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"/></svg>\n                </span>\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"p-note\">Note</label>\n                <textarea class=\"ds-form__textarea\" id=\"p-note\">Beach hut, exposed to the north-east.</textarea>\n                <span class=\"ds-form__hint\">Shown under the place name.</span>\n              </div>\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Share this place with my household</label>\n              <div class=\"ds-form__actions\" data-component=\"buttons\">\n                <button class=\"ds-button\" type=\"button\">Save place</button>\n                <a class=\"ds-button ds-button--secondary\" href=\"#places\">Cancel</a>\n                <button class=\"ds-button is-disabled\" type=\"button\" disabled>Import</button>\n                <a class=\"ds-button ds-button--danger\" href=\"#places\">Remove place</a>\n              </div>\n            </form>\n          </div>\n        </section>\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Alerts for Harbour Point</h2>\n          <div class=\"ds-panel__body\">\n            <label class=\"ds-switch\" data-component=\"switch\">\n              <span class=\"ds-switch__text\">Rain within the hour<span class=\"ds-switch__hint\">When more than 1 mm is due</span></span>\n              <input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span>\n            </label>\n            <label class=\"ds-switch\">\n              <span class=\"ds-switch__text\">Gusts above 50 km/h<span class=\"ds-switch__hint\">From the mast, not the model</span></span>\n              <input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span>\n            </label>\n            <label class=\"ds-switch\">\n              <span class=\"ds-switch__text\">Frost overnight<span class=\"ds-switch__hint\">Sent at 18:00 the evening before</span></span>\n              <input class=\"ds-switch__input\" type=\"checkbox\"><span class=\"ds-switch__track\"></span>\n            </label>\n          </div>\n        </section>\n      </div>\n    </div>\n  </section>\n\n  <section class=\"ds-view\" id=\"guide\">\n    <ol class=\"ds-breadcrumb\">\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#today\">Today</a></li>\n      <li class=\"ds-breadcrumb__item\"><a class=\"ds-breadcrumb__link\" href=\"#guide\">Guide</a></li>\n      <li class=\"ds-breadcrumb__item\">Reading the forecast</li>\n    </ol>\n    <header class=\"ds-page-header\">\n      <div class=\"ds-page-header__text\">\n        <h1 class=\"ds-page-header__title\">Reading the forecast</h1>\n        <p class=\"ds-page-header__lead\">What the figures mean and how far ahead to trust them.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--secondary\" href=\"#today\">Back to today</a>\n      </div>\n    </header>\n    <div class=\"ds-page__layout ds-page__layout--flush\">\n      <div class=\"ds-page__main\">\n        <section class=\"ds-panel\">\n          <div class=\"ds-panel__body\">\n            <article class=\"ds-prose\" data-component=\"typography\">\n              <h1>Figures, ranges and chances</h1>\n              <p class=\"ds-prose__lead\">A forecast is a set of likely outcomes. chronoskin shows the middle of that set and tells you how wide it is.</p>\n              <h2>Chance of rain</h2>\n              <p>The percentage under each hour is the share of model runs in which at least <strong>0.2 mm</strong> fell at your place during that hour. It says nothing about how hard it rains; the amount is shown in the week table.</p>\n              <h3>What the temperatures are</h3>\n              <ul>\n                <li>The large figure is the air temperature at 2 m, in the shade.</li>\n                <li>Feels like adds wind and humidity to that figure.</li>\n                <li>High and low run from 06:00 to 06:00, not from midnight.</li>\n              </ul>\n              <h3>Sharing a reading</h3>\n              <p>Every hour has an address of its own. Add <code>?at=17:00</code> to a place to open it at that hour.</p>\n              <p class=\"ds-link__sample\" data-component=\"links\">\n                <a class=\"ds-link\" href=\"#forecast\">The week table</a>\n                <a class=\"ds-link is-visited\" href=\"#places\">Visited: places</a>\n                <a class=\"ds-link is-hover\" href=\"#guide\">Hovered link</a>\n                <a class=\"ds-link is-active\" href=\"#guide\">Active link</a>\n              </p>\n            </article>\n          </div>\n        </section>\n        <div class=\"ds-accordion\" data-component=\"accordion\">\n          <details class=\"ds-accordion__item\" open>\n            <summary class=\"ds-accordion__summary\">Why did the forecast change since this morning?</summary>\n            <p class=\"ds-accordion__body\">New model runs arrive four times a day. The evening rain moved two hours earlier in the 09:00 run.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__summary\">How far ahead is a figure reliable?</summary>\n            <p class=\"ds-accordion__body\">Three days for temperature, about two for rain. After that, read the range.</p>\n          </details>\n          <details class=\"ds-accordion__item\">\n            <summary class=\"ds-accordion__summary\">Where do the readings come from?</summary>\n            <p class=\"ds-accordion__body\">From the nearest station to each place. If it falls silent, the model fills in.</p>\n          </details>\n        </div>\n      </div>\n      <div class=\"ds-page__side\">\n        <aside class=\"ds-sidebar\">\n          <h2 class=\"ds-sidebar__heading\">In this guide</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__link is-current\" href=\"#guide\">Figures, ranges and chances</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#guide\">Alerts and thresholds</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#guide\">Stations and models</a></li>\n            <li><a class=\"ds-sidebar__link\" href=\"#places\">Managing places</a></li>\n          </ul>\n        </aside>\n        <section class=\"ds-panel\">\n          <h2 class=\"ds-panel__title\">Written by</h2>\n          <div class=\"ds-panel__body\">\n            <div class=\"ds-avatar__row\" data-component=\"avatar\">\n              <span class=\"ds-avatar ds-avatar--2\">IV</span>\n              <span><span class=\"ds-avatar__name\">Ines Varga</span><span class=\"ds-avatar__meta\">Forecaster, updated 2 October</span></span>\n            </div>\n            <p class=\"ds-panel__text\">Something unclear? <a class=\"ds-link\" href=\"#places\">Tell us which place</a> and we will look at its station.</p>\n          </div>\n        </section>\n        <section class=\"ds-panel\" data-component=\"panel\">\n          <h2 class=\"ds-panel__title\">Units</h2>\n          <div class=\"ds-panel__body\">\n            <p class=\"ds-panel__pair\"><span>Temperature</span> <span class=\"ds-panel__pair-value\">°C</span></p>\n            <p class=\"ds-panel__pair\"><span>Wind</span> <span class=\"ds-panel__pair-value\">km/h</span></p>\n            <p class=\"ds-panel__pair\"><span>Rain</span> <span class=\"ds-panel__pair-value\">mm</span></p>\n            <p class=\"ds-panel__pair\"><span>Pressure</span> <span class=\"ds-panel__pair-value\">hPa</span></p>\n          </div>\n        </section>\n      </div>\n    </div>\n  </section>\n\n</main>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <div class=\"ds-footer__inner\">\n    <span>chronoskin weather. Readings from public stations, refreshed every ten minutes.</span>\n    <ul class=\"ds-footer__links\">\n      <li><a class=\"ds-footer__link\" href=\"#guide\">Guide</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#places\">Places</a></li>\n      <li><a class=\"ds-footer__link\" href=\"#forecast\">Forecast</a></li>\n    </ul>\n  </div>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.glassmorphism.app.s07.p06.t06.u05\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"glassmorphism\",\n    \"years\": [\n      2020,\n      2026\n    ]\n  },\n  \"archetype\": \"app\",\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-gl-7665\",\n  \"short\": \"v1-gl-7665\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: rgb(32 24 40);\n  --color-canvas: rgb(32 24 40);\n  --color-surface: rgb(255 255 255 / 0.07);\n  --color-surface-alt: rgb(255 255 255 / 0.12);\n  --color-surface-strong: rgb(255 255 255 / 0.22);\n  --color-bar: rgb(19 19 19 / 0.72);\n  --color-bar-text: rgb(255 255 255);\n  --color-bar-alt: rgb(31 31 31 / 0.6);\n  --color-bar-alt-text: rgb(239 237 253);\n  --color-inverse: rgb(255 255 255);\n  --color-inverse-text: rgb(19 19 19);\n  --color-text: rgb(255 255 255);\n  --color-text-muted: rgb(255 255 255 / 0.65);\n  --color-heading: rgb(255 255 255);\n  --color-heading-alt: rgb(239 237 253 / 0.7);\n  --color-link: rgb(255 55 199);\n  --color-link-quiet: rgb(255 255 255);\n  --color-link-visited: rgb(147 130 255);\n  --color-link-hover: rgb(255 255 255);\n  --color-link-active: rgb(252 211 77);\n  --color-border: rgb(255 255 255 / 0.12);\n  --color-border-strong: rgb(255 255 255 / 0.26);\n  --color-border-muted: rgb(255 255 255 / 0.07);\n  --color-accent: rgb(252 211 77);\n  --color-accent-text: rgb(19 19 19);\n  --color-accent-alt: rgb(39 117 202);\n  --color-fill-1: rgb(245 13 180);\n  --color-fill-2: rgb(42 90 218);\n  --color-fill-3: rgb(255 77 0);\n  --color-fill-4: rgb(0 158 30);\n  --color-button: rgb(255 55 199);\n  --color-button-text: rgb(19 19 19);\n  --color-button-hover-text: rgb(19 19 19);\n  --color-button-secondary: rgb(255 255 255 / 0.09);\n  --color-button-secondary-text: rgb(255 255 255);\n  --color-input: rgb(19 19 19 / 0.6);\n  --color-input-text: rgb(255 255 255);\n  --color-input-border: rgb(255 255 255 / 0.24);\n  --color-disabled: rgb(31 31 31);\n  --color-disabled-text: rgb(255 255 255 / 0.4);\n  --color-danger: rgb(255 0 26);\n  --color-danger-surface: rgb(19 19 19 / 0.72);\n  --color-success: rgb(0 158 30);\n  --color-warning: rgb(255 77 0);\n  --color-notice: rgb(255 55 199 / 0.14);\n  --color-notice-text: rgb(255 255 255);\n  --color-focus: rgb(255 55 199);\n  --color-shadow: rgb(19 19 19 / 0.54);\n  --color-overlay: rgb(19 19 19 / 0.7);\n}\n\n/* @part type */\n:root {\n  --font-body: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n  --font-heading: \"SF Pro Display\", \"Segoe UI Variable Display\", \"Helvetica Neue\", system-ui, sans-serif;\n  --font-ui: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n  --font-mono: \"SF Mono\", ui-monospace, Menlo, \"Cascadia Mono\", Consolas, monospace;\n  --text-base: 15px;\n  --text-small: 12px;\n  --text-ui: 14px;\n  --text-large: 19px;\n  --text-display: 72px;\n  --text-h1: 34px;\n  --text-h2: 26px;\n  --text-h3: 17px;\n  --line-body: 1.45;\n  --line-heading: 1.2;\n  --line-display: 1;\n  --weight-body: 400;\n  --weight-bold: 600;\n  --weight-heading: 400;\n  --weight-display: 300;\n  --weight-ui: 500;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: -0.02em;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 26px;\n  --radius-panel: 24px;\n  --radius-pill: 40px;\n  --radius-page: 36px;\n  --shadow-panel: 0 30px 60px -28px var(--color-shadow);\n  --shadow-control: 0 10px 24px -10px color-mix(in srgb, var(--color-button) 70%, transparent);\n  --shadow-control-hover: 0 14px 32px -8px color-mix(in srgb, var(--color-button) 85%, transparent);\n  --shadow-control-pressed: 0 2px 6px -2px color-mix(in srgb, var(--color-button) 70%, transparent);\n  --shadow-dialog: 0 48px 96px -36px var(--color-shadow);\n  --shadow-text: none;\n  --fill-page:\n    radial-gradient(ellipse 80% 640px at 0 0, var(--color-fill-2), transparent 70%),\n    radial-gradient(ellipse 70% 720px at 100% 360px, var(--color-fill-3), transparent 70%),\n    radial-gradient(ellipse 80% 700px at 8% 1050px, var(--color-fill-4), transparent 70%),\n    radial-gradient(ellipse 70% 720px at 96% 1700px, var(--color-fill-2), transparent 70%),\n    radial-gradient(ellipse 80% 700px at 0 2400px, var(--color-fill-3), transparent 70%),\n    radial-gradient(ellipse 70% 720px at 100% 3100px, var(--color-fill-4), transparent 70%),\n    radial-gradient(ellipse 80% 700px at 6% 3800px, var(--color-fill-2), transparent 70%),\n    linear-gradient(150deg, var(--color-fill-1), var(--color-page) 45%, var(--color-fill-1));\n  --fill-bar: linear-gradient(180deg, color-mix(in srgb, white 12%, transparent), transparent), var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: linear-gradient(135deg, var(--color-inverse), color-mix(in srgb, var(--color-inverse), black 10%));\n  --fill-accent: var(--color-accent);\n  --fill-panel: linear-gradient(180deg, var(--color-surface-alt), var(--color-surface) 45%, color-mix(in srgb, var(--color-surface) 45%, transparent));\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button), white 25%);\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 3px solid var(--color-focus);\n  --transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;\n  --backdrop-blur: 40px;\n}\n"
  }
}
