/* palettes.css: one palette system for the 6 project sites.
   Generated by gen_palettes.py; edit that script, not this file.
   Light values live on .site-<name>; dark values apply under
   prefers-color-scheme: dark; [data-scheme] forces either mode.
   Every text pair meets WCAG 2.x 4.5:1, UI pairs 3:1: see
   contrast-report.txt. No en or em dashes appear in this file. */

/* secureconfig: red, OKLCH hue 27 */
.site-secureconfig {
  --bg: #ffeff0;
  --surface-raised: #fffafb;
  --surface-sunken: #fae3e4;
  --text: #2d181b;
  --text-muted: #7a6062;
  --rule: #e6c8cb;
  --rule-strong: #a58185;
  --accent: #bc3732;
  --on-accent: #fffafb;
  --link: #ab3731;
  --link-hover: #931e1c;
  --focus: #e6443d;
  --selection: #ffc8c1;
  --code-bg: #fce7e8;
  --callout-bg: #ffe9e6;
  --glow: #ffd2cc;
  --brand: #c9302d;
}
@media (prefers-color-scheme: dark) {
  .site-secureconfig:not([data-scheme="light"]) {
    --bg: #120506;
    --surface-raised: #1e0f11;
    --surface-sunken: #070102;
    --text: #f6e5e6;
    --text-muted: #a89293;
    --rule: #362526;
    --rule-strong: #7a5b5e;
    --accent: #ef675c;
    --on-accent: #070102;
    --link: #ee7a6f;
    --link-hover: #ff968b;
    --focus: #ff6459;
    --selection: #753933;
    --code-bg: #060102;
    --callout-bg: #24110f;
    --glow: #601f1b;
    --brand: #ef5f55;
}
}
[data-scheme="light"].site-secureconfig {
  --bg: #ffeff0;
  --surface-raised: #fffafb;
  --surface-sunken: #fae3e4;
  --text: #2d181b;
  --text-muted: #7a6062;
  --rule: #e6c8cb;
  --rule-strong: #a58185;
  --accent: #bc3732;
  --on-accent: #fffafb;
  --link: #ab3731;
  --link-hover: #931e1c;
  --focus: #e6443d;
  --selection: #ffc8c1;
  --code-bg: #fce7e8;
  --callout-bg: #ffe9e6;
  --glow: #ffd2cc;
  --brand: #c9302d;
}
[data-scheme="dark"].site-secureconfig {
  --bg: #120506;
  --surface-raised: #1e0f11;
  --surface-sunken: #070102;
  --text: #f6e5e6;
  --text-muted: #a89293;
  --rule: #362526;
  --rule-strong: #7a5b5e;
  --accent: #ef675c;
  --on-accent: #070102;
  --link: #ee7a6f;
  --link-hover: #ff968b;
  --focus: #ff6459;
  --selection: #753933;
  --code-bg: #060102;
  --callout-bg: #24110f;
  --glow: #601f1b;
  --brand: #ef5f55;
}

