{
  "id": "v1-sg-2383",
  "long_id": "v1.saas-gradient.app.s02.p03.t08.u03",
  "name": "SaaS gradient dashboard",
  "era": {
    "slug": "saas-gradient",
    "code": "sg",
    "name": "SaaS gradient",
    "years": [
      2016,
      2021
    ],
    "description": "The start-up product page of 2016 to 2021: slanted or curved bands of purple-to-blue gradient, white rounded cards with soft wide shadows, friendly geometric sans, pill buttons and flat illustration blocks."
  },
  "archetype": "app",
  "mode": "mix",
  "viewport": {
    "width": 1440,
    "fluid": false,
    "responsive": true
  },
  "summary": "This is the signed-in side of a start-up product of 2016 to 2021: a white rail of navigation at the left, and beside it a band of two-colour gradient that carries the search field, the greeting and the page titles, with white rounded cards climbing onto it from the pale work area below. Figures stand in soft-shadowed cards with a round icon tile and a sparkline, charts are thin coloured lines, and an onboarding checklist with a gradient progress bar sits beside them. Buttons are pills and type is a rounded, friendly sans set bold for headings.",
  "url": "https://chrono.skin/s/v1-sg-2383",
  "preview_url": "https://chrono.skin/s/v1-sg-2383/specimen.html",
  "files": {
    "STYLE.md": "# SaaS gradient dashboard\n\n## Summary\n\nThis is the signed-in side of a start-up product of 2016 to 2021: a white rail of navigation at the left, and beside it a band of two-colour gradient that carries the search field, the greeting and the page titles, with white rounded cards climbing onto it from the pale work area below. Figures stand in soft-shadowed cards with a round icon tile and a sparkline, charts are thin coloured lines, and an onboarding checklist with a gradient progress bar sits beside them. Buttons are pills and type is a rounded, friendly sans set bold for headings.\n\n## Layout\n\n- The page is designed for a 1440px viewport. `.ds-page` is a grid of two columns: the rail (`.ds-nav`, `--size-rail` 252px) for the whole height, and beside it the top bar, the showing view and the footer line. The work area is centred in its column: `.ds-content` is at most `--size-page` (1140px) wide with `--space-6` side padding and stacks its children `--space-5` apart.\n- Navigation is the rail on `--fill-panel`: the `.ds-brand`, then groups of links under small group names, each link an icon in one of the four fills and a label with an optional count, the current one on a grey pill; a gradient card at the foot holds the trial notice. `.ds-topbar` is `--size-top` (72px) tall and transparent, lying on the gradient: the search pill at the left, two links and the account's initials at the right.\n- The gradient band is the `.ds-hero` on the home view and the `.ds-page-header` on every other. It is pulled up under the top bar by a negative margin and is tall enough for `.ds-content--lift` to rise `--space-8` onto it, so the first row of cards always overlaps the band. Its lower edge is straight.\n- The home view stacks: the band with the greeting and two buttons; `.ds-stat`, four figure cards; `.ds-cols` (2 to 1, `--level`), the chart card beside the setup checklist; a `.ds-section-title`; and `.ds-grid`, four project cards with progress bars.\n- Inner pages have no hero. The `.ds-page-header` band holds the breadcrumb, the page title, one line of text and at most one white button at the right. Below, a list page is one card with `.ds-tabs` on its head, the table and a `.ds-table__foot` with the pagination, then two level cards; other pages use `.ds-cols` (2 to 1), `--even`, or `--side` (1 to 3) with the `.ds-sidebar` in a card at the left.\n- Views. The specimen is a time tracker for a small studio with five views. `overview` is the home view. `projects` is the table of projects under tabs with pagination, the status key and an empty archive. `team` lists people beside the waiting invitations and the open remove dialog. `settings` is the workspace form with its notices and buttons beside the settings sections. `news` is one release note as running text beside earlier notes and related links.\n- Below 1100px cards stand two across and columns stack; below 900px the rail becomes a white block across the top: its groups, icons and card are not shown, the links `.ds-nav__links` are replaced by the menu `.ds-nav__menu` at the right of the brand, which lists every view and marks the one showing, and the top bar keeps only search and initials; below 640px the menu goes and the two `.ds-nav__links` lists become a dock fixed to the foot of the window (the first list 60% of the width, the second 40%, items in equal cells with the `.ds-nav__icon` above a small `.ds-nav__label`, the current one `is-current`); below 520px everything is one column. A wide table scrolls inside `.ds-table__wrap`; the page never scrolls sideways.\n- Spacing scale: `--space-1` 4px (label to field, between rail links), `--space-2` 8px (rail link padding, between badges), `--space-3` 12px (table cell and button vertical padding, checklist rows), `--space-4` 16px (figure card padding, list rows, rail padding), `--space-5` 24px (between cards, card padding), `--space-6` 32px (work area side padding), `--space-7` 48px (around a dialog), `--space-8` 72px (how far cards rise onto the band).\n- Other sizes: `--size-mark` 30px, `--size-icon` 40px (icon tiles), `--size-avatar` 36px, `--size-control` 34px (pagination), `--size-chart` 220px, `--size-search` 300px, `--size-dialog` 420px.\n\n## Typography and colour roles\n\nThis style combines the parts of different styles of one era. Where a note below names a value that differs from `tokens.css`, the tokens are right.\n\nThese are the conventions of the era; every layout and token set keeps them.\n\n- The gradient is `--fill-inverse`, made in the surface part from `--color-fill-1` and `--color-fill-2`. Text on it is always `--color-inverse-text`, which a palette may make light or dark; here the gradient is yellow to amber and the text ink. `--color-inverse` is the solid middle of the gradient: the text of the `--inverse` button.\n- On the gradient there are two buttons only: `.ds-button--inverse` (fill `--color-inverse-text`, text `--color-inverse`) and `.ds-button--ghost` (outline in `--color-inverse-text`). The primary button never stands on the gradient itself; in the hero it stands in the white sign-up card and in the white bar.\n- `--color-fill-1` to `--color-fill-4` are avatars, icon circles and, mixed at 24% into `--color-surface`, the tinted figures and the blocks above the speakers. A fill carries initials or an icon in `--color-inverse-text`, never running text; text on a tint is `--color-heading` and `--color-text`.\n- `--color-page` is the pale page, `--color-surface` the card and the white sections, `--color-surface-alt` the quiet inset (hovered row and link, dialog foot, empty state), `--color-surface-strong` the strongest neutral (current link of the bar, quiet badge, inline code, current sidebar row, progress track).\n- `--fill-bar` with `--color-bar-text` is the table head only. `--fill-bar-alt` with `--color-bar-alt-text` is the footer; nothing else stands on it.\n- Text is `--color-text`, meta `--color-text-muted`, headings and figures `--color-heading`; kickers, sidebar titles, times of the day and h3 in prose are `--color-heading-alt`. A tooltip is `--color-surface` text on `--color-heading`.\n- Links are `--color-link`, bold, underlined only on hover; quiet links and the links of the bar are `--color-link-quiet`.\n- `--fill-button` with `--color-button-text` is the one action colour: the primary button, the current chip, the current page number, the current dot of the carousel, the switch when on. The secondary button is `--color-button-secondary-text` on `--fill-button-secondary` with a `--color-border` edge. The destructive button is `--color-danger` with `--color-button-text`.\n- `--fill-accent` with `--color-accent-text` is the default badge. `--alt` and the status badges are tints: the colour mixed at 16 to 22% into `--color-surface`, with text mixed from the colour and `--color-heading`. `--color-success` is also the tick of a point.\n- `--color-notice` with `--color-notice-text` is the information notice; the error notice is `--color-danger` on `--color-danger-surface` with a faint edge.\n- Two families: `--font-heading` and `--font-ui` (Montserrat, Avenir Next) for headings, figures, buttons, labels and navigation, `--font-body` (Open Sans) for text; `--font-mono` for code. The references used commercial geometric faces. `--text-base` 16px at `--line-body` 1.62; `--text-ui` 14px (controls, tables, card text); `--text-small` 13px (meta, badges, labels); `--text-large` 20px (leads, the quote); `--text-display` 56px (hero title); `--text-h1` 38px (section and page titles, figures); `--text-h2` 26px; `--text-h3` 18px (card titles).\n- Headings are heavy: `--weight-heading` and `--weight-display` 800, `--weight-bold` and `--weight-ui` 700, with tight tracking. Nothing is uppercase.\n- Surface: buttons, inputs and badges are pills (`--radius-control`, `--radius-pill` 100px); cards are `--radius-panel` 18px; the bar and the call to action `--radius-page` 32px. `--border-width` is 2px in `--color-border-muted`, `--border-width-strong` 4px (the ring of a speaker's face). `--shadow-panel` is a solid lip of `--color-border` under the card and a wide soft shadow below; `--shadow-control` is a solid darker lip under buttons and fields that grows on hover; `--shadow-dialog` is the deepest and lies under the sign-up card.\n- One-off values made with `calc()` and `color-mix()` because the vocabulary has no token: the ellipses that cut the gradient, washes on the gradient (`--color-inverse-text` at 14 to 18%, the ghost border at 55%), tinted badges, figures and blocks, the brand tile's edge, the error notice's edge, the footer rule. Opacity 0.85 to 0.9 dims secondary text on the gradient. The figures of the countdown are set at a line height of 1.1.\n\n## Components\n\n- `.ds-page`: on `<body>`. Sets font, text colour and `--fill-page` and makes the two-column grid; `.ds-nav`, `.ds-topbar`, the views and `.ds-footer` are its direct children.\n- `.ds-content`: the centred column of a view; `--lift` raises it onto the band.\n- `.ds-brand`: the site's mark and name, first in the rail. `.ds-brand__mark` is a 30px tile dressed like the primary button (`--fill-button`, `--color-button-text`, `--radius-control`, `--shadow-control`) holding the mark as inline SVG; `.ds-brand__name` is the name in bold. Name and mark are placeholders for the installing project's own name and logo.\n- `.ds-nav`: the white rail. `.ds-nav__group` names a group; `.ds-nav__links` holds `.ds-nav__link` rows of a `.ds-nav__icon` (`--2`, `--3`, `--4` for the other fills), a `.ds-nav__label` and an optional `.ds-badge`; the current row is `is-current`. `.ds-nav__foot` is a gradient card with `.ds-nav__foot-title`, `.ds-nav__foot-text` and a small inverse button. In the specimen the showing view marks its link with one `:has()` rule per view; a project sets `is-current` itself.\n- `.ds-topbar`: the transparent bar on the band: `.ds-topbar__search`, up to two `.ds-topbar__link` and a `.ds-avatar--plain`.\n- `.ds-avatar`: a circle of initials on a fill (`--1`, `--2`, `--4`; `--plain` is a ring for use on the gradient).\n- `.ds-hero`: the band of the home view. `.ds-hero__inner` holds the `.ds-hero__title` and `.ds-hero__lead` at the left and `.ds-hero__actions` (one `--inverse`, one `--ghost` button) at the right. One per site.\n- `.ds-page-header`: the band of an inner page, used instead of `.ds-hero`. `.ds-page-header__inner` holds the breadcrumb, `.ds-page-header__title` and `.ds-page-header__text` at the left and `.ds-page-header__actions` at the right.\n- `.ds-cols`: main and side column, 2 to 1; `--even` for halves, `--side` 1 to 3, `--level` to end the columns on one line. `.ds-stack` stacks cards; `.ds-panel--grow` fills a column.\n- `.ds-stat`: the row of four figure cards. Each `.ds-stat__item` has a `.ds-stat__head` (the `.ds-stat__label` over the `.ds-stat__figure`, and a round `.ds-tile`), a `.ds-stat__delta` line with `.ds-stat__up` or `.ds-stat__down`, and a `.ds-spark`.\n- `.ds-spark`: a sparkline, an inline SVG path stroked with `currentColor`; `--2`, `--3`, `--4` take the other fills.\n- `.ds-tile`: an icon tile on `--color-fill-1` (`--2`, `--3`, `--4`; `--round`).\n- `.ds-chart`: a line chart in a card: `.ds-chart__svg` over hairlines, its paths stroked with `currentColor`, a second line marked `.ds-chart__alt`; `.ds-chart__axis` labels the steps and `.ds-chart__legend` of `.ds-chart__key` (`--alt`) names the two series. No more than two lines.\n- `.ds-progress`: a track with a gradient `.ds-progress__bar` (`--25`, `--40`, `--60`, `--75`, `--90`; `--over` is full and in the danger colour).\n- `.ds-steps`: the onboarding checklist: `.ds-steps__item` rows of a round `.ds-steps__mark`, a `.ds-steps__text` and an optional link; `is-done` fills the mark with `--color-success` and strikes the text.\n- `.ds-grid`: four project cards. Each `.ds-grid__cell` is a link holding a `.ds-tile`, `.ds-grid__title`, `.ds-grid__text` and a `.ds-progress`. `.ds-section-title` is the heading above such a row.\n- `.ds-prose`: running text inside a card: h1, h2, h3, p, lists, `code`, `strong`. `.ds-prose__lead` for the first paragraph.\n- `.ds-link`: text link. States `is-visited`, `is-hover`, `is-active`, `is-focus`. `--quiet` for meta and row actions; `--more` appends an arrow. `.ds-linkrow` lays links in a row.\n- `.ds-button`: pill button, 15px bold. Variants: `--secondary`, `--danger` (destructive actions only), `--inverse` and `--ghost` (on the gradient only), `--small`, `--wide`. States `is-hover`, `is-active`, `is-focus`, `is-disabled`. `.ds-buttonrow` spaces buttons.\n- `.ds-form`: vertical form with labels above the fields, inside a card. `.ds-form__row` puts two fields side by side; `.ds-form__field` wraps `.ds-form__label` and one of `.ds-form__input`, `.ds-form__select`, `.ds-form__textarea`. Error: `is-error` on the input plus `.ds-form__error`. `.ds-form__hint`, `.ds-form__check` with `.ds-form__checkbox`, `.ds-form__actions`.\n- `.ds-table`: data table inside a card, edge to edge: a small bold head on `--fill-bar`, hairlines between rows; `is-hover` tints a row. `.ds-table__num` right-aligns numbers; `.ds-table__title` is the row's link. Wrap it in `.ds-table__wrap`; `.ds-table__foot` is the card's last row, pagination at the left and a count at the right.\n- `.ds-list`: rows parted by hairlines. `.ds-list__item` holds a `.ds-list__title` (alone or in a `.ds-list__head` with a badge or link at the right) and `.ds-list__meta`. `.ds-list--people` puts a `.ds-avatar` before a `.ds-list__grow` block and a badge after it.\n- `.ds-panel`: the white card with the wide soft shadow. `.ds-panel__head` holds the `.ds-panel__title` and an optional badge, link or legend above a hairline; `.ds-panel__body` is padded; `.ds-panel__text` is a small paragraph; `--side` is a slim card around a `.ds-sidebar`.\n- `.ds-tabs`: underlined tabs on the head of a card: `.ds-tabs__tab`, the current one (`is-current`) in the heading colour over a 3px edge in `--color-button`.\n- `.ds-badge`: pill tag, 13px bold, on `--fill-accent`. `--alt` tinted, `--quiet` grey. Status variants: `--success`, `--warning`, `--danger`. `.ds-badgerow` for several.\n- `.ds-sidebar`: a block of links: `.ds-sidebar__title` and a `.ds-sidebar__list` of `.ds-sidebar__item` with an optional `.ds-sidebar__count`; the current row (`is-current`) is a grey pill.\n- `.ds-notice`: tinted rounded message; `--error` in the danger colours. `.ds-notice__title` for the bold lead-in. `.ds-noticerow` stacks notices.\n- `.ds-pagination`: `.ds-pagination__link` pills; `is-current` is filled with `--fill-button`, `is-disabled` is grey.\n- `.ds-breadcrumb`: a small trail of `.ds-breadcrumb__item` parted by slashes; the last is `.ds-breadcrumb__current`. It stands on the band, above the page title.\n- `.ds-dialog`: a dimmed block (`--color-overlay`) centring `.ds-dialog__box`, a card in `--shadow-dialog`: `.ds-dialog__head` (`.ds-dialog__title`, `.ds-dialog__close`), `.ds-dialog__body`, and `.ds-dialog__actions` right-aligned on `--color-surface-alt`. Place it on the page, not on the band.\n- `.ds-empty`: a centred message on `--color-surface-alt`: `.ds-empty__icon` (a circle of `--color-fill-3`), `.ds-empty__title`, `.ds-empty__text` and one small secondary button. It stands where a card would be.\n- `.ds-footer`: one line on `--fill-bar-alt` under the work area: `.ds-footer__name`, a short line, and `.ds-footer__links` of `.ds-footer__link` at the right.\n- `.ds-menu`: a drop-down, a `<details>` whose `.ds-menu__button` is the summary and whose `.ds-menu__list` of `.ds-menu__link` opens as a small card under it. Use it for a group of links under one bar item and for the account.\n- `.ds-nav__menu`: the `.ds-menu` that replaces the bar's links on a phone. It lists every view, marks the one showing, and sits last in the bar after the brand and the one action that stays.\n- `.ds-topbar__account`: the account `.ds-menu` at the end of the top bar, the name and the avatar as its button.\n- `.ds-switch`: an on or off setting drawn over a checkbox (`.ds-switch__input`, `.ds-switch__track`, then the label). Use it for a setting that takes effect at once, not for a choice sent with a form's other fields.\n- `.ds-tooltip`: a short hint on hover or focus; `.ds-tooltip--mark` is the small round question mark beside a label, `.ds-tooltip__text` the hint, `.ds-tooltip--start` opens it from the left edge. One sentence at most.\n\n## Never\n\n- `block-gap <= 48px`: cards are 24px apart; nothing is further from its neighbour than 48px.\n- `font-weight <= 800`: headings are heavy, nothing is black.\n- `font-size >= 13px`: meta, badges and labels are the smallest text.\n- `font-size <= 56px`: the hero title is the largest text.\n- `font-families <= 3`: a display sans, a text sans and monospace for code.\n- `line-height <= 1.7`: body text is set at 1.62.\n- `uppercase-text <= 0%`: navigation, buttons and labels are in sentence case.\n- `text-shadow = none`: text is flat, also on the gradient.\n- `animation = none`: nothing moves by itself; only hover states ease.\n- `border-width <= 2px`: borders are hairlines; 2px marks the current tab and navigation link.\n- `border-radius <= 8px`: controls and cards are 5px and the largest blocks 8px; only circles are rounder.\n- `box-shadow-blur <= 64px`: shadows are soft and wide but end at 64px.\n\n## Extending\n\nDerive a new component from the nearest one in the specimen and use tokens only. Anything new in the work area is a `.ds-panel` with a `.ds-panel__head`, placed in `.ds-content` or in a column of `.ds-cols`, 24px from its neighbours; a new figure is another `.ds-stat__item` with its tile and sparkline, a new destination another `.ds-nav__link` with a 20px line icon in one of the fills. A new page opens with a `.ds-page-header` band and lifts its first card onto it. Text goes on cards and, in `--color-inverse-text`, on the gradient; fills take an icon or initials only. Put only `--inverse` and `--ghost` buttons on the gradient, and keep at most one primary button in a card. Spacing comes from the `--space-*` scale, and any one-off shade is a `color-mix()` of tokens noted next to the rule.\n",
    "components.css": ":root {\n  --size-menu: 190px;\n  --size-tip: 220px;\n  --size-page: 1140px;\n  --size-rail: 252px;\n  --size-top: 72px;\n  --size-mark: 30px;\n  --size-icon: 40px;\n  --size-control: 34px;\n  --size-dialog: 420px;\n  --size-chart: 220px;\n  --size-avatar: 36px;\n  --size-search: 300px;\n  --space-1: 4px;\n  --space-2: 8px;\n  --space-3: 12px;\n  --space-4: 16px;\n  --space-5: 24px;\n  --space-6: 32px;\n  --space-7: 48px;\n  --space-8: 72px;\n}\n\n/* views: one screen of the example site shows at a time */\n.ds-view { display: none; }\n.ds-view:target, .ds-page:not(:has(.ds-view:target)) .ds-view--home { display: block; }\n.ds-view:target { scroll-margin-top: 100vh; }\n\n.ds-page {\n  margin: 0;\n  padding: 0;\n  min-height: 100vh;\n  background: var(--fill-page);\n  color: var(--color-text);\n  font-family: var(--font-body);\n  font-size: var(--text-base);\n  font-weight: var(--weight-body);\n  line-height: var(--line-body);\n}\n.ds-page *,\n.ds-page *::before,\n.ds-page *::after {\n  box-sizing: border-box;\n}\n\n/* brand: the mark on a tile dressed like the primary button */\n.ds-brand {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: inherit;\n  font-family: var(--font-heading);\n  font-size: var(--text-large);\n  font-weight: var(--weight-bold);\n  letter-spacing: var(--heading-tracking);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.ds-brand__mark {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-mark);\n  height: var(--size-mark);\n  padding: var(--space-1);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-button-text) 35%, transparent);\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-brand__mark svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n.ds-brand__name {\n  display: inline-block;\n}\n\n/* typography */\n.ds-prose {\n  color: var(--color-text);\n  max-width: 68ch;\n}\n.ds-prose h1,\n.ds-prose h2,\n.ds-prose h3 {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-prose h1 {\n  font-size: var(--text-h1);\n}\n.ds-prose h2 {\n  margin-top: var(--space-6);\n  font-size: var(--text-h2);\n}\n.ds-prose h3 {\n  margin-top: var(--space-5);\n  color: var(--color-heading-alt);\n  font-size: var(--text-h3);\n}\n.ds-prose p {\n  margin: var(--space-3) 0 0;\n}\n.ds-prose ul,\n.ds-prose ol {\n  margin: var(--space-3) 0 0;\n  padding-left: var(--space-5);\n}\n.ds-prose li {\n  margin-top: var(--space-1);\n}\n.ds-prose strong {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-prose code {\n  padding: 0 var(--space-1);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-family: var(--font-mono);\n  font-size: var(--text-small);\n}\n.ds-prose a {\n  color: var(--color-link);\n  text-decoration: var(--link-decoration);\n}\n.ds-prose__lead {\n  color: var(--color-text);\n  font-size: var(--text-large);\n}\n\n/* links */\n.ds-link {\n  color: var(--color-link);\n  font-weight: var(--weight-ui);\n  text-decoration: var(--link-decoration);\n  transition: var(--transition);\n}\n.ds-link:visited,\n.ds-link.is-visited {\n  color: var(--color-link-visited);\n}\n.ds-link:hover,\n.ds-link.is-hover {\n  color: var(--color-link-hover);\n  text-decoration: var(--link-decoration-hover);\n}\n.ds-link:active,\n.ds-link.is-active {\n  color: var(--color-link-active);\n}\n.ds-link:focus-visible,\n.ds-link.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-link--quiet,\n.ds-link--quiet:visited {\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-body);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-linkrow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2) var(--space-5);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\n/* buttons */\n.ds-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: var(--space-2);\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-control);\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  line-height: var(--line-heading);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  text-shadow: var(--shadow-text);\n  white-space: nowrap;\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n  cursor: pointer;\n}\n.ds-button:hover,\n.ds-button.is-hover {\n  background: var(--fill-button-hover);\n  color: var(--color-button-hover-text);\n  box-shadow: var(--shadow-control-hover);\n  transform: translateY(calc(var(--space-1) * -0.25));\n}\n.ds-button:active,\n.ds-button.is-active {\n  box-shadow: var(--shadow-control-pressed);\n  transform: none;\n}\n.ds-button:focus-visible,\n.ds-button.is-focus {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-button--secondary,\n.ds-button--secondary:hover,\n.ds-button--secondary.is-hover {\n  border-color: var(--color-border);\n  background: var(--fill-button-secondary);\n  color: var(--color-button-secondary-text);\n}\n.ds-button--danger,\n.ds-button--danger:hover,\n.ds-button--danger.is-hover {\n  background: var(--color-danger);\n  color: var(--color-button-text);\n}\n.ds-button--inverse,\n.ds-button--inverse:hover,\n.ds-button--inverse.is-hover {\n  background: var(--color-inverse-text);\n  color: var(--color-inverse);\n}\n.ds-button--ghost,\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  border-color: color-mix(in srgb, var(--color-inverse-text) 55%, transparent);\n  background: transparent;\n  color: var(--color-inverse-text);\n  box-shadow: none;\n}\n.ds-button--ghost:hover,\n.ds-button--ghost.is-hover {\n  background: color-mix(in srgb, var(--color-inverse-text) 14%, transparent);\n}\n.ds-button--small {\n  padding: var(--space-2) var(--space-4);\n  font-size: var(--text-small);\n}\n.ds-button:disabled,\n.ds-button.is-disabled,\n.ds-button.is-disabled:hover {\n  border-color: transparent;\n  background: var(--color-disabled);\n  color: var(--color-disabled-text);\n  box-shadow: none;\n  text-shadow: none;\n  transform: none;\n  cursor: default;\n}\n.ds-buttonrow {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n}\n\n/* form */\n.ds-form {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-4);\n}\n.ds-form__row {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: var(--space-4);\n}\n.ds-form__field {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  min-width: 0;\n}\n.ds-form__label {\n  color: var(--color-heading);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-form__input,\n.ds-form__select,\n.ds-form__textarea {\n  width: 100%;\n  margin: 0;\n  padding: var(--space-3) var(--space-4);\n  border: var(--border-width) var(--border-style) var(--color-input-border);\n  border-radius: var(--radius-control);\n  background: var(--fill-input);\n  color: var(--color-input-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  box-shadow: var(--shadow-control);\n  transition: var(--transition);\n}\n.ds-form__textarea {\n  min-height: calc(var(--space-8) + var(--space-6));\n  border-radius: var(--radius-panel);\n  line-height: var(--line-body);\n  resize: vertical;\n}\n.ds-form__input:focus,\n.ds-form__select:focus,\n.ds-form__textarea:focus,\n.ds-form__input.is-focus {\n  border-color: var(--color-focus);\n  outline: var(--focus-ring);\n}\n.ds-form__input.is-error {\n  border-color: var(--color-danger);\n}\n.ds-form__error {\n  color: var(--color-danger);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n}\n.ds-form__hint {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-form__check {\n  display: flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-size: var(--text-ui);\n}\n.ds-form__checkbox {\n  width: var(--space-4);\n  height: var(--space-4);\n  margin: 0;\n  accent-color: var(--color-button);\n}\n.ds-form__actions {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-3);\n  margin-top: var(--space-2);\n}\n\n/* table */\n.ds-table__wrap {\n  max-width: 100%;\n  overflow-x: auto;\n}\n.ds-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: var(--text-ui);\n}\n.ds-table th {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  background: var(--fill-bar);\n  color: var(--color-bar-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  text-align: left;\n  white-space: nowrap;\n}\n.ds-table td {\n  padding: var(--space-3) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text);\n  vertical-align: middle;\n}\n.ds-table tr:last-child td {\n  border-bottom: 0;\n}\n.ds-table tbody tr:hover td,\n.ds-table tr.is-hover td {\n  background: var(--color-surface-alt);\n}\n.ds-table th.ds-table__num,\n.ds-table td.ds-table__num {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n.ds-table__title {\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-table__foot {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-3) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* list */\n.ds-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-list__item {\n  padding: var(--space-4) 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-list__item:first-child {\n  padding-top: 0;\n}\n.ds-list__item:last-child {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n.ds-list__head {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-list__title {\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-list__meta {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n\n/* panel: the white card with the soft wide shadow */\n.ds-panel {\n  min-width: 0;\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-panel__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-bottom: var(--border-width) var(--border-style) var(--color-border-muted);\n}\n.ds-panel__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-panel__body {\n  padding: var(--space-5);\n}\n.ds-panel__text {\n  margin: 0 0 var(--space-4);\n  font-size: var(--text-ui);\n}\n\n/* badge */\n.ds-badge {\n  display: inline-block;\n  padding: 0 var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--fill-accent);\n  color: var(--color-accent-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1.7;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.ds-badge--alt {\n  background: color-mix(in srgb, var(--color-accent-alt) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-accent-alt) 60%, var(--color-heading));\n}\n.ds-badge--quiet {\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n}\n.ds-badge--success {\n  background: color-mix(in srgb, var(--color-success) 18%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-success) 60%, var(--color-heading));\n}\n.ds-badge--warning {\n  background: color-mix(in srgb, var(--color-warning) 22%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-warning) 50%, var(--color-heading));\n}\n.ds-badge--danger {\n  background: color-mix(in srgb, var(--color-danger) 16%, var(--color-surface));\n  color: color-mix(in srgb, var(--color-danger) 70%, var(--color-heading));\n}\n.ds-badgerow {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n}\n\n/* sidebar block */\n.ds-sidebar {\n  min-width: 0;\n}\n.ds-sidebar__title {\n  margin: 0 0 var(--space-2);\n  color: var(--color-heading-alt);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-sidebar__item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-2);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  text-decoration: var(--link-decoration-quiet);\n  transition: var(--transition);\n}\n.ds-sidebar__item:hover,\n.ds-sidebar__item.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-sidebar__item.is-current {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n.ds-sidebar__count {\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n}\n\n/* notice */\n.ds-notice {\n  margin: 0;\n  padding: var(--space-3) var(--space-5);\n  border: var(--border-width) var(--border-style) transparent;\n  border-radius: var(--radius-panel);\n  background: var(--color-notice);\n  color: var(--color-notice-text);\n  font-size: var(--text-ui);\n}\n.ds-notice--error {\n  border-color: color-mix(in srgb, var(--color-danger) 35%, transparent);\n  background: var(--color-danger-surface);\n  color: var(--color-danger);\n}\n.ds-notice__title {\n  font-weight: var(--weight-bold);\n}\n.ds-noticerow {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n}\n\n/* pagination */\n.ds-pagination {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-pagination__link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: var(--size-control);\n  height: var(--size-control);\n  padding: 0 var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-pagination__link:hover,\n.ds-pagination__link.is-hover {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-pagination__link.is-current {\n  background: var(--fill-button);\n  color: var(--color-button-text);\n  box-shadow: var(--shadow-control);\n}\n.ds-pagination__link.is-disabled {\n  background: transparent;\n  color: var(--color-disabled-text);\n}\n\n/* breadcrumb */\n.ds-breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-2);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n}\n.ds-breadcrumb__item {\n  color: inherit;\n  opacity: 0.8;\n  text-decoration: var(--link-decoration-quiet);\n}\n.ds-breadcrumb__item::after {\n  content: \"/\";\n  margin-left: var(--space-2);\n  opacity: 0.6;\n}\n.ds-breadcrumb__current {\n  font-weight: var(--weight-bold);\n}\n\n/* dialog: shown open in the page flow on its dimmed backdrop */\n.ds-dialog {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--space-7) var(--space-4);\n  border-radius: var(--radius-page);\n  background: var(--color-overlay);\n}\n.ds-dialog__box {\n  width: 100%;\n  max-width: var(--size-dialog);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n}\n.ds-dialog__head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: var(--space-3);\n  padding: var(--space-5) var(--space-5) 0;\n}\n.ds-dialog__title {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-dialog__close {\n  position: relative;\n  display: inline-block;\n  flex: none;\n  width: calc(var(--text-large) * 0.8);\n  height: calc(var(--text-large) * 0.8);\n  color: var(--color-text-muted);\n  font-size: var(--text-large);\n}\n.ds-dialog__close::before, .ds-dialog__close::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  margin: auto;\n  width: 100%;\n  height: max(var(--border-width), calc(var(--text-large) * 0.12));\n  background: currentColor;\n  transform: rotate(45deg);\n}\n.ds-dialog__close::after {\n  transform: rotate(-45deg);\n}\n.ds-dialog__body {\n  padding: var(--space-3) var(--space-5) var(--space-5);\n  font-size: var(--text-ui);\n}\n.ds-dialog__body p {\n  margin: 0;\n}\n.ds-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--space-3);\n  padding: var(--space-4) var(--space-5);\n  border-top: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: 0 0 var(--radius-panel) var(--radius-panel);\n  background: var(--color-surface-alt);\n}\n\n/* empty state */\n.ds-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: var(--space-2);\n  padding: var(--space-6) var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border);\n  border-radius: var(--radius-panel);\n  background: var(--color-surface-alt);\n  text-align: center;\n}\n.ds-empty__icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n}\n.ds-empty__icon svg {\n  width: 50%;\n  height: 50%;\n}\n.ds-empty__title {\n  margin: var(--space-1) 0 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-empty__text {\n  max-width: 44ch;\n  margin: 0 0 var(--space-2);\n  color: var(--color-text-muted);\n  font-size: var(--text-ui);\n}\n\n/* tabs */\n.ds-tabs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: var(--space-1) var(--space-5);\n  margin: 0;\n  padding: 0;\n  border-bottom: var(--border-width) var(--border-style) var(--color-border);\n  list-style: none;\n}\n.ds-tabs__tab {\n  display: inline-block;\n  padding: var(--space-3) 0;\n  border-bottom: var(--border-width-strong) var(--border-style) transparent;\n  margin-bottom: calc(var(--border-width) * -1);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  transition: var(--transition);\n}\n.ds-tabs__tab:hover,\n.ds-tabs__tab.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-tabs__tab.is-current {\n  border-bottom-color: var(--color-button);\n  color: var(--color-heading);\n}\n\n/* shared small pieces: an icon tile on one of the four fills, a sparkline */\n.ds-tile {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-icon);\n  height: var(--size-icon);\n  border-radius: var(--radius-panel);\n  background: var(--color-fill-1);\n  color: var(--color-inverse-text);\n}\n.ds-tile svg {\n  width: 55%;\n  height: 55%;\n}\n.ds-tile--2 { background: var(--color-fill-2); }\n.ds-tile--3 { background: var(--color-fill-3); }\n.ds-tile--4 { background: var(--color-fill-4); }\n.ds-tile--round { border-radius: 50%; }\n\n@media (max-width: 640px) {\n  .ds-table th,\n  .ds-table td {\n    padding: var(--space-2) var(--space-3);\n  }\n  .ds-form__row {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-dialog {\n    padding: var(--space-5) var(--space-3);\n  }\n}\n\n/* ---- layout: logged-in dashboard ---- */\n.ds-page {\n  display: grid;\n  grid-template-columns: var(--size-rail) minmax(0, 1fr);\n  grid-template-rows: auto 1fr auto;\n}\n.ds-view {\n  grid-column: 2;\n  grid-row: 2;\n  min-width: 0;\n}\n.ds-content {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  max-width: var(--size-page);\n  margin: 0 auto;\n  padding: 0 var(--space-6) var(--space-6);\n}\n.ds-content--lift {\n  position: relative;\n  z-index: 1;\n  margin-top: calc(var(--space-8) * -1);\n}\n\n/* nav: the white rail at the left, for the whole height */\n.ds-nav {\n  grid-column: 1;\n  grid-row: 1 / span 3;\n  position: relative;\n  z-index: 3;\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  min-width: 0;\n  padding: var(--space-5) var(--space-4);\n  border-right: var(--border-width) var(--border-style) var(--color-border-muted);\n  background: var(--fill-panel);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  box-shadow: var(--shadow-panel);\n}\n.ds-nav .ds-brand {\n  margin: 0 var(--space-3) var(--space-5);\n  color: var(--color-heading);\n}\n.ds-nav__group {\n  margin: var(--space-4) var(--space-3) var(--space-1);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-nav__links {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-1);\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.ds-nav__link {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-nav__link:hover,\n.ds-nav__link.is-hover {\n  color: var(--color-link-hover);\n}\n.ds-nav__icon {\n  flex: none;\n  width: var(--space-5);\n  height: var(--space-5);\n  padding: var(--space-1);\n  color: var(--color-fill-1);\n}\n.ds-nav__icon--2 { color: var(--color-fill-2); }\n.ds-nav__icon--3 { color: var(--color-fill-3); }\n.ds-nav__icon--4 { color: var(--color-fill-4); }\n.ds-nav__label {\n  flex: 1;\n}\n.ds-nav__link.is-current,\n.ds-page:not(:has(.ds-view:target)) .ds-nav__link[href=\"#overview\"],\n.ds-page:has(#overview:target) .ds-nav__link[href=\"#overview\"],\n.ds-page:has(#projects:target) .ds-nav__link[href=\"#projects\"],\n.ds-page:has(#team:target) .ds-nav__link[href=\"#team\"],\n.ds-page:has(#settings:target) .ds-nav__link[href=\"#settings\"],\n.ds-page:has(#news:target) .ds-nav__link[href=\"#news\"] {\n  background: var(--color-surface-strong);\n  color: var(--color-heading);\n}\n.ds-nav__foot {\n  margin-top: auto;\n  padding: var(--space-4);\n  border-radius: var(--radius-panel);\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n  font-size: var(--text-small);\n}\n.ds-nav__foot-title {\n  margin: 0 0 var(--space-1);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-bold);\n  line-height: var(--line-heading);\n}\n.ds-nav__foot-text {\n  margin: 0 0 var(--space-3);\n  opacity: 0.9;\n}\n\n/* top bar: lies on the gradient band */\n.ds-topbar {\n  grid-column: 2;\n  grid-row: 1;\n  position: relative;\n  z-index: 2;\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n  height: var(--size-top);\n  padding: 0 var(--space-6);\n  color: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-topbar__search {\n  width: 100%;\n  max-width: var(--size-search);\n  margin: 0 auto 0 0;\n  padding: var(--space-2) var(--space-4);\n  border: var(--border-width) var(--border-style) color-mix(in srgb, var(--color-inverse-text) 30%, transparent);\n  border-radius: var(--radius-control);\n  background: color-mix(in srgb, var(--color-inverse-text) 16%, transparent);\n  color: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-topbar__search::placeholder {\n  color: var(--color-inverse-text);\n  opacity: 0.8;\n}\n.ds-topbar__link {\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  text-decoration: none;\n  white-space: nowrap;\n  opacity: 0.9;\n}\n.ds-avatar {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--size-avatar);\n  height: var(--size-avatar);\n  border-radius: 50%;\n  background: var(--color-fill-3);\n  color: var(--color-inverse-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-avatar--2 { background: var(--color-fill-2); }\n.ds-avatar--4 { background: var(--color-fill-4); }\n.ds-avatar--1 { background: var(--color-fill-1); }\n.ds-avatar--plain {\n  border: var(--border-width-strong) var(--border-style) var(--color-inverse-text);\n  background: color-mix(in srgb, var(--color-inverse-text) 20%, transparent);\n}\n\n/* hero and page header: the gradient band, pulled up under the top bar */\n.ds-hero,\n.ds-page-header {\n  margin-top: calc(var(--size-top) * -1);\n  padding: calc(var(--size-top) + var(--space-5)) var(--space-6) calc(var(--space-8) + var(--space-6));\n  background: var(--fill-inverse);\n  color: var(--color-inverse-text);\n}\n.ds-hero__inner,\n.ds-page-header__inner {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: var(--space-5);\n  max-width: calc(var(--size-page) - var(--space-6) * 2);\n  margin: 0 auto;\n}\n.ds-hero__title {\n  margin: 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-display);\n  letter-spacing: var(--display-tracking);\n  text-transform: var(--heading-transform);\n}\n.ds-hero__lead,\n.ds-page-header__text {\n  max-width: 60ch;\n  margin: var(--space-2) 0 0;\n  font-size: var(--text-large);\n  opacity: 0.9;\n}\n.ds-hero__actions,\n.ds-page-header__actions {\n  display: flex;\n  flex: none;\n  flex-wrap: wrap;\n  gap: var(--space-3);\n}\n.ds-page-header__title {\n  margin: var(--space-2) 0 0;\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-display);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n\n/* stats: four cards with a figure, a change and a sparkline, overlapping the band */\n.ds-stat {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5);\n}\n.ds-stat__item {\n  min-width: 0;\n  padding: var(--space-4) var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-panel);\n}\n.ds-stat__head {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: var(--space-3);\n}\n.ds-stat__label {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n}\n.ds-stat__figure {\n  margin: 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h1);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n}\n.ds-stat__delta {\n  margin: var(--space-1) 0 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-stat__up {\n  color: var(--color-success);\n  font-weight: var(--weight-bold);\n}\n.ds-stat__down {\n  color: var(--color-danger);\n  font-weight: var(--weight-bold);\n}\n.ds-spark {\n  display: block;\n  width: 100%;\n  height: var(--space-6);\n  margin-top: var(--space-3);\n  color: var(--color-fill-1);\n}\n.ds-spark--2 { color: var(--color-fill-2); }\n.ds-spark--3 { color: var(--color-fill-3); }\n.ds-spark--4 { color: var(--color-fill-4); }\n\n/* columns */\n.ds-cols {\n  display: grid;\n  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n  align-items: start;\n  gap: var(--space-5);\n}\n.ds-cols--even {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ds-cols--side {\n  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);\n}\n.ds-cols--level {\n  align-items: stretch;\n}\n.ds-stack {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-5);\n  min-width: 0;\n}\n.ds-panel--grow {\n  flex: 1;\n}\n.ds-panel--side {\n  padding: var(--space-4);\n}\n\n/* chart: two lines over hairlines, drawn in SVG */\n.ds-chart {\n  position: relative;\n  height: var(--size-chart);\n  background: repeating-linear-gradient(to bottom, var(--color-border-muted) 0, var(--color-border-muted) var(--border-width), transparent var(--border-width), transparent 25%);\n}\n.ds-chart__svg {\n  display: block;\n  width: 100%;\n  height: 100%;\n  color: var(--color-fill-1);\n}\n.ds-chart__alt {\n  color: var(--color-fill-3);\n}\n.ds-chart__axis {\n  display: flex;\n  justify-content: space-between;\n  margin: var(--space-2) 0 0;\n  padding: 0;\n  list-style: none;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-chart__legend {\n  display: flex;\n  gap: var(--space-4);\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-chart__key::before {\n  content: \"\";\n  display: inline-block;\n  width: var(--space-2);\n  height: var(--space-2);\n  margin-right: var(--space-1);\n  border-radius: 50%;\n  background: var(--color-fill-1);\n}\n.ds-chart__key--alt::before {\n  background: var(--color-fill-3);\n}\n\n/* onboarding checklist and progress */\n.ds-progress {\n  display: block;\n  height: var(--space-2);\n  border-radius: var(--radius-pill);\n  background: var(--color-surface-strong);\n  overflow: hidden;\n}\n.ds-progress__bar {\n  display: block;\n  width: 50%;\n  height: 100%;\n  border-radius: var(--radius-pill);\n  background: var(--fill-inverse);\n}\n.ds-progress__bar--40 { width: 40%; }\n.ds-progress__bar--60 { width: 60%; }\n.ds-progress__bar--75 { width: 75%; }\n.ds-progress__bar--90 { width: 90%; }\n.ds-progress__bar--over {\n  width: 100%;\n  background: var(--color-danger);\n}\n.ds-steps {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-3);\n  margin: var(--space-4) 0 0;\n  padding: 0;\n  list-style: none;\n  font-size: var(--text-ui);\n}\n.ds-steps__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-3);\n}\n.ds-steps__mark {\n  display: inline-flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  width: var(--space-5);\n  height: var(--space-5);\n  border: var(--border-width-strong) var(--border-style) var(--color-border-strong);\n  border-radius: 50%;\n  color: transparent;\n}\n.ds-steps__mark svg {\n  width: 60%;\n  height: 60%;\n}\n.ds-steps__item.is-done .ds-steps__mark {\n  border-color: var(--color-success);\n  background: var(--color-success);\n  color: var(--color-surface);\n}\n.ds-steps__item.is-done .ds-steps__text {\n  color: var(--color-text-muted);\n  text-decoration: line-through;\n}\n.ds-steps__text {\n  flex: 1;\n  color: var(--color-heading);\n  font-weight: var(--weight-ui);\n}\n\n/* grid: four project cards */\n.ds-grid {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: var(--space-5);\n}\n.ds-grid__cell {\n  display: flex;\n  flex-direction: column;\n  gap: var(--space-2);\n  min-width: 0;\n  padding: var(--space-5);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  color: inherit;\n  text-decoration: none;\n  box-shadow: var(--shadow-panel);\n  transition: var(--transition);\n}\n.ds-grid__cell:hover,\n.ds-grid__cell.is-hover {\n  box-shadow: var(--shadow-dialog);\n}\n.ds-grid__title {\n  margin: var(--space-2) 0 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h3);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n}\n.ds-grid__text {\n  margin: 0;\n  color: var(--color-text-muted);\n  font-size: var(--text-small);\n}\n.ds-section-title {\n  margin: var(--space-3) 0 0;\n  color: var(--color-heading);\n  font-family: var(--font-heading);\n  font-size: var(--text-h2);\n  font-weight: var(--weight-heading);\n  line-height: var(--line-heading);\n  letter-spacing: var(--heading-tracking);\n  text-transform: var(--heading-transform);\n}\n\n/* tabs sit on the head of a card */\n.ds-tabs {\n  padding: 0 var(--space-5);\n}\n.ds-tabs__tab {\n  padding: var(--space-4) 0;\n}\n\n/* people rows */\n.ds-list--people .ds-list__item {\n  display: flex;\n  align-items: center;\n  gap: var(--space-4);\n}\n.ds-list__grow {\n  flex: 1;\n  min-width: 0;\n}\n\n/* footer: one quiet line under the work area */\n.ds-footer {\n  grid-column: 2;\n  grid-row: 3;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: var(--space-2) var(--space-5);\n  padding: var(--space-4) var(--space-6);\n  background: var(--fill-bar-alt);\n  color: var(--color-bar-alt-text);\n  font-size: var(--text-small);\n}\n.ds-footer__name {\n  font-weight: var(--weight-bold);\n}\n.ds-footer__links {\n  display: flex;\n  gap: var(--space-4);\n  margin: 0 0 0 auto;\n  padding: 0;\n  list-style: none;\n}\n.ds-footer__link {\n  color: inherit;\n  text-decoration: var(--link-decoration-quiet);\n}\n\n@media (max-width: 1100px) {\n  .ds-stat,\n  .ds-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .ds-cols,\n  .ds-cols--even,\n  .ds-cols--side {\n    grid-template-columns: minmax(0, 1fr);\n  }\n}\n@media (max-width: 900px) {\n  .ds-page {\n    display: block;\n  }\n  .ds-nav {\n    flex-direction: row;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: var(--space-2);\n    padding: var(--space-3) var(--space-4);\n    border-right: 0;\n  }\n  .ds-nav .ds-brand {\n    width: 100%;\n    margin: 0 0 var(--space-1);\n  }\n  .ds-nav__group,\n  .ds-nav__foot,\n  .ds-nav__icon {\n    display: none;\n  }\n  .ds-nav__links {\n    flex-direction: row;\n  }\n  .ds-nav__link .ds-badge {\n    display: none;\n  }\n  .ds-nav__link {\n    padding: var(--space-1) var(--space-3);\n  }\n  .ds-topbar {\n    padding: 0 var(--space-4);\n  }\n  .ds-topbar__link {\n    display: none;\n  }\n  .ds-hero,\n  .ds-page-header {\n    padding-left: var(--space-4);\n    padding-right: var(--space-4);\n  }\n  .ds-hero__inner,\n  .ds-page-header__inner {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .ds-content {\n    padding: 0 var(--space-4) var(--space-5);\n  }\n  .ds-footer {\n    padding: var(--space-4);\n  }\n  .ds-footer__links {\n    margin-left: 0;\n  }\n}\n@media (max-width: 520px) {\n  .ds-stat,\n  .ds-grid {\n    grid-template-columns: minmax(0, 1fr);\n  }\n  .ds-hero__title,\n  .ds-page-header__title {\n    font-size: var(--text-h2);\n  }\n  .ds-tabs {\n    padding: 0 var(--space-3);\n  }\n  .ds-panel__body {\n    padding: var(--space-4);\n  }\n  .ds-list--people .ds-list__item {\n    flex-wrap: wrap;\n  }\n}\n\n/* components shared across the era: menu, switch, tooltip, accordion, progress, avatar */\n.ds-menu {\n  position: relative;\n}\n.ds-menu__button {\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-1);\n  padding: var(--space-1) var(--space-3);\n  border-radius: var(--radius-control);\n  color: inherit;\n  font-weight: var(--weight-ui);\n  text-transform: var(--ui-transform);\n  white-space: nowrap;\n  list-style: none;\n  cursor: pointer;\n  transition: var(--transition);\n}\n.ds-menu__button::-webkit-details-marker {\n  display: none;\n}\n.ds-menu__button::after {\n  content: \"\";\n  display: inline-block;\n  flex: none;\n  width: 0;\n  height: 0;\n  border: calc(var(--text-small) * 0.3) solid transparent;\n  border-top: calc(var(--text-small) * 0.36) solid currentColor;\n  border-bottom-width: 0;\n  font-size: var(--text-small);\n  vertical-align: calc(var(--text-small) * 0.14);\n}\n.ds-menu__button:focus-visible,\n.ds-menu__button.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-menu__list {\n  position: absolute;\n  top: 100%;\n  right: 0;\n  z-index: 5;\n  min-width: var(--size-menu);\n  margin: var(--space-2) 0 0;\n  padding: var(--space-2);\n  border: var(--border-width) var(--border-style) var(--color-border-muted);\n  border-radius: var(--radius-panel);\n  background: var(--fill-panel);\n  box-shadow: var(--shadow-dialog);\n  list-style: none;\n}\n.ds-menu__link {\n  display: block;\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-control);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n  font-weight: var(--weight-ui);\n  text-decoration: none;\n  white-space: nowrap;\n  transition: var(--transition);\n}\n.ds-menu__link:hover,\n.ds-menu__link.is-hover {\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n}\n.ds-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--space-2);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-ui);\n  cursor: pointer;\n}\n.ds-switch__input {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n.ds-switch__track {\n  position: relative;\n  flex: none;\n  width: calc(var(--space-5) * 1.75);\n  height: var(--space-5);\n  border-radius: var(--radius-pill);\n  background: var(--color-border-strong);\n  transition: var(--transition);\n}\n.ds-switch__track::after {\n  content: \"\";\n  position: absolute;\n  top: calc(var(--space-1) / 2);\n  left: calc(var(--space-1) / 2);\n  width: calc(var(--space-5) - var(--space-1));\n  height: calc(var(--space-5) - var(--space-1));\n  border-radius: var(--radius-pill);\n  background: var(--color-button-text);\n  transition: var(--transition);\n}\n.ds-switch__input:checked + .ds-switch__track,\n.ds-switch.is-on .ds-switch__track {\n  background: var(--fill-button);\n}\n.ds-switch__input:checked + .ds-switch__track::after,\n.ds-switch.is-on .ds-switch__track::after {\n  left: calc(var(--space-5) * 0.75 + var(--space-1) / 2);\n}\n.ds-switch__input:focus-visible + .ds-switch__track,\n.ds-switch.is-focus .ds-switch__track {\n  outline: var(--focus-ring);\n  outline-offset: calc(var(--space-1) / 2);\n}\n.ds-tooltip {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  cursor: help;\n}\n.ds-tooltip--mark {\n  width: calc(var(--space-4) + var(--space-1));\n  height: calc(var(--space-4) + var(--space-1));\n  border-radius: 50%;\n  background: var(--color-surface-strong);\n  color: var(--color-text);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-bold);\n  line-height: 1;\n}\n.ds-tooltip:focus-visible,\n.ds-tooltip.is-focus {\n  outline: var(--focus-ring);\n}\n.ds-tooltip__text {\n  position: absolute;\n  bottom: calc(100% + var(--space-2));\n  left: 50%;\n  z-index: 6;\n  display: none;\n  width: max-content;\n  max-width: var(--size-tip);\n  padding: var(--space-2) var(--space-3);\n  border-radius: var(--radius-panel);\n  background: var(--color-heading);\n  color: var(--color-surface);\n  font-family: var(--font-ui);\n  font-size: var(--text-small);\n  font-weight: var(--weight-body);\n  line-height: var(--line-heading);\n  text-align: left;\n  white-space: normal;\n  box-shadow: var(--shadow-control);\n  transform: translateX(-50%);\n}\n.ds-tooltip:hover .ds-tooltip__text,\n.ds-tooltip:focus .ds-tooltip__text,\n.ds-tooltip.is-open .ds-tooltip__text {\n  display: block;\n}\n.ds-progress__bar--40 { width: 40%; }\n.ds-progress__bar--60 { width: 60%; }\n.ds-tooltip--mark {\n  margin-left: var(--space-1);\n  vertical-align: middle;\n}\n.ds-tooltip--start .ds-tooltip__text {\n  left: 0;\n  transform: none;\n}\n.ds-form__check > .ds-switch {\n  flex: 1;\n  min-width: 0;\n}\n.ds-topbar__account {\n  flex: none;\n}\n.ds-topbar__account > .ds-menu__button {\n  gap: var(--space-2);\n  padding: 0;\n  color: inherit;\n}\n.ds-topbar__search {\n  min-width: 0;\n}\n\n/* phone: the links fold into a menu behind a button; the brand and one action stay in the bar */\n.ds-nav__menu {\n  display: none;\n}\n.ds-nav__menu > .ds-menu__button {\n  gap: var(--space-2);\n  padding: var(--space-1) var(--space-2);\n  color: var(--color-link-quiet);\n  font-family: var(--font-ui);\n  font-size: var(--text-ui);\n}\n.ds-nav__menu > .ds-menu__button::before {\n  content: \"\";\n  box-sizing: border-box;\n  flex: none;\n  width: var(--text-ui);\n  height: calc(var(--text-ui) * 0.75);\n  border-top: max(var(--border-width), calc(var(--text-ui) * 0.12)) solid currentColor;\n  border-bottom: max(var(--border-width), calc(var(--text-ui) * 0.12)) solid currentColor;\n  background: linear-gradient(currentColor, currentColor) center / 100% max(var(--border-width), calc(var(--text-ui) * 0.12)) no-repeat;\n}\n.ds-nav__menu > .ds-menu__button::after {\n  content: none;\n}\n.ds-nav__menu .ds-menu__link {\n  border-left: var(--border-width-strong) var(--border-style) transparent;\n}\n.ds-page:not(:has(.ds-view:target)) .ds-nav__menu .ds-menu__link[href=\"#overview\"],\n.ds-page:has(#overview:target) .ds-nav__menu .ds-menu__link[href=\"#overview\"],\n.ds-page:has(#projects:target) .ds-nav__menu .ds-menu__link[href=\"#projects\"],\n.ds-page:has(#team:target) .ds-nav__menu .ds-menu__link[href=\"#team\"],\n.ds-page:has(#settings:target) .ds-nav__menu .ds-menu__link[href=\"#settings\"],\n.ds-page:has(#news:target) .ds-nav__menu .ds-menu__link[href=\"#news\"] {\n  border-left-color: var(--color-accent);\n  background: var(--color-surface-alt);\n  color: var(--color-heading);\n  font-weight: var(--weight-bold);\n}\n@media (max-width: 900px) {\n  .ds-nav__menu {\n    display: block;\n    flex: none;\n  }\n  .ds-nav > .ds-nav__links,\n  .ds-nav__inner > .ds-nav__links {\n    display: none;\n  }\n  .ds-nav .ds-brand {\n    width: auto;\n    margin: 0;\n  }\n  .ds-nav__menu {\n    margin-left: auto;\n  }\n}\n.ds-topbar__name {\n  font-weight: var(--weight-ui);\n  white-space: nowrap;\n}\n\n/* phone: the sidebar's links become a dock of five equal cells along the bottom edge */\n@media (max-width: 640px) {\n  .ds-page {\n    padding-bottom: var(--space-8);\n  }\n  .ds-nav__menu {\n    display: none;\n  }\n  .ds-nav > .ds-nav__links {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    z-index: 4;\n    display: flex;\n    flex-direction: row;\n    gap: 0;\n    width: 60%;\n    padding: var(--space-1) 0;\n    border-top: var(--border-width) var(--border-style) var(--color-border);\n    background: var(--fill-panel);\n  }\n  .ds-nav > .ds-nav__links ~ .ds-nav__links {\n    left: 60%;\n    width: 40%;\n  }\n  .ds-nav > .ds-nav__links > li {\n    flex: 1 1 0;\n    min-width: 0;\n  }\n  .ds-nav > .ds-nav__links .ds-nav__link {\n    flex-direction: column;\n    gap: 0;\n    padding: var(--space-1) 0;\n    font-size: var(--text-small);\n    text-align: center;\n  }\n  .ds-nav > .ds-nav__links .ds-nav__icon {\n    display: block;\n  }\n  .ds-nav > .ds-nav__links .ds-nav__label {\n    flex: none;\n    max-width: 100%;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n}\n",
    "specimen.html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>chronoskin: SaaS gradient dashboard specimen</title>\n<link rel=\"stylesheet\" href=\"tokens.css\">\n<link rel=\"stylesheet\" href=\"components.css\">\n</head>\n<body class=\"ds-page\" data-component=\"shell\">\n\n<header class=\"ds-nav\" data-component=\"nav\">\n  <a class=\"ds-brand\" data-component=\"brand\" href=\"#overview\">\n    <span class=\"ds-brand__mark\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"13.6\" cy=\"10\" r=\"7.6\" opacity=\".45\"/><circle cx=\"9.2\" cy=\"15\" r=\"5.8\"/></svg></span>\n    <span class=\"ds-brand__name\">chronoskin</span>\n  </a>\n  <details class=\"ds-menu ds-nav__menu\">\n    <summary class=\"ds-menu__button\">Menu</summary>\n    <ul class=\"ds-menu__list\">\n    <li><a class=\"ds-menu__link\" href=\"#overview\">Overview</a></li>\n    <li><a class=\"ds-menu__link\" href=\"#projects\">Projects</a></li>\n    <li><a class=\"ds-menu__link\" href=\"#team\">Team</a></li>\n    <li><a class=\"ds-menu__link\" href=\"#settings\">Settings</a></li>\n    <li><a class=\"ds-menu__link\" href=\"#news\">What's new</a></li>\n    </ul>\n  </details>\n  <p class=\"ds-nav__group\">Track</p>\n  <ul class=\"ds-nav__links\">\n    <li><a class=\"ds-nav__link\" href=\"#overview\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 10l7-6 7 6v7H3z\"/></svg><span class=\"ds-nav__label\">Overview</span></a></li>\n    <li><a class=\"ds-nav__link\" href=\"#projects\"><svg class=\"ds-nav__icon ds-nav__icon--2\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 5h5l2 2h7v9H3z\"/></svg><span class=\"ds-nav__label\">Projects</span><span class=\"ds-badge\">14</span></a></li>\n    <li><a class=\"ds-nav__link\" href=\"#team\"><svg class=\"ds-nav__icon ds-nav__icon--3\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"7\" r=\"3\"/><path d=\"M4 17c1-4 11-4 12 0\"/></svg><span class=\"ds-nav__label\">Team</span></a></li>\n  </ul>\n  <p class=\"ds-nav__group\">Workspace</p>\n  <ul class=\"ds-nav__links\">\n    <li><a class=\"ds-nav__link\" href=\"#settings\"><svg class=\"ds-nav__icon ds-nav__icon--4\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"3\"/><path d=\"M10 2v3 M10 15v3 M2 10h3 M15 10h3\"/></svg><span class=\"ds-nav__label\">Settings</span></a></li>\n    <li><a class=\"ds-nav__link\" href=\"#news\"><svg class=\"ds-nav__icon\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M10 3l2 5 5 .5-4 3.500 1.500 5-4.500-3-4.500 3 1.500-5-4-3.500 5-.5z\"/></svg><span class=\"ds-nav__label\">What's new</span><span class=\"ds-badge ds-badge--alt\">3</span></a></li>\n  </ul>\n  <div class=\"ds-nav__foot\">\n    <p class=\"ds-nav__foot-title\">9 days of trial left</p>\n    <p class=\"ds-nav__foot-text\">Keep your projects and reports by choosing a plan.</p>\n    <a class=\"ds-button ds-button--inverse ds-button--small\" href=\"#settings\">Choose a plan</a>\n  </div>\n</header>\n\n<div class=\"ds-topbar\">\n  <input class=\"ds-topbar__search\" type=\"search\" placeholder=\"Search projects and people\" aria-label=\"Search\">\n  <a class=\"ds-topbar__link\" href=\"#news\">What's new</a>\n  <details class=\"ds-menu ds-topbar__account\" data-component=\"menu\">\n    <summary class=\"ds-menu__button\"><span class=\"ds-topbar__name\">Tomas Okafor</span><span class=\"ds-avatar ds-avatar--plain\" aria-hidden=\"true\">TO</span></summary>\n    <ul class=\"ds-menu__list\">\n      <li><a class=\"ds-menu__link\" href=\"#settings\">Your profile</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#settings\">Workspace settings</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#team\">People</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#news\">What's new</a></li>\n      <li><a class=\"ds-menu__link\" href=\"#overview\">Sign out</a></li>\n    </ul>\n  </details>\n</div>\n\n<section class=\"ds-view ds-view--home\" id=\"overview\">\n  <div class=\"ds-hero\" data-component=\"hero\">\n    <div class=\"ds-hero__inner\">\n      <div>\n        <h1 class=\"ds-hero__title\">Good morning, Tomas</h1>\n        <p class=\"ds-hero__lead\">The team tracked 164 hours this week, 12 more than last. Two projects are close to their budget.</p>\n      </div>\n      <div class=\"ds-hero__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#projects\">Start a timer</a>\n        <a class=\"ds-button ds-button--ghost\" href=\"#projects\">Add hours by hand</a>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-content ds-content--lift\">\n    <div class=\"ds-stat\" data-component=\"stats\">\n      <div class=\"ds-stat__item\">\n        <div class=\"ds-stat__head\"><div><p class=\"ds-stat__label\">Hours this week</p><p class=\"ds-stat__figure\">164</p></div><span class=\"ds-tile ds-tile--round\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M10 5v5l3 2\"/><circle cx=\"10\" cy=\"10\" r=\"7\"/></svg></span></div>\n        <p class=\"ds-stat__delta\"><span class=\"ds-stat__up\">+8%</span> on last week</p>\n        <svg class=\"ds-spark\" viewBox=\"0 0 200 40\" preserveAspectRatio=\"none\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 30 L35 26 L68 28 L101 16 L134 20 L167 9 L198 6\"/></svg>\n      </div>\n      <div class=\"ds-stat__item\">\n        <div class=\"ds-stat__head\"><div><p class=\"ds-stat__label\">Billable share <span class=\"ds-tooltip ds-tooltip--mark ds-tooltip--start\" tabindex=\"0\" data-component=\"tooltip\">?<span class=\"ds-tooltip__text\">Hours on client projects, out of all hours tracked.</span></span></p><p class=\"ds-stat__figure\">81%</p></div><span class=\"ds-tile ds-tile--round ds-tile--2\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M4 16V8 M9 16V4 M14 16v-6\"/></svg></span></div>\n        <p class=\"ds-stat__delta\"><span class=\"ds-stat__up\">+3 points</span> on last week</p>\n        <svg class=\"ds-spark ds-spark--2\" viewBox=\"0 0 200 40\" preserveAspectRatio=\"none\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 22 L35 24 L68 18 L101 20 L134 14 L167 15 L198 10\"/></svg>\n      </div>\n      <div class=\"ds-stat__item\">\n        <div class=\"ds-stat__head\"><div><p class=\"ds-stat__label\">Unbilled hours</p><p class=\"ds-stat__figure\">46.5</p></div><span class=\"ds-tile ds-tile--round ds-tile--3\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 3h7l3 3v11H5z M8 10h4 M8 13h4\"/></svg></span></div>\n        <p class=\"ds-stat__delta\"><span class=\"ds-stat__down\">+11 hours</span> since Monday</p>\n        <svg class=\"ds-spark ds-spark--3\" viewBox=\"0 0 200 40\" preserveAspectRatio=\"none\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 32 L35 30 L68 24 L101 25 L134 16 L167 12 L198 8\"/></svg>\n      </div>\n      <div class=\"ds-stat__item\">\n        <div class=\"ds-stat__head\"><div><p class=\"ds-stat__label\">Active projects</p><p class=\"ds-stat__figure\">14</p></div><span class=\"ds-tile ds-tile--round ds-tile--4\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 5h5l2 2h7v9H3z\"/></svg></span></div>\n        <p class=\"ds-stat__delta\">2 started this month</p>\n        <svg class=\"ds-spark ds-spark--4\" viewBox=\"0 0 200 40\" preserveAspectRatio=\"none\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 26 L35 26 L68 20 L101 20 L134 20 L167 12 L198 12\"/></svg>\n      </div>\n    </div>\n\n    <div class=\"ds-cols ds-cols--level\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Hours by day</h2><div class=\"ds-chart__legend\"><span class=\"ds-chart__key\">Billable</span><span class=\"ds-chart__key ds-chart__key--alt\">Internal</span></div></div>\n        <div class=\"ds-panel__body\">\n          <div class=\"ds-chart\">\n            <svg class=\"ds-chart__svg\" viewBox=\"0 0 700 220\" preserveAspectRatio=\"none\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n              <path d=\"M0 220 L0 150 L117 110 L233 126 L350 70 L467 88 L583 40 L700 58 L700 220z\" fill=\"currentColor\" fill-opacity=\"0.1\" stroke=\"none\"/>\n              <path d=\"M0 150 L117 110 L233 126 L350 70 L467 88 L583 40 L700 58\"/>\n              <path class=\"ds-chart__alt\" d=\"M0 190 L117 176 L233 182 L350 160 L467 170 L583 150 L700 164\"/>\n            </svg>\n          </div>\n          <ul class=\"ds-chart__axis\"><li>Mon</li><li>Tue</li><li>Wed</li><li>Thu</li><li>Fri</li><li>Sat</li><li>Sun</li></ul>\n        </div>\n      </div>\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Finish setting up</h2><span class=\"ds-badge ds-badge--quiet\">3 of 5</span></div>\n        <div class=\"ds-panel__body\">\n          <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--60\"></span></span>\n          <ul class=\"ds-steps\">\n            <li class=\"ds-steps__item is-done\"><span class=\"ds-steps__mark\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" aria-hidden=\"true\"><path d=\"M4 10l4 4 8-8\"/></svg></span><span class=\"ds-steps__text\">Create the workspace</span></li>\n            <li class=\"ds-steps__item is-done\"><span class=\"ds-steps__mark\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" aria-hidden=\"true\"><path d=\"M4 10l4 4 8-8\"/></svg></span><span class=\"ds-steps__text\">Add a first project</span></li>\n            <li class=\"ds-steps__item is-done\"><span class=\"ds-steps__mark\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" aria-hidden=\"true\"><path d=\"M4 10l4 4 8-8\"/></svg></span><span class=\"ds-steps__text\">Track an hour</span></li>\n            <li class=\"ds-steps__item\"><span class=\"ds-steps__mark\"></span><span class=\"ds-steps__text\">Invite the team</span><a class=\"ds-link\" href=\"#team\">Invite</a></li>\n            <li class=\"ds-steps__item\"><span class=\"ds-steps__mark\"></span><span class=\"ds-steps__text\">Set hourly rates</span><a class=\"ds-link\" href=\"#settings\">Set</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <h2 class=\"ds-section-title\">Close to budget</h2>\n    <div class=\"ds-grid\" data-component=\"grid\">\n      <a class=\"ds-grid__cell\" href=\"#projects\">\n        <span class=\"ds-tile\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 5h14v10H3z M3 8h14\"/></svg></span>\n        <h3 class=\"ds-grid__title\">Harbour Bakery shop</h3>\n        <p class=\"ds-grid__text\">108 of 120 hours</p>\n        <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--90\"></span></span>\n      </a>\n      <a class=\"ds-grid__cell\" href=\"#projects\">\n        <span class=\"ds-tile ds-tile--2\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M4 16l1-4 9-9 3 3-9 9z\"/></svg></span>\n        <h3 class=\"ds-grid__title\">Tern Cycles identity</h3>\n        <p class=\"ds-grid__text\">45 of 60 hours</p>\n        <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--75\"></span></span>\n      </a>\n      <a class=\"ds-grid__cell\" href=\"#projects\">\n        <span class=\"ds-tile ds-tile--3\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 3h7l3 3v11H5z M8 10h4 M8 13h4\"/></svg></span>\n        <h3 class=\"ds-grid__title\">Marrow Press catalogue</h3>\n        <p class=\"ds-grid__text\">32 of 80 hours</p>\n        <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--40\"></span></span>\n      </a>\n      <a class=\"ds-grid__cell\" href=\"#projects\">\n        <span class=\"ds-tile ds-tile--4\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M10 5v6 M10 14v1\"/><circle cx=\"10\" cy=\"10\" r=\"7\"/></svg></span>\n        <h3 class=\"ds-grid__title\">Fieldnote app, phase 2</h3>\n        <p class=\"ds-grid__text\">212 of 200 hours</p>\n        <span class=\"ds-progress\"><span class=\"ds-progress__bar ds-progress__bar--over\"></span></span>\n      </a>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"projects\">\n  <div class=\"ds-page-header\" data-component=\"page-header\">\n    <div class=\"ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\" data-component=\"breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Workspace</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Track</a></li>\n          <li class=\"ds-breadcrumb__current\">Projects</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Projects</h1>\n        <p class=\"ds-page-header__text\">Hours against budget for everything the team is working on.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#projects\">New project</a>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-content ds-content--lift\">\n    <div class=\"ds-panel\">\n      <ul class=\"ds-tabs\" data-component=\"tabs\">\n        <li><a class=\"ds-tabs__tab is-current\" href=\"#projects\">Active</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#projects\">On hold</a></li>\n        <li><a class=\"ds-tabs__tab\" href=\"#projects\">Archived</a></li>\n      </ul>\n      <div class=\"ds-table__wrap\">\n        <table class=\"ds-table\" data-component=\"table\">\n          <thead>\n            <tr><th>Project</th><th>Client</th><th>Status</th><th class=\"ds-table__num\">Hours</th><th class=\"ds-table__num\">Budget</th><th class=\"ds-table__num\">Unbilled</th></tr>\n          </thead>\n          <tbody>\n            <tr><td><a class=\"ds-table__title\" href=\"#projects\">Shop redesign</a></td><td>Harbour Bakery</td><td><span class=\"ds-badge ds-badge--warning\">Near budget</span></td><td class=\"ds-table__num\">108.0</td><td class=\"ds-table__num\">120</td><td class=\"ds-table__num\">12.5</td></tr>\n            <tr class=\"is-hover\"><td><a class=\"ds-table__title\" href=\"#projects\">Identity</a></td><td>Tern Cycles</td><td><span class=\"ds-badge ds-badge--success\">On track</span></td><td class=\"ds-table__num\">45.0</td><td class=\"ds-table__num\">60</td><td class=\"ds-table__num\">8.0</td></tr>\n            <tr><td><a class=\"ds-table__title\" href=\"#projects\">Spring catalogue</a></td><td>Marrow Press</td><td><span class=\"ds-badge ds-badge--success\">On track</span></td><td class=\"ds-table__num\">32.5</td><td class=\"ds-table__num\">80</td><td class=\"ds-table__num\">14.0</td></tr>\n            <tr><td><a class=\"ds-table__title\" href=\"#projects\">App, phase 2</a></td><td>Fieldnote</td><td><span class=\"ds-badge ds-badge--danger\">Over budget</span></td><td class=\"ds-table__num\">212.0</td><td class=\"ds-table__num\">200</td><td class=\"ds-table__num\">12.0</td></tr>\n            <tr><td><a class=\"ds-table__title\" href=\"#projects\">Annual report</a></td><td>Lindqvist Studio</td><td><span class=\"ds-badge ds-badge--quiet\">Not started</span></td><td class=\"ds-table__num\">0.0</td><td class=\"ds-table__num\">40</td><td class=\"ds-table__num\">0.0</td></tr>\n          </tbody>\n        </table>\n      </div>\n      <div class=\"ds-table__foot\">\n        <ul class=\"ds-pagination\" data-component=\"pagination\">\n          <li><a class=\"ds-pagination__link is-disabled\" href=\"#projects\">Previous</a></li>\n          <li><a class=\"ds-pagination__link is-current\" href=\"#projects\">1</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#projects\">2</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#projects\">3</a></li>\n          <li><a class=\"ds-pagination__link\" href=\"#projects\">Next</a></li>\n        </ul>\n        <span>1 to 5 of 14 projects</span>\n      </div>\n    </div>\n    <div class=\"ds-cols ds-cols--even ds-cols--level\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">What the status means</h2></div>\n        <div class=\"ds-panel__body\">\n          <p class=\"ds-panel__text\">A project changes status by itself as hours are tracked against its budget.</p>\n          <div class=\"ds-badgerow\" data-component=\"badge\">\n            <span class=\"ds-badge\">Active</span>\n            <span class=\"ds-badge ds-badge--success\">On track</span>\n            <span class=\"ds-badge ds-badge--warning\">Near budget, from 85%</span>\n            <span class=\"ds-badge ds-badge--danger\">Over budget</span>\n            <span class=\"ds-badge ds-badge--quiet\">Not started</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"ds-empty\" data-component=\"empty\">\n        <span class=\"ds-empty__icon\"><svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M3 5h14v3H3z M4 8v8h12V8 M8 11h4\"/></svg></span>\n        <h2 class=\"ds-empty__title\">Nothing archived yet</h2>\n        <p class=\"ds-empty__text\">Finished projects move here with their hours, so old reports keep working.</p>\n        <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#projects\">Archive a project</a>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"team\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Workspace</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Track</a></li>\n          <li class=\"ds-breadcrumb__current\">Team</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Team</h1>\n        <p class=\"ds-page-header__text\">Four people track time here. Two invitations are waiting.</p>\n      </div>\n      <div class=\"ds-page-header__actions\">\n        <a class=\"ds-button ds-button--inverse\" href=\"#team\">Invite someone</a>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-content ds-content--lift\">\n    <div class=\"ds-cols\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">People</h2><a class=\"ds-link\" href=\"#settings\">Roles and rates</a></div>\n        <div class=\"ds-panel__body\">\n          <ul class=\"ds-list ds-list--people\" data-component=\"list\">\n            <li class=\"ds-list__item\">\n              <span class=\"ds-avatar ds-avatar--1\" aria-hidden=\"true\">TO</span>\n              <div class=\"ds-list__grow\"><span class=\"ds-list__title\">Tomas Okafor</span><p class=\"ds-list__meta\">Owner. 38.5 hours this week, last entry today</p></div>\n              <span class=\"ds-badge\">Owner</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-avatar ds-avatar--2\" aria-hidden=\"true\">IL</span>\n              <div class=\"ds-list__grow\"><span class=\"ds-list__title\">Ingrid Lindqvist</span><p class=\"ds-list__meta\">Designer. 41.0 hours this week, last entry today</p></div>\n              <span class=\"ds-badge ds-badge--success\">Tracking now</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-avatar\" aria-hidden=\"true\">MP</span>\n              <div class=\"ds-list__grow\"><span class=\"ds-list__title\">Maya Prentice</span><p class=\"ds-list__meta\">Developer. 44.5 hours this week, last entry yesterday</p></div>\n              <span class=\"ds-badge ds-badge--warning\">Over 40 hours</span>\n            </li>\n            <li class=\"ds-list__item\">\n              <span class=\"ds-avatar ds-avatar--4\" aria-hidden=\"true\">DR</span>\n              <div class=\"ds-list__grow\"><span class=\"ds-list__title\">Dana Reyes</span><p class=\"ds-list__meta\">Contractor. 0 hours this week, last entry 23 days ago</p></div>\n              <a class=\"ds-link ds-link--quiet\" href=\"#team\">Remove</a>\n            </li>\n          </ul>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Waiting to join</h2></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item\"><div class=\"ds-list__head\"><span class=\"ds-list__title\">Sam Whitlock</span><a class=\"ds-link\" href=\"#team\">Send again</a></div><p class=\"ds-list__meta\">Invited 2 days ago as a designer</p></li>\n              <li class=\"ds-list__item\"><div class=\"ds-list__head\"><span class=\"ds-list__title\">Noor Haddad</span><a class=\"ds-link\" href=\"#team\">Send again</a></div><p class=\"ds-list__meta\">Invited 6 days ago as a contractor</p></li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"ds-dialog\" data-component=\"dialog\">\n          <div class=\"ds-dialog__box\" role=\"dialog\" aria-labelledby=\"tm-dialog\">\n            <div class=\"ds-dialog__head\"><h2 class=\"ds-dialog__title\" id=\"tm-dialog\">Remove Dana Reyes?</h2><a class=\"ds-dialog__close\" href=\"#team\" aria-label=\"Close\"></a></div>\n            <div class=\"ds-dialog__body\"><p>Dana will lose access today. The 96 hours she tracked stay in your reports.</p></div>\n            <div class=\"ds-dialog__actions\">\n              <a class=\"ds-button ds-button--secondary ds-button--small\" href=\"#team\">Keep</a>\n              <a class=\"ds-button ds-button--danger ds-button--small\" href=\"#team\">Remove</a>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"settings\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Workspace</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#settings\">Settings</a></li>\n          <li class=\"ds-breadcrumb__current\">Workspace details</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">Settings</h1>\n        <p class=\"ds-page-header__text\">Names, rates and the working week for everyone in this workspace.</p>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-content ds-content--lift\">\n    <div class=\"ds-cols ds-cols--side\">\n      <div class=\"ds-panel ds-panel--side\">\n        <nav class=\"ds-sidebar\" data-component=\"sidebar\">\n          <h2 class=\"ds-sidebar__title\">Settings</h2>\n          <ul class=\"ds-sidebar__list\">\n            <li><a class=\"ds-sidebar__item is-current\" href=\"#settings\">Workspace details</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#settings\">Roles and rates <span class=\"ds-sidebar__count\">4</span></a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#settings\">Notifications</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#settings\">Plan and billing</a></li>\n            <li><a class=\"ds-sidebar__item\" href=\"#settings\">Export</a></li>\n          </ul>\n        </nav>\n      </div>\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Workspace details</h2><span class=\"ds-badge ds-badge--alt\">Trial</span></div>\n        <div class=\"ds-panel__body\">\n          <form class=\"ds-form\" data-component=\"form\" action=\"#settings\">\n            <div class=\"ds-noticerow\" data-component=\"notice\">\n              <p class=\"ds-notice\"><span class=\"ds-notice__title\">Rates are private.</span> Only owners see what an hour costs.</p>\n              <p class=\"ds-notice ds-notice--error\"><span class=\"ds-notice__title\">Not saved.</span> The default rate needs a number.</p>\n            </div>\n            <div class=\"ds-form__row\">\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"st-name\">Workspace name</label>\n                <input class=\"ds-form__input\" id=\"st-name\" type=\"text\" value=\"Okafor and Reyes\">\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"st-rate\">Default hourly rate</label>\n                <input class=\"ds-form__input is-error\" id=\"st-rate\" type=\"text\" value=\"sixty\">\n                <span class=\"ds-form__error\">Write the rate in figures, for example 60.</span>\n              </div>\n            </div>\n            <div class=\"ds-form__row\">\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"st-week\">Week starts on</label>\n                <select class=\"ds-form__select\" id=\"st-week\"><option>Monday</option><option>Sunday</option><option>Saturday</option></select>\n              </div>\n              <div class=\"ds-form__field\">\n                <label class=\"ds-form__label\" for=\"st-round\">Round entries to</label>\n                <select class=\"ds-form__select\" id=\"st-round\"><option>15 minutes</option><option>6 minutes</option><option>Do not round</option></select>\n                <span class=\"ds-form__hint\">Applies to new entries only.</span>\n              </div>\n            </div>\n            <div class=\"ds-form__field\">\n              <label class=\"ds-form__label\" for=\"st-note\">Note on timesheets</label>\n              <textarea class=\"ds-form__textarea\" id=\"st-note\">Hours are sent to clients on the first working day of the month.</textarea>\n            </div>\n            <div class=\"ds-form__check\"><label class=\"ds-switch\" data-component=\"switch\"><input class=\"ds-switch__input\" type=\"checkbox\" checked><span class=\"ds-switch__track\"></span><span>Remind people on Friday if their week is under 30 hours</span></label></div>\n            <div class=\"ds-form__actions\" data-component=\"buttons\">\n              <button class=\"ds-button\" type=\"submit\">Save changes</button>\n              <a class=\"ds-button ds-button--secondary\" href=\"#overview\">Cancel</a>\n              <button class=\"ds-button is-disabled\" type=\"button\" disabled>Export all hours</button>\n              <a class=\"ds-button ds-button--danger\" href=\"#settings\">Delete workspace</a>\n            </div>\n          </form>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<section class=\"ds-view\" id=\"news\">\n  <div class=\"ds-page-header\">\n    <div class=\"ds-page-header__inner\">\n      <div>\n        <ol class=\"ds-breadcrumb\">\n          <li><a class=\"ds-breadcrumb__item\" href=\"#overview\">Workspace</a></li>\n          <li><a class=\"ds-breadcrumb__item\" href=\"#news\">What's new</a></li>\n          <li class=\"ds-breadcrumb__current\">March</li>\n        </ol>\n        <h1 class=\"ds-page-header__title\">What's new</h1>\n        <p class=\"ds-page-header__text\">Changes to chronoskin, newest first.</p>\n      </div>\n    </div>\n  </div>\n  <div class=\"ds-content ds-content--lift\">\n    <div class=\"ds-cols\">\n      <div class=\"ds-panel\">\n        <div class=\"ds-panel__body\">\n          <article class=\"ds-prose\" data-component=\"typography\">\n            <h1>Budgets that warn you in time</h1>\n            <p class=\"ds-prose__lead\">A project now tells you when it is about to run out of hours, not after it has.</p>\n            <h2>How the warning works</h2>\n            <p>Set a budget in hours on any project. At 85% the project is marked <strong>Near budget</strong> and its owner gets one email; past 100% it is marked over budget.</p>\n            <h3>Changing the threshold</h3>\n            <p>The 85% mark suits most teams. To move it, open the project and set <code>warn_at</code> to a value between 50 and 95.</p>\n            <h3>Also in this release</h3>\n            <ul>\n              <li>Timers survive a closed browser tab.</li>\n              <li>Reports can be grouped by person, then by project.</li>\n              <li>The weekly summary email arrives on Monday at 8, in your own time zone.</li>\n            </ul>\n          </article>\n        </div>\n      </div>\n      <div class=\"ds-stack\">\n        <div class=\"ds-panel\" data-component=\"panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Earlier</h2></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-list\">\n              <li class=\"ds-list__item\"><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#news\">Rounding rules</a><span class=\"ds-badge ds-badge--alt\">New</span></div><p class=\"ds-list__meta\">February, 2 minute read</p></li>\n              <li class=\"ds-list__item\"><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#news\">Faster reports</a><span class=\"ds-badge ds-badge--quiet\">Improved</span></div><p class=\"ds-list__meta\">January, 1 minute read</p></li>\n              <li class=\"ds-list__item\"><div class=\"ds-list__head\"><a class=\"ds-list__title\" href=\"#news\">Contractor role</a><span class=\"ds-badge ds-badge--alt\">New</span></div><p class=\"ds-list__meta\">December, 3 minute read</p></li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"ds-panel\">\n          <div class=\"ds-panel__head\"><h2 class=\"ds-panel__title\">Read more</h2></div>\n          <div class=\"ds-panel__body\">\n            <ul class=\"ds-linkrow\" data-component=\"links\">\n              <li><a class=\"ds-link\" href=\"#projects\">Set a budget</a></li>\n              <li><a class=\"ds-link is-visited\" href=\"#news\">Release notes</a></li>\n              <li><a class=\"ds-link is-hover\" href=\"#settings\">Email settings</a></li>\n              <li><a class=\"ds-link is-active\" href=\"#team\">Who gets warned</a></li>\n            </ul>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</section>\n\n<footer class=\"ds-footer\" data-component=\"footer\">\n  <span class=\"ds-footer__name\">chronoskin</span>\n  <span>2019. Time tracking for small teams.</span>\n  <ul class=\"ds-footer__links\">\n    <li><a class=\"ds-footer__link\" href=\"#news\">What's new</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#settings\">Settings</a></li>\n    <li><a class=\"ds-footer__link\" href=\"#overview\">Help</a></li>\n  </ul>\n</footer>\n\n</body>\n</html>\n",
    "style.json": "{\n  \"id\": \"v1.saas-gradient.app.s02.p03.t08.u03\",\n  \"library\": \"2026.10.09-1346\",\n  \"era\": {\n    \"slug\": \"saas-gradient\",\n    \"years\": [\n      2016,\n      2021\n    ]\n  },\n  \"archetype\": \"app\",\n  \"mode\": \"mix\",\n  \"markup\": \"modern\",\n  \"viewport\": {\n    \"width\": 1440,\n    \"fluid\": false,\n    \"responsive\": true\n  },\n  \"source\": \"https://chrono.skin/s/v1-sg-2383\",\n  \"short\": \"v1-sg-2383\"\n}\n",
    "tokens.css": "/* @part palette */\n:root {\n  --color-page: #f8f5f3;\n  --color-canvas: #f8f5f3;\n  --color-surface: #ffffff;\n  --color-surface-alt: #f3f0ee;\n  --color-surface-strong: #eae4df;\n  --color-bar: #f3f0ee;\n  --color-bar-text: #46585c;\n  --color-bar-alt: #17262b;\n  --color-bar-alt-text: #c8d3d5;\n  --color-inverse: #fb5a62;\n  --color-inverse-text: #ffffff;\n  --color-text: #46585c;\n  --color-text-muted: #8d9a9c;\n  --color-heading: #17262b;\n  --color-heading-alt: #2f4347;\n  --color-link: #f0336b;\n  --color-link-quiet: #5b6c70;\n  --color-link-visited: #b8517f;\n  --color-link-hover: #f27a3e;\n  --color-link-active: #c22f62;\n  --color-border: #e6dfd9;\n  --color-border-strong: #cbc2ba;\n  --color-border-muted: #f1ebe6;\n  --color-accent: #f27a3e;\n  --color-accent-text: #ffffff;\n  --color-accent-alt: #7b5fd3;\n  --color-fill-1: #ff3d6e;\n  --color-fill-2: #ff9440;\n  --color-fill-3: #7b5fd3;\n  --color-fill-4: #23b5a3;\n  --color-button: #5b4bd6;\n  --color-button-text: #ffffff;\n  --color-button-hover-text: #ffffff;\n  --color-button-secondary: #ffffff;\n  --color-button-secondary-text: #17262b;\n  --color-input: #ffffff;\n  --color-input-text: #17262b;\n  --color-input-border: #cbc2ba;\n  --color-disabled: #efe8e3;\n  --color-disabled-text: #a9a29c;\n  --color-danger: #d6344a;\n  --color-danger-surface: #fdf0f1;\n  --color-success: #23a586;\n  --color-warning: #eda02b;\n  --color-notice: #fff1e6;\n  --color-notice-text: #9a4a17;\n  --color-focus: #5b4bd6;\n  --color-shadow: rgb(23 38 43 / 0.1);\n  --color-overlay: rgb(23 38 43 / 0.6);\n}\n\n/* @part type */\n:root {\n  --font-body: \"Open Sans\", \"Segoe UI\", Tahoma, sans-serif;\n  --font-heading: Montserrat, \"Avenir Next\", Avenir, \"Century Gothic\", sans-serif;\n  --font-ui: Montserrat, \"Avenir Next\", Avenir, \"Century Gothic\", sans-serif;\n  --font-mono: \"Roboto Mono\", Menlo, Consolas, monospace;\n  --text-base: 16px;\n  --text-small: 13px;\n  --text-ui: 14px;\n  --text-large: 20px;\n  --text-display: 56px;\n  --text-h1: 38px;\n  --text-h2: 26px;\n  --text-h3: 18px;\n  --line-body: 1.62;\n  --line-heading: 1.22;\n  --line-display: 1.08;\n  --weight-body: 400;\n  --weight-bold: 700;\n  --weight-heading: 800;\n  --weight-display: 800;\n  --weight-ui: 700;\n  --heading-transform: none;\n  --heading-tracking: -0.4px;\n  --display-tracking: -1.6px;\n  --figure-shift: 0em;\n  --ui-transform: none;\n  --link-decoration: none;\n  --link-decoration-hover: underline;\n  --link-decoration-quiet: none;\n}\n\n/* @part surface */\n:root {\n  --border-width: 1px;\n  --border-width-strong: 2px;\n  --border-style: solid;\n  --radius-control: 5px;\n  --radius-panel: 5px;\n  --radius-pill: 3px;\n  --radius-page: 8px;\n  --shadow-panel: 0 1px 3px var(--color-shadow), 0 10px 28px var(--color-shadow);\n  --shadow-control: 0 1px 2px var(--color-shadow), 0 3px 8px var(--color-shadow);\n  --shadow-control-hover: 0 2px 4px var(--color-shadow), 0 8px 18px var(--color-shadow);\n  --shadow-control-pressed: inset 0 1px 3px var(--color-shadow);\n  --shadow-dialog: 0 4px 10px var(--color-shadow), 0 24px 64px var(--color-shadow);\n  --shadow-text: none;\n  --fill-page: var(--color-page);\n  --fill-bar: var(--color-bar);\n  --fill-bar-alt: var(--color-bar-alt);\n  --fill-inverse: linear-gradient(200deg, var(--color-fill-2), var(--color-fill-1) 85%);\n  --fill-accent: var(--color-accent);\n  --fill-panel: var(--color-surface);\n  --fill-button: linear-gradient(to bottom, color-mix(in srgb, var(--color-button) 88%, white), var(--color-button));\n  --fill-button-hover: linear-gradient(var(--color-button), var(--color-button));\n  --fill-button-secondary: var(--color-button-secondary);\n  --fill-input: var(--color-input);\n  --focus-ring: 2px solid var(--color-focus);\n  --transition: box-shadow 0.12s ease-out, background-color 0.12s ease-out;\n  --backdrop-blur: 0px;\n}\n"
  }
}
