{
  "id": "v1-bb-82b3",
  "long_id": "v1.bulletin-board-forums.app.s08.p02.t11.u03",
  "name": "Board calendar, 2002 to 2007",
  "era": {
    "slug": "bulletin-board-forums",
    "code": "bb",
    "name": "Bulletin-board forums",
    "years": [
      2002,
      2007
    ],
    "description": "Hosted forum software, 2002 to 2007: full-width tables of boards and topics with one-pixel gaps, tinted cells, a dark title bar on every block, and everything set in 10 and 11px Verdana."
  },
  "archetype": "app",
  "mode": "mix",
  "viewport": {
    "width": 1024,
    "fluid": true
  },
  "summary": "This is the calendar that came with board software in the first half of the 2000s and that busy communities used for chat nights, releases, contests and meetups: a month drawn as a ruled grid of day cells across the whole page, with the events as short links in their days. A dark masthead carries the name and a jump box, section tabs join the sheet under it, and below the month three equal columns list what is coming up, the calendars and the week's birthdays; an event has its own page with sign-up buttons, details and replies. The skin is the night one of gaming boards: navy cells on a darker sheet, glossy burnt orange bars, amber uppercase titles in Trebuchet over 12px Arial, square boxes and no motion.",
  "url": "https://chrono.skin/s/v1-bb-82b3",
  "preview_url": "https://chrono.skin/s/v1-bb-82b3/specimen.html",
  "files": {
    "STYLE.md": "# Board calendar, 2002 to 2007\n\n## Summary\n\nThis is the calendar that came with board software in the first half of the 2000s and that busy communities used for chat nights, releases, contests and meetups: a month drawn as a ruled grid of day cells across the whole page, with the events as short links in their days. A dark masthead carries the name and a jump box, section tabs join the sheet under it, and below the month three equal columns list what is coming up, the calendars and the week's birthdays; an event has its own page with sign-up buttons, details and replies. The skin is the night one of gaming boards: navy cells on a darker sheet, glossy burnt orange bars, amber uppercase titles in Trebuchet over 12px Arial, square boxes and no motion.\n\n## Layout\n\n- The page is fluid. `--size-page` is `100%`; `.ds-page` has `--space-5` (10px) of padding, so the sheet `.ds-page__frame` takes about 98% of the viewport. Designed at 1024px. Never centre a narrow column.\n- Order from the top, all inside the sheet: `.ds-nav__head`, the inverted masthead band with the brand and a tagline on the left and the month jump form on the right; `.ds-nav__bar`, a secondary bar on whose lower edge the section tabs stand, with the date line at its right; `.ds-page__body` with the views; the footer band. No text sits on the page colour.\n- A view is a `.ds-view` section whose `.ds-view__body` stacks its blocks `--space-5` apart. The month view is full-width blocks, then `.ds-columns`: as many equal columns as fit at `--size-col` (230px), three at 1024px.\n- The month grid `.ds-cal` is seven equal columns; a day cell is at least `--size-day` (82px) tall, the weekday head `--size-bar` (22px). The date tile of an event row is `--size-tile` (44px) wide. Table count columns are `--size-count` (60px), its date column `--size-date` (120px), rows at least `--size-row` (28px).\n- Spacing scale: `--space-1` 1px, `--space-2` 2px, `--space-3` 4px, `--space-4` 7px, `--space-5` 10px, `--space-6` 14px.\n  - `--space-1`: the gap between cells and rows inside any bordered block, and between day cells.\n  - `--space-2`: vertical padding of bars, strips and buttons; gap between events in a day and between tabs.\n  - `--space-3`: vertical padding of cells and tabs, padding inside a day cell, gap between inline items.\n  - `--space-4`: horizontal padding of cells and strips, padding of panel bodies, gap between buttons.\n  - `--space-5`: page and body padding and the gap between neighbouring blocks and columns. This is the only block gap.\n  - `--space-6`: side padding of the masthead, horizontal padding of tabs, list indents, padding of dialog and empty-state bodies.\n- Inner pages keep the masthead, the tab bar and the footer and drop the month heading. From the top: `.ds-breadcrumb`, then `.ds-page-header` in place of the hero (title and one line on the left, the action or the sign-up buttons on the right, no box), then the working blocks at full width: the calendar cells `.ds-grid`, `.ds-tabs` and `.ds-table` on the event list; `.ds-form` on the add page. An event page uses `.ds-layout`: text and replies in `.ds-layout__main` (at least `--size-main`, 440px), details and attendance in `.ds-layout__rail` (`--size-rail`, 230px) on the right. The member's calendar uses `.ds-columns` again.\n- Views. The specimen is a five-screen example calendar; the tab bar has one tab per view and marks the current one. `month` (home) is the month: heading with the previous and next links and the add button, notice, the month grid with its legend, then coming up, the calendars and birthdays in three columns, and the figures strip. `events` is every event as a list: the four calendars as cells, filter tabs, the event table in two groups, count line and page numbers. `event` is one event: sign-up buttons, the withdraw confirmation that the Withdraw button opens, the description as long text and replies beside the details and attendance. `add` is the event form as it came back with an error. `mine` is the member's calendar: sign-ups, an empty reminders box and the notification notes.\n- Form rows are a `--size-label` (180px) label cell and a field cell that takes the rest; text inputs are `--size-field` (260px) unless `--wide` or `--auto`; the year box of the jump form is `--size-year` (56px). A dialog is `--size-dialog` (52%) wide, centred in the flow on a band of the overlay colour.\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- Arial for everything: `--font-body`, `--font-heading` and `--font-ui` are the same Arial stack with Verdana second.\n- `--text-base`, `--text-large`, `--text-h2` and `--text-h3` are 13px; `--text-small` and `--text-ui` 11px; `--text-h1` 16px; `--text-display` 18px. Hierarchy comes from weight, not size. Nothing is larger than 18px.\n- Line height is `normal`. No tracking, no uppercase. `--weight-ui` is 700.\n- Every link is underlined, at rest and hovered: `--link-decoration`, `--link-decoration-quiet` and `--link-decoration-hover` are all `underline`.\n\n## Components\n\n- `ds-progress`: a quota or poll bar, a native `<progress>` with a label above (private-message quota).\n- `ds-accordion`: a collapsible `<details>` entry for a forum jump or an FAQ answer.\n- `ds-avatar`: the square picture of a member, placed under or beside the name.\n- `.ds-page`: on `<body>`. Wrap everything in `.ds-page__frame`; `.ds-page__body` holds the views. Each view is a `.ds-view` section (`.ds-view--home` for the month) and its blocks go in `.ds-view__body`. `.ds-columns` is the row of equal columns; `.ds-layout` with `.ds-layout__main` and `.ds-layout__rail` the two-column area. `.ds-page__legal` is an optional line of small print inside the sheet. `.ds-icon` sizes an inline SVG icon, `.ds-sprite` hides a symbol sheet, `.ds-block` puts a span on its own line, `.ds-scroll` lets a wide table scroll inside its own box.\n- `.ds-nav`: the site header. `.ds-nav__head` is the masthead with `.ds-nav__brand` (the `.ds-brand` and a `.ds-nav__tagline`) and the `.ds-nav__jump` form, whose year box also takes `.ds-nav__year`. `.ds-nav__bar` holds `.ds-nav__menu`, the row of `.ds-nav__link` tabs, and the `.ds-nav__today` line; the current tab takes `is-current`, and in the specimen one `:has()` rule per view applies the same dress.\n- `.ds-brand`: the site's mark and name at the left of the masthead; one per page. `.ds-brand__mark` is a square tile dressed like the primary button (`--fill-button`, `--color-button-text`, a `--color-border-strong` outline, `--radius-control`, `--shadow-control`), 1.4 times `--text-display`. `.ds-brand__name` is the name in `--font-heading` at `--text-display`. The name `chronoskin` and its mark are placeholders for the installing project's own name and logo: replace both, keep the tile.\n- `.ds-breadcrumb`: one bordered line at the top of an inner page, with `.ds-breadcrumb__link`, `.ds-breadcrumb__sep` and `.ds-breadcrumb__current`.\n- `.ds-hero`: the month heading, one bordered cell: `.ds-hero__text` with the month as `.ds-hero__title` and a `.ds-hero__lead` count line, and `.ds-hero__action` with the previous and next links (`.ds-hero__step`) and the add button. Never a banner.\n- `.ds-cal`: the month grid. Seven `.ds-cal__head` weekday cells, then one `.ds-cal__day` per day (`--weekend`, `--other` for a day of another month, `is-today`), each with a `.ds-cal__num` and its events as `.ds-cal__event` links (`--release`, `--contest`, `--upkeep`). An event name that does not fit is cut with an ellipsis; never let a day cell grow sideways.\n- `.ds-swatch`: the small square that names an event kind (`--release`, `--contest`, `--upkeep`). `.ds-legend` with `.ds-legend__item` explains the kinds under the month.\n- `.ds-page-header`: the head of an inner page. `.ds-page-header__text` holds `.ds-page-header__title` and one `.ds-page-header__desc` line; `.ds-page-header__action` or a `.ds-buttons` group sits at the right.\n- `.ds-prose`: long text such as an event description: h1, h2, h3, p, ul, strong, code, hr.\n- `.ds-link`: every link in text. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `.ds-link--quiet` for names and tools, `.ds-link--strong` for bold.\n- `.ds-button`: the primary action, glossy orange with white bold text. `.ds-button--secondary` is the plain navy button. `.ds-button--danger` is for a destructive action such as withdrawing or deleting an event; use it once per confirmation, beside a secondary button. `is-hover`, `is-active`, `is-focus`, `is-disabled` (or `disabled`). Group buttons in `.ds-buttons`.\n- `.ds-form`: a ruled block of rows. `.ds-form__title`, `.ds-form__row` with `.ds-form__label` (plus `.ds-form__hint`) and `.ds-form__field`; controls take `.ds-form__input` (`--wide`, `--auto`, `is-invalid`, `is-disabled`), errors `.ds-form__error`, checkboxes `.ds-form__check` and `.ds-form__checkbox`, buttons in `.ds-form__actions`.\n- `.ds-table`: the event list and any data table. `th` is the primary bar (`.ds-table__head--left` for text columns); `.ds-table__group` is a group row; `.ds-table__row--alt` the alternate row; cells `.ds-table__num` and `.ds-table__last` (the date); inside the main cell `.ds-table__title`, `.ds-table__desc`, `.ds-table__meta`.\n- `.ds-list`: event rows outside a table. `.ds-list__head`, then `.ds-list__item` (`is-alt` for the alternate row) made of a `.ds-list__date` tile with the day in `.ds-list__day` and a `.ds-list__text` cell with `.ds-list__title` and `.ds-list__meta`.\n- `.ds-panel`: any titled box. `.ds-panel__title` (add `--bar` for a main block), `.ds-panel__sub`, `.ds-panel__body` (`--alt`), `.ds-panel__line`. `.ds-spec` is the label and value list of an event inside a panel: `.ds-spec__label`, `.ds-spec__value`.\n- `.ds-stat`: summary figures as one ruled strip of equal cells. `.ds-stat__title` is optional; each `.ds-stat__item` has a `.ds-stat__value` over a `.ds-stat__label`. Use three to six.\n- `.ds-grid`: the calendars as cells with 1px gaps in one bordered block. `.ds-grid__title`, `.ds-grid__cell` (`--2`, `--3`, `--4` for the other fills) with a swatch, `.ds-grid__name`, `.ds-grid__meta` and `.ds-grid__count`.\n- `.ds-tabs`: a row of `.ds-tabs__tab` items on a 2px rule; `is-current` takes the primary bar fill. Use for the filters of one list.\n- `.ds-badge`: a small square label in the accent fill. `.ds-badge--quiet` is the secondary bar. `.ds-badge--success` (open, going), `.ds-badge--warning` (few places, maybe) and `.ds-badge--danger` (closed, cancelled) are tints with an outline. `.ds-new` is bold text for a \"new\" remark.\n- `.ds-sidebar`: a column of link boxes. Each `.ds-sidebar__block` has a `.ds-sidebar__title`, a `.ds-sidebar__list` of ruled `.ds-sidebar__item` rows with a `.ds-sidebar__count` figure, and an optional `.ds-sidebar__foot` with a `.ds-sidebar__footlink`.\n- `.ds-notice`: a tinted line for calendar news; `.ds-notice--error` is the error box with a `.ds-notice__title`. `.ds-notice__link` is a link inside either.\n- `.ds-pagination`: `.ds-pagination__label`, then small bordered `.ds-pagination__link` boxes; `is-current` for the current page. `.ds-toolbar` puts a count line on the left and the page numbers on the right.\n- `.ds-comment`: replies under an event, one ruled block: a `.ds-comment__head` strip per reply, then `.ds-comment__body` (`--alt`) with `.ds-comment__text` and an optional `.ds-comment__sig` signature line.\n- `.ds-dialog`: a confirmation box in the page flow with a 2px outline: `.ds-dialog__title`, `.ds-dialog__body`, `.ds-dialog__text`, `.ds-dialog__actions`, on a `.ds-dialog__backdrop` band. It never floats over the page.\n- `.ds-empty`: a ruled block with one centred message and one button for a list with nothing in it: `.ds-empty__title`, `.ds-empty__body`, `.ds-empty__text`.\n- `.ds-footer`: the dark band closing the sheet: a centred `.ds-footer__row` of `.ds-footer__link` items with `.ds-footer__sep` between them, and one `.ds-footer__line` under it.\n\n## Never\n\n- `row-gap <= 1px`: rows touch or are separated by a 1px line.\n- `block-gap <= 20px`: neighbouring blocks are 10px apart.\n- `content-width >= 90%`: the month fills the viewport.\n- `font-size <= 18px`: the site name is the largest text.\n- `font-size >= 11px`: 11px is the smallest size.\n- `font-weight <= 700`: bold is the heaviest weight.\n- `font-families <= 2`: Arial and a monospace for code.\n- `letter-spacing <= 0px`: no tracking.\n- `uppercase-text <= 0%`: nothing is transformed to uppercase.\n- `underlined-links >= 50%`: links are underlined, titles included.\n- `border-radius <= 0px`: every box is square.\n- `box-shadow = none`: no shadow in any reference.\n- `text-shadow = none`: no text shadow in any reference.\n- `gradient-fills <= 0%`: bars and buttons are flat colour.\n- `transition = none`: states switch at once.\n- `animation = none`: nothing moves.\n- `border-width <= 1px`: hairlines only.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen: a new titled box from `.ds-panel`, a new row layout from `.ds-list` or `.ds-table`, a week or day view from `.ds-cal`, a new figure list from `.ds-spec`. Build it as a 1px `--color-border` outline on `--fill-panel`, with cells in the three surface colours `--space-1` apart and a title in `--fill-bar` or `--color-surface-strong`. Keep text tokens on the fills named above (bar text on bars, heading text on the strong surface, quiet links on cells). Use tokens only: no raw colours or lengths, no new radius, shadow or transition, no font size outside the type tokens, and `--space-5` as the gap to the next block.\n",
    "components.css": "/* Layout tokens (structure part). The calendar of a board: a dark masthead\n   with the month jump box, section tabs that join the sheet, a month grid\n   across the full width, then three equal columns. */\n:root {\n  --size-page: 100%;\n  --size-main: 440px;\n  --size-rail: 230px;\n  --size-day: 82px;\n  --size-col: 230px;\n  --size-tile: 44px;\n  --size-year: 56px;\n  --size-count: 60px;\n  --size-date: 120px;\n  --size-row: 28px;\n  --size-bar: 22px;\n  --size-icon: 10px;\n  --size-label: 180px;\n  --size-field: 260px;\n  --size-dialog: 52%;\n  --space-1: 1px;\n  --space-2: 2px;\n  --space-3: 4px;\n  --space-4: 7px;\n  --space-5: 10px;\n  --space-6: 14px;\n}\n\n/* ---------- shell ---------- */\n.ds-page {\n  margin: 0;\n  padding: var(--space-5);\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n/* The sheet every block sits on. */\n.ds-page__frame {\n  width: var(--size-page);\n  box-sizing: border-box;\n  background: var(--color-canvas);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n}\n.ds-page__body {\n  padding: var(--space-5);\n}\n/* Small print, inside the sheet so it never sits on the page colour. */\n.ds-page__legal {\n  margin: 0;\n  padding: var(--space-4) var(--space-5);\n  text-align: center;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- nav: the masthead band with the jump box, then the section\n   tabs on the secondary bar ---------- */\n.ds-nav {\n  display: block;\n}\n.ds-nav__head {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-4) var(--space-6);\n  padding: var(--space-5) var(--space-6);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  border-radius: var(--radius-page) var(--radius-page) 0 0;\n}\n.ds-nav__brand {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: var(--space-3);\n}\n/* The mark on a button-dressed tile; the name takes the inverse text colour\n   because it stands on the inverted band. */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-4);\n  text-decoration: none;\n}\n.ds-brand__mark {\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: calc(var(--text-display) * 1.4);\n  height: calc(var(--text-display) * 1.4);\n  box-sizing: border-box;\n  background: var(--color-button);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 74%;\n  height: 74%;\n}\n.ds-brand__name {\n  color: var(--color-inverse-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-display);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-nav__tagline {\n  font-size: var(--text-small);\n  color: var(--color-inverse-text);\n}\n.ds-nav__jump {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin: 0;\n  font-size: var(--text-small);\n}\n.ds-nav__jump .ds-nav__year {\n  width: var(--size-year);\n}\n.ds-nav__bar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: 0 var(--space-5);\n  padding: var(--space-3) var(--space-5) 0;\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  border-top: var(--border-width) var(--border-style) var(--color-border-strong);\n}\n.ds-nav__menu {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-nav__link {\n  display: block;\n  padding: var(--space-3) var(--space-6);\n  color: var(--color-bar-alt-text);\n  border: var(--border-width) var(--border-style) transparent;\n  border-bottom: 0;\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\n  line-height: var(--line-heading);\n  text-decoration: none;\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-nav__link.is-current {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n/* The current view's tab, and the first tab when no view is named. */\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#month\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-page:has(#month:target) .ds-nav__link[href=\"#month\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-page:has(#events:target) .ds-nav__link[href=\"#events\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-page:has(#event:target) .ds-nav__link[href=\"#event\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-page:has(#add:target) .ds-nav__link[href=\"#add\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-page:has(#mine:target) .ds-nav__link[href=\"#mine\"] {\n  background: var(--color-canvas);\n  color: var(--color-heading);\n  border-color: var(--color-border-strong);\n}\n.ds-nav__today {\n  padding: var(--space-3) 0;\n  font-size: var(--text-small);\n}\n\n/* ---------- hero: the month heading ---------- */\n.ds-hero {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-4) var(--space-6);\n  padding: var(--space-4) var(--space-5);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-page);\n  box-shadow: var(--shadow-panel);\n}\n.ds-hero__text {\n  flex: 1 1 var(--size-col);\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-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-hero__lead {\n  margin: 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-hero__action {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-4);\n  margin: 0;\n  font-size: var(--text-small);\n}\n/* Previous and next month. */\n.ds-hero__step {\n  display: block;\n  padding: var(--space-1) var(--space-4);\n  background: var(--color-surface-alt);\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-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-hero__step:hover,\n.ds-hero__step.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- cal: the month grid ---------- */\n.ds-cal {\n  display: grid;\n  grid-template-columns: repeat(7, minmax(0, 1fr));\n  gap: var(--space-1);\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-cal__head {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: var(--size-bar);\n  overflow: hidden;\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-shadow: var(--shadow-text);\n}\n.ds-cal__day {\n  min-width: 0;\n  min-height: var(--size-day);\n  box-sizing: border-box;\n  padding: var(--space-2) var(--space-3) var(--space-3);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) transparent;\n  font-size: var(--text-small);\n}\n.ds-cal__day--weekend {\n  background: var(--color-surface-alt);\n}\n.ds-cal__day--other {\n  background: var(--color-fill-3);\n}\n.ds-cal__day.is-today {\n  background: var(--color-fill-4);\n  border-color: var(--color-accent);\n}\n.ds-cal__num {\n  display: block;\n  color: var(--color-text-muted);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  text-align: right;\n}\n.ds-cal__day.is-today .ds-cal__num {\n  color: var(--color-heading);\n}\n.ds-cal__day--other .ds-cal__num {\n  font-weight: var(--weight-body);\n}\n.ds-cal__event {\n  display: block;\n  overflow: hidden;\n  margin: var(--space-2) 0 0;\n  padding: 0 0 0 var(--space-3);\n  border-left: var(--border-width-strong) solid var(--color-bar-alt);\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.ds-cal__event:hover,\n.ds-cal__event.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-cal__event--release {\n  border-left-color: var(--color-success);\n}\n.ds-cal__event--contest {\n  border-left-color: var(--color-warning);\n}\n.ds-cal__event--upkeep {\n  border-left-color: var(--color-danger);\n}\n\n/* ---------- swatch and legend: the event kinds ---------- */\n.ds-swatch {\n  display: inline-block;\n  flex: none;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  background: var(--color-bar-alt);\n}\n.ds-swatch--release {\n  background: var(--color-success);\n}\n.ds-swatch--contest {\n  background: var(--color-warning);\n}\n.ds-swatch--upkeep {\n  background: var(--color-danger);\n}\n.ds-legend {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: var(--space-3) var(--space-6);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n}\n.ds-legend__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* ---------- three equal columns under the month ---------- */\n.ds-columns {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(var(--size-col), 1fr));\n  gap: var(--space-5);\n  align-items: start;\n}\n\n/* ---------- grid: the calendars, one cell each ---------- */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(var(--size-rail), 1fr));\n  gap: var(--space-1);\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-grid__title {\n  grid-column: 1 / -1;\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-grid__cell {\n  padding: var(--space-4);\n  background: var(--color-fill-1);\n  border-radius: var(--radius-page);\n  font-size: var(--text-small);\n}\n.ds-grid__cell--2 {\n  background: var(--color-fill-2);\n}\n.ds-grid__cell--3 {\n  background: var(--color-fill-3);\n}\n.ds-grid__cell--4 {\n  background: var(--color-fill-4);\n}\n.ds-grid__name {\n  color: var(--color-link-quiet);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-grid__name:hover,\n.ds-grid__name.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-grid__meta {\n  display: block;\n  padding: var(--space-2) 0 0;\n  color: var(--color-text);\n}\n.ds-grid__count {\n  display: block;\n  color: var(--color-text-muted);\n}\n\n/* ---------- list: events with a date tile ---------- */\n.ds-list {\n  display: grid;\n  align-content: start;\n  gap: var(--space-1);\n  margin: 0;\n  padding: var(--space-1);\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}\n.ds-list__head {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-list__item {\n  display: grid;\n  grid-template-columns: var(--size-tile) minmax(0, 1fr);\n  gap: var(--space-1);\n}\n.ds-list__date {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-2) 0;\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-size: var(--text-small);\n}\n.ds-list__day {\n  color: var(--color-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-display);\n}\n.ds-list__text {\n  min-width: 0;\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface);\n}\n.ds-list__item.is-alt .ds-list__text {\n  background: var(--color-fill-3);\n}\n.ds-list__title {\n  color: var(--color-link-quiet);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__title:hover,\n.ds-list__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-list__meta {\n  display: block;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- spec: label and value rows of an event ---------- */\n.ds-spec {\n  display: grid;\n  grid-template-columns: auto minmax(0, 1fr);\n  gap: var(--space-1);\n  margin: 0;\n  font-size: var(--text-small);\n}\n.ds-spec__label {\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface-alt);\n  font-weight: var(--weight-bold);\n}\n.ds-spec__value {\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface);\n}\n\n/* ---------- footer ---------- */\n.ds-footer {\n  padding: var(--space-4) var(--space-5);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  border-radius: 0 0 var(--radius-page) var(--radius-page);\n  font-size: var(--text-small);\n  text-align: center;\n}\n.ds-footer__row {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: var(--space-3);\n  margin: 0 0 var(--space-2);\n  padding: 0;\n  list-style: none;\n  font-weight: var(--weight-bold);\n}\n.ds-footer__link {\n  color: var(--color-inverse-text);\n  text-decoration: underline;\n}\n.ds-footer__link:hover,\n.ds-footer__link.is-hover {\n  color: var(--color-bar-text);\n}\n.ds-footer__sep {\n  color: var(--color-bar-alt);\n}\n.ds-footer__line {\n  margin: 0;\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/* The column of blocks inside a view, one block gap apart. */\n.ds-view__body {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-sprite {\n  position: absolute;\n}\n.ds-icon {\n  flex: none;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  vertical-align: middle;\n}\n.ds-block {\n  display: block;\n}\n/* Lets a wide table scroll inside its own box on a narrow window. */\n.ds-scroll {\n  max-width: 100%;\n  overflow-x: auto;\n}\n\n/* ---------- links ---------- */\n.ds-link {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n/* Dark links for tools, meta and member names. */\n.ds-link--quiet,\n.ds-link--quiet:visited,\n.ds-link--quiet.is-visited {\n  color: var(--color-link-quiet);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-link--quiet:hover,\n.ds-link--quiet.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link--strong {\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- breadcrumb ---------- */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  list-style: none;\n  background: var(--color-fill-4);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\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  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-breadcrumb__sep {\n  color: var(--color-text-muted);\n  font-weight: var(--weight-body);\n}\n.ds-breadcrumb__current {\n  color: var(--color-text);\n}\n\n/* ---------- page header: the head of an inner page ---------- */\n.ds-page-header {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: var(--space-4) var(--space-6);\n}\n.ds-page-header__text {\n  flex: 1 1 50%;\n  min-width: 0;\n}\n.ds-page-header__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-page-header__desc {\n  margin: 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n.ds-page-header__action {\n  flex: none;\n}\n\n/* ---------- typography ---------- */\n.ds-prose {\n  padding: var(--space-4) var(--space-5);\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n  font-size: var(--text-base);\n  line-height: var(--line-body);\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0 0 var(--space-3);\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  color: var(--color-heading);\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  padding: var(--space-4) 0 0;\n  color: var(--color-heading-alt);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  color: var(--color-text);\n  font-size: var(--text-h3);\n}\n.ds-prose p {\n  margin: 0 0 var(--space-4);\n}\n.ds-prose ul {\n  margin: 0 0 var(--space-4);\n  padding: 0 0 0 var(--space-6);\n}\n.ds-prose strong {\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-2);\n  background: var(--color-surface-alt);\n  font-family: var(--font-mono);\n  font-size: var(--text-base);\n}\n.ds-prose hr {\n  height: 0;\n  margin: var(--space-4) 0;\n  border: 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n\n/* ---------- buttons ---------- */\n.ds-button {\n  display: inline-block;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  box-shadow: var(--shadow-control);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n}\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}\n/* The plain system button. */\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n  border-color: var(--color-input-border);\n  font-weight: var(--weight-body);\n  text-shadow: none;\n}\n.ds-button--secondary:active,\n.ds-button--secondary.is-active {\n  background: var(--color-disabled);\n}\n/* Destructive action: the error pair, error text on the error surface with\n   an error outline. It does not depend on the primary button's colours. */\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n  border-color: var(--color-danger);\n  text-shadow: none;\n}\n.ds-button:disabled,\n.ds-button.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  border-color: var(--color-disabled-text);\n  box-shadow: none;\n  text-shadow: none;\n  cursor: default;\n}\n.ds-buttons {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-4);\n}\n\n/* ---------- form ---------- */\n.ds-form {\n  display: grid;\n  gap: var(--space-1);\n  margin: 0;\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-form__title {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-form__row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1);\n}\n.ds-form__label {\n  flex: 1 1 var(--size-label);\n  box-sizing: border-box;\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface-alt);\n  font-size: var(--text-base);\n  font-weight: var(--weight-bold);\n}\n.ds-form__hint {\n  display: block;\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  color: var(--color-text-muted);\n}\n.ds-form__field {\n  flex: 999 1 var(--size-field);\n  min-width: 0;\n  box-sizing: border-box;\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface);\n  font-size: var(--text-base);\n}\n.ds-form__input {\n  box-sizing: border-box;\n  width: var(--size-field);\n  max-width: 100%;\n  margin: 0;\n  padding: var(--space-2) var(--space-3);\n  background: var(--fill-input);\n  color: var(--color-input-text);\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  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-body);\n}\n.ds-form__input--wide {\n  width: 100%;\n}\n.ds-form__input--auto {\n  width: auto;\n}\n.ds-form__input:focus-visible,\n.ds-form__input.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-form__input:disabled,\n.ds-form__input.is-disabled {\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n}\n.ds-form__input.is-invalid {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  display: block;\n  margin: var(--space-2) 0 0;\n  color: var(--color-danger);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-form__check {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-form__checkbox {\n  margin: 0;\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  align-items: center;\n  gap: var(--space-4);\n  padding: var(--space-3);\n  background: var(--color-surface-strong);\n}\n\n/* ---------- badge ---------- */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-3);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  border-radius: var(--radius-pill);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  letter-spacing: 0;\n  text-transform: none;\n  text-shadow: none;\n  font-weight: var(--weight-bold);\n  white-space: nowrap;\n}\n.ds-badge--quiet {\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n}\n/* Status labels: a tint of the status colour over the cell surface, with body\n   text and the status colour as the outline, so they read under any palette. */\n.ds-badge--success,\n.ds-badge--warning,\n.ds-badge--danger {\n  color: var(--color-text);\n  border: var(--border-width) var(--border-style) var(--color-success);\n}\n.ds-badge--success {\n  background: color-mix(in srgb, var(--color-success) 30%, var(--color-surface));\n}\n.ds-badge--warning {\n  background: color-mix(in srgb, var(--color-warning) 30%, var(--color-surface));\n  border-color: var(--color-warning);\n}\n.ds-badge--danger {\n  background: color-mix(in srgb, var(--color-danger) 30%, var(--color-surface));\n  border-color: var(--color-danger);\n}\n.ds-new {\n  color: var(--color-accent-alt);\n  font-weight: var(--weight-bold);\n}\n\n/* ---------- notice ---------- */\n/* The edge is a half mix of the accent and the notice colour. */\n.ds-notice {\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-accent) 50%, var(--color-notice));\n  border-radius: var(--radius-panel);\n  font-size: var(--text-small);\n}\n.ds-notice--error {\n  background: var(--color-danger-surface);\n  color: var(--color-text);\n  border-color: var(--color-danger);\n}\n.ds-notice__title {\n  color: var(--color-danger);\n  font-weight: var(--weight-bold);\n}\n/* A link inside a notice takes the notice text colour and stays underlined. */\n.ds-notice__link {\n  color: inherit;\n  font-weight: var(--weight-bold);\n  text-decoration: underline;\n}\n\n/* ---------- pagination ---------- */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  align-items: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-small);\n}\n.ds-pagination__label {\n  padding: 0 var(--space-3) 0 0;\n  color: var(--color-text-muted);\n}\n.ds-pagination__link {\n  display: block;\n  padding: var(--space-1) 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);\n  text-decoration: var(--link-decoration);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-pagination__link.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-weight: var(--weight-bold);\n  text-decoration: none;\n}\n/* Tools on the left, page numbers on the right. */\n.ds-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--space-4) var(--space-5);\n  font-size: var(--text-small);\n}\n\n/* ---------- dialog: a message box in the page flow ---------- */\n.ds-dialog {\n  display: grid;\n  gap: var(--space-1);\n  width: var(--size-dialog);\n  min-width: min(100%, var(--size-field));\n  max-width: 100%;\n  box-sizing: border-box;\n  margin: 0 auto;\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__title {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n  text-shadow: var(--shadow-text);\n}\n.ds-dialog__body {\n  padding: var(--space-6) var(--space-5);\n  background: var(--color-surface);\n  font-size: var(--text-base);\n  text-align: center;\n}\n.ds-dialog__text {\n  margin: 0 0 var(--space-5);\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: var(--space-4);\n}\n.ds-dialog__backdrop {\n  padding: var(--space-5);\n  background: var(--color-overlay);\n  color: var(--color-text);\n  border-radius: var(--radius-panel);\n}\n\n/* ---------- empty state: a single message row ---------- */\n.ds-empty {\n  display: grid;\n  gap: var(--space-1);\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-empty__title {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-empty__body {\n  padding: var(--space-6) var(--space-5);\n  background: var(--color-surface);\n  font-size: var(--text-base);\n  text-align: center;\n}\n.ds-empty__text {\n  margin: 0 0 var(--space-4);\n}\n\n/* ---------- panel ---------- */\n.ds-panel {\n  display: grid;\n  align-content: start;\n  gap: var(--space-1);\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__title {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n/* Primary bar as the title strip: main blocks. */\n.ds-panel__title--bar {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-shadow: var(--shadow-text);\n}\n.ds-panel__sub {\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-panel__body {\n  padding: var(--space-4);\n  background: var(--color-surface);\n  font-size: var(--text-small);\n  line-height: var(--line-body);\n}\n.ds-panel__body--alt {\n  background: var(--color-surface-alt);\n}\n.ds-panel__line {\n  margin: 0 0 var(--space-3);\n}\n.ds-panel__line:last-child {\n  margin: 0;\n}\n\n/* ---------- table ---------- */\n.ds-table {\n  width: 100%;\n  box-sizing: border-box;\n  border-collapse: separate;\n  border-spacing: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-table th {\n  height: var(--size-bar);\n  padding: 0 var(--space-4);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-align: center;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n}\n.ds-table .ds-table__head--left {\n  text-align: left;\n}\n.ds-table td {\n  height: var(--size-row);\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface);\n  font-size: var(--text-small);\n  vertical-align: middle;\n}\n/* The era's alternating row colour. */\n.ds-table .ds-table__row--alt td {\n  background: var(--color-fill-3);\n}\n.ds-table .ds-table__num,\n.ds-table .ds-table__row--alt .ds-table__num,\n.ds-table .ds-table__last,\n.ds-table .ds-table__row--alt .ds-table__last {\n  background: var(--color-surface-alt);\n}\n.ds-table .ds-table__num {\n  width: var(--size-count);\n  font-size: var(--text-base);\n  text-align: center;\n  white-space: nowrap;\n}\n.ds-table .ds-table__last {\n  width: var(--size-date);\n  white-space: nowrap;\n}\n/* Group row: the strongest surface, heading text. */\n.ds-table .ds-table__group td {\n  height: var(--size-bar);\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-table__title {\n  color: var(--color-link-quiet);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-table__title:hover,\n.ds-table__title.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-table__desc {\n  display: block;\n  padding: var(--space-1) 0 0;\n}\n.ds-table__meta {\n  display: block;\n  color: var(--color-text-muted);\n}\n\n/* ---------- tabs ---------- */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  border-bottom: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n}\n.ds-tabs__tab {\n  display: block;\n  padding: var(--space-3) var(--space-6);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  border-radius: var(--radius-control) var(--radius-control) 0 0;\n  text-decoration: none;\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-tabs__tab.is-current {\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  text-shadow: var(--shadow-text);\n}\n\n/* ---------- stats: a strip of count cells ---------- */\n.ds-stat {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1);\n  margin: 0;\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-stat__title {\n  flex: 0 0 100%;\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-stat__item {\n  flex: 1 1 var(--size-count);\n  padding: var(--space-3) var(--space-4);\n  background: var(--color-surface-alt);\n  text-align: center;\n}\n.ds-stat__value {\n  display: block;\n  color: var(--color-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n}\n.ds-stat__label {\n  display: block;\n  padding: var(--space-1) 0 0;\n  font-size: var(--text-small);\n  color: var(--color-text-muted);\n}\n\n/* ---------- two-column area: a working column and a rail ---------- */\n.ds-layout {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-start;\n  gap: var(--space-5);\n}\n.ds-layout__main {\n  flex: 999 1 var(--size-main);\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-layout__rail {\n  flex: 1 1 var(--size-rail);\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n\n/* ---------- sidebar ---------- */\n.ds-sidebar {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-sidebar__block {\n  background: var(--color-surface);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-sidebar__title {\n  display: flex;\n  align-items: center;\n  min-height: var(--size-bar);\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--color-surface-strong);\n  color: var(--color-heading-alt);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: var(--space-3) var(--space-4) var(--space-4);\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n  gap: var(--space-4);\n  padding: var(--space-2) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  font-size: var(--text-small);\n}\n.ds-sidebar__item:last-child {\n  border-bottom: 0;\n}\n.ds-sidebar__count {\n  flex: none;\n  color: var(--color-text-muted);\n}\n.ds-sidebar__foot {\n  margin: 0;\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-align: center;\n}\n.ds-sidebar__footlink {\n  color: var(--color-bar-alt-text);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-sidebar__footlink:hover,\n.ds-sidebar__footlink.is-hover {\n  text-decoration: var(--link-decoration-hover);\n}\n\n/* ---------- comments: short replies under a page ---------- */\n.ds-comment {\n  display: grid;\n  gap: var(--space-1);\n  padding: var(--space-1);\n  background: var(--fill-panel);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n}\n.ds-comment__head {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  gap: var(--space-2) var(--space-5);\n  padding: var(--space-2) var(--space-4);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-comment__body {\n  padding: var(--space-4);\n  background: var(--color-surface);\n  font-size: var(--text-base);\n  line-height: var(--line-body);\n}\n.ds-comment__body--alt {\n  background: var(--color-fill-3);\n}\n.ds-comment__text {\n  margin: 0;\n}\n.ds-comment__sig {\n  margin: var(--space-3) 0 0;\n  padding: var(--space-2) 0 0;\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* The current item also carries a weight and a bar that a token set cannot reduce to the bar's own fill. */\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#month\"],\n.ds-page:has(#month:target) .ds-nav__link[href=\"#month\"],\n.ds-page:has(#events:target) .ds-nav__link[href=\"#events\"],\n.ds-page:has(#event:target) .ds-nav__link[href=\"#event\"],\n.ds-page:has(#add:target) .ds-nav__link[href=\"#add\"],\n.ds-page:has(#mine:target) .ds-nav__link[href=\"#mine\"] {\n  font-weight: var(--weight-bold, 700);\n}\n\n/* ---------- progress: a quota or poll bar ---------- */\n.ds-progress {\n  display: block;\n  margin: 0 0 var(--space-3);\n  font-size: var(--text-small);\n  color: var(--color-text);\n}\n.ds-progress__label {\n  display: block;\n  margin-bottom: var(--space-1);\n}\n.ds-progress__bar {\n  display: block;\n  width: 100%;\n  height: var(--size-meter);\n  box-sizing: border-box;\n  appearance: none;\n  -webkit-appearance: none;\n  border: var(--border-width) var(--border-style) var(--color-border-strong);\n  border-radius: var(--radius-control);\n  background: var(--color-input);\n  color: var(--color-accent);\n  overflow: hidden;\n}\n.ds-progress__bar::-webkit-progress-bar {\n  background: var(--color-input);\n}\n.ds-progress__bar::-webkit-progress-value {\n  background: var(--color-accent);\n}\n.ds-progress__bar::-moz-progress-bar {\n  background: var(--color-accent);\n}\n\n/* ---------- accordion: a collapsible category or FAQ entry ---------- */\n.ds-accordion {\n  margin: 0 0 var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--color-canvas);\n  color: var(--color-text);\n  font-size: var(--text-small);\n}\n.ds-accordion__head {\n  display: block;\n  padding: var(--space-1) var(--space-2);\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  cursor: pointer;\n}\n.ds-accordion[open] > .ds-accordion__head {\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-accordion__body {\n  margin: 0;\n  padding: var(--space-2);\n}\n.ds-accordion__list {\n  margin: 0;\n  padding: 0 0 0 var(--space-4);\n}\n\n/* ---------- avatar: the picture under a post author's name ---------- */\n.ds-avatar {\n  display: flex;\n  flex: none;\n  align-items: flex-end;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  box-sizing: border-box;\n  margin: var(--space-1) 0;\n  overflow: hidden;\n  background: var(--color-surface-alt);\n  color: var(--color-text-muted);\n  border: var(--border-width) var(--border-style) var(--color-border);\n}\n.ds-avatar svg {\n  display: block;\n  width: 80%;\n  height: 80%;\n}\n\n:root {\n  --size-avatar: 56px;\n  --size-meter: 12px;\n}\n.ds-sprite {\n  position: absolute;\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: board calendar specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n<svg class=\"ds-sprite\" width=\"0\" height=\"0\" aria-hidden=\"true\"><symbol id=\"i-person\" viewBox=\"0 0 16 16\"><circle cx=\"8\" cy=\"5.5\" r=\"3\" fill=\"currentColor\"/><path d=\"M2 15c0-3.5 2.7-5.5 6-5.5s6 2 6 5.5z\" fill=\"currentColor\"/></symbol></svg>\n\n<div class=\"ds-page__frame\">\n\n  <header class=\"ds-nav\" data-component=\"nav\">\n    <div class=\"ds-nav__head\">\n      <div class=\"ds-nav__brand\">\n        <a class=\"ds-brand\" data-component=\"brand\" href=\"#\">\n          <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 2.8L19.8 5.6V11.5C19.8 16.4 16.5 19.8 12 21.4C7.5 19.8 4.2 16.4 4.2 11.5V5.6Z\"/><path d=\"M12 2.8L19.8 5.6V11.5C19.8 16.4 16.5 19.8 12 21.4Z\" fill=\"currentColor\"/></svg></span>\n          <span class=\"ds-brand__name\">chronoskin</span>\n        </a>\n        <span class=\"ds-nav__tagline\">Community calendar: chat nights, releases, contests and meetups</span>\n      </div>\n      <form class=\"ds-nav__jump\" action=\"#\">\n        <label for=\"j-month\">Jump to</label>\n        <select class=\"ds-form__input ds-form__input--auto\" id=\"j-month\"><option>November</option><option>December</option><option>January</option></select>\n        <input class=\"ds-form__input ds-nav__year\" type=\"text\" value=\"2005\" aria-label=\"Year\">\n        <button class=\"ds-button ds-button--secondary\" type=\"button\">Go</button>\n      </form>\n    </div>\n    <div class=\"ds-nav__bar\">\n      <ul class=\"ds-nav__menu\">\n        <li><a class=\"ds-nav__link\" href=\"#month\">Month</a></li>\n        <li><a class=\"ds-nav__link\" href=\"#events\">All events</a></li>\n        <li><a class=\"ds-nav__link\" href=\"#event\">Autumn meetup</a></li>\n        <li><a class=\"ds-nav__link\" href=\"#add\">Add event</a></li>\n        <li><a class=\"ds-nav__link\" href=\"#mine\">My calendar</a></li>\n      </ul>\n      <span class=\"ds-nav__today\">Today is Thursday, 10 November 2005. All times are GMT.</span>\n    </div>\n  </header>\n\n  <main class=\"ds-page__body\">\n\n    <!-- ======== month: the month grid ======== -->\n    <section class=\"ds-view ds-view--home\" id=\"month\">\n      <div class=\"ds-view__body\">\n\n        <section class=\"ds-hero\" data-component=\"hero\">\n          <div class=\"ds-hero__text\">\n            <h1 class=\"ds-hero__title\">November 2005</h1>\n            <p class=\"ds-hero__lead\">14 events this month, 3 of them this week. You are signed up for 2.</p>\n          </div>\n          <p class=\"ds-hero__action\">\n            <a class=\"ds-hero__step\" href=\"#month\">&laquo; October</a>\n            <a class=\"ds-hero__step\" href=\"#month\">December &raquo;</a>\n            <a class=\"ds-button\" href=\"#add\">Add an event</a>\n          </p>\n        </section>\n\n        <p class=\"ds-notice\" data-component=\"notice\"><strong>Read-only on Tuesday:</strong> the board is upgraded on 8 November from 06:00 to 08:00. Sign-ups made before then are kept. <a class=\"ds-notice__link\" href=\"#event\">Details</a></p>\n\n        <div class=\"ds-cal\">\n          <div class=\"ds-cal__head\">Mon</div>\n          <div class=\"ds-cal__head\">Tue</div>\n          <div class=\"ds-cal__head\">Wed</div>\n          <div class=\"ds-cal__head\">Thu</div>\n          <div class=\"ds-cal__head\">Fri</div>\n          <div class=\"ds-cal__head\">Sat</div>\n          <div class=\"ds-cal__head\">Sun</div>\n          <div class=\"ds-cal__day ds-cal__day--other\"><span class=\"ds-cal__num\">31</span><a class=\"ds-cal__event\" href=\"#event\">Halloween avatars</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">1</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">2</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">3</span><a class=\"ds-cal__event ds-cal__event--contest\" href=\"#event\">Skin contest opens</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">4</span></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">5</span><a class=\"ds-cal__event\" href=\"#event\">Chat night, 20:00</a></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">6</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">7</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">8</span><a class=\"ds-cal__event ds-cal__event--upkeep\" href=\"#event\">Board upgrade</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">9</span></div>\n          <div class=\"ds-cal__day is-today\"><span class=\"ds-cal__num\">10</span><a class=\"ds-cal__event ds-cal__event--release\" href=\"#event\">Harvest 1.5 release</a><a class=\"ds-cal__event\" href=\"#event\">Moderator meeting</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">11</span></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">12</span><a class=\"ds-cal__event\" href=\"#event\">Chat night, 20:00</a></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">13</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">14</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">15</span><a class=\"ds-cal__event ds-cal__event--contest\" href=\"#event\">Button set deadline</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">16</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">17</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">18</span><a class=\"ds-cal__event\" href=\"#event\">Autumn meetup</a></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">19</span><a class=\"ds-cal__event\" href=\"#event\">Autumn meetup</a><a class=\"ds-cal__event\" href=\"#event\">Chat night, 20:00</a></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">20</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">21</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">22</span><a class=\"ds-cal__event ds-cal__event--release\" href=\"#event\">Slate 1.3 release</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">23</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">24</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">25</span></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">26</span><a class=\"ds-cal__event\" href=\"#event\">Chat night, 20:00</a></div>\n          <div class=\"ds-cal__day ds-cal__day--weekend\"><span class=\"ds-cal__num\">27</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">28</span><a class=\"ds-cal__event ds-cal__event--contest\" href=\"#event\">Contest voting closes</a></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">29</span></div>\n          <div class=\"ds-cal__day\"><span class=\"ds-cal__num\">30</span><a class=\"ds-cal__event ds-cal__event--upkeep\" href=\"#event\">Backup window</a></div>\n          <div class=\"ds-cal__day ds-cal__day--other\"><span class=\"ds-cal__num\">1</span></div>\n          <div class=\"ds-cal__day ds-cal__day--other\"><span class=\"ds-cal__num\">2</span></div>\n          <div class=\"ds-cal__day ds-cal__day--other\"><span class=\"ds-cal__num\">3</span><a class=\"ds-cal__event\" href=\"#event\">Chat night, 20:00</a></div>\n          <div class=\"ds-cal__day ds-cal__day--other\"><span class=\"ds-cal__num\">4</span></div>\n        </div>\n        <ul class=\"ds-legend\">\n          <li class=\"ds-legend__item\"><span class=\"ds-swatch\"></span> Meetups and chat nights</li>\n          <li class=\"ds-legend__item\"><span class=\"ds-swatch ds-swatch--release\"></span> Releases</li>\n          <li class=\"ds-legend__item\"><span class=\"ds-swatch ds-swatch--contest\"></span> Contests</li>\n          <li class=\"ds-legend__item\"><span class=\"ds-swatch ds-swatch--upkeep\"></span> Board upkeep</li>\n        </ul>\n\n        <div class=\"ds-columns\">\n          <ul class=\"ds-list\" data-component=\"list\">\n            <li class=\"ds-list__head\">Coming up</li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">10</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Harvest 1.5 release</a> <span class=\"ds-badge\" data-component=\"badge\">Today</span>\n                <span class=\"ds-list__meta\">Releases, 18:00. Posted by oldpine.</span></div>\n            </li>\n            <li class=\"ds-list__item is-alt\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">12</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Chat night</a>\n                <span class=\"ds-list__meta\">Meetups, 20:00 to midnight. 11 going.</span></div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">15</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Button set deadline</a>\n                <span class=\"ds-list__meta\">Contests, entries close at 23:59.</span></div>\n            </li>\n            <li class=\"ds-list__item is-alt\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">18</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Autumn meetup</a> <span class=\"ds-badge ds-badge--warning\">4 places left</span>\n                <span class=\"ds-list__meta\">Meetups, two days. 26 of 30 going.</span></div>\n            </li>\n          </ul>\n\n          <aside class=\"ds-sidebar\" data-component=\"sidebar\">\n            <div class=\"ds-sidebar__block\"><h2 class=\"ds-sidebar__title\">Your quota</h2><span class=\"ds-avatar\"><svg aria-hidden=\"true\"><use href=\"#i-person\"/></svg></span><div class=\"ds-progress\"><span class=\"ds-progress__label\">Private messages: 68 of 100</span><progress class=\"ds-progress__bar\" value=\"68\" max=\"100\">68%</progress></div><details class=\"ds-accordion\"><summary class=\"ds-accordion__head\">Forum jump</summary><div class=\"ds-accordion__body\"><ul class=\"ds-accordion__list\"><li><a class=\"ds-link\" href=\"#month\">Board index</a></li><li><a class=\"ds-link\" href=\"#events\">Topic listing</a></li><li><a class=\"ds-link\" href=\"#add\">Help and rules</a></li></ul></div></details><details class=\"ds-accordion\"><summary class=\"ds-accordion__head\">FAQ: posting</summary><div class=\"ds-accordion__body\">Keep one topic to one subject and search before you ask.</div></details></div>\n        <div class=\"ds-sidebar__block\">\n              <h2 class=\"ds-sidebar__title\">Calendars</h2>\n              <ul class=\"ds-sidebar__list\">\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#events\">Meetups and chat nights</a><span class=\"ds-sidebar__count\">6</span></li>\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#events\">Releases</a><span class=\"ds-sidebar__count\">2</span></li>\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#events\">Contests</a><span class=\"ds-sidebar__count\">3</span></li>\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#events\">Board upkeep</a><span class=\"ds-sidebar__count\">2</span></li>\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#mine\">Your own reminders</a><span class=\"ds-sidebar__count\">0</span></li>\n                <li class=\"ds-sidebar__item\"><a class=\"ds-link\" href=\"#month\">Member birthdays</a><span class=\"ds-sidebar__count\">9</span></li>\n              </ul>\n              <p class=\"ds-sidebar__foot\"><a class=\"ds-sidebar__footlink\" href=\"#events\">All events as a list</a></p>\n            </div>\n          </aside>\n\n          <section class=\"ds-panel\" data-component=\"panel\">\n            <h2 class=\"ds-panel__title\">Birthdays this week</h2>\n            <div class=\"ds-panel__body\">\n              <p class=\"ds-panel__line\"><strong>Today:</strong> <a class=\"ds-link ds-link--quiet\" href=\"#mine\">tessa</a> (27), <a class=\"ds-link ds-link--quiet\" href=\"#mine\">corbin</a></p>\n              <p class=\"ds-panel__line\"><strong>Sat 12:</strong> <a class=\"ds-link ds-link--quiet\" href=\"#mine\">marek_v</a> (31)</p>\n              <p class=\"ds-panel__line\"><strong>Sun 13:</strong> <a class=\"ds-link ds-link--quiet\" href=\"#mine\">ilse</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">fenwick</a> (40)</p>\n              <p class=\"ds-panel__line\"><strong>Mon 14:</strong> <a class=\"ds-link ds-link--quiet\" href=\"#mine\">harrow</a> (35)</p>\n            </div>\n            <p class=\"ds-panel__sub\">On this day</p>\n            <div class=\"ds-panel__body ds-panel__body--alt\">\n              <p class=\"ds-panel__line\">2003: the board opened with 4 forums and 12 members.</p>\n              <p class=\"ds-panel__line\">2004: the first chat night, with 9 members.</p>\n            </div>\n          </section>\n        </div>\n\n        <div class=\"ds-stat\" data-component=\"stats\">\n          <div class=\"ds-stat__item\"><span class=\"ds-stat__value\">14</span><span class=\"ds-stat__label\">events this month</span></div>\n          <div class=\"ds-stat__item\"><span class=\"ds-stat__value\">87</span><span class=\"ds-stat__label\">sign-ups</span></div>\n          <div class=\"ds-stat__item\"><span class=\"ds-stat__value\">9</span><span class=\"ds-stat__label\">birthdays</span></div>\n          <div class=\"ds-stat__item\"><span class=\"ds-stat__value\">212</span><span class=\"ds-stat__label\">events since 2003</span></div>\n        </div>\n\n      </div>\n    </section>\n\n    <!-- ======== events: every event as a list ======== -->\n    <section class=\"ds-view\" id=\"events\">\n      <div class=\"ds-view__body\">\n\n        <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">chronoskin</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">Calendar</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li class=\"ds-breadcrumb__current\">All events</li>\n        </ol>\n\n        <div class=\"ds-page-header\" data-component=\"page-header\">\n          <div class=\"ds-page-header__text\">\n            <h1 class=\"ds-page-header__title\">All events</h1>\n            <p class=\"ds-page-header__desc\">Everything on the four calendars, soonest first. Sign up from the event page.</p>\n          </div>\n          <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#add\">Add an event</a></div>\n        </div>\n\n        <div class=\"ds-grid\" data-component=\"grid\">\n          <h2 class=\"ds-grid__title\">The four calendars</h2>\n          <div class=\"ds-grid__cell\">\n            <span class=\"ds-swatch\"></span> <a class=\"ds-grid__name\" href=\"#events\">Meetups</a>\n            <span class=\"ds-grid__meta\">Chat nights every Saturday and two meetups a year.</span>\n            <span class=\"ds-grid__count\">6 events, 61 sign-ups</span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--2\">\n            <span class=\"ds-swatch ds-swatch--release\"></span> <a class=\"ds-grid__name\" href=\"#events\">Releases</a>\n            <span class=\"ds-grid__meta\">New versions of skins and add-ons, set by their authors.</span>\n            <span class=\"ds-grid__count\">2 events</span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--3\">\n            <span class=\"ds-swatch ds-swatch--contest\"></span> <a class=\"ds-grid__name\" href=\"#events\">Contests</a>\n            <span class=\"ds-grid__meta\">Opening days, deadlines and the end of voting.</span>\n            <span class=\"ds-grid__count\">3 events, 26 entries</span>\n          </div>\n          <div class=\"ds-grid__cell ds-grid__cell--4\">\n            <span class=\"ds-swatch ds-swatch--upkeep\"></span> <a class=\"ds-grid__name\" href=\"#events\">Board upkeep</a>\n            <span class=\"ds-grid__meta\">Upgrades and backups, when the board is read-only.</span>\n            <span class=\"ds-grid__count\">2 events</span>\n          </div>\n        </div>\n\n        <ul class=\"ds-tabs\" data-component=\"tabs\">\n          <li><a class=\"ds-tabs__tab is-current\" href=\"#events\">Upcoming</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#events\">Past</a></li>\n          <li><a class=\"ds-tabs__tab\" href=\"#mine\">Signed up</a></li>\n        </ul>\n\n        <div class=\"ds-scroll\">\n          <table class=\"ds-table\" data-component=\"table\">\n            <thead>\n              <tr><th class=\"ds-table__head--left\">When</th><th class=\"ds-table__head--left\">Event</th><th class=\"ds-table__head--left\">Calendar</th><th>Going</th><th>Replies</th><th class=\"ds-table__head--left\">Sign-up</th></tr>\n            </thead>\n            <tbody>\n              <tr class=\"ds-table__group\"><td colspan=\"6\">This week</td></tr>\n              <tr>\n                <td class=\"ds-table__last\">Thu 10 Nov<span class=\"ds-table__meta\">18:00</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Harvest 1.5 release</a><span class=\"ds-table__desc\">The narrow variant becomes the default. Posted by oldpine.</span></td>\n                <td>Releases</td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num\">7</td>\n                <td><span class=\"ds-badge ds-badge--quiet\">No sign-up</span></td>\n              </tr>\n              <tr class=\"ds-table__row--alt\">\n                <td class=\"ds-table__last\">Sat 12 Nov<span class=\"ds-table__meta\">20:00 to 00:00</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Chat night</a><span class=\"ds-table__desc\">The weekly open chat. This week: questions about templates.</span></td>\n                <td>Meetups</td><td class=\"ds-table__num\">11</td><td class=\"ds-table__num\">3</td>\n                <td><span class=\"ds-badge ds-badge--success\">Open</span></td>\n              </tr>\n              <tr class=\"ds-table__group\"><td colspan=\"6\">Later in November</td></tr>\n              <tr>\n                <td class=\"ds-table__last\">Tue 15 Nov<span class=\"ds-table__meta\">23:59</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Button set deadline</a><span class=\"ds-table__desc\">Last day to send an entry for the button contest.</span></td>\n                <td>Contests</td><td class=\"ds-table__num\">26</td><td class=\"ds-table__num\">41</td>\n                <td><span class=\"ds-badge ds-badge--warning\">Closes soon</span></td>\n              </tr>\n              <tr class=\"ds-table__row--alt\">\n                <td class=\"ds-table__last\">Fri 18 Nov<span class=\"ds-table__meta\">two days</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Autumn meetup</a><span class=\"ds-table__desc\">Two days in a hired hall: talks, a skin workshop, dinner.</span></td>\n                <td>Meetups</td><td class=\"ds-table__num\">26</td><td class=\"ds-table__num\">58</td>\n                <td><span class=\"ds-badge ds-badge--warning\">4 places left</span></td>\n              </tr>\n              <tr>\n                <td class=\"ds-table__last\">Tue 22 Nov<span class=\"ds-table__meta\">all day</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Slate 1.3 release</a><span class=\"ds-table__desc\">Adds the calendar pages. Posted by harrow.</span></td>\n                <td>Releases</td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num\">2</td>\n                <td><span class=\"ds-badge ds-badge--quiet\">No sign-up</span></td>\n              </tr>\n              <tr class=\"ds-table__row--alt\">\n                <td class=\"ds-table__last\">Wed 30 Nov<span class=\"ds-table__meta\">03:00 to 04:00</span></td>\n                <td><a class=\"ds-table__title\" href=\"#event\">Backup window</a><span class=\"ds-table__desc\">The board is read-only for an hour.</span></td>\n                <td>Board upkeep</td><td class=\"ds-table__num\">0</td><td class=\"ds-table__num\">0</td>\n                <td><span class=\"ds-badge ds-badge--danger\">Closed</span></td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n\n        <div class=\"ds-toolbar\">\n          <span>Events 1 to 6 of 14. <a class=\"ds-link\" href=\"#month\">Back to the month</a></span>\n          <ul class=\"ds-pagination\" data-component=\"pagination\">\n            <li><a class=\"ds-pagination__link\" href=\"#events\">&laquo; Previous</a></li>\n            <li><a class=\"ds-pagination__link is-current\" href=\"#events\">1</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#events\">2</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#events\">3</a></li>\n            <li><a class=\"ds-pagination__link\" href=\"#events\">Next &raquo;</a></li>\n          </ul>\n        </div>\n\n      </div>\n    </section>\n\n    <!-- ======== event: one event ======== -->\n    <section class=\"ds-view\" id=\"event\">\n      <div class=\"ds-view__body\">\n\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">Calendar</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li><a class=\"ds-breadcrumb__link\" href=\"#events\">Meetups</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li class=\"ds-breadcrumb__current\">Autumn meetup</li>\n        </ol>\n\n        <div class=\"ds-page-header\">\n          <div class=\"ds-page-header__text\">\n            <h1 class=\"ds-page-header__title\">Autumn meetup</h1>\n            <p class=\"ds-page-header__desc\">Friday 18 and Saturday 19 November 2005. Organised by tessa. You are signed up.</p>\n          </div>\n          <div class=\"ds-buttons\" data-component=\"buttons\">\n            <a class=\"ds-button\" href=\"#event\">I am going</a>\n            <a class=\"ds-button ds-button--secondary\" href=\"#event\">Maybe</a>\n            <a class=\"ds-button ds-button--danger\" href=\"#event\">Withdraw</a>\n            <button class=\"ds-button is-disabled\" type=\"button\" disabled>Bring a guest (full)</button>\n          </div>\n        </div>\n\n        <div class=\"ds-dialog__backdrop\">\n          <div class=\"ds-dialog\" data-component=\"dialog\" role=\"dialog\" aria-labelledby=\"d-title\">\n            <h2 class=\"ds-dialog__title\" id=\"d-title\">Withdraw from this event?</h2>\n            <div class=\"ds-dialog__body\">\n              <p class=\"ds-dialog__text\">Your place at the Autumn meetup goes to the next member on the waiting list. You can sign up again only while places are left.</p>\n              <div class=\"ds-dialog__actions\">\n                <a class=\"ds-button ds-button--danger\" href=\"#mine\">Withdraw</a>\n                <a class=\"ds-button ds-button--secondary\" href=\"#event\">Stay signed up</a>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"ds-layout\">\n          <div class=\"ds-layout__main\">\n            <article class=\"ds-prose\" data-component=\"typography\">\n              <h1>Two days of skins and talk</h1>\n              <p>The autumn meetup is the one time of year the board meets in a room. Friday is for talks, Saturday for the workshop and the dinner. <strong>Thirty places</strong>, of which four are left.</p>\n              <h2>Programme</h2>\n              <ul>\n                <li>Friday 14:00: doors, then three short talks on template edits.</li>\n                <li>Saturday 10:00: skin workshop. Bring a board you can change.</li>\n                <li>Saturday 19:00: dinner, paid on the evening.</li>\n              </ul>\n              <h3>What to bring</h3>\n              <p>A laptop with a local copy of your board. The workshop files are in <code>meetup/workshop.zip</code> in the file archive.</p>\n              <hr>\n              <p data-component=\"links\">Related: <a class=\"ds-link\" href=\"#events\">all meetups</a>, <a class=\"ds-link is-visited\" href=\"#event\">last year's notes</a> (visited), <a class=\"ds-link is-hover\" href=\"#event\">travel thread</a> (hover), <a class=\"ds-link is-active\" href=\"#event\">room sharing</a> (active).</p>\n            </article>\n\n            <div class=\"ds-comment\">\n              <div class=\"ds-comment__head\"><span>quillon wrote</span><span>8 Nov 2005, 21:14</span></div>\n              <div class=\"ds-comment__body\">\n                <p class=\"ds-comment__text\">Two seats free in my car from the north on Friday morning. Reply in the travel thread.</p>\n                <p class=\"ds-comment__sig\">Rank images in every size, see my files.</p>\n              </div>\n              <div class=\"ds-comment__head\"><span>dunmore wrote</span><span>9 Nov 2005, 08:40</span></div>\n              <div class=\"ds-comment__body ds-comment__body--alt\">\n                <p class=\"ds-comment__text\">Can the workshop files be posted a day early? My connection at the hall was slow last year.</p>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"ds-layout__rail\">\n            <section class=\"ds-panel\">\n              <h2 class=\"ds-panel__title ds-panel__title--bar\">Event details</h2>\n              <dl class=\"ds-spec\">\n                <dt class=\"ds-spec__label\">Starts</dt><dd class=\"ds-spec__value\">Fri 18 Nov 2005, 14:00</dd>\n                <dt class=\"ds-spec__label\">Ends</dt><dd class=\"ds-spec__value\">Sat 19 Nov 2005, 23:00</dd>\n                <dt class=\"ds-spec__label\">Calendar</dt><dd class=\"ds-spec__value\"><span class=\"ds-swatch\"></span> Meetups</dd>\n                <dt class=\"ds-spec__label\">Places</dt><dd class=\"ds-spec__value\">26 of 30 taken</dd>\n                <dt class=\"ds-spec__label\">Sign-up</dt><dd class=\"ds-spec__value\"><span class=\"ds-badge ds-badge--warning\">4 places left</span></dd>\n                <dt class=\"ds-spec__label\">Repeats</dt><dd class=\"ds-spec__value\">Every year</dd>\n              </dl>\n            </section>\n            <section class=\"ds-panel\">\n              <h2 class=\"ds-panel__title\">Who is going (26)</h2>\n              <div class=\"ds-panel__body\">\n                <p class=\"ds-panel__line\"><a class=\"ds-link ds-link--quiet ds-link--strong\" href=\"#mine\">tessa</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">oldpine</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">quillon</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">harrow</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">marek_v</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">dunmore</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">ilse</a> and 19 more</p>\n              </div>\n              <p class=\"ds-panel__sub\">Maybe (5)</p>\n              <div class=\"ds-panel__body ds-panel__body--alt\">\n                <p class=\"ds-panel__line\"><a class=\"ds-link ds-link--quiet\" href=\"#mine\">fenwick</a>, <a class=\"ds-link ds-link--quiet\" href=\"#mine\">corbin</a> and 3 more</p>\n              </div>\n              <p class=\"ds-panel__sub\">Waiting list (0)</p>\n              <div class=\"ds-panel__body\">\n                <p class=\"ds-panel__line\">Nobody is waiting. A place that comes free goes to the first name here.</p>\n              </div>\n            </section>\n          </div>\n        </div>\n\n      </div>\n    </section>\n\n    <!-- ======== add: the event form ======== -->\n    <section class=\"ds-view\" id=\"add\">\n      <div class=\"ds-view__body\">\n\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">chronoskin</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">Calendar</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li class=\"ds-breadcrumb__current\">Add an event</li>\n        </ol>\n\n        <div class=\"ds-page-header\">\n          <div class=\"ds-page-header__text\">\n            <h1 class=\"ds-page-header__title\">Add an event</h1>\n            <p class=\"ds-page-header__desc\">Members add meetups and releases. Contests and board upkeep are added by moderators.</p>\n          </div>\n          <div class=\"ds-page-header__action\"><a class=\"ds-button ds-button--secondary\" href=\"#month\">Back to the month</a></div>\n        </div>\n\n        <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">The event was not saved.</span> The end of the event lies before its start. Correct the marked field and send the form again.</p>\n\n        <form class=\"ds-form\" data-component=\"form\" action=\"#\">\n          <h2 class=\"ds-form__title\">Event</h2>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"e-title\">Title</label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input\" id=\"e-title\" type=\"text\" value=\"Chat night: questions about templates\"></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"e-cal\">Calendar</label>\n            <div class=\"ds-form__field\">\n              <select class=\"ds-form__input ds-form__input--auto\" id=\"e-cal\"><option>Meetups and chat nights</option><option>Releases</option></select>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"e-start\">Starts <span class=\"ds-form__hint\">Day, month, year and time in GMT</span></label>\n            <div class=\"ds-form__field\"><input class=\"ds-form__input ds-form__input--auto\" id=\"e-start\" type=\"text\" value=\"26 Nov 2005 20:00\" size=\"20\"></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"e-end\">Ends</label>\n            <div class=\"ds-form__field\">\n              <input class=\"ds-form__input ds-form__input--auto is-invalid\" id=\"e-end\" type=\"text\" value=\"26 Nov 2005 00:00\" size=\"20\">\n              <span class=\"ds-form__error\">The end must be later than the start. For midnight, give the next day.</span>\n            </div>\n          </div>\n          <div class=\"ds-form__row\">\n            <label class=\"ds-form__label\" for=\"e-text\">Description <span class=\"ds-form__hint\">Board code is allowed</span></label>\n            <div class=\"ds-form__field\"><textarea class=\"ds-form__input ds-form__input--wide\" id=\"e-text\" rows=\"5\">The weekly open chat. This week we take questions about templates.</textarea></div>\n          </div>\n          <div class=\"ds-form__row\">\n            <span class=\"ds-form__label\">Options</span>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\" checked> Members can sign up</label>\n              <label class=\"ds-form__check\"><input class=\"ds-form__checkbox\" type=\"checkbox\"> Repeat every week</label>\n            </div>\n          </div>\n          <div class=\"ds-form__actions\">\n            <button class=\"ds-button\" type=\"button\">Save event</button>\n            <a class=\"ds-button ds-button--secondary\" href=\"#month\">Cancel</a>\n          </div>\n        </form>\n\n      </div>\n    </section>\n\n    <!-- ======== mine: the member's calendar ======== -->\n    <section class=\"ds-view\" id=\"mine\">\n      <div class=\"ds-view__body\">\n\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">chronoskin</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li><a class=\"ds-breadcrumb__link\" href=\"#month\">Calendar</a></li>\n          <li class=\"ds-breadcrumb__sep\">&gt;</li>\n          <li class=\"ds-breadcrumb__current\">My calendar</li>\n        </ol>\n\n        <div class=\"ds-page-header\">\n          <div class=\"ds-page-header__text\">\n            <h1 class=\"ds-page-header__title\">My calendar</h1>\n            <p class=\"ds-page-header__desc\">The events you signed up for, and reminders only you can see.</p>\n          </div>\n          <div class=\"ds-page-header__action\"><a class=\"ds-button\" href=\"#add\">Add a reminder</a></div>\n        </div>\n\n        <div class=\"ds-columns\">\n          <ul class=\"ds-list\">\n            <li class=\"ds-list__head\">Signed up</li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">12</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Chat night</a> <span class=\"ds-badge ds-badge--success\">Going</span>\n                <span class=\"ds-list__meta\">Saturday, 20:00 to midnight.</span></div>\n            </li>\n            <li class=\"ds-list__item is-alt\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">18</span>Nov</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Autumn meetup</a> <span class=\"ds-badge ds-badge--success\">Going</span>\n                <span class=\"ds-list__meta\">Friday and Saturday. Place 14 of 30.</span></div>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-list__date\"><span class=\"ds-list__day\">3</span>Dec</span>\n              <div class=\"ds-list__text\"><a class=\"ds-list__title\" href=\"#event\">Chat night</a> <span class=\"ds-badge ds-badge--warning\">Maybe</span>\n                <span class=\"ds-list__meta\">Saturday, 20:00 to midnight.</span></div>\n            </li>\n          </ul>\n\n          <div class=\"ds-empty\" data-component=\"empty\">\n            <h2 class=\"ds-empty__title\">Reminders</h2>\n            <div class=\"ds-empty__body\">\n              <p class=\"ds-empty__text\">You have no reminders. A reminder is an event that only you can see.</p>\n              <a class=\"ds-button ds-button--secondary\" href=\"#add\">Add a reminder</a>\n            </div>\n          </div>\n\n          <section class=\"ds-panel\">\n            <h2 class=\"ds-panel__title\">Notify me</h2>\n            <div class=\"ds-panel__body\">\n              <p class=\"ds-panel__line\">By private message, one day before an event you signed up for.</p>\n              <p class=\"ds-panel__line\"><span class=\"ds-new\">New:</span> birthdays of members on your buddy list can be shown on your month.</p>\n              <p class=\"ds-panel__line\"><a class=\"ds-link\" href=\"#add\">Change these settings</a></p>\n            </div>\n          </section>\n        </div>\n\n      </div>\n    </section>\n\n  </main>\n\n  <footer class=\"ds-footer\" data-component=\"footer\">\n    <ul class=\"ds-footer__row\">\n      <li><a class=\"ds-footer__link\" href=\"#month\">Month</a></li>\n      <li class=\"ds-footer__sep\">|</li>\n      <li><a class=\"ds-footer__link\" href=\"#events\">All events</a></li>\n      <li class=\"ds-footer__sep\">|</li>\n      <li><a class=\"ds-footer__link\" href=\"#add\">Add event</a></li>\n      <li class=\"ds-footer__sep\">|</li>\n      <li><a class=\"ds-footer__link\" href=\"#mine\">My calendar</a></li>\n    </ul>\n    <p class=\"ds-footer__line\">chronoskin community calendar. Week starts on Monday; change it in your profile.</p>\n  </footer>\n\n</div>\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.bulletin-board-forums.app.s08.p02.t11.u03\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"bulletin-board-forums\",\n    \"years\": [\n      2002,\n      2007\n    ]\n  },\n  \"archetype\": \"app\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1024,\n    \"fluid\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-bb-82b3\",\n  \"short\": \"v1-bb-82b3\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #666696;\n  --color-canvas: #ffffff;\n  --color-surface: #f1f1f1;\n  --color-surface-alt: #dfdfdf;\n  --color-surface-strong: #cfcfcf;\n  --color-bar: #606096;\n  --color-bar-text: #fff788;\n  --color-bar-alt: #8080a6;\n  --color-bar-alt-text: #ffffff;\n  --color-inverse: #555576;\n  --color-inverse-text: #eeeeff;\n  --color-text: #000000;\n  --color-text-muted: #000020;\n  --color-heading: #000020;\n  --color-heading-alt: #555576;\n  --color-link: #606096;\n  --color-link-quiet: #000020;\n  --color-link-visited: #666686;\n  --color-link-hover: #8080a6;\n  --color-link-active: #000000;\n  --color-border: #555576;\n  --color-border-strong: #000020;\n  --color-border-muted: #cfcfcf;\n  --color-accent: #606096;\n  --color-accent-text: #fff788;\n  --color-accent-alt: #555576;\n  --color-fill-1: #f1f1f1;\n  --color-fill-2: #dfdfdf;\n  --color-fill-3: #e8e8e8;\n  --color-fill-4: #f1f1f1;\n  --color-button: #8080a6;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #fff788;\n  --color-button-secondary: #dfdfdf;\n  --color-button-secondary-text: #000000;\n  --color-input: #ffffff;\n  --color-input-text: #000000;\n  --color-input-border: #767676;\n  --color-disabled: #dfdfdf;\n  --color-disabled-text: #666686;\n  --color-danger: #a00000;\n  --color-danger-surface: #f1f1f1;\n  --color-success: #006600;\n  --color-warning: #fff788;\n  --color-notice: #fff788;\n  --color-notice-text: #000020;\n  --color-focus: #000000;\n  --color-shadow: #000000;\n  --color-overlay: #dfdfdf;\n}\n\n/* @part type */\n:root {\n  --font-body: Arial, Verdana, Geneva, Helvetica, sans-serif;\n  --font-heading: Arial, Verdana, Geneva, Helvetica, sans-serif;\n  --font-ui: Arial, Verdana, Geneva, Helvetica, sans-serif;\n  --font-mono: \"Courier New\", Courier, monospace;\n  --text-base: 13px;\n  --text-small: 11px;\n  --text-ui: 11px;\n  --text-large: 13px;\n  --text-display: 18px;\n  --text-h1: 16px;\n  --text-h2: 13px;\n  --text-h3: 13px;\n  --line-body: normal;\n  --line-heading: normal;\n  --line-display: normal;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 700;\n  --weight-display: 700;\n  --weight-ui: 700;\n  --heading-transform: none;\n  --heading-tracking: 0;\n  --display-tracking: 0;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: underline;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: underline;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 1px;\n  --border-style: dotted;\n  --radius-control: 0;\n  --radius-panel: 0;\n  --radius-pill: 0;\n  --radius-page: 0;\n  --shadow-panel: none;\n  --shadow-control: none;\n  --shadow-control-hover: none;\n  --shadow-control-pressed: none;\n  --shadow-dialog: none;\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: var(--color-inverse);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-border-strong);\n  --fill-button: var(--color-button);\n  --fill-button-hover: color-mix(in srgb, var(--color-button), black 18%);\n  --fill-button-secondary: color-mix(in srgb, var(--color-button-secondary), var(--color-surface-strong) 50%);\n  --fill-input: color-mix(in srgb, var(--color-input), var(--color-surface) 50%);\n  --focus-ring: 1px solid var(--color-focus);\n  --transition: none;\n  --backdrop-blur: 0px;\n}\n"
  }
}