/* opfiles: orange, OKLCH hue 55 */
.site-opfiles {
  --bg: #fdf1e5;
  --surface-raised: #fffbf7;
  --surface-sunken: #f3e7dc;
  --text: #261d16;
  --text-muted: #70655d;
  --rule: #dbcec4;
  --rule-strong: #96887c;
  --accent: #a25100;
  --on-accent: #fffbf7;
  --link: #954b00;
  --link-hover: #793b00;
  --focus: #ca6800;
  --selection: #fdccac;
  --code-bg: #f5ebe1;
  --callout-bg: #ffeadc;
  --glow: #ffd4b8;
  --brand: #ec7c0e;
}
@media (prefers-color-scheme: dark) {
  .site-opfiles:not([data-scheme="light"]) {
    --bg: #21170e;
    --surface-raised: #2d231b;
    --surface-sunken: #150e07;
    --text: #f0e8e0;
    --text-muted: #a0968e;
    --rule: #463b32;
    --rule-strong: #7a6d63;
    --accent: #e1791b;
    --on-accent: #150e07;
    --link: #e18846;
    --link-hover: #f2a26a;
    --focus: #ed7b00;
    --selection: #703f19;
    --code-bg: #140d07;
    --callout-bg: #3a2312;
    --glow: #582900;
    --brand: #f68622;
}
}
[data-scheme="light"].site-opfiles {
  --bg: #fdf1e5;
  --surface-raised: #fffbf7;
  --surface-sunken: #f3e7dc;
  --text: #261d16;
  --text-muted: #70655d;
  --rule: #dbcec4;
  --rule-strong: #96887c;
  --accent: #a25100;
  --on-accent: #fffbf7;
  --link: #954b00;
  --link-hover: #793b00;
  --focus: #ca6800;
  --selection: #fdccac;
  --code-bg: #f5ebe1;
  --callout-bg: #ffeadc;
  --glow: #ffd4b8;
  --brand: #ec7c0e;
}
[data-scheme="dark"].site-opfiles {
  --bg: #21170e;
  --surface-raised: #2d231b;
  --surface-sunken: #150e07;
  --text: #f0e8e0;
  --text-muted: #a0968e;
  --rule: #463b32;
  --rule-strong: #7a6d63;
  --accent: #e1791b;
  --on-accent: #150e07;
  --link: #e18846;
  --link-hover: #f2a26a;
  --focus: #ed7b00;
  --selection: #703f19;
  --code-bg: #140d07;
  --callout-bg: #3a2312;
  --glow: #582900;
  --brand: #f68622;
}

/* auditthis: yellow, OKLCH hue 92 */
.site-auditthis {
  --bg: #faf2e4;
  --surface-raised: #fffbf5;
  --surface-sunken: #f0e9db;
  --text: #231f15;
  --text-muted: #6c675b;
  --rule: #d7d0c2;
  --rule-strong: #918a7a;
  --accent: #7d6500;
  --on-accent: #fffbf5;
  --link: #735c00;
  --link-hover: #5c4900;
  --focus: #9e8000;
  --selection: #e8d7a3;
  --code-bg: #f3ece0;
  --callout-bg: #f7eed5;
  --glow: #f2dd9d;
  --brand: #f4c929;
}
@media (prefers-color-scheme: dark) {
  .site-auditthis:not([data-scheme="light"]) {
    --bg: #1f190c;
    --surface-raised: #2a251a;
    --surface-sunken: #130f06;
    --text: #eee9e0;
    --text-muted: #9d988d;
    --rule: #423c30;
    --rule-strong: #766f61;
    --accent: #b79400;
    --on-accent: #130f06;
    --link: #be9e32;
    --link-hover: #d1b55d;
    --focus: #be9a00;
    --selection: #5e4b02;
    --code-bg: #120e06;
    --callout-bg: #31280c;
    --glow: #453600;
    --brand: #f8cc2f;
}
}
[data-scheme="light"].site-auditthis {
  --bg: #faf2e4;
  --surface-raised: #fffbf5;
  --surface-sunken: #f0e9db;
  --text: #231f15;
  --text-muted: #6c675b;
  --rule: #d7d0c2;
  --rule-strong: #918a7a;
  --accent: #7d6500;
  --on-accent: #fffbf5;
  --link: #735c00;
  --link-hover: #5c4900;
  --focus: #9e8000;
  --selection: #e8d7a3;
  --code-bg: #f3ece0;
  --callout-bg: #f7eed5;
  --glow: #f2dd9d;
  --brand: #f4c929;
}
[data-scheme="dark"].site-auditthis {
  --bg: #1f190c;
  --surface-raised: #2a251a;
  --surface-sunken: #130f06;
  --text: #eee9e0;
  --text-muted: #9d988d;
  --rule: #423c30;
  --rule-strong: #766f61;
  --accent: #b79400;
  --on-accent: #130f06;
  --link: #be9e32;
  --link-hover: #d1b55d;
  --focus: #be9a00;
  --selection: #5e4b02;
  --code-bg: #120e06;
  --callout-bg: #31280c;
  --glow: #453600;
  --brand: #f8cc2f;
}

