/* GENERATED by harness/design/build.py from harness/design/tokens.json. Do not edit.
 * Spec 13 is the law; the owner's decisions are 1A 2A 3C 4A 5A 6A 7C 8A 9B 10A 11B 12A 13A 14A 15B 16C (owner 2026-09-12; 5B became 5A when positions became filled chips).
 * Steps, per Radix: 1 page background; 2 subtle background; 3 component background; 4 component hover; 5 component active; 6 subtle border; 7 border; 8 strong border / hover; 9 solid fill; 10 solid hover; 11 text on step 1-2; 12 high-contrast text.
 * Plus -faint, ours: an ink solved to Lc 50 for timestamps and micro-labels. Never a sentence.
 * Templates use the semantic names only. A raw hex in a template is a bug the UI check fails on.
 */

:root {
  color-scheme: dark light;
  /* bad */
  --ff-bad-1: #0c0302; --ff-bad-2: #1b0604; --ff-bad-3: #2f0a06; --ff-bad-4: #400d08; --ff-bad-5: #53120b; --ff-bad-6: #671a12; --ff-bad-7: #81271d; --ff-bad-8: #ab3b2e; --ff-bad-9: #c0392b; --ff-bad-10: #d25141; --ff-bad-11: #ff9e8e; --ff-bad-12: #ffe4df;
  --ff-bad-faint: #e19183;
  /* gold */
  --ff-gold-1: #070501; --ff-gold-2: #120d01; --ff-gold-3: #201700; --ff-gold-4: #2b2000; --ff-gold-5: #382b00; --ff-gold-6: #473700; --ff-gold-7: #5b4800; --ff-gold-8: #7c6300; --ff-gold-9: #d4af37; --ff-gold-10: #e6c355; --ff-gold-11: #cfb66a; --ff-gold-12: #f8e9c0;
  --ff-gold-faint: #b9a46b;
  /* neutral */
  --ff-neutral-1: #101512; --ff-neutral-2: #1b201d; --ff-neutral-3: #252c27; --ff-neutral-4: #212221; --ff-neutral-5: #2b2d2c; --ff-neutral-6: #383a38; --ff-neutral-7: #494b49; --ff-neutral-8: #646764; --ff-neutral-9: #616461; --ff-neutral-10: #727573; --ff-neutral-11: #c4c7c4; --ff-neutral-12: #e9eae9;
  --ff-neutral-faint: #a4a7a5;
  /* ok */
  --ff-ok-1: #020703; --ff-ok-2: #031107; --ff-ok-3: #021f0c; --ff-ok-4: #002a11; --ff-ok-5: #003719; --ff-ok-6: #004621; --ff-ok-7: #095a2e; --ff-ok-8: #197942; --ff-ok-9: #2e9e5b; --ff-ok-10: #4ab06f; --ff-ok-11: #80c895; --ff-ok-12: #ccf4d6;
  --ff-ok-faint: #7bb28a;
  /* oracle */
  --ff-oracle-1: #05040e; --ff-oracle-2: #0e091e; --ff-oracle-3: #1a1035; --ff-oracle-4: #241548; --ff-oracle-5: #301d5e; --ff-oracle-6: #3d2774; --ff-oracle-7: #4e358f; --ff-oracle-8: #6b4dbd; --ff-oracle-9: #8f6cf5; --ff-oracle-10: #a084ff; --ff-oracle-11: #bcadff; --ff-oracle-12: #eae8ff;
  --ff-oracle-faint: #aa9bea;
  /* pos-dst */
  --ff-pos-dst-1: #040506; --ff-pos-dst-2: #0c0d0f; --ff-pos-dst-3: #16191b; --ff-pos-dst-4: #1e2226; --ff-pos-dst-5: #282d32; --ff-pos-dst-6: #343a40; --ff-pos-dst-7: #444b52; --ff-pos-dst-8: #5f6770; --ff-pos-dst-9: #b4bfca; --ff-pos-dst-10: #c7d2dd; --ff-pos-dst-11: #b1b9c0; --ff-pos-dst-12: #e6eaef;
  --ff-pos-dst-faint: #a0a7ad;
  /* pos-k */
  --ff-pos-k-1: #050501; --ff-pos-k-2: #0e0e01; --ff-pos-k-3: #1a1a00; --ff-pos-k-4: #232400; --ff-pos-k-5: #2f2f00; --ff-pos-k-6: #3c3c00; --ff-pos-k-7: #4e4e00; --ff-pos-k-8: #6a6b00; --ff-pos-k-9: #c3c54f; --ff-pos-k-10: #d6d86a; --ff-pos-k-11: #babd6f; --ff-pos-k-12: #eaedc2;
  --ff-pos-k-faint: #a7aa6e;
  /* pos-qb */
  --ff-pos-qb-1: #0a0305; --ff-pos-qb-2: #17080d; --ff-pos-qb-3: #290e18; --ff-pos-qb-4: #371322; --ff-pos-qb-5: #481a2d; --ff-pos-qb-6: #5a2439; --ff-pos-qb-7: #71324a; --ff-pos-qb-8: #984766; --ff-pos-qb-9: #ff97bc; --ff-pos-qb-10: #ffb8cf; --ff-pos-qb-11: #eea2bc; --ff-pos-qb-12: #ffe3eb;
  --ff-pos-qb-faint: #d195a9;
  /* pos-rb */
  --ff-pos-rb-1: #000706; --ff-pos-rb-2: #00110f; --ff-pos-rb-3: #001e1b; --ff-pos-rb-4: #002825; --ff-pos-rb-5: #003530; --ff-pos-rb-6: #00433e; --ff-pos-rb-7: #005750; --ff-pos-rb-8: #00766d; --ff-pos-rb-9: #37d8c9; --ff-pos-rb-10: #5cebdc; --ff-pos-rb-11: #67c8bc; --ff-pos-rb-12: #c2f4ec;
  --ff-pos-rb-faint: #6ab3a9;
  /* pos-te */
  --ff-pos-te-1: #080309; --ff-pos-te-2: #130816; --ff-pos-te-3: #220f28; --ff-pos-te-4: #2f1537; --ff-pos-te-5: #3e1c47; --ff-pos-te-6: #4d2659; --ff-pos-te-7: #623470; --ff-pos-te-8: #844b95; --ff-pos-te-9: #e69dfc; --ff-pos-te-10: #efbbff; --ff-pos-te-11: #d9a6e9; --ff-pos-te-12: #f8e3ff;
  --ff-pos-te-faint: #c098cc;
  /* pos-wr */
  --ff-pos-wr-1: #02050b; --ff-pos-wr-2: #040e19; --ff-pos-wr-3: #06192d; --ff-pos-wr-4: #07233d; --ff-pos-wr-5: #0a2e4f; --ff-pos-wr-6: #113b62; --ff-pos-wr-7: #1d4d7a; --ff-pos-wr-8: #2e69a2; --ff-pos-wr-9: #6eb6ff; --ff-pos-wr-10: #95c9ff; --ff-pos-wr-11: #8abcf1; --ff-pos-wr-12: #d9ecff;
  --ff-pos-wr-faint: #82aad3;
  /* warn */
  --ff-warn-1: #090401; --ff-warn-2: #150b01; --ff-warn-3: #241500; --ff-warn-4: #301d00; --ff-warn-5: #3e2700; --ff-warn-6: #4f3300; --ff-warn-7: #654200; --ff-warn-8: #8a5b00; --ff-warn-9: #c98a1a; --ff-warn-10: #db9e3e; --ff-warn-11: #deb06f; --ff-warn-12: #ffe6c5;
  --ff-warn-faint: #c4a06e;
  /* semantic: the only names a template may use */
  --ff-surface-ground: #101512;  /* the page */
  --ff-surface-sunken: #1b201d;  /* wells: console output, code, an inset panel */
  --ff-surface-panel: #1b201d;  /* layer-01, a card or panel on the page */
  --ff-surface-raised: #252c27;  /* layer-02, a panel nested inside a panel */
  --ff-surface-overlay: #252c27;  /* menus, the player dialog */
  --ff-text-default: #e9eae9;
  --ff-text-muted: #c4c7c4;  /* solved to Lc 68 on the worst surface it lands on; what we shipped was Lc 49 */
  --ff-text-faint: #a4a7a5;  /* non-essential only: never a sentence someone must read */
  --ff-text-accent: #cfb66a;
  --ff-text-on-solid: #141210;  /* text on any step-9 fill */
  --ff-border-subtle: #383a38;
  --ff-border-default: #494b49;
  --ff-border-strong: #646764;
  --ff-border-accent: #7c6300;
  --ff-border-focus: #d4af37;
  --ff-fill-accent: #d4af37;
  --ff-fill-accent-hover: #e6c355;
  --ff-fill-accent-soft: #201700;
  --ff-fill-oracle-soft: #1a1035;
  --ff-fill-ok-soft: #021f0c;
  --ff-fill-warn-soft: #241500;
  --ff-fill-bad-soft: #2f0a06;
  --ff-status-ok-text: #80c895;
  --ff-status-warn-text: #deb06f;
  --ff-status-bad-text: #ff9e8e;
  --ff-status-ok-dot: #2e9e5b;
  --ff-status-warn-dot: #c98a1a;
  --ff-status-bad-dot: #c0392b;
  --ff-status-idle-dot: #646764;
  --ff-status-live-dot: #d4af37;
  /* positions: filled chips (decision 5A). Safe to fill only because no
     position shares a hue with a status -- the generator enforces that. */
  --ff-pos-qb-fill: #ff97bc; --ff-pos-qb-on-fill: #30282b; --ff-pos-qb-border: #71324a; --ff-pos-qb-text: #eea2bc;
  --ff-pos-rb-fill: #37d8c9; --ff-pos-rb-on-fill: #38413f; --ff-pos-rb-border: #005750; --ff-pos-rb-text: #67c8bc;
  --ff-pos-wr-fill: #6eb6ff; --ff-pos-wr-on-fill: #181c21; --ff-pos-wr-border: #1d4d7a; --ff-pos-wr-text: #8abcf1;
  --ff-pos-te-fill: #e69dfc; --ff-pos-te-on-fill: #302c32; --ff-pos-te-border: #623470; --ff-pos-te-text: #d9a6e9;
  --ff-pos-k-fill: #c3c54f; --ff-pos-k-on-fill: #393932; --ff-pos-k-border: #4e4e00; --ff-pos-k-text: #babd6f;
  --ff-pos-dst-fill: #b4bfca; --ff-pos-dst-on-fill: #32373d; --ff-pos-dst-border: #444b52; --ff-pos-dst-text: #b1b9c0;
  /* invariant — The two colours that do not move between themes, because they are the brand mark's own ground and ink rather than the page's. The header strip and the logo lockup keep them in both themes; everything else uses a surface token. */
  --ff-invariant-ground: #101512;  /* the dark strip the brand sits on, in both themes */
  --ff-invariant-paper: #f2eee6;  /* the ink that sits on it, in both themes */
  /* type — Decision 1A (Archivo display, Inter UI, JetBrains Mono console) and 2A (Carbon's generated scale, every size in a compact and a comfortable line height). Decision 3C: prose keeps 16px, data drops to the compact pair. */
  --ff-type-family-display: Archivo;
  --ff-type-family-body: Inter;
  --ff-type-family-mono: JetBrains Mono;
  --ff-type-scale-12: 0.75rem;
  --ff-type-scale-14: 0.875rem;
  --ff-type-scale-16: 1rem;
  --ff-type-scale-18: 1.125rem;
  --ff-type-scale-20: 1.25rem;
  --ff-type-scale-24: 1.5rem;
  --ff-type-scale-28: 1.75rem;
  --ff-type-scale-32: 2rem;
  --ff-type-scale-42: 2.625rem;  /* reserved: page titles only */
  --ff-type-scale-54: 3.375rem;  /* reserved: the home hero only */
  --ff-type-leading-compact: 1.28572;  /* table rows, chips, dense lists */
  --ff-type-leading-normal: 1.42857;  /* short labels and card bodies */
  --ff-type-leading-prose: 1.5;  /* anything someone reads a paragraph of */
  --ff-type-leading-tight: 1.15;  /* headings and metric numbers */
  --ff-type-tracking-label: 0.02em;
  --ff-type-tracking-body: 0;
  --ff-type-tracking-heading: -0.012em;
  --ff-type-tracking-display: -0.022em;
  /* space — Carbon's thirteen steps on an 8px mini-unit, 4pt-flavoured at the bottom. */
  --ff-space-1: 0.125rem;
  --ff-space-2: 0.25rem;
  --ff-space-3: 0.5rem;
  --ff-space-4: 0.75rem;
  --ff-space-5: 1rem;
  --ff-space-6: 1.5rem;
  --ff-space-7: 2rem;
  --ff-space-8: 2.5rem;
  --ff-space-9: 3rem;
  --ff-space-10: 4rem;
  --ff-space-11: 5rem;
  --ff-space-12: 6rem;
  --ff-space-13: 10rem;
  /* radius — Decision 7C, soft. Shape still carries information: a table cell is square because it is part of a grid, a chip is small-soft, a panel is generously round. */
  --ff-radius-none: 0;  /* table cells, the console feed, anything in a grid */
  --ff-radius-chip: 6px;  /* badges, position chips, inputs */
  --ff-radius-panel: 12px;  /* cards, tiles, notices */
  --ff-radius-page: 16px;  /* dialogs and the largest containers */
  --ff-radius-full: 9999px;  /* avatars, status dots */
  /* row — Decision 3C: two table densities, Carbon's published heights. */
  --ff-row-compact: 32px;
  --ff-row-comfortable: 40px;
  /* motion — Carbon's productive set. Settled by constraint, not put to the owner. */
  --ff-motion-fast: 70ms;  /* hover, focus */
  --ff-motion-quick: 110ms;  /* a small thing entering or leaving */
  --ff-motion-base: 150ms;  /* default */
  --ff-motion-system: 240ms;  /* something the harness initiated */
  --ff-motion-standard: cubic-bezier(0.2, 0, 0.38, 0.9);
  --ff-motion-entrance: cubic-bezier(0, 0, 0.38, 0.9);
  --ff-motion-exit: cubic-bezier(0.2, 0, 1, 0.9);
  /* elevation — Decision 6A: depth is a lighter surface plus a border. Shadow is spent on exactly two things, because a shadow is nearly invisible on #101512. */
  --ff-elevation-menu: 0 6px 18px rgba(0,0,0,0.34);
  --ff-elevation-dialog: 0 16px 48px rgba(0,0,0,0.46);
}

