{
  "name": "@barebase/style",
  "version": "0.2.1",
  "homepage": "https://bare.style/templates",
  "about": "Whole pages and sections composed only of components the framework already ships. Paste the html as it is: link src/core plus the files in links, and it renders. No template introduces a class of its own.",
  "mandatory": [
    "src/core/reset.css",
    "src/core/tokens.css",
    "src/core/type.css",
    "src/core/base.css"
  ],
  "categories": [
    {
      "id": "app",
      "label": "Application"
    },
    {
      "id": "auth",
      "label": "Auth"
    },
    {
      "id": "content",
      "label": "Content"
    },
    {
      "id": "marketing",
      "label": "Marketing"
    }
  ],
  "tags": [
    "accordion",
    "app",
    "article",
    "auth",
    "author",
    "avatar",
    "banner",
    "billing",
    "blog",
    "card",
    "changelog",
    "chart",
    "chat",
    "cluster",
    "comparison",
    "composer",
    "content",
    "cta",
    "dashboard",
    "data",
    "detail",
    "disclosure",
    "email",
    "empty",
    "empty-state",
    "error",
    "faq",
    "features",
    "filter",
    "five-plans",
    "footer",
    "form",
    "four-plans",
    "full-page",
    "grid",
    "hero",
    "inbox",
    "landing",
    "list",
    "listing",
    "locked",
    "login",
    "logo-cloud",
    "logs",
    "marketing",
    "messaging",
    "metrics",
    "navigation",
    "onboarding",
    "one-plan",
    "one-time-code",
    "pagination",
    "password-reset",
    "pricing",
    "profile",
    "prose",
    "quote",
    "release-notes",
    "roster",
    "search",
    "settings",
    "shell",
    "sign-in",
    "sign-up",
    "six-plans",
    "social-proof",
    "status",
    "stepper",
    "table",
    "table-of-contents",
    "tasks",
    "team",
    "testimonial",
    "thread",
    "three-plans",
    "timeline",
    "toggle",
    "two-factor",
    "two-plans"
  ],
  "templates": [
    {
      "id": "activity-timeline",
      "title": "Activity timeline",
      "description": "A feed of who did what to which record and when, split by day, with a control to fetch older entries.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "block",
      "tags": [
        "app",
        "timeline",
        "list",
        "data"
      ],
      "links": [
        "src/app/flow-activity.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/divider.css",
        "src/forms/button.css",
        "src/utility/spacing.css",
        "src/utility/size.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-activity",
        "bs-activity__actor",
        "bs-activity__avatar",
        "bs-activity__body",
        "bs-activity__item",
        "bs-activity__item--new",
        "bs-activity__item--unread",
        "bs-activity__line",
        "bs-activity__main",
        "bs-activity__target",
        "bs-activity__time",
        "bs-btn",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-cluster",
        "bs-cluster--start",
        "bs-divider",
        "bs-divider--label-start",
        "bs-divider--tight",
        "bs-divider__label",
        "bs-flow-none",
        "bs-gap-4",
        "bs-max-w-md",
        "bs-stack",
        "bs-text-h5"
      ],
      "html": "<!-- Capped, because the entries are capped. An activity line is a sentence and takes the measure\n     every paragraph in this framework takes, so on a wide page the day rules ran the full width of\n     the section while the entries under them stopped a third of the way across. The cap only ever\n     narrows the block, so it is still correct dropped into a column. -->\n<section class=\"bs-stack bs-gap-4 bs-max-w-md\" aria-labelledby=\"activity-title\">\n  <h2 class=\"bs-text-h5 bs-flow-none\" id=\"activity-title\">Activity</h2>\n\n  <div class=\"bs-divider bs-divider--label-start bs-divider--tight\" role=\"separator\">\n    <span class=\"bs-divider__label\">Today</span>\n  </div>\n\n  <ol class=\"bs-activity\">\n    <li class=\"bs-activity__item bs-activity__item--new\">\n      <!-- Initials are decoration next to a name that is already in the text, so the avatar is\n           hidden rather than announced a second time. -->\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">RA</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Rin Alvarez</span>\n          escalated\n          <a class=\"bs-activity__target\" href=\"/incidents/4821\">INC-4821</a>\n        </p>\n        <p class=\"bs-activity__body\">The retry budget is gone and settlement is queued behind it.</p>\n        <time class=\"bs-activity__time\" datetime=\"2026-08-01T14:32:00Z\">14:32</time>\n      </div>\n    </li>\n\n    <li class=\"bs-activity__item bs-activity__item--unread\">\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">SY</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Settlement monitor</span>\n          opened\n          <a class=\"bs-activity__target\" href=\"/incidents/4821\">INC-4821</a>\n        </p>\n        <p class=\"bs-activity__body\">Four consecutive gateway timeouts on settle-payouts.</p>\n        <time class=\"bs-activity__time\" datetime=\"2026-08-01T14:22:07Z\">14:22</time>\n      </div>\n    </li>\n\n    <li class=\"bs-activity__item\">\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">TF</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Tomas Ferro</span>\n          reassigned\n          <a class=\"bs-activity__target\" href=\"/t/1831\">Ticket 1831</a>\n          to Finance\n        </p>\n        <time class=\"bs-activity__time\" datetime=\"2026-08-01T11:07:00Z\">11:07</time>\n      </div>\n    </li>\n\n    <li class=\"bs-activity__item\">\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">MO</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Mira Okonkwo</span>\n          published\n          <a class=\"bs-activity__target\" href=\"/runbooks/settlement-timeouts\">Runbook: settlement timeouts</a>\n        </p>\n        <p class=\"bs-activity__body\">Rewrote the first three checks after last week's incident review.</p>\n        <time class=\"bs-activity__time\" datetime=\"2026-08-01T09:41:00Z\">09:41</time>\n      </div>\n    </li>\n  </ol>\n\n  <div class=\"bs-divider bs-divider--label-start bs-divider--tight\" role=\"separator\">\n    <span class=\"bs-divider__label\">Yesterday</span>\n  </div>\n\n  <ol class=\"bs-activity\">\n    <li class=\"bs-activity__item\">\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">RA</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Rin Alvarez</span>\n          closed\n          <a class=\"bs-activity__target\" href=\"/t/1817\">Ticket 1817</a>\n        </p>\n        <p class=\"bs-activity__body\">Seat count and invoice agree after the reconciliation run.</p>\n        <time class=\"bs-activity__time\" datetime=\"2026-07-31T09:12:00Z\">09:12</time>\n      </div>\n    </li>\n\n    <li class=\"bs-activity__item\">\n      <span class=\"bs-activity__avatar\" aria-hidden=\"true\">SY</span>\n      <div class=\"bs-activity__main\">\n        <p class=\"bs-activity__line\">\n          <span class=\"bs-activity__actor\">Deploy bot</span>\n          released\n          <a class=\"bs-activity__target\" href=\"/releases/2026-07-31\">checkout-api 4.18</a>\n        </p>\n        <time class=\"bs-activity__time\" datetime=\"2026-07-31T08:02:00Z\">08:02</time>\n      </div>\n    </li>\n  </ol>\n\n  <!-- Aligned to the start, with the heading, the rules and every entry above it. Centred, it is\n       the one element on the block that answers to a different edge. -->\n  <div class=\"bs-cluster bs-cluster--start\">\n    <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Load older activity</button>\n  </div>\n</section>",
      "href": "https://bare.style/templates#activity-timeline",
      "preview": "https://bare.style/preview/activity-timeline.html"
    },
    {
      "id": "analytics-dashboard",
      "title": "Analytics dashboard",
      "description": "A board of four tiles whose 24h, 7d and 30d switch re-renders all of them: a time series, a ranking, a donut and a stacked bar.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "dashboard",
        "chart",
        "data",
        "metrics",
        "full-page"
      ],
      "links": [
        "src/chart/dashboard.css",
        "src/chart/frame.css",
        "src/chart/line.css",
        "src/chart/gridlines.css",
        "src/chart/axis.css",
        "src/chart/mark.css",
        "src/chart/tooltip.css",
        "src/chart/crosshair.css",
        "src/chart/data-table.css",
        "src/chart/bar.css",
        "src/chart/donut.css",
        "src/chart/stacked-bar.css",
        "src/layout/container.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [
        "src/behaviour/chart-interact.js"
      ],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-bar-chart",
        "bs-bar-chart__bar",
        "bs-bar-chart__head",
        "bs-bar-chart__label",
        "bs-bar-chart__plot",
        "bs-bar-chart__row",
        "bs-bar-chart__scale",
        "bs-bar-chart__title",
        "bs-bar-chart__track",
        "bs-bar-chart__value",
        "bs-chart",
        "bs-chart-axis",
        "bs-chart-axis--edge",
        "bs-chart-axis__label",
        "bs-chart-axis__tick",
        "bs-chart-crosshair",
        "bs-chart-crosshair--dashed",
        "bs-chart-crosshair--x-only",
        "bs-chart-crosshair__x",
        "bs-chart-crosshair__y",
        "bs-chart-data",
        "bs-chart-data--compact",
        "bs-chart-data__caption",
        "bs-chart-grid",
        "bs-chart-line",
        "bs-chart-line__series",
        "bs-chart-line__svg",
        "bs-chart-mark",
        "bs-chart-mark--point",
        "bs-chart-mark__value",
        "bs-chart-marks",
        "bs-chart-marks--overlay",
        "bs-chart-tip",
        "bs-chart-tip__key",
        "bs-chart-tip__row",
        "bs-chart-tip__rows",
        "bs-chart-tip__title",
        "bs-chart-tip__value",
        "bs-chart__head",
        "bs-chart__meta",
        "bs-chart__plot",
        "bs-chart__readout",
        "bs-chart__title",
        "bs-dash",
        "bs-dash__bar",
        "bs-dash__delta",
        "bs-dash__delta--bad",
        "bs-dash__delta--down",
        "bs-dash__delta--good",
        "bs-dash__delta-base",
        "bs-dash__delta-mark",
        "bs-dash__figure",
        "bs-dash__grid",
        "bs-dash__heading",
        "bs-dash__period",
        "bs-dash__period-option",
        "bs-dash__tile",
        "bs-dash__tile--full",
        "bs-dash__tile--wide",
        "bs-dash__tile-body",
        "bs-dash__tile-head",
        "bs-dash__tile-note",
        "bs-dash__tile-title",
        "bs-donut",
        "bs-donut__centre",
        "bs-donut__dial",
        "bs-donut__item",
        "bs-donut__legend",
        "bs-donut__name",
        "bs-donut__ring",
        "bs-donut__swatch",
        "bs-donut__total",
        "bs-donut__unit",
        "bs-donut__value",
        "bs-py-8",
        "bs-stacked-bar",
        "bs-stacked-bar--rows",
        "bs-stacked-bar__head",
        "bs-stacked-bar__item",
        "bs-stacked-bar__label",
        "bs-stacked-bar__legend",
        "bs-stacked-bar__name",
        "bs-stacked-bar__part",
        "bs-stacked-bar__row",
        "bs-stacked-bar__swatch",
        "bs-stacked-bar__title",
        "bs-stacked-bar__total",
        "bs-stacked-bar__track",
        "bs-stacked-bar__value",
        "bs-wrap"
      ],
      "html": "<!-- bs-dash is a board, not a page: it owns the tile rhythm and nothing else, so the gutter and the\n     block padding come from the container it is dropped into. Without one the board bleeds to the\n     viewport edge on every side and the heading sits against the top of the window. -->\n<main class=\"bs-wrap bs-py-8\" id=\"main\">\n  <div class=\"bs-dash\">\n    <div class=\"bs-dash__bar\">\n      <h1 class=\"bs-dash__heading\">Traffic</h1>\n      <!-- The pressed state is server-rendered, so the group reads correctly with the behaviour\n           module absent, and aria-controls names the region it re-renders so it also announces what\n           it governs. What the module adds is one tab stop with arrows inside it, and the swap. -->\n      <div class=\"bs-dash__period\" role=\"group\" data-bs-period aria-label=\"Period\" aria-controls=\"board\">\n        <button type=\"button\" class=\"bs-dash__period-option\" data-bs-period-option data-bs-period-value=\"24h\" aria-pressed=\"false\">24h</button>\n        <button type=\"button\" class=\"bs-dash__period-option\" data-bs-period-option data-bs-period-value=\"7d\" aria-pressed=\"true\">7d</button>\n        <button type=\"button\" class=\"bs-dash__period-option\" data-bs-period-option data-bs-period-value=\"30d\" aria-pressed=\"false\">30d</button>\n      </div>\n    </div>\n\n    <!-- The whole board is the panel, because a period that changed one tile and left three showing\n         last week would be worse than a period that changed nothing: the reader has no way to tell\n         which of the four is answering the question they asked. The 7 day range is written out\n         because it is the one the server rendered; the other two are templates, which draw nothing\n         at all with the module blocked, so a board with no script is a correct 7 day board. -->\n    <div class=\"bs-dash__grid\" id=\"board\" data-bs-period-panel>\n      <section class=\"bs-dash__tile bs-dash__tile--wide\" aria-labelledby=\"tile-sessions\">\n        <div class=\"bs-dash__tile-head\">\n          <h2 class=\"bs-dash__tile-title\" id=\"tile-sessions\">Sessions</h2>\n          <span class=\"bs-dash__tile-note\">vs previous 7 days</span>\n        </div>\n        <p class=\"bs-dash__figure\">48,600</p>\n        <!-- Rising is the arrow's resting direction, so there is no --up modifier: --down and --flat\n             turn it, and --good and --bad say whether the movement is welcome. -->\n        <p class=\"bs-dash__delta bs-dash__delta--good\">\n          <svg class=\"bs-dash__delta-mark\" viewBox=\"0 0 12 12\" aria-hidden=\"true\" focusable=\"false\">\n            <path d=\"M6 2 10 8H2Z\" fill=\"currentColor\" />\n          </svg>\n          12.5% up\n          <span class=\"bs-dash__delta-base\">from 43,200</span>\n        </p>\n        <div class=\"bs-dash__tile-body\">\n          <figure class=\"bs-chart\" data-bs-chart>\n            <figcaption class=\"bs-chart__head\">\n              <span class=\"bs-chart__title\">Sessions per day</span>\n              <!-- The reading, in the page rather than in the tooltip. A tooltip lasts one gesture; this\n                   is what a keyboard, a screen reader, a search and a print can all still find. -->\n              <output class=\"bs-chart__readout\" data-bs-chart-readout>Sun: 8,240</output>\n              <span class=\"bs-chart__meta\">last 7 days, one sample per day</span>\n            </figcaption>\n\n            <!-- data-bs-chart-track makes the whole plot the target. Without it the reading is only\n                 reachable by landing on a mark ten pixels across, which is no target at all on a phone. -->\n            <div class=\"bs-chart__plot\" data-bs-plot data-bs-chart-track style=\"--bs-chart-height: 10rem\">\n              <div class=\"bs-chart-line\" style=\"--bs-chart-line-height: 100%\">\n                <div class=\"bs-chart-grid\" style=\"--bs-chart-grid-rows: 4\" aria-hidden=\"true\"></div>\n                <!-- The picture points at the table, so a reader who lands on the plot is told where\n                     the numbers are instead of being left with a label and no way to the detail. -->\n                <svg\n                  class=\"bs-chart-line__svg\"\n                  viewBox=\"0 0 100 100\"\n                  preserveAspectRatio=\"none\"\n                  role=\"img\"\n                  aria-describedby=\"sessions-data\"\n                  aria-label=\"Sessions per day, 5,910 to 8,240 over 7 days, ending at 8,240\"\n                >\n                  <polyline class=\"bs-chart-line__series\" data-bs-series=\"1\" points=\"0,38.6 16.7,33.8 33.3,40.9 50,28.2 66.7,32.1 83.3,22.8 100,17.6\" />\n                  <polyline class=\"bs-chart-line__series\" data-bs-series=\"2\" points=\"0,69.8 16.7,67.6 33.3,71.2 50,62.4 66.7,65.9 83.3,58.2 100,54.6\" />\n                </svg>\n              </div>\n\n              <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Sessions\">\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Mon\" data-bs-value=\"6,140\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.614\"><span class=\"bs-chart-mark__value\">Mon 6,140</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Tue\" data-bs-value=\"6,620\" style=\"--bs-chart-mark-x: 0.1667; --bs-chart-mark-y: 0.662\"><span class=\"bs-chart-mark__value\">Tue 6,620</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Wed\" data-bs-value=\"5,910\" style=\"--bs-chart-mark-x: 0.3333; --bs-chart-mark-y: 0.591\"><span class=\"bs-chart-mark__value\">Wed 5,910</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Thu\" data-bs-value=\"7,180\" style=\"--bs-chart-mark-x: 0.5; --bs-chart-mark-y: 0.718\"><span class=\"bs-chart-mark__value\">Thu 7,180</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Fri\" data-bs-value=\"6,790\" style=\"--bs-chart-mark-x: 0.6667; --bs-chart-mark-y: 0.679\"><span class=\"bs-chart-mark__value\">Fri 6,790</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Sat\" data-bs-value=\"7,720\" style=\"--bs-chart-mark-x: 0.8333; --bs-chart-mark-y: 0.772\"><span class=\"bs-chart-mark__value\">Sat 7,720</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Sun\" data-bs-value=\"8,240\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.824\"><span class=\"bs-chart-mark__value\">Sun 8,240</span></li>\n              </ol>\n\n              <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Signed in\">\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Mon\" data-bs-value=\"3,020\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.302\"><span class=\"bs-chart-mark__value\">Mon 3,020</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Tue\" data-bs-value=\"3,240\" style=\"--bs-chart-mark-x: 0.1667; --bs-chart-mark-y: 0.324\"><span class=\"bs-chart-mark__value\">Tue 3,240</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Wed\" data-bs-value=\"2,880\" style=\"--bs-chart-mark-x: 0.3333; --bs-chart-mark-y: 0.288\"><span class=\"bs-chart-mark__value\">Wed 2,880</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Thu\" data-bs-value=\"3,760\" style=\"--bs-chart-mark-x: 0.5; --bs-chart-mark-y: 0.376\"><span class=\"bs-chart-mark__value\">Thu 3,760</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Fri\" data-bs-value=\"3,410\" style=\"--bs-chart-mark-x: 0.6667; --bs-chart-mark-y: 0.341\"><span class=\"bs-chart-mark__value\">Fri 3,410</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Sat\" data-bs-value=\"4,180\" style=\"--bs-chart-mark-x: 0.8333; --bs-chart-mark-y: 0.418\"><span class=\"bs-chart-mark__value\">Sat 4,180</span></li>\n            <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Sun\" data-bs-value=\"4,540\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.454\"><span class=\"bs-chart-mark__value\">Sun 4,540</span></li>\n              </ol>\n\n              <div class=\"bs-chart-crosshair bs-chart-crosshair--x-only bs-chart-crosshair--dashed\" data-bs-chart-crosshair aria-hidden=\"true\" hidden>\n                <span class=\"bs-chart-crosshair__x\"></span>\n                <span class=\"bs-chart-crosshair__y\"></span>\n              </div>\n\n              <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden>\n                <span class=\"bs-chart-tip__title\" data-bs-tip-title>Sun</span>\n                <ul class=\"bs-chart-tip__rows\">\n                  <li class=\"bs-chart-tip__row\" data-bs-series=\"1\">\n                    <span class=\"bs-chart-tip__key\" data-bs-tip-key>Sessions</span>\n                    <span class=\"bs-chart-tip__value\" data-bs-tip-value>8,240</span>\n                  </li>\n                </ul>\n              </div>\n            </div>\n\n            <ul class=\"bs-chart-axis bs-chart-axis--edge\" data-bs-axis=\"x\" style=\"--bs-chart-axis-ticks: 7\" aria-hidden=\"true\">\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Mon</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Tue</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Wed</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Thu</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Fri</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Sat</span></li>\n          <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Sun</span></li>\n            </ul>\n\n            <!-- The numbers stay on the page rather than being clipped out of view. A figure nobody\n                 can see is a figure nobody checks, and this is the only reading of the plot that can\n                 be selected, searched, translated or pasted into a spreadsheet. -->\n            <table class=\"bs-chart-data bs-chart-data--compact\" id=\"sessions-data\">\n              <caption class=\"bs-chart-data__caption\">Sessions and signed-in sessions, last 7 days, one sample per day</caption>\n              <thead>\n                <tr><th scope=\"col\">Day</th><th scope=\"col\">Sessions</th><th scope=\"col\">Signed in</th></tr>\n              </thead>\n              <tbody>\n              <tr><th scope=\"row\">Mon</th><td>6,140</td><td>3,020</td></tr>\n              <tr><th scope=\"row\">Tue</th><td>6,620</td><td>3,240</td></tr>\n              <tr><th scope=\"row\">Wed</th><td>5,910</td><td>2,880</td></tr>\n              <tr><th scope=\"row\">Thu</th><td>7,180</td><td>3,760</td></tr>\n              <tr><th scope=\"row\">Fri</th><td>6,790</td><td>3,410</td></tr>\n              <tr><th scope=\"row\">Sat</th><td>7,720</td><td>4,180</td></tr>\n              <tr><th scope=\"row\">Sun</th><td>8,240</td><td>4,540</td></tr>\n              </tbody>\n            </table>\n          </figure>\n        </div>\n      </section>\n\n      <section class=\"bs-dash__tile\" aria-labelledby=\"tile-regions\">\n        <div class=\"bs-dash__tile-head\">\n          <h2 class=\"bs-dash__tile-title\" id=\"tile-regions\">Sessions by region</h2>\n          <span class=\"bs-dash__tile-note\">last 7 days</span>\n        </div>\n        <div class=\"bs-dash__tile-body\">\n          <!-- A ranking answers a pointer like any other chart. Every row already prints its name and\n               its number, so the overlay carries the one fact the row does not: the share. \"y\" because\n               the rows are stacked and reading by nearest in two dimensions would answer with the wrong\n               row as soon as the pointer sat at the end of a long bar. -->\n          <figure class=\"bs-bar-chart\" data-bs-chart>\n            <figcaption class=\"bs-bar-chart__head\">\n              <span class=\"bs-bar-chart__title\">Ranked by volume</span>\n              <output class=\"bs-bar-chart__scale\" data-bs-chart-readout>0 to 20,000</output>\n            </figcaption>\n            <div class=\"bs-bar-chart__plot\" data-bs-chart-track=\"y\">\n          <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"eu-west\" data-bs-value=\"19,100 sessions\" data-bs-key=\"39% of the period\">\n            <span class=\"bs-bar-chart__label\">eu-west</span>\n            <div class=\"bs-bar-chart__track\">\n              <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.95\"></div>\n            </div>\n            <span class=\"bs-bar-chart__value\">19,100</span>\n          </div>\n          <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"us-east\" data-bs-value=\"14,300 sessions\" data-bs-key=\"29% of the period\">\n            <span class=\"bs-bar-chart__label\">us-east</span>\n            <div class=\"bs-bar-chart__track\">\n              <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.71\"></div>\n            </div>\n            <span class=\"bs-bar-chart__value\">14,300</span>\n          </div>\n          <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"ap-south\" data-bs-value=\"8,900 sessions\" data-bs-key=\"18% of the period\">\n            <span class=\"bs-bar-chart__label\">ap-south</span>\n            <div class=\"bs-bar-chart__track\">\n              <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.45\"></div>\n            </div>\n            <span class=\"bs-bar-chart__value\">8,900</span>\n          </div>\n          <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"sa-east\" data-bs-value=\"4,300 sessions\" data-bs-key=\"9% of the period\">\n            <span class=\"bs-bar-chart__label\">sa-east</span>\n            <div class=\"bs-bar-chart__track\">\n              <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.21\"></div>\n            </div>\n            <span class=\"bs-bar-chart__value\">4,300</span>\n          </div>\n          <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"af-north\" data-bs-value=\"2,000 sessions\" data-bs-key=\"4% of the period\">\n            <span class=\"bs-bar-chart__label\">af-north</span>\n            <div class=\"bs-bar-chart__track\">\n              <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.1\"></div>\n            </div>\n            <span class=\"bs-bar-chart__value\">2,000</span>\n          </div>\n            </div>\n\n            <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden style=\"--bs-chart-tip-max: 20rem\">\n              <span class=\"bs-chart-tip__title\" data-bs-tip-title>eu-west</span>\n              <ul class=\"bs-chart-tip__rows\">\n                <li class=\"bs-chart-tip__row\">\n                  <span class=\"bs-chart-tip__key\" data-bs-tip-key>39% of the period</span>\n                  <span class=\"bs-chart-tip__value\" data-bs-tip-value>19,100 sessions</span>\n                </li>\n              </ul>\n            </div>\n          </figure>\n        </div>\n      </section>\n\n      <section class=\"bs-dash__tile\" aria-labelledby=\"tile-source\">\n        <div class=\"bs-dash__tile-head\">\n          <h2 class=\"bs-dash__tile-title\" id=\"tile-source\">Where sessions came from</h2>\n          <span class=\"bs-dash__tile-note\">last 7 days</span>\n        </div>\n        <div class=\"bs-dash__tile-body\">\n          <!-- The legend is the chart. The ring is a second rendering of the same numbers, so it is\n               hidden from the accessibility tree rather than labelled twice. -->\n          <figure class=\"bs-donut\">\n            <div class=\"bs-donut__dial\">\n              <div class=\"bs-donut__ring\" aria-hidden=\"true\" style=\"--bs-donut-1: 0.48; --bs-donut-2: 0.31; --bs-donut-3: 0.14; --bs-donut-4: 0.07\"></div>\n              <div class=\"bs-donut__centre\">\n                <span class=\"bs-donut__total\">48,600</span>\n                <span class=\"bs-donut__unit\">sessions</span>\n              </div>\n            </div>\n            <ol class=\"bs-donut__legend\">\n          <li class=\"bs-donut__item\">\n            <span class=\"bs-donut__swatch\"></span>\n            <span class=\"bs-donut__name\">Direct</span>\n            <span class=\"bs-donut__value\">48%</span>\n          </li>\n          <li class=\"bs-donut__item\">\n            <span class=\"bs-donut__swatch\"></span>\n            <span class=\"bs-donut__name\">Search</span>\n            <span class=\"bs-donut__value\">31%</span>\n          </li>\n          <li class=\"bs-donut__item\">\n            <span class=\"bs-donut__swatch\"></span>\n            <span class=\"bs-donut__name\">Referral</span>\n            <span class=\"bs-donut__value\">14%</span>\n          </li>\n          <li class=\"bs-donut__item\">\n            <span class=\"bs-donut__swatch\"></span>\n            <span class=\"bs-donut__name\">Email</span>\n            <span class=\"bs-donut__value\">7%</span>\n          </li>\n            </ol>\n          </figure>\n        </div>\n      </section>\n\n      <!-- --wide is two of two columns at 48em and two of FOUR at 80em, which leaves half the second\n           row empty on a wide board. --full is the one that spans the row wherever the row is. -->\n      <section class=\"bs-dash__tile bs-dash__tile--wide bs-dash__tile--full\" aria-labelledby=\"tile-devices\">\n        <div class=\"bs-dash__tile-head\">\n          <h2 class=\"bs-dash__tile-title\" id=\"tile-devices\">Sessions by device</h2>\n          <span class=\"bs-dash__tile-note\">one row per day</span>\n        </div>\n        <div class=\"bs-dash__tile-body\">\n          <figure class=\"bs-stacked-bar bs-stacked-bar--rows\">\n            <figcaption class=\"bs-stacked-bar__head\">\n              <span class=\"bs-stacked-bar__title\">Phone, tablet and desktop</span>\n              <span class=\"bs-stacked-bar__total\">48,600</span>\n            </figcaption>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Mon</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3010\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 680\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2450\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">6,140</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Tue</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3250\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 730\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2640\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">6,620</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Wed</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2900\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 650\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2360\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">5,910</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Thu</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3520\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 790\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2870\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">7,180</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Fri</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3330\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 750\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 2710\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">6,790</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Sat</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3780\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 850\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3090\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">7,720</span>\n        </div>\n        <div class=\"bs-stacked-bar__row\">\n          <span class=\"bs-stacked-bar__label\">Sun</span>\n          <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 4040\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 910\"></div>\n            <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3290\"></div>\n          </div>\n          <span class=\"bs-stacked-bar__value\">8,240</span>\n        </div>\n            <ol class=\"bs-stacked-bar__legend\">\n          <li class=\"bs-stacked-bar__item\">\n            <span class=\"bs-stacked-bar__swatch\"></span>\n            <span class=\"bs-stacked-bar__name\">Phone</span>\n            <span class=\"bs-stacked-bar__value\">23,830</span>\n          </li>\n          <li class=\"bs-stacked-bar__item\">\n            <span class=\"bs-stacked-bar__swatch\"></span>\n            <span class=\"bs-stacked-bar__name\">Tablet</span>\n            <span class=\"bs-stacked-bar__value\">5,360</span>\n          </li>\n          <li class=\"bs-stacked-bar__item\">\n            <span class=\"bs-stacked-bar__swatch\"></span>\n            <span class=\"bs-stacked-bar__name\">Desktop</span>\n            <span class=\"bs-stacked-bar__value\">19,410</span>\n          </li>\n            </ol>\n          </figure>\n        </div>\n      </section>\n\n      <template data-bs-period-data=\"24h\">\n        <section class=\"bs-dash__tile bs-dash__tile--wide\" aria-labelledby=\"tile-sessions\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-sessions\">Sessions</h2>\n            <span class=\"bs-dash__tile-note\">vs previous 24 hours</span>\n          </div>\n          <p class=\"bs-dash__figure\">5,160</p>\n          <!-- Rising is the arrow's resting direction, so there is no --up modifier: --down and --flat\n               turn it, and --good and --bad say whether the movement is welcome. -->\n          <p class=\"bs-dash__delta bs-dash__delta--good\">\n            <svg class=\"bs-dash__delta-mark\" viewBox=\"0 0 12 12\" aria-hidden=\"true\" focusable=\"false\">\n              <path d=\"M6 2 10 8H2Z\" fill=\"currentColor\" />\n            </svg>\n            4.0% up\n            <span class=\"bs-dash__delta-base\">from 4,960</span>\n          </p>\n          <div class=\"bs-dash__tile-body\">\n            <figure class=\"bs-chart\" data-bs-chart>\n              <figcaption class=\"bs-chart__head\">\n                <span class=\"bs-chart__title\">Sessions per day</span>\n                <!-- The reading, in the page rather than in the tooltip. A tooltip lasts one gesture; this\n                     is what a keyboard, a screen reader, a search and a print can all still find. -->\n                <output class=\"bs-chart__readout\" data-bs-chart-readout>20:00: 960</output>\n                <span class=\"bs-chart__meta\">last 24 hours, 4 hour samples</span>\n              </figcaption>\n\n              <!-- data-bs-chart-track makes the whole plot the target. Without it the reading is only\n                   reachable by landing on a mark ten pixels across, which is no target at all on a phone. -->\n              <div class=\"bs-chart__plot\" data-bs-plot data-bs-chart-track style=\"--bs-chart-height: 10rem\">\n                <div class=\"bs-chart-line\" style=\"--bs-chart-line-height: 100%\">\n                  <div class=\"bs-chart-grid\" style=\"--bs-chart-grid-rows: 4\" aria-hidden=\"true\"></div>\n                  <!-- The picture points at the table, so a reader who lands on the plot is told where\n                       the numbers are instead of being left with a label and no way to the detail. -->\n                  <svg\n                    class=\"bs-chart-line__svg\"\n                    viewBox=\"0 0 100 100\"\n                    preserveAspectRatio=\"none\"\n                    role=\"img\"\n                    aria-describedby=\"sessions-data\"\n                    aria-label=\"Sessions per day, 520 to 1,140 over 24 hours, ending at 960\"\n                  >\n                    <polyline class=\"bs-chart-line__series\" data-bs-series=\"1\" points=\"0,46.7 20,56.7 40,26.7 60,5 80,15 100,20\" />\n                    <polyline class=\"bs-chart-line__series\" data-bs-series=\"2\" points=\"0,75 20,80 40,64.2 60,50.8 80,56.7 100,60.8\" />\n                  </svg>\n                </div>\n\n                <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Sessions\">\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"00:00\" data-bs-value=\"640\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.5333\"><span class=\"bs-chart-mark__value\">00:00 640</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"04:00\" data-bs-value=\"520\" style=\"--bs-chart-mark-x: 0.2; --bs-chart-mark-y: 0.4333\"><span class=\"bs-chart-mark__value\">04:00 520</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"08:00\" data-bs-value=\"880\" style=\"--bs-chart-mark-x: 0.4; --bs-chart-mark-y: 0.7333\"><span class=\"bs-chart-mark__value\">08:00 880</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"12:00\" data-bs-value=\"1,140\" style=\"--bs-chart-mark-x: 0.6; --bs-chart-mark-y: 0.95\"><span class=\"bs-chart-mark__value\">12:00 1,140</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"16:00\" data-bs-value=\"1,020\" style=\"--bs-chart-mark-x: 0.8; --bs-chart-mark-y: 0.85\"><span class=\"bs-chart-mark__value\">16:00 1,020</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"20:00\" data-bs-value=\"960\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.8\"><span class=\"bs-chart-mark__value\">20:00 960</span></li>\n                </ol>\n\n                <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Signed in\">\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"00:00\" data-bs-value=\"300\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.25\"><span class=\"bs-chart-mark__value\">00:00 300</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"04:00\" data-bs-value=\"240\" style=\"--bs-chart-mark-x: 0.2; --bs-chart-mark-y: 0.2\"><span class=\"bs-chart-mark__value\">04:00 240</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"08:00\" data-bs-value=\"430\" style=\"--bs-chart-mark-x: 0.4; --bs-chart-mark-y: 0.3583\"><span class=\"bs-chart-mark__value\">08:00 430</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"12:00\" data-bs-value=\"590\" style=\"--bs-chart-mark-x: 0.6; --bs-chart-mark-y: 0.4917\"><span class=\"bs-chart-mark__value\">12:00 590</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"16:00\" data-bs-value=\"520\" style=\"--bs-chart-mark-x: 0.8; --bs-chart-mark-y: 0.4333\"><span class=\"bs-chart-mark__value\">16:00 520</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"20:00\" data-bs-value=\"470\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.3917\"><span class=\"bs-chart-mark__value\">20:00 470</span></li>\n                </ol>\n\n                <div class=\"bs-chart-crosshair bs-chart-crosshair--x-only bs-chart-crosshair--dashed\" data-bs-chart-crosshair aria-hidden=\"true\" hidden>\n                  <span class=\"bs-chart-crosshair__x\"></span>\n                  <span class=\"bs-chart-crosshair__y\"></span>\n                </div>\n\n                <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden>\n                  <span class=\"bs-chart-tip__title\" data-bs-tip-title>20:00</span>\n                  <ul class=\"bs-chart-tip__rows\">\n                    <li class=\"bs-chart-tip__row\" data-bs-series=\"1\">\n                      <span class=\"bs-chart-tip__key\" data-bs-tip-key>Sessions</span>\n                      <span class=\"bs-chart-tip__value\" data-bs-tip-value>960</span>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n\n              <ul class=\"bs-chart-axis bs-chart-axis--edge\" data-bs-axis=\"x\" style=\"--bs-chart-axis-ticks: 6\" aria-hidden=\"true\">\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">00:00</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">04:00</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">08:00</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">12:00</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">16:00</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">20:00</span></li>\n              </ul>\n\n              <!-- The numbers stay on the page rather than being clipped out of view. A figure nobody\n                   can see is a figure nobody checks, and this is the only reading of the plot that can\n                   be selected, searched, translated or pasted into a spreadsheet. -->\n              <table class=\"bs-chart-data bs-chart-data--compact\" id=\"sessions-data\">\n                <caption class=\"bs-chart-data__caption\">Sessions and signed-in sessions, last 24 hours, 4 hour samples</caption>\n                <thead>\n                  <tr><th scope=\"col\">Hour</th><th scope=\"col\">Sessions</th><th scope=\"col\">Signed in</th></tr>\n                </thead>\n                <tbody>\n                <tr><th scope=\"row\">00:00</th><td>640</td><td>300</td></tr>\n                <tr><th scope=\"row\">04:00</th><td>520</td><td>240</td></tr>\n                <tr><th scope=\"row\">08:00</th><td>880</td><td>430</td></tr>\n                <tr><th scope=\"row\">12:00</th><td>1,140</td><td>590</td></tr>\n                <tr><th scope=\"row\">16:00</th><td>1,020</td><td>520</td></tr>\n                <tr><th scope=\"row\">20:00</th><td>960</td><td>470</td></tr>\n                </tbody>\n              </table>\n            </figure>\n          </div>\n        </section>\n\n        <section class=\"bs-dash__tile\" aria-labelledby=\"tile-regions\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-regions\">Sessions by region</h2>\n            <span class=\"bs-dash__tile-note\">last 24 hours</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <!-- A ranking answers a pointer like any other chart. Every row already prints its name and\n                 its number, so the overlay carries the one fact the row does not: the share. \"y\" because\n                 the rows are stacked and reading by nearest in two dimensions would answer with the wrong\n                 row as soon as the pointer sat at the end of a long bar. -->\n            <figure class=\"bs-bar-chart\" data-bs-chart>\n              <figcaption class=\"bs-bar-chart__head\">\n                <span class=\"bs-bar-chart__title\">Ranked by volume</span>\n                <output class=\"bs-bar-chart__scale\" data-bs-chart-readout>0 to 2,500</output>\n              </figcaption>\n              <div class=\"bs-bar-chart__plot\" data-bs-chart-track=\"y\">\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"eu-west\" data-bs-value=\"2,030 sessions\" data-bs-key=\"39% of the period\">\n              <span class=\"bs-bar-chart__label\">eu-west</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.81\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">2,030</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"us-east\" data-bs-value=\"1,450 sessions\" data-bs-key=\"28% of the period\">\n              <span class=\"bs-bar-chart__label\">us-east</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.58\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">1,450</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"ap-south\" data-bs-value=\"930 sessions\" data-bs-key=\"18% of the period\">\n              <span class=\"bs-bar-chart__label\">ap-south</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.37\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">930</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"sa-east\" data-bs-value=\"480 sessions\" data-bs-key=\"9% of the period\">\n              <span class=\"bs-bar-chart__label\">sa-east</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.19\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">480</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"af-north\" data-bs-value=\"270 sessions\" data-bs-key=\"5% of the period\">\n              <span class=\"bs-bar-chart__label\">af-north</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.11\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">270</span>\n            </div>\n              </div>\n\n              <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden style=\"--bs-chart-tip-max: 20rem\">\n                <span class=\"bs-chart-tip__title\" data-bs-tip-title>eu-west</span>\n                <ul class=\"bs-chart-tip__rows\">\n                  <li class=\"bs-chart-tip__row\">\n                    <span class=\"bs-chart-tip__key\" data-bs-tip-key>39% of the period</span>\n                    <span class=\"bs-chart-tip__value\" data-bs-tip-value>2,030 sessions</span>\n                  </li>\n                </ul>\n              </div>\n            </figure>\n          </div>\n        </section>\n\n        <section class=\"bs-dash__tile\" aria-labelledby=\"tile-source\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-source\">Where sessions came from</h2>\n            <span class=\"bs-dash__tile-note\">last 24 hours</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <!-- The legend is the chart. The ring is a second rendering of the same numbers, so it is\n                 hidden from the accessibility tree rather than labelled twice. -->\n            <figure class=\"bs-donut\">\n              <div class=\"bs-donut__dial\">\n                <div class=\"bs-donut__ring\" aria-hidden=\"true\" style=\"--bs-donut-1: 0.44; --bs-donut-2: 0.33; --bs-donut-3: 0.15; --bs-donut-4: 0.08\"></div>\n                <div class=\"bs-donut__centre\">\n                  <span class=\"bs-donut__total\">5,160</span>\n                  <span class=\"bs-donut__unit\">sessions</span>\n                </div>\n              </div>\n              <ol class=\"bs-donut__legend\">\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Direct</span>\n              <span class=\"bs-donut__value\">44%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Search</span>\n              <span class=\"bs-donut__value\">33%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Referral</span>\n              <span class=\"bs-donut__value\">15%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Email</span>\n              <span class=\"bs-donut__value\">8%</span>\n            </li>\n              </ol>\n            </figure>\n          </div>\n        </section>\n\n        <!-- --wide is two of two columns at 48em and two of FOUR at 80em, which leaves half the second\n             row empty on a wide board. --full is the one that spans the row wherever the row is. -->\n        <section class=\"bs-dash__tile bs-dash__tile--wide bs-dash__tile--full\" aria-labelledby=\"tile-devices\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-devices\">Sessions by device</h2>\n            <span class=\"bs-dash__tile-note\">one row per six hours</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <figure class=\"bs-stacked-bar bs-stacked-bar--rows\">\n              <figcaption class=\"bs-stacked-bar__head\">\n                <span class=\"bs-stacked-bar__title\">Phone, tablet and desktop</span>\n                <span class=\"bs-stacked-bar__total\">5,160</span>\n              </figcaption>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">00-06</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 550\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 120\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 410\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">1,080</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">06-12</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 700\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 160\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 520\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">1,380</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">12-18</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 800\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 180\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 600\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">1,580</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">18-24</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 570\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 130\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 420\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">1,120</span>\n          </div>\n              <ol class=\"bs-stacked-bar__legend\">\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Phone</span>\n              <span class=\"bs-stacked-bar__value\">2,620</span>\n            </li>\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Tablet</span>\n              <span class=\"bs-stacked-bar__value\">590</span>\n            </li>\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Desktop</span>\n              <span class=\"bs-stacked-bar__value\">1,950</span>\n            </li>\n              </ol>\n            </figure>\n          </div>\n        </section>\n      </template>\n\n      <template data-bs-period-data=\"30d\">\n        <section class=\"bs-dash__tile bs-dash__tile--wide\" aria-labelledby=\"tile-sessions\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-sessions\">Sessions</h2>\n            <span class=\"bs-dash__tile-note\">vs previous 30 days</span>\n          </div>\n          <p class=\"bs-dash__figure\">196,400</p>\n          <!-- Rising is the arrow's resting direction, so there is no --up modifier: --down and --flat\n               turn it, and --good and --bad say whether the movement is welcome. -->\n          <p class=\"bs-dash__delta bs-dash__delta--down bs-dash__delta--bad\">\n            <svg class=\"bs-dash__delta-mark\" viewBox=\"0 0 12 12\" aria-hidden=\"true\" focusable=\"false\">\n              <path d=\"M6 2 10 8H2Z\" fill=\"currentColor\" />\n            </svg>\n            3.8% down\n            <span class=\"bs-dash__delta-base\">from 204,200</span>\n          </p>\n          <div class=\"bs-dash__tile-body\">\n            <figure class=\"bs-chart\" data-bs-chart>\n              <figcaption class=\"bs-chart__head\">\n                <span class=\"bs-chart__title\">Sessions per day</span>\n                <!-- The reading, in the page rather than in the tooltip. A tooltip lasts one gesture; this\n                     is what a keyboard, a screen reader, a search and a print can all still find. -->\n                <output class=\"bs-chart__readout\" data-bs-chart-readout>May 06: 33,800</output>\n                <span class=\"bs-chart__meta\">last 30 days, 6 day samples</span>\n              </figcaption>\n\n              <!-- data-bs-chart-track makes the whole plot the target. Without it the reading is only\n                   reachable by landing on a mark ten pixels across, which is no target at all on a phone. -->\n              <div class=\"bs-chart__plot\" data-bs-plot data-bs-chart-track style=\"--bs-chart-height: 10rem\">\n                <div class=\"bs-chart-line\" style=\"--bs-chart-line-height: 100%\">\n                  <div class=\"bs-chart-grid\" style=\"--bs-chart-grid-rows: 4\" aria-hidden=\"true\"></div>\n                  <!-- The picture points at the table, so a reader who lands on the plot is told where\n                       the numbers are instead of being left with a label and no way to the detail. -->\n                  <svg\n                    class=\"bs-chart-line__svg\"\n                    viewBox=\"0 0 100 100\"\n                    preserveAspectRatio=\"none\"\n                    role=\"img\"\n                    aria-describedby=\"sessions-data\"\n                    aria-label=\"Sessions per day, 30,100 to 34,600 over 30 days, ending at 33,800\"\n                  >\n                    <polyline class=\"bs-chart-line__series\" data-bs-series=\"1\" points=\"0,24.8 20,18 40,22 60,13.5 80,15.3 100,15.5\" />\n                    <polyline class=\"bs-chart-line__series\" data-bs-series=\"2\" points=\"0,64.5 20,61 40,62.8 60,58 80,59.8 100,59\" />\n                  </svg>\n                </div>\n\n                <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Sessions\">\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Apr 06\" data-bs-value=\"30,100\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.7525\"><span class=\"bs-chart-mark__value\">Apr 06 30,100</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Apr 12\" data-bs-value=\"32,800\" style=\"--bs-chart-mark-x: 0.2; --bs-chart-mark-y: 0.82\"><span class=\"bs-chart-mark__value\">Apr 12 32,800</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Apr 18\" data-bs-value=\"31,200\" style=\"--bs-chart-mark-x: 0.4; --bs-chart-mark-y: 0.78\"><span class=\"bs-chart-mark__value\">Apr 18 31,200</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Apr 24\" data-bs-value=\"34,600\" style=\"--bs-chart-mark-x: 0.6; --bs-chart-mark-y: 0.865\"><span class=\"bs-chart-mark__value\">Apr 24 34,600</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"Apr 30\" data-bs-value=\"33,900\" style=\"--bs-chart-mark-x: 0.8; --bs-chart-mark-y: 0.8475\"><span class=\"bs-chart-mark__value\">Apr 30 33,900</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"1\" data-bs-point data-bs-key=\"Sessions\" data-bs-label=\"May 06\" data-bs-value=\"33,800\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.845\"><span class=\"bs-chart-mark__value\">May 06 33,800</span></li>\n                </ol>\n\n                <ol class=\"bs-chart-marks bs-chart-marks--overlay\" data-bs-points role=\"list\" aria-label=\"Signed in\">\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Apr 06\" data-bs-value=\"14,200\" style=\"--bs-chart-mark-x: 0; --bs-chart-mark-y: 0.355\"><span class=\"bs-chart-mark__value\">Apr 06 14,200</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Apr 12\" data-bs-value=\"15,600\" style=\"--bs-chart-mark-x: 0.2; --bs-chart-mark-y: 0.39\"><span class=\"bs-chart-mark__value\">Apr 12 15,600</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Apr 18\" data-bs-value=\"14,900\" style=\"--bs-chart-mark-x: 0.4; --bs-chart-mark-y: 0.3725\"><span class=\"bs-chart-mark__value\">Apr 18 14,900</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Apr 24\" data-bs-value=\"16,800\" style=\"--bs-chart-mark-x: 0.6; --bs-chart-mark-y: 0.42\"><span class=\"bs-chart-mark__value\">Apr 24 16,800</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"Apr 30\" data-bs-value=\"16,100\" style=\"--bs-chart-mark-x: 0.8; --bs-chart-mark-y: 0.4025\"><span class=\"bs-chart-mark__value\">Apr 30 16,100</span></li>\n              <li class=\"bs-chart-mark bs-chart-mark--point\" data-bs-series=\"2\" data-bs-point data-bs-key=\"Signed in\" data-bs-label=\"May 06\" data-bs-value=\"16,400\" style=\"--bs-chart-mark-x: 1; --bs-chart-mark-y: 0.41\"><span class=\"bs-chart-mark__value\">May 06 16,400</span></li>\n                </ol>\n\n                <div class=\"bs-chart-crosshair bs-chart-crosshair--x-only bs-chart-crosshair--dashed\" data-bs-chart-crosshair aria-hidden=\"true\" hidden>\n                  <span class=\"bs-chart-crosshair__x\"></span>\n                  <span class=\"bs-chart-crosshair__y\"></span>\n                </div>\n\n                <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden>\n                  <span class=\"bs-chart-tip__title\" data-bs-tip-title>May 06</span>\n                  <ul class=\"bs-chart-tip__rows\">\n                    <li class=\"bs-chart-tip__row\" data-bs-series=\"1\">\n                      <span class=\"bs-chart-tip__key\" data-bs-tip-key>Sessions</span>\n                      <span class=\"bs-chart-tip__value\" data-bs-tip-value>33,800</span>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n\n              <ul class=\"bs-chart-axis bs-chart-axis--edge\" data-bs-axis=\"x\" style=\"--bs-chart-axis-ticks: 6\" aria-hidden=\"true\">\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Apr 06</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Apr 12</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Apr 18</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Apr 24</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">Apr 30</span></li>\n            <li class=\"bs-chart-axis__tick\"><span class=\"bs-chart-axis__label\">May 06</span></li>\n              </ul>\n\n              <!-- The numbers stay on the page rather than being clipped out of view. A figure nobody\n                   can see is a figure nobody checks, and this is the only reading of the plot that can\n                   be selected, searched, translated or pasted into a spreadsheet. -->\n              <table class=\"bs-chart-data bs-chart-data--compact\" id=\"sessions-data\">\n                <caption class=\"bs-chart-data__caption\">Sessions and signed-in sessions, last 30 days, 6 day samples</caption>\n                <thead>\n                  <tr><th scope=\"col\">Period ending</th><th scope=\"col\">Sessions</th><th scope=\"col\">Signed in</th></tr>\n                </thead>\n                <tbody>\n                <tr><th scope=\"row\">Apr 06</th><td>30,100</td><td>14,200</td></tr>\n                <tr><th scope=\"row\">Apr 12</th><td>32,800</td><td>15,600</td></tr>\n                <tr><th scope=\"row\">Apr 18</th><td>31,200</td><td>14,900</td></tr>\n                <tr><th scope=\"row\">Apr 24</th><td>34,600</td><td>16,800</td></tr>\n                <tr><th scope=\"row\">Apr 30</th><td>33,900</td><td>16,100</td></tr>\n                <tr><th scope=\"row\">May 06</th><td>33,800</td><td>16,400</td></tr>\n                </tbody>\n              </table>\n            </figure>\n          </div>\n        </section>\n\n        <section class=\"bs-dash__tile\" aria-labelledby=\"tile-regions\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-regions\">Sessions by region</h2>\n            <span class=\"bs-dash__tile-note\">last 30 days</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <!-- A ranking answers a pointer like any other chart. Every row already prints its name and\n                 its number, so the overlay carries the one fact the row does not: the share. \"y\" because\n                 the rows are stacked and reading by nearest in two dimensions would answer with the wrong\n                 row as soon as the pointer sat at the end of a long bar. -->\n            <figure class=\"bs-bar-chart\" data-bs-chart>\n              <figcaption class=\"bs-bar-chart__head\">\n                <span class=\"bs-bar-chart__title\">Ranked by volume</span>\n                <output class=\"bs-bar-chart__scale\" data-bs-chart-readout>0 to 80,000</output>\n              </figcaption>\n              <div class=\"bs-bar-chart__plot\" data-bs-chart-track=\"y\">\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"eu-west\" data-bs-value=\"76,200 sessions\" data-bs-key=\"39% of the period\">\n              <span class=\"bs-bar-chart__label\">eu-west</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.95\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">76,200</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"us-east\" data-bs-value=\"56,900 sessions\" data-bs-key=\"29% of the period\">\n              <span class=\"bs-bar-chart__label\">us-east</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.71\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">56,900</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"ap-south\" data-bs-value=\"36,800 sessions\" data-bs-key=\"19% of the period\">\n              <span class=\"bs-bar-chart__label\">ap-south</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.46\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">36,800</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"sa-east\" data-bs-value=\"17,300 sessions\" data-bs-key=\"9% of the period\">\n              <span class=\"bs-bar-chart__label\">sa-east</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.22\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">17,300</span>\n            </div>\n            <div class=\"bs-bar-chart__row\" data-bs-point data-bs-label=\"af-north\" data-bs-value=\"9,200 sessions\" data-bs-key=\"5% of the period\">\n              <span class=\"bs-bar-chart__label\">af-north</span>\n              <div class=\"bs-bar-chart__track\">\n                <div class=\"bs-bar-chart__bar\" style=\"--bs-bar-chart-fraction: 0.12\"></div>\n              </div>\n              <span class=\"bs-bar-chart__value\">9,200</span>\n            </div>\n              </div>\n\n              <div class=\"bs-chart-tip\" data-bs-chart-tip aria-hidden=\"true\" hidden style=\"--bs-chart-tip-max: 20rem\">\n                <span class=\"bs-chart-tip__title\" data-bs-tip-title>eu-west</span>\n                <ul class=\"bs-chart-tip__rows\">\n                  <li class=\"bs-chart-tip__row\">\n                    <span class=\"bs-chart-tip__key\" data-bs-tip-key>39% of the period</span>\n                    <span class=\"bs-chart-tip__value\" data-bs-tip-value>76,200 sessions</span>\n                  </li>\n                </ul>\n              </div>\n            </figure>\n          </div>\n        </section>\n\n        <section class=\"bs-dash__tile\" aria-labelledby=\"tile-source\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-source\">Where sessions came from</h2>\n            <span class=\"bs-dash__tile-note\">last 30 days</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <!-- The legend is the chart. The ring is a second rendering of the same numbers, so it is\n                 hidden from the accessibility tree rather than labelled twice. -->\n            <figure class=\"bs-donut\">\n              <div class=\"bs-donut__dial\">\n                <div class=\"bs-donut__ring\" aria-hidden=\"true\" style=\"--bs-donut-1: 0.41; --bs-donut-2: 0.36; --bs-donut-3: 0.16; --bs-donut-4: 0.07\"></div>\n                <div class=\"bs-donut__centre\">\n                  <span class=\"bs-donut__total\">196,400</span>\n                  <span class=\"bs-donut__unit\">sessions</span>\n                </div>\n              </div>\n              <ol class=\"bs-donut__legend\">\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Direct</span>\n              <span class=\"bs-donut__value\">41%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Search</span>\n              <span class=\"bs-donut__value\">36%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Referral</span>\n              <span class=\"bs-donut__value\">16%</span>\n            </li>\n            <li class=\"bs-donut__item\">\n              <span class=\"bs-donut__swatch\"></span>\n              <span class=\"bs-donut__name\">Email</span>\n              <span class=\"bs-donut__value\">7%</span>\n            </li>\n              </ol>\n            </figure>\n          </div>\n        </section>\n\n        <!-- --wide is two of two columns at 48em and two of FOUR at 80em, which leaves half the second\n             row empty on a wide board. --full is the one that spans the row wherever the row is. -->\n        <section class=\"bs-dash__tile bs-dash__tile--wide bs-dash__tile--full\" aria-labelledby=\"tile-devices\">\n          <div class=\"bs-dash__tile-head\">\n            <h2 class=\"bs-dash__tile-title\" id=\"tile-devices\">Sessions by device</h2>\n            <span class=\"bs-dash__tile-note\">one row per six days</span>\n          </div>\n          <div class=\"bs-dash__tile-body\">\n            <figure class=\"bs-stacked-bar bs-stacked-bar--rows\">\n              <figcaption class=\"bs-stacked-bar__head\">\n                <span class=\"bs-stacked-bar__title\">Phone, tablet and desktop</span>\n                <span class=\"bs-stacked-bar__total\">196,400</span>\n              </figcaption>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">Apr 06</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 14750\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3300\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 12050\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">30,100</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">Apr 12</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 16070\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3600\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 13130\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">32,800</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">Apr 18</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 15290\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3420\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 12490\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">31,200</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">Apr 24</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 16950\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3800\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 13850\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">34,600</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">Apr 30</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 16610\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3720\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 13570\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">33,900</span>\n          </div>\n          <div class=\"bs-stacked-bar__row\">\n            <span class=\"bs-stacked-bar__label\">May 06</span>\n            <div class=\"bs-stacked-bar__track\" aria-hidden=\"true\">\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 16560\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 3710\"></div>\n              <div class=\"bs-stacked-bar__part\" style=\"--bs-stacked-bar-part: 13530\"></div>\n            </div>\n            <span class=\"bs-stacked-bar__value\">33,800</span>\n          </div>\n              <ol class=\"bs-stacked-bar__legend\">\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Phone</span>\n              <span class=\"bs-stacked-bar__value\">96,230</span>\n            </li>\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Tablet</span>\n              <span class=\"bs-stacked-bar__value\">21,550</span>\n            </li>\n            <li class=\"bs-stacked-bar__item\">\n              <span class=\"bs-stacked-bar__swatch\"></span>\n              <span class=\"bs-stacked-bar__name\">Desktop</span>\n              <span class=\"bs-stacked-bar__value\">78,620</span>\n            </li>\n              </ol>\n            </figure>\n          </div>\n        </section>\n      </template>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#analytics-dashboard",
      "preview": "https://bare.style/preview/analytics-dashboard.html"
    },
    {
      "id": "author-card",
      "title": "Author card",
      "description": "The byline block under an article: portrait, one paragraph, what they write about, and two ways to follow.",
      "category": "content",
      "categoryLabel": "Content",
      "kind": "block",
      "tags": [
        "author",
        "content",
        "card",
        "avatar",
        "profile"
      ],
      "links": [
        "src/layout/sidebar.css",
        "src/layout/cluster.css",
        "src/layout/stack.css",
        "src/data/card.css",
        "src/data/avatar.css",
        "src/data/tag.css",
        "src/forms/button.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/size.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--ring",
        "bs-avatar--xl",
        "bs-avatar__initials",
        "bs-btn",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__text",
        "bs-cluster",
        "bs-decoration-underline",
        "bs-fg-link",
        "bs-fg-muted",
        "bs-flow-none",
        "bs-gap-3",
        "bs-max-w-md",
        "bs-measure",
        "bs-navlink",
        "bs-navlink__icon",
        "bs-sidebar",
        "bs-sidebar--tight",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-stack",
        "bs-tag",
        "bs-tag--pill",
        "bs-tag-list",
        "bs-tag__label",
        "bs-text-h4"
      ],
      "html": "<!-- THE PORTRAIT IS NOT A DECORATION AND NOT A PARAGRAPH. bs-avatar carries role=\"img\" with an\n     aria-label, so the initials fallback is announced as the person's name once, and the two\n     letters themselves are hidden: without that, a screen reader reads \"P R\" and then the name\n     again from the heading below it.\n\n     The card is not bs-card--interactive. There is more than one link in here, so a stretched\n     whole-card anchor would sit on top of the others and swallow them - that variant is for a card\n     with exactly one destination. -->\n<!-- Capped to the measure its own copy holds. Left to fill a page-width container the card runs to\n     1,400px while the paragraph inside it stops at the reading measure, so most of the panel is\n     empty. The cap only ever narrows it, so a narrow column is unaffected. -->\n<article class=\"bs-card bs-max-w-md\">\n  <div class=\"bs-card__body\">\n    <!-- bs-sidebar, not a cluster: the portrait sits beside the text while the text can hold its\n         own share of the line and drops above it when it cannot, which is one rule rather than a\n         breakpoint. The two hooks are the whole configuration - a 4rem rail for a 4rem portrait,\n         and a content floor high enough that a phone gets the stacked form and a desktop does not. -->\n    <div class=\"bs-sidebar bs-sidebar--tight\" style=\"--bs-sidebar-side: 4rem; --bs-sidebar-content-min: 80%\">\n      <div class=\"bs-sidebar__side\">\n        <span class=\"bs-avatar bs-avatar--xl bs-avatar--ring\" role=\"img\" aria-label=\"Priya Raman\">\n          <span class=\"bs-avatar__initials\" aria-hidden=\"true\">PR</span>\n        </span>\n      </div>\n\n      <div class=\"bs-sidebar__main bs-stack bs-gap-3\">\n        <div>\n          <h2 class=\"bs-text-h4 bs-flow-none\">Priya Raman</h2>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">Head of platform - writing here since 2023</p>\n        </div>\n\n        <p class=\"bs-card__text bs-measure bs-flow-none\">\n          Runs the team that keeps the status pages up when the rest of the estate is not. Spent\n          eight years on payment infrastructure before that, which is where the habit of writing\n          the timeline down while it is still happening came from.\n        </p>\n\n        <!-- role=\"list\", because bs-tag-list removes the markers and VoiceOver drops the list semantics\n             with them. -->\n        <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Writes about\">\n          <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Post-incident</span></span></li>\n          <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">On-call</span></span></li>\n          <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Queues</span></span></li>\n        </ul>\n\n        <div class=\"bs-cluster bs-gap-3\">\n          <a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/blog/author/priya-raman\">All 14 posts</a>\n          <!-- The link ink and an underline. Beside a real button, a muted navlink with neither\n               reads as a caption that happens to have an icon in front of it. -->\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/rss/priya-raman.xml\">\n            <svg class=\"bs-navlink__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path d=\"M5 19a1 1 0 1 0 0-2 1 1 0 0 0 0 2M5 12a7 7 0 0 1 7 7M5 5a14 14 0 0 1 14 14\" />\n            </svg>\n            Follow the feed\n          </a>\n        </div>\n      </div>\n    </div>\n  </div>\n</article>",
      "href": "https://bare.style/templates#author-card",
      "preview": "https://bare.style/preview/author-card.html"
    },
    {
      "id": "billing",
      "title": "Billing page with a plan table",
      "description": "The billing screen: the plan in force, seat usage against its ceiling, a comparison of every plan, and the last few invoices.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "billing",
        "table",
        "shell",
        "pricing",
        "full-page"
      ],
      "links": [
        "src/app/shell-frame.css",
        "src/app/shell-rail.css",
        "src/app/shell-topbar.css",
        "src/app/shell-sidebar.css",
        "src/app/shell-main.css",
        "src/app/metric-meter.css",
        "src/nav/sidebar-nav.css",
        "src/data/card.css",
        "src/data/table.css",
        "src/data/badge.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/forms/button.css",
        "src/utility/spacing.css",
        "src/utility/size.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--danger",
        "bs-badge--ok",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-max-w-lg",
        "bs-meter",
        "bs-meter--elevated",
        "bs-meter__gauge",
        "bs-meter__head",
        "bs-meter__label",
        "bs-meter__note",
        "bs-meter__value",
        "bs-mt-3",
        "bs-shell",
        "bs-shell-main",
        "bs-shell-main__content",
        "bs-shell-rail",
        "bs-shell-rail__foot",
        "bs-shell-rail__icon",
        "bs-shell-rail__item",
        "bs-shell-rail__item--current",
        "bs-shell-rail__label",
        "bs-shell-sidebar",
        "bs-shell-sidebar__body",
        "bs-shell-sidebar__close",
        "bs-shell-sidebar__header",
        "bs-shell-sidebar__title",
        "bs-shell-topbar",
        "bs-shell-topbar__actions",
        "bs-shell-topbar__icon",
        "bs-shell-topbar__title",
        "bs-shell-topbar__toggle",
        "bs-shell__scrim",
        "bs-sidenav",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-stack",
        "bs-table",
        "bs-table--hover",
        "bs-table--nowrap",
        "bs-table--zebra",
        "bs-table-scroll",
        "bs-table__num",
        "bs-text-h3",
        "bs-text-h5",
        "bs-visually-hidden",
        "bs-visually-hidden-focusable"
      ],
      "html": "<div class=\"bs-shell\">\n  <nav class=\"bs-shell-rail\" aria-label=\"Sections\">\n    <a class=\"bs-shell-rail__item\" href=\"/pipelines\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <path d=\"M4 7h6M14 7h6M4 17h6M14 17h6\" />\n        <circle cx=\"12\" cy=\"7\" r=\"2\" />\n        <circle cx=\"12\" cy=\"17\" r=\"2\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Pipelines</span>\n    </a>\n    <a class=\"bs-shell-rail__item bs-shell-rail__item--current\" href=\"/settings/billing\" aria-current=\"page\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" />\n        <path d=\"M3 10h18\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Billing</span>\n    </a>\n    <div class=\"bs-shell-rail__foot\">\n      <a class=\"bs-shell-rail__item\" href=\"/settings\">\n        <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <circle cx=\"12\" cy=\"12\" r=\"3.2\" />\n          <path d=\"M12 3.5v2.2M12 18.3v2.2M20.5 12h-2.2M5.7 12H3.5M18 6l-1.6 1.6M7.6 16.4 6 18M18 18l-1.6-1.6M7.6 7.6 6 6\" />\n        </svg>\n        <span class=\"bs-shell-rail__label\">Settings</span>\n      </a>\n    </div>\n  </nav>\n\n  <header class=\"bs-shell-topbar\">\n    <a class=\"bs-visually-hidden-focusable\" href=\"#shell-main\">Skip to the work area</a>\n    <a class=\"bs-shell-topbar__toggle\" href=\"#shell-nav\" aria-controls=\"shell-nav\" aria-label=\"Open settings navigation\">\n      <svg class=\"bs-shell-topbar__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n        <path d=\"M4 7h16M4 12h16M4 17h16\" />\n      </svg>\n    </a>\n    <p class=\"bs-shell-topbar__title\">Billing</p>\n    <div class=\"bs-shell-topbar__actions\">\n      <a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/settings/billing/invoices\">All invoices</a>\n    </div>\n  </header>\n\n  <aside class=\"bs-shell-sidebar\" id=\"shell-nav\" aria-label=\"Settings sections\">\n    <div class=\"bs-shell-sidebar__header\">\n      <p class=\"bs-shell-sidebar__title\">Settings</p>\n      <a class=\"bs-shell-sidebar__close\" href=\"#_\" aria-label=\"Close settings navigation\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </a>\n    </div>\n    <div class=\"bs-shell-sidebar__body\">\n      <nav class=\"bs-sidenav\" aria-label=\"Settings sections\">\n        <ul class=\"bs-sidenav__list\">\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/profile\">Profile</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/members\">Members</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/billing\" aria-current=\"page\">Billing</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/api\">API keys</a></li>\n        </ul>\n      </nav>\n    </div>\n  </aside>\n\n  <a class=\"bs-shell__scrim\" href=\"#_\" aria-label=\"Close settings navigation\"></a>\n\n  <main class=\"bs-shell-main\" id=\"shell-main\" tabindex=\"-1\">\n    <div class=\"bs-shell-main__content\">\n      <div class=\"bs-stack bs-gap-5 bs-max-w-lg\">\n        <h1 class=\"bs-text-h3\">Billing</h1>\n\n        <section class=\"bs-card\" aria-labelledby=\"billing-plan-title\">\n          <header class=\"bs-card__header\">\n            <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n              <h2 class=\"bs-card__title\" id=\"billing-plan-title\">Team</h2>\n              <span class=\"bs-badge bs-badge--accent\">Current plan</span>\n            </div>\n            <p class=\"bs-card__subtitle\">$24 per seat per month, billed on the first. Next charge 1 September.</p>\n          </header>\n\n          <div class=\"bs-card__body\">\n            <!-- A meter and not a progress bar. Progress is a task moving to completion; this is a\n                 measurement inside a known range, and the low and high marks are what make it\n                 readable without reading the number. -->\n            <div class=\"bs-meter bs-meter--elevated\">\n              <div class=\"bs-meter__head\">\n                <span class=\"bs-meter__label\" id=\"billing-seats\">Seats in use</span>\n                <span class=\"bs-meter__value\">17 of 20</span>\n              </div>\n              <meter class=\"bs-meter__gauge\" aria-labelledby=\"billing-seats\" min=\"0\" max=\"20\" low=\"10\" high=\"16\" optimum=\"0\" value=\"17\"></meter>\n              <p class=\"bs-meter__note\">Elevated. Above 20 seats the next invoice moves to the Scale rate automatically.</p>\n            </div>\n          </div>\n\n          <footer class=\"bs-card__footer\">\n            <div class=\"bs-cluster bs-gap-2\">\n              <button class=\"bs-btn bs-btn--primary\" type=\"button\">Change plan</button>\n              <a class=\"bs-btn bs-btn--secondary\" href=\"/settings/billing/card\">Update the card</a>\n              <!-- Secondary. bs-btn--ghost has no fill and no border until a pointer hovers it, so\n                   in a footer of real buttons it reads as a stray word rather than the third\n                   action, and a touch user gets no resting affordance at all. -->\n              <a class=\"bs-btn bs-btn--secondary\" href=\"/settings/billing/cancel\">Cancel</a>\n            </div>\n          </footer>\n        </section>\n\n        <section aria-labelledby=\"billing-plans-title\">\n          <h2 class=\"bs-text-h5\" id=\"billing-plans-title\">What each plan includes</h2>\n          <div class=\"bs-table-scroll bs-mt-3\" tabindex=\"0\" role=\"region\" aria-label=\"Plan comparison\">\n            <!-- nowrap, so a row header stays one line and the table scrolls inside its own region. Left\n                 to wrap at 320 the first column becomes one word per line and the comparison stops\n                 being readable as a comparison. -->\n            <table class=\"bs-table bs-table--zebra bs-table--nowrap\">\n              <caption>Every plan, and what changes between them</caption>\n              <thead>\n                <tr>\n                  <th scope=\"col\">Limit</th>\n                  <th scope=\"col\" class=\"bs-table__num\">Starter</th>\n                  <th scope=\"col\" class=\"bs-table__num\">Team</th>\n                  <th scope=\"col\" class=\"bs-table__num\">Scale</th>\n                </tr>\n              </thead>\n              <tbody>\n                <tr>\n                  <th scope=\"row\">Price per seat, per month</th>\n                  <td class=\"bs-table__num\">$9</td>\n                  <td class=\"bs-table__num\">$24</td>\n                  <td class=\"bs-table__num\">$48</td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">Seats included</th>\n                  <td class=\"bs-table__num\">3</td>\n                  <td class=\"bs-table__num\">20</td>\n                  <td class=\"bs-table__num\">Unlimited</td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">Pipeline runs per day</th>\n                  <td class=\"bs-table__num\">200</td>\n                  <td class=\"bs-table__num\">5,000</td>\n                  <td class=\"bs-table__num\">Unmetered</td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">Audit log kept for</th>\n                  <td class=\"bs-table__num\">7 days</td>\n                  <td class=\"bs-table__num\">1 year</td>\n                  <td class=\"bs-table__num\">2 years</td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">Single sign-on</th>\n                  <td class=\"bs-table__num\">No</td>\n                  <td class=\"bs-table__num\">Yes</td>\n                  <td class=\"bs-table__num\">Yes</td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">Support answer time</th>\n                  <td class=\"bs-table__num\">3 days</td>\n                  <td class=\"bs-table__num\">1 day</td>\n                  <td class=\"bs-table__num\">4 hours</td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </section>\n\n        <section aria-labelledby=\"billing-invoices-title\">\n          <h2 class=\"bs-text-h5\" id=\"billing-invoices-title\">Recent invoices</h2>\n          <div class=\"bs-table-scroll bs-mt-3\" tabindex=\"0\" role=\"region\" aria-label=\"Recent invoices\">\n            <!-- The row action is a bordered button, not a ghost: alone in a cell a ghost is a word\n                 that looks like data until it is hovered. -->\n            <table class=\"bs-table bs-table--hover bs-table--nowrap\">\n              <caption>The last three invoices on this workspace</caption>\n              <thead>\n                <tr>\n                  <th scope=\"col\">Invoice</th>\n                  <th scope=\"col\">Period</th>\n                  <th scope=\"col\" class=\"bs-table__num\">Amount</th>\n                  <th scope=\"col\">Status</th>\n                  <th scope=\"col\">Receipt</th>\n                </tr>\n              </thead>\n              <tbody>\n                <tr>\n                  <th scope=\"row\">INV-0184</th>\n                  <td>1 to 31 August</td>\n                  <td class=\"bs-table__num\">$408.00</td>\n                  <td><span class=\"bs-badge bs-badge--ok\">Paid</span></td>\n                  <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/invoices/0184\">Download <span class=\"bs-visually-hidden\">INV-0184</span></a></td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">INV-0169</th>\n                  <td>1 to 31 July</td>\n                  <td class=\"bs-table__num\">$384.00</td>\n                  <td><span class=\"bs-badge bs-badge--ok\">Paid</span></td>\n                  <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/invoices/0169\">Download <span class=\"bs-visually-hidden\">INV-0169</span></a></td>\n                </tr>\n                <tr>\n                  <th scope=\"row\">INV-0151</th>\n                  <td>1 to 30 June</td>\n                  <td class=\"bs-table__num\">$384.00</td>\n                  <td><span class=\"bs-badge bs-badge--danger\">Refunded</span></td>\n                  <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/invoices/0151\">Download <span class=\"bs-visually-hidden\">INV-0151</span></a></td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </section>\n      </div>\n    </div>\n  </main>\n</div>",
      "href": "https://bare.style/templates#billing",
      "preview": "https://bare.style/preview/billing.html"
    },
    {
      "id": "blog-index",
      "title": "Blog index",
      "description": "A whole listing page: title, a featured post, a grid of cards with date, reading time and topic, and pagination.",
      "category": "content",
      "categoryLabel": "Content",
      "kind": "page",
      "tags": [
        "blog",
        "content",
        "listing",
        "card",
        "grid",
        "pagination",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/data/card.css",
        "src/data/tag.css",
        "src/nav/pagination.css",
        "src/utility/size.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-caption",
        "bs-card",
        "bs-card--interactive",
        "bs-card--spacious",
        "bs-card__body",
        "bs-card__link",
        "bs-card__text",
        "bs-eyebrow",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--bare",
        "bs-h-full",
        "bs-lead",
        "bs-measure",
        "bs-mt-7",
        "bs-mt-8",
        "bs-pagination",
        "bs-pagination__gap",
        "bs-pagination__link",
        "bs-pagination__link--next",
        "bs-pagination__link--prev",
        "bs-pagination__list",
        "bs-py-8",
        "bs-stack",
        "bs-tag",
        "bs-tag--accent",
        "bs-tag--pill",
        "bs-tag-list",
        "bs-tag__label",
        "bs-text-h1",
        "bs-text-h3",
        "bs-text-h4",
        "bs-wrap"
      ],
      "html": "<!-- THE WHOLE CARD IS THE TARGET AND THE LINK IS STILL A LINK. bs-card__link stretches an anchor's\n     hit area over the card, so the pointer target is the card while the role, the accessible name\n     and the focus ring all come from a real <a>. A click handler on the article would be\n     unreachable by keyboard and invisible to assistive technology, and no CSS can put that back.\n\n     The date is a <time datetime>, because \"12 March\" is ambiguous about the year and the zone and\n     the attribute is what makes it machine-readable. The reading time sits beside it as plain text\n     rather than as a second time element: it is a duration of reading, not a moment. -->\n<main class=\"bs-wrap bs-py-8\" id=\"main\">\n  <header class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">Writing</p>\n    <h1 class=\"bs-text-h1 bs-flow-none\">Notes on running things that break</h1>\n    <p class=\"bs-lead bs-fg-secondary bs-flow-none\">\n      Post-incident write-ups, the occasional opinion about on-call, and what we changed in the\n      product because of both.\n    </p>\n  </header>\n\n  <article class=\"bs-card bs-card--interactive bs-card--spacious bs-mt-7\">\n    <div class=\"bs-card__body bs-stack bs-gap-3\">\n      <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n        <li><span class=\"bs-tag bs-tag--pill bs-tag--accent\"><span class=\"bs-tag__label\">Featured</span></span></li>\n        <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Post-incident</span></span></li>\n      </ul>\n      <h2 class=\"bs-text-h3 bs-flow-none\">\n        <a class=\"bs-card__link\" href=\"/blog/the-quiet-hour\">The quiet hour: what a stalled queue looked like from the outside</a>\n      </h2>\n      <!-- Capped, like the excerpts in the cards below. The featured card is the full page width,\n           so an uncapped excerpt here runs to about 1,200px beside 340px excerpts underneath, and\n           one listing ends up with two reading measures. -->\n      <p class=\"bs-card__text bs-measure\">\n        For fifty-one minutes our writes succeeded and our reads returned yesterday. Nothing alerted,\n        because every check we had was asking the wrong question. Here is the timeline, the wrong\n        assumption, and the four checks that exist now.\n      </p>\n      <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n        <time datetime=\"2026-07-14\">14 July 2026</time> - 11 minutes - by Priya Raman\n      </p>\n    </div>\n  </article>\n\n  <!-- The default 16rem track floor gives four columns at 1440 and leaves a headline three words\n       wide. 20rem is the width a post title reads at, and it is set through the grid's own hook\n       rather than by a breakpoint, so it still collapses to one column at 320. -->\n  <ul class=\"bs-grid bs-grid--bare bs-mt-7\" role=\"list\" style=\"--bs-grid-min: 20rem\">\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">On-call</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/handover\">The handover note nobody reads, and how we fixed it</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            Six lines, written by the person leaving the shift, in the same place every time. It cut\n            our repeat pages roughly in half.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-06-30\">30 June 2026</time> - 6 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Product</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/subscriber-scopes\">Why subscribers now choose services, not pages</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            One customer told us they had muted us entirely because a region they do not use kept\n            emailing them. That was the whole brief.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-06-11\">11 June 2026</time> - 4 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Post-incident</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/certificate-expiry\">A certificate expired on a Sunday and we found out from a customer</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            The renewal job had been failing quietly for eleven weeks. The interesting part is not the\n            job, it is why nobody saw eleven weeks of failures.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-05-25\">25 May 2026</time> - 9 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Engineering</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/status-page-independence\">Hosting a status page nowhere near the thing it reports on</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            Separate provider, separate region, separate registrar. What that costs, and the two\n            places the independence still leaks.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-05-02\">2 May 2026</time> - 7 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Writing</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/first-update\">The first update is the one that matters</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            Nobody needs a cause in the first ten minutes. They need to know you have seen it, and\n            when you will speak again.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-04-18\">18 April 2026</time> - 3 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-card--interactive bs-h-full\">\n        <div class=\"bs-card__body bs-stack bs-gap-3\">\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Engineering</span></span></li>\n          </ul>\n          <h2 class=\"bs-text-h4 bs-flow-none\">\n            <a class=\"bs-card__link\" href=\"/blog/counting-downtime\">Two teams, one outage, two different uptime figures</a>\n          </h2>\n          <p class=\"bs-card__text\">\n            Partial degradation is where every uptime definition falls apart. We picked one, wrote it\n            down, and stopped arguing.\n          </p>\n          <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n            <time datetime=\"2026-04-03\">3 April 2026</time> - 8 minutes\n          </p>\n        </div>\n      </article>\n    </li>\n  </ul>\n\n  <nav class=\"bs-pagination bs-mt-8\" aria-label=\"Blog pages\">\n    <ul class=\"bs-pagination__list\">\n      <li><a class=\"bs-pagination__link bs-pagination__link--prev\" href=\"?page=1\" rel=\"prev\">Newer</a></li>\n      <li><a class=\"bs-pagination__link\" href=\"?page=1\">1</a></li>\n      <li><a class=\"bs-pagination__link\" href=\"?page=2\" aria-current=\"page\" aria-label=\"Page 2, current page\">2</a></li>\n      <li><a class=\"bs-pagination__link\" href=\"?page=3\">3</a></li>\n      <li aria-hidden=\"true\"><span class=\"bs-pagination__gap\">...</span></li>\n      <li><a class=\"bs-pagination__link\" href=\"?page=9\">9</a></li>\n      <li><a class=\"bs-pagination__link bs-pagination__link--next\" href=\"?page=3\" rel=\"next\">Older</a></li>\n    </ul>\n  </nav>\n</main>",
      "href": "https://bare.style/templates#blog-index",
      "preview": "https://bare.style/preview/blog-index.html"
    },
    {
      "id": "blog-post",
      "title": "Blog post with a table of contents",
      "description": "A whole article page: breadcrumb, byline, a sticky contents rail, prose with a table, a code sample and a pull quote.",
      "category": "content",
      "categoryLabel": "Content",
      "kind": "page",
      "tags": [
        "blog",
        "content",
        "article",
        "prose",
        "table-of-contents",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/sidebar.css",
        "src/layout/cluster.css",
        "src/nav/breadcrumb.css",
        "src/nav/sidebar-nav.css",
        "src/prose/prose.css",
        "src/prose/code.css",
        "src/prose/quote.css",
        "src/data/avatar.css",
        "src/data/tag.css",
        "src/data/divider.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/display.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar__initials",
        "bs-breadcrumb",
        "bs-breadcrumb__current",
        "bs-breadcrumb__item",
        "bs-breadcrumb__link",
        "bs-breadcrumb__list",
        "bs-caption",
        "bs-cluster",
        "bs-d-block",
        "bs-divider",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-gap-3",
        "bs-lead",
        "bs-mt-6",
        "bs-pre",
        "bs-prose",
        "bs-prose__scroll",
        "bs-py-7",
        "bs-quote",
        "bs-quote--pull",
        "bs-quote__attribution",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-sidenav",
        "bs-sidenav--sticky",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-sidenav__title",
        "bs-tag",
        "bs-tag--pill",
        "bs-tag-list",
        "bs-tag__label",
        "bs-wrap",
        "bs-wrap--lg"
      ],
      "html": "<!-- THE RAIL IS FIRST IN THE DOM, which is also where it is read. bs-sidebar wraps to one column\n     on its own width rather than at a viewport breakpoint, so the contents list sits above the\n     article on a phone and beside it from about 64em, and neither order was declared twice. Moving\n     it visually with order or row-reverse would put reading order and visual order out of step,\n     which fails SC 1.3.2 and SC 2.4.3.\n\n     THE RAIL IS A <nav> WITH A NAME. This page has two navigation landmarks, the breadcrumb and\n     the contents, and \"navigation\" announced twice tells a screen reader user nothing.\n     aria-current=\"page\" marks the section being read; sidebar-nav.css styles that attribute, so\n     the marker and the announcement cannot drift apart.\n\n     THE TABLE INSIDE PROSE IS WRAPPED. A table wider than the column takes the whole page sideways\n     at 320px. bs-prose__scroll absorbs it, and carries role, a name and tabindex=\"0\" so the scroll\n     is reachable by keyboard as well as by pointer. -->\n<!-- --lg, not the default. The rail is a fixed 16rem and the article is capped at the reading\n     measure, so the two together are about 950px however wide the container is: at the default\n     80rem the pair sits against the start edge of a 1,280px box with 300px of empty page beside it,\n     and the whole page reads as left-anchored rather than centred. -->\n<main class=\"bs-wrap bs-wrap--lg bs-py-7\" id=\"main\">\n  <nav class=\"bs-breadcrumb\" aria-label=\"Breadcrumb\">\n    <ol class=\"bs-breadcrumb__list\">\n      <li class=\"bs-breadcrumb__item\"><a class=\"bs-breadcrumb__link\" href=\"/\">Home</a></li>\n      <li class=\"bs-breadcrumb__item\"><a class=\"bs-breadcrumb__link\" href=\"/blog\">Blog</a></li>\n      <li class=\"bs-breadcrumb__item\"><span class=\"bs-breadcrumb__current\" aria-current=\"page\">The quiet hour</span></li>\n    </ol>\n  </nav>\n\n  <div class=\"bs-sidebar bs-mt-6\">\n    <div class=\"bs-sidebar__side\">\n      <nav class=\"bs-sidenav bs-sidenav--sticky\" aria-labelledby=\"toc-title\">\n        <p class=\"bs-sidenav__title\" id=\"toc-title\">On this page</p>\n        <ul class=\"bs-sidenav__list\">\n          <li><a class=\"bs-sidenav__link\" href=\"#what-happened\" aria-current=\"page\">What happened</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"#why-nothing-alerted\">Why nothing alerted</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"#the-timeline\">The timeline</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"#the-check-we-added\">The check we added</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"#what-changes\">What changes</a></li>\n        </ul>\n      </nav>\n    </div>\n\n    <div class=\"bs-sidebar__main\">\n      <article class=\"bs-prose\">\n        <header>\n          <h1>The quiet hour: what a stalled queue looked like from the outside</h1>\n          <p class=\"bs-lead bs-fg-secondary\">\n            For fifty-one minutes every write succeeded and every read returned yesterday. Nothing\n            alerted, because every check we had was asking the wrong question.\n          </p>\n\n          <div class=\"bs-cluster bs-gap-3\">\n            <span class=\"bs-avatar\" role=\"img\" aria-label=\"Priya Raman\">\n              <span class=\"bs-avatar__initials\" aria-hidden=\"true\">PR</span>\n            </span>\n            <span>\n              Priya Raman\n              <span class=\"bs-d-block bs-caption bs-fg-muted\">\n                Head of platform - <time datetime=\"2026-07-14\">14 July 2026</time> - 11 minutes\n              </span>\n            </span>\n          </div>\n\n          <!-- role=\"list\", because bs-tag-list removes the markers and VoiceOver drops the list\n               semantics with them. -->\n          <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"Topics\">\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Post-incident</span></span></li>\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Queues</span></span></li>\n            <li><span class=\"bs-tag bs-tag--pill\"><span class=\"bs-tag__label\">Alerting</span></span></li>\n          </ul>\n        </header>\n\n        <div class=\"bs-divider\" role=\"separator\"></div>\n\n        <h2 id=\"what-happened\">What happened</h2>\n        <p>\n          At 02:14 a routine index rebuild took a lock on the table our projection worker writes\n          into. The worker did what it was told to do when it cannot write: it kept the message,\n          waited, and tried again. It did that for fifty-one minutes without once reporting an\n          error, because from its own point of view nothing had failed yet.\n        </p>\n        <p>\n          Everything downstream stayed up. The API answered, the dashboard rendered, health checks\n          were green in three regions. What customers saw was a site that worked perfectly and\n          showed them the state of the world as it had been just before two in the morning.\n        </p>\n\n        <h2 id=\"why-nothing-alerted\">Why nothing alerted</h2>\n        <p>\n          Our checks measured three things: is the process running, is it consuming messages, and is\n          the error rate low. All three were healthy. A worker that is patiently retrying is\n          running, is holding its messages, and is producing no errors at all.\n        </p>\n        <p>What we were not measuring was the only thing a reader cares about:</p>\n        <ul>\n          <li>How old is the newest record a customer can actually see</li>\n          <li>How long has the oldest unacknowledged message been waiting</li>\n          <li>Is the gap between those two growing</li>\n        </ul>\n\n        <figure>\n          <blockquote class=\"bs-quote bs-quote--pull\">\n            <p>\n              A health check that asks whether the machinery is turning cannot tell you that it is\n              turning on the spot.\n            </p>\n          </blockquote>\n          <figcaption class=\"bs-quote__attribution\">\n            From the internal write-up, <cite>Incident review: stalled projections</cite>\n          </figcaption>\n        </figure>\n\n        <h2 id=\"the-timeline\">The timeline</h2>\n        <p>\n          All times are in UTC, taken from the worker's own log rather than reconstructed\n          afterwards.\n        </p>\n\n        <div class=\"bs-prose__scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Incident timeline\">\n          <table>\n            <caption>What we knew, and when</caption>\n            <thead>\n              <tr>\n                <th scope=\"col\">Time</th>\n                <th scope=\"col\">Event</th>\n                <th scope=\"col\">Visible to customers</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <th scope=\"row\">02:14</th>\n                <td>Index rebuild starts and takes the write lock</td>\n                <td>Nothing</td>\n              </tr>\n              <tr>\n                <th scope=\"row\">02:15</th>\n                <td>Projection worker begins retrying, silently</td>\n                <td>Reads start going stale</td>\n              </tr>\n              <tr>\n                <th scope=\"row\">02:52</th>\n                <td>A customer emails support about an old figure</td>\n                <td>Stale by 37 minutes</td>\n              </tr>\n              <tr>\n                <th scope=\"row\">03:01</th>\n                <td>On-call paged by hand, incident opened</td>\n                <td>Status page updated</td>\n              </tr>\n              <tr>\n                <th scope=\"row\">03:06</th>\n                <td>Rebuild cancelled, lock released, queue drains</td>\n                <td>Reads correct within 90 seconds</td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n\n        <h2 id=\"the-check-we-added\">The check we added</h2>\n        <p>\n          One number, published by the worker on every loop, whether or not it managed to write.\n          Freshness is the age of the newest committed record, and it is the thing a customer would\n          complain about if they could see it.\n        </p>\n\n        <pre class=\"bs-pre\"><code>async function reportFreshness(db, metrics) {\n  const newest = await db.newestCommittedAt('projections');\n  const ageSeconds = (Date.now() - newest) / 1000;\n\n  // Published on every loop, including the loops where the write failed.\n  // A worker that goes quiet is as interesting as one reporting a big number.\n  metrics.gauge('projection.freshness_seconds', ageSeconds);\n}</code></pre>\n\n        <p>\n          The alert fires when freshness passes 120 seconds for two consecutive minutes. In the\n          incident above it would have paged at 02:17, thirty-five minutes before the customer\n          email, and about forty-four minutes before we actually found out.\n        </p>\n\n        <h2 id=\"what-changes\">What changes</h2>\n        <p>\n          Three things, all of them cheap, none of them clever. Index rebuilds now run behind a\n          lease the worker can see, so it can log that it is blocked rather than retrying into the\n          dark. Freshness is on the same dashboard as the error rate. And the runbook asks one\n          question first: what is the oldest thing a customer can see right now.\n        </p>\n        <p>\n          If you take one thing from this, take the shape of the mistake rather than the fix. We\n          measured the parts we owned and not the answer we give. Every check was true and the page\n          was still wrong.\n        </p>\n      </article>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#blog-post",
      "preview": "https://bare.style/preview/blog-post.html"
    },
    {
      "id": "changelog",
      "title": "Changelog page",
      "description": "Releases dated newest first on a timeline, each tagged as added, changed or fixed, with the note that says why.",
      "category": "content",
      "categoryLabel": "Content",
      "kind": "page",
      "tags": [
        "changelog",
        "content",
        "timeline",
        "release-notes",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/app/flow-timeline.css",
        "src/data/badge.css",
        "src/data/divider.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--danger",
        "bs-badge--ok",
        "bs-caption",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-divider",
        "bs-eyebrow",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-lead",
        "bs-mt-6",
        "bs-mt-8",
        "bs-navlink",
        "bs-navlink--prose",
        "bs-py-8",
        "bs-stack",
        "bs-text-h1",
        "bs-timeline",
        "bs-timeline__body",
        "bs-timeline__content",
        "bs-timeline__item",
        "bs-timeline__marker",
        "bs-timeline__time",
        "bs-timeline__title",
        "bs-wrap",
        "bs-wrap--md"
      ],
      "html": "<!-- DATES, NOT RELEASE NUMBERS. A number means something to the team that cut it and nothing to the\n     reader, who wants to know whether the thing they hit last Tuesday is fixed. The date answers\n     that; the number needs a second lookup.\n\n     THE MARKER IS A TINT AND NOT THE MESSAGE. bs-timeline paints its dot from data-state, and a\n     coloured dot is invisible to a monochrome display, to forced colors and to a good share of the\n     people reading. So every entry also carries the word - Added, Changed, Fixed - as a badge, and\n     the title says what happened without either.\n\n     Every <time> carries datetime. \"3 July\" is ambiguous about the year and the zone, and the\n     attribute is the only part of it a machine can read. -->\n<main class=\"bs-wrap bs-wrap--md bs-py-8\" id=\"main\">\n  <header class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">Changelog</p>\n    <h1 class=\"bs-text-h1 bs-flow-none\">What we shipped</h1>\n    <p class=\"bs-lead bs-fg-secondary bs-flow-none\">\n      Everything customer-facing, newest first. Nothing here needs an upgrade on your side, and\n      nothing here changed a price.\n    </p>\n    <p class=\"bs-caption bs-flow-none\">\n      <a class=\"bs-navlink bs-navlink--prose\" href=\"/changelog.xml\">Subscribe to this page as a feed</a>\n    </p>\n  </header>\n\n  <div class=\"bs-divider bs-mt-6\" role=\"separator\"></div>\n\n  <ol class=\"bs-timeline bs-mt-6\">\n    <li class=\"bs-timeline__item\" data-state=\"ok\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Subscribers can now follow a single service</h2>\n          <span class=\"bs-badge bs-badge--ok\">Added</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          A subscriber picks the services they depend on instead of taking every notice the page\n          sends. Existing subscribers keep everything until they choose otherwise, so nobody stops\n          hearing from you by accident.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-07-28\">28 July 2026</time>\n      </div>\n    </li>\n\n    <li class=\"bs-timeline__item\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Incident updates keep the time they were written</h2>\n          <span class=\"bs-badge bs-badge--accent\">Changed</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          Editing an update no longer moves it to the top of the timeline. The original time stands\n          and the edit is noted underneath, so a review afterwards reads in the order things\n          actually happened.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-07-21\">21 July 2026</time>\n      </div>\n    </li>\n\n    <li class=\"bs-timeline__item\" data-state=\"danger\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Certificate renewal failures now page someone</h2>\n          <span class=\"bs-badge bs-badge--danger\">Fixed</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          A renewal on a custom domain could fail quietly and keep failing. It now raises an alert\n          on the first failure and emails the account owner on the third.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-07-14\">14 July 2026</time>\n      </div>\n    </li>\n\n    <li class=\"bs-timeline__item\" data-state=\"ok\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Templates for the first update</h2>\n          <span class=\"bs-badge bs-badge--ok\">Added</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          Save the wording your team already agreed on and open an incident from it. Placeholders\n          for the service, the impact and the time of the next update are filled in for you.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-07-02\">2 July 2026</time>\n      </div>\n    </li>\n\n    <li class=\"bs-timeline__item\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Uptime is counted one way everywhere</h2>\n          <span class=\"bs-badge bs-badge--accent\">Changed</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          Partial degradation now counts as partial in the dashboard, the monthly report and the\n          API, using the definition written on the reporting page. Historic figures were\n          recalculated and may differ slightly from what you saw before.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-06-19\">19 June 2026</time>\n      </div>\n    </li>\n\n    <li class=\"bs-timeline__item\" data-state=\"danger\">\n      <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n      <div class=\"bs-timeline__content\">\n        <div class=\"bs-cluster bs-cluster--baseline bs-gap-3\">\n          <h2 class=\"bs-timeline__title bs-flow-none\">Long incident titles no longer overflow on a phone</h2>\n          <span class=\"bs-badge bs-badge--danger\">Fixed</span>\n        </div>\n        <p class=\"bs-timeline__body\">\n          A title with a long unbroken token could push the public page sideways at narrow widths.\n          It wraps now, and the subscribe control stays where it belongs.\n        </p>\n        <time class=\"bs-timeline__time\" datetime=\"2026-06-05\">5 June 2026</time>\n      </div>\n    </li>\n  </ol>\n\n  <p class=\"bs-caption bs-fg-muted bs-mt-8\">\n    Older entries live in the <a class=\"bs-navlink bs-navlink--prose\" href=\"/changelog/archive\">archive</a>.\n    Security notices are published separately, on the security page.\n  </p>\n</main>",
      "href": "https://bare.style/templates#changelog",
      "preview": "https://bare.style/preview/changelog.html"
    },
    {
      "id": "check-email",
      "title": "Check your email screen",
      "description": "The wait state after a link is sent: what was sent, where, when it expires, how to send it again and how to correct the address.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "sign-in",
        "status",
        "full-page"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-state.css",
        "src/forms/button.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-state",
        "bs-auth-state--panel",
        "bs-auth-state--sent",
        "bs-auth-state__actions",
        "bs-auth-state__body",
        "bs-auth-state__mark",
        "bs-auth-state__meta",
        "bs-auth-state__text",
        "bs-auth-state__title",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--secondary"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <main class=\"bs-auth__card\">\n      <!-- role=\"status\" and not role=\"alert\". This is polite news arriving after a button the user\n           pressed on purpose, so it reports rather than interrupts. The state IS the screen here,\n           which is what the panel shape is for, and the state's own title is the page's h1. -->\n      <div class=\"bs-auth-state bs-auth-state--sent bs-auth-state--panel\" role=\"status\">\n        <span class=\"bs-auth-state__mark\" aria-hidden=\"true\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <rect x=\"2.8\" y=\"5\" width=\"18.4\" height=\"14\" rx=\"2\" />\n            <path d=\"m3.4 6.6 8.6 6 8.6-6\" />\n          </svg>\n        </span>\n        <div class=\"bs-auth-state__body\">\n          <h1 class=\"bs-auth-state__title\">Check your email</h1>\n          <p class=\"bs-auth-state__text\">\n            We sent a sign-in link to ada@example.com. It expires in ten minutes and works once.\n            If it is not there, it is usually in the spam folder.\n          </p>\n        </div>\n        <div class=\"bs-auth-state__actions\">\n          <button class=\"bs-btn bs-btn--secondary bs-btn--block\" type=\"button\">Send it again</button>\n        </div>\n        <p class=\"bs-auth-state__meta\">Wrong address? <a href=\"/signin\">Start over</a></p>\n      </div>\n    </main>\n\n    <p class=\"bs-auth__alt\">Cannot reach that inbox? <a href=\"/support\">Talk to support</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#check-email",
      "preview": "https://bare.style/preview/check-email.html"
    },
    {
      "id": "cta-banner",
      "title": "Call to action banner",
      "description": "A closing panel: one heading, one sentence, the action, and the two facts that answer the hesitation.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "cta",
        "marketing",
        "banner",
        "card"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/cluster.css",
        "src/layout/stack.css",
        "src/data/card.css",
        "src/data/icon.css",
        "src/forms/button.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card--spacious",
        "bs-card__body",
        "bs-card__footer",
        "bs-cluster",
        "bs-cluster--bare",
        "bs-cluster--between",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-gap-6",
        "bs-icon",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-icon--xs",
        "bs-measure",
        "bs-py-8",
        "bs-stack",
        "bs-text-h3",
        "bs-wrap"
      ],
      "html": "<!-- bs-cluster--between puts the words and the actions on one line while there is room and stacks\n     them the moment there is not, without a breakpoint: a cluster wraps on its own width, so this\n     panel is correct inside a narrow column as well as across a page.\n\n     The buttons are inside their own cluster so they stay side by side when the pair wraps below\n     the text, rather than becoming two full-width rows and reading as two separate offers. -->\n<section class=\"bs-wrap bs-py-8\" aria-labelledby=\"cta-heading\">\n  <div class=\"bs-card bs-card--spacious\">\n    <div class=\"bs-card__body\">\n      <div class=\"bs-cluster bs-cluster--between bs-gap-6\">\n        <div class=\"bs-stack bs-gap-2\">\n          <h2 class=\"bs-text-h3 bs-flow-none\" id=\"cta-heading\">Put your first incident page up today</h2>\n          <p class=\"bs-fg-secondary bs-measure bs-flow-none\">\n            It takes about ten minutes, and the next time something breaks you will already have\n            the link to send.\n          </p>\n        </div>\n\n        <div class=\"bs-cluster bs-gap-3\">\n          <a class=\"bs-btn bs-btn--primary\" href=\"/signup\">\n            Start free\n            <svg class=\"bs-icon bs-icon--sm\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M3 8h9M8.5 4.5 12 8l-3.5 3.5\" />\n            </svg>\n          </a>\n          <!-- Secondary and not ghost. Ghost is the third action in a row that already has two\n               boxed ones; as the only alternative to the primary it is a run of bold text beside a\n               pill, and nothing says it is a control until a pointer touches it - which on a touch\n               screen is never. -->\n          <a class=\"bs-btn bs-btn--secondary\" href=\"/contact\">Talk to us</a>\n        </div>\n      </div>\n    </div>\n\n    <footer class=\"bs-card__footer\">\n      <!-- The tick is inline in the sentence rather than a flex sibling of it. bs-icon is an\n           inline-block sitting on the baseline, so it wraps with the words; a cluster would put it\n           on a line of its own the moment the sentence needed two lines, which is every one of\n           these at 320px. -->\n      <ul class=\"bs-cluster bs-cluster--bare bs-gap-5 bs-caption bs-fg-muted\" role=\"list\">\n        <li>\n          <svg class=\"bs-icon bs-icon--xs bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          No card until you invite a second person\n        </li>\n        <li>\n          <svg class=\"bs-icon bs-icon--xs bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          Export everything, whenever you like\n        </li>\n      </ul>\n    </footer>\n  </div>\n</section>",
      "href": "https://bare.style/templates#cta-banner",
      "preview": "https://bare.style/preview/cta-banner.html"
    },
    {
      "id": "dashboard-empty",
      "title": "Empty dashboard shell",
      "description": "The whole application frame with nothing in it yet: rail, topbar, drawer navigation and a work area holding one first-run empty state.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "dashboard",
        "shell",
        "empty-state",
        "navigation",
        "full-page"
      ],
      "links": [
        "src/app/shell-frame.css",
        "src/app/shell-rail.css",
        "src/app/shell-topbar.css",
        "src/app/shell-sidebar.css",
        "src/app/shell-main.css",
        "src/nav/sidebar-nav.css",
        "src/data/empty.css",
        "src/forms/button.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-empty",
        "bs-empty--framed",
        "bs-empty__actions",
        "bs-empty__icon",
        "bs-empty__text",
        "bs-empty__title",
        "bs-shell",
        "bs-shell-main",
        "bs-shell-main__content",
        "bs-shell-rail",
        "bs-shell-rail__foot",
        "bs-shell-rail__icon",
        "bs-shell-rail__item",
        "bs-shell-rail__item--current",
        "bs-shell-rail__label",
        "bs-shell-sidebar",
        "bs-shell-sidebar__body",
        "bs-shell-sidebar__close",
        "bs-shell-sidebar__footer",
        "bs-shell-sidebar__header",
        "bs-shell-sidebar__title",
        "bs-shell-topbar",
        "bs-shell-topbar__actions",
        "bs-shell-topbar__icon",
        "bs-shell-topbar__title",
        "bs-shell-topbar__toggle",
        "bs-shell__scrim",
        "bs-sidenav",
        "bs-sidenav__group",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-sidenav__list--nested",
        "bs-visually-hidden-focusable"
      ],
      "html": "<!-- Source order is reading order and is also the Tab order: the grid places each region by name,\n     so the rail can sit across the block end on a phone and at the inline start on a laptop from\n     one set of markup. Below 64em the sidebar is an off-canvas drawer that opens on :target, which\n     is why the topbar toggle is a link to its id and the close control is a link to #_. -->\n<div class=\"bs-shell\">\n  <nav class=\"bs-shell-rail\" aria-label=\"Sections\">\n    <a class=\"bs-shell-rail__item bs-shell-rail__item--current\" href=\"/pipelines\" aria-current=\"page\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <path d=\"M4 7h6M14 7h6M4 17h6M14 17h6\" />\n        <circle cx=\"12\" cy=\"7\" r=\"2\" />\n        <circle cx=\"12\" cy=\"17\" r=\"2\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Pipelines</span>\n    </a>\n    <a class=\"bs-shell-rail__item\" href=\"/sources\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <ellipse cx=\"12\" cy=\"6.5\" rx=\"7\" ry=\"3\" />\n        <path d=\"M5 6.5v11c0 1.7 3.1 3 7 3s7-1.3 7-3v-11M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Sources</span>\n    </a>\n    <a class=\"bs-shell-rail__item\" href=\"/alerts\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <path d=\"M6 9a6 6 0 0 1 12 0c0 4.2 1.4 5.6 1.4 5.6H4.6S6 13.2 6 9Z\" />\n        <path d=\"M10 18.2a2.2 2.2 0 0 0 4 0\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Alerts</span>\n    </a>\n    <div class=\"bs-shell-rail__foot\">\n      <a class=\"bs-shell-rail__item\" href=\"/settings\">\n        <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <circle cx=\"12\" cy=\"12\" r=\"3.2\" />\n          <path d=\"M12 3.5v2.2M12 18.3v2.2M20.5 12h-2.2M5.7 12H3.5M18 6l-1.6 1.6M7.6 16.4 6 18M18 18l-1.6-1.6M7.6 7.6 6 6\" />\n        </svg>\n        <span class=\"bs-shell-rail__label\">Settings</span>\n      </a>\n    </div>\n  </nav>\n\n  <header class=\"bs-shell-topbar\">\n    <!-- Inside the bar rather than above the frame: the frame owns the viewport and is clipped, so\n         a bypass link that becomes visible on focus has to appear somewhere with room for it. -->\n    <a class=\"bs-visually-hidden-focusable\" href=\"#shell-main\">Skip to the work area</a>\n    <a class=\"bs-shell-topbar__toggle\" href=\"#shell-nav\" aria-controls=\"shell-nav\" aria-label=\"Open navigation\">\n      <svg class=\"bs-shell-topbar__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n        <path d=\"M4 7h16M4 12h16M4 17h16\" />\n      </svg>\n    </a>\n    <!-- A paragraph, not an h1. The heading of the page belongs to the work area; a frame that\n         claims it pushes every real heading down a level on every screen. -->\n    <p class=\"bs-shell-topbar__title\">Pipelines</p>\n    <div class=\"bs-shell-topbar__actions\">\n      <button class=\"bs-btn bs-btn--primary bs-btn--sm\" type=\"button\">New pipeline</button>\n    </div>\n  </header>\n\n  <aside class=\"bs-shell-sidebar\" id=\"shell-nav\" aria-label=\"Pipelines\">\n    <div class=\"bs-shell-sidebar__header\">\n      <p class=\"bs-shell-sidebar__title\">Pipelines</p>\n      <a class=\"bs-shell-sidebar__close\" href=\"#_\" aria-label=\"Close navigation\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </a>\n    </div>\n    <div class=\"bs-shell-sidebar__body\">\n      <nav class=\"bs-sidenav\" aria-label=\"Pipeline views\">\n        <!-- Every link is inside a named group, at one depth. Three links at the top level with a\n             fourth set nested under a group heading gives the panel two indents and two type\n             treatments for one list, and reads as a nesting mistake rather than a grouping. -->\n        <ul class=\"bs-sidenav__list\">\n          <li>\n            <p class=\"bs-sidenav__group\" id=\"shell-nav-views\">Views</p>\n            <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"shell-nav-views\">\n              <li><a class=\"bs-sidenav__link\" href=\"/pipelines\" aria-current=\"page\">All pipelines</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/pipelines/mine\">Owned by me</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/pipelines/failing\">Failing</a></li>\n            </ul>\n          </li>\n          <li>\n            <p class=\"bs-sidenav__group\" id=\"shell-nav-archive\">Archive</p>\n            <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"shell-nav-archive\">\n              <li><a class=\"bs-sidenav__link\" href=\"/pipelines/archived\">Archived</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/pipelines/deleted\">Recently deleted</a></li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n    </div>\n    <div class=\"bs-shell-sidebar__footer\">\n      <a class=\"bs-sidenav__link\" href=\"/docs/pipelines\">Read the pipeline guide</a>\n    </div>\n  </aside>\n\n  <!-- The scrim is a link rather than a pseudo-element so that tapping outside an open drawer\n       navigates to #_ and closes it with no script. It is display:none until a drawer is targeted,\n       so it is not in the tab order the rest of the time. -->\n  <a class=\"bs-shell__scrim\" href=\"#_\" aria-label=\"Close navigation\"></a>\n\n  <!-- tabindex=\"-1\" is what makes the skip link land here rather than moving the scroll position\n       and leaving the keyboard where it was. -->\n  <main class=\"bs-shell-main\" id=\"shell-main\" tabindex=\"-1\">\n    <div class=\"bs-shell-main__content\">\n      <div class=\"bs-empty bs-empty--framed\">\n        <svg class=\"bs-empty__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\">\n          <path d=\"M3.5 6.5h17v13h-17z\" />\n          <path d=\"M3.5 10.5h17M8.5 10.5v9\" />\n        </svg>\n        <h1 class=\"bs-empty__title\">No pipelines yet</h1>\n        <p class=\"bs-empty__text\">\n          A pipeline reads from a source on a schedule and writes somewhere you choose. Build one\n          from scratch, or start from the template that matches your warehouse.\n        </p>\n        <div class=\"bs-empty__actions\">\n          <button class=\"bs-btn bs-btn--primary\" type=\"button\">New pipeline</button>\n          <a class=\"bs-btn bs-btn--secondary\" href=\"/pipelines/templates\">Start from a template</a>\n        </div>\n      </div>\n    </div>\n  </main>\n</div>",
      "href": "https://bare.style/templates#dashboard-empty",
      "preview": "https://bare.style/preview/dashboard-empty.html"
    },
    {
      "id": "email-client",
      "title": "Email client",
      "description": "A folder rail, an inbox list and a reading pane with a message header, collapsed quoted reply, labels, and a compose form.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "email",
        "inbox",
        "list",
        "detail",
        "navigation",
        "form",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/layout/sidebar.css",
        "src/nav/sidebar-nav.css",
        "src/nav/navlink.css",
        "src/app/collab-queue-item.css",
        "src/app/accordion.css",
        "src/app/collab-composer.css",
        "src/data/avatar.css",
        "src/data/badge.css",
        "src/data/tag.css",
        "src/data/divider.css",
        "src/data/description-list.css",
        "src/forms/field.css",
        "src/forms/label.css",
        "src/forms/input.css",
        "src/forms/textarea.css",
        "src/forms/button.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-accordion",
        "bs-accordion--flush",
        "bs-accordion__item",
        "bs-accordion__panel",
        "bs-accordion__summary",
        "bs-avatar",
        "bs-avatar__initials",
        "bs-badge",
        "bs-badge--count",
        "bs-btn",
        "bs-btn--ghost",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-composer",
        "bs-composer__bar",
        "bs-composer__field",
        "bs-composer__hint",
        "bs-composer__label",
        "bs-composer__send",
        "bs-composer__send-label",
        "bs-composer__tool",
        "bs-composer__tools",
        "bs-divider",
        "bs-dl",
        "bs-dl--columns",
        "bs-dl__desc",
        "bs-dl__term",
        "bs-field",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-4",
        "bs-gap-5",
        "bs-input",
        "bs-label",
        "bs-mt-2",
        "bs-mt-3",
        "bs-mt-4",
        "bs-mt-5",
        "bs-navlink",
        "bs-queue-item",
        "bs-queue-item--dense",
        "bs-queue-item--selected",
        "bs-queue-item--unread",
        "bs-queue-item__meta",
        "bs-queue-item__snippet",
        "bs-queue-item__time",
        "bs-queue-item__title",
        "bs-queue-item__unread",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-sidenav",
        "bs-sidenav__group",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-sidenav__list--nested",
        "bs-sidenav__title",
        "bs-stack",
        "bs-stack--bare",
        "bs-stack--flush",
        "bs-tag",
        "bs-tag--pill",
        "bs-tag-list",
        "bs-text-h3",
        "bs-text-h5",
        "bs-text-h6",
        "bs-textarea",
        "bs-wrap"
      ],
      "html": "<main class=\"bs-wrap\" id=\"main\">\n  <div class=\"bs-stack bs-gap-5\">\n    <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">Mail</h1>\n      <button class=\"bs-btn bs-btn--primary bs-btn--sm\" type=\"button\">Compose</button>\n    </div>\n\n    <!-- Three panes, written as two nested sidebars rather than one three-column grid. Each one\n         wraps on its own width, so the rail drops under the list before the list drops under the\n         message, which is the order a reader actually loses things in. -->\n    <div class=\"bs-sidebar\">\n      <div class=\"bs-sidebar__side\">\n        <nav class=\"bs-sidenav\" aria-labelledby=\"mail-folders\">\n          <p class=\"bs-sidenav__title\" id=\"mail-folders\">Folders</p>\n          <ul class=\"bs-sidenav__list\">\n            <li>\n              <a class=\"bs-sidenav__link\" href=\"/mail/inbox\" aria-current=\"page\">\n                Inbox\n                <span class=\"bs-badge bs-badge--count\">12</span>\n              </a>\n            </li>\n            <li><a class=\"bs-sidenav__link\" href=\"/mail/starred\">Starred</a></li>\n            <li><a class=\"bs-sidenav__link\" href=\"/mail/sent\">Sent</a></li>\n            <li><a class=\"bs-sidenav__link\" href=\"/mail/drafts\">Drafts <span class=\"bs-badge bs-badge--count\">2</span></a></li>\n            <li>\n              <p class=\"bs-sidenav__group\" id=\"mail-labels\">Labels</p>\n              <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"mail-labels\">\n                <li><a class=\"bs-sidenav__link\" href=\"/mail/label/billing\">Billing</a></li>\n                <li><a class=\"bs-sidenav__link\" href=\"/mail/label/migration\">Migration</a></li>\n                <li><a class=\"bs-sidenav__link\" href=\"/mail/label/receipts\">Receipts</a></li>\n              </ul>\n            </li>\n            <li><a class=\"bs-sidenav__link\" href=\"/mail/archive\">Archive</a></li>\n          </ul>\n        </nav>\n      </div>\n\n      <div class=\"bs-sidebar__main\">\n        <div class=\"bs-sidebar\" style=\"--bs-sidebar-side: 20rem\">\n          <div class=\"bs-sidebar__side\">\n            <h2 class=\"bs-text-h6\" id=\"mail-inbox\">Inbox</h2>\n            <!-- Removing the marker removes the list semantics in Safari, so the role is restated. -->\n            <ul class=\"bs-stack bs-stack--bare bs-stack--flush bs-mt-2\" role=\"list\" aria-labelledby=\"mail-inbox\">\n              <li class=\"bs-queue-item bs-queue-item--dense bs-queue-item--selected\">\n                <h3 class=\"bs-queue-item__title\">\n                  <!-- Only the subject is a link. A row-sized anchor swallows every control in the\n                       row and announces as one link named after the whole thing. -->\n                  <a class=\"bs-navlink\" href=\"/mail/m/4821\" aria-current=\"page\">June ledger, the two accounts with no default</a>\n                </h3>\n                <p class=\"bs-queue-item__snippet\">Rin Alvarez: here is the mapping, and the two that need a decision.</p>\n                <div class=\"bs-queue-item__meta\">\n                  <time class=\"bs-queue-item__time\" datetime=\"2026-08-02T09:41:00Z\">09:41</time>\n                </div>\n              </li>\n\n              <li class=\"bs-queue-item bs-queue-item--dense bs-queue-item--unread\">\n                <h3 class=\"bs-queue-item__title\">\n                  <a class=\"bs-navlink\" href=\"/mail/m/4818\">Sandbox key rotation tonight</a>\n                  <span class=\"bs-queue-item__unread\">Unread</span>\n                </h3>\n                <p class=\"bs-queue-item__snippet\">Billing team: hold the migration until the new key is live at 23:00.</p>\n                <div class=\"bs-queue-item__meta\">\n                  <time class=\"bs-queue-item__time\" datetime=\"2026-08-02T09:02:00Z\">09:02</time>\n                </div>\n              </li>\n\n              <li class=\"bs-queue-item bs-queue-item--dense bs-queue-item--unread\">\n                <h3 class=\"bs-queue-item__title\">\n                  <a class=\"bs-navlink\" href=\"/mail/m/4812\">Receipt for invoice 20418</a>\n                  <span class=\"bs-queue-item__unread\">Unread</span>\n                </h3>\n                <p class=\"bs-queue-item__snippet\">Your payment was received and the invoice is now settled.</p>\n                <div class=\"bs-queue-item__meta\">\n                  <time class=\"bs-queue-item__time\" datetime=\"2026-08-02T07:30:00Z\">07:30</time>\n                </div>\n              </li>\n\n              <li class=\"bs-queue-item bs-queue-item--dense\">\n                <h3 class=\"bs-queue-item__title\">\n                  <a class=\"bs-navlink\" href=\"/mail/m/4803\">Notes from the migration review</a>\n                </h3>\n                <p class=\"bs-queue-item__snippet\">Mira Okonkwo: three decisions, and one that needs finance to weigh in.</p>\n                <div class=\"bs-queue-item__meta\">\n                  <time class=\"bs-queue-item__time\" datetime=\"2026-08-01T15:12:00Z\">Yesterday</time>\n                </div>\n              </li>\n            </ul>\n          </div>\n\n          <div class=\"bs-sidebar__main bs-stack bs-gap-5\">\n            <article aria-labelledby=\"mail-subject\">\n              <header class=\"bs-stack bs-gap-3\">\n                <h2 class=\"bs-text-h5 bs-flow-none\" id=\"mail-subject\">June ledger, the two accounts with no default</h2>\n\n                <div class=\"bs-cluster bs-cluster--between bs-gap-3\">\n                  <div class=\"bs-cluster bs-gap-3\">\n                    <span class=\"bs-avatar\" role=\"img\" aria-label=\"Rin Alvarez\">\n                      <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                    </span>\n                    <div>\n                      <p class=\"bs-flow-none\"><strong>Rin Alvarez</strong></p>\n                      <p class=\"bs-caption bs-flow-none\">rin.alvarez@example.com</p>\n                    </div>\n                  </div>\n                  <time class=\"bs-caption\" datetime=\"2026-08-02T09:41:00Z\">2 Aug, 09:41</time>\n                </div>\n\n                <dl class=\"bs-dl bs-dl--columns\" style=\"--bs-dl-term-inline: 5rem\">\n                  <dt class=\"bs-dl__term\">To</dt>\n                  <dd class=\"bs-dl__desc\">you, tomas.ferro@example.com</dd>\n                  <dt class=\"bs-dl__term\">Labels</dt>\n                  <dd class=\"bs-dl__desc\">\n                    <ul class=\"bs-tag-list\" aria-label=\"Labels on this message\">\n                      <li><span class=\"bs-tag bs-tag--pill\">Billing</span></li>\n                      <li><span class=\"bs-tag bs-tag--pill\">Migration</span></li>\n                    </ul>\n                  </dd>\n                </dl>\n              </header>\n\n              <hr class=\"bs-divider bs-mt-4\" />\n\n              <div class=\"bs-stack bs-gap-4 bs-mt-4\">\n                <p>\n                  The mapping is attached. Fourteen accounts have a currency default the importer can\n                  read straight off, so those rows fill themselves once the job runs.\n                </p>\n                <p>\n                  Two do not have one at all: Northline Freight and Ardsley Print. Neither has taken a\n                  payment since the column existed, so there is nothing to infer from. Somebody has to\n                  choose, and I would rather it was finance than me.\n                </p>\n\n                <!-- The quoted reply is a real disclosure. <details> holds the state, <summary> is\n                     the button, and the open attribute is what a screen reader announces, so\n                     nothing here needs a script and nothing breaks when one fails to load. -->\n                <div class=\"bs-accordion bs-accordion--flush\">\n                  <details class=\"bs-accordion__item\">\n                    <summary class=\"bs-accordion__summary\">Show quoted text</summary>\n                    <div class=\"bs-accordion__panel\">\n                      <p class=\"bs-caption\">On 1 Aug, Tomas Ferro wrote:</p>\n                      <p>\n                        The importer needs the account default before it can fill the column. Can you\n                        pull the mapping and say which accounts have nothing to fall back on?\n                      </p>\n                    </div>\n                  </details>\n                </div>\n              </div>\n\n              <div class=\"bs-cluster bs-gap-2 bs-mt-5\">\n                <button class=\"bs-btn bs-btn--primary bs-btn--sm\" type=\"button\">Reply</button>\n                <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Reply all</button>\n                <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Forward</button>\n                <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Archive</button>\n              </div>\n            </article>\n\n            <section aria-labelledby=\"mail-compose\">\n              <h2 class=\"bs-text-h6\" id=\"mail-compose\">New message</h2>\n              <form class=\"bs-composer bs-mt-3\">\n                <div class=\"bs-field\">\n                  <label class=\"bs-label\" for=\"mail-to\">To</label>\n                  <!-- A recipient is not the person filling the form in, so there is nothing about\n                       the user for a password manager to fill: autocomplete is off deliberately\n                       rather than by omission. -->\n                  <input class=\"bs-input\" type=\"email\" id=\"mail-to\" name=\"to\" multiple autocomplete=\"off\" />\n                </div>\n\n                <div class=\"bs-field\">\n                  <label class=\"bs-label\" for=\"mail-subject-field\">Subject</label>\n                  <input class=\"bs-input\" type=\"text\" id=\"mail-subject-field\" name=\"subject\" autocomplete=\"off\" />\n                </div>\n\n                <div class=\"bs-composer__field\">\n                  <label class=\"bs-composer__label\" for=\"mail-body\">Message</label>\n                  <textarea class=\"bs-textarea\" id=\"mail-body\" name=\"body\" rows=\"4\" aria-describedby=\"mail-compose-hint\"></textarea>\n                </div>\n\n                <div class=\"bs-composer__bar\">\n                  <div class=\"bs-composer__tools\">\n                    <button class=\"bs-composer__tool\" type=\"button\" aria-label=\"Attach a file\">\n                      <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\">\n                        <path d=\"M12.5 7.5l-4.6 4.6a2.9 2.9 0 0 1-4.1-4.1l5.3-5.3a1.9 1.9 0 0 1 2.7 2.7l-5.3 5.3a.9.9 0 0 1-1.3-1.3l4.6-4.6\" />\n                      </svg>\n                    </button>\n                  </div>\n                  <p class=\"bs-composer__hint\" id=\"mail-compose-hint\">Saved to drafts as you type.</p>\n                  <button class=\"bs-composer__send\" type=\"submit\">\n                    <span class=\"bs-composer__send-label\">Send</span>\n                  </button>\n                </div>\n              </form>\n            </section>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#email-client",
      "preview": "https://bare.style/preview/email-client.html"
    },
    {
      "id": "empty-state",
      "title": "Empty state",
      "description": "A framed empty panel that says what is missing, why the panel is blank, and gives two ways out of it.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "block",
      "tags": [
        "app",
        "empty",
        "data"
      ],
      "links": [
        "src/data/empty.css",
        "src/forms/button.css",
        "src/data/kbd.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-empty",
        "bs-empty--framed",
        "bs-empty__actions",
        "bs-empty__icon",
        "bs-empty__text",
        "bs-empty__title",
        "bs-kbd",
        "bs-kbd--sm",
        "bs-kbd-chord"
      ],
      "html": "<!-- A block starts at h2: it is dropped into a page it does not own and cannot know what level it\n     lands at. -->\n<div class=\"bs-empty bs-empty--framed\">\n  <svg class=\"bs-empty__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n    <path d=\"M3.5 7.5h17v12h-17z\" />\n    <path d=\"M3.5 7.5 6 4h12l2.5 3.5\" />\n    <path d=\"M9.5 11.5h5\" />\n  </svg>\n  <h2 class=\"bs-empty__title\">No scheduled jobs yet</h2>\n  <p class=\"bs-empty__text\">\n    A schedule runs a job on a timer and keeps the last 90 days of its runs. Nothing is scheduled in\n    this workspace, so there is nothing to show here. Import an existing crontab or start from a\n    blank schedule.\n  </p>\n  <div class=\"bs-empty__actions\">\n    <button class=\"bs-btn bs-btn--primary\" type=\"button\">New schedule</button>\n    <button class=\"bs-btn bs-btn--secondary\" type=\"button\">Import a crontab</button>\n  </div>\n  <!-- The shortcut is stated after the buttons, not instead of them: a keyboard hint is a second\n       route for people who already know the product, never the only one. -->\n  <p class=\"bs-empty__text\">\n    Or press <kbd class=\"bs-kbd-chord\"><kbd class=\"bs-kbd bs-kbd--sm\">Ctrl</kbd><kbd class=\"bs-kbd bs-kbd--sm\">K</kbd></kbd> and type \"schedule\".\n  </p>\n</div>",
      "href": "https://bare.style/templates#empty-state",
      "preview": "https://bare.style/preview/empty-state.html"
    },
    {
      "id": "error-page",
      "title": "Something went wrong page",
      "description": "A whole failure page: what broke, a reference the support desk can look up, and three routes back out of it.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "error",
        "empty",
        "full-page"
      ],
      "links": [
        "src/layout/center.css",
        "src/layout/stack.css",
        "src/data/empty.css",
        "src/forms/button.css",
        "src/prose/code.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-center",
        "bs-center--viewport",
        "bs-code",
        "bs-empty",
        "bs-empty__actions",
        "bs-empty__icon",
        "bs-empty__text",
        "bs-empty__title",
        "bs-flow-none",
        "bs-gap-5",
        "bs-mx-auto",
        "bs-navlink",
        "bs-navlink--prose",
        "bs-stack",
        "bs-text-caption",
        "bs-text-center"
      ],
      "html": "<main class=\"bs-center bs-center--viewport\" id=\"main\">\n  <!-- bs-center centres its own box, and this column is narrower than that box: without the auto\n       margins the page sits against the left edge of a centred container and reads off-centre. -->\n  <div class=\"bs-stack bs-gap-5 bs-mx-auto\" style=\"inline-size: min(34rem, 100%)\">\n    <!-- The empty block's block padding is sized for a panel inside a page. Here it IS the page, so\n         its trailing half opens a gap under the actions wide enough to read as a dropped element.\n         --bs-empty-pad-block is the documented hook for exactly this. -->\n    <div class=\"bs-empty\" style=\"--bs-empty-pad-block: var(--bs-space-5)\">\n      <svg class=\"bs-empty__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n        <path d=\"M12 3.5 22 20.5H2Z\" />\n        <path d=\"M12 9.5v5\" />\n        <path d=\"M12 17.4v.2\" />\n      </svg>\n      <!-- The heading says what happened, not a status number. A number is a reference, and the\n           reference is below where support can be told to read it out. -->\n      <h1 class=\"bs-empty__title\">This page could not be loaded</h1>\n      <p class=\"bs-empty__text\">\n        The workspace service answered, and then stopped part way through. Nothing you were working\n        on has been lost, and no change was saved from this attempt. Trying again usually works.\n      </p>\n      <div class=\"bs-empty__actions\">\n        <button class=\"bs-btn bs-btn--primary\" type=\"button\">Try again</button>\n        <a class=\"bs-btn bs-btn--secondary\" href=\"/\">Back to the dashboard</a>\n      </div>\n    </div>\n\n    <!-- bs-text-center centres the text inside the box, and a paragraph is capped at the measure,\n         so the box needs the auto margins or the centred text is centred off-centre. -->\n    <p class=\"bs-caption bs-text-center bs-mx-auto bs-flow-none\">\n      Quote this reference if you contact us:\n      <code class=\"bs-code\">e4f2-91c7-40b8</code>\n    </p>\n    <p class=\"bs-caption bs-text-center bs-mx-auto bs-flow-none\">\n      <a class=\"bs-navlink bs-navlink--prose bs-text-caption\" href=\"/status\">Check the service status</a>\n      or\n      <a class=\"bs-navlink bs-navlink--prose bs-text-caption\" href=\"/support\">write to support</a>.\n    </p>\n  </div>\n</main>",
      "href": "https://bare.style/templates#error-page",
      "preview": "https://bare.style/preview/error-page.html"
    },
    {
      "id": "faq",
      "title": "FAQ accordion",
      "description": "Six questions as native disclosures, one open at a time, with the route to a human underneath.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "faq",
        "marketing",
        "accordion",
        "disclosure"
      ],
      "links": [
        "src/app/accordion.css",
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-accordion",
        "bs-accordion--exclusive",
        "bs-accordion__item",
        "bs-accordion__panel",
        "bs-accordion__summary",
        "bs-accordion__title",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-mt-6",
        "bs-navlink",
        "bs-navlink--prose",
        "bs-py-9",
        "bs-stack",
        "bs-text-h2",
        "bs-wrap",
        "bs-wrap--md"
      ],
      "html": "<!-- THE CONTROL IS <details>, not a class and not a script. The open attribute is the state a\n     screen reader announces, the summary is already a button, and keyboard operation is the\n     platform's rather than ours. Nothing here has to be initialised, so nothing here breaks when a\n     script fails to load.\n\n     ONE OPEN AT A TIME IS THE name ATTRIBUTE. Details elements sharing a name form a radio group\n     and the browser closes the others; bs-accordion--exclusive only carries the look that belongs\n     with that behaviour. An engine too old for the attribute simply allows two panels open, which\n     is a lesser accordion rather than a broken page.\n\n     Each question is a real heading inside the summary, so the answers show up in a screen\n     reader's heading list instead of being six unlabelled buttons. h3 because a block does not\n     know what level it lands at and the section heading above it is the h2. -->\n<section class=\"bs-wrap bs-wrap--md bs-py-9\" aria-labelledby=\"faq-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">Questions</p>\n    <h2 class=\"bs-text-h2 bs-flow-none\" id=\"faq-heading\">Before you sign up</h2>\n  </div>\n\n  <div class=\"bs-accordion bs-accordion--exclusive bs-mt-6\">\n    <details class=\"bs-accordion__item\" name=\"faq\" open>\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">Where does the status page actually run?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          On separate infrastructure from the product it reports on, in a different region and with\n          a different provider. A status page that shares a failure domain with the service is a\n          status page that goes quiet exactly when it is needed.\n        </p>\n      </div>\n    </details>\n\n    <details class=\"bs-accordion__item\" name=\"faq\">\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">Can we use our own domain?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          Yes, from the Team plan. Point a subdomain at us with a CNAME record and the certificate\n          is issued and renewed for you. Most teams use status followed by their own domain.\n        </p>\n      </div>\n    </details>\n\n    <details class=\"bs-accordion__item\" name=\"faq\">\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">What happens to our history if we leave?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          Export every incident, update and subscriber list as JSON or CSV, at any time, without\n          asking us. The export is the same data the API returns, so a migration is a script rather\n          than a support ticket.\n        </p>\n      </div>\n    </details>\n\n    <details class=\"bs-accordion__item\" name=\"faq\">\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">Do subscribers count towards our plan?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          No. Only the people who can publish do. A page with forty thousand subscribers and two\n          responders is a Starter plan.\n        </p>\n      </div>\n    </details>\n\n    <details class=\"bs-accordion__item\" name=\"faq\">\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">Is there an API?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          Everything the dashboard can do, the API can do, including opening an incident and posting\n          an update. Most teams wire it to their alerting so the first update is published before\n          anyone has opened a browser.\n        </p>\n      </div>\n    </details>\n\n    <details class=\"bs-accordion__item\" name=\"faq\">\n      <summary class=\"bs-accordion__summary\">\n        <h3 class=\"bs-accordion__title\">How do we cancel?</h3>\n      </summary>\n      <div class=\"bs-accordion__panel\">\n        <p>\n          From the billing screen, in one click, with no call and no retention offer. The page keeps\n          answering in read-only mode until the end of the period you paid for.\n        </p>\n      </div>\n    </details>\n  </div>\n\n  <p class=\"bs-mt-6 bs-fg-secondary\">\n    Still unsure? <a class=\"bs-navlink bs-navlink--prose\" href=\"/contact\">Ask us directly</a> and a\n    person answers, usually the same day.\n  </p>\n</section>",
      "href": "https://bare.style/templates#faq",
      "preview": "https://bare.style/preview/faq.html"
    },
    {
      "id": "feature-grid",
      "title": "Feature grid",
      "description": "A section heading over six cards, each an icon, a short title and the sentence that says what the feature does.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "features",
        "marketing",
        "grid",
        "card"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/data/card.css",
        "src/data/icon.css",
        "src/utility/size.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-card",
        "bs-card__body",
        "bs-card__text",
        "bs-card__title",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--bare",
        "bs-h-full",
        "bs-icon",
        "bs-icon--lg",
        "bs-icon--muted",
        "bs-lead",
        "bs-mt-4",
        "bs-mt-8",
        "bs-py-9",
        "bs-stack",
        "bs-text-h2",
        "bs-wrap"
      ],
      "html": "<!-- The column count is a function of the grid's own width, not the viewport, so this section is\n     correct pasted into a full-bleed page and pasted into a narrow column, with no breakpoint\n     class and nothing to retune. One column at 320, three at 1440.\n\n     role=\"list\" is on the ul because bs-grid--bare removes the marker, and Safari drops list\n     semantics from VoiceOver the moment it does. Without it the count is lost. -->\n<section class=\"bs-wrap bs-py-9\" aria-labelledby=\"features-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">What you get</p>\n    <h2 class=\"bs-text-h2 bs-flow-none\" id=\"features-heading\">Everything an incident needs, and nothing it does not</h2>\n    <p class=\"bs-lead bs-fg-secondary bs-flow-none\">\n      Written for the person on call at two in the morning, who has one hand free and no patience\n      for a form.\n    </p>\n  </div>\n\n  <ul class=\"bs-grid bs-grid--bare bs-mt-8\" role=\"list\" style=\"--bs-grid-min: 20rem\">\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M12 3v4M12 17v4M3 12h4M17 12h4M6 6l2.8 2.8M15.2 15.2 18 18M18 6l-2.8 2.8M8.8 15.2 6 18\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">One page per incident</h3>\n          <p class=\"bs-card__text\">\n            Every update lands on the same public URL, so the link you sent at the start is still\n            the right link at the end.\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M4 6h16M4 12h16M4 18h10\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">Subscribers, not blast lists</h3>\n          <p class=\"bs-card__text\">\n            Customers pick the services they care about. Nobody gets paged about a region they have\n            never used.\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M12 4a8 8 0 1 0 8 8\" /><path d=\"M12 7v5l3.5 2\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">Timelines that hold up</h3>\n          <p class=\"bs-card__text\">\n            Every update keeps the time it was written, in the reader's own zone, so the review\n            afterwards is not an argument about the order of events.\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M5 5h14v14H5z\" /><path d=\"M9 10h6M9 14h4\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">Templates for the first minute</h3>\n          <p class=\"bs-card__text\">\n            Start from the wording your team already agreed on rather than writing it while the\n            graphs are still moving.\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M4 17V9M10 17V5M16 17v-6M20 17H4\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">Uptime, counted the same way twice</h3>\n          <p class=\"bs-card__text\">\n            One definition of downtime across the dashboard, the monthly report and the contract\n            your account team quotes from.\n          </p>\n        </div>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <div class=\"bs-card__body\">\n          <svg class=\"bs-icon bs-icon--lg bs-icon--muted\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <path d=\"M12 3 4 6.5v5c0 4.4 3.2 8.2 8 9.5 4.8-1.3 8-5.1 8-9.5v-5Z\" /><path d=\"m9 12 2.2 2.2L15.5 10\" />\n          </svg>\n          <h3 class=\"bs-card__title bs-mt-4\">Your domain, your certificate</h3>\n          <p class=\"bs-card__text\">\n            The status page answers on a hostname you own, so it keeps working on the day the rest\n            of the estate does not.\n          </p>\n        </div>\n      </article>\n    </li>\n  </ul>\n</section>",
      "href": "https://bare.style/templates#feature-grid",
      "preview": "https://bare.style/preview/feature-grid.html"
    },
    {
      "id": "footer",
      "title": "Footer with columns",
      "description": "Four link columns, a short brand note, the legal row, and three icon-only links that carry their own names.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "footer",
        "marketing",
        "navigation",
        "grid"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/nav/navlink.css",
        "src/data/divider.css",
        "src/data/icon.css",
        "src/forms/button.css",
        "src/app/control-icon-button.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css",
        "src/utility/border.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-border-t-1",
        "bs-btn",
        "bs-caption",
        "bs-cluster",
        "bs-cluster--bare",
        "bs-cluster--between",
        "bs-divider",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-4",
        "bs-gap-7",
        "bs-grid",
        "bs-icon",
        "bs-icon-btn",
        "bs-icon-btn--bare",
        "bs-icon-btn-row",
        "bs-measure",
        "bs-mt-2",
        "bs-mt-5",
        "bs-mt-8",
        "bs-navlink",
        "bs-navlink--muted",
        "bs-py-8",
        "bs-stack",
        "bs-stack--bare",
        "bs-text-h5",
        "bs-weight-heading",
        "bs-weight-medium",
        "bs-wrap"
      ],
      "html": "<!-- FOUR NAVIGATION LANDMARKS NEED FOUR NAMES. A page with a top bar and a footer has several\n     <nav> elements, and \"navigation\" announced five times tells a screen reader user nothing. Each\n     column's nav points aria-labelledby at the heading already above it, so the name is the visible\n     one and cannot drift.\n\n     ICON-ONLY LINKS CARRY aria-label. An SVG has no accessible name, so a link containing only one\n     is announced as its own URL. The mark itself is aria-hidden: the label is the name, and both\n     being read would say the same thing twice.\n\n     THE LINK ORDER IS PART OF THE MARKUP HERE. bs-icon-btn shrinks the padding and the height that\n     bs-btn sets, and it does it with declarations of the same weight, so the file that loads second\n     wins: with control-icon-button before button the three marks render as 70x52 boxes with 24px of\n     inline padding and their glyphs land 24px inside the column's start edge. button.css is listed\n     first so the smaller control is the one that lands.\n\n     THEY ARE ALSO NOT bs-navlink. That primitive guarantees a 28px line box and nothing about its\n     width, which is right for a link with words in it and leaves an icon-only one about 15px wide,\n     under the SC 2.5.8 floor. bs-icon-btn is the control whose whole label is a glyph: it keeps the\n     visible box small and reaches the target out past it with an overlay, and bs-icon-btn-row sets\n     the gap those overlays need so two neighbours do not fight over the middle. -->\n<!-- A rule along the block start. The footer sits on the page surface with no fill of its own, so\n     on a dark page there is nothing between the last section and the legal row and the block floats\n     in the void. -->\n<footer class=\"bs-wrap bs-py-8 bs-border-t-1\">\n  <div class=\"bs-grid bs-gap-7\">\n    <div class=\"bs-stack bs-gap-3\">\n      <p class=\"bs-text-h5 bs-weight-heading bs-flow-none\">Northpoint Status</p>\n      <p class=\"bs-caption bs-fg-secondary bs-measure bs-flow-none\">\n        Incident pages, subscriber updates and an uptime record your account team can quote from.\n      </p>\n      <div class=\"bs-icon-btn-row bs-mt-2\">\n        <a class=\"bs-btn bs-icon-btn bs-icon-btn--bare\" href=\"/rss.xml\" aria-label=\"Subscribe to the status feed\">\n          <svg class=\"bs-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"M5 19a1 1 0 1 0 0-2 1 1 0 0 0 0 2M5 12a7 7 0 0 1 7 7M5 5a14 14 0 0 1 14 14\" />\n          </svg>\n        </a>\n        <a class=\"bs-btn bs-icon-btn bs-icon-btn--bare\" href=\"/community\" aria-label=\"Community forum\">\n          <svg class=\"bs-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"M4.5 5.5h15A1.5 1.5 0 0 1 21 7v8a1.5 1.5 0 0 1-1.5 1.5H10l-4.2 3.1V16.5H4.5A1.5 1.5 0 0 1 3 15V7a1.5 1.5 0 0 1 1.5-1.5Z\" />\n          </svg>\n        </a>\n        <a class=\"bs-btn bs-icon-btn bs-icon-btn--bare\" href=\"/source\" aria-label=\"Source code repository\">\n          <svg class=\"bs-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"m9 18-5-6 5-6M15 6l5 6-5 6\" />\n          </svg>\n        </a>\n      </div>\n    </div>\n\n    <div class=\"bs-stack bs-gap-3\">\n      <h2 class=\"bs-caption bs-weight-medium bs-flow-none\" id=\"footer-product\">Product</h2>\n      <nav aria-labelledby=\"footer-product\">\n        <ul class=\"bs-stack bs-stack--bare bs-gap-2\" role=\"list\">\n          <li><a class=\"bs-navlink\" href=\"/features\">Features</a></li>\n          <li><a class=\"bs-navlink\" href=\"/pricing\">Pricing</a></li>\n          <li><a class=\"bs-navlink\" href=\"/integrations\">Integrations</a></li>\n          <li><a class=\"bs-navlink\" href=\"/changelog\">Changelog</a></li>\n        </ul>\n      </nav>\n    </div>\n\n    <div class=\"bs-stack bs-gap-3\">\n      <h2 class=\"bs-caption bs-weight-medium bs-flow-none\" id=\"footer-docs\">Documentation</h2>\n      <nav aria-labelledby=\"footer-docs\">\n        <ul class=\"bs-stack bs-stack--bare bs-gap-2\" role=\"list\">\n          <li><a class=\"bs-navlink\" href=\"/docs\">Getting started</a></li>\n          <li><a class=\"bs-navlink\" href=\"/docs/api\">API reference</a></li>\n          <li><a class=\"bs-navlink\" href=\"/docs/webhooks\">Webhooks</a></li>\n          <li><a class=\"bs-navlink\" href=\"/docs/import\">Moving your history</a></li>\n        </ul>\n      </nav>\n    </div>\n\n    <div class=\"bs-stack bs-gap-3\">\n      <h2 class=\"bs-caption bs-weight-medium bs-flow-none\" id=\"footer-company\">Company</h2>\n      <nav aria-labelledby=\"footer-company\">\n        <ul class=\"bs-stack bs-stack--bare bs-gap-2\" role=\"list\">\n          <li><a class=\"bs-navlink\" href=\"/about\">About</a></li>\n          <li><a class=\"bs-navlink\" href=\"/blog\">Blog</a></li>\n          <li><a class=\"bs-navlink\" href=\"/jobs\">Jobs</a></li>\n          <li><a class=\"bs-navlink\" href=\"/contact\">Contact</a></li>\n        </ul>\n      </nav>\n    </div>\n  </div>\n\n  <div class=\"bs-divider bs-mt-8\" role=\"separator\"></div>\n\n  <div class=\"bs-cluster bs-cluster--between bs-gap-4 bs-mt-5\">\n    <p class=\"bs-caption bs-fg-muted bs-flow-none\">Northpoint Status is a product of Northpoint Software.</p>\n    <nav aria-label=\"Legal\">\n      <ul class=\"bs-cluster bs-cluster--bare bs-gap-4\" role=\"list\">\n        <li><a class=\"bs-navlink bs-navlink--muted\" href=\"/privacy\">Privacy</a></li>\n        <li><a class=\"bs-navlink bs-navlink--muted\" href=\"/terms\">Terms</a></li>\n        <li><a class=\"bs-navlink bs-navlink--muted\" href=\"/security\">Security</a></li>\n      </ul>\n    </nav>\n  </div>\n</footer>",
      "href": "https://bare.style/templates#footer",
      "preview": "https://bare.style/preview/footer.html"
    },
    {
      "id": "forgot-password",
      "title": "Forgot password screen",
      "description": "The screen that asks for one address and sends a reset link, with the expiry stated and a route back to sign in.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "password-reset",
        "form",
        "full-page"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-form.css",
        "src/forms/input.css",
        "src/forms/button.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-form",
        "bs-auth-form__actions",
        "bs-auth-form__field",
        "bs-auth-form__hint",
        "bs-auth-form__label",
        "bs-auth-form__note",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__head",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__subtitle",
        "bs-auth__title",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-input"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <main class=\"bs-auth__card\">\n      <div class=\"bs-auth__head\">\n        <h1 class=\"bs-auth__title\">Reset your password</h1>\n        <p class=\"bs-auth__subtitle\">Give us the address on the account and we will send a link that sets a new one.</p>\n      </div>\n\n      <form class=\"bs-auth-form\" method=\"post\" action=\"/password/reset\" novalidate>\n        <div class=\"bs-auth-form__field\">\n          <label class=\"bs-auth-form__label\" for=\"reset-email\">Email</label>\n          <input\n            class=\"bs-input\"\n            id=\"reset-email\"\n            name=\"email\"\n            type=\"email\"\n            autocomplete=\"username\"\n            inputmode=\"email\"\n            required\n            autofocus\n            aria-describedby=\"reset-email-hint\"\n          />\n          <p class=\"bs-auth-form__hint\" id=\"reset-email-hint\">The link works once and expires after fifteen minutes.</p>\n        </div>\n\n        <div class=\"bs-auth-form__actions\">\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"submit\">Send the reset link</button>\n        </div>\n\n        <!-- The same sentence whether the address exists or not. A reset form that says \"no such\n             account\" is an account-enumeration oracle, and saying so here is cheaper than a page\n             of guidance nobody reads. -->\n        <p class=\"bs-auth-form__note\">If that address has an account, the link is on its way. We do not say either way.</p>\n      </form>\n    </main>\n\n    <p class=\"bs-auth__alt\">Remembered it? <a href=\"/signin\">Back to sign in</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#forgot-password",
      "preview": "https://bare.style/preview/forgot-password.html"
    },
    {
      "id": "hero",
      "title": "Hero with a call to action",
      "description": "A landing section head: eyebrow, headline, one paragraph, the action that matters and a quieter second one.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "hero",
        "marketing",
        "cta",
        "landing"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/forms/button.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--subtle",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-cluster",
        "bs-cluster--center",
        "bs-display",
        "bs-eyebrow",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-gap-5",
        "bs-icon",
        "bs-icon--sm",
        "bs-lead",
        "bs-mt-2",
        "bs-py-9",
        "bs-stack",
        "bs-stack--center",
        "bs-text-center",
        "bs-wrap"
      ],
      "html": "<!-- The measure caps come from the type classes rather than from the layout. bs-display and bs-lead\n     each carry their own max-inline-size, so the headline breaks at a heading measure and the\n     paragraph at a longer reading one, and neither has to be told the width of the section it\n     landed in. Centring is then the stack's job and works at every width without a breakpoint. -->\n<section class=\"bs-wrap bs-py-9\" aria-labelledby=\"hero-heading\">\n  <div class=\"bs-stack bs-stack--center bs-gap-5 bs-text-center\">\n    <p class=\"bs-eyebrow bs-flow-none\">Status and incident reporting</p>\n\n    <h2 class=\"bs-display bs-flow-none\" id=\"hero-heading\">\n      Tell customers what happened before they have to ask\n    </h2>\n\n    <p class=\"bs-lead bs-fg-secondary bs-flow-none\">\n      One page per incident, a feed anyone can subscribe to, and a history that still reads\n      honestly a year after the fire is out.\n    </p>\n\n    <div class=\"bs-cluster bs-cluster--center bs-gap-3 bs-mt-2\">\n      <a class=\"bs-btn bs-btn--primary\" href=\"/signup\">\n        Start free\n        <!-- Decorative: the link already says where it goes, so the arrow is hidden rather than\n             given a name a screen reader would read after the word it decorates. -->\n        <svg class=\"bs-icon bs-icon--sm\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"M3 8h9M8.5 4.5 12 8l-3.5 3.5\" />\n        </svg>\n      </a>\n      <a class=\"bs-btn bs-btn--secondary\" href=\"/demo\">See a live status page</a>\n    </div>\n\n    <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n      <span class=\"bs-badge bs-badge--subtle\">No card</span>\n      Free for one page and three responders. Cancel from the dashboard.\n    </p>\n  </div>\n</section>",
      "href": "https://bare.style/templates#hero",
      "preview": "https://bare.style/preview/hero.html"
    },
    {
      "id": "inbox-queue",
      "title": "Inbox queue",
      "description": "A work queue beside its folders: status, subject, snippet, who has it, when it moved, and the actions on each row.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "inbox",
        "list",
        "data",
        "full-page"
      ],
      "links": [
        "src/nav/navlink.css",
        "src/layout/container.css",
        "src/layout/sidebar.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/nav/sidebar-nav.css",
        "src/app/collab-queue-item.css",
        "src/app/collab-assignee.css",
        "src/data/avatar.css",
        "src/forms/button.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        1440
      ],
      "classes": [
        "bs-assignee",
        "bs-assignee--sm",
        "bs-assignee--unassigned",
        "bs-assignee__avatar",
        "bs-assignee__name",
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-btn",
        "bs-btn--ghost",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-flow-none",
        "bs-gap-3",
        "bs-gap-5",
        "bs-navlink",
        "bs-queue-item",
        "bs-queue-item--unread",
        "bs-queue-item__actions",
        "bs-queue-item__meta",
        "bs-queue-item__snippet",
        "bs-queue-item__status",
        "bs-queue-item__status--closed",
        "bs-queue-item__status--escalated",
        "bs-queue-item__status--open",
        "bs-queue-item__status--snoozed",
        "bs-queue-item__status-mark",
        "bs-queue-item__time",
        "bs-queue-item__title",
        "bs-queue-item__unread",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-sidenav",
        "bs-sidenav__group",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-sidenav__list--nested",
        "bs-sidenav__title",
        "bs-stack",
        "bs-stack--bare",
        "bs-stack--flush",
        "bs-text-h3",
        "bs-wrap"
      ],
      "html": "<main class=\"bs-wrap\" id=\"main\">\n  <div class=\"bs-stack bs-gap-5\">\n    <header class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">Support inbox</h1>\n      <p class=\"bs-caption bs-flow-none\">42 open, 6 escalated</p>\n    </header>\n\n    <div class=\"bs-sidebar\">\n      <!-- The folder list comes first in the DOM because it comes first on a phone, where the\n           layout is one column and the reading order is the DOM order. -->\n      <div class=\"bs-sidebar__side\">\n        <nav class=\"bs-sidenav\" aria-labelledby=\"inbox-folders\">\n          <p class=\"bs-sidenav__title\" id=\"inbox-folders\">Folders</p>\n          <ul class=\"bs-sidenav__list\">\n            <li><a class=\"bs-sidenav__link\" href=\"/inbox\" aria-current=\"page\">All open</a></li>\n            <li><a class=\"bs-sidenav__link\" href=\"/inbox/mine\">Assigned to me</a></li>\n            <li><a class=\"bs-sidenav__link\" href=\"/inbox/unassigned\">Unassigned</a></li>\n            <li>\n              <p class=\"bs-sidenav__group\" id=\"inbox-states\">By state</p>\n              <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"inbox-states\">\n                <li><a class=\"bs-sidenav__link\" href=\"/inbox/escalated\">Escalated</a></li>\n                <li><a class=\"bs-sidenav__link\" href=\"/inbox/snoozed\">Snoozed</a></li>\n                <li><a class=\"bs-sidenav__link\" href=\"/inbox/closed\">Closed this week</a></li>\n              </ul>\n            </li>\n          </ul>\n        </nav>\n      </div>\n\n      <div class=\"bs-sidebar__main\">\n        <!-- Removing the marker removes the list semantics in Safari, so the role is restated. -->\n        <ul class=\"bs-stack bs-stack--bare bs-stack--flush\" role=\"list\">\n          <li class=\"bs-queue-item bs-queue-item--unread\">\n            <span class=\"bs-queue-item__status bs-queue-item__status--escalated\">\n              <span class=\"bs-queue-item__status-mark\" aria-hidden=\"true\"></span>\n              Escalated\n            </span>\n            <!-- Only the subject is a link. A row-sized anchor swallows the buttons beside it and\n                 announces as one link whose name is the snippet and the timestamp as well.\n                 bs-navlink carries the 24px target floor a bare anchor in a line box does not. -->\n            <h2 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/t/1842\">Refund not applied after the plan upgrade</a>\n              <span class=\"bs-queue-item__unread\">Unread</span>\n            </h2>\n            <p class=\"bs-queue-item__snippet\">\n              Charged twice on the 3rd, and the second charge is still showing as pending on my statement.\n            </p>\n            <div class=\"bs-queue-item__meta\">\n              <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                <span class=\"bs-assignee__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                  </span>\n                </span>\n                <span class=\"bs-assignee__name\">Rin Alvarez</span>\n              </button>\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-01T14:22:07Z\">14:22</time>\n            </div>\n            <div class=\"bs-queue-item__actions\">\n              <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Snooze</button>\n              <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Resolve</button>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item bs-queue-item--unread\">\n            <span class=\"bs-queue-item__status bs-queue-item__status--open\">\n              <span class=\"bs-queue-item__status-mark\" aria-hidden=\"true\"></span>\n              Open\n            </span>\n            <h2 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/t/1839\">Export finishes but the file is empty</a>\n              <span class=\"bs-queue-item__unread\">Unread</span>\n            </h2>\n            <p class=\"bs-queue-item__snippet\">\n              The invoice export says it completed, and the download is a header row and nothing else.\n            </p>\n            <div class=\"bs-queue-item__meta\">\n              <button class=\"bs-assignee bs-assignee--sm bs-assignee--unassigned\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                <span class=\"bs-assignee__avatar\" aria-hidden=\"true\"></span>\n                <span class=\"bs-assignee__name\">Unassigned</span>\n              </button>\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-01T13:58:00Z\">13:58</time>\n            </div>\n            <div class=\"bs-queue-item__actions\">\n              <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Snooze</button>\n              <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Resolve</button>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item\">\n            <span class=\"bs-queue-item__status bs-queue-item__status--open\">\n              <span class=\"bs-queue-item__status-mark\" aria-hidden=\"true\"></span>\n              Open\n            </span>\n            <h2 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/t/1831\">Can we move billing to a purchase order</a>\n            </h2>\n            <p class=\"bs-queue-item__snippet\">\n              Finance will not approve a card for the annual plan. We need an invoice with 30 day terms.\n            </p>\n            <div class=\"bs-queue-item__meta\">\n              <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                <span class=\"bs-assignee__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Tomas Ferro\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TF</span>\n                  </span>\n                </span>\n                <span class=\"bs-assignee__name\">Tomas Ferro</span>\n              </button>\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-01T11:04:00Z\">11:04</time>\n            </div>\n            <div class=\"bs-queue-item__actions\">\n              <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Snooze</button>\n              <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Resolve</button>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item\">\n            <span class=\"bs-queue-item__status bs-queue-item__status--snoozed\">\n              <span class=\"bs-queue-item__status-mark\" aria-hidden=\"true\"></span>\n              Snoozed\n            </span>\n            <h2 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/t/1822\">Webhook signature fails on retries only</a>\n            </h2>\n            <p class=\"bs-queue-item__snippet\">\n              Waiting on the customer to confirm which secret their retry worker is signing with.\n            </p>\n            <div class=\"bs-queue-item__meta\">\n              <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                <span class=\"bs-assignee__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Mira Okonkwo\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">MO</span>\n                  </span>\n                </span>\n                <span class=\"bs-assignee__name\">Mira Okonkwo</span>\n              </button>\n              <time class=\"bs-queue-item__time\" datetime=\"2026-07-31T16:40:00Z\">Yesterday</time>\n            </div>\n            <div class=\"bs-queue-item__actions\">\n              <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Wake</button>\n              <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Resolve</button>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item\">\n            <span class=\"bs-queue-item__status bs-queue-item__status--closed\">\n              <span class=\"bs-queue-item__status-mark\" aria-hidden=\"true\"></span>\n              Closed\n            </span>\n            <h2 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/t/1817\">Seat count wrong after removing a member</a>\n            </h2>\n            <p class=\"bs-queue-item__snippet\">\n              Resolved by a reconciliation run. The seat count and the invoice now agree.\n            </p>\n            <div class=\"bs-queue-item__meta\">\n              <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                <span class=\"bs-assignee__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                  </span>\n                </span>\n                <span class=\"bs-assignee__name\">Rin Alvarez</span>\n              </button>\n              <time class=\"bs-queue-item__time\" datetime=\"2026-07-31T09:12:00Z\">Yesterday</time>\n            </div>\n            <div class=\"bs-queue-item__actions\">\n              <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Reopen</button>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#inbox-queue",
      "preview": "https://bare.style/preview/inbox-queue.html"
    },
    {
      "id": "live-chat",
      "title": "Live chat",
      "description": "A conversation list beside a thread: day separators, an unread marker, delivery states, a typing line, and a composer with an attachment.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "chat",
        "messaging",
        "thread",
        "list",
        "composer",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/layout/sidebar.css",
        "src/app/collab-queue-item.css",
        "src/app/collab-thread.css",
        "src/app/collab-message.css",
        "src/app/collab-composer.css",
        "src/app/collab-presence-dot.css",
        "src/data/avatar.css",
        "src/data/divider.css",
        "src/forms/textarea.css",
        "src/forms/button.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-btn",
        "bs-btn--ghost",
        "bs-btn--sm",
        "bs-cluster",
        "bs-cluster--between",
        "bs-composer",
        "bs-composer__attachment",
        "bs-composer__attachment-name",
        "bs-composer__attachment-remove",
        "bs-composer__attachment-size",
        "bs-composer__attachments",
        "bs-composer__bar",
        "bs-composer__field",
        "bs-composer__hint",
        "bs-composer__label",
        "bs-composer__send",
        "bs-composer__send-label",
        "bs-composer__tool",
        "bs-composer__tools",
        "bs-divider",
        "bs-flow-none",
        "bs-gap-3",
        "bs-gap-4",
        "bs-gap-5",
        "bs-message",
        "bs-message--consecutive",
        "bs-message--failed",
        "bs-message--own",
        "bs-message--pending",
        "bs-message--system",
        "bs-message__author",
        "bs-message__avatar",
        "bs-message__body",
        "bs-message__foot",
        "bs-message__head",
        "bs-message__status",
        "bs-message__time",
        "bs-mt-2",
        "bs-navlink",
        "bs-presence",
        "bs-presence--online",
        "bs-presence__dot",
        "bs-presence__label",
        "bs-queue-item",
        "bs-queue-item--dense",
        "bs-queue-item--selected",
        "bs-queue-item--unread",
        "bs-queue-item__meta",
        "bs-queue-item__snippet",
        "bs-queue-item__time",
        "bs-queue-item__title",
        "bs-queue-item__unread",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-stack",
        "bs-stack--bare",
        "bs-stack--flush",
        "bs-text-h3",
        "bs-text-h6",
        "bs-textarea",
        "bs-thread",
        "bs-thread__divider",
        "bs-thread__label",
        "bs-thread__list",
        "bs-thread__more",
        "bs-thread__typing",
        "bs-thread__typing-dots",
        "bs-thread__unread",
        "bs-wrap"
      ],
      "html": "<main class=\"bs-wrap\" id=\"main\">\n  <div class=\"bs-stack bs-gap-5\">\n    <h1 class=\"bs-text-h3 bs-flow-none\">Messages</h1>\n\n    <!-- The conversation list is first in the DOM because it is first on a phone, where the layout\n         is one column and the reading order is the DOM order. --bs-sidebar-side is the width hook\n         the layout component documents: a conversation row carries a name, a snippet and a time,\n         which does not fit the 16rem default. -->\n    <div class=\"bs-sidebar\" style=\"--bs-sidebar-side: 20rem\">\n      <div class=\"bs-sidebar__side\">\n        <h2 class=\"bs-text-h6\" id=\"chat-conversations\">Conversations</h2>\n        <!-- Removing the marker removes the list semantics in Safari, so the role is restated. -->\n        <ul class=\"bs-stack bs-stack--bare bs-stack--flush bs-mt-2\" role=\"list\" aria-labelledby=\"chat-conversations\">\n          <li class=\"bs-queue-item bs-queue-item--dense bs-queue-item--selected\">\n            <h3 class=\"bs-queue-item__title\">\n              <!-- Only the name is a link. A row-sized anchor announces as one link whose name is\n                   the snippet and the timestamp as well. -->\n              <a class=\"bs-navlink\" href=\"/messages/rin\" aria-current=\"page\">Rin Alvarez</a>\n            </h3>\n            <p class=\"bs-queue-item__snippet\">I have the mapping, sending it over now.</p>\n            <div class=\"bs-queue-item__meta\">\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-02T09:41:00Z\">09:41</time>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item bs-queue-item--dense bs-queue-item--unread\">\n            <h3 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/messages/billing-team\">Billing team</a>\n              <span class=\"bs-queue-item__unread\">3 unread</span>\n            </h3>\n            <p class=\"bs-queue-item__snippet\">Tomas: the sandbox key rotates tonight, so hold the migration.</p>\n            <div class=\"bs-queue-item__meta\">\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-02T09:02:00Z\">09:02</time>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item bs-queue-item--dense\">\n            <h3 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/messages/mira\">Mira Okonkwo</a>\n            </h3>\n            <p class=\"bs-queue-item__snippet\">Thanks, that clears the last blocker on my side.</p>\n            <div class=\"bs-queue-item__meta\">\n              <time class=\"bs-queue-item__time\" datetime=\"2026-08-01T16:28:00Z\">Yesterday</time>\n            </div>\n          </li>\n\n          <li class=\"bs-queue-item bs-queue-item--dense\">\n            <h3 class=\"bs-queue-item__title\">\n              <a class=\"bs-navlink\" href=\"/messages/support\">Support rota</a>\n            </h3>\n            <p class=\"bs-queue-item__snippet\">Kai: I am on until six, then it is back to the queue.</p>\n            <div class=\"bs-queue-item__meta\">\n              <time class=\"bs-queue-item__time\" datetime=\"2026-07-31T11:05:00Z\">Friday</time>\n            </div>\n          </li>\n        </ul>\n      </div>\n\n      <section class=\"bs-sidebar__main bs-stack bs-gap-4\" aria-labelledby=\"chat-thread-title\">\n        <header class=\"bs-cluster bs-cluster--between bs-gap-3\">\n          <div class=\"bs-cluster bs-gap-3\">\n            <span class=\"bs-avatar\" role=\"img\" aria-label=\"Rin Alvarez\">\n              <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n            </span>\n            <div>\n              <h2 class=\"bs-text-h6 bs-flow-none\" id=\"chat-thread-title\">Rin Alvarez</h2>\n              <!-- Four states, four shapes, and the word beside them: a dot on its own is unreadable\n                   to anyone who cannot separate the hues at 8px. -->\n              <span class=\"bs-presence bs-presence--online\">\n                <span class=\"bs-presence__dot\" aria-hidden=\"true\"></span>\n                <span class=\"bs-presence__label\">Online</span>\n              </span>\n            </div>\n          </div>\n          <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Details</button>\n        </header>\n\n        <hr class=\"bs-divider\" />\n\n        <!-- No bs-thread--scroll here. This template IS the page, so the page is the scroller;\n             adding a second one would clip the delivery states below it and put two scrollbars on a\n             phone. A product dropping this thread into a fixed application shell adds the modifier\n             there, where a bounded box is what the shell already provides. -->\n        <div class=\"bs-thread\">\n          <button class=\"bs-thread__more\" type=\"button\">Show 24 earlier messages</button>\n\n          <div class=\"bs-thread__divider\"><span class=\"bs-thread__label\">Yesterday</span></div>\n\n          <ol class=\"bs-thread__list\" role=\"list\">\n            <li>\n              <article class=\"bs-message\">\n                <div class=\"bs-message__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                  </span>\n                </div>\n                <header class=\"bs-message__head\">\n                  <span class=\"bs-message__author\">Rin Alvarez</span>\n                  <time class=\"bs-message__time\" datetime=\"2026-08-01T16:04:00Z\">16:04</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>Billing granted read access, so the June rows can be filled from the account default.</p>\n                </div>\n              </article>\n            </li>\n\n            <li>\n              <!-- A system notice is centred and has no avatar, because attributing it to a person\n                   would be a lie. -->\n              <article class=\"bs-message bs-message--system\">\n                <div class=\"bs-message__body\">\n                  <p>Mira Okonkwo joined the conversation</p>\n                </div>\n              </article>\n            </li>\n          </ol>\n\n          <!-- role=\"separator\" with a label rather than a bare line: where the reader stopped is the\n               most useful landmark in a long thread and the one most often left out of the\n               accessibility tree. -->\n          <div class=\"bs-thread__unread\" role=\"separator\" aria-label=\"2 unread messages below\">\n            <span class=\"bs-thread__label\">2 unread</span>\n          </div>\n\n          <div class=\"bs-thread__divider\"><span class=\"bs-thread__label\">Today</span></div>\n\n          <ol class=\"bs-thread__list\" role=\"list\">\n            <li>\n              <article class=\"bs-message\">\n                <div class=\"bs-message__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                  </span>\n                </div>\n                <header class=\"bs-message__head\">\n                  <span class=\"bs-message__author\">Rin Alvarez</span>\n                  <time class=\"bs-message__time\" datetime=\"2026-08-02T09:38:00Z\">09:38</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>I have the mapping. It is fourteen accounts, and two of them have no default at all.</p>\n                </div>\n              </article>\n            </li>\n\n            <li>\n              <!-- Same author again, so the avatar and the header come out of the DOM rather than\n                   being hidden: a hidden header is not announced, and a screen reader then hears a\n                   run of messages with no idea who sent them. The timestamp stays. -->\n              <article class=\"bs-message bs-message--consecutive\">\n                <header class=\"bs-message__head\">\n                  <time class=\"bs-message__time\" datetime=\"2026-08-02T09:41:00Z\">09:41</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>Sending it over now.</p>\n                </div>\n              </article>\n            </li>\n\n            <li>\n              <article class=\"bs-message bs-message--own\">\n                <div class=\"bs-message__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"You\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">JD</span>\n                  </span>\n                </div>\n                <header class=\"bs-message__head\">\n                  <span class=\"bs-message__author\">You</span>\n                  <time class=\"bs-message__time\" datetime=\"2026-08-02T09:44:00Z\">09:44</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>Got it. I will fill the two blanks by hand and note them on the task.</p>\n                </div>\n                <footer class=\"bs-message__foot\">\n                  <span class=\"bs-message__status\">Read 09:45</span>\n                </footer>\n              </article>\n            </li>\n\n            <li>\n              <!-- Sent, not yet acknowledged. The dimming is one channel and the word is the other,\n                   because opacity is not information. -->\n              <article class=\"bs-message bs-message--own bs-message--pending\">\n                <div class=\"bs-message__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"You\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">JD</span>\n                  </span>\n                </div>\n                <header class=\"bs-message__head\">\n                  <span class=\"bs-message__author\">You</span>\n                  <time class=\"bs-message__time\" datetime=\"2026-08-02T09:47:00Z\">09:47</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>One more thing, is the sandbox key still rotating tonight?</p>\n                </div>\n                <footer class=\"bs-message__foot\">\n                  <span class=\"bs-message__status\">Sending</span>\n                </footer>\n              </article>\n            </li>\n\n            <li>\n              <!-- It did not send, and the row says so in words as well as in the edge: the reader\n                   who cannot see the edge is exactly the reader who will assume it sent. -->\n              <article class=\"bs-message bs-message--own bs-message--failed\">\n                <div class=\"bs-message__avatar\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"You\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">JD</span>\n                  </span>\n                </div>\n                <header class=\"bs-message__head\">\n                  <span class=\"bs-message__author\">You</span>\n                  <time class=\"bs-message__time\" datetime=\"2026-08-02T09:48:00Z\">09:48</time>\n                </header>\n                <div class=\"bs-message__body\">\n                  <p>Attaching the sheet so you have the two blanks in front of you.</p>\n                </div>\n                <footer class=\"bs-message__foot\">\n                  <span class=\"bs-message__status\">Not delivered</span>\n                  <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Try again</button>\n                </footer>\n              </article>\n            </li>\n          </ol>\n\n          <p class=\"bs-thread__typing\" aria-live=\"polite\">\n            <span class=\"bs-thread__typing-dots\" aria-hidden=\"true\">\n              <span></span><span></span><span></span>\n            </span>\n            Rin is typing\n          </p>\n        </div>\n\n        <form class=\"bs-composer\">\n          <ul class=\"bs-composer__attachments\" role=\"list\">\n            <li class=\"bs-composer__attachment\">\n              <span class=\"bs-composer__attachment-name\">june-account-defaults.csv</span>\n              <span class=\"bs-composer__attachment-size\">18 kB</span>\n              <button class=\"bs-composer__attachment-remove\" type=\"button\" aria-label=\"Remove june-account-defaults.csv\">\n                <svg viewBox=\"0 0 12 12\" aria-hidden=\"true\" focusable=\"false\">\n                  <path d=\"M3 3l6 6M9 3l-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n                </svg>\n              </button>\n            </li>\n          </ul>\n\n          <div class=\"bs-composer__field\">\n            <label class=\"bs-composer__label\" for=\"chat-message\">Message Rin Alvarez</label>\n            <textarea class=\"bs-textarea\" id=\"chat-message\" name=\"message\" rows=\"2\" aria-describedby=\"chat-hint\"></textarea>\n          </div>\n\n          <div class=\"bs-composer__bar\">\n            <div class=\"bs-composer__tools\">\n              <button class=\"bs-composer__tool\" type=\"button\" aria-label=\"Attach a file\">\n                <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\">\n                  <path d=\"M12.5 7.5l-4.6 4.6a2.9 2.9 0 0 1-4.1-4.1l5.3-5.3a1.9 1.9 0 0 1 2.7 2.7l-5.3 5.3a.9.9 0 0 1-1.3-1.3l4.6-4.6\" />\n                </svg>\n              </button>\n              <button class=\"bs-composer__tool\" type=\"button\" aria-label=\"Mention someone\">\n                <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\">\n                  <path d=\"M10.5 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0Zm0 0v1.1a1.9 1.9 0 0 0 3.8 0V8a6.3 6.3 0 1 0-2.6 5.1\" />\n                </svg>\n              </button>\n            </div>\n            <p class=\"bs-composer__hint\" id=\"chat-hint\">Enter sends. Shift and Enter make a line.</p>\n            <button class=\"bs-composer__send\" type=\"submit\">\n              <span class=\"bs-composer__send-label\">Send</span>\n            </button>\n          </div>\n        </form>\n      </section>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#live-chat",
      "preview": "https://bare.style/preview/live-chat.html"
    },
    {
      "id": "locked",
      "title": "Account locked screen",
      "description": "The refusal state: why sign-in stopped, when it opens again, the two ways out, and where to go if neither works.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "status",
        "locked",
        "full-page"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-state.css",
        "src/forms/button.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-state",
        "bs-auth-state--locked",
        "bs-auth-state--panel",
        "bs-auth-state__actions",
        "bs-auth-state__body",
        "bs-auth-state__mark",
        "bs-auth-state__meta",
        "bs-auth-state__text",
        "bs-auth-state__title",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <main class=\"bs-auth__card\">\n      <!-- role=\"alert\" and not role=\"status\". The user pressed sign in and this is the result, so\n           it has to reach them now rather than wait for a pause in whatever is being read.\n           The state is not given the danger ink: a person who has read \"wrong password\" in red\n           four times learns nothing from a fifth red sentence. The doubled edge, the padlock and\n           the words are what make this a different message. -->\n      <div class=\"bs-auth-state bs-auth-state--locked bs-auth-state--panel\" role=\"alert\">\n        <span class=\"bs-auth-state__mark\" aria-hidden=\"true\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n            <rect x=\"4.5\" y=\"10.2\" width=\"15\" height=\"10.3\" rx=\"2\" />\n            <path d=\"M8.2 10.2V7.6a3.8 3.8 0 0 1 7.6 0v2.6\" />\n            <path d=\"M12 14v3\" />\n          </svg>\n        </span>\n        <div class=\"bs-auth-state__body\">\n          <h1 class=\"bs-auth-state__title\">This account is locked</h1>\n          <p class=\"bs-auth-state__text\">\n            Ten sign-in attempts failed in a row, so we stopped accepting them. It opens again at\n            16:40, or straight away with a link sent to the address on the account.\n          </p>\n        </div>\n        <div class=\"bs-auth-state__actions\">\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"button\">Email me an unlock link</button>\n          <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/password/reset\">Reset the password instead</a>\n        </div>\n        <p class=\"bs-auth-state__meta\">Not you doing this? <a href=\"/security\">Review recent activity</a></p>\n      </div>\n    </main>\n\n    <p class=\"bs-auth__alt\">Still stuck? <a href=\"/support\">Talk to support</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#locked",
      "preview": "https://bare.style/preview/locked.html"
    },
    {
      "id": "log-viewer",
      "title": "Log viewer",
      "description": "A bounded log tail with level filters, a text search, a follow switch and a live count of what survived the filter.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "logs",
        "filter",
        "data",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/app/metric-log-view.css",
        "src/app/command-filter-bar.css",
        "src/app/command-chip.css",
        "src/app/command-search.css",
        "src/forms/switch.css",
        "src/forms/button.css",
        "src/utility/a11y.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-chip",
        "bs-chip--on",
        "bs-chip__check",
        "bs-chip__count",
        "bs-chip__label",
        "bs-cluster",
        "bs-cluster--between",
        "bs-filter-bar",
        "bs-filter-bar__clear",
        "bs-filter-bar__count",
        "bs-filter-bar__label",
        "bs-filter-bar__set",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-log-view",
        "bs-log-view--tall",
        "bs-log-view__level",
        "bs-log-view__list",
        "bs-log-view__message",
        "bs-log-view__row",
        "bs-log-view__row--debug",
        "bs-log-view__row--error",
        "bs-log-view__row--info",
        "bs-log-view__row--warn",
        "bs-log-view__time",
        "bs-py-8",
        "bs-search",
        "bs-search__clear",
        "bs-search__field",
        "bs-search__icon",
        "bs-search__input",
        "bs-stack",
        "bs-switch",
        "bs-switch__control",
        "bs-switch__label",
        "bs-switch__track",
        "bs-text-h3",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- The container owns the inline gutter and nothing owns the block one, so a page-level template\n     asks for it or its first line sits against the top of the viewport. -->\n<main class=\"bs-wrap bs-py-8\" id=\"main\">\n  <div class=\"bs-stack bs-gap-5\">\n    <header class=\"bs-stack bs-gap-2\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">checkout-api, instance 3</h1>\n      <p class=\"bs-caption bs-flow-none\">Tailing the last 2,000 lines. Older lines are in the archive.</p>\n    </header>\n\n    <div class=\"bs-stack bs-gap-3\">\n      <!-- The search field belongs in a flex ROW. It states a preferred width of 18rem through\n           flex-basis, and a flex COLUMN would read that basis as a height. -->\n      <div class=\"bs-cluster bs-gap-3\">\n        <form class=\"bs-search\" role=\"search\" method=\"get\" action=\"/logs\">\n          <div class=\"bs-search__field\">\n            <svg class=\"bs-search__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M20 20l-4-4\" />\n            </svg>\n            <label class=\"bs-visually-hidden\" for=\"log-q\">Search log lines</label>\n            <input class=\"bs-search__input\" id=\"log-q\" name=\"q\" type=\"search\" autocomplete=\"off\" placeholder=\"Search log lines\" />\n            <button class=\"bs-search__clear\" type=\"button\" aria-label=\"Clear search\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M6 6l12 12M18 6L6 18\" />\n              </svg>\n            </button>\n          </div>\n        </form>\n      </div>\n\n      <div class=\"bs-filter-bar\" role=\"group\" aria-label=\"Log levels\">\n        <p class=\"bs-filter-bar__label\" id=\"log-levels\">Levels</p>\n        <div class=\"bs-filter-bar__set\" aria-labelledby=\"log-levels\">\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Error</span>\n            <span class=\"bs-chip__count\">31</span>\n          </button>\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Warn</span>\n            <span class=\"bs-chip__count\">118</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">Info</span>\n            <span class=\"bs-chip__count\">1,704</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">Debug</span>\n            <span class=\"bs-chip__count\">147</span>\n          </button>\n        </div>\n        <p class=\"bs-filter-bar__count\" aria-live=\"polite\">149 of 2,000 lines</p>\n        <button class=\"bs-filter-bar__clear\" type=\"button\">Clear all</button>\n      </div>\n\n      <div class=\"bs-cluster bs-cluster--between bs-gap-3\">\n        <!-- role=\"switch\" is what makes the announcement \"on\" and \"off\" rather than \"checked\". -->\n        <label class=\"bs-switch\">\n          <input type=\"checkbox\" role=\"switch\" class=\"bs-switch__control\" name=\"follow\" checked />\n          <span class=\"bs-switch__track\" aria-hidden=\"true\"></span>\n          <span class=\"bs-switch__label\">Follow new lines</span>\n        </label>\n        <a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/logs.txt\" download>Download tail</a>\n      </div>\n    </div>\n\n    <!-- The box scrolls, so it is focusable. role=\"log\" is what tells assistive tech that new\n         lines arrive at the end and should be announced politely. -->\n    <div class=\"bs-log-view bs-log-view--tall\" role=\"log\" aria-label=\"checkout-api instance 3 log\" tabindex=\"0\">\n      <ol class=\"bs-log-view__list\">\n        <li class=\"bs-log-view__row bs-log-view__row--error\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T14:22:07Z\">14:22:07</time>\n          <span class=\"bs-log-view__level\">ERROR</span>\n          <span class=\"bs-log-view__message\">settle: upstream gateway timed out after 30s, run 4812</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--warn\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T14:22:06Z\">14:22:06</time>\n          <span class=\"bs-log-view__level\">WARN</span>\n          <span class=\"bs-log-view__message\">settle: retry 3 of 3 for batch b-91f4</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--warn\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T14:21:44Z\">14:21:44</time>\n          <span class=\"bs-log-view__level\">WARN</span>\n          <span class=\"bs-log-view__message\">pool: 18 of 20 connections in use, queueing</span>\n        </li>\n        <!-- --marked is the row a search or a permalink landed on. Nothing on this screen has\n             searched or linked anywhere, so the row is drawn at its own level like the rest: a\n             highlight with no cause reads as a rendering fault. -->\n        <li class=\"bs-log-view__row bs-log-view__row--info\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T14:21:02Z\">14:21:02</time>\n          <span class=\"bs-log-view__level\">INFO</span>\n          <span class=\"bs-log-view__message\">settle: batch b-91f4 opened with 1,180 accounts</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--info\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T14:20:58Z\">14:20:58</time>\n          <span class=\"bs-log-view__level\">INFO</span>\n          <span class=\"bs-log-view__message\">config: reloaded 41 keys from the settings service</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--error\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T13:55:41Z\">13:55:41</time>\n          <span class=\"bs-log-view__level\">ERROR</span>\n          <span class=\"bs-log-view__message\">export: invoice writer refused 12 rows, schema mismatch on tax_rate</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--warn\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T13:55:39Z\">13:55:39</time>\n          <span class=\"bs-log-view__level\">WARN</span>\n          <span class=\"bs-log-view__message\">export: falling back to the previous rate table</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--debug\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T13:55:38Z\">13:55:38</time>\n          <span class=\"bs-log-view__level\">DEBUG</span>\n          <span class=\"bs-log-view__message\">export: rate table checksum 4f2a, expected 9c81</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--info\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T13:30:00Z\">13:30:00</time>\n          <span class=\"bs-log-view__level\">INFO</span>\n          <span class=\"bs-log-view__message\">scheduler: starting refresh-tax-rates, run 4804</span>\n        </li>\n        <li class=\"bs-log-view__row bs-log-view__row--error\">\n          <time class=\"bs-log-view__time\" datetime=\"2026-08-01T13:32:47Z\">13:32:47</time>\n          <span class=\"bs-log-view__level\">ERROR</span>\n          <span class=\"bs-log-view__message\">refresh-tax-rates: provider returned 503, no cached table for FR</span>\n        </li>\n      </ol>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#log-viewer",
      "preview": "https://bare.style/preview/log-viewer.html"
    },
    {
      "id": "login",
      "title": "Login screen",
      "description": "A whole sign-in page: brand, email and password, one recovery route, one way to sign up.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "login",
        "form",
        "full-page"
      ],
      "links": [
        "src/layout/center.css",
        "src/data/card.css",
        "src/data/divider.css",
        "src/forms/field.css",
        "src/forms/label.css",
        "src/forms/input.css",
        "src/forms/help.css",
        "src/forms/checkbox.css",
        "src/forms/button.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1280
      ],
      "classes": [
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-center",
        "bs-center--viewport",
        "bs-checkbox",
        "bs-checkbox__control",
        "bs-checkbox__label",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-divider",
        "bs-divider--labelled",
        "bs-divider__label",
        "bs-fg-accent",
        "bs-field",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-gap-6",
        "bs-help",
        "bs-input",
        "bs-label",
        "bs-mx-auto",
        "bs-my-5",
        "bs-navlink",
        "bs-navlink--prose",
        "bs-stack",
        "bs-text-caption",
        "bs-text-center",
        "bs-text-h3",
        "bs-text-small"
      ],
      "html": "<!-- The whole page is one landmark and one form. There is no navigation to skip past, so there is\n     no skip link: a bypass link that bypasses nothing is one more thing between a keyboard user\n     and the email field. -->\n<main class=\"bs-center bs-center--viewport\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\" style=\"inline-size: min(24rem, 100%)\">\n    <div class=\"bs-stack bs-gap-2 bs-text-center\">\n      <svg width=\"32\" height=\"32\" viewBox=\"0 0 8.46 8.46\" aria-hidden=\"true\" focusable=\"false\" class=\"bs-mx-auto bs-fg-accent\">\n        <path fill=\"currentColor\" d=\"M7.08,0h-2.03C4.86,0,4.7.15,4.7.34v3.13c0,.18.15.33.33.33h3.11c.17,0,.31-.14.31-.31V1.38C8.46.62,7.84,0,7.08,0Z\" />\n        <path fill=\"currentColor\" d=\"M1.38,0C.62,0,0,.62,0,1.38v3.22h0v2.48C0,7.84.62,8.46,1.38,8.46h2.03c.19,0,.34-.15.34-.34V.34c0-.19-.15-.34-.34-.34H1.38Z\" />\n        <path fill=\"currentColor\" d=\"M8.46,7.08v-2.06c0-.17-.14-.31-.31-.31h-3.11c-.18,0-.33.15-.33.33v3.07c0,.19.15.34.34.34h2.03c.76,0,1.38-.62,1.38-1.38Z\" />\n      </svg>\n      <h1 class=\"bs-text-h3 bs-flow-none\">Sign in</h1>\n      <p class=\"bs-caption bs-flow-none\">Use the address your workspace was invited on.</p>\n    </div>\n\n    <div class=\"bs-card\">\n      <div class=\"bs-card__body\">\n        <form class=\"bs-stack bs-gap-5\" method=\"post\" action=\"/session\">\n          <div class=\"bs-field\">\n            <label class=\"bs-label\" for=\"login-email\">Email</label>\n            <!-- autocomplete is not decoration here: it is what lets a password manager fill the\n                 pair, and SC 1.3.5 asks for it on any field collecting information about the user. -->\n            <input\n              class=\"bs-input\"\n              id=\"login-email\"\n              name=\"email\"\n              type=\"email\"\n              autocomplete=\"username\"\n              inputmode=\"email\"\n              required\n              autofocus\n            />\n          </div>\n\n          <div class=\"bs-field\">\n            <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n              <label class=\"bs-label\" for=\"login-password\">Password</label>\n              <!-- The link ink and the underline, matching \"Create one\" at the foot of the same\n                   screen. --muted alone gives a recovery route no colour and no underline, so one\n                   page ends up with two different ideas of what a link looks like. -->\n              <a class=\"bs-navlink bs-navlink--prose bs-text-small\" href=\"/reset\">Forgot it</a>\n            </div>\n            <input\n              class=\"bs-input\"\n              id=\"login-password\"\n              name=\"password\"\n              type=\"password\"\n              autocomplete=\"current-password\"\n              required\n              aria-describedby=\"login-password-help\"\n            />\n            <p class=\"bs-help\" id=\"login-password-help\">At least 12 characters.</p>\n          </div>\n\n          <label class=\"bs-checkbox\">\n            <input type=\"checkbox\" class=\"bs-checkbox__control\" name=\"remember\" value=\"1\" />\n            <span class=\"bs-checkbox__label\">Keep me signed in on this device</span>\n          </label>\n\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"submit\">Sign in</button>\n        </form>\n\n        <div class=\"bs-divider bs-divider--labelled bs-my-5\" role=\"separator\">\n          <span class=\"bs-divider__label\">or</span>\n        </div>\n\n        <!-- Secondary, not primary. Two primary buttons on one screen is two answers to a question\n             the page has already decided: this screen is for signing in. -->\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/session/sso\">Continue with single sign-on</a>\n      </div>\n    </div>\n\n    <p class=\"bs-caption bs-text-center bs-mx-auto bs-flow-none\">\n      <!-- bs-navlink sets an absolute size and a nav line box, so a bare one inside caption text\n           renders 15px in a 12px sentence and breaks the run. --prose drops the line box and\n           bs-text-caption puts it back on the size of the text around it. -->\n      No account yet? <a class=\"bs-navlink bs-navlink--prose bs-text-caption\" href=\"/signup\">Create one</a>.\n    </p>\n  </div>\n</main>",
      "href": "https://bare.style/templates#login",
      "preview": "https://bare.style/preview/login.html"
    },
    {
      "id": "logo-cloud",
      "title": "Logo cloud",
      "description": "A quiet row of customer marks under one line of context, wrapping to as many rows as the width allows.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "logo-cloud",
        "marketing",
        "social-proof",
        "cluster"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/cluster.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/data/icon.css",
        "src/utility/spacing.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-caption",
        "bs-cluster",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-5",
        "bs-gap-6",
        "bs-grid",
        "bs-grid--bare",
        "bs-icon",
        "bs-icon--lg",
        "bs-py-8",
        "bs-stack",
        "bs-weight-medium",
        "bs-wrap"
      ],
      "html": "<!-- A LOGO CLOUD IS A LIST, so it is one, with role=\"list\" restored because bs-grid--bare drops\n     the marker and Safari drops the semantics with it.\n\n     A GRID AND NOT A CENTRED CLUSTER. A wrapping cluster centres each row on its own contents, so\n     on a phone - where a mark and its name are wider than half the screen and the list is one item\n     per row - every icon lands at a different x and the block reads as six unrelated lines. The\n     grid resolves a column count from one track floor: six across at 1440, three at 768, one on a\n     phone, and every icon on the same start edge at all three. The heading and the note take that\n     same edge, which is the edge every other marketing block in this set begins at.\n\n     Each mark is an inline SVG in currentColor rather than an image, so it takes the muted text\n     colour in both themes, needs no second request, and survives forced colors, where an image of\n     a dark logo on a dark background does not. The company name is real text beside it rather than\n     inside the SVG, which is what makes the row readable when images are off and searchable when\n     they are on. -->\n<section class=\"bs-wrap bs-py-8\" aria-labelledby=\"customers-heading\">\n  <div class=\"bs-stack bs-gap-6\">\n    <h2 class=\"bs-caption bs-fg-secondary bs-flow-none\" id=\"customers-heading\">\n      Trusted on the bad days by teams at\n    </h2>\n\n    <ul class=\"bs-grid bs-grid--bare bs-gap-5 bs-fg-muted\" role=\"list\" style=\"--bs-grid-min: 11rem\">\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"M4 19 12 5l8 14z\" /><path d=\"M8.5 15h7\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Northpoint Freight</span>\n      </li>\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <circle cx=\"12\" cy=\"12\" r=\"8\" /><path d=\"M12 4v16\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Kestrel Payments</span>\n      </li>\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"4\" /><path d=\"M9 12h6\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Harbour Analytics</span>\n      </li>\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"M5 18V8l7-4 7 4v10\" /><path d=\"M9 18v-5h6v5\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Ravelin Housing</span>\n      </li>\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"M4 12a8 8 0 0 1 16 0\" /><path d=\"M4 12a8 8 0 0 0 16 0\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Tidewell Energy</span>\n      </li>\n      <li class=\"bs-cluster bs-gap-2\">\n        <svg class=\"bs-icon bs-icon--lg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"m12 4 7 4v8l-7 4-7-4V8z\" /><path d=\"M12 12v8\" />\n        </svg>\n        <span class=\"bs-weight-medium\">Ossory Rail</span>\n      </li>\n    </ul>\n\n    <p class=\"bs-caption bs-fg-muted bs-flow-none\">\n      Named with permission. Logos stay the property of their owners.\n    </p>\n  </div>\n</section>",
      "href": "https://bare.style/templates#logo-cloud",
      "preview": "https://bare.style/preview/logo-cloud.html"
    },
    {
      "id": "onboarding",
      "title": "Onboarding stepper",
      "description": "A first-run setup flow: the steps done and still to come, the form for the step in progress, and the two ways out of it.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "onboarding",
        "stepper",
        "form",
        "full-page"
      ],
      "links": [
        "src/app/flow-stepper.css",
        "src/data/card.css",
        "src/forms/field.css",
        "src/forms/label.css",
        "src/forms/input.css",
        "src/forms/help.css",
        "src/forms/select.css",
        "src/forms/radio.css",
        "src/forms/button.css",
        "src/layout/center.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-center",
        "bs-center--viewport",
        "bs-cluster",
        "bs-cluster--between",
        "bs-dropdown",
        "bs-dropdown__control",
        "bs-field",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-4",
        "bs-gap-6",
        "bs-help",
        "bs-input",
        "bs-label",
        "bs-py-6",
        "bs-radio",
        "bs-radio__control",
        "bs-radio__label",
        "bs-stack",
        "bs-stepper",
        "bs-stepper__body",
        "bs-stepper__marker",
        "bs-stepper__note",
        "bs-stepper__step",
        "bs-stepper__title",
        "bs-text-h3"
      ],
      "html": "<!-- No navigation to bypass and nothing above the form, so there is no skip link: a bypass link\n     that bypasses nothing is one more thing between a keyboard user and the first field. -->\n<main class=\"bs-center bs-center--viewport bs-py-6\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\" style=\"inline-size: min(44rem, 100%)\">\n    <div class=\"bs-stack bs-gap-2\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">Set up your workspace</h1>\n      <p class=\"bs-caption bs-flow-none\">Three short steps. You can change any of it later in settings.</p>\n    </div>\n\n    <!-- aria-current=\"step\" is what assistive technology reads; data-state is what the CSS selects\n         on. Neither can do the other's job, so both are present. The marker is aria-hidden because\n         a circle with a tick in it is not a sentence, which is why the state is also in the note. -->\n    <ol class=\"bs-stepper\">\n      <li class=\"bs-stepper__step\" data-state=\"done\">\n        <span class=\"bs-stepper__marker\" aria-hidden=\"true\"></span>\n        <span class=\"bs-stepper__body\">\n          <span class=\"bs-stepper__title\">Name the workspace</span>\n          <span class=\"bs-stepper__note\">Completed</span>\n        </span>\n      </li>\n      <li class=\"bs-stepper__step\" data-state=\"current\" aria-current=\"step\">\n        <span class=\"bs-stepper__marker\" aria-hidden=\"true\"></span>\n        <span class=\"bs-stepper__body\">\n          <span class=\"bs-stepper__title\">Connect a source</span>\n          <span class=\"bs-stepper__note\">In progress</span>\n        </span>\n      </li>\n      <li class=\"bs-stepper__step\" data-state=\"todo\">\n        <span class=\"bs-stepper__marker\" aria-hidden=\"true\"></span>\n        <span class=\"bs-stepper__body\">\n          <span class=\"bs-stepper__title\">Invite the people who need it</span>\n          <span class=\"bs-stepper__note\">Not started</span>\n        </span>\n      </li>\n    </ol>\n\n    <form class=\"bs-card\" method=\"post\" action=\"/onboarding/source\">\n      <header class=\"bs-card__header\">\n        <h2 class=\"bs-card__title\">Connect a source</h2>\n        <p class=\"bs-card__subtitle\">Read-only credentials are enough. Nothing is written back to it.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-stack bs-gap-4\">\n        <fieldset class=\"bs-field\">\n          <legend class=\"bs-label\">Where does the data live</legend>\n          <label class=\"bs-radio\">\n            <input class=\"bs-radio__control\" type=\"radio\" name=\"kind\" value=\"postgres\" checked />\n            <span class=\"bs-radio__label\">A relational database</span>\n          </label>\n          <label class=\"bs-radio\">\n            <input class=\"bs-radio__control\" type=\"radio\" name=\"kind\" value=\"object\" />\n            <span class=\"bs-radio__label\">Files in object storage</span>\n          </label>\n          <label class=\"bs-radio\">\n            <input class=\"bs-radio__control\" type=\"radio\" name=\"kind\" value=\"api\" />\n            <span class=\"bs-radio__label\">An HTTP API we poll</span>\n          </label>\n        </fieldset>\n\n        <div class=\"bs-field\">\n          <label class=\"bs-label\" for=\"onboard-host\">Host</label>\n          <input class=\"bs-input\" id=\"onboard-host\" name=\"host\" type=\"text\" placeholder=\"db.internal.example.com\" aria-describedby=\"onboard-host-help\" />\n          <p class=\"bs-help\" id=\"onboard-host-help\">Allow our range through the firewall first, or the check below will time out.</p>\n        </div>\n\n        <div class=\"bs-field\">\n          <label class=\"bs-label\" for=\"onboard-region\">Read from</label>\n          <span class=\"bs-dropdown\">\n            <select class=\"bs-dropdown__control\" id=\"onboard-region\" name=\"region\">\n              <option>The primary</option>\n              <option selected>A read replica</option>\n              <option>A nightly snapshot</option>\n            </select>\n          </span>\n        </div>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <div class=\"bs-cluster bs-cluster--between bs-gap-3\">\n          <!-- Secondary. Alone on its side of the footer a ghost button has nothing beside it to\n               read as the quiet member of a set, so it reads as a stray word. -->\n          <a class=\"bs-btn bs-btn--secondary\" href=\"/onboarding/name\">Back</a>\n          <div class=\"bs-cluster bs-gap-2\">\n            <a class=\"bs-btn bs-btn--secondary\" href=\"/onboarding/invite\">Skip for now</a>\n            <button class=\"bs-btn bs-btn--primary\" type=\"submit\">Test and continue</button>\n          </div>\n        </div>\n      </footer>\n    </form>\n  </div>\n</main>",
      "href": "https://bare.style/templates#onboarding",
      "preview": "https://bare.style/preview/onboarding.html"
    },
    {
      "id": "permission-denied",
      "title": "Permission denied page",
      "description": "A whole 403 page: what was refused, which account was refused it, who can grant it, and a way to ask.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "error",
        "auth",
        "empty",
        "full-page"
      ],
      "links": [
        "src/layout/center.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/empty.css",
        "src/data/card.css",
        "src/data/description-list.css",
        "src/data/avatar.css",
        "src/forms/button.css",
        "src/nav/navlink.css",
        "src/utility/spacing.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card--compact",
        "bs-card__body",
        "bs-center",
        "bs-center--viewport",
        "bs-cluster",
        "bs-cluster--tight",
        "bs-dl",
        "bs-dl--rows",
        "bs-dl__desc",
        "bs-dl__term",
        "bs-empty",
        "bs-empty__actions",
        "bs-empty__icon",
        "bs-empty__text",
        "bs-empty__title",
        "bs-flow-none",
        "bs-gap-5",
        "bs-mx-auto",
        "bs-navlink",
        "bs-navlink--prose",
        "bs-stack",
        "bs-text-caption",
        "bs-text-center"
      ],
      "html": "<main class=\"bs-center bs-center--viewport\" id=\"main\">\n  <!-- bs-center centres its own box, and this column is narrower than that box: without the auto\n       margins it sits against the left edge of a centred container and the page reads off-centre. -->\n  <div class=\"bs-stack bs-gap-5 bs-mx-auto\" style=\"inline-size: min(34rem, 100%)\">\n    <div class=\"bs-empty\">\n      <svg class=\"bs-empty__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n        <path d=\"M6 10.5h12v10H6z\" />\n        <path d=\"M8.5 10.5V7a3.5 3.5 0 0 1 7 0v3.5\" />\n        <path d=\"M12 14.5v2.5\" />\n      </svg>\n      <!-- Refused is not the same as broken, and it is not the same as missing. Saying which of the\n           three it is saves the reader an afternoon of debugging the wrong thing. -->\n      <h1 class=\"bs-empty__title\">You do not have access to billing</h1>\n      <p class=\"bs-empty__text\">\n        Billing is limited to workspace owners and to members with the finance role. Your account is\n        signed in and working normally, so nothing else on the workspace is affected.\n      </p>\n      <div class=\"bs-empty__actions\">\n        <button class=\"bs-btn bs-btn--primary\" type=\"button\">Request access</button>\n        <a class=\"bs-btn bs-btn--secondary\" href=\"/\">Back to the dashboard</a>\n      </div>\n    </div>\n\n    <div class=\"bs-card bs-card--compact\">\n      <div class=\"bs-card__body\">\n        <!-- bs-dl--rows lays out GROUPS, so every pair is wrapped. Left as bare dt/dd the auto-fit\n             grid places each term and each value as its own cell, and a term ends up beside the\n             value of a different pair. -->\n        <dl class=\"bs-dl bs-dl--rows\">\n          <div>\n            <dt class=\"bs-dl__term\">Signed in as</dt>\n            <dd class=\"bs-dl__desc\">\n              <span class=\"bs-cluster bs-cluster--tight\">\n                <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Tomas Ferro\">\n                  <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TF</span>\n                </span>\n                Tomas Ferro\n              </span>\n            </dd>\n          </div>\n          <div>\n            <dt class=\"bs-dl__term\">Role</dt>\n            <dd class=\"bs-dl__desc\">Member</dd>\n          </div>\n          <div>\n            <dt class=\"bs-dl__term\">Workspace</dt>\n            <dd class=\"bs-dl__desc\">Northbridge Operations</dd>\n          </div>\n          <div>\n            <dt class=\"bs-dl__term\">Who can grant this</dt>\n            <dd class=\"bs-dl__desc\">Rin Alvarez and two other owners</dd>\n          </div>\n        </dl>\n      </div>\n    </div>\n\n    <!-- bs-text-center centres the text inside the box; a paragraph is capped at the measure, so\n         the box itself needs the auto margins or the centred text is centred off-centre. -->\n    <p class=\"bs-caption bs-text-center bs-mx-auto bs-flow-none\">\n      On the wrong account? <a class=\"bs-navlink bs-navlink--prose bs-text-caption\" href=\"/session/switch\">Switch account</a>.\n    </p>\n  </div>\n</main>",
      "href": "https://bare.style/templates#permission-denied",
      "preview": "https://bare.style/preview/permission-denied.html"
    },
    {
      "id": "pricing-card",
      "title": "Pricing card",
      "description": "One plan with its price, what is included, and the action that buys it.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta"
      ],
      "links": [
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1280
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-leading-none",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-mt-5",
        "bs-mx-auto",
        "bs-nums-tabular",
        "bs-stack",
        "bs-text-body",
        "bs-text-center",
        "bs-text-display",
        "bs-weight-body"
      ],
      "html": "<article class=\"bs-card\">\n  <header class=\"bs-card__header\">\n    <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n      <h2 class=\"bs-card__title\">Team</h2>\n      <span class=\"bs-badge bs-badge--accent\">Most picked</span>\n    </div>\n    <p class=\"bs-card__subtitle\">For a product team that ships together.</p>\n  </header>\n\n  <div class=\"bs-card__body\">\n    <!-- The number and the period are one line to a reader and two elements to a screen reader,\n         which is what stops \"24\" and \"per seat, per month\" being read as unrelated facts. -->\n    <p class=\"bs-text-display bs-leading-none bs-flow-none\">\n      <span class=\"bs-nums-tabular\">$24</span>\n      <span class=\"bs-text-body bs-fg-secondary bs-weight-body\">per seat, per month</span>\n    </p>\n\n    <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2 bs-mt-5\" role=\"list\">\n      <li class=\"bs-list__item bs-cluster bs-gap-2 bs-cluster--baseline\">\n        <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n        </svg>\n        <span>Unlimited projects and environments</span>\n      </li>\n      <li class=\"bs-list__item bs-cluster bs-gap-2 bs-cluster--baseline\">\n        <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n        </svg>\n        <span>Audit log kept for two years</span>\n      </li>\n      <li class=\"bs-list__item bs-cluster bs-gap-2 bs-cluster--baseline\">\n        <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n        </svg>\n        <span>Single sign-on and SCIM provisioning</span>\n      </li>\n      <li class=\"bs-list__item bs-cluster bs-gap-2 bs-cluster--baseline\">\n        <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n          <path d=\"M4 8h8\" />\n        </svg>\n        <span class=\"bs-fg-secondary\">Dedicated support engineer</span>\n      </li>\n    </ul>\n  </div>\n\n  <footer class=\"bs-card__footer bs-stack bs-gap-3\">\n    <!-- Block, not inline. The only action in a pricing card is the reason the card exists, and a\n         button the width of its own two words is the smallest target on the card it leads. -->\n    <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=team\">Start with Team</a>\n    <p class=\"bs-caption bs-text-center bs-mx-auto bs-flow-none\">30 days, no card. Cancel from the dashboard.</p>\n  </footer>\n</article>",
      "href": "https://bare.style/templates#pricing-card",
      "preview": "https://bare.style/preview/pricing-card.html"
    },
    {
      "id": "pricing-comparison",
      "title": "Pricing comparison table",
      "description": "Three tiers as columns and their features as rows, with a price, a marked plan and a buy action in every column.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "table",
        "comparison",
        "cta",
        "three-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/data/table.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/forms/button.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css",
        "src/utility/display.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-d-block",
        "bs-eyebrow",
        "bs-fg-muted",
        "bs-fg-secondary",
        "bs-flow-none",
        "bs-gap-3",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-ms-2",
        "bs-mt-2",
        "bs-mt-4",
        "bs-mt-7",
        "bs-nums-tabular",
        "bs-py-9",
        "bs-stack",
        "bs-table",
        "bs-table--hover",
        "bs-table--sticky-col",
        "bs-table--zebra",
        "bs-table-scroll",
        "bs-table__num",
        "bs-text-h2",
        "bs-text-h3",
        "bs-text-start",
        "bs-weight-body",
        "bs-wrap"
      ],
      "html": "<!-- A CARD GRID SHOWS THREE PLANS. A TABLE ANSWERS \"WHICH ONE HAS SSO\". They are different\n     questions and this is the second one, which is why the features are rows: a reader comparing\n     one capability across three plans reads along a row, and three separate cards make that a\n     memory test.\n\n     The wrapper is what scrolls, not the page. bs-table-scroll carries tabindex=\"0\" and a named\n     region so the scroll is reachable by keyboard as well as by pointer (SC 2.1.1), which is the\n     whole reason it is a separate block rather than overflow on the table.\n\n     bs-table--sticky-col freezes the feature column, which is what makes the scroll usable rather\n     than merely present: at 320px only one plan fits beside it, and a reader who scrolls to the\n     third plan with the row labels gone is reading a column of unattributed numbers.\n\n     A tick alone is a colour and a shape, and neither is text. Each mark is therefore an image with\n     a name - role=\"img\" and aria-label - rather than a decorative glyph, so a cell reads as\n     \"Included\" instead of as an empty cell. The name is on the SVG rather than in a visually hidden\n     span beside it on purpose: a visually hidden box is absolutely positioned, its containing block\n     is the page rather than the scroller, and inside a horizontally scrolling table that means it\n     escapes the clip and takes the whole document sideways at 320px. -->\n<section class=\"bs-wrap bs-py-9\" aria-labelledby=\"plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">Plans</p>\n    <h2 class=\"bs-text-h2 bs-flow-none\" id=\"plans-heading\">What each plan includes</h2>\n    <p class=\"bs-lead bs-fg-secondary bs-flow-none\">\n      Every plan carries the full incident timeline. What changes is how many people can publish\n      and how far back the history goes.\n    </p>\n  </div>\n\n  <div class=\"bs-table-scroll bs-mt-7\" tabindex=\"0\" role=\"region\" aria-labelledby=\"plans-caption\">\n    <table class=\"bs-table bs-table--zebra bs-table--hover bs-table--sticky-col\">\n      <caption class=\"bs-text-start\" id=\"plans-caption\">Plan comparison, priced per month</caption>\n      <thead>\n        <tr>\n          <th scope=\"col\">Feature</th>\n          <th scope=\"col\">\n            Starter\n            <span class=\"bs-d-block bs-text-h3 bs-leading-none bs-nums-tabular bs-mt-2\">$9</span>\n            <span class=\"bs-d-block bs-caption bs-weight-body\">per month</span>\n          </th>\n          <th scope=\"col\">\n            Team\n            <span class=\"bs-badge bs-badge--accent bs-ms-2\">Most picked</span>\n            <span class=\"bs-d-block bs-text-h3 bs-leading-none bs-nums-tabular bs-mt-2\">$29</span>\n            <span class=\"bs-d-block bs-caption bs-weight-body\">per month</span>\n          </th>\n          <th scope=\"col\">\n            Business\n            <span class=\"bs-d-block bs-text-h3 bs-leading-none bs-nums-tabular bs-mt-2\">$89</span>\n            <span class=\"bs-d-block bs-caption bs-weight-body\">per month</span>\n          </th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\">Status pages</th>\n          <td class=\"bs-table__num\">1</td>\n          <td class=\"bs-table__num\">3</td>\n          <td class=\"bs-table__num\">25</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">People who can publish</th>\n          <td class=\"bs-table__num\">3</td>\n          <td class=\"bs-table__num\">15</td>\n          <td class=\"bs-table__num\">Unlimited</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Incident history kept</th>\n          <td>90 days</td>\n          <td>2 years</td>\n          <td>Forever</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Email and webhook subscribers</th>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Your own domain and certificate</th>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Not included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"M4 8h8\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Single sign-on and provisioning</th>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Not included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"M4 8h8\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Not included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"M4 8h8\" /></svg>\n          </td>\n          <td>\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Included\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"m3 8.4 3.2 3.1L13 4.9\" /></svg>\n          </td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Answer time on a support ticket</th>\n          <td>Next working day</td>\n          <td>4 hours</td>\n          <td>1 hour, day and night</td>\n        </tr>\n      </tbody>\n      <!-- One word per label. \"Choose Business\" is wider than a third of the plan area at 768 and\n           wraps inside its pill in WebKit, which makes that cell double height beside a\n           single-height neighbour and puts the last row out of line. The row header says what the\n           action is, so a screen reader reads \"Pick a plan, Starter\" and the label does not have to\n           repeat the verb three times. -->\n      <tfoot>\n        <tr>\n          <th scope=\"row\">Pick a plan</th>\n          <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/signup?plan=starter\">Starter</a></td>\n          <td><a class=\"bs-btn bs-btn--primary bs-btn--sm\" href=\"/signup?plan=team\">Team</a></td>\n          <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/signup?plan=business\">Business</a></td>\n        </tr>\n      </tfoot>\n    </table>\n  </div>\n\n  <!-- Full strength, not --muted. Starter's answer time is a real answer time; drawn muted beside\n       two full-strength cells in the same row it reads as a disabled or unavailable value. -->\n  <p class=\"bs-caption bs-fg-muted bs-mt-4\">\n    Prices exclude tax. Yearly billing takes two months off any plan.\n  </p>\n</section>",
      "href": "https://bare.style/templates#pricing-comparison",
      "preview": "https://bare.style/preview/pricing-comparison.html"
    },
    {
      "id": "pricing-five-plans",
      "title": "Pricing, five plans",
      "description": "The awkward count, broken three then two on purpose, with the last two given the wider tracks the contract plans need.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "five-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css",
        "src/utility/border.css",
        "src/utility/display.css",
        "src/utility/grid.css",
        "src/utility/layout-responsive.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--outline",
        "bs-balance",
        "bs-border-2",
        "bs-border-accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cols-1",
        "bs-d-grid",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--rows",
        "bs-grid--tight",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-lg-cols-6",
        "bs-lg-span-2",
        "bs-lg-span-3",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-measure-lead",
        "bs-mt-6",
        "bs-nums-tabular",
        "bs-pb-0",
        "bs-pt-0",
        "bs-sm-cols-2",
        "bs-sm-span-full",
        "bs-stack",
        "bs-text-body",
        "bs-text-h1",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- FIVE IS THE COUNT WITH NO GOOD ROW. Five across is unreadable, and five in a three-column grid\n     leaves a hole in the second row where the sixth plan would be, which reads as a plan that failed\n     to load. A horizontal scroller was the other candidate and was rejected: a pricing table that\n     hides two of its five plans off the edge of the screen is asking the reader to discover them,\n     and a reader who does not scroll simply never learns the top of the range exists.\n\n     So the break is three then two, and the second row is not three cards with one missing - it is\n     two cards that are each half the row. Six lg tracks make both shapes exact: the first three\n     plans take two tracks each, the last two take three each. Nothing is offset and nothing is\n     placed by line number, so the visual order is still the DOM order and SC 1.3.2 holds.\n\n     It also happens to be the right editorial shape. The self-serve plans are short and identical\n     in structure; the two that involve a conversation carry longer copy, and they get the wider\n     measure to carry it in.\n\n     Between 480 and 1024 the grid is two columns and only the fifth plan spans the row: two, two,\n     then one full-width card. Spanning the fourth as well was tried and is worse - it pushes the\n     third plan onto a row of its own with a hole beside it, which is the exact failure the three-\n     then-two break exists to avoid, one breakpoint down.\n\n     Rows line up through bs-grid--rows, which is subgrid: each card spans three parent rows and\n     shares those tracks with the cards beside it. bs-d-grid is what allows it, since bs-card sets\n     display: flex from bare.component and layer order beats specificity - the utility is later\n     still, in bare.utility. Each visual row aligns against itself, which is what the reader\n     compares.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px.\n\n     FOUR ROWS, NOT THREE. The price band is a track of its own because the unit beside the figure\n     is the part that wraps: \"per editor, per month\" fits next to $9 and not next to $29, so with\n     one shared body track the feature lists underneath started at different heights in different\n     columns while the cards themselves looked identical. Splitting the body in two costs one\n     element per card and buys the thing the table is for - the price on one line across the row,\n     the features on one line across the row, the buttons on one. The two halves are bs-pb-0 and\n     bs-pt-0 so they meet on the subgrid's own row gap instead of stacking two card paddings.\n\n     The figure and its unit are a cluster rather than one run of inline text. As inline text the\n     unit wraps onto a second line whose height is set by the display font, which drops it half a\n     centimetre below the number with nothing in between; as a baseline cluster it either sits on\n     the number's baseline or wraps directly under it at its own line height.\n\n     THE FIGURE IS THE h1 STEP, NOT THE DISPLAY STEP. src/core/reset.css sets overflow-wrap:\n     break-word on everything, which is right for a paragraph and merciless here: a price wider\n     than its track does not overflow where an author would see it, it breaks between two digits,\n     so $120 renders as $12 above a lone 0 and reads as a different number. The display step is\n     clamp(3rem .. 5rem) and from three columns up the track is narrower than it needs. h1 is\n     clamp(2.125rem .. 3.75rem), which fits a four-glyph figure or the word Custom in a third of a\n     1024px row and still reads as the largest thing on the card. -->\n<section class=\"bs-wrap\" aria-labelledby=\"five-plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow\">Pricing</p>\n    <h2 class=\"bs-text-h2 bs-balance\" id=\"five-plans-heading\">Five plans, and the top two are conversations</h2>\n    <p class=\"bs-lead bs-measure-lead\">The first three you can start on this afternoon with a card. The last two exist because procurement, invoicing and a signed agreement are real work.</p>\n  </div>\n\n  <div class=\"bs-grid bs-grid--rows bs-grid--tight bs-cols-1 bs-sm-cols-2 bs-lg-cols-6 bs-mt-6\" style=\"--bs-grid-rows: 4\">\n    <!-- Every card carries the same 2px edge and only the recommended one changes its colour.\n         Measured: an item that subgrids its rows aligns them inside its own border box, so a 2px\n         edge among 1px neighbours starts its first track 1px lower and puts every band in that\n         column 1px out of line with the row. -->\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-lg-span-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Hobby</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">Learning the tool on something that is not work.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$0</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- Tick against dash: a difference in shape, so it survives greyscale, paper and\n                 forced colors, where both inks become the reader's one foreground. The hidden word\n                 is what a screen reader gets from an aria-hidden icon. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>2 projects</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Community support</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Custom domains</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=hobby\">Create an account</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-lg-span-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Indie</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">One person shipping something people pay for.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$9</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>10 projects</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Custom domains</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>More than one editor</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=indie\">Start with Indie</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-border-accent bs-lg-span-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Studio<span class=\"bs-visually-hidden\">, the recommended plan</span></h3>\n          <span class=\"bs-badge bs-badge--accent\">Recommended</span>\n        </div>\n        <p class=\"bs-card__subtitle\">A small team with a client list.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$29</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per editor, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited projects and editors</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Client review links</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>History kept for two years</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=studio\">Start 14 days of Studio</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-lg-span-3\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Agency</h3>\n          <span class=\"bs-badge bs-badge--outline\">Invoiced</span>\n        </div>\n        <p class=\"bs-card__subtitle\">Several teams billing several clients, and one finance department that wants one invoice.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$89</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per editor, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Studio, across an unlimited number of workspaces</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on, SCIM provisioning and an audit export</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Annual invoicing in USD, EUR or GBP, net 30</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>A dedicated single-tenant region</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=agency\">Request a quote</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-sm-span-full bs-lg-span-3\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Enterprise</h3>\n          <span class=\"bs-badge bs-badge--outline\">Contract</span>\n        </div>\n        <p class=\"bs-card__subtitle\">Security review, a data processing agreement, and a region you choose.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none\">Custom</span>\n          <span class=\"bs-text-body bs-fg-secondary\">from 25 editors, billed yearly</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Agency, plus a dedicated single-tenant region</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>A named support engineer and a 99.95 percent uptime commitment</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Signed DPA, security questionnaire and penetration test summary</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Onboarding run with your team, not a recorded video</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=enterprise\">Talk to sales</a>\n      </footer>\n    </article>\n  </div>\n</section>",
      "href": "https://bare.style/templates#pricing-five-plans",
      "preview": "https://bare.style/preview/pricing-five-plans.html"
    },
    {
      "id": "pricing-four-plans",
      "title": "Pricing, four plans",
      "description": "One column on a phone, two by two from 480px, four across from 1024px, with every row of the cards sharing a track.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "four-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css",
        "src/utility/border.css",
        "src/utility/display.css",
        "src/utility/grid.css",
        "src/utility/layout-responsive.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-balance",
        "bs-border-2",
        "bs-border-accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cols-1",
        "bs-d-grid",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--rows",
        "bs-grid--tight",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-lg-cols-4",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-measure-lead",
        "bs-mt-5",
        "bs-mt-6",
        "bs-mx-auto",
        "bs-nums-tabular",
        "bs-pb-0",
        "bs-pt-0",
        "bs-sm-cols-2",
        "bs-stack",
        "bs-text-body",
        "bs-text-center",
        "bs-text-h1",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- WHY THE COUNT IS STATED AND NOT INFERRED. bs-grid alone sizes its columns from its own width,\n     which is the better default nearly everywhere and the wrong one here: four plans that resolve\n     to three columns leave one card alone on a second row, and that card reads as an afterthought\n     rather than as the top of the range. So the count is explicit at each step - one, then two, then\n     four - and 2x2 is a shape rather than an accident of how much room was left over.\n\n     Four across starts at 1024 and not at 768. At 768 a quarter track is about 165px of text once\n     the card's own padding is out, which is roughly four words a line: legible, and miserable to\n     read four times over. 2x2 at that width gives each card twice the measure and costs one\n     scroll.\n\n     EVERY CARD CARRIES THE SAME 2px EDGE, and only the recommended one changes its colour. That is\n     not a style choice, it is what keeps the row aligned: an item that subgrids its rows aligns\n     them inside its own border box, so a card with a 2px edge among 1px neighbours starts its first\n     track 1px lower and puts every band in that column - price, features, button - 1px out of line\n     with the rest of the table. Measured, and one pixel is exactly the amount nobody can name and\n     everybody can see.\n\n     THE BUTTON LABELS ARE SHORT for the same reason the count is stated. A quarter track at 1024\n     leaves about 120px for a label, and a label that wraps in one card and not in the next makes\n     that card's footer taller; the footer is bottom-aligned in its shared track, so the taller one\n     starts 11px higher and the alignment the subgrid bought is gone.\n\n     Equal heights come from bs-grid--rows, which is subgrid: each card spans three parent rows and\n     shares those tracks with its neighbours, so the price band and the action band are the same\n     height in every column and the buttons land on one y-coordinate. bs-d-grid is what lets that\n     apply at all - bs-card sets display: flex from bare.component, which beats the display: grid\n     bs-grid--rows sets from bare.layout, because layer order beats specificity. The utility sits in\n     bare.utility, after both.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px.\n\n     FOUR ROWS, NOT THREE. The price band is a track of its own because the unit beside the figure\n     is the part that wraps: \"per editor, per month\" fits next to $9 and not next to $29, so with\n     one shared body track the feature lists underneath started at different heights in different\n     columns while the cards themselves looked identical. Splitting the body in two costs one\n     element per card and buys the thing the table is for - the price on one line across the row,\n     the features on one line across the row, the buttons on one. The two halves are bs-pb-0 and\n     bs-pt-0 so they meet on the subgrid's own row gap instead of stacking two card paddings.\n\n     The figure and its unit are a cluster rather than one run of inline text. As inline text the\n     unit wraps onto a second line whose height is set by the display font, which drops it half a\n     centimetre below the number with nothing in between; as a baseline cluster it either sits on\n     the number's baseline or wraps directly under it at its own line height.\n\n     THE FIGURE IS THE h1 STEP, NOT THE DISPLAY STEP. src/core/reset.css sets overflow-wrap:\n     break-word on everything, which is right for a paragraph and merciless here: a price wider\n     than its track does not overflow where an author would see it, it breaks between two digits,\n     so $120 renders as $12 above a lone 0 and reads as a different number. The display step is\n     clamp(3rem .. 5rem) and from three columns up the track is narrower than it needs. h1 is\n     clamp(2.125rem .. 3.75rem), which fits a four-glyph figure or the word Custom in a third of a\n     1024px row and still reads as the largest thing on the card. -->\n<section class=\"bs-wrap\" aria-labelledby=\"four-plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow\">Pricing</p>\n    <h2 class=\"bs-text-h2 bs-balance\" id=\"four-plans-heading\">Four steps, and you can stop at any of them</h2>\n    <p class=\"bs-lead bs-measure-lead\">Usage is measured in monitored endpoints. Nothing is metered by the request, so a bad afternoon does not become a bill.</p>\n  </div>\n\n  <div class=\"bs-grid bs-grid--rows bs-grid--tight bs-cols-1 bs-sm-cols-2 bs-lg-cols-4 bs-mt-6\" style=\"--bs-grid-rows: 4\">\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Free</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">One service, checked every five minutes.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$0</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- Tick against dash: shape, not colour, so the answer survives greyscale, paper and\n                 forced colors. The hidden word is what a screen reader gets, since the icon is\n                 aria-hidden and reads as nothing. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>1 endpoint</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Email alerts</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Status page</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>On-call rotations</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=free\">Get started</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Starter</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">A side project that people other than you depend on.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$15</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>10 endpoints, checked every minute</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>One public status page</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Slack and webhook alerts</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>On-call rotations</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=starter\">Choose Starter</a>\n      </footer>\n    </article>\n\n    <!-- Third of four, which is the middle of the paid range rather than the middle of the row. The\n         recommendation is carried by the badge and by a line in the heading that only a screen\n         reader hears; the accent edge is the quiet third of it, and it is the only part of the\n         three that a reader in forced colors loses. -->\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-border-accent\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Growth<span class=\"bs-visually-hidden\">, the recommended plan</span></h3>\n          <span class=\"bs-badge bs-badge--accent\">Recommended</span>\n        </div>\n        <p class=\"bs-card__subtitle\">A product with customers who notice an outage.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$45</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>50 endpoints, checked every 30 seconds</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>On-call rotations and escalation</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Status pages on your own domain</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>13 months of history</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=growth\">Choose Growth</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Scale</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">Several teams, several regions, one on-call schedule.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$120</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>250 endpoints, checked every 10 seconds</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Checks from nine regions</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on and audit export</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Invoicing and a signed DPA</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=scale\">Contact sales</a>\n      </footer>\n    </article>\n  </div>\n\n  <p class=\"bs-caption bs-text-center bs-mx-auto bs-mt-5\">Prices exclude VAT. Endpoints can be added or removed on any day of the cycle.</p>\n</section>",
      "href": "https://bare.style/templates#pricing-four-plans",
      "preview": "https://bare.style/preview/pricing-four-plans.html"
    },
    {
      "id": "pricing-one-plan",
      "title": "Pricing, one plan",
      "description": "A single plan set beside the argument for it, so one card is not stranded in the middle of a wide screen.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "one-plan"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/split.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/a11y.css",
        "src/utility/align.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--subtle",
        "bs-balance",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-1",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-4",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-list",
        "bs-list--divided",
        "bs-list--plain",
        "bs-list__item",
        "bs-list__meta",
        "bs-list__title",
        "bs-measure-lead",
        "bs-mt-3",
        "bs-mt-4",
        "bs-mt-5",
        "bs-nums-tabular",
        "bs-self-start",
        "bs-split",
        "bs-stack",
        "bs-text-body",
        "bs-text-display",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap",
        "bs-wrap--lg"
      ],
      "html": "<!-- THE PROBLEM THIS SOLVES. One plan centred on a 1440px page reads as a page that lost its other\n     two cards. Widening the card does not fix it, it makes a form-sized box the size of a billboard.\n     The card is the right size; what is missing is something to sit next to it, so the pane on the\n     left carries the argument a three-column table would have made by comparison. Below the split's\n     own wrap threshold the two panes stack and the phone gets the argument first and the price\n     second, which is the order a reader who has not decided yet actually wants.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px. -->\n<section class=\"bs-wrap bs-wrap--lg\" aria-labelledby=\"one-plan-heading\">\n  <div class=\"bs-split\">\n    <div class=\"bs-stack bs-gap-4\">\n      <p class=\"bs-eyebrow\">Pricing</p>\n      <h2 class=\"bs-text-h2 bs-balance\" id=\"one-plan-heading\">One plan, and everything is in it</h2>\n      <p class=\"bs-lead bs-measure-lead\">\n        No feature held back for a tier that costs four times more. You pay per editor, viewers are\n        free and unlimited, and the bill is the same in every region we sell in.\n      </p>\n\n      <!-- Title and note are one stack per row. A divided item is a wrapping row with\n           space-between, so as two siblings they take the row's own gaps: the pair ends up further\n           apart than the rule that separates one item from the next, and a reader ties each note to\n           the heading below it instead of the one above. -->\n      <ul class=\"bs-list bs-list--divided bs-mt-3\" role=\"list\">\n        <li class=\"bs-list__item\">\n          <div class=\"bs-stack bs-gap-1\">\n            <p class=\"bs-list__title bs-flow-none\">Editors are the only thing counted</p>\n            <p class=\"bs-list__meta bs-flow-none\">Anyone who can open a document and comment on it costs nothing.</p>\n          </div>\n        </li>\n        <li class=\"bs-list__item\">\n          <div class=\"bs-stack bs-gap-1\">\n            <p class=\"bs-list__title bs-flow-none\">Move up and down the same month</p>\n            <p class=\"bs-list__meta bs-flow-none\">Seats added mid-cycle are prorated to the day. Seats removed are credited.</p>\n          </div>\n        </li>\n        <li class=\"bs-list__item\">\n          <div class=\"bs-stack bs-gap-1\">\n            <p class=\"bs-list__title bs-flow-none\">Leaving takes one click</p>\n            <p class=\"bs-list__meta bs-flow-none\">Cancel from the billing page. Your data exports as JSON and stays reachable for 90 days.</p>\n          </div>\n        </li>\n      </ul>\n    </div>\n\n    <!-- bs-self-start, because a split stretches its panes: the card would otherwise take the\n         height of the argument beside it and end with a stretch of empty panel under its own last\n         line. -->\n    <article class=\"bs-card bs-self-start\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Studio</h3>\n          <span class=\"bs-badge bs-badge--subtle\">14 days free</span>\n        </div>\n        <p class=\"bs-card__subtitle\">Everything the product does, for every team that uses it.</p>\n      </header>\n\n      <div class=\"bs-card__body\">\n        <!-- The number and the period are one line to a reader and two elements to a screen reader,\n             which is what stops \"18\" and \"per editor, per month\" being read as unrelated facts.\n             A baseline cluster rather than one run of inline text: as inline text the unit wraps\n             onto a second line whose height comes from the display font, which drops it half a\n             centimetre below the number with nothing in between. Here it either sits on the\n             number's baseline or wraps directly under it at its own line height. -->\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-display bs-leading-none bs-nums-tabular\">$18</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per editor, per month</span>\n        </p>\n\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2 bs-mt-5\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- Shape carries the answer, not colour. A tick and a dash are different marks at any\n                 size, in greyscale, on paper and under forced colors, where the ok and muted inks\n                 both resolve to the reader's own single foreground and any colour difference is\n                 gone. The word behind bs-visually-hidden is what a screen reader gets, because an\n                 aria-hidden icon reads as nothing at all. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited documents, projects and viewers</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Version history kept for two years</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on, SCIM and audit export</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Support answered by an engineer within one working day</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Self-hosted install on your own hardware</span>\n          </li>\n        </ul>\n\n        <p class=\"bs-caption bs-mt-4\">Billed monthly. Yearly billing is available on request and saves two months.</p>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <!-- Block, not inline. The only action in a pricing card is the reason the card exists, and\n             a button the width of its own two words is the smallest target on the card it leads. -->\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=studio\">Start the free trial</a>\n      </footer>\n    </article>\n  </div>\n</section>",
      "href": "https://bare.style/templates#pricing-one-plan",
      "preview": "https://bare.style/preview/pricing-one-plan.html"
    },
    {
      "id": "pricing-six-plans",
      "title": "Pricing, six plans",
      "description": "Six plans as three by two rather than six across, because a sixth of a screen is not a readable column at any width.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "six-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css",
        "src/utility/border.css",
        "src/utility/display.css",
        "src/utility/grid.css",
        "src/utility/layout-responsive.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--outline",
        "bs-balance",
        "bs-border-2",
        "bs-border-accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cols-1",
        "bs-d-grid",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--rows",
        "bs-grid--tight",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-lg-cols-3",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-measure-lead",
        "bs-mt-5",
        "bs-mt-6",
        "bs-mx-auto",
        "bs-nums-tabular",
        "bs-pb-0",
        "bs-pt-0",
        "bs-sm-cols-2",
        "bs-stack",
        "bs-text-body",
        "bs-text-center",
        "bs-text-h1",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- SIX ACROSS IS NOT A LAYOUT, IT IS A LIST TURNED SIDEWAYS. On a 1440px page a sixth of the row\n     is about 200px of text once the card's own padding is out, which is three or four words a line,\n     and the reader has to hold five other columns in their head while reading it. Widening the page\n     does not help either: the type stays the same size, so a 2560px monitor buys six columns of the\n     same cramped measure with more air between them.\n\n     So the widest shape is three by two. Every card keeps a measure a person can actually read, the\n     two rows split the range into the self-serve half and the contract half, and the second row is\n     full rather than a remainder. Two by three from 480 to 1024 is the same argument one step down.\n\n     THE ALIGNMENT MATTERS MORE HERE THAN ANYWHERE. With two rows of cards, a footer that floats to\n     wherever its own feature list ended puts six buttons at six different heights, and the eye reads\n     that as six unrelated boxes rather than as one table. bs-grid--rows is subgrid: each card spans\n     three of the parent's rows and shares those tracks with the cards beside it, so within each row\n     the price band and the action band are the same height and the buttons share a y-coordinate.\n     Rows align against their own row, which is the comparison a reader is actually making.\n\n     EVERY CARD CARRIES THE SAME 2px EDGE, and only the recommended one changes its colour. That is\n     not a style choice, it is what keeps the row aligned: an item that subgrids its rows aligns\n     them inside its own border box, so a card with a 2px edge among 1px neighbours starts its first\n     track 1px lower and puts every band in that column - price, features, button - 1px out of line\n     with the rest of the table. Measured, and one pixel is exactly the amount nobody can name and\n     everybody can see.\n\n     bs-d-grid is what allows any of it. bs-card declares display: flex from bare.component, and\n     bare.component sits after bare.layout, so the display: grid that bs-grid--rows sets on its\n     children loses - layer order beats specificity outright. bare.utility is after both.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px.\n\n     FOUR ROWS, NOT THREE. The price band is a track of its own because the unit beside the figure\n     is the part that wraps: \"per editor, per month\" fits next to $9 and not next to $29, so with\n     one shared body track the feature lists underneath started at different heights in different\n     columns while the cards themselves looked identical. Splitting the body in two costs one\n     element per card and buys the thing the table is for - the price on one line across the row,\n     the features on one line across the row, the buttons on one. The two halves are bs-pb-0 and\n     bs-pt-0 so they meet on the subgrid's own row gap instead of stacking two card paddings.\n\n     The figure and its unit are a cluster rather than one run of inline text. As inline text the\n     unit wraps onto a second line whose height is set by the display font, which drops it half a\n     centimetre below the number with nothing in between; as a baseline cluster it either sits on\n     the number's baseline or wraps directly under it at its own line height.\n\n     THE FIGURE IS THE h1 STEP, NOT THE DISPLAY STEP. src/core/reset.css sets overflow-wrap:\n     break-word on everything, which is right for a paragraph and merciless here: a price wider\n     than its track does not overflow where an author would see it, it breaks between two digits,\n     so $120 renders as $12 above a lone 0 and reads as a different number. The display step is\n     clamp(3rem .. 5rem) and from three columns up the track is narrower than it needs. h1 is\n     clamp(2.125rem .. 3.75rem), which fits a four-glyph figure or the word Custom in a third of a\n     1024px row and still reads as the largest thing on the card. -->\n<section class=\"bs-wrap\" aria-labelledby=\"six-plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow\">Pricing</p>\n    <h2 class=\"bs-text-h2 bs-balance\" id=\"six-plans-heading\">Six plans, because the middle of the market is not one shape</h2>\n    <p class=\"bs-lead bs-measure-lead\">The first three are a card and a click. The last three exist because somebody in legal has to read something first.</p>\n  </div>\n\n  <div class=\"bs-grid bs-grid--rows bs-grid--tight bs-cols-1 bs-sm-cols-2 bs-lg-cols-3 bs-mt-6\" style=\"--bs-grid-rows: 4\">\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Free</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">Enough to find out whether this is the tool.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$0</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per user, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- Tick against dash: shape carries the answer, so it survives greyscale, paper and\n                 forced colors, where the ok and muted inks both resolve to one foreground. The\n                 hidden word is what a screen reader gets from an aria-hidden icon. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Up to 3 users</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>7 days of history</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Integrations</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=free\">Create an account</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Basic</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">A team that has stopped experimenting.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$8</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per user, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited users</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>90 days of history</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Automation rules</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=basic\">Start with Basic</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Standard</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">Two or three teams sharing one backlog.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$16</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per user, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Basic</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Automation rules and integrations</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Single sign-on</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=standard\">Start with Standard</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-border-accent\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Plus<span class=\"bs-visually-hidden\">, the recommended plan</span></h3>\n          <span class=\"bs-badge bs-badge--accent\">Recommended</span>\n        </div>\n        <p class=\"bs-card__subtitle\">The first plan an IT department signs off.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$28</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per user, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Standard</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on and SCIM</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited history</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=plus\">Start 14 days of Plus</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Premium</h3>\n          <span class=\"bs-badge bs-badge--outline\">Invoiced</span>\n        </div>\n        <p class=\"bs-card__subtitle\">Uptime that somebody is accountable for.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\">$48</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per user, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Plus</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>99.9 percent uptime commitment</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Annual invoicing, net 30</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=premium\">Request a quote</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Enterprise</h3>\n          <span class=\"bs-badge bs-badge--outline\">Contract</span>\n        </div>\n        <p class=\"bs-card__subtitle\">Security review first, purchase order second.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none\">Custom</span>\n          <span class=\"bs-text-body bs-fg-secondary\">from 100 users, billed yearly</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Premium</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>A named support engineer</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Signed DPA and a residency choice</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=enterprise\">Talk to sales</a>\n      </footer>\n    </article>\n  </div>\n\n  <p class=\"bs-caption bs-text-center bs-mx-auto bs-mt-5\">Prices exclude VAT. Every plan can move up or down on any day of the cycle, prorated to the day.</p>\n</section>",
      "href": "https://bare.style/templates#pricing-six-plans",
      "preview": "https://bare.style/preview/pricing-six-plans.html"
    },
    {
      "id": "pricing-three-plans",
      "title": "Pricing, three plans with a period switch",
      "description": "The classic three-up with the middle plan featured, plus a monthly and yearly switch that states what yearly saves.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "toggle",
        "three-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/app/control-segmented.css",
        "src/utility/flex.css",
        "src/utility/size.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css",
        "src/utility/border.css",
        "src/utility/display.css",
        "src/utility/grid.css",
        "src/utility/layout-responsive.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [
        "src/behaviour/pricing-period.js"
      ],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-balance",
        "bs-border-2",
        "bs-border-accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cols-1",
        "bs-d-grid",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--rows",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-max-w-3xs",
        "bs-md-cols-3",
        "bs-me-auto",
        "bs-measure-lead",
        "bs-mt-3",
        "bs-mt-5",
        "bs-nums-tabular",
        "bs-pb-0",
        "bs-pt-0",
        "bs-segmented",
        "bs-segmented__input",
        "bs-segmented__label",
        "bs-segmented__legend",
        "bs-segmented__option",
        "bs-segmented__thumb",
        "bs-stack",
        "bs-text-body",
        "bs-text-h1",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- THE MIDDLE PLAN AND THE PHONE. Featuring the middle column is right on a wide screen and wrong\n     on a phone, where the middle is the one card a reader scrolls past between the two they read.\n     The obvious fix is to move it to the top with grid ordering, and it is the wrong fix: visual\n     order would then disagree with focus and reading order, which is an SC 1.3.2 and SC 2.4.3\n     failure and makes the page worse for the readers it was meant to help. So the plan is marked\n     rather than moved - a badge with a word in it, an accent edge, and a line in the heading that\n     only a screen reader hears. All three say the same thing, and only one of them is a colour.\n\n     EVERY CARD CARRIES THE SAME 2px EDGE, and only the recommended one changes its colour. That is\n     not a style choice, it is what keeps the row aligned: an item that subgrids its rows aligns\n     them inside its own border box, so a card with a 2px edge among 1px neighbours starts its first\n     track 1px lower and puts every band in that column - price, features, button - 1px out of line\n     with the rest of the table. Measured, and one pixel is exactly the amount nobody can name and\n     everybody can see.\n\n     THE BUTTON LABELS ARE SHORT because at 768 a third of the row leaves about 105px for the label,\n     and a label that wraps to two lines in one card and not in its neighbour makes that card's\n     footer taller. The footer is bottom-aligned in its track, so the taller one starts 11px higher\n     and the whole point of the subgrid is lost to a stray word. Short, and roughly the same length\n     in every card, is the fix that does not depend on a measurement holding.\n\n     THE PERIOD SWITCH holds no state of its own. src/app/control-segmented.css is a fieldset of\n     radios that moves its own thumb with :has(), so which period is chosen survives a reload and a\n     back navigation with no script at all. The module only swaps the figures, and the markup ships\n     the monthly ones already rendered, so a reader with script blocked sees a correct monthly table\n     rather than an empty one.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px.\n\n     FOUR ROWS, NOT THREE. The price band is a track of its own because the unit beside the figure\n     is the part that wraps: \"per editor, per month\" fits next to $9 and not next to $29, so with\n     one shared body track the feature lists underneath started at different heights in different\n     columns while the cards themselves looked identical. Splitting the body in two costs one\n     element per card and buys the thing the table is for - the price on one line across the row,\n     the features on one line across the row, the buttons on one. The two halves are bs-pb-0 and\n     bs-pt-0 so they meet on the subgrid's own row gap instead of stacking two card paddings.\n\n     The figure and its unit are a cluster rather than one run of inline text. As inline text the\n     unit wraps onto a second line whose height is set by the display font, which drops it half a\n     centimetre below the number with nothing in between; as a baseline cluster it either sits on\n     the number's baseline or wraps directly under it at its own line height.\n\n     THE FIGURE IS THE h1 STEP, NOT THE DISPLAY STEP. src/core/reset.css sets overflow-wrap:\n     break-word on everything, which is right for a paragraph and merciless here: a price wider\n     than its track does not overflow where an author would see it, it breaks between two digits,\n     so $120 renders as $12 above a lone 0 and reads as a different number. The display step is\n     clamp(3rem .. 5rem) and from three columns up the track is narrower than it needs. h1 is\n     clamp(2.125rem .. 3.75rem), which fits a four-glyph figure or the word Custom in a third of a\n     1024px row and still reads as the largest thing on the card. -->\n<section class=\"bs-wrap\" data-bs-period=\"monthly\" aria-labelledby=\"three-plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow\">Pricing</p>\n    <h2 class=\"bs-text-h2 bs-balance\" id=\"three-plans-heading\">Pick the plan, not the negotiation</h2>\n    <p class=\"bs-lead bs-measure-lead\">Every plan carries the whole editor. What changes is how many people are in it and how far back the history goes.</p>\n  </div>\n\n  <!-- Capped rather than bs-segmented--fit. The fit modifier sizes the control to its own\n       max-content, which came out about 3px short of \"Monthly\" at 14px in both WebKit and\n       Chromium and broke the label over two lines - measured at every width from 320 to 1440, so it\n       is the modifier and not the viewport. A capped box around the control's default full width\n       has no such arithmetic in it: 320px at most, less than that on a phone, and one line either\n       way.\n\n       Held to the section's own start edge, not centred. The eyebrow, the heading and the lead\n       above it all begin at that edge, and a control centred on the viewport between them and the\n       card row gives the section a third alignment for one element. -->\n  <div class=\"bs-max-w-3xs bs-me-auto bs-mt-5\">\n    <fieldset class=\"bs-segmented\" style=\"--bs-segmented-count: 2\">\n      <legend class=\"bs-segmented__legend\">Billing period</legend>\n      <span class=\"bs-segmented__thumb\" aria-hidden=\"true\"></span>\n      <label class=\"bs-segmented__option\">\n        <input class=\"bs-segmented__input\" type=\"radio\" name=\"billing-period\" value=\"monthly\" checked>\n        <span class=\"bs-segmented__label\">Monthly</span>\n      </label>\n      <label class=\"bs-segmented__option\">\n        <input class=\"bs-segmented__input\" type=\"radio\" name=\"billing-period\" value=\"yearly\">\n        <span class=\"bs-segmented__label\">Yearly</span>\n      </label>\n    </fieldset>\n  </div>\n\n  <!-- One short line rather than an announcement per price. Six figures read out in sequence is a\n       paragraph of interruption for information the reader can go and read; what they need on the\n       spot is which period is now showing and what it costs them. -->\n  <p\n    class=\"bs-caption bs-mt-3\"\n    role=\"status\"\n    data-bs-monthly=\"Billed every month. Switch to yearly and two months are free.\"\n    data-bs-yearly=\"Billed once a year. Two months free, a saving of 17 percent.\"\n  >Billed every month. Switch to yearly and two months are free.</p>\n\n  <div class=\"bs-grid bs-grid--rows bs-cols-1 bs-md-cols-3 bs-mt-5\" style=\"--bs-grid-rows: 4\">\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Solo</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">One person who would rather not think about seats.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\" data-bs-monthly=\"$12\" data-bs-yearly=\"$10\">$12</span>\n          <span\n            class=\"bs-text-body bs-fg-secondary\"\n            data-bs-monthly=\"per month\"\n            data-bs-yearly=\"per month, billed yearly\"\n          >per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- Tick against dash: a difference in shape, so it survives greyscale, paper and\n                 forced colors, where the ok and muted inks both become the reader's one\n                 foreground. The hidden word is what a screen reader gets from an aria-hidden icon. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited documents</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>History kept for 90 days</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Shared editing</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Single sign-on</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=solo\">Choose Solo</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-border-accent\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Team<span class=\"bs-visually-hidden\">, the recommended plan</span></h3>\n          <span class=\"bs-badge bs-badge--accent\">Recommended</span>\n        </div>\n        <p class=\"bs-card__subtitle\">For a product team that ships together.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\" data-bs-monthly=\"$29\" data-bs-yearly=\"$24\">$29</span>\n          <span\n            class=\"bs-text-body bs-fg-secondary\"\n            data-bs-monthly=\"per editor, per month\"\n            data-bs-yearly=\"per editor, per month, billed yearly\"\n          >per editor, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited editors and projects</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>History kept for two years</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Shared editing with live cursors</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on and SCIM</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>A named support engineer</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=team\">Choose Team</a>\n      </footer>\n    </article>\n\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Business</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">When procurement, retention and uptime all have owners.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-h1 bs-leading-none bs-nums-tabular\" data-bs-monthly=\"$79\" data-bs-yearly=\"$66\">$79</span>\n          <span\n            class=\"bs-text-body bs-fg-secondary\"\n            data-bs-monthly=\"per editor, per month\"\n            data-bs-yearly=\"per editor, per month, billed yearly\"\n          >per editor, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Everything in Team</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>History kept for seven years</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>A named support engineer and a 99.9 percent uptime commitment</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Invoicing, purchase orders and a signed DPA</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/contact?plan=business\">Contact sales</a>\n      </footer>\n    </article>\n  </div>\n</section>",
      "href": "https://bare.style/templates#pricing-three-plans",
      "preview": "https://bare.style/preview/pricing-three-plans.html"
    },
    {
      "id": "pricing-two-plans",
      "title": "Pricing, two plans",
      "description": "Free against paid, side by side above 768px, with the recommended plan named in words rather than drawn with a border.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "pricing",
        "marketing",
        "card",
        "cta",
        "two-plans"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/icon.css",
        "src/data/list.css",
        "src/forms/button.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css",
        "src/utility/border.css",
        "src/utility/display.css",
        "src/utility/grid.css",
        "src/utility/layout-responsive.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        430,
        768,
        1024,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-balance",
        "bs-border-2",
        "bs-border-accent",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cols-1",
        "bs-d-grid",
        "bs-eyebrow",
        "bs-fg-secondary",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-grid",
        "bs-grid--rows",
        "bs-icon",
        "bs-icon--muted",
        "bs-icon--ok",
        "bs-icon--sm",
        "bs-lead",
        "bs-leading-none",
        "bs-list",
        "bs-list--plain",
        "bs-list__item",
        "bs-md-cols-2",
        "bs-measure-lead",
        "bs-mt-5",
        "bs-mt-6",
        "bs-mx-auto",
        "bs-nums-tabular",
        "bs-pb-0",
        "bs-pt-0",
        "bs-stack",
        "bs-text-body",
        "bs-text-center",
        "bs-text-display",
        "bs-text-h2",
        "bs-visually-hidden",
        "bs-wrap",
        "bs-wrap--lg"
      ],
      "html": "<!-- HOW THE ROWS LINE UP. bs-grid--rows is subgrid: each card spans three of the parent's rows and\n     shares those tracks with every other card, so the header band, the price-and-features band and\n     the action band are the same height in every column. That is what puts the buttons on one\n     y-coordinate no matter how many features a plan lists, and it is why each card has exactly\n     three children and no more.\n\n     bs-d-grid on the card is load bearing rather than decoration. bs-card declares display: flex\n     from bare.component, and bare.component sits after bare.layout, so the display: grid that\n     bs-grid--rows sets on its children loses outright to it - layer order beats specificity. The\n     utility is in bare.utility, which is after both, so it is the one that wins and the subgrid\n     applies. Without it the cards render as three independent flex columns and the footers go\n     ragged, silently, at exactly the widths nobody screenshots.\n\n     The alternative was a fixed min-block-size on the body, which is a guess about how long the\n     longest feature list will ever be, and is wrong the first time somebody translates the page.\n\n     EVERY CARD CARRIES THE SAME 2px EDGE, and only the recommended one changes its colour. That is\n     not a style choice, it is what keeps the row aligned: an item that subgrids its rows aligns\n     them inside its own border box, so a card with a 2px edge among 1px neighbours starts its first\n     track 1px lower and puts every band in that column - price, features, button - 1px out of line\n     with the rest of the table. Measured, and one pixel is exactly the amount nobody can name and\n     everybody can see.\n\n     WHY THE FEATURE ROWS ARE bs-flex-nowrap. A cluster wraps, and wrapping is decided on each\n     item's hypothetical size before any of them are shrunk - so a feature whose text is wider than\n     the row does not shrink and wrap its own words, it breaks the line and drops the whole sentence\n     underneath its own tick. Two short features hide it and the first long one exposes it, which\n     means it turns up after somebody has pasted their real copy in. nowrap holds the mark and the\n     sentence on one line and lets the sentence wrap inside itself, hanging beside the mark. The\n     zero floor cluster.css already puts on its children is what makes that safe at 320px.\n\n     FOUR ROWS, NOT THREE. The price band is a track of its own because the unit beside the figure\n     is the part that wraps: \"per editor, per month\" fits next to $9 and not next to $29, so with\n     one shared body track the feature lists underneath started at different heights in different\n     columns while the cards themselves looked identical. Splitting the body in two costs one\n     element per card and buys the thing the table is for - the price on one line across the row,\n     the features on one line across the row, the buttons on one. The two halves are bs-pb-0 and\n     bs-pt-0 so they meet on the subgrid's own row gap instead of stacking two card paddings.\n\n     The figure and its unit are a cluster rather than one run of inline text. As inline text the\n     unit wraps onto a second line whose height is set by the display font, which drops it half a\n     centimetre below the number with nothing in between; as a baseline cluster it either sits on\n     the number's baseline or wraps directly under it at its own line height. -->\n<section class=\"bs-wrap bs-wrap--lg\" aria-labelledby=\"two-plans-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow\">Pricing</p>\n    <h2 class=\"bs-text-h2 bs-balance\" id=\"two-plans-heading\">Start free, pay when the team arrives</h2>\n    <p class=\"bs-lead bs-measure-lead\">One project on us, for as long as you want it. The paid plan is for when more than one person needs to be in the file.</p>\n  </div>\n\n  <div class=\"bs-grid bs-grid--rows bs-cols-1 bs-md-cols-2 bs-mt-6\" style=\"--bs-grid-rows: 4\">\n    <article class=\"bs-card bs-d-grid bs-border-2\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Starter</h3>\n        </div>\n        <p class=\"bs-card__subtitle\">One person, one project, no card.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-display bs-leading-none bs-nums-tabular\">$0</span>\n          <span class=\"bs-text-body bs-fg-secondary\">forever</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <!-- A tick and a dash differ in shape, so the answer survives greyscale, paper, and\n                 forced colors, where both inks resolve to the reader's single foreground colour.\n                 The hidden word is what a screen reader gets, since the icon is aria-hidden. -->\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>One project, unlimited documents in it</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Version history kept for 30 days</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>More than one editor in a document</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Single sign-on and audit export</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--secondary bs-btn--block\" href=\"/signup?plan=starter\">Create a free workspace</a>\n      </footer>\n    </article>\n\n    <!-- The recommendation is a sentence before it is a colour. The accent edge is the quiet half\n         of it and is the half that disappears in forced colors; the badge and the hidden line in\n         the heading are what a reader in that mode, in greyscale, or listening rather than looking,\n         still gets. -->\n    <article class=\"bs-card bs-d-grid bs-border-2 bs-border-accent\">\n      <header class=\"bs-card__header\">\n        <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n          <h3 class=\"bs-card__title\">Pro<span class=\"bs-visually-hidden\">, the recommended plan</span></h3>\n          <span class=\"bs-badge bs-badge--accent\">Recommended</span>\n        </div>\n        <p class=\"bs-card__subtitle\">The plan almost every team ends up on.</p>\n      </header>\n\n      <div class=\"bs-card__body bs-pb-0\">\n        <p class=\"bs-cluster bs-cluster--baseline bs-gap-2 bs-flow-none\">\n          <span class=\"bs-text-display bs-leading-none bs-nums-tabular\">$19</span>\n          <span class=\"bs-text-body bs-fg-secondary\">per editor, per month</span>\n        </p>\n      </div>\n\n      <div class=\"bs-card__body bs-pt-0\">\n        <ul class=\"bs-list bs-list--plain bs-stack bs-gap-2\" role=\"list\">\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Unlimited projects and editors</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Version history kept for two years</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Single sign-on, SCIM and audit export</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--ok\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"m3 8.4 3.2 3.1L13 4.9\" />\n            </svg>\n            <span><span class=\"bs-visually-hidden\">Included: </span>Support answered within one working day</span>\n          </li>\n          <li class=\"bs-list__item bs-cluster bs-cluster--baseline bs-flex-nowrap bs-gap-2\">\n            <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n              <path d=\"M4 8h8\" />\n            </svg>\n            <span class=\"bs-fg-secondary\"><span class=\"bs-visually-hidden\">Not included: </span>Self-hosted install on your own hardware</span>\n          </li>\n        </ul>\n      </div>\n\n      <footer class=\"bs-card__footer\">\n        <a class=\"bs-btn bs-btn--primary bs-btn--block\" href=\"/signup?plan=pro\">Start 14 days of Pro</a>\n      </footer>\n    </article>\n  </div>\n\n  <p class=\"bs-caption bs-text-center bs-mx-auto bs-mt-5\">Prices exclude VAT. Cancel from the billing page at any time.</p>\n</section>",
      "href": "https://bare.style/templates#pricing-two-plans",
      "preview": "https://bare.style/preview/pricing-two-plans.html"
    },
    {
      "id": "profile",
      "title": "Profile page",
      "description": "A person page: avatar, name and role, the facts about them as a description list, what they work on, and their recent activity.",
      "category": "content",
      "categoryLabel": "Content",
      "kind": "page",
      "tags": [
        "content",
        "profile",
        "avatar",
        "timeline",
        "full-page"
      ],
      "links": [
        "src/app/flow-timeline.css",
        "src/data/avatar.css",
        "src/data/badge.css",
        "src/data/tag.css",
        "src/data/description-list.css",
        "src/data/card.css",
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/forms/button.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--ring",
        "bs-avatar--xl",
        "bs-avatar__initials",
        "bs-badge",
        "bs-badge--accent",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__header",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--between",
        "bs-dl",
        "bs-dl--columns",
        "bs-dl__desc",
        "bs-dl__term",
        "bs-flow-none",
        "bs-gap-1",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-4",
        "bs-gap-6",
        "bs-mt-4",
        "bs-my-6",
        "bs-stack",
        "bs-tag",
        "bs-tag-list",
        "bs-tag__label",
        "bs-text-h3",
        "bs-text-h4",
        "bs-timeline",
        "bs-timeline__body",
        "bs-timeline__content",
        "bs-timeline__item",
        "bs-timeline__marker",
        "bs-timeline__time",
        "bs-timeline__title",
        "bs-wrap",
        "bs-wrap--md"
      ],
      "html": "<main class=\"bs-wrap bs-wrap--md\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6 bs-my-6\">\n    <!-- The avatar and the name are one unit that wraps as a pair, which is why they are a cluster\n         rather than a two-column grid: at 320 the actions drop under them instead of squeezing the\n         name into a column two words wide. -->\n    <header class=\"bs-cluster bs-cluster--between bs-gap-4\">\n      <div class=\"bs-cluster bs-gap-3\">\n        <span class=\"bs-avatar bs-avatar--xl bs-avatar--ring\" role=\"img\" aria-label=\"Ada Okonjo\">\n          <span class=\"bs-avatar__initials\" aria-hidden=\"true\">AO</span>\n        </span>\n        <div class=\"bs-stack bs-gap-1\">\n          <h1 class=\"bs-text-h3 bs-flow-none\">Ada Okonjo</h1>\n          <p class=\"bs-caption bs-flow-none\">Staff engineer, data platform</p>\n          <p class=\"bs-flow-none\"><span class=\"bs-badge bs-badge--accent\">Workspace owner</span></p>\n        </div>\n      </div>\n      <div class=\"bs-cluster bs-gap-2\">\n        <a class=\"bs-btn bs-btn--primary\" href=\"/messages/new?to=ada\">Send a message</a>\n        <a class=\"bs-btn bs-btn--secondary\" href=\"/people/ada/runs\">See her runs</a>\n      </div>\n    </header>\n\n    <section class=\"bs-card\" aria-labelledby=\"profile-about-title\">\n      <header class=\"bs-card__header\">\n        <h2 class=\"bs-card__title\" id=\"profile-about-title\">About</h2>\n      </header>\n      <div class=\"bs-card__body bs-stack bs-gap-4\">\n        <p class=\"bs-flow-none\">\n          Looks after ingestion and the scheduler. Happy to be pulled into anything that has started\n          paging people at night. Reviews are usually back within a day, and slower on Fridays.\n        </p>\n\n        <dl class=\"bs-dl bs-dl--columns\">\n          <dt class=\"bs-dl__term\">Team</dt>\n          <dd class=\"bs-dl__desc\">Data platform</dd>\n          <dt class=\"bs-dl__term\">Based in</dt>\n          <dd class=\"bs-dl__desc\">Lisbon, usually online 09:00 to 18:00</dd>\n          <dt class=\"bs-dl__term\">Joined</dt>\n          <dd class=\"bs-dl__desc\">March, three years ago</dd>\n          <dt class=\"bs-dl__term\">Reachable at</dt>\n          <dd class=\"bs-dl__desc\">ada@example.com</dd>\n        </dl>\n\n        <!-- bs-tag-list removes the markers, which removes the list semantics in VoiceOver, so the\n             role goes back on explicitly.\n\n             Not --plain. That modifier takes the fill AND the border off the chip, which leaves a\n             tag with no shape at all: four values in a row read as a run of spaced words rather\n             than as four things. blog-index and blog-post use the bordered chip for the same idea. -->\n        <ul class=\"bs-tag-list\" role=\"list\" aria-label=\"What she works on\">\n          <li><span class=\"bs-tag\"><span class=\"bs-tag__label\">Ingestion</span></span></li>\n          <li><span class=\"bs-tag\"><span class=\"bs-tag__label\">Scheduler</span></span></li>\n          <li><span class=\"bs-tag\"><span class=\"bs-tag__label\">On-call rota</span></span></li>\n          <li><span class=\"bs-tag\"><span class=\"bs-tag__label\">Warehouse migration</span></span></li>\n        </ul>\n      </div>\n    </section>\n\n    <section aria-labelledby=\"profile-activity-title\">\n      <h2 class=\"bs-text-h4\" id=\"profile-activity-title\">Recent activity</h2>\n      <ol class=\"bs-timeline bs-mt-4\">\n        <li class=\"bs-timeline__item\">\n          <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n          <div class=\"bs-timeline__content\">\n            <p class=\"bs-timeline__title\">Merged a change to the retry policy</p>\n            <p class=\"bs-timeline__body\">Failed ingest jobs now back off to five minutes instead of retrying every thirty seconds.</p>\n            <time class=\"bs-timeline__time\" datetime=\"2026-08-01T14:05\">Yesterday at 14:05</time>\n          </div>\n        </li>\n        <li class=\"bs-timeline__item\" data-state=\"danger\">\n          <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n          <div class=\"bs-timeline__content\">\n            <p class=\"bs-timeline__title\">Took the overnight page for the billing pipeline</p>\n            <p class=\"bs-timeline__body\">Upstream returned errors for eleven minutes. No rows were lost.</p>\n            <time class=\"bs-timeline__time\" datetime=\"2026-07-30T02:41\">Thursday at 02:41</time>\n          </div>\n        </li>\n        <li class=\"bs-timeline__item\">\n          <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n          <div class=\"bs-timeline__content\">\n            <p class=\"bs-timeline__title\">Reviewed the warehouse migration plan</p>\n            <time class=\"bs-timeline__time\" datetime=\"2026-07-28T11:20\">Tuesday at 11:20</time>\n          </div>\n        </li>\n      </ol>\n    </section>\n  </div>\n</main>",
      "href": "https://bare.style/templates#profile",
      "preview": "https://bare.style/preview/profile.html"
    },
    {
      "id": "record-detail",
      "title": "Record detail with side panel",
      "description": "One record opened: breadcrumb, status, a timeline of what happened, and a side panel of properties and actions.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "detail",
        "data",
        "timeline",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/sidebar.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/nav/breadcrumb.css",
        "src/data/card.css",
        "src/data/badge.css",
        "src/data/description-list.css",
        "src/data/divider.css",
        "src/data/avatar.css",
        "src/app/flow-timeline.css",
        "src/forms/button.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-badge",
        "bs-badge--accent",
        "bs-breadcrumb",
        "bs-breadcrumb__current",
        "bs-breadcrumb__item",
        "bs-breadcrumb__link",
        "bs-breadcrumb__list",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-card__text",
        "bs-card__title",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cluster--tight",
        "bs-divider",
        "bs-dl",
        "bs-dl--rows",
        "bs-dl__desc",
        "bs-dl__term",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-gap-6",
        "bs-my-5",
        "bs-nums-tabular",
        "bs-py-8",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-stack",
        "bs-text-h3",
        "bs-text-h5",
        "bs-timeline",
        "bs-timeline__body",
        "bs-timeline__content",
        "bs-timeline__item",
        "bs-timeline__marker",
        "bs-timeline__time",
        "bs-timeline__title",
        "bs-wrap"
      ],
      "html": "<!-- The container owns the inline gutter and nothing owns the block one, so a page-level template\n     has to ask for it or its first line sits against the top of the viewport. -->\n<main class=\"bs-wrap bs-py-8\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\">\n    <nav class=\"bs-breadcrumb\" aria-label=\"Breadcrumb\">\n      <ol class=\"bs-breadcrumb__list\">\n        <li class=\"bs-breadcrumb__item\"><a class=\"bs-breadcrumb__link\" href=\"/\">Workspace</a></li>\n        <li class=\"bs-breadcrumb__item\"><a class=\"bs-breadcrumb__link\" href=\"/incidents\">Incidents</a></li>\n        <li class=\"bs-breadcrumb__item\"><span class=\"bs-breadcrumb__current\" aria-current=\"page\">INC-4821</span></li>\n      </ol>\n    </nav>\n\n    <header class=\"bs-stack bs-gap-3\">\n      <div class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n        <h1 class=\"bs-text-h3 bs-flow-none\">Payout settlement failing on retry</h1>\n        <!-- Accent, not danger. Investigating is work in progress; the danger fill is the colour\n             this framework reserves for something that has failed, and using it here tells a\n             reader the incident is over and lost. -->\n        <span class=\"bs-badge bs-badge--accent\">Investigating</span>\n      </div>\n      <p class=\"bs-caption bs-flow-none\">\n        Opened <time datetime=\"2026-08-01T14:22:07Z\">01 August at 14:22</time> by the settlement monitor.\n      </p>\n    </header>\n\n    <!-- Reading order is DOM order: the record comes before the panel about it, at every width.\n         The panel moves to the right of the record only when there is room for both. -->\n    <div class=\"bs-sidebar\">\n      <div class=\"bs-sidebar__main\">\n        <div class=\"bs-stack bs-gap-5\">\n          <section class=\"bs-card\" aria-labelledby=\"detail-summary\">\n            <div class=\"bs-card__body\">\n              <h2 class=\"bs-card__title\" id=\"detail-summary\">Summary</h2>\n              <p class=\"bs-card__text\">\n                Four consecutive runs of settle-payouts have returned a gateway timeout after roughly\n                four minutes. The retry budget for the schedule is spent, so no further attempt will\n                start on its own. Settlement for 1,180 accounts is queued behind it.\n              </p>\n            </div>\n          </section>\n\n          <section class=\"bs-stack bs-gap-3\" aria-labelledby=\"detail-events\">\n            <h2 class=\"bs-text-h5 bs-flow-none\" id=\"detail-events\">What happened</h2>\n            <ol class=\"bs-timeline\">\n              <li class=\"bs-timeline__item\" data-state=\"danger\">\n                <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n                <div class=\"bs-timeline__content\">\n                  <p class=\"bs-timeline__title\">Retry budget exhausted</p>\n                  <p class=\"bs-timeline__body\">Run 4812 failed after 4m 11s. No automatic attempt remains.</p>\n                  <time class=\"bs-timeline__time\" datetime=\"2026-08-01T14:26:18Z\">14:26</time>\n                </div>\n              </li>\n              <li class=\"bs-timeline__item\">\n                <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n                <div class=\"bs-timeline__content\">\n                  <p class=\"bs-timeline__title\">Assigned to Payments</p>\n                  <p class=\"bs-timeline__body\">Routed by the on-call rota after the second failure.</p>\n                  <time class=\"bs-timeline__time\" datetime=\"2026-08-01T13:31:02Z\">13:31</time>\n                </div>\n              </li>\n              <li class=\"bs-timeline__item\">\n                <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n                <div class=\"bs-timeline__content\">\n                  <p class=\"bs-timeline__title\">Gateway latency alert cleared</p>\n                  <time class=\"bs-timeline__time\" datetime=\"2026-08-01T12:58:44Z\">12:58</time>\n                </div>\n              </li>\n              <li class=\"bs-timeline__item\">\n                <span class=\"bs-timeline__marker\" aria-hidden=\"true\"></span>\n                <div class=\"bs-timeline__content\">\n                  <p class=\"bs-timeline__title\">First failure recorded</p>\n                  <p class=\"bs-timeline__body\">Run 4798 returned a gateway timeout at the settlement step.</p>\n                  <time class=\"bs-timeline__time\" datetime=\"2026-08-01T12:26:41Z\">12:26</time>\n                </div>\n              </li>\n            </ol>\n          </section>\n        </div>\n      </div>\n\n      <aside class=\"bs-sidebar__side\" aria-labelledby=\"detail-props\">\n        <div class=\"bs-card\">\n          <div class=\"bs-card__body\">\n            <h2 class=\"bs-card__title\" id=\"detail-props\">Properties</h2>\n            <!-- bs-dl--rows lays out GROUPS, so every pair is wrapped. Left as bare dt/dd the\n                 auto-fit grid places each term and each value as its own cell, and as soon as the\n                 panel is wide enough for two columns a term sits beside another pair's value. -->\n            <dl class=\"bs-dl bs-dl--rows\">\n              <div>\n                <dt class=\"bs-dl__term\">Severity</dt>\n                <dd class=\"bs-dl__desc\">Two, service degraded</dd>\n              </div>\n              <div>\n                <dt class=\"bs-dl__term\">Service</dt>\n                <dd class=\"bs-dl__desc\">Checkout</dd>\n              </div>\n              <div>\n                <dt class=\"bs-dl__term\">Owner</dt>\n                <dd class=\"bs-dl__desc\">\n                  <span class=\"bs-cluster bs-cluster--tight\">\n                    <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                      <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                    </span>\n                    Rin Alvarez\n                  </span>\n                </dd>\n              </div>\n              <div>\n                <dt class=\"bs-dl__term\">Accounts affected</dt>\n                <dd class=\"bs-dl__desc bs-nums-tabular\">1,180</dd>\n              </div>\n              <div>\n                <dt class=\"bs-dl__term\">Last change</dt>\n                <dd class=\"bs-dl__desc\"><time datetime=\"2026-08-01T14:26:18Z\">14:26</time></dd>\n              </div>\n            </dl>\n\n            <hr class=\"bs-divider bs-my-5\" />\n\n            <div class=\"bs-stack bs-gap-2\">\n              <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"button\">Retry settlement</button>\n              <button class=\"bs-btn bs-btn--secondary bs-btn--block\" type=\"button\">Reassign</button>\n              <!-- Secondary. In a column of full-width buttons a ghost has no row of siblings to be\n                   quiet against: it is a line of bold text under two pills, and it reads as a\n                   caption rather than as the third action. -->\n              <button class=\"bs-btn bs-btn--secondary bs-btn--block\" type=\"button\">Mark resolved</button>\n            </div>\n          </div>\n        </div>\n      </aside>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#record-detail",
      "preview": "https://bare.style/preview/record-detail.html"
    },
    {
      "id": "search-results",
      "title": "Search results",
      "description": "A results page: a scoped query, type facets, a spoken result count, ranked results with snippets, and pagination.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "search",
        "list",
        "data",
        "pagination",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/app/command-search.css",
        "src/app/command-filter-bar.css",
        "src/app/command-chip.css",
        "src/data/list.css",
        "src/nav/navlink.css",
        "src/nav/pagination.css",
        "src/utility/a11y.css",
        "src/utility/spacing.css",
        "src/utility/color.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-caption",
        "bs-chip",
        "bs-chip--on",
        "bs-chip__check",
        "bs-chip__count",
        "bs-chip__label",
        "bs-cluster",
        "bs-decoration-underline",
        "bs-fg-link",
        "bs-filter-bar",
        "bs-filter-bar__clear",
        "bs-filter-bar__count",
        "bs-filter-bar__label",
        "bs-filter-bar__set",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-6",
        "bs-list",
        "bs-list--divided",
        "bs-list__item",
        "bs-list__meta",
        "bs-list__title",
        "bs-navlink",
        "bs-pagination",
        "bs-pagination__gap",
        "bs-pagination__link",
        "bs-pagination__link--next",
        "bs-pagination__list",
        "bs-search",
        "bs-search__clear",
        "bs-search__field",
        "bs-search__icon",
        "bs-search__input",
        "bs-search__scope",
        "bs-search__scopeicon",
        "bs-stack",
        "bs-text-h3",
        "bs-visually-hidden",
        "bs-wrap",
        "bs-wrap--md"
      ],
      "html": "<main class=\"bs-wrap bs-wrap--md\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\">\n    <div class=\"bs-stack bs-gap-3\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">Search</h1>\n\n      <!-- The field belongs in a flex ROW: its preferred width is a flex-basis, and a flex COLUMN\n           would read that basis as a height. -->\n      <div class=\"bs-cluster bs-gap-3\">\n        <form class=\"bs-search\" role=\"search\" method=\"get\" action=\"/search\">\n          <div class=\"bs-search__field\">\n            <svg class=\"bs-search__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M20 20l-4-4\" />\n            </svg>\n            <!-- The scope is a real button, not a prefix inside the field: a word the user has to\n                 backspace through is a scope that gets deleted by accident. -->\n            <button class=\"bs-search__scope\" type=\"button\" aria-label=\"Remove the This workspace scope\">\n              This workspace\n              <svg class=\"bs-search__scopeicon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M6 6l12 12M18 6L6 18\" />\n              </svg>\n            </button>\n            <label class=\"bs-visually-hidden\" for=\"q\">Search this workspace</label>\n            <input class=\"bs-search__input\" id=\"q\" name=\"q\" type=\"search\" autocomplete=\"off\" value=\"settlement timeout\" placeholder=\"Search\" />\n            <button class=\"bs-search__clear\" type=\"button\" aria-label=\"Clear search\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M6 6l12 12M18 6L6 18\" />\n              </svg>\n            </button>\n          </div>\n        </form>\n      </div>\n\n      <div class=\"bs-filter-bar\" role=\"group\" aria-label=\"Result types\">\n        <p class=\"bs-filter-bar__label\" id=\"result-types\">Type</p>\n        <div class=\"bs-filter-bar__set\" aria-labelledby=\"result-types\">\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Documents</span>\n            <span class=\"bs-chip__count\">24</span>\n          </button>\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Incidents</span>\n            <span class=\"bs-chip__count\">11</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">Runs</span>\n            <span class=\"bs-chip__count\">318</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">People</span>\n            <span class=\"bs-chip__count\">2</span>\n          </button>\n        </div>\n        <p class=\"bs-filter-bar__count\" aria-live=\"polite\">35 results in 0.08 seconds</p>\n        <button class=\"bs-filter-bar__clear\" type=\"button\">Clear all</button>\n      </div>\n    </div>\n\n    <!-- A list of links is a list of links: the anchor is inside the row, so the row is not one\n         enormous link whose accessible name is the snippet and the timestamp as well.\n\n         Each row's three parts are one stack, because bs-list--divided is a wrapping row with\n         space-between: left as three siblings, a snippet that runs to two lines leaves room beside\n         itself and the meta line jumps up to fill it, so one result in five is laid out differently\n         from the rest.\n\n         The title carries the link ink and the underline. bs-navlink drops both by default, which\n         is right for a column of navigation but wrong here, where the title IS the result's link\n         and the only thing a reader can click. bs-navlink and not --prose so the row keeps the\n         28px target: this title is not a link inside a sentence, so SC 2.5.8 has no exception\n         to give it. -->\n    <ul class=\"bs-list bs-list--divided\" role=\"list\" aria-label=\"Search results\">\n      <li class=\"bs-list__item\">\n        <div class=\"bs-stack bs-gap-2\">\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/runbooks/settlement-timeouts\">\n            <span class=\"bs-list__title\">Runbook: settlement timeouts</span>\n          </a>\n          <p class=\"bs-caption bs-flow-none\">\n            What to check when settle-payouts returns a gateway timeout, in the order that resolves it\n            fastest, and who to wake if the retry budget is already spent.\n          </p>\n          <span class=\"bs-list__meta\">Document, updated 2 days ago by Rin Alvarez</span>\n        </div>\n      </li>\n      <li class=\"bs-list__item\">\n        <div class=\"bs-stack bs-gap-2\">\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/incidents/4821\">\n            <span class=\"bs-list__title\">INC-4821 Payout settlement failing on retry</span>\n          </a>\n          <p class=\"bs-caption bs-flow-none\">\n            Four consecutive runs returned a gateway timeout after roughly four minutes. Settlement for\n            1,180 accounts is queued behind it.\n          </p>\n          <span class=\"bs-list__meta\">Incident, opened today at 14:22</span>\n        </div>\n      </li>\n      <li class=\"bs-list__item\">\n        <div class=\"bs-stack bs-gap-2\">\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/docs/timeouts\">\n            <span class=\"bs-list__title\">Timeout budgets across services</span>\n          </a>\n          <p class=\"bs-caption bs-flow-none\">\n            Every hop from the edge to the payment gateway, with the budget it is allowed and what\n            happens when it is exceeded.\n          </p>\n          <span class=\"bs-list__meta\">Document, updated 3 weeks ago by Tomas Ferro</span>\n        </div>\n      </li>\n      <li class=\"bs-list__item\">\n        <div class=\"bs-stack bs-gap-2\">\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/incidents/4655\">\n            <span class=\"bs-list__title\">INC-4655 Gateway latency during the July release</span>\n          </a>\n          <p class=\"bs-caption bs-flow-none\">\n            Closed. The same timeout pattern, traced to a connection pool that was not resized with the\n            instance count.\n          </p>\n          <span class=\"bs-list__meta\">Incident, closed 12 days ago</span>\n        </div>\n      </li>\n      <li class=\"bs-list__item\">\n        <div class=\"bs-stack bs-gap-2\">\n          <a class=\"bs-navlink bs-fg-link bs-decoration-underline\" href=\"/docs/retry-policy\">\n            <span class=\"bs-list__title\">Retry policy for scheduled jobs</span>\n          </a>\n          <p class=\"bs-caption bs-flow-none\">\n            How many attempts a schedule is given, how the backoff is calculated, and what happens to a\n            job whose budget runs out mid-batch.\n          </p>\n          <span class=\"bs-list__meta\">Document, updated 5 weeks ago by Mira Okonkwo</span>\n        </div>\n      </li>\n    </ul>\n\n    <nav class=\"bs-pagination\" aria-label=\"Search result pages\">\n      <ul class=\"bs-pagination__list\">\n        <li>\n          <a class=\"bs-pagination__link\" href=\"?q=settlement+timeout&amp;page=1\" aria-current=\"page\" aria-label=\"Page 1, current page\">1</a>\n        </li>\n        <li><a class=\"bs-pagination__link\" href=\"?q=settlement+timeout&amp;page=2\">2</a></li>\n        <li><a class=\"bs-pagination__link\" href=\"?q=settlement+timeout&amp;page=3\">3</a></li>\n        <li aria-hidden=\"true\"><span class=\"bs-pagination__gap\">...</span></li>\n        <li><a class=\"bs-pagination__link\" href=\"?q=settlement+timeout&amp;page=7\">7</a></li>\n        <li>\n          <a class=\"bs-pagination__link bs-pagination__link--next\" href=\"?q=settlement+timeout&amp;page=2\" rel=\"next\">Next</a>\n        </li>\n      </ul>\n    </nav>\n  </div>\n</main>",
      "href": "https://bare.style/templates#search-results",
      "preview": "https://bare.style/preview/search-results.html"
    },
    {
      "id": "settings",
      "title": "Settings page with a sidebar",
      "description": "An application settings page: section navigation in the pane, a profile form, notification switches and one save bar per card.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "settings",
        "shell",
        "form",
        "navigation",
        "full-page"
      ],
      "links": [
        "src/app/shell-frame.css",
        "src/app/shell-rail.css",
        "src/app/shell-topbar.css",
        "src/app/shell-sidebar.css",
        "src/app/shell-main.css",
        "src/nav/sidebar-nav.css",
        "src/data/card.css",
        "src/forms/field.css",
        "src/forms/label.css",
        "src/forms/input.css",
        "src/forms/help.css",
        "src/forms/select.css",
        "src/forms/switch.css",
        "src/forms/button.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/utility/spacing.css",
        "src/utility/size.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-card",
        "bs-card__body",
        "bs-card__footer",
        "bs-card__header",
        "bs-card__subtitle",
        "bs-card__title",
        "bs-cluster",
        "bs-dropdown",
        "bs-dropdown__control",
        "bs-field",
        "bs-gap-2",
        "bs-gap-4",
        "bs-gap-5",
        "bs-help",
        "bs-input",
        "bs-label",
        "bs-max-w-md",
        "bs-shell",
        "bs-shell-main",
        "bs-shell-main__content",
        "bs-shell-rail",
        "bs-shell-rail__icon",
        "bs-shell-rail__item",
        "bs-shell-rail__item--current",
        "bs-shell-rail__label",
        "bs-shell-sidebar",
        "bs-shell-sidebar__body",
        "bs-shell-sidebar__close",
        "bs-shell-sidebar__header",
        "bs-shell-sidebar__title",
        "bs-shell-topbar",
        "bs-shell-topbar__icon",
        "bs-shell-topbar__title",
        "bs-shell-topbar__toggle",
        "bs-shell__scrim",
        "bs-sidenav",
        "bs-sidenav__group",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-sidenav__list--nested",
        "bs-stack",
        "bs-switch",
        "bs-switch__control",
        "bs-switch__label",
        "bs-switch__track",
        "bs-text-h3",
        "bs-visually-hidden-focusable"
      ],
      "html": "<div class=\"bs-shell\">\n  <nav class=\"bs-shell-rail\" aria-label=\"Sections\">\n    <a class=\"bs-shell-rail__item\" href=\"/pipelines\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <path d=\"M4 7h6M14 7h6M4 17h6M14 17h6\" />\n        <circle cx=\"12\" cy=\"7\" r=\"2\" />\n        <circle cx=\"12\" cy=\"17\" r=\"2\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Pipelines</span>\n    </a>\n    <a class=\"bs-shell-rail__item\" href=\"/sources\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <ellipse cx=\"12\" cy=\"6.5\" rx=\"7\" ry=\"3\" />\n        <path d=\"M5 6.5v11c0 1.7 3.1 3 7 3s7-1.3 7-3v-11M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Sources</span>\n    </a>\n    <a class=\"bs-shell-rail__item bs-shell-rail__item--current\" href=\"/settings\" aria-current=\"page\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <circle cx=\"12\" cy=\"12\" r=\"3.2\" />\n        <path d=\"M12 3.5v2.2M12 18.3v2.2M20.5 12h-2.2M5.7 12H3.5M18 6l-1.6 1.6M7.6 16.4 6 18M18 18l-1.6-1.6M7.6 7.6 6 6\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Settings</span>\n    </a>\n  </nav>\n\n  <header class=\"bs-shell-topbar\">\n    <a class=\"bs-visually-hidden-focusable\" href=\"#shell-main\">Skip to the work area</a>\n    <a class=\"bs-shell-topbar__toggle\" href=\"#shell-nav\" aria-controls=\"shell-nav\" aria-label=\"Open settings navigation\">\n      <svg class=\"bs-shell-topbar__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n        <path d=\"M4 7h16M4 12h16M4 17h16\" />\n      </svg>\n    </a>\n    <!-- The bar names the workspace, the pane names the section and the h1 names the page. Repeating\n         \"Settings\" in the bar and in the pane gives a reader two headings for one thing and none for\n         the other two. -->\n    <p class=\"bs-shell-topbar__title\">Northbridge Operations</p>\n  </header>\n\n  <aside class=\"bs-shell-sidebar\" id=\"shell-nav\" aria-label=\"Settings sections\">\n    <div class=\"bs-shell-sidebar__header\">\n      <p class=\"bs-shell-sidebar__title\">Settings</p>\n      <a class=\"bs-shell-sidebar__close\" href=\"#_\" aria-label=\"Close settings navigation\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </a>\n    </div>\n    <div class=\"bs-shell-sidebar__body\">\n      <nav class=\"bs-sidenav\" aria-label=\"Settings sections\">\n        <ul class=\"bs-sidenav__list\">\n          <li>\n            <p class=\"bs-sidenav__group\" id=\"settings-you\">You</p>\n            <!-- A nested list goes inside the item it belongs to and points its label at the id of\n                 the group above it, or the grouping exists for sighted readers only. -->\n            <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"settings-you\">\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/profile\" aria-current=\"page\">Profile</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/notifications\">Notifications</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/security\">Password and devices</a></li>\n            </ul>\n          </li>\n          <li>\n            <p class=\"bs-sidenav__group\" id=\"settings-workspace\">Workspace</p>\n            <ul class=\"bs-sidenav__list bs-sidenav__list--nested\" aria-labelledby=\"settings-workspace\">\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/members\">Members</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/billing\">Billing</a></li>\n              <li><a class=\"bs-sidenav__link\" href=\"/settings/api\">API keys</a></li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n    </div>\n  </aside>\n\n  <a class=\"bs-shell__scrim\" href=\"#_\" aria-label=\"Close settings navigation\"></a>\n\n  <main class=\"bs-shell-main\" id=\"shell-main\" tabindex=\"-1\">\n    <div class=\"bs-shell-main__content\">\n      <!-- A settings form is read one field at a time, so the column is capped rather than left to\n           the width of the work area: a text input the width of a laptop is a target the eye has to\n           travel across to find the caret it just left. -->\n      <div class=\"bs-stack bs-gap-5 bs-max-w-md\">\n        <h1 class=\"bs-text-h3\">Profile</h1>\n\n        <!-- One save control per card, not one for the page. A single bar at the bottom of a long\n             settings page means a person editing the top field has to scroll past everything they\n             did not touch to commit it. -->\n        <form class=\"bs-card\" method=\"post\" action=\"/settings/profile\">\n          <header class=\"bs-card__header\">\n            <h2 class=\"bs-card__title\">Who you are</h2>\n            <p class=\"bs-card__subtitle\">This is what teammates see beside your comments and runs.</p>\n          </header>\n\n          <div class=\"bs-card__body bs-stack bs-gap-4\">\n            <div class=\"bs-field\">\n              <label class=\"bs-label\" for=\"settings-name\">Display name</label>\n              <input class=\"bs-input\" id=\"settings-name\" name=\"name\" type=\"text\" value=\"Ada Okonjo\" autocomplete=\"name\" />\n            </div>\n\n            <div class=\"bs-field\">\n              <label class=\"bs-label\" for=\"settings-handle\">Handle</label>\n              <input class=\"bs-input\" id=\"settings-handle\" name=\"handle\" type=\"text\" value=\"ada\" autocomplete=\"username\" aria-describedby=\"settings-handle-help\" />\n              <p class=\"bs-help\" id=\"settings-handle-help\">Letters, numbers and hyphens. Mentions use this, so changing it breaks old ones.</p>\n            </div>\n\n            <div class=\"bs-field\">\n              <label class=\"bs-label\" for=\"settings-email\">Email</label>\n              <input class=\"bs-input\" id=\"settings-email\" name=\"email\" type=\"email\" value=\"ada@example.com\" autocomplete=\"email\" inputmode=\"email\" aria-describedby=\"settings-email-help\" />\n              <p class=\"bs-help\" id=\"settings-email-help\">Changing this sends a confirmation link to the new address before it takes effect.</p>\n            </div>\n\n            <div class=\"bs-field\">\n              <label class=\"bs-label\" for=\"settings-timezone\">Time zone</label>\n              <span class=\"bs-dropdown\">\n                <select class=\"bs-dropdown__control\" id=\"settings-timezone\" name=\"timezone\">\n                  <option>Lisbon</option>\n                  <option selected>London</option>\n                  <option>Berlin</option>\n                  <option>Nairobi</option>\n                  <option>Singapore</option>\n                </select>\n              </span>\n            </div>\n          </div>\n\n          <footer class=\"bs-card__footer\">\n            <div class=\"bs-cluster bs-gap-2\">\n              <button class=\"bs-btn bs-btn--primary\" type=\"submit\">Save profile</button>\n              <!-- Secondary. Discard is the only alternative to Save here, and a ghost with no fill\n                   and no border at rest reads as a caption rather than as the second control. -->\n              <button class=\"bs-btn bs-btn--secondary\" type=\"reset\">Discard</button>\n            </div>\n          </footer>\n        </form>\n\n        <form class=\"bs-card\" method=\"post\" action=\"/settings/notifications\">\n          <header class=\"bs-card__header\">\n            <h2 class=\"bs-card__title\">What we email you about</h2>\n            <p class=\"bs-card__subtitle\">Anything switched off here still appears in the alerts list.</p>\n          </header>\n\n          <div class=\"bs-card__body bs-stack bs-gap-4\">\n            <!-- role=\"switch\" on the control is what makes a screen reader say \"on\" and \"off\"\n                 rather than \"checked\" and \"not checked\", which is the difference between a\n                 preference and a form answer. -->\n            <label class=\"bs-switch\">\n              <input class=\"bs-switch__control\" type=\"checkbox\" role=\"switch\" name=\"notify-failures\" checked />\n              <span class=\"bs-switch__track\" aria-hidden=\"true\"></span>\n              <span class=\"bs-switch__label\">A pipeline I own fails</span>\n            </label>\n\n            <label class=\"bs-switch\">\n              <input class=\"bs-switch__control\" type=\"checkbox\" role=\"switch\" name=\"notify-mentions\" checked />\n              <span class=\"bs-switch__track\" aria-hidden=\"true\"></span>\n              <span class=\"bs-switch__label\">Somebody mentions me in a comment</span>\n            </label>\n\n            <label class=\"bs-switch\">\n              <input class=\"bs-switch__control\" type=\"checkbox\" role=\"switch\" name=\"notify-weekly\" />\n              <span class=\"bs-switch__track\" aria-hidden=\"true\"></span>\n              <span class=\"bs-switch__label\">Weekly summary of every run in the workspace</span>\n            </label>\n\n            <label class=\"bs-switch\">\n              <input class=\"bs-switch__control\" type=\"checkbox\" role=\"switch\" name=\"notify-product\" />\n              <span class=\"bs-switch__track\" aria-hidden=\"true\"></span>\n              <span class=\"bs-switch__label\">Product news, at most once a month</span>\n            </label>\n          </div>\n\n          <footer class=\"bs-card__footer\">\n            <div class=\"bs-cluster bs-gap-2\">\n              <button class=\"bs-btn bs-btn--primary\" type=\"submit\">Save notifications</button>\n            </div>\n          </footer>\n        </form>\n      </div>\n    </div>\n  </main>\n</div>",
      "href": "https://bare.style/templates#settings",
      "preview": "https://bare.style/preview/settings.html"
    },
    {
      "id": "sign-in",
      "title": "Sign in with providers",
      "description": "A sign-in screen with third-party buttons, email and password with a reveal, a recovery route and a way to sign up.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "sign-in",
        "form",
        "full-page",
        "app"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-provider.css",
        "src/app/auth-form.css",
        "src/app/auth-password.css",
        "src/forms/input.css",
        "src/forms/checkbox.css",
        "src/forms/button.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-form",
        "bs-auth-form__actions",
        "bs-auth-form__aside",
        "bs-auth-form__choice",
        "bs-auth-form__divide",
        "bs-auth-form__field",
        "bs-auth-form__hint",
        "bs-auth-form__label",
        "bs-auth-form__options",
        "bs-auth-form__row",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__head",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__subtitle",
        "bs-auth__title",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-checkbox__control",
        "bs-input",
        "bs-password",
        "bs-password__icon",
        "bs-password__icon--hidden",
        "bs-password__icon--shown",
        "bs-password__icons",
        "bs-password__input",
        "bs-password__toggle",
        "bs-provider",
        "bs-provider-set",
        "bs-provider__label",
        "bs-provider__mark"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <!-- main is on the card, not on the wrapper: a keyboard user who skips to the main content\n         should land on the task, not on the logo above it. -->\n    <main class=\"bs-auth__card\">\n      <div class=\"bs-auth__head\">\n        <h1 class=\"bs-auth__title\">Sign in</h1>\n        <p class=\"bs-auth__subtitle\">Use the address your workspace was invited on.</p>\n      </div>\n\n      <!-- The providers come before the credential form because most returning people take one of\n           them, and a set that sits under the submit button is a set nobody scrolls to. The marks\n           are placeholders: a provider logo is a trademark with its own usage rules, so the slot is\n           sized and coloured here and the artwork is yours to drop in. -->\n      <div class=\"bs-provider-set\">\n        <a class=\"bs-provider\" href=\"/auth/sso\">\n          <span class=\"bs-provider__mark\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n              <path d=\"M12 3.5 19 6v5.5c0 4-2.9 7.4-7 8.9-4.1-1.5-7-4.9-7-8.9V6Z\" />\n            </svg>\n          </span>\n          <span class=\"bs-provider__label\">Continue with single sign-on</span>\n        </a>\n        <a class=\"bs-provider\" href=\"/auth/passkey\">\n          <span class=\"bs-provider__mark\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n              <circle cx=\"9\" cy=\"9\" r=\"4.2\" />\n              <path d=\"M12 11.5 20 19.5M17.5 17l1.8-1.8M15 14.5l1.8-1.8\" />\n            </svg>\n          </span>\n          <span class=\"bs-provider__label\">Continue with a passkey</span>\n        </a>\n      </div>\n\n      <form class=\"bs-auth-form\" method=\"post\" action=\"/session\" novalidate>\n        <div class=\"bs-auth-form__divide\"><span>or use your password</span></div>\n\n        <div class=\"bs-auth-form__field\">\n          <label class=\"bs-auth-form__label\" for=\"signin-email\">Email</label>\n          <!-- autocomplete is not decoration: SC 1.3.5 asks for it on anything collecting\n               information about the user, and it is what lets a password manager fill the pair. -->\n          <input\n            class=\"bs-input\"\n            id=\"signin-email\"\n            name=\"email\"\n            type=\"email\"\n            autocomplete=\"username\"\n            inputmode=\"email\"\n            required\n            aria-describedby=\"signin-email-hint\"\n          />\n          <p class=\"bs-auth-form__hint\" id=\"signin-email-hint\">Personal addresses are not on this workspace.</p>\n        </div>\n\n        <div class=\"bs-auth-form__field\">\n          <div class=\"bs-auth-form__row\">\n            <label class=\"bs-auth-form__label\" for=\"signin-password\">Password</label>\n            <a class=\"bs-auth-form__aside\" href=\"/reset\">Forgot it</a>\n          </div>\n          <div class=\"bs-password\">\n            <input\n              class=\"bs-input bs-password__input\"\n              id=\"signin-password\"\n              name=\"password\"\n              type=\"password\"\n              autocomplete=\"current-password\"\n              required\n            />\n            <!-- type=\"button\" is not optional. Inside a form the default is submit, so a reveal\n                 control without it posts the credentials it was asked to reveal. -->\n            <button\n              class=\"bs-password__toggle\"\n              type=\"button\"\n              aria-controls=\"signin-password\"\n              aria-pressed=\"false\"\n              aria-label=\"Show password\"\n            >\n              <span class=\"bs-password__icons\" aria-hidden=\"true\">\n                <svg class=\"bs-password__icon bs-password__icon--shown\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n                  <path d=\"M2.5 12S6.4 5.8 12 5.8 21.5 12 21.5 12 17.6 18.2 12 18.2 2.5 12 2.5 12Z\" />\n                  <circle cx=\"12\" cy=\"12\" r=\"2.8\" />\n                </svg>\n                <svg class=\"bs-password__icon bs-password__icon--hidden\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n                  <path d=\"M4 4l16 16M9.6 9.7A2.8 2.8 0 0 0 12 14.8c.7 0 1.4-.3 1.9-.7\" />\n                  <path d=\"M6.3 6.9C4 8.5 2.5 12 2.5 12s3.9 6.2 9.5 6.2c1.6 0 3-.5 4.2-1.2M17.4 15A13 13 0 0 0 21.5 12S17.6 5.8 12 5.8c-.7 0-1.4.1-2 .3\" />\n                </svg>\n              </span>\n            </button>\n          </div>\n        </div>\n\n        <div class=\"bs-auth-form__options\">\n          <label class=\"bs-auth-form__choice\">\n            <!-- bs-checkbox__control, because auth-form.css styles no control: it owns the row and\n                 leaves the box to src/forms/checkbox. Without the class the box is the UA default\n                 13px with no accent, visibly smaller and greyer than the same control on every\n                 other screen in this set. -->\n            <input class=\"bs-checkbox__control\" type=\"checkbox\" name=\"remember\" value=\"1\" />\n            <span>Keep me signed in</span>\n          </label>\n        </div>\n\n        <div class=\"bs-auth-form__actions\">\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"submit\">Sign in</button>\n        </div>\n      </form>\n    </main>\n\n    <p class=\"bs-auth__alt\">No account yet? <a href=\"/signup\">Create one</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#sign-in",
      "preview": "https://bare.style/preview/sign-in.html"
    },
    {
      "id": "sign-up",
      "title": "Create account screen",
      "description": "A sign-up screen: name, work email, a new password with its rule stated up front, the terms consent, and a route back to sign in.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "sign-up",
        "form",
        "full-page",
        "app"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-provider.css",
        "src/app/auth-form.css",
        "src/app/auth-password.css",
        "src/forms/input.css",
        "src/forms/checkbox.css",
        "src/forms/button.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-form",
        "bs-auth-form__actions",
        "bs-auth-form__choice",
        "bs-auth-form__divide",
        "bs-auth-form__field",
        "bs-auth-form__hint",
        "bs-auth-form__label",
        "bs-auth-form__note",
        "bs-auth-form__options",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__head",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__subtitle",
        "bs-auth__title",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-checkbox__control",
        "bs-input",
        "bs-password",
        "bs-password__icon",
        "bs-password__icon--hidden",
        "bs-password__icon--shown",
        "bs-password__icons",
        "bs-password__input",
        "bs-password__toggle",
        "bs-provider",
        "bs-provider-set",
        "bs-provider__label",
        "bs-provider__mark"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <main class=\"bs-auth__card\">\n      <div class=\"bs-auth__head\">\n        <h1 class=\"bs-auth__title\">Create your account</h1>\n        <p class=\"bs-auth__subtitle\">Two minutes, and the first project is on us for a month.</p>\n      </div>\n\n      <div class=\"bs-provider-set\">\n        <a class=\"bs-provider\" href=\"/auth/sso\">\n          <span class=\"bs-provider__mark\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n              <path d=\"M12 3.5 19 6v5.5c0 4-2.9 7.4-7 8.9-4.1-1.5-7-4.9-7-8.9V6Z\" />\n            </svg>\n          </span>\n          <span class=\"bs-provider__label\">Sign up with single sign-on</span>\n        </a>\n      </div>\n\n      <form class=\"bs-auth-form\" method=\"post\" action=\"/accounts\" novalidate>\n        <div class=\"bs-auth-form__divide\"><span>or with an email address</span></div>\n\n        <div class=\"bs-auth-form__field\">\n          <label class=\"bs-auth-form__label\" for=\"signup-name\">Full name</label>\n          <input class=\"bs-input\" id=\"signup-name\" name=\"name\" type=\"text\" autocomplete=\"name\" required />\n        </div>\n\n        <div class=\"bs-auth-form__field\">\n          <label class=\"bs-auth-form__label\" for=\"signup-email\">Work email</label>\n          <input\n            class=\"bs-input\"\n            id=\"signup-email\"\n            name=\"email\"\n            type=\"email\"\n            autocomplete=\"email\"\n            inputmode=\"email\"\n            required\n            aria-describedby=\"signup-email-hint\"\n          />\n          <p class=\"bs-auth-form__hint\" id=\"signup-email-hint\">We match your workspace on the domain, so use the one you work from.</p>\n        </div>\n\n        <div class=\"bs-auth-form__field\">\n          <label class=\"bs-auth-form__label\" for=\"signup-password\">Password</label>\n          <div class=\"bs-password\">\n            <!-- new-password, not current-password. It is what tells a manager to offer a generated\n                 one rather than to fill the password for some other site. -->\n            <input\n              class=\"bs-input bs-password__input\"\n              id=\"signup-password\"\n              name=\"password\"\n              type=\"password\"\n              autocomplete=\"new-password\"\n              minlength=\"12\"\n              required\n              aria-describedby=\"signup-password-hint\"\n            />\n            <button\n              class=\"bs-password__toggle\"\n              type=\"button\"\n              aria-controls=\"signup-password\"\n              aria-pressed=\"false\"\n              aria-label=\"Show password\"\n            >\n              <span class=\"bs-password__icons\" aria-hidden=\"true\">\n                <svg class=\"bs-password__icon bs-password__icon--shown\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n                  <path d=\"M2.5 12S6.4 5.8 12 5.8 21.5 12 21.5 12 17.6 18.2 12 18.2 2.5 12 2.5 12Z\" />\n                  <circle cx=\"12\" cy=\"12\" r=\"2.8\" />\n                </svg>\n                <svg class=\"bs-password__icon bs-password__icon--hidden\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n                  <path d=\"M4 4l16 16M9.6 9.7A2.8 2.8 0 0 0 12 14.8c.7 0 1.4-.3 1.9-.7\" />\n                  <path d=\"M6.3 6.9C4 8.5 2.5 12 2.5 12s3.9 6.2 9.5 6.2c1.6 0 3-.5 4.2-1.2M17.4 15A13 13 0 0 0 21.5 12S17.6 5.8 12 5.8c-.7 0-1.4.1-2 .3\" />\n                </svg>\n              </span>\n            </button>\n          </div>\n          <!-- The rule is stated before the attempt rather than as an error after it. -->\n          <p class=\"bs-auth-form__hint\" id=\"signup-password-hint\">At least twelve characters. A phrase you can remember beats a short one you cannot.</p>\n        </div>\n\n        <div class=\"bs-auth-form__options\">\n          <label class=\"bs-auth-form__choice\">\n            <!-- bs-checkbox__control, because auth-form.css styles no control: it owns the row and\n                 leaves the box to src/forms/checkbox. Without the class the box is the UA default\n                 13px with no accent, visibly smaller and greyer than the same control on every\n                 other screen in this set. -->\n            <input class=\"bs-checkbox__control\" type=\"checkbox\" name=\"terms\" value=\"1\" required />\n            <span>I agree to the terms and the privacy notice</span>\n          </label>\n        </div>\n\n        <div class=\"bs-auth-form__actions\">\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"submit\">Create account</button>\n        </div>\n\n        <p class=\"bs-auth-form__note\">No card until you invite a second person.</p>\n      </form>\n    </main>\n\n    <p class=\"bs-auth__alt\">Already have an account? <a href=\"/signin\">Sign in</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#sign-up",
      "preview": "https://bare.style/preview/sign-up.html"
    },
    {
      "id": "stats-overview",
      "title": "Stats overview row",
      "description": "The band a dashboard opens on: four key figures with movement, a trend plot, a target and a freshness note.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "block",
      "tags": [
        "app",
        "metrics",
        "dashboard",
        "data"
      ],
      "links": [
        "src/app/metric-stat-grid.css",
        "src/app/metric-kpi.css",
        "src/app/metric-delta.css",
        "src/app/metric-sparkline.css",
        "src/layout/stack.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        1440
      ],
      "classes": [
        "bs-delta",
        "bs-delta--bad",
        "bs-delta--flat",
        "bs-delta--good",
        "bs-delta--neutral",
        "bs-delta--up",
        "bs-delta__amount",
        "bs-delta__context",
        "bs-delta__direction",
        "bs-delta__mark",
        "bs-flow-none",
        "bs-gap-4",
        "bs-kpi",
        "bs-kpi--stale",
        "bs-kpi__figure",
        "bs-kpi__label",
        "bs-kpi__movement",
        "bs-kpi__note",
        "bs-kpi__plot",
        "bs-kpi__target",
        "bs-kpi__target-label",
        "bs-kpi__target-value",
        "bs-kpi__unit",
        "bs-kpi__value",
        "bs-nums-tabular",
        "bs-sparkline",
        "bs-sparkline--danger",
        "bs-sparkline__caption",
        "bs-sparkline__plot",
        "bs-sparkline__point",
        "bs-sparkline__range",
        "bs-sparkline__svg",
        "bs-stack",
        "bs-stat-grid",
        "bs-stat-grid__tile",
        "bs-text-h5"
      ],
      "html": "<!-- A block starts at h2: it is dropped into somebody else's page and cannot know what level it\n     lands at. -->\n<section class=\"bs-stack bs-gap-4\" aria-labelledby=\"overview-title\">\n  <h2 class=\"bs-text-h5 bs-flow-none\" id=\"overview-title\">Last 7 days</h2>\n\n  <!-- A list, because the tiles are a set of like things and the count then reaches a screen\n       reader without anyone writing it down twice and getting it wrong the second time. -->\n  <ul class=\"bs-stat-grid\" role=\"list\">\n    <li class=\"bs-stat-grid__tile\">\n      <article class=\"bs-kpi\" aria-labelledby=\"kpi-orders\">\n        <h3 class=\"bs-kpi__label\" id=\"kpi-orders\">Orders settled</h3>\n        <p class=\"bs-kpi__figure\">\n          <span class=\"bs-kpi__value bs-nums-tabular\">18,204</span>\n        </p>\n        <p class=\"bs-kpi__movement\">\n          <span class=\"bs-delta bs-delta--up bs-delta--good\">\n            <span class=\"bs-delta__mark\" aria-hidden=\"true\"></span>\n            <span class=\"bs-delta__amount\">6.2%</span>\n            <span class=\"bs-delta__direction\">up</span>\n            <span class=\"bs-delta__context\">vs previous 7 days</span>\n          </span>\n        </p>\n        <div class=\"bs-kpi__plot\">\n          <figure class=\"bs-sparkline\">\n            <figcaption class=\"bs-sparkline__caption\">\n              <span class=\"bs-sparkline__range\">low 2,140, high 3,020, by day</span>\n            </figcaption>\n            <svg\n              class=\"bs-sparkline__svg\"\n              viewBox=\"0 0 100 30\"\n              preserveAspectRatio=\"none\"\n              role=\"img\"\n              aria-label=\"Orders per day, 2,140 to 3,020 over 7 days, ending at 3,020\"\n            >\n              <polyline points=\"0,21 16,18 33,22 50,14 66,16 83,9 100,4\" />\n            </svg>\n          </figure>\n        </div>\n        <p class=\"bs-kpi__note\">Updated 2 minutes ago</p>\n      </article>\n    </li>\n\n    <li class=\"bs-stat-grid__tile\">\n      <article class=\"bs-kpi\" aria-labelledby=\"kpi-value\">\n        <h3 class=\"bs-kpi__label\" id=\"kpi-value\">Settled value</h3>\n        <p class=\"bs-kpi__figure\">\n          <span class=\"bs-kpi__value bs-nums-tabular\">2.41</span>\n          <span class=\"bs-kpi__unit\">million EUR</span>\n        </p>\n        <p class=\"bs-kpi__movement\">\n          <span class=\"bs-delta bs-delta--up bs-delta--good\">\n            <span class=\"bs-delta__mark\" aria-hidden=\"true\"></span>\n            <span class=\"bs-delta__amount\">1.8%</span>\n            <span class=\"bs-delta__direction\">up</span>\n            <span class=\"bs-delta__context\">vs previous 7 days</span>\n          </span>\n        </p>\n        <p class=\"bs-kpi__target\">\n          <span class=\"bs-kpi__target-label\">Target</span>\n          <span class=\"bs-kpi__target-value bs-nums-tabular\">2.60</span>\n        </p>\n        <p class=\"bs-kpi__note\">Updated 2 minutes ago</p>\n      </article>\n    </li>\n\n    <li class=\"bs-stat-grid__tile\">\n      <article class=\"bs-kpi\" aria-labelledby=\"kpi-failures\">\n        <h3 class=\"bs-kpi__label\" id=\"kpi-failures\">Failed settlements</h3>\n        <p class=\"bs-kpi__figure\">\n          <span class=\"bs-kpi__value bs-nums-tabular\">147</span>\n        </p>\n        <p class=\"bs-kpi__movement\">\n          <!-- Up is not automatically good. The direction and the judgement are separate\n               modifiers so a rising failure count reads as bad rather than as progress. -->\n          <span class=\"bs-delta bs-delta--up bs-delta--bad\">\n            <span class=\"bs-delta__mark\" aria-hidden=\"true\"></span>\n            <span class=\"bs-delta__amount\">31%</span>\n            <span class=\"bs-delta__direction\">up</span>\n            <span class=\"bs-delta__context\">vs previous 7 days</span>\n          </span>\n        </p>\n        <div class=\"bs-kpi__plot\">\n          <figure class=\"bs-sparkline bs-sparkline--danger\">\n            <figcaption class=\"bs-sparkline__caption\">\n              <span class=\"bs-sparkline__range\">low 9, high 41, by day</span>\n            </figcaption>\n            <ol\n              class=\"bs-sparkline__plot\"\n              role=\"img\"\n              aria-label=\"Failures per day, 9 to 41 over 7 days, ending at 41\"\n            >\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.22\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.34\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.29\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.51\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.47\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 0.78\"></li>\n              <li class=\"bs-sparkline__point\" style=\"--bs-sparkline-v: 1\"></li>\n            </ol>\n          </figure>\n        </div>\n        <p class=\"bs-kpi__note\">Updated 2 minutes ago</p>\n      </article>\n    </li>\n\n    <li class=\"bs-stat-grid__tile\">\n      <!-- A figure that is real but old says how old, and its edge goes dashed, because dimming a\n           number tells a colour-blind reader nothing and a screenshot reader nothing at all. -->\n      <article class=\"bs-kpi bs-kpi--stale\" aria-labelledby=\"kpi-latency\">\n        <h3 class=\"bs-kpi__label\" id=\"kpi-latency\">Median settle time</h3>\n        <p class=\"bs-kpi__figure\">\n          <span class=\"bs-kpi__value bs-nums-tabular\">2.9</span>\n          <span class=\"bs-kpi__unit\">seconds</span>\n        </p>\n        <p class=\"bs-kpi__movement\">\n          <span class=\"bs-delta bs-delta--flat bs-delta--neutral\">\n            <span class=\"bs-delta__mark\" aria-hidden=\"true\"></span>\n            <span class=\"bs-delta__amount\">0.0%</span>\n            <span class=\"bs-delta__direction\">unchanged</span>\n            <span class=\"bs-delta__context\">vs previous 7 days</span>\n          </span>\n        </p>\n        <p class=\"bs-kpi__note\">Last read 46 minutes ago. The collector is behind.</p>\n      </article>\n    </li>\n  </ul>\n</section>",
      "href": "https://bare.style/templates#stats-overview",
      "preview": "https://bare.style/preview/stats-overview.html"
    },
    {
      "id": "table-view",
      "title": "Table view with filters",
      "description": "A records page: scoped search, sort, filter chips with a live count, a scrolling table and pagination.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "table",
        "data",
        "filter",
        "pagination",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/app/command-search.css",
        "src/app/command-sort.css",
        "src/app/command-filter-bar.css",
        "src/app/command-chip.css",
        "src/data/table.css",
        "src/data/badge.css",
        "src/nav/pagination.css",
        "src/forms/button.css",
        "src/utility/a11y.css",
        "src/utility/spacing.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--danger",
        "bs-btn",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-chip",
        "bs-chip--on",
        "bs-chip__check",
        "bs-chip__count",
        "bs-chip__label",
        "bs-cluster",
        "bs-filter-bar",
        "bs-filter-bar__clear",
        "bs-filter-bar__count",
        "bs-filter-bar__label",
        "bs-filter-bar__set",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-6",
        "bs-nums-tabular",
        "bs-pagination",
        "bs-pagination__gap",
        "bs-pagination__link",
        "bs-pagination__link--next",
        "bs-pagination__link--prev",
        "bs-pagination__list",
        "bs-py-8",
        "bs-search",
        "bs-search__clear",
        "bs-search__field",
        "bs-search__icon",
        "bs-search__input",
        "bs-search__scope",
        "bs-search__scopeicon",
        "bs-sort",
        "bs-sort__arrow",
        "bs-sort__dir",
        "bs-sort__label",
        "bs-sort__select",
        "bs-stack",
        "bs-table",
        "bs-table--hover",
        "bs-table--sticky-head",
        "bs-table--zebra",
        "bs-table-scroll",
        "bs-table-scroll--capped",
        "bs-table__num",
        "bs-text-h3",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<!-- The container owns the inline gutter and nothing owns the block one, so a page-level template\n     asks for it or its first line sits against the top of the viewport. -->\n<main class=\"bs-wrap bs-py-8\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\">\n    <header class=\"bs-stack bs-gap-2\">\n      <h1 class=\"bs-text-h3 bs-flow-none\">Pipeline runs</h1>\n      <p class=\"bs-caption bs-flow-none\">Every run of every scheduled job in this workspace, newest first.</p>\n    </header>\n\n    <div class=\"bs-stack bs-gap-3\">\n      <!-- One toolbar row that wraps. The search field belongs in a flex ROW: it states a preferred\n           width of 18rem through flex-basis, which in a column would be read as a height.\n           A real form with a real action, so the field still searches with script blocked. The\n           panel of recent searches is left out: it needs script to open, and a template that ships\n           an affordance nothing can operate is worse than one that ships none. -->\n      <div class=\"bs-cluster bs-gap-3\">\n        <form class=\"bs-search\" role=\"search\" method=\"get\" action=\"/runs\">\n          <div class=\"bs-search__field\">\n            <svg class=\"bs-search__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M20 20l-4-4\" />\n            </svg>\n            <button class=\"bs-search__scope\" type=\"button\" aria-label=\"Remove the Checkout service scope\">\n              Checkout service\n              <svg class=\"bs-search__scopeicon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M6 6l12 12M18 6L6 18\" />\n              </svg>\n            </button>\n            <!-- A placeholder is not a label. It disappears the moment anyone types into it. -->\n            <label class=\"bs-visually-hidden\" for=\"runs-q\">Search runs</label>\n            <input\n              class=\"bs-search__input\"\n              id=\"runs-q\"\n              name=\"q\"\n              type=\"search\"\n              autocomplete=\"off\"\n              placeholder=\"Search runs\"\n            />\n            <button class=\"bs-search__clear\" type=\"button\" aria-label=\"Clear search\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M6 6l12 12M18 6L6 18\" />\n              </svg>\n            </button>\n          </div>\n        </form>\n\n        <div class=\"bs-sort\">\n          <label class=\"bs-sort__label\" for=\"runs-sort\">Sort</label>\n          <select class=\"bs-sort__select\" id=\"runs-sort\" name=\"sort\">\n            <option>Started</option>\n            <option>Duration</option>\n            <option>Job name</option>\n          </select>\n          <button class=\"bs-sort__dir\" type=\"button\" aria-pressed=\"false\" aria-label=\"Sort ascending\">\n            <svg class=\"bs-sort__arrow\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path d=\"M12 5v14M6 13l6 6 6-6\" />\n            </svg>\n          </button>\n        </div>\n        <a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/runs.csv\" download>Export CSV</a>\n      </div>\n\n      <div class=\"bs-filter-bar\" role=\"group\" aria-label=\"Filters\">\n        <p class=\"bs-filter-bar__label\" id=\"runs-filters\">Filters</p>\n        <div class=\"bs-filter-bar__set\" aria-labelledby=\"runs-filters\">\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Failed</span>\n            <span class=\"bs-chip__count\">14</span>\n          </button>\n          <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n            <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n              <path d=\"M5 13l4 4L19 7\" />\n            </svg>\n            <span class=\"bs-chip__label\">Running</span>\n            <span class=\"bs-chip__count\">3</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">Queued</span>\n            <span class=\"bs-chip__count\">28</span>\n          </button>\n          <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n            <span class=\"bs-chip__label\">Succeeded</span>\n            <span class=\"bs-chip__count\">2,435</span>\n          </button>\n        </div>\n        <!-- Filtering changes what is on screen without moving focus, so the count is the only\n             signal a user who is not looking at the table gets. -->\n        <p class=\"bs-filter-bar__count\" aria-live=\"polite\">17 of 2,480 runs</p>\n        <button class=\"bs-filter-bar__clear\" type=\"button\">Clear all</button>\n      </div>\n    </div>\n\n    <!-- The wrapper takes the horizontal scroll so the document never does, and it is focusable\n         and named because a region only a pointer can scroll is unreachable from a keyboard. -->\n    <div class=\"bs-table-scroll bs-table-scroll--capped\" tabindex=\"0\" role=\"region\" aria-labelledby=\"runs-caption\">\n      <table class=\"bs-table bs-table--zebra bs-table--hover bs-table--sticky-head\">\n        <caption id=\"runs-caption\">Failed and running jobs, checkout service</caption>\n        <thead>\n          <tr>\n            <th scope=\"col\">Run</th>\n            <th scope=\"col\">Job</th>\n            <th scope=\"col\">Status</th>\n            <th scope=\"col\">Started</th>\n            <th scope=\"col\" class=\"bs-table__num\">Duration</th>\n            <th scope=\"col\">Trigger</th>\n            <th scope=\"col\">Owner</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr>\n            <th scope=\"row\">4812</th>\n            <td>settle-payouts</td>\n            <td><span class=\"bs-badge bs-badge--danger\">Failed</span></td>\n            <td><time datetime=\"2026-08-01T14:22:07Z\">14:22:07</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">4m 11s</td>\n            <td>Schedule</td>\n            <td>Payments</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4811</th>\n            <td>reconcile-ledger</td>\n            <td><span class=\"bs-badge bs-badge--accent\">Running</span></td>\n            <td><time datetime=\"2026-08-01T14:20:00Z\">14:20:00</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">6m 02s</td>\n            <td>Manual</td>\n            <td>Payments</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4809</th>\n            <td>export-invoices</td>\n            <td><span class=\"bs-badge bs-badge--danger\">Failed</span></td>\n            <td><time datetime=\"2026-08-01T13:55:41Z\">13:55:41</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">18s</td>\n            <td>Webhook</td>\n            <td>Finance</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4804</th>\n            <td>refresh-tax-rates</td>\n            <td><span class=\"bs-badge bs-badge--danger\">Failed</span></td>\n            <td><time datetime=\"2026-08-01T13:30:00Z\">13:30:00</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">2m 47s</td>\n            <td>Schedule</td>\n            <td>Finance</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4802</th>\n            <td>settle-payouts</td>\n            <td><span class=\"bs-badge bs-badge--accent\">Running</span></td>\n            <td><time datetime=\"2026-08-01T13:22:07Z\">13:22:07</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">3m 09s</td>\n            <td>Retry of 4798</td>\n            <td>Payments</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4798</th>\n            <td>settle-payouts</td>\n            <td><span class=\"bs-badge bs-badge--danger\">Failed</span></td>\n            <td><time datetime=\"2026-08-01T12:22:07Z\">12:22:07</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">4m 30s</td>\n            <td>Schedule</td>\n            <td>Payments</td>\n          </tr>\n          <tr>\n            <th scope=\"row\">4791</th>\n            <td>sync-catalogue</td>\n            <td><span class=\"bs-badge bs-badge--danger\">Failed</span></td>\n            <td><time datetime=\"2026-08-01T11:40:12Z\">11:40:12</time></td>\n            <td class=\"bs-table__num bs-nums-tabular\">55s</td>\n            <td>Webhook</td>\n            <td>Catalogue</td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n\n    <nav class=\"bs-pagination\" aria-label=\"Pipeline run pages\">\n      <ul class=\"bs-pagination__list\">\n        <li>\n          <a class=\"bs-pagination__link bs-pagination__link--prev\" href=\"?page=1\" rel=\"prev\">Previous</a>\n        </li>\n        <li><a class=\"bs-pagination__link\" href=\"?page=1\">1</a></li>\n        <li>\n          <a class=\"bs-pagination__link\" href=\"?page=2\" aria-current=\"page\" aria-label=\"Page 2, current page\">2</a>\n        </li>\n        <li><a class=\"bs-pagination__link\" href=\"?page=3\">3</a></li>\n        <li aria-hidden=\"true\"><span class=\"bs-pagination__gap\">...</span></li>\n        <li><a class=\"bs-pagination__link\" href=\"?page=18\">18</a></li>\n        <li>\n          <a class=\"bs-pagination__link bs-pagination__link--next\" href=\"?page=3\" rel=\"next\">Next</a>\n        </li>\n      </ul>\n    </nav>\n  </div>\n</main>",
      "href": "https://bare.style/templates#table-view",
      "preview": "https://bare.style/preview/table-view.html"
    },
    {
      "id": "task-list",
      "title": "Task list",
      "description": "A task table with status, assignee, due date and priority, a filter bar, bulk selection, an empty group, and a threaded detail pane.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "tasks",
        "table",
        "filter",
        "detail",
        "thread",
        "empty-state",
        "full-page"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/layout/sidebar.css",
        "src/app/command-filter-bar.css",
        "src/app/command-chip.css",
        "src/app/collab-assignee.css",
        "src/app/collab-thread.css",
        "src/app/collab-message.css",
        "src/app/collab-composer.css",
        "src/data/table.css",
        "src/data/badge.css",
        "src/data/avatar.css",
        "src/data/icon.css",
        "src/data/empty.css",
        "src/data/description-list.css",
        "src/forms/checkbox.css",
        "src/forms/textarea.css",
        "src/forms/button.css",
        "src/nav/navlink.css",
        "src/utility/a11y.css",
        "src/utility/flex.css",
        "src/utility/spacing.css",
        "src/utility/typography.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-assignee",
        "bs-assignee--sm",
        "bs-assignee--unassigned",
        "bs-assignee__avatar",
        "bs-assignee__name",
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-badge",
        "bs-badge--accent",
        "bs-badge--danger",
        "bs-badge--ok",
        "bs-badge--outline",
        "bs-btn",
        "bs-btn--ghost",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-caption",
        "bs-checkbox",
        "bs-checkbox__control",
        "bs-checkbox__label",
        "bs-chip",
        "bs-chip--on",
        "bs-chip__check",
        "bs-chip__count",
        "bs-chip__label",
        "bs-cluster",
        "bs-cluster--baseline",
        "bs-cluster--between",
        "bs-cluster--tight",
        "bs-composer",
        "bs-composer__bar",
        "bs-composer__field",
        "bs-composer__hint",
        "bs-composer__label",
        "bs-composer__send",
        "bs-composer__send-label",
        "bs-dl",
        "bs-dl--columns",
        "bs-dl--divided",
        "bs-dl__desc",
        "bs-dl__term",
        "bs-empty",
        "bs-empty--compact",
        "bs-empty--framed",
        "bs-empty__actions",
        "bs-empty__icon",
        "bs-empty__text",
        "bs-empty__title",
        "bs-eyebrow",
        "bs-filter-bar",
        "bs-filter-bar__clear",
        "bs-filter-bar__count",
        "bs-filter-bar__label",
        "bs-filter-bar__set",
        "bs-flex-nowrap",
        "bs-flow-none",
        "bs-gap-2",
        "bs-gap-3",
        "bs-gap-5",
        "bs-gap-6",
        "bs-icon",
        "bs-icon--danger",
        "bs-icon--muted",
        "bs-icon--sm",
        "bs-message",
        "bs-message__author",
        "bs-message__avatar",
        "bs-message__body",
        "bs-message__head",
        "bs-message__time",
        "bs-mt-1",
        "bs-mt-2",
        "bs-mt-3",
        "bs-navlink",
        "bs-sidebar",
        "bs-sidebar__main",
        "bs-sidebar__side",
        "bs-stack",
        "bs-table",
        "bs-table--hover",
        "bs-table--stack",
        "bs-table-scroll",
        "bs-text-body",
        "bs-text-h3",
        "bs-text-h5",
        "bs-text-h6",
        "bs-text-nowrap",
        "bs-textarea",
        "bs-thread",
        "bs-thread--nested",
        "bs-thread__divider",
        "bs-thread__label",
        "bs-thread__list",
        "bs-thread__more",
        "bs-visually-hidden",
        "bs-wrap"
      ],
      "html": "<main class=\"bs-wrap\" id=\"main\">\n  <div class=\"bs-stack bs-gap-6\">\n    <header class=\"bs-cluster bs-cluster--between bs-cluster--baseline bs-gap-3\">\n      <div>\n        <h1 class=\"bs-text-h3 bs-flow-none\">Tasks</h1>\n        <p class=\"bs-caption bs-mt-1\">Migration to the new billing pipeline</p>\n      </div>\n      <button class=\"bs-btn bs-btn--primary bs-btn--sm\" type=\"button\">New task</button>\n    </header>\n\n    <!-- The count is the live region, per src/app/command-filter-bar.css: filtering changes what is\n         on screen without moving focus, so it is the only thing here that has to announce. -->\n    <div class=\"bs-filter-bar\" role=\"group\" aria-label=\"Filters\">\n      <p class=\"bs-filter-bar__label\" id=\"task-filters\">Filters</p>\n      <div class=\"bs-filter-bar__set\" aria-labelledby=\"task-filters\">\n        <button class=\"bs-chip bs-chip--on\" type=\"button\" aria-pressed=\"true\">\n          <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n            <path d=\"M5 13l4 4L19 7\" />\n          </svg>\n          <span class=\"bs-chip__label\">Open</span>\n          <span class=\"bs-chip__count\">5</span>\n        </button>\n        <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n          <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n            <path d=\"M5 13l4 4L19 7\" />\n          </svg>\n          <span class=\"bs-chip__label\">Assigned to me</span>\n          <span class=\"bs-chip__count\">2</span>\n        </button>\n        <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n          <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n            <path d=\"M5 13l4 4L19 7\" />\n          </svg>\n          <span class=\"bs-chip__label\">Due this week</span>\n          <span class=\"bs-chip__count\">3</span>\n        </button>\n        <button class=\"bs-chip\" type=\"button\" aria-pressed=\"false\">\n          <svg class=\"bs-chip__check\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\">\n            <path d=\"M5 13l4 4L19 7\" />\n          </svg>\n          <span class=\"bs-chip__label\">Blocked</span>\n          <span class=\"bs-chip__count\">0</span>\n        </button>\n      </div>\n      <p class=\"bs-filter-bar__count\" aria-live=\"polite\">5 of 34 tasks</p>\n      <button class=\"bs-filter-bar__clear\" type=\"button\">Clear all</button>\n    </div>\n\n    <!-- A sidebar rather than a split, and the reason is the wrap floor. bs-split gives both panes\n         ONE minimum, so raising it far enough to stop the table being squeezed at 768 also raised\n         the detail pane's floor and took 260px off the table at 1440: the task titles then wrapped\n         four words deep on a 1440px screen. bs-sidebar floors the two independently - the detail\n         pane declares an ideal width, the table declares the share of the line it will not go under\n         - which is exactly the asymmetric case this layout is for.\n\n         The table comes first in the DOM, so it is first on a phone and the detail follows it, and\n         the reading order is the same in both configurations. 60% rather than the default 50%:\n         measured, the table's own minimum is about 643px, and half a 1024px line is not enough for\n         it, so the panes are asked to separate one step earlier than they otherwise would. -->\n    <div class=\"bs-sidebar\" style=\"--bs-sidebar-side: 24rem; --bs-sidebar-content-min: 60%\">\n      <div class=\"bs-sidebar__main bs-stack bs-gap-5\">\n        <!-- BULK SELECTION. Select-all lives here rather than in the table head, and that is not a\n             style choice: bs-table--stack hides the whole <thead> below 48em, so a select-all in the\n             header row is a control that silently does not exist on a phone. Above the table it is\n             present at every width and it reads as what it is, which is an action on the list rather\n             than a column.\n\n             The count is a live region for the same reason the filter count is: checking a row\n             changes what the buttons beside it will act on, and nothing moves the focus to say so.\n             The buttons stay in the DOM when nothing is selected rather than appearing on the first\n             check, so the row does not reflow out from under the pointer. -->\n        <div class=\"bs-cluster bs-cluster--between bs-gap-3\">\n          <div class=\"bs-cluster bs-gap-3\">\n            <label class=\"bs-checkbox\">\n              <input class=\"bs-checkbox__control\" type=\"checkbox\" />\n              <span class=\"bs-checkbox__label\">Select every task</span>\n            </label>\n            <p class=\"bs-caption bs-flow-none\" role=\"status\" aria-live=\"polite\">2 of 5 selected</p>\n          </div>\n          <div class=\"bs-cluster bs-gap-2\">\n            <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Assign</button>\n            <button class=\"bs-btn bs-btn--ghost bs-btn--sm\" type=\"button\">Set due date</button>\n            <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Mark done</button>\n          </div>\n        </div>\n\n        <!-- The wrapper is focusable and named because a scrollable region a pointer can reach and\n             a keyboard cannot is SC 2.1.1. The stack modifier restates the table roles, which\n             display: block removes in every engine. -->\n        <div class=\"bs-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Open tasks\">\n          <!-- No <caption>: bs-table--stack leaves it at display: table-caption inside a block\n               box, and both engines then shrink-wrap it to about 47px and print it one word per\n               line. The scroll region's aria-label names the table instead. -->\n          <table class=\"bs-table bs-table--stack bs-table--hover\" role=\"table\">\n            <thead role=\"rowgroup\">\n              <tr role=\"row\">\n                <th role=\"columnheader\" scope=\"col\"><span class=\"bs-visually-hidden\">Selected</span></th>\n                <th role=\"columnheader\" scope=\"col\">Task</th>\n                <th role=\"columnheader\" scope=\"col\">Status</th>\n                <th role=\"columnheader\" scope=\"col\">Assignee</th>\n                <th role=\"columnheader\" scope=\"col\">Due</th>\n                <th role=\"columnheader\" scope=\"col\">Priority</th>\n              </tr>\n            </thead>\n            <tbody role=\"rowgroup\">\n              <tr role=\"row\">\n                <td role=\"cell\">\n                  <label class=\"bs-checkbox\">\n                    <input class=\"bs-checkbox__control\" type=\"checkbox\" checked />\n                    <span class=\"bs-checkbox__label bs-visually-hidden\">Select: Move invoice numbering to the new sequence</span>\n                  </label>\n                </td>\n                <th role=\"rowheader\" scope=\"row\" data-label=\"Task\">\n                  <a class=\"bs-navlink\" href=\"/tasks/812\">Move invoice numbering to the new sequence</a>\n                </th>\n                <td role=\"cell\" data-label=\"Status\"><span class=\"bs-badge bs-badge--accent bs-text-nowrap\">In progress</span></td>\n                <td role=\"cell\" data-label=\"Assignee\">\n                  <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                    <span class=\"bs-assignee__avatar\">\n                      <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                        <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                      </span>\n                    </span>\n                    <span class=\"bs-assignee__name\">Rin Alvarez</span>\n                  </button>\n                </td>\n                <td role=\"cell\" data-label=\"Due\"><time datetime=\"2026-08-04\">4 Aug</time></td>\n                <td role=\"cell\" data-label=\"Priority\">\n                  <!-- Shape before hue: the arrow points up for high and down for low, so the three\n                       levels are told apart without reading the tint. -->\n                  <span class=\"bs-cluster bs-cluster--tight bs-flex-nowrap bs-gap-2\">\n                    <svg class=\"bs-icon bs-icon--sm bs-icon--danger\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n                      <path d=\"M8 13V3M4 7l4-4 4 4\" />\n                    </svg>\n                    High\n                  </span>\n                </td>\n              </tr>\n\n              <tr role=\"row\">\n                <td role=\"cell\">\n                  <label class=\"bs-checkbox\">\n                    <input class=\"bs-checkbox__control\" type=\"checkbox\" checked />\n                    <span class=\"bs-checkbox__label bs-visually-hidden\">Select: Backfill the ledger for June</span>\n                  </label>\n                </td>\n                <th role=\"rowheader\" scope=\"row\" data-label=\"Task\">\n                  <a class=\"bs-navlink\" href=\"/tasks/809\">Backfill the ledger for June</a>\n                </th>\n                <td role=\"cell\" data-label=\"Status\"><span class=\"bs-badge bs-badge--danger bs-text-nowrap\">Blocked</span></td>\n                <td role=\"cell\" data-label=\"Assignee\">\n                  <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                    <span class=\"bs-assignee__avatar\">\n                      <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Tomas Ferro\">\n                        <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TF</span>\n                      </span>\n                    </span>\n                    <span class=\"bs-assignee__name\">Tomas Ferro</span>\n                  </button>\n                </td>\n                <td role=\"cell\" data-label=\"Due\"><time datetime=\"2026-07-31\">31 Jul, overdue</time></td>\n                <td role=\"cell\" data-label=\"Priority\">\n                  <span class=\"bs-cluster bs-cluster--tight bs-flex-nowrap bs-gap-2\">\n                    <svg class=\"bs-icon bs-icon--sm bs-icon--danger\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n                      <path d=\"M8 13V3M4 7l4-4 4 4\" />\n                    </svg>\n                    High\n                  </span>\n                </td>\n              </tr>\n\n              <tr role=\"row\">\n                <td role=\"cell\">\n                  <label class=\"bs-checkbox\">\n                    <input class=\"bs-checkbox__control\" type=\"checkbox\" />\n                    <span class=\"bs-checkbox__label bs-visually-hidden\">Select: Write the rollback note for support</span>\n                  </label>\n                </td>\n                <th role=\"rowheader\" scope=\"row\" data-label=\"Task\">\n                  <a class=\"bs-navlink\" href=\"/tasks/804\">Write the rollback note for support</a>\n                </th>\n                <td role=\"cell\" data-label=\"Status\"><span class=\"bs-badge bs-badge--outline bs-text-nowrap\">To do</span></td>\n                <td role=\"cell\" data-label=\"Assignee\">\n                  <button class=\"bs-assignee bs-assignee--sm bs-assignee--unassigned\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                    <span class=\"bs-assignee__avatar\" aria-hidden=\"true\"></span>\n                    <span class=\"bs-assignee__name\">Unassigned</span>\n                  </button>\n                </td>\n                <td role=\"cell\" data-label=\"Due\"><time datetime=\"2026-08-07\">7 Aug</time></td>\n                <td role=\"cell\" data-label=\"Priority\">\n                  <span class=\"bs-cluster bs-cluster--tight bs-flex-nowrap bs-gap-2\">\n                    <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n                      <path d=\"M3 8h10\" />\n                    </svg>\n                    Medium\n                  </span>\n                </td>\n              </tr>\n\n              <tr role=\"row\">\n                <td role=\"cell\">\n                  <label class=\"bs-checkbox\">\n                    <input class=\"bs-checkbox__control\" type=\"checkbox\" />\n                    <span class=\"bs-checkbox__label bs-visually-hidden\">Select: Retire the old proration helper</span>\n                  </label>\n                </td>\n                <th role=\"rowheader\" scope=\"row\" data-label=\"Task\">\n                  <a class=\"bs-navlink\" href=\"/tasks/798\">Retire the old proration helper</a>\n                </th>\n                <td role=\"cell\" data-label=\"Status\"><span class=\"bs-badge bs-badge--accent bs-text-nowrap\">In progress</span></td>\n                <td role=\"cell\" data-label=\"Assignee\">\n                  <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                    <span class=\"bs-assignee__avatar\">\n                      <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Mira Okonkwo\">\n                        <span class=\"bs-avatar__initials\" aria-hidden=\"true\">MO</span>\n                      </span>\n                    </span>\n                    <span class=\"bs-assignee__name\">Mira Okonkwo</span>\n                  </button>\n                </td>\n                <td role=\"cell\" data-label=\"Due\"><time datetime=\"2026-08-12\">12 Aug</time></td>\n                <td role=\"cell\" data-label=\"Priority\">\n                  <span class=\"bs-cluster bs-cluster--tight bs-flex-nowrap bs-gap-2\">\n                    <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n                      <path d=\"M8 3v10M4 9l4 4 4-4\" />\n                    </svg>\n                    Low\n                  </span>\n                </td>\n              </tr>\n\n              <tr role=\"row\">\n                <td role=\"cell\">\n                  <label class=\"bs-checkbox\">\n                    <input class=\"bs-checkbox__control\" type=\"checkbox\" />\n                    <span class=\"bs-checkbox__label bs-visually-hidden\">Select: Check the seat count against the invoice</span>\n                  </label>\n                </td>\n                <th role=\"rowheader\" scope=\"row\" data-label=\"Task\">\n                  <a class=\"bs-navlink\" href=\"/tasks/791\">Check the seat count against the invoice</a>\n                </th>\n                <td role=\"cell\" data-label=\"Status\"><span class=\"bs-badge bs-badge--ok bs-text-nowrap\">Done</span></td>\n                <td role=\"cell\" data-label=\"Assignee\">\n                  <button class=\"bs-assignee bs-assignee--sm\" type=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                    <span class=\"bs-assignee__avatar\">\n                      <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                        <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                      </span>\n                    </span>\n                    <span class=\"bs-assignee__name\">Rin Alvarez</span>\n                  </button>\n                </td>\n                <td role=\"cell\" data-label=\"Due\"><time datetime=\"2026-07-29\">29 Jul</time></td>\n                <td role=\"cell\" data-label=\"Priority\">\n                  <span class=\"bs-cluster bs-cluster--tight bs-flex-nowrap bs-gap-2\">\n                    <svg class=\"bs-icon bs-icon--sm bs-icon--muted\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\">\n                      <path d=\"M3 8h10\" />\n                    </svg>\n                    Medium\n                  </span>\n                </td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n\n        <!-- A group with nothing in it says so, rather than rendering a table head over no rows.\n             The heading stays, because the group existing is the fact the reader came for. -->\n        <section aria-labelledby=\"tasks-archive\">\n          <h2 class=\"bs-text-h5\" id=\"tasks-archive\">Waiting on someone else</h2>\n          <div class=\"bs-empty bs-empty--framed bs-empty--compact bs-mt-3\">\n            <svg class=\"bs-empty__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n              <path d=\"M4 6h16M4 12h10M4 18h7\" />\n            </svg>\n            <p class=\"bs-empty__title\">Nothing is waiting</p>\n            <p class=\"bs-empty__text\">Tasks land here when they are handed to a team outside this project.</p>\n            <div class=\"bs-empty__actions\">\n              <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Hand off a task</button>\n            </div>\n          </div>\n        </section>\n      </div>\n\n      <!-- THE DETAIL. Same page, second pane, so the reader keeps the list they picked from. It\n           stacks under the table on its own when the two panes stop fitting. -->\n      <article class=\"bs-sidebar__side bs-stack bs-gap-5\" aria-labelledby=\"task-detail-title\">\n        <header>\n          <p class=\"bs-eyebrow bs-flow-none\">Task 809</p>\n          <h2 class=\"bs-text-h5 bs-mt-2\" id=\"task-detail-title\">Backfill the ledger for June</h2>\n        </header>\n\n        <dl class=\"bs-dl bs-dl--columns bs-dl--divided\" style=\"--bs-dl-term-inline: 6rem\">\n          <dt class=\"bs-dl__term\">Status</dt>\n          <dd class=\"bs-dl__desc\"><span class=\"bs-badge bs-badge--danger\">Blocked</span></dd>\n          <dt class=\"bs-dl__term\">Assignee</dt>\n          <dd class=\"bs-dl__desc\">Tomas Ferro</dd>\n          <dt class=\"bs-dl__term\">Due</dt>\n          <dd class=\"bs-dl__desc\"><time datetime=\"2026-07-31\">31 Jul, overdue</time></dd>\n          <dt class=\"bs-dl__term\">Priority</dt>\n          <dd class=\"bs-dl__desc\">High</dd>\n        </dl>\n\n        <p class=\"bs-text-body\">\n          The June rows were written before the currency column existed, so the importer has to fill\n          it from the account default before the totals can be trusted.\n        </p>\n\n        <section aria-labelledby=\"task-comments\">\n          <h3 class=\"bs-text-h6\" id=\"task-comments\">Comments</h3>\n          <div class=\"bs-thread bs-mt-3\">\n            <button class=\"bs-thread__more\" type=\"button\">Show 4 earlier comments</button>\n\n            <div class=\"bs-thread__divider\"><span class=\"bs-thread__label\">Yesterday</span></div>\n\n            <ol class=\"bs-thread__list\" role=\"list\">\n              <li>\n                <article class=\"bs-message\">\n                  <div class=\"bs-message__avatar\">\n                    <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Tomas Ferro\">\n                      <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TF</span>\n                    </span>\n                  </div>\n                  <header class=\"bs-message__head\">\n                    <span class=\"bs-message__author\">Tomas Ferro</span>\n                    <time class=\"bs-message__time\" datetime=\"2026-08-01T09:14:00Z\">09:14</time>\n                  </header>\n                  <div class=\"bs-message__body\">\n                    <p>The importer needs the account default before it can fill the column. Who owns that table now?</p>\n                  </div>\n                </article>\n\n                <!-- The reply sits inside the parent list item, which is what makes it a reply\n                     rather than the next message: the nesting is in the DOM, not only in the\n                     indent. -->\n                <div class=\"bs-thread bs-thread--nested\">\n                  <ol class=\"bs-thread__list\" role=\"list\">\n                    <li>\n                      <article class=\"bs-message\">\n                        <div class=\"bs-message__avatar\">\n                          <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Mira Okonkwo\">\n                            <span class=\"bs-avatar__initials\" aria-hidden=\"true\">MO</span>\n                          </span>\n                        </div>\n                        <header class=\"bs-message__head\">\n                          <span class=\"bs-message__author\">Mira Okonkwo</span>\n                          <time class=\"bs-message__time\" datetime=\"2026-08-01T09:41:00Z\">09:41</time>\n                        </header>\n                        <div class=\"bs-message__body\">\n                          <p>Billing owns it. I have asked for read access and will paste the mapping here.</p>\n                        </div>\n                      </article>\n                    </li>\n                  </ol>\n                </div>\n              </li>\n            </ol>\n\n            <div class=\"bs-thread__divider\"><span class=\"bs-thread__label\">Today</span></div>\n\n            <ol class=\"bs-thread__list\" role=\"list\">\n              <li>\n                <article class=\"bs-message\">\n                  <div class=\"bs-message__avatar\">\n                    <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Rin Alvarez\">\n                      <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RA</span>\n                    </span>\n                  </div>\n                  <header class=\"bs-message__head\">\n                    <span class=\"bs-message__author\">Rin Alvarez</span>\n                    <time class=\"bs-message__time\" datetime=\"2026-08-02T08:20:00Z\">08:20</time>\n                  </header>\n                  <div class=\"bs-message__body\">\n                    <p>Access is granted. Moving this back to in progress once the mapping is checked.</p>\n                  </div>\n                </article>\n              </li>\n            </ol>\n\n            <form class=\"bs-composer\">\n              <div class=\"bs-composer__field\">\n                <label class=\"bs-composer__label\" for=\"task-comment\">Add a comment</label>\n                <textarea class=\"bs-textarea\" id=\"task-comment\" name=\"comment\" rows=\"3\" aria-describedby=\"task-comment-hint\"></textarea>\n              </div>\n              <div class=\"bs-composer__bar\">\n                <p class=\"bs-composer__hint\" id=\"task-comment-hint\">Everyone watching this task is notified.</p>\n                <button class=\"bs-composer__send\" type=\"submit\">\n                  <span class=\"bs-composer__send-label\">Comment</span>\n                </button>\n              </div>\n            </form>\n          </div>\n        </section>\n      </article>\n    </div>\n  </div>\n</main>",
      "href": "https://bare.style/templates#task-list",
      "preview": "https://bare.style/preview/task-list.html"
    },
    {
      "id": "team-members",
      "title": "Team members page",
      "description": "A workspace roster in the application frame: a filter toolbar, an invite action and a table of people with role, status and last activity.",
      "category": "app",
      "categoryLabel": "Application",
      "kind": "page",
      "tags": [
        "app",
        "team",
        "table",
        "shell",
        "roster",
        "full-page"
      ],
      "links": [
        "src/app/shell-frame.css",
        "src/app/shell-rail.css",
        "src/app/shell-topbar.css",
        "src/app/shell-sidebar.css",
        "src/app/shell-main.css",
        "src/nav/sidebar-nav.css",
        "src/data/table.css",
        "src/data/avatar.css",
        "src/data/badge.css",
        "src/layout/cluster.css",
        "src/layout/stack.css",
        "src/forms/input.css",
        "src/forms/button.css",
        "src/utility/spacing.css",
        "src/utility/size.css",
        "src/utility/a11y.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar--sm",
        "bs-avatar__initials",
        "bs-badge",
        "bs-badge--danger",
        "bs-badge--ok",
        "bs-badge--subtle",
        "bs-btn",
        "bs-btn--primary",
        "bs-btn--secondary",
        "bs-btn--sm",
        "bs-cluster",
        "bs-gap-0",
        "bs-gap-2",
        "bs-input",
        "bs-max-w-xs",
        "bs-mb-4",
        "bs-shell",
        "bs-shell-main",
        "bs-shell-main__content",
        "bs-shell-main__toolbar",
        "bs-shell-rail",
        "bs-shell-rail__foot",
        "bs-shell-rail__icon",
        "bs-shell-rail__item",
        "bs-shell-rail__item--current",
        "bs-shell-rail__label",
        "bs-shell-sidebar",
        "bs-shell-sidebar__body",
        "bs-shell-sidebar__close",
        "bs-shell-sidebar__header",
        "bs-shell-sidebar__title",
        "bs-shell-topbar",
        "bs-shell-topbar__actions",
        "bs-shell-topbar__icon",
        "bs-shell-topbar__title",
        "bs-shell-topbar__toggle",
        "bs-shell__scrim",
        "bs-sidenav",
        "bs-sidenav__link",
        "bs-sidenav__list",
        "bs-stack",
        "bs-table",
        "bs-table--hover",
        "bs-table--zebra",
        "bs-table-scroll",
        "bs-table__muted",
        "bs-visually-hidden",
        "bs-visually-hidden-focusable"
      ],
      "html": "<div class=\"bs-shell\">\n  <nav class=\"bs-shell-rail\" aria-label=\"Sections\">\n    <a class=\"bs-shell-rail__item\" href=\"/pipelines\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <path d=\"M4 7h6M14 7h6M4 17h6M14 17h6\" />\n        <circle cx=\"12\" cy=\"7\" r=\"2\" />\n        <circle cx=\"12\" cy=\"17\" r=\"2\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">Pipelines</span>\n    </a>\n    <a class=\"bs-shell-rail__item bs-shell-rail__item--current\" href=\"/settings/members\" aria-current=\"page\">\n      <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n        <circle cx=\"9\" cy=\"8.5\" r=\"3.3\" />\n        <path d=\"M3.4 19.2a5.8 5.8 0 0 1 11.2 0M16 5.6a3.3 3.3 0 0 1 0 5.8M17.4 19.2a5.8 5.8 0 0 0-1.6-3.9\" />\n      </svg>\n      <span class=\"bs-shell-rail__label\">People</span>\n    </a>\n    <div class=\"bs-shell-rail__foot\">\n      <a class=\"bs-shell-rail__item\" href=\"/settings\">\n        <svg class=\"bs-shell-rail__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <circle cx=\"12\" cy=\"12\" r=\"3.2\" />\n          <path d=\"M12 3.5v2.2M12 18.3v2.2M20.5 12h-2.2M5.7 12H3.5M18 6l-1.6 1.6M7.6 16.4 6 18M18 18l-1.6-1.6M7.6 7.6 6 6\" />\n        </svg>\n        <span class=\"bs-shell-rail__label\">Settings</span>\n      </a>\n    </div>\n  </nav>\n\n  <header class=\"bs-shell-topbar\">\n    <a class=\"bs-visually-hidden-focusable\" href=\"#shell-main\">Skip to the work area</a>\n    <a class=\"bs-shell-topbar__toggle\" href=\"#shell-nav\" aria-controls=\"shell-nav\" aria-label=\"Open settings navigation\">\n      <svg class=\"bs-shell-topbar__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n        <path d=\"M4 7h16M4 12h16M4 17h16\" />\n      </svg>\n    </a>\n    <!-- The page's own name, and the only h1 on the screen. In this frame the bar is where the\n         title belongs: the toolbar slot below is a direct child of the work area and comes before\n         its content, so a heading placed inside the content arrives after its own filters. -->\n    <h1 class=\"bs-shell-topbar__title\">Members</h1>\n    <div class=\"bs-shell-topbar__actions\">\n      <button class=\"bs-btn bs-btn--primary bs-btn--sm\" type=\"button\">Invite people</button>\n    </div>\n  </header>\n\n  <aside class=\"bs-shell-sidebar\" id=\"shell-nav\" aria-label=\"Settings sections\">\n    <div class=\"bs-shell-sidebar__header\">\n      <p class=\"bs-shell-sidebar__title\">Settings</p>\n      <a class=\"bs-shell-sidebar__close\" href=\"#_\" aria-label=\"Close settings navigation\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </a>\n    </div>\n    <div class=\"bs-shell-sidebar__body\">\n      <nav class=\"bs-sidenav\" aria-label=\"Settings sections\">\n        <ul class=\"bs-sidenav__list\">\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/profile\">Profile</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/members\" aria-current=\"page\">Members</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/groups\">Groups</a></li>\n          <li><a class=\"bs-sidenav__link\" href=\"/settings/billing\">Billing</a></li>\n        </ul>\n      </nav>\n    </div>\n  </aside>\n\n  <a class=\"bs-shell__scrim\" href=\"#_\" aria-label=\"Close settings navigation\"></a>\n\n  <main class=\"bs-shell-main\" id=\"shell-main\" tabindex=\"-1\">\n    <!-- The toolbar sticks to the block start of this region rather than to the viewport, so the\n         filter stays with the table it controls when the frame is not the whole window. -->\n    <div class=\"bs-shell-main__toolbar\">\n      <label class=\"bs-visually-hidden\" for=\"member-search\">Search members</label>\n      <input class=\"bs-input bs-max-w-xs\" id=\"member-search\" type=\"search\" name=\"q\" placeholder=\"Search by name or email\" />\n      <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Role: any</button>\n      <button class=\"bs-btn bs-btn--secondary bs-btn--sm\" type=\"button\">Status: any</button>\n    </div>\n\n    <div class=\"bs-shell-main__content\">\n      <p class=\"bs-mb-4\">Everyone who can open this workspace. Removing somebody keeps their runs and their comments.</p>\n\n      <!-- The wrapper, not the page, absorbs the overflow, and it is focusable and named because a\n           keyboard-only user cannot reach content that only a pointer can scroll. -->\n      <div class=\"bs-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Workspace members\">\n        <table class=\"bs-table bs-table--zebra bs-table--hover\">\n          <caption>Workspace members and the access each one has</caption>\n          <!-- The row action is a bordered button, not a ghost. A ghost has no fill and no border\n               until it is hovered, so in a table it is a word in a cell that looks like data. -->\n          <thead>\n            <tr>\n              <th scope=\"col\">Member</th>\n              <th scope=\"col\">Role</th>\n              <th scope=\"col\">Status</th>\n              <th scope=\"col\">Last active</th>\n              <th scope=\"col\">Manage</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <th scope=\"row\">\n                <span class=\"bs-cluster bs-gap-2\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Ada Okonjo\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">AO</span>\n                  </span>\n                  <span class=\"bs-stack bs-gap-0\">\n                    Ada Okonjo\n                    <span class=\"bs-table__muted\">ada@example.com</span>\n                  </span>\n                </span>\n              </th>\n              <td>Owner</td>\n              <td><span class=\"bs-badge bs-badge--ok\">Active</span></td>\n              <td>Today at 09:14</td>\n              <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/settings/members/ada\">Manage <span class=\"bs-visually-hidden\">Ada Okonjo</span></a></td>\n            </tr>\n            <tr>\n              <th scope=\"row\">\n                <span class=\"bs-cluster bs-gap-2\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Ravi Menon\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">RM</span>\n                  </span>\n                  <span class=\"bs-stack bs-gap-0\">\n                    Ravi Menon\n                    <span class=\"bs-table__muted\">ravi@example.com</span>\n                  </span>\n                </span>\n              </th>\n              <td>Admin</td>\n              <td><span class=\"bs-badge bs-badge--ok\">Active</span></td>\n              <td>Today at 08:02</td>\n              <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/settings/members/ravi\">Manage <span class=\"bs-visually-hidden\">Ravi Menon</span></a></td>\n            </tr>\n            <tr>\n              <th scope=\"row\">\n                <span class=\"bs-cluster bs-gap-2\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Mireia Farre\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">MF</span>\n                  </span>\n                  <span class=\"bs-stack bs-gap-0\">\n                    Mireia Farre\n                    <span class=\"bs-table__muted\">mireia@example.com</span>\n                  </span>\n                </span>\n              </th>\n              <td>Editor</td>\n              <td><span class=\"bs-badge bs-badge--subtle\">Invited</span></td>\n              <td>Not yet</td>\n              <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/settings/members/mireia\">Manage <span class=\"bs-visually-hidden\">Mireia Farre</span></a></td>\n            </tr>\n            <tr>\n              <th scope=\"row\">\n                <span class=\"bs-cluster bs-gap-2\">\n                  <span class=\"bs-avatar bs-avatar--sm\" role=\"img\" aria-label=\"Tomas Berg\">\n                    <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TB</span>\n                  </span>\n                  <span class=\"bs-stack bs-gap-0\">\n                    Tomas Berg\n                    <span class=\"bs-table__muted\">tomas@example.com</span>\n                  </span>\n                </span>\n              </th>\n              <td>Viewer</td>\n              <td><span class=\"bs-badge bs-badge--danger\">Suspended</span></td>\n              <td>14 March</td>\n              <td><a class=\"bs-btn bs-btn--secondary bs-btn--sm\" href=\"/settings/members/tomas\">Manage <span class=\"bs-visually-hidden\">Tomas Berg</span></a></td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  </main>\n</div>",
      "href": "https://bare.style/templates#team-members",
      "preview": "https://bare.style/preview/team-members.html"
    },
    {
      "id": "testimonials",
      "title": "Testimonial section",
      "description": "Three attributed quotations in a grid, each with the speaker, their role and the company they said it at.",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "kind": "block",
      "tags": [
        "testimonial",
        "marketing",
        "quote",
        "grid",
        "social-proof"
      ],
      "links": [
        "src/layout/container.css",
        "src/layout/grid.css",
        "src/layout/stack.css",
        "src/layout/cluster.css",
        "src/data/card.css",
        "src/data/avatar.css",
        "src/prose/quote.css",
        "src/utility/size.css",
        "src/utility/spacing.css",
        "src/utility/typography.css",
        "src/utility/color.css",
        "src/utility/display.css"
      ],
      "behaviour": [],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-avatar",
        "bs-avatar__initials",
        "bs-caption",
        "bs-card",
        "bs-card__body",
        "bs-cluster",
        "bs-d-block",
        "bs-eyebrow",
        "bs-fg-muted",
        "bs-flow-none",
        "bs-gap-3",
        "bs-gap-5",
        "bs-grid",
        "bs-grid--bare",
        "bs-h-full",
        "bs-mt-7",
        "bs-py-9",
        "bs-quote",
        "bs-quote__attribution",
        "bs-stack",
        "bs-text-h2",
        "bs-wrap"
      ],
      "html": "<!-- figure/blockquote/figcaption is the spec-correct attributed quotation, and it is what makes the\n     name a caption of the quote rather than a paragraph that happens to sit under it. <cite> holds\n     the title of a work, never the name of a person, so the speaker is plain text and only the\n     publication is cited.\n\n     No quotation glyph is drawn anywhere here. VoiceOver and NVDA both read generated content in\n     their default configurations, so a decorative opening quote is the word \"quote\" announced\n     before every testimonial on the page. The accent edge quote.css draws carries the same signal\n     and is silent. -->\n<section class=\"bs-wrap bs-py-9\" aria-labelledby=\"testimonials-heading\">\n  <div class=\"bs-stack bs-gap-3\">\n    <p class=\"bs-eyebrow bs-flow-none\">In production</p>\n    <h2 class=\"bs-text-h2 bs-flow-none\" id=\"testimonials-heading\">What teams say after their first bad week</h2>\n  </div>\n\n  <ul class=\"bs-grid bs-grid--bare bs-mt-7\" role=\"list\">\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <figure class=\"bs-card__body bs-stack bs-gap-5\">\n          <blockquote class=\"bs-quote\">\n            <p>\n              We moved the whole incident write-up onto one page and the volume of \"is it just us\"\n              tickets fell off a cliff. The support team notices it more than we do.\n            </p>\n          </blockquote>\n          <figcaption class=\"bs-quote__attribution\">\n            <div class=\"bs-cluster bs-gap-3\">\n              <span class=\"bs-avatar\" role=\"img\" aria-label=\"Priya Raman\">\n                <span class=\"bs-avatar__initials\" aria-hidden=\"true\">PR</span>\n              </span>\n              <span>\n                Priya Raman\n                <span class=\"bs-d-block bs-caption bs-fg-muted\">Head of platform, Northpoint Freight</span>\n              </span>\n            </div>\n          </figcaption>\n        </figure>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <figure class=\"bs-card__body bs-stack bs-gap-5\">\n          <blockquote class=\"bs-quote\">\n            <p>\n              The part I did not expect: the timeline made the review afterwards short. Nobody had\n              to reconstruct what we knew at ten past three, because it was written down at ten\n              past three.\n            </p>\n          </blockquote>\n          <figcaption class=\"bs-quote__attribution\">\n            <div class=\"bs-cluster bs-gap-3\">\n              <span class=\"bs-avatar\" role=\"img\" aria-label=\"Tomas Belke\">\n                <span class=\"bs-avatar__initials\" aria-hidden=\"true\">TB</span>\n              </span>\n              <span>\n                Tomas Belke\n                <span class=\"bs-d-block bs-caption bs-fg-muted\">Site reliability lead, Kestrel Payments</span>\n              </span>\n            </div>\n          </figcaption>\n        </figure>\n      </article>\n    </li>\n\n    <li>\n      <article class=\"bs-card bs-h-full\">\n        <figure class=\"bs-card__body bs-stack bs-gap-5\">\n          <blockquote class=\"bs-quote\">\n            <p>\n              Our customers subscribe to the two services they actually buy. That one change did\n              more for trust than a year of us promising to communicate better.\n            </p>\n          </blockquote>\n          <figcaption class=\"bs-quote__attribution\">\n            <div class=\"bs-cluster bs-gap-3\">\n              <span class=\"bs-avatar\" role=\"img\" aria-label=\"Ana Sokolova\">\n                <span class=\"bs-avatar__initials\" aria-hidden=\"true\">AS</span>\n              </span>\n              <span>\n                Ana Sokolova\n                <span class=\"bs-d-block bs-caption bs-fg-muted\">Director of support, Harbour Analytics</span>\n              </span>\n            </div>\n          </figcaption>\n        </figure>\n      </article>\n    </li>\n  </ul>\n</section>",
      "href": "https://bare.style/templates#testimonials",
      "preview": "https://bare.style/preview/testimonials.html"
    },
    {
      "id": "two-factor",
      "title": "Two-factor code entry",
      "description": "A verification screen: six boxes that are one field, where the code came from, how to resend it, and the recovery route.",
      "category": "auth",
      "categoryLabel": "Auth",
      "kind": "page",
      "tags": [
        "auth",
        "two-factor",
        "one-time-code",
        "form",
        "full-page"
      ],
      "links": [
        "src/app/auth-screen.css",
        "src/app/auth-form.css",
        "src/app/auth-otp.css",
        "src/forms/checkbox.css",
        "src/forms/button.css"
      ],
      "behaviour": [
        "src/behaviour/otp.js"
      ],
      "requires": [
        "src/core/reset.css",
        "src/core/tokens.css",
        "src/core/type.css",
        "src/core/base.css"
      ],
      "verified": [
        320,
        390,
        768,
        1440
      ],
      "classes": [
        "bs-auth",
        "bs-auth-form",
        "bs-auth-form__actions",
        "bs-auth-form__choice",
        "bs-auth-form__note",
        "bs-auth-form__options",
        "bs-auth__alt",
        "bs-auth__brand",
        "bs-auth__card",
        "bs-auth__head",
        "bs-auth__inner",
        "bs-auth__legal",
        "bs-auth__mark",
        "bs-auth__subtitle",
        "bs-auth__title",
        "bs-auth__wordmark",
        "bs-btn",
        "bs-btn--block",
        "bs-btn--primary",
        "bs-checkbox__control",
        "bs-otp",
        "bs-otp__boxes",
        "bs-otp__digit",
        "bs-otp__help",
        "bs-otp__legend"
      ],
      "html": "<div class=\"bs-auth\">\n  <div class=\"bs-auth__inner\">\n    <header class=\"bs-auth__brand\">\n      <span class=\"bs-auth__mark\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n          <path d=\"M12 3 20.5 7.6v8.8L12 21l-8.5-4.6V7.6Z\" />\n          <path d=\"M12 3v18M3.5 7.6 12 12l8.5-4.4\" />\n        </svg>\n      </span>\n      <span class=\"bs-auth__wordmark\">BareBase</span>\n    </header>\n\n    <main class=\"bs-auth__card\">\n      <div class=\"bs-auth__head\">\n        <h1 class=\"bs-auth__title\">Two-step verification</h1>\n        <p class=\"bs-auth__subtitle\">One more step, because this device has not signed in before.</p>\n      </div>\n\n      <form class=\"bs-auth-form\" method=\"post\" action=\"/session/verify\" novalidate>\n        <!-- Six boxes, one field. The group carries the name and the description; each box carries\n             its own position as its name, so moving along the row says \"Digit 3 of 6\" rather than\n             repeating the group name six times. autocomplete=\"one-time-code\" is on every box and\n             not only the first: the platform offers the code for whichever box has focus, so\n             naming one means the offer disappears the moment the user reaches box two. -->\n        <fieldset class=\"bs-otp\" aria-labelledby=\"mfa-label\" aria-describedby=\"mfa-help\">\n          <legend class=\"bs-otp__legend\" id=\"mfa-label\">Verification code</legend>\n          <div class=\"bs-otp__boxes\" data-bs-otp>\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 1 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"next\" autofocus />\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 2 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"next\" />\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 3 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"next\" />\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 4 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"next\" />\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 5 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"next\" />\n            <input class=\"bs-otp__digit\" aria-label=\"Digit 6 of 6\" placeholder=\" \" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"1\" autocomplete=\"one-time-code\" enterkeyhint=\"done\" />\n          </div>\n          <p class=\"bs-otp__help\" id=\"mfa-help\">Six digits from your authenticator app. Paste into any box and the row fills.</p>\n        </fieldset>\n\n        <div class=\"bs-auth-form__options\">\n          <label class=\"bs-auth-form__choice\">\n            <!-- bs-checkbox__control, because auth-form.css styles no control: it owns the row and\n                 leaves the box to src/forms/checkbox. Without the class the box is the UA default\n                 13px with no accent, visibly smaller and greyer than the same control on every\n                 other screen in this set. -->\n            <input class=\"bs-checkbox__control\" type=\"checkbox\" name=\"trust\" value=\"1\" />\n            <span>Trust this device for thirty days</span>\n          </label>\n        </div>\n\n        <div class=\"bs-auth-form__actions\">\n          <button class=\"bs-btn bs-btn--primary bs-btn--block\" type=\"submit\">Verify and continue</button>\n        </div>\n\n        <p class=\"bs-auth-form__note\">The code changes every thirty seconds.</p>\n      </form>\n    </main>\n\n    <p class=\"bs-auth__alt\">Lost the device? <a href=\"/session/recovery\">Use a recovery code</a></p>\n\n    <footer class=\"bs-auth__legal\">\n      <a href=\"/terms\">Terms</a>\n      <a href=\"/privacy\">Privacy</a>\n      <span>BareBase Ltd</span>\n    </footer>\n  </div>\n</div>",
      "href": "https://bare.style/templates#two-factor",
      "preview": "https://bare.style/preview/two-factor.html"
    }
  ]
}