/* cleanlanguage: green, OKLCH hue 140 */
.site-cleanlanguage {
  --bg: #f6f4e7;
  --surface-raised: #fcfcf6;
  --surface-sunken: #ebeade;
  --text: #1f2017;
  --text-muted: #67695e;
  --rule: #d0d2c6;
  --rule-strong: #898d7f;
  --accent: #3b752e;
  --on-accent: #fcfcf6;
  --link: #386a2c;
  --link-hover: #245618;
  --focus: #42942e;
  --selection: #c0e3b8;
  --code-bg: #eeede2;
  --callout-bg: #e3f5df;
  --glow: #c1edb7;
  --brand: #59a847;
}
@media (prefers-color-scheme: dark) {
  .site-cleanlanguage:not([data-scheme="light"]) {
    --bg: #1a1a0f;
    --surface-raised: #25261c;
    --surface-sunken: #0f1008;
    --text: #eaeae1;
    --text-muted: #98998f;
    --rule: #3c3e33;
    --rule-strong: #6f7265;
    --accent: #6faa62;
    --on-accent: #0f1008;
    --link: #7fb174;
    --link-hover: #99c68f;
    --focus: #68b457;
    --selection: #32582a;
    --code-bg: #0e0f08;
    --callout-bg: #1d2e19;
    --glow: #18430d;
    --brand: #65b553;
}
}
[data-scheme="light"].site-cleanlanguage {
  --bg: #f6f4e7;
  --surface-raised: #fcfcf6;
  --surface-sunken: #ebeade;
  --text: #1f2017;
  --text-muted: #67695e;
  --rule: #d0d2c6;
  --rule-strong: #898d7f;
  --accent: #3b752e;
  --on-accent: #fcfcf6;
  --link: #386a2c;
  --link-hover: #245618;
  --focus: #42942e;
  --selection: #c0e3b8;
  --code-bg: #eeede2;
  --callout-bg: #e3f5df;
  --glow: #c1edb7;
  --brand: #59a847;
}
[data-scheme="dark"].site-cleanlanguage {
  --bg: #1a1a0f;
  --surface-raised: #25261c;
  --surface-sunken: #0f1008;
  --text: #eaeae1;
  --text-muted: #98998f;
  --rule: #3c3e33;
  --rule-strong: #6f7265;
  --accent: #6faa62;
  --on-accent: #0f1008;
  --link: #7fb174;
  --link-hover: #99c68f;
  --focus: #68b457;
  --selection: #32582a;
  --code-bg: #0e0f08;
  --callout-bg: #1d2e19;
  --glow: #18430d;
  --brand: #65b553;
}

/* aiqt: blue, OKLCH hue 252 */
.site-aiqt {
  --bg: #f4f3f1;
  --surface-raised: #fcfcfb;
  --surface-sunken: #eae9e8;
  --text: #1d1f21;
  --text-muted: #65686a;
  --rule: #cfd1d3;
  --rule-strong: #878b8f;
  --accent: #2c6aaa;
  --on-accent: #fcfcfb;
  --link: #2b619a;
  --link-hover: #154d84;
  --focus: #2985df;
  --selection: #bbdbff;
  --code-bg: #ededeb;
  --callout-bg: #e3f0ff;
  --glow: #c7e1ff;
  --brand: #136dbf;
}
@media (prefers-color-scheme: dark) {
  .site-aiqt:not([data-scheme="light"]) {
    --bg: #181a1b;
    --surface-raised: #232527;
    --surface-sunken: #0e1011;
    --text: #e9e9e9;
    --text-muted: #97989a;
    --rule: #3b3d40;
    --rule-strong: #6d7073;
    --accent: #5e9ce0;
    --on-accent: #0e1011;
    --link: #71a5e0;
    --link-hover: #8dbbf0;
    --focus: #51a2f8;
    --selection: #274f7a;
    --code-bg: #0d0e10;
    --callout-bg: #182a3e;
    --glow: #073967;
    --brand: #4495ea;
}
}
[data-scheme="light"].site-aiqt {
  --bg: #f4f3f1;
  --surface-raised: #fcfcfb;
  --surface-sunken: #eae9e8;
  --text: #1d1f21;
  --text-muted: #65686a;
  --rule: #cfd1d3;
  --rule-strong: #878b8f;
  --accent: #2c6aaa;
  --on-accent: #fcfcfb;
  --link: #2b619a;
  --link-hover: #154d84;
  --focus: #2985df;
  --selection: #bbdbff;
  --code-bg: #ededeb;
  --callout-bg: #e3f0ff;
  --glow: #c7e1ff;
  --brand: #136dbf;
}
[data-scheme="dark"].site-aiqt {
  --bg: #181a1b;
  --surface-raised: #232527;
  --surface-sunken: #0e1011;
  --text: #e9e9e9;
  --text-muted: #97989a;
  --rule: #3b3d40;
  --rule-strong: #6d7073;
  --accent: #5e9ce0;
  --on-accent: #0e1011;
  --link: #71a5e0;
  --link-hover: #8dbbf0;
  --focus: #51a2f8;
  --selection: #274f7a;
  --code-bg: #0d0e10;
  --callout-bg: #182a3e;
  --glow: #073967;
  --brand: #4495ea;
}