/* The visitor's OS says light and they have not overridden it. */
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) {
    /* bad */
    --ff-bad-1: #fff4f2; --ff-bad-2: #ffebe7; --ff-bad-3: #ffddd7; --ff-bad-4: #ffd0c7; --ff-bad-5: #ffc1b7; --ff-bad-6: #ffaea1; --ff-bad-7: #f39687; --ff-bad-8: #df7262; --ff-bad-9: #c0392b; --ff-bad-10: #a9281c; --ff-bad-11: #b4493b; --ff-bad-12: #180000;
    --ff-bad-faint: #c1695c;
    /* gold */
    --ff-gold-1: #f9f7ef; --ff-gold-2: #f5f0e2; --ff-gold-3: #efe6cc; --ff-gold-4: #e9dcb7; --ff-gold-5: #e2d2a3; --ff-gold-6: #d8c48b; --ff-gold-7: #c8b16d; --ff-gold-8: #b0943c; --ff-gold-9: #d4af37; --ff-gold-10: #bf9c27; --ff-gold-11: #876b00; --ff-gold-12: #1e1600;
    --ff-gold-faint: #99823f;
    /* neutral */
    --ff-neutral-1: #f2eee6; --ff-neutral-2: #f9f7f3; --ff-neutral-3: #ffffff; --ff-neutral-4: #dfdcda; --ff-neutral-5: #d6d2cf; --ff-neutral-6: #c9c5c2; --ff-neutral-7: #b7b1ae; --ff-neutral-8: #9c9591; --ff-neutral-9: #69625d; --ff-neutral-10: #58514d; --ff-neutral-11: #6d6663; --ff-neutral-12: #312e2c;
    --ff-neutral-faint: #938d8a;
    /* ok */
    --ff-ok-1: #f1f9f3; --ff-ok-2: #e7f4ea; --ff-ok-3: #d5eedb; --ff-ok-4: #c4e7cd; --ff-ok-5: #b3e0be; --ff-ok-6: #9fd5ad; --ff-ok-7: #84c496; --ff-ok-8: #5bab75; --ff-ok-9: #2e9e5b; --ff-ok-10: #1b8b4c; --ff-ok-11: #2a7f4b; --ff-ok-12: #00210d;
    --ff-ok-faint: #559368;
    /* oracle */
    --ff-oracle-1: #f7f5ff; --ff-oracle-2: #f0eeff; --ff-oracle-3: #e6e2ff; --ff-oracle-4: #dcd7ff; --ff-oracle-5: #d3cbff; --ff-oracle-6: #c6bbff; --ff-oracle-7: #b4a3fe; --ff-oracle-8: #9982ef; --ff-oracle-9: #8f6cf5; --ff-oracle-10: #7d5bdc; --ff-oracle-11: #755bc6; --ff-oracle-12: #110031;
    --ff-oracle-faint: #8876cd;
    /* pos-dst */
    --ff-pos-dst-1: #f6f7f8; --ff-pos-dst-2: #eff0f2; --ff-pos-dst-3: #e4e6e9; --ff-pos-dst-4: #d9dde1; --ff-pos-dst-5: #ced3d8; --ff-pos-dst-6: #c0c6cd; --ff-pos-dst-7: #acb4bb; --ff-pos-dst-8: #8f98a0; --ff-pos-dst-9: #b4bfca; --ff-pos-dst-10: #a2acb6; --ff-pos-dst-11: #676f78; --ff-pos-dst-12: #11161a;
    --ff-pos-dst-faint: #7e858c;
    /* pos-k */
    --ff-pos-k-1: #f7f8ef; --ff-pos-k-2: #f0f2e3; --ff-pos-k-3: #e7e9cd; --ff-pos-k-4: #dee0ba; --ff-pos-k-5: #d4d7a6; --ff-pos-k-6: #c8cb8f; --ff-pos-k-7: #b6b872; --ff-pos-k-8: #9b9d44; --ff-pos-k-9: #c3c54f; --ff-pos-k-10: #b0b240; --ff-pos-k-11: #73730a; --ff-pos-k-12: #1a1a00;
    --ff-pos-k-faint: #878944;
    /* pos-qb */
    --ff-pos-qb-1: #fdf4f7; --ff-pos-qb-2: #fbebf0; --ff-pos-qb-3: #fbdde6; --ff-pos-qb-4: #f8d0dc; --ff-pos-qb-5: #f5c3d3; --ff-pos-qb-6: #eeb2c6; --ff-pos-qb-7: #e09cb3; --ff-pos-qb-8: #cb7b97; --ff-pos-qb-9: #ff97bc; --ff-pos-qb-10: #e886a9; --ff-pos-qb-11: #a15370; --ff-pos-qb-12: #190009;
    --ff-pos-qb-faint: #b06f86;
    /* pos-rb */
    --ff-pos-rb-1: #f0f9f8; --ff-pos-rb-2: #e3f4f2; --ff-pos-rb-3: #ceeee9; --ff-pos-rb-4: #bbe7e1; --ff-pos-rb-5: #a7e0d8; --ff-pos-rb-6: #8fd6cc; --ff-pos-rb-7: #6ec5ba; --ff-pos-rb-8: #36aba0; --ff-pos-rb-9: #37d8c9; --ff-pos-rb-10: #23c3b5; --ff-pos-rb-11: #007d74; --ff-pos-rb-12: #001f1c;
    --ff-pos-rb-faint: #3b938a;
    /* pos-te */
    --ff-pos-te-1: #faf4fc; --ff-pos-te-2: #f6ecfa; --ff-pos-te-3: #f2dff8; --ff-pos-te-4: #ecd2f4; --ff-pos-te-5: #e6c5f1; --ff-pos-te-6: #ddb5ea; --ff-pos-te-7: #cd9fdc; --ff-pos-te-8: #b67ec7; --ff-pos-te-9: #e69dfc; --ff-pos-te-10: #d18ce5; --ff-pos-te-11: #8f58a0; --ff-pos-te-12: #1c0023;
    --ff-pos-te-faint: #9f73ad;
    /* pos-wr */
    --ff-pos-wr-1: #f2f7fe; --ff-pos-wr-2: #e7f1fc; --ff-pos-wr-3: #d6e9fc; --ff-pos-wr-4: #c6dffb; --ff-pos-wr-5: #b6d6f9; --ff-pos-wr-6: #a3caf3; --ff-pos-wr-7: #89b7e7; --ff-pos-wr-8: #649bd4; --ff-pos-wr-9: #6eb6ff; --ff-pos-wr-10: #5fa3e8; --ff-pos-wr-11: #3b72aa; --ff-pos-wr-12: #001830;
    --ff-pos-wr-faint: #5d88b6;
    /* warn */
    --ff-warn-1: #fbf6ef; --ff-warn-2: #f8efe2; --ff-warn-3: #f5e3cd; --ff-warn-4: #f0d8b9; --ff-warn-5: #eccda5; --ff-warn-6: #e3bf8e; --ff-warn-7: #d5ab70; --ff-warn-8: #be8c42; --ff-warn-9: #c98a1a; --ff-warn-10: #b47900; --ff-warn-11: #946406; --ff-warn-12: #1e1000;
    --ff-warn-faint: #a47c43;
    /* semantic: the only names a template may use */
    --ff-surface-ground: #f2eee6;  /* the page */
    --ff-surface-sunken: #f9f7f3;  /* wells: console output, code, an inset panel */
    --ff-surface-panel: #f9f7f3;  /* layer-01, a card or panel on the page */
    --ff-surface-raised: #ffffff;  /* layer-02, a panel nested inside a panel */
    --ff-surface-overlay: #ffffff;  /* menus, the player dialog */
    --ff-text-default: #312e2c;
    --ff-text-muted: #6d6663;  /* solved to Lc 68 on the worst surface it lands on; what we shipped was Lc 49 */
    --ff-text-faint: #938d8a;  /* non-essential only: never a sentence someone must read */
    --ff-text-accent: #876b00;
    --ff-text-on-solid: #141210;  /* text on any step-9 fill */
    --ff-border-subtle: #c9c5c2;
    --ff-border-default: #b7b1ae;
    --ff-border-strong: #9c9591;
    --ff-border-accent: #b0943c;
    --ff-border-focus: #d4af37;
    --ff-fill-accent: #d4af37;
    --ff-fill-accent-hover: #bf9c27;
    --ff-fill-accent-soft: #efe6cc;
    --ff-fill-oracle-soft: #e6e2ff;
    --ff-fill-ok-soft: #d5eedb;
    --ff-fill-warn-soft: #f5e3cd;
    --ff-fill-bad-soft: #ffddd7;
    --ff-status-ok-text: #2a7f4b;
    --ff-status-warn-text: #946406;
    --ff-status-bad-text: #b4493b;
    --ff-status-ok-dot: #2e9e5b;
    --ff-status-warn-dot: #c98a1a;
    --ff-status-bad-dot: #c0392b;
    --ff-status-idle-dot: #9c9591;
    --ff-status-live-dot: #d4af37;
    /* positions: filled chips (decision 5A). Safe to fill only because no
       position shares a hue with a status -- the generator enforces that. */
    --ff-pos-qb-fill: #ff97bc; --ff-pos-qb-on-fill: #30282b; --ff-pos-qb-border: #e09cb3; --ff-pos-qb-text: #a15370;
    --ff-pos-rb-fill: #37d8c9; --ff-pos-rb-on-fill: #38413f; --ff-pos-rb-border: #6ec5ba; --ff-pos-rb-text: #007d74;
    --ff-pos-wr-fill: #6eb6ff; --ff-pos-wr-on-fill: #181c21; --ff-pos-wr-border: #89b7e7; --ff-pos-wr-text: #3b72aa;
    --ff-pos-te-fill: #e69dfc; --ff-pos-te-on-fill: #302c32; --ff-pos-te-border: #cd9fdc; --ff-pos-te-text: #8f58a0;
    --ff-pos-k-fill: #c3c54f; --ff-pos-k-on-fill: #393932; --ff-pos-k-border: #b6b872; --ff-pos-k-text: #73730a;
    --ff-pos-dst-fill: #b4bfca; --ff-pos-dst-on-fill: #32373d; --ff-pos-dst-border: #acb4bb; --ff-pos-dst-text: #676f78;
  }
}