/* grclibrary: purple, OKLCH hue 318 */
.site-grclibrary {
  --bg: #fbf1ef;
  --surface-raised: #fffbfa;
  --surface-sunken: #f0e7e6;
  --text: #241d20;
  --text-muted: #6d6568;
  --rule: #d8ced0;
  --rule-strong: #93898d;
  --accent: #8a509c;
  --on-accent: #fffbfa;
  --link: #7e4b8e;
  --link-hover: #6a3779;
  --focus: #af5fc7;
  --selection: #ebcaf6;
  --code-bg: #f3ebea;
  --callout-bg: #f9e8fe;
  --glow: #f3cfff;
  --brand: #9049a5;
}
@media (prefers-color-scheme: dark) {
  .site-grclibrary:not([data-scheme="light"]) {
    --bg: #1f1718;
    --surface-raised: #2a2325;
    --surface-sunken: #130e0f;
    --text: #eee8e7;
    --text-muted: #9d9698;
    --rule: #433b3d;
    --rule-strong: #776d71;
    --accent: #b97dcc;
    --on-accent: #130e0f;
    --link: #be8bce;
    --link-hover: #d2a4e0;
    --focus: #c77bde;
    --selection: #603d6b;
    --code-bg: #120d0e;
    --callout-bg: #322237;
    --glow: #4c2557;
    --brand: #bb75d0;
}
}
[data-scheme="light"].site-grclibrary {
  --bg: #fbf1ef;
  --surface-raised: #fffbfa;
  --surface-sunken: #f0e7e6;
  --text: #241d20;
  --text-muted: #6d6568;
  --rule: #d8ced0;
  --rule-strong: #93898d;
  --accent: #8a509c;
  --on-accent: #fffbfa;
  --link: #7e4b8e;
  --link-hover: #6a3779;
  --focus: #af5fc7;
  --selection: #ebcaf6;
  --code-bg: #f3ebea;
  --callout-bg: #f9e8fe;
  --glow: #f3cfff;
  --brand: #9049a5;
}
[data-scheme="dark"].site-grclibrary {
  --bg: #1f1718;
  --surface-raised: #2a2325;
  --surface-sunken: #130e0f;
  --text: #eee8e7;
  --text-muted: #9d9698;
  --rule: #433b3d;
  --rule-strong: #776d71;
  --accent: #b97dcc;
  --on-accent: #130e0f;
  --link: #be8bce;
  --link-hover: #d2a4e0;
  --focus: #c77bde;
  --selection: #603d6b;
  --code-bg: #120d0e;
  --callout-bg: #322237;
  --glow: #4c2557;
  --brand: #bb75d0;
}

/* The cyclic 6-stop warm rainbow for the sliced cards and the family footer.
   --rainbow-N is card N's own hue; --rainbow-join-N is the shared edge colour
   between card N and card N+1 (join-6 is purple to red, closing the ring).
   Each card: 0% join-(N-1), 20% own, 80% own, 100% join-N. Each hue keeps
   its own lightness so red, orange and yellow read as distinct colours.
   --rainbow-ink-N is the darker or lighter ink, whichever reads better.
   --band-grey is the neutral tail of the footer band (decorative). */
:root, [data-scheme="light"] {
  --rainbow-1: #c9302d; /* secureconfig */
  --rainbow-2: #ec7c0e; /* opfiles */
  --rainbow-3: #f4c929; /* auditthis */
  --rainbow-4: #59a847; /* cleanlanguage */
  --rainbow-5: #136dbf; /* aiqt */
  --rainbow-6: #9049a5; /* grclibrary */
  --rainbow-join-1: #db5925; /* secureconfig to opfiles */
  --rainbow-join-2: #f2a31d; /* opfiles to auditthis */
  --rainbow-join-3: #adba3e; /* auditthis to cleanlanguage */
  --rainbow-join-4: #328f8e; /* cleanlanguage to aiqt */
  --rainbow-join-5: #665eb2; /* aiqt to grclibrary */
  --rainbow-join-6: #ac4571; /* grclibrary to secureconfig */
  --rainbow-ink-1: #fffaf2;
  --rainbow-ink-2: #1d1a16;
  --rainbow-ink-3: #1d1a16;
  --rainbow-ink-4: #1d1a16;
  --rainbow-ink-5: #fffaf2;
  --rainbow-ink-6: #fffaf2;
  --band-grey: #4a4a4a; /* the neutral grey of the footer band's tail; decorative, no text on it */
}
@media (prefers-color-scheme: dark) {
  :root:not([data-scheme="light"]) {
    --rainbow-1: #ef5f55; /* secureconfig */
    --rainbow-2: #f68622; /* opfiles */
    --rainbow-3: #f8cc2f; /* auditthis */
    --rainbow-4: #65b553; /* cleanlanguage */
    --rainbow-5: #4495ea; /* aiqt */
    --rainbow-6: #bb75d0; /* grclibrary */
    --rainbow-join-1: #f37342; /* secureconfig to opfiles */
    --rainbow-join-2: #f9aa29; /* opfiles to auditthis */
    --rainbow-join-3: #b4c247; /* auditthis to cleanlanguage */
    --rainbow-join-4: #50a9a8; /* cleanlanguage to aiqt */
    --rainbow-join-5: #8c87dd; /* aiqt to grclibrary */
    --rainbow-join-6: #d56f98; /* grclibrary to secureconfig */
    --rainbow-ink-1: #1d1a16;
    --rainbow-ink-2: #1d1a16;
    --rainbow-ink-3: #1d1a16;
    --rainbow-ink-4: #1d1a16;
    --rainbow-ink-5: #1d1a16;
    --rainbow-ink-6: #1d1a16;
    --band-grey: #5c5c5c; /* the neutral grey of the footer band's tail; decorative, no text on it */
  }
}
[data-scheme="dark"] {
  --rainbow-1: #ef5f55; /* secureconfig */
  --rainbow-2: #f68622; /* opfiles */
  --rainbow-3: #f8cc2f; /* auditthis */
  --rainbow-4: #65b553; /* cleanlanguage */
  --rainbow-5: #4495ea; /* aiqt */
  --rainbow-6: #bb75d0; /* grclibrary */
  --rainbow-join-1: #f37342; /* secureconfig to opfiles */
  --rainbow-join-2: #f9aa29; /* opfiles to auditthis */
  --rainbow-join-3: #b4c247; /* auditthis to cleanlanguage */
  --rainbow-join-4: #50a9a8; /* cleanlanguage to aiqt */
  --rainbow-join-5: #8c87dd; /* aiqt to grclibrary */
  --rainbow-join-6: #d56f98; /* grclibrary to secureconfig */
  --rainbow-ink-1: #1d1a16;
  --rainbow-ink-2: #1d1a16;
  --rainbow-ink-3: #1d1a16;
  --rainbow-ink-4: #1d1a16;
  --rainbow-ink-5: #1d1a16;
  --rainbow-ink-6: #1d1a16;
  --band-grey: #5c5c5c; /* the neutral grey of the footer band's tail; decorative, no text on it */
}