/* An explicit choice wins over the OS, in both directions. */
[data-theme="light"] {
  /* bad */
  --ff-bad-1: #fff4f2; --ff-bad-2: #ffebe7; --ff-bad-3: #ffddd7; --ff-bad-4: #ffd0c7; --ff-bad-5: #ffc1b7; --ff-bad-6: #ffaea1; --ff-bad-7: #f39687; --ff-bad-8: #df7262; --ff-bad-9: #c0392b; --ff-bad-10: #a9281c; --ff-bad-11: #b4493b; --ff-bad-12: #180000;
  --ff-bad-faint: #c1695c;
  /* gold */
  --ff-gold-1: #f9f7ef; --ff-gold-2: #f5f0e2; --ff-gold-3: #efe6cc; --ff-gold-4: #e9dcb7; --ff-gold-5: #e2d2a3; --ff-gold-6: #d8c48b; --ff-gold-7: #c8b16d; --ff-gold-8: #b0943c; --ff-gold-9: #d4af37; --ff-gold-10: #bf9c27; --ff-gold-11: #876b00; --ff-gold-12: #1e1600;
  --ff-gold-faint: #99823f;
  /* neutral */
  --ff-neutral-1: #f2eee6; --ff-neutral-2: #f9f7f3; --ff-neutral-3: #ffffff; --ff-neutral-4: #dfdcda; --ff-neutral-5: #d6d2cf; --ff-neutral-6: #c9c5c2; --ff-neutral-7: #b7b1ae; --ff-neutral-8: #9c9591; --ff-neutral-9: #69625d; --ff-neutral-10: #58514d; --ff-neutral-11: #6d6663; --ff-neutral-12: #312e2c;
  --ff-neutral-faint: #938d8a;
  /* ok */
  --ff-ok-1: #f1f9f3; --ff-ok-2: #e7f4ea; --ff-ok-3: #d5eedb; --ff-ok-4: #c4e7cd; --ff-ok-5: #b3e0be; --ff-ok-6: #9fd5ad; --ff-ok-7: #84c496; --ff-ok-8: #5bab75; --ff-ok-9: #2e9e5b; --ff-ok-10: #1b8b4c; --ff-ok-11: #2a7f4b; --ff-ok-12: #00210d;
  --ff-ok-faint: #559368;
  /* oracle */
  --ff-oracle-1: #f7f5ff; --ff-oracle-2: #f0eeff; --ff-oracle-3: #e6e2ff; --ff-oracle-4: #dcd7ff; --ff-oracle-5: #d3cbff; --ff-oracle-6: #c6bbff; --ff-oracle-7: #b4a3fe; --ff-oracle-8: #9982ef; --ff-oracle-9: #8f6cf5; --ff-oracle-10: #7d5bdc; --ff-oracle-11: #755bc6; --ff-oracle-12: #110031;
  --ff-oracle-faint: #8876cd;
  /* pos-dst */
  --ff-pos-dst-1: #f6f7f8; --ff-pos-dst-2: #eff0f2; --ff-pos-dst-3: #e4e6e9; --ff-pos-dst-4: #d9dde1; --ff-pos-dst-5: #ced3d8; --ff-pos-dst-6: #c0c6cd; --ff-pos-dst-7: #acb4bb; --ff-pos-dst-8: #8f98a0; --ff-pos-dst-9: #b4bfca; --ff-pos-dst-10: #a2acb6; --ff-pos-dst-11: #676f78; --ff-pos-dst-12: #11161a;
  --ff-pos-dst-faint: #7e858c;
  /* pos-k */
  --ff-pos-k-1: #f7f8ef; --ff-pos-k-2: #f0f2e3; --ff-pos-k-3: #e7e9cd; --ff-pos-k-4: #dee0ba; --ff-pos-k-5: #d4d7a6; --ff-pos-k-6: #c8cb8f; --ff-pos-k-7: #b6b872; --ff-pos-k-8: #9b9d44; --ff-pos-k-9: #c3c54f; --ff-pos-k-10: #b0b240; --ff-pos-k-11: #73730a; --ff-pos-k-12: #1a1a00;
  --ff-pos-k-faint: #878944;
  /* pos-qb */
  --ff-pos-qb-1: #fdf4f7; --ff-pos-qb-2: #fbebf0; --ff-pos-qb-3: #fbdde6; --ff-pos-qb-4: #f8d0dc; --ff-pos-qb-5: #f5c3d3; --ff-pos-qb-6: #eeb2c6; --ff-pos-qb-7: #e09cb3; --ff-pos-qb-8: #cb7b97; --ff-pos-qb-9: #ff97bc; --ff-pos-qb-10: #e886a9; --ff-pos-qb-11: #a15370; --ff-pos-qb-12: #190009;
  --ff-pos-qb-faint: #b06f86;
  /* pos-rb */
  --ff-pos-rb-1: #f0f9f8; --ff-pos-rb-2: #e3f4f2; --ff-pos-rb-3: #ceeee9; --ff-pos-rb-4: #bbe7e1; --ff-pos-rb-5: #a7e0d8; --ff-pos-rb-6: #8fd6cc; --ff-pos-rb-7: #6ec5ba; --ff-pos-rb-8: #36aba0; --ff-pos-rb-9: #37d8c9; --ff-pos-rb-10: #23c3b5; --ff-pos-rb-11: #007d74; --ff-pos-rb-12: #001f1c;
  --ff-pos-rb-faint: #3b938a;
  /* pos-te */
  --ff-pos-te-1: #faf4fc; --ff-pos-te-2: #f6ecfa; --ff-pos-te-3: #f2dff8; --ff-pos-te-4: #ecd2f4; --ff-pos-te-5: #e6c5f1; --ff-pos-te-6: #ddb5ea; --ff-pos-te-7: #cd9fdc; --ff-pos-te-8: #b67ec7; --ff-pos-te-9: #e69dfc; --ff-pos-te-10: #d18ce5; --ff-pos-te-11: #8f58a0; --ff-pos-te-12: #1c0023;
  --ff-pos-te-faint: #9f73ad;
  /* pos-wr */
  --ff-pos-wr-1: #f2f7fe; --ff-pos-wr-2: #e7f1fc; --ff-pos-wr-3: #d6e9fc; --ff-pos-wr-4: #c6dffb; --ff-pos-wr-5: #b6d6f9; --ff-pos-wr-6: #a3caf3; --ff-pos-wr-7: #89b7e7; --ff-pos-wr-8: #649bd4; --ff-pos-wr-9: #6eb6ff; --ff-pos-wr-10: #5fa3e8; --ff-pos-wr-11: #3b72aa; --ff-pos-wr-12: #001830;
  --ff-pos-wr-faint: #5d88b6;
  /* warn */
  --ff-warn-1: #fbf6ef; --ff-warn-2: #f8efe2; --ff-warn-3: #f5e3cd; --ff-warn-4: #f0d8b9; --ff-warn-5: #eccda5; --ff-warn-6: #e3bf8e; --ff-warn-7: #d5ab70; --ff-warn-8: #be8c42; --ff-warn-9: #c98a1a; --ff-warn-10: #b47900; --ff-warn-11: #946406; --ff-warn-12: #1e1000;
  --ff-warn-faint: #a47c43;
  /* semantic: the only names a template may use */
  --ff-surface-ground: #f2eee6;  /* the page */
  --ff-surface-sunken: #f9f7f3;  /* wells: console output, code, an inset panel */
  --ff-surface-panel: #f9f7f3;  /* layer-01, a card or panel on the page */
  --ff-surface-raised: #ffffff;  /* layer-02, a panel nested inside a panel */
  --ff-surface-overlay: #ffffff;  /* menus, the player dialog */
  --ff-text-default: #312e2c;
  --ff-text-muted: #6d6663;  /* solved to Lc 68 on the worst surface it lands on; what we shipped was Lc 49 */
  --ff-text-faint: #938d8a;  /* non-essential only: never a sentence someone must read */
  --ff-text-accent: #876b00;
  --ff-text-on-solid: #141210;  /* text on any step-9 fill */
  --ff-border-subtle: #c9c5c2;
  --ff-border-default: #b7b1ae;
  --ff-border-strong: #9c9591;
  --ff-border-accent: #b0943c;
  --ff-border-focus: #d4af37;
  --ff-fill-accent: #d4af37;
  --ff-fill-accent-hover: #bf9c27;
  --ff-fill-accent-soft: #efe6cc;
  --ff-fill-oracle-soft: #e6e2ff;
  --ff-fill-ok-soft: #d5eedb;
  --ff-fill-warn-soft: #f5e3cd;
  --ff-fill-bad-soft: #ffddd7;
  --ff-status-ok-text: #2a7f4b;
  --ff-status-warn-text: #946406;
  --ff-status-bad-text: #b4493b;
  --ff-status-ok-dot: #2e9e5b;
  --ff-status-warn-dot: #c98a1a;
  --ff-status-bad-dot: #c0392b;
  --ff-status-idle-dot: #9c9591;
  --ff-status-live-dot: #d4af37;
  /* positions: filled chips (decision 5A). Safe to fill only because no
     position shares a hue with a status -- the generator enforces that. */
  --ff-pos-qb-fill: #ff97bc; --ff-pos-qb-on-fill: #30282b; --ff-pos-qb-border: #e09cb3; --ff-pos-qb-text: #a15370;
  --ff-pos-rb-fill: #37d8c9; --ff-pos-rb-on-fill: #38413f; --ff-pos-rb-border: #6ec5ba; --ff-pos-rb-text: #007d74;
  --ff-pos-wr-fill: #6eb6ff; --ff-pos-wr-on-fill: #181c21; --ff-pos-wr-border: #89b7e7; --ff-pos-wr-text: #3b72aa;
  --ff-pos-te-fill: #e69dfc; --ff-pos-te-on-fill: #302c32; --ff-pos-te-border: #cd9fdc; --ff-pos-te-text: #8f58a0;
  --ff-pos-k-fill: #c3c54f; --ff-pos-k-on-fill: #393932; --ff-pos-k-border: #b6b872; --ff-pos-k-text: #73730a;
  --ff-pos-dst-fill: #b4bfca; --ff-pos-dst-on-fill: #32373d; --ff-pos-dst-border: #acb4bb; --ff-pos-dst-text: #676f78;
}
[data-theme="dark"] {
  /* bad */
  --ff-bad-1: #0c0302; --ff-bad-2: #1b0604; --ff-bad-3: #2f0a06; --ff-bad-4: #400d08; --ff-bad-5: #53120b; --ff-bad-6: #671a12; --ff-bad-7: #81271d; --ff-bad-8: #ab3b2e; --ff-bad-9: #c0392b; --ff-bad-10: #d25141; --ff-bad-11: #ff9e8e; --ff-bad-12: #ffe4df;
  --ff-bad-faint: #e19183;
  /* gold */
  --ff-gold-1: #070501; --ff-gold-2: #120d01; --ff-gold-3: #201700; --ff-gold-4: #2b2000; --ff-gold-5: #382b00; --ff-gold-6: #473700; --ff-gold-7: #5b4800; --ff-gold-8: #7c6300; --ff-gold-9: #d4af37; --ff-gold-10: #e6c355; --ff-gold-11: #cfb66a; --ff-gold-12: #f8e9c0;
  --ff-gold-faint: #b9a46b;
  /* neutral */
  --ff-neutral-1: #101512; --ff-neutral-2: #1b201d; --ff-neutral-3: #252c27; --ff-neutral-4: #212221; --ff-neutral-5: #2b2d2c; --ff-neutral-6: #383a38; --ff-neutral-7: #494b49; --ff-neutral-8: #646764; --ff-neutral-9: #616461; --ff-neutral-10: #727573; --ff-neutral-11: #c4c7c4; --ff-neutral-12: #e9eae9;
  --ff-neutral-faint: #a4a7a5;
  /* ok */
  --ff-ok-1: #020703; --ff-ok-2: #031107; --ff-ok-3: #021f0c; --ff-ok-4: #002a11; --ff-ok-5: #003719; --ff-ok-6: #004621; --ff-ok-7: #095a2e; --ff-ok-8: #197942; --ff-ok-9: #2e9e5b; --ff-ok-10: #4ab06f; --ff-ok-11: #80c895; --ff-ok-12: #ccf4d6;
  --ff-ok-faint: #7bb28a;
  /* oracle */
  --ff-oracle-1: #05040e; --ff-oracle-2: #0e091e; --ff-oracle-3: #1a1035; --ff-oracle-4: #241548; --ff-oracle-5: #301d5e; --ff-oracle-6: #3d2774; --ff-oracle-7: #4e358f; --ff-oracle-8: #6b4dbd; --ff-oracle-9: #8f6cf5; --ff-oracle-10: #a084ff; --ff-oracle-11: #bcadff; --ff-oracle-12: #eae8ff;
  --ff-oracle-faint: #aa9bea;
  /* pos-dst */
  --ff-pos-dst-1: #040506; --ff-pos-dst-2: #0c0d0f; --ff-pos-dst-3: #16191b; --ff-pos-dst-4: #1e2226; --ff-pos-dst-5: #282d32; --ff-pos-dst-6: #343a40; --ff-pos-dst-7: #444b52; --ff-pos-dst-8: #5f6770; --ff-pos-dst-9: #b4bfca; --ff-pos-dst-10: #c7d2dd; --ff-pos-dst-11: #b1b9c0; --ff-pos-dst-12: #e6eaef;
  --ff-pos-dst-faint: #a0a7ad;
  /* pos-k */
  --ff-pos-k-1: #050501; --ff-pos-k-2: #0e0e01; --ff-pos-k-3: #1a1a00; --ff-pos-k-4: #232400; --ff-pos-k-5: #2f2f00; --ff-pos-k-6: #3c3c00; --ff-pos-k-7: #4e4e00; --ff-pos-k-8: #6a6b00; --ff-pos-k-9: #c3c54f; --ff-pos-k-10: #d6d86a; --ff-pos-k-11: #babd6f; --ff-pos-k-12: #eaedc2;
  --ff-pos-k-faint: #a7aa6e;
  /* pos-qb */
  --ff-pos-qb-1: #0a0305; --ff-pos-qb-2: #17080d; --ff-pos-qb-3: #290e18; --ff-pos-qb-4: #371322; --ff-pos-qb-5: #481a2d; --ff-pos-qb-6: #5a2439; --ff-pos-qb-7: #71324a; --ff-pos-qb-8: #984766; --ff-pos-qb-9: #ff97bc; --ff-pos-qb-10: #ffb8cf; --ff-pos-qb-11: #eea2bc; --ff-pos-qb-12: #ffe3eb;
  --ff-pos-qb-faint: #d195a9;
  /* pos-rb */
  --ff-pos-rb-1: #000706; --ff-pos-rb-2: #00110f; --ff-pos-rb-3: #001e1b; --ff-pos-rb-4: #002825; --ff-pos-rb-5: #003530; --ff-pos-rb-6: #00433e; --ff-pos-rb-7: #005750; --ff-pos-rb-8: #00766d; --ff-pos-rb-9: #37d8c9; --ff-pos-rb-10: #5cebdc; --ff-pos-rb-11: #67c8bc; --ff-pos-rb-12: #c2f4ec;
  --ff-pos-rb-faint: #6ab3a9;
  /* pos-te */
  --ff-pos-te-1: #080309; --ff-pos-te-2: #130816; --ff-pos-te-3: #220f28; --ff-pos-te-4: #2f1537; --ff-pos-te-5: #3e1c47; --ff-pos-te-6: #4d2659; --ff-pos-te-7: #623470; --ff-pos-te-8: #844b95; --ff-pos-te-9: #e69dfc; --ff-pos-te-10: #efbbff; --ff-pos-te-11: #d9a6e9; --ff-pos-te-12: #f8e3ff;
  --ff-pos-te-faint: #c098cc;
  /* pos-wr */
  --ff-pos-wr-1: #02050b; --ff-pos-wr-2: #040e19; --ff-pos-wr-3: #06192d; --ff-pos-wr-4: #07233d; --ff-pos-wr-5: #0a2e4f; --ff-pos-wr-6: #113b62; --ff-pos-wr-7: #1d4d7a; --ff-pos-wr-8: #2e69a2; --ff-pos-wr-9: #6eb6ff; --ff-pos-wr-10: #95c9ff; --ff-pos-wr-11: #8abcf1; --ff-pos-wr-12: #d9ecff;
  --ff-pos-wr-faint: #82aad3;
  /* warn */
  --ff-warn-1: #090401; --ff-warn-2: #150b01; --ff-warn-3: #241500; --ff-warn-4: #301d00; --ff-warn-5: #3e2700; --ff-warn-6: #4f3300; --ff-warn-7: #654200; --ff-warn-8: #8a5b00; --ff-warn-9: #c98a1a; --ff-warn-10: #db9e3e; --ff-warn-11: #deb06f; --ff-warn-12: #ffe6c5;
  --ff-warn-faint: #c4a06e;
  /* semantic: the only names a template may use */
  --ff-surface-ground: #101512;  /* the page */
  --ff-surface-sunken: #1b201d;  /* wells: console output, code, an inset panel */
  --ff-surface-panel: #1b201d;  /* layer-01, a card or panel on the page */
  --ff-surface-raised: #252c27;  /* layer-02, a panel nested inside a panel */
  --ff-surface-overlay: #252c27;  /* menus, the player dialog */
  --ff-text-default: #e9eae9;
  --ff-text-muted: #c4c7c4;  /* solved to Lc 68 on the worst surface it lands on; what we shipped was Lc 49 */
  --ff-text-faint: #a4a7a5;  /* non-essential only: never a sentence someone must read */
  --ff-text-accent: #cfb66a;
  --ff-text-on-solid: #141210;  /* text on any step-9 fill */
  --ff-border-subtle: #383a38;
  --ff-border-default: #494b49;
  --ff-border-strong: #646764;
  --ff-border-accent: #7c6300;
  --ff-border-focus: #d4af37;
  --ff-fill-accent: #d4af37;
  --ff-fill-accent-hover: #e6c355;
  --ff-fill-accent-soft: #201700;
  --ff-fill-oracle-soft: #1a1035;
  --ff-fill-ok-soft: #021f0c;
  --ff-fill-warn-soft: #241500;
  --ff-fill-bad-soft: #2f0a06;
  --ff-status-ok-text: #80c895;
  --ff-status-warn-text: #deb06f;
  --ff-status-bad-text: #ff9e8e;
  --ff-status-ok-dot: #2e9e5b;
  --ff-status-warn-dot: #c98a1a;
  --ff-status-bad-dot: #c0392b;
  --ff-status-idle-dot: #646764;
  --ff-status-live-dot: #d4af37;
  /* positions: filled chips (decision 5A). Safe to fill only because no
     position shares a hue with a status -- the generator enforces that. */
  --ff-pos-qb-fill: #ff97bc; --ff-pos-qb-on-fill: #30282b; --ff-pos-qb-border: #71324a; --ff-pos-qb-text: #eea2bc;
  --ff-pos-rb-fill: #37d8c9; --ff-pos-rb-on-fill: #38413f; --ff-pos-rb-border: #005750; --ff-pos-rb-text: #67c8bc;
  --ff-pos-wr-fill: #6eb6ff; --ff-pos-wr-on-fill: #181c21; --ff-pos-wr-border: #1d4d7a; --ff-pos-wr-text: #8abcf1;
  --ff-pos-te-fill: #e69dfc; --ff-pos-te-on-fill: #302c32; --ff-pos-te-border: #623470; --ff-pos-te-text: #d9a6e9;
  --ff-pos-k-fill: #c3c54f; --ff-pos-k-on-fill: #393932; --ff-pos-k-border: #4e4e00; --ff-pos-k-text: #babd6f;
  --ff-pos-dst-fill: #b4bfca; --ff-pos-dst-on-fill: #32373d; --ff-pos-dst-border: #444b52; --ff-pos-dst-text: #b1b9c0;
}