/* Sliced rainbow cards. Markup: <ul class="rainbow"><li class="slice slice-1">...</li> ... </ul>
   Contiguous: no gap. Gapped: add .rainbow-gapped. Ring: add .rainbow-ring (6 slices rotated
   round a centre; the purple to red join closes the loop). Text on a slice uses --rainbow-ink. */
.rainbow { display: flex; list-style: none; margin: 0; padding: 0; gap: 0; }
.rainbow-gapped { gap: 0.75rem; }
.rainbow .slice { flex: 1 1 0; min-width: 0; padding: 1rem; }
.slice-1 { color: var(--rainbow-ink-1); } .slice-2 { color: var(--rainbow-ink-2); } .slice-3 { color: var(--rainbow-ink-3); }
.slice-4 { color: var(--rainbow-ink-4); } .slice-5 { color: var(--rainbow-ink-5); } .slice-6 { color: var(--rainbow-ink-6); }
.rainbow-gapped .slice { border-radius: 0.5rem; }
.slice-1 { background: linear-gradient(90deg, var(--rainbow-join-6) 0%, var(--rainbow-1) 20%, var(--rainbow-1) 80%, var(--rainbow-join-1) 100%); }
.slice-2 { background: linear-gradient(90deg, var(--rainbow-join-1) 0%, var(--rainbow-2) 20%, var(--rainbow-2) 80%, var(--rainbow-join-2) 100%); }
.slice-3 { background: linear-gradient(90deg, var(--rainbow-join-2) 0%, var(--rainbow-3) 20%, var(--rainbow-3) 80%, var(--rainbow-join-3) 100%); }
.slice-4 { background: linear-gradient(90deg, var(--rainbow-join-3) 0%, var(--rainbow-4) 20%, var(--rainbow-4) 80%, var(--rainbow-join-4) 100%); }
.slice-5 { background: linear-gradient(90deg, var(--rainbow-join-4) 0%, var(--rainbow-5) 20%, var(--rainbow-5) 80%, var(--rainbow-join-5) 100%); }
.slice-6 { background: linear-gradient(90deg, var(--rainbow-join-5) 0%, var(--rainbow-6) 20%, var(--rainbow-6) 80%, var(--rainbow-join-6) 100%); }
/* The same band as one continuous gradient (for a rule, a border-image or a conic ring).
   Hue stops sit at the centre of each sixth; the join colours sit at the boundaries,
   so the band matches the slices exactly and wraps at 0% and 100%. */
:root { --rainbow-band: linear-gradient(90deg,
  var(--rainbow-join-6) 0%, var(--rainbow-1) 3.33%, var(--rainbow-1) 13.33%, var(--rainbow-join-1) 16.67%,
  var(--rainbow-2) 20%, var(--rainbow-2) 30%, var(--rainbow-join-2) 33.33%,
  var(--rainbow-3) 36.67%, var(--rainbow-3) 46.67%, var(--rainbow-join-3) 50%,
  var(--rainbow-4) 53.33%, var(--rainbow-4) 63.33%, var(--rainbow-join-4) 66.67%,
  var(--rainbow-5) 70%, var(--rainbow-5) 80%, var(--rainbow-join-5) 83.33%,
  var(--rainbow-6) 86.67%, var(--rainbow-6) 96.67%, var(--rainbow-join-6) 100%); }
.rainbow-ring { background: conic-gradient(from -30deg,
  var(--rainbow-join-6) 0deg, var(--rainbow-1) 12deg, var(--rainbow-1) 48deg, var(--rainbow-join-1) 60deg,
  var(--rainbow-2) 72deg, var(--rainbow-2) 108deg, var(--rainbow-join-2) 120deg,
  var(--rainbow-3) 132deg, var(--rainbow-3) 168deg, var(--rainbow-join-3) 180deg,
  var(--rainbow-4) 192deg, var(--rainbow-4) 228deg, var(--rainbow-join-4) 240deg,
  var(--rainbow-5) 252deg, var(--rainbow-5) 288deg, var(--rainbow-join-5) 300deg,
  var(--rainbow-6) 312deg, var(--rainbow-6) 348deg, var(--rainbow-join-6) 360deg);
  border-radius: 50%; aspect-ratio: 1; }

