@kolkrabbi/kol-theme 0.102.0 → 0.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,8 +25,23 @@
25
25
  :root,
26
26
  :is([data-theme="light"], .light) {
27
27
  /* Absolutes (theme-invariant) */
28
+ /* TWO PAIRS OF POLES, AND THEY ARE NOT THE SAME PAIR (user ruling 2026-08-30).
29
+ *
30
+ * ab PURE polarity — #000000 / #ffffff. The absolute ends of the
31
+ * range. Use when a step has to go past the theme's own ink:
32
+ * "applying a percentage of primary on top of primary won't make
33
+ * it darker, but applying a percentage of 000000 will."
34
+ * absolute THE THEME'S OWN near-black / near-white, FROZEN. Same colour in
35
+ * light and dark — the original meaning of the word here, before
36
+ * the 2026-08-28 rename collapsed it into an alias of `ab`.
37
+ *
38
+ * Both families are theme-INVARIANT. What separates them is which poles they
39
+ * mix between, not whether they flip. `fg-*` / `oq-*` and their `-inverse`
40
+ * twins are the families that flip. */
28
41
  --kol-color-ab-white: #ffffff;
29
42
  --kol-color-ab-black: #000000;
43
+ --kol-color-white: #fcfbf8;
44
+ --kol-color-black: #0e0e11;
30
45
 
31
46
  /* Surface tiers (page-level) — Light Mode (default) */
32
47
  --kol-surface-primary: #fafafa;
@@ -54,7 +69,12 @@
54
69
  * which one the well points at, and that is this token's entire job.
55
70
  * Light: `oq-ab-inverse-96` (245, under the 250 page)
56
71
  * Dark: `oq-ab-96` (10, under the 18 page) */
57
- --kol-surface-sunken: var(--kol-oq-ab-inverse-96);
72
+ /* ONE LINE, BOTH THEMES (user, 2026-08-30: *"isnt ab what we want to use for
73
+ * sunken? how can we use ab- and ab-inverse if they dont flip"*). Once `ab`
74
+ * flips toward the ground, `oq-ab-96` IS the well everywhere — 245 under a
75
+ * 250 page in light, 10 under an 18 page in dark. The per-theme alias this
76
+ * replaced was the tell that the ladder underneath was wrong. */
77
+ --kol-surface-sunken: var(--kol-oq-ab-96);
58
78
 
59
79
  --kol-surface-inverse: #0e0e11;
60
80
  --kol-surface-on-inverse: #fcfbf8;
@@ -84,8 +104,6 @@
84
104
  --kol-surface-tertiary: #0e0e11;
85
105
  --kol-surface-on-tertiary: #ffffff;
86
106
 
87
- /* the sunken well, dark side — `oq-ab-96` (10) under the #121215 page (18) */
88
- --kol-surface-sunken: var(--kol-oq-ab-96);
89
107
 
90
108
  --kol-surface-inverse: #fcfbf8;
91
109
  --kol-surface-on-inverse: #0e0e11;
@@ -132,10 +150,6 @@
132
150
  --kol-surface-tertiary: #0e0e11;
133
151
  --kol-surface-on-tertiary: #ffffff;
134
152
 
135
- /* the sunken well, system-dark — this block is the one a user who never
136
- * touched the toggle gets, and it is the one the first pass of this fix
137
- * forgot: the `:root` light value would have leaked into system dark. */
138
- --kol-surface-sunken: var(--kol-oq-ab-96);
139
153
 
140
154
  --kol-surface-inverse: #fcfbf8;
141
155
  --kol-surface-on-inverse: #0e0e11;
package/kol-opacity.css CHANGED
@@ -68,21 +68,22 @@
68
68
  * TOKENS — Absolute tier (theme-independent black, fixed opacity stops)
69
69
  * ============================================================================ */
70
70
 
71
- --kol-fg-ab-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, transparent);
72
- --kol-fg-ab-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, transparent);
73
- --kol-fg-ab-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, transparent);
74
- --kol-fg-ab-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, transparent);
75
- --kol-fg-ab-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, transparent);
76
- --kol-fg-ab-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, transparent);
77
- --kol-fg-ab-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, transparent);
78
- --kol-fg-ab-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, transparent);
79
- --kol-fg-ab-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, transparent);
80
- --kol-fg-ab-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
81
- --kol-fg-ab-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, transparent);
82
- --kol-fg-ab-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, transparent);
83
- --kol-fg-ab-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, transparent);
84
- --kol-fg-ab-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, transparent);
85
- --kol-fg-ab-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, transparent);
71
+ /* LIGHT ground — `ab` starts from white (see kol-opaque.css for the axis) */
72
+ --kol-fg-ab-01: color-mix(in srgb, var(--kol-color-ab-white) 1%, transparent);
73
+ --kol-fg-ab-02: color-mix(in srgb, var(--kol-color-ab-white) 2%, transparent);
74
+ --kol-fg-ab-04: color-mix(in srgb, var(--kol-color-ab-white) 4%, transparent);
75
+ --kol-fg-ab-08: color-mix(in srgb, var(--kol-color-ab-white) 8%, transparent);
76
+ --kol-fg-ab-12: color-mix(in srgb, var(--kol-color-ab-white) 12%, transparent);
77
+ --kol-fg-ab-16: color-mix(in srgb, var(--kol-color-ab-white) 16%, transparent);
78
+ --kol-fg-ab-24: color-mix(in srgb, var(--kol-color-ab-white) 24%, transparent);
79
+ --kol-fg-ab-32: color-mix(in srgb, var(--kol-color-ab-white) 32%, transparent);
80
+ --kol-fg-ab-40: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent);
81
+ --kol-fg-ab-48: color-mix(in srgb, var(--kol-color-ab-white) 48%, transparent);
82
+ --kol-fg-ab-64: color-mix(in srgb, var(--kol-color-ab-white) 64%, transparent);
83
+ --kol-fg-ab-72: color-mix(in srgb, var(--kol-color-ab-white) 72%, transparent);
84
+ --kol-fg-ab-80: color-mix(in srgb, var(--kol-color-ab-white) 80%, transparent);
85
+ --kol-fg-ab-88: color-mix(in srgb, var(--kol-color-ab-white) 88%, transparent);
86
+ --kol-fg-ab-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, transparent);
86
87
 
87
88
  /* ============================================================================
88
89
  * TOKENS — Inverse tier (foreground on inverse surface)
@@ -108,6 +109,81 @@
108
109
  * classes below — no intermediate alias tokens. */
109
110
  }
110
111
 
112
+ /* `ab` FLIPS TOWARD THE GROUND (user ruling 2026-08-30) — the same axis as
113
+ * kol-opaque.css's `oq-ab-*`. In dark the ground is black, so a translucent
114
+ * `ab` wash is black; in light it is white. `ab-inverse-*` is the opposite pole
115
+ * in each theme, so it is the half that contrasts. */
116
+ :is([data-theme="dark"], .dark) {
117
+ --kol-fg-ab-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, transparent);
118
+ --kol-fg-ab-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, transparent);
119
+ --kol-fg-ab-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, transparent);
120
+ --kol-fg-ab-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, transparent);
121
+ --kol-fg-ab-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, transparent);
122
+ --kol-fg-ab-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, transparent);
123
+ --kol-fg-ab-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, transparent);
124
+ --kol-fg-ab-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, transparent);
125
+ --kol-fg-ab-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, transparent);
126
+ --kol-fg-ab-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
127
+ --kol-fg-ab-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, transparent);
128
+ --kol-fg-ab-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, transparent);
129
+ --kol-fg-ab-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, transparent);
130
+ --kol-fg-ab-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, transparent);
131
+ --kol-fg-ab-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, transparent);
132
+
133
+ --kol-fg-ab-inverse-01: color-mix(in srgb, var(--kol-color-ab-white) 1%, transparent);
134
+ --kol-fg-ab-inverse-02: color-mix(in srgb, var(--kol-color-ab-white) 2%, transparent);
135
+ --kol-fg-ab-inverse-04: color-mix(in srgb, var(--kol-color-ab-white) 4%, transparent);
136
+ --kol-fg-ab-inverse-08: color-mix(in srgb, var(--kol-color-ab-white) 8%, transparent);
137
+ --kol-fg-ab-inverse-12: color-mix(in srgb, var(--kol-color-ab-white) 12%, transparent);
138
+ --kol-fg-ab-inverse-16: color-mix(in srgb, var(--kol-color-ab-white) 16%, transparent);
139
+ --kol-fg-ab-inverse-24: color-mix(in srgb, var(--kol-color-ab-white) 24%, transparent);
140
+ --kol-fg-ab-inverse-32: color-mix(in srgb, var(--kol-color-ab-white) 32%, transparent);
141
+ --kol-fg-ab-inverse-40: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent);
142
+ --kol-fg-ab-inverse-48: color-mix(in srgb, var(--kol-color-ab-white) 48%, transparent);
143
+ --kol-fg-ab-inverse-64: color-mix(in srgb, var(--kol-color-ab-white) 64%, transparent);
144
+ --kol-fg-ab-inverse-72: color-mix(in srgb, var(--kol-color-ab-white) 72%, transparent);
145
+ --kol-fg-ab-inverse-80: color-mix(in srgb, var(--kol-color-ab-white) 80%, transparent);
146
+ --kol-fg-ab-inverse-88: color-mix(in srgb, var(--kol-color-ab-white) 88%, transparent);
147
+ --kol-fg-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, transparent);
148
+ }
149
+
150
+ @media (prefers-color-scheme: dark) {
151
+ :root:not([data-theme="light"]):not(.light) {
152
+ --kol-fg-ab-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, transparent);
153
+ --kol-fg-ab-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, transparent);
154
+ --kol-fg-ab-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, transparent);
155
+ --kol-fg-ab-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, transparent);
156
+ --kol-fg-ab-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, transparent);
157
+ --kol-fg-ab-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, transparent);
158
+ --kol-fg-ab-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, transparent);
159
+ --kol-fg-ab-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, transparent);
160
+ --kol-fg-ab-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, transparent);
161
+ --kol-fg-ab-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
162
+ --kol-fg-ab-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, transparent);
163
+ --kol-fg-ab-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, transparent);
164
+ --kol-fg-ab-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, transparent);
165
+ --kol-fg-ab-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, transparent);
166
+ --kol-fg-ab-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, transparent);
167
+
168
+ --kol-fg-ab-inverse-01: color-mix(in srgb, var(--kol-color-ab-white) 1%, transparent);
169
+ --kol-fg-ab-inverse-02: color-mix(in srgb, var(--kol-color-ab-white) 2%, transparent);
170
+ --kol-fg-ab-inverse-04: color-mix(in srgb, var(--kol-color-ab-white) 4%, transparent);
171
+ --kol-fg-ab-inverse-08: color-mix(in srgb, var(--kol-color-ab-white) 8%, transparent);
172
+ --kol-fg-ab-inverse-12: color-mix(in srgb, var(--kol-color-ab-white) 12%, transparent);
173
+ --kol-fg-ab-inverse-16: color-mix(in srgb, var(--kol-color-ab-white) 16%, transparent);
174
+ --kol-fg-ab-inverse-24: color-mix(in srgb, var(--kol-color-ab-white) 24%, transparent);
175
+ --kol-fg-ab-inverse-32: color-mix(in srgb, var(--kol-color-ab-white) 32%, transparent);
176
+ --kol-fg-ab-inverse-40: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent);
177
+ --kol-fg-ab-inverse-48: color-mix(in srgb, var(--kol-color-ab-white) 48%, transparent);
178
+ --kol-fg-ab-inverse-64: color-mix(in srgb, var(--kol-color-ab-white) 64%, transparent);
179
+ --kol-fg-ab-inverse-72: color-mix(in srgb, var(--kol-color-ab-white) 72%, transparent);
180
+ --kol-fg-ab-inverse-80: color-mix(in srgb, var(--kol-color-ab-white) 80%, transparent);
181
+ --kol-fg-ab-inverse-88: color-mix(in srgb, var(--kol-color-ab-white) 88%, transparent);
182
+ --kol-fg-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, transparent);
183
+ }
184
+ }
185
+
186
+
111
187
  /* ==============================================================================
112
188
  * CLASSES — Base (no stop, 100% opacity)
113
189
  * ============================================================================== */
@@ -447,43 +523,209 @@
447
523
  .hover\:text-default:hover { color: var(--kol-fg-body); }
448
524
 
449
525
  /* ============================================================================
450
- * ALIASES — the old `absolute` spelling (renamed to `ab`, user ruling 2026-08-28)
526
+ * `absolute` — THE THEME'S OWN POLES, FROZEN (user ruling 2026-08-30)
527
+ *
528
+ * From 2026-08-28 to 2026-08-30 this name was a deprecated ALIAS of `ab`, kept
529
+ * through the rename. It is a family again, and a different one:
530
+ *
531
+ * fg-ab-NN pure #000000 at NN%% — the absolute end of the range
532
+ * fg-absolute-NN the theme's #0e0e11 at NN%% — its own near-black, frozen
451
533
  *
452
- * Kept so no consumer breaks silently on a name change: `--kol-fg-absolute-NN`
453
- * and `.bg-fg-absolute-NN` still resolve, to the same value as before. New code
454
- * writes `ab`. Drop these once the estate has moved.
534
+ * Both are theme-invariant; they differ in which pole they mix from. The
535
+ * `-inverse` twin of each is the light pole, and it is the half that was
536
+ * missing — `fg-ab-inverse-*` never existed, so "a white wash that does not
537
+ * flip" had no token and got hand-written as a color-mix at the call site.
538
+ *
539
+ * ⚠️ THE MEANING OF `fg-absolute-*` CHANGED HERE. It was #000000 and is now
540
+ * #0e0e11 — a delta of 3/255 at full alpha, invisible at the stops anyone uses,
541
+ * but a real change. Live consumers when this shipped: kol-website's
542
+ * HomeSignup, PrintDetailOverlay, and the brand app's color.js / components.js.
455
543
  * ============================================================================ */
456
544
  :root {
457
- --kol-fg-absolute-01: var(--kol-fg-ab-01);
458
- --kol-fg-absolute-02: var(--kol-fg-ab-02);
459
- --kol-fg-absolute-04: var(--kol-fg-ab-04);
460
- --kol-fg-absolute-08: var(--kol-fg-ab-08);
461
- --kol-fg-absolute-12: var(--kol-fg-ab-12);
462
- --kol-fg-absolute-16: var(--kol-fg-ab-16);
463
- --kol-fg-absolute-24: var(--kol-fg-ab-24);
464
- --kol-fg-absolute-32: var(--kol-fg-ab-32);
465
- --kol-fg-absolute-40: var(--kol-fg-ab-40);
466
- --kol-fg-absolute-48: var(--kol-fg-ab-48);
467
- --kol-fg-absolute-64: var(--kol-fg-ab-64);
468
- --kol-fg-absolute-72: var(--kol-fg-ab-72);
469
- --kol-fg-absolute-80: var(--kol-fg-ab-80);
470
- --kol-fg-absolute-88: var(--kol-fg-ab-88);
471
- --kol-fg-absolute-96: var(--kol-fg-ab-96);
472
- --kol-color-absolute-black: var(--kol-color-ab-black);
473
- --kol-color-absolute-white: var(--kol-color-ab-white);
545
+ /* fg-absolute */
546
+ --kol-fg-absolute-01: color-mix(in srgb, var(--kol-color-black) 1%, transparent);
547
+ --kol-fg-absolute-02: color-mix(in srgb, var(--kol-color-black) 2%, transparent);
548
+ --kol-fg-absolute-04: color-mix(in srgb, var(--kol-color-black) 4%, transparent);
549
+ --kol-fg-absolute-08: color-mix(in srgb, var(--kol-color-black) 8%, transparent);
550
+ --kol-fg-absolute-12: color-mix(in srgb, var(--kol-color-black) 12%, transparent);
551
+ --kol-fg-absolute-16: color-mix(in srgb, var(--kol-color-black) 16%, transparent);
552
+ --kol-fg-absolute-24: color-mix(in srgb, var(--kol-color-black) 24%, transparent);
553
+ --kol-fg-absolute-32: color-mix(in srgb, var(--kol-color-black) 32%, transparent);
554
+ --kol-fg-absolute-40: color-mix(in srgb, var(--kol-color-black) 40%, transparent);
555
+ --kol-fg-absolute-48: color-mix(in srgb, var(--kol-color-black) 48%, transparent);
556
+ --kol-fg-absolute-64: color-mix(in srgb, var(--kol-color-black) 64%, transparent);
557
+ --kol-fg-absolute-72: color-mix(in srgb, var(--kol-color-black) 72%, transparent);
558
+ --kol-fg-absolute-80: color-mix(in srgb, var(--kol-color-black) 80%, transparent);
559
+ --kol-fg-absolute-88: color-mix(in srgb, var(--kol-color-black) 88%, transparent);
560
+ --kol-fg-absolute-96: color-mix(in srgb, var(--kol-color-black) 96%, transparent);
561
+ /* fg-absolute-inverse */
562
+ --kol-fg-absolute-inverse-01: color-mix(in srgb, var(--kol-color-white) 1%, transparent);
563
+ --kol-fg-absolute-inverse-02: color-mix(in srgb, var(--kol-color-white) 2%, transparent);
564
+ --kol-fg-absolute-inverse-04: color-mix(in srgb, var(--kol-color-white) 4%, transparent);
565
+ --kol-fg-absolute-inverse-08: color-mix(in srgb, var(--kol-color-white) 8%, transparent);
566
+ --kol-fg-absolute-inverse-12: color-mix(in srgb, var(--kol-color-white) 12%, transparent);
567
+ --kol-fg-absolute-inverse-16: color-mix(in srgb, var(--kol-color-white) 16%, transparent);
568
+ --kol-fg-absolute-inverse-24: color-mix(in srgb, var(--kol-color-white) 24%, transparent);
569
+ --kol-fg-absolute-inverse-32: color-mix(in srgb, var(--kol-color-white) 32%, transparent);
570
+ --kol-fg-absolute-inverse-40: color-mix(in srgb, var(--kol-color-white) 40%, transparent);
571
+ --kol-fg-absolute-inverse-48: color-mix(in srgb, var(--kol-color-white) 48%, transparent);
572
+ --kol-fg-absolute-inverse-64: color-mix(in srgb, var(--kol-color-white) 64%, transparent);
573
+ --kol-fg-absolute-inverse-72: color-mix(in srgb, var(--kol-color-white) 72%, transparent);
574
+ --kol-fg-absolute-inverse-80: color-mix(in srgb, var(--kol-color-white) 80%, transparent);
575
+ --kol-fg-absolute-inverse-88: color-mix(in srgb, var(--kol-color-white) 88%, transparent);
576
+ --kol-fg-absolute-inverse-96: color-mix(in srgb, var(--kol-color-white) 96%, transparent);
577
+ /* fg-ab-inverse — LIGHT ground: the opposite pole is black */
578
+ --kol-fg-ab-inverse-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, transparent);
579
+ --kol-fg-ab-inverse-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, transparent);
580
+ --kol-fg-ab-inverse-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, transparent);
581
+ --kol-fg-ab-inverse-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, transparent);
582
+ --kol-fg-ab-inverse-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, transparent);
583
+ --kol-fg-ab-inverse-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, transparent);
584
+ --kol-fg-ab-inverse-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, transparent);
585
+ --kol-fg-ab-inverse-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, transparent);
586
+ --kol-fg-ab-inverse-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, transparent);
587
+ --kol-fg-ab-inverse-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
588
+ --kol-fg-ab-inverse-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, transparent);
589
+ --kol-fg-ab-inverse-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, transparent);
590
+ --kol-fg-ab-inverse-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, transparent);
591
+ --kol-fg-ab-inverse-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, transparent);
592
+ --kol-fg-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, transparent);
593
+ --kol-color-absolute-black: var(--kol-color-black);
594
+ --kol-color-absolute-white: var(--kol-color-white);
474
595
  }
475
- .bg-fg-absolute-01 { background-color: var(--kol-fg-ab-01); }
476
- .bg-fg-absolute-02 { background-color: var(--kol-fg-ab-02); }
477
- .bg-fg-absolute-04 { background-color: var(--kol-fg-ab-04); }
478
- .bg-fg-absolute-08 { background-color: var(--kol-fg-ab-08); }
479
- .bg-fg-absolute-12 { background-color: var(--kol-fg-ab-12); }
480
- .bg-fg-absolute-16 { background-color: var(--kol-fg-ab-16); }
481
- .bg-fg-absolute-24 { background-color: var(--kol-fg-ab-24); }
482
- .bg-fg-absolute-32 { background-color: var(--kol-fg-ab-32); }
483
- .bg-fg-absolute-40 { background-color: var(--kol-fg-ab-40); }
484
- .bg-fg-absolute-48 { background-color: var(--kol-fg-ab-48); }
485
- .bg-fg-absolute-64 { background-color: var(--kol-fg-ab-64); }
486
- .bg-fg-absolute-72 { background-color: var(--kol-fg-ab-72); }
487
- .bg-fg-absolute-80 { background-color: var(--kol-fg-ab-80); }
488
- .bg-fg-absolute-88 { background-color: var(--kol-fg-ab-88); }
489
- .bg-fg-absolute-96 { background-color: var(--kol-fg-ab-96); }
596
+
597
+ .bg-fg-absolute-01 { background-color: var(--kol-fg-absolute-01); }
598
+ .bg-fg-absolute-02 { background-color: var(--kol-fg-absolute-02); }
599
+ .bg-fg-absolute-04 { background-color: var(--kol-fg-absolute-04); }
600
+ .bg-fg-absolute-08 { background-color: var(--kol-fg-absolute-08); }
601
+ .bg-fg-absolute-12 { background-color: var(--kol-fg-absolute-12); }
602
+ .bg-fg-absolute-16 { background-color: var(--kol-fg-absolute-16); }
603
+ .bg-fg-absolute-24 { background-color: var(--kol-fg-absolute-24); }
604
+ .bg-fg-absolute-32 { background-color: var(--kol-fg-absolute-32); }
605
+ .bg-fg-absolute-40 { background-color: var(--kol-fg-absolute-40); }
606
+ .bg-fg-absolute-48 { background-color: var(--kol-fg-absolute-48); }
607
+ .bg-fg-absolute-64 { background-color: var(--kol-fg-absolute-64); }
608
+ .bg-fg-absolute-72 { background-color: var(--kol-fg-absolute-72); }
609
+ .bg-fg-absolute-80 { background-color: var(--kol-fg-absolute-80); }
610
+ .bg-fg-absolute-88 { background-color: var(--kol-fg-absolute-88); }
611
+ .bg-fg-absolute-96 { background-color: var(--kol-fg-absolute-96); }
612
+ .text-fg-absolute-01 { color: var(--kol-fg-absolute-01); }
613
+ .text-fg-absolute-02 { color: var(--kol-fg-absolute-02); }
614
+ .text-fg-absolute-04 { color: var(--kol-fg-absolute-04); }
615
+ .text-fg-absolute-08 { color: var(--kol-fg-absolute-08); }
616
+ .text-fg-absolute-12 { color: var(--kol-fg-absolute-12); }
617
+ .text-fg-absolute-16 { color: var(--kol-fg-absolute-16); }
618
+ .text-fg-absolute-24 { color: var(--kol-fg-absolute-24); }
619
+ .text-fg-absolute-32 { color: var(--kol-fg-absolute-32); }
620
+ .text-fg-absolute-40 { color: var(--kol-fg-absolute-40); }
621
+ .text-fg-absolute-48 { color: var(--kol-fg-absolute-48); }
622
+ .text-fg-absolute-64 { color: var(--kol-fg-absolute-64); }
623
+ .text-fg-absolute-72 { color: var(--kol-fg-absolute-72); }
624
+ .text-fg-absolute-80 { color: var(--kol-fg-absolute-80); }
625
+ .text-fg-absolute-88 { color: var(--kol-fg-absolute-88); }
626
+ .text-fg-absolute-96 { color: var(--kol-fg-absolute-96); }
627
+ .border-fg-absolute-01 { border-color: var(--kol-fg-absolute-01); }
628
+ .border-fg-absolute-02 { border-color: var(--kol-fg-absolute-02); }
629
+ .border-fg-absolute-04 { border-color: var(--kol-fg-absolute-04); }
630
+ .border-fg-absolute-08 { border-color: var(--kol-fg-absolute-08); }
631
+ .border-fg-absolute-12 { border-color: var(--kol-fg-absolute-12); }
632
+ .border-fg-absolute-16 { border-color: var(--kol-fg-absolute-16); }
633
+ .border-fg-absolute-24 { border-color: var(--kol-fg-absolute-24); }
634
+ .border-fg-absolute-32 { border-color: var(--kol-fg-absolute-32); }
635
+ .border-fg-absolute-40 { border-color: var(--kol-fg-absolute-40); }
636
+ .border-fg-absolute-48 { border-color: var(--kol-fg-absolute-48); }
637
+ .border-fg-absolute-64 { border-color: var(--kol-fg-absolute-64); }
638
+ .border-fg-absolute-72 { border-color: var(--kol-fg-absolute-72); }
639
+ .border-fg-absolute-80 { border-color: var(--kol-fg-absolute-80); }
640
+ .border-fg-absolute-88 { border-color: var(--kol-fg-absolute-88); }
641
+ .border-fg-absolute-96 { border-color: var(--kol-fg-absolute-96); }
642
+ .bg-fg-absolute-inverse-01 { background-color: var(--kol-fg-absolute-inverse-01); }
643
+ .bg-fg-absolute-inverse-02 { background-color: var(--kol-fg-absolute-inverse-02); }
644
+ .bg-fg-absolute-inverse-04 { background-color: var(--kol-fg-absolute-inverse-04); }
645
+ .bg-fg-absolute-inverse-08 { background-color: var(--kol-fg-absolute-inverse-08); }
646
+ .bg-fg-absolute-inverse-12 { background-color: var(--kol-fg-absolute-inverse-12); }
647
+ .bg-fg-absolute-inverse-16 { background-color: var(--kol-fg-absolute-inverse-16); }
648
+ .bg-fg-absolute-inverse-24 { background-color: var(--kol-fg-absolute-inverse-24); }
649
+ .bg-fg-absolute-inverse-32 { background-color: var(--kol-fg-absolute-inverse-32); }
650
+ .bg-fg-absolute-inverse-40 { background-color: var(--kol-fg-absolute-inverse-40); }
651
+ .bg-fg-absolute-inverse-48 { background-color: var(--kol-fg-absolute-inverse-48); }
652
+ .bg-fg-absolute-inverse-64 { background-color: var(--kol-fg-absolute-inverse-64); }
653
+ .bg-fg-absolute-inverse-72 { background-color: var(--kol-fg-absolute-inverse-72); }
654
+ .bg-fg-absolute-inverse-80 { background-color: var(--kol-fg-absolute-inverse-80); }
655
+ .bg-fg-absolute-inverse-88 { background-color: var(--kol-fg-absolute-inverse-88); }
656
+ .bg-fg-absolute-inverse-96 { background-color: var(--kol-fg-absolute-inverse-96); }
657
+ .text-fg-absolute-inverse-01 { color: var(--kol-fg-absolute-inverse-01); }
658
+ .text-fg-absolute-inverse-02 { color: var(--kol-fg-absolute-inverse-02); }
659
+ .text-fg-absolute-inverse-04 { color: var(--kol-fg-absolute-inverse-04); }
660
+ .text-fg-absolute-inverse-08 { color: var(--kol-fg-absolute-inverse-08); }
661
+ .text-fg-absolute-inverse-12 { color: var(--kol-fg-absolute-inverse-12); }
662
+ .text-fg-absolute-inverse-16 { color: var(--kol-fg-absolute-inverse-16); }
663
+ .text-fg-absolute-inverse-24 { color: var(--kol-fg-absolute-inverse-24); }
664
+ .text-fg-absolute-inverse-32 { color: var(--kol-fg-absolute-inverse-32); }
665
+ .text-fg-absolute-inverse-40 { color: var(--kol-fg-absolute-inverse-40); }
666
+ .text-fg-absolute-inverse-48 { color: var(--kol-fg-absolute-inverse-48); }
667
+ .text-fg-absolute-inverse-64 { color: var(--kol-fg-absolute-inverse-64); }
668
+ .text-fg-absolute-inverse-72 { color: var(--kol-fg-absolute-inverse-72); }
669
+ .text-fg-absolute-inverse-80 { color: var(--kol-fg-absolute-inverse-80); }
670
+ .text-fg-absolute-inverse-88 { color: var(--kol-fg-absolute-inverse-88); }
671
+ .text-fg-absolute-inverse-96 { color: var(--kol-fg-absolute-inverse-96); }
672
+ .border-fg-absolute-inverse-01 { border-color: var(--kol-fg-absolute-inverse-01); }
673
+ .border-fg-absolute-inverse-02 { border-color: var(--kol-fg-absolute-inverse-02); }
674
+ .border-fg-absolute-inverse-04 { border-color: var(--kol-fg-absolute-inverse-04); }
675
+ .border-fg-absolute-inverse-08 { border-color: var(--kol-fg-absolute-inverse-08); }
676
+ .border-fg-absolute-inverse-12 { border-color: var(--kol-fg-absolute-inverse-12); }
677
+ .border-fg-absolute-inverse-16 { border-color: var(--kol-fg-absolute-inverse-16); }
678
+ .border-fg-absolute-inverse-24 { border-color: var(--kol-fg-absolute-inverse-24); }
679
+ .border-fg-absolute-inverse-32 { border-color: var(--kol-fg-absolute-inverse-32); }
680
+ .border-fg-absolute-inverse-40 { border-color: var(--kol-fg-absolute-inverse-40); }
681
+ .border-fg-absolute-inverse-48 { border-color: var(--kol-fg-absolute-inverse-48); }
682
+ .border-fg-absolute-inverse-64 { border-color: var(--kol-fg-absolute-inverse-64); }
683
+ .border-fg-absolute-inverse-72 { border-color: var(--kol-fg-absolute-inverse-72); }
684
+ .border-fg-absolute-inverse-80 { border-color: var(--kol-fg-absolute-inverse-80); }
685
+ .border-fg-absolute-inverse-88 { border-color: var(--kol-fg-absolute-inverse-88); }
686
+ .border-fg-absolute-inverse-96 { border-color: var(--kol-fg-absolute-inverse-96); }
687
+ .bg-fg-ab-inverse-01 { background-color: var(--kol-fg-ab-inverse-01); }
688
+ .bg-fg-ab-inverse-02 { background-color: var(--kol-fg-ab-inverse-02); }
689
+ .bg-fg-ab-inverse-04 { background-color: var(--kol-fg-ab-inverse-04); }
690
+ .bg-fg-ab-inverse-08 { background-color: var(--kol-fg-ab-inverse-08); }
691
+ .bg-fg-ab-inverse-12 { background-color: var(--kol-fg-ab-inverse-12); }
692
+ .bg-fg-ab-inverse-16 { background-color: var(--kol-fg-ab-inverse-16); }
693
+ .bg-fg-ab-inverse-24 { background-color: var(--kol-fg-ab-inverse-24); }
694
+ .bg-fg-ab-inverse-32 { background-color: var(--kol-fg-ab-inverse-32); }
695
+ .bg-fg-ab-inverse-40 { background-color: var(--kol-fg-ab-inverse-40); }
696
+ .bg-fg-ab-inverse-48 { background-color: var(--kol-fg-ab-inverse-48); }
697
+ .bg-fg-ab-inverse-64 { background-color: var(--kol-fg-ab-inverse-64); }
698
+ .bg-fg-ab-inverse-72 { background-color: var(--kol-fg-ab-inverse-72); }
699
+ .bg-fg-ab-inverse-80 { background-color: var(--kol-fg-ab-inverse-80); }
700
+ .bg-fg-ab-inverse-88 { background-color: var(--kol-fg-ab-inverse-88); }
701
+ .bg-fg-ab-inverse-96 { background-color: var(--kol-fg-ab-inverse-96); }
702
+ .text-fg-ab-inverse-01 { color: var(--kol-fg-ab-inverse-01); }
703
+ .text-fg-ab-inverse-02 { color: var(--kol-fg-ab-inverse-02); }
704
+ .text-fg-ab-inverse-04 { color: var(--kol-fg-ab-inverse-04); }
705
+ .text-fg-ab-inverse-08 { color: var(--kol-fg-ab-inverse-08); }
706
+ .text-fg-ab-inverse-12 { color: var(--kol-fg-ab-inverse-12); }
707
+ .text-fg-ab-inverse-16 { color: var(--kol-fg-ab-inverse-16); }
708
+ .text-fg-ab-inverse-24 { color: var(--kol-fg-ab-inverse-24); }
709
+ .text-fg-ab-inverse-32 { color: var(--kol-fg-ab-inverse-32); }
710
+ .text-fg-ab-inverse-40 { color: var(--kol-fg-ab-inverse-40); }
711
+ .text-fg-ab-inverse-48 { color: var(--kol-fg-ab-inverse-48); }
712
+ .text-fg-ab-inverse-64 { color: var(--kol-fg-ab-inverse-64); }
713
+ .text-fg-ab-inverse-72 { color: var(--kol-fg-ab-inverse-72); }
714
+ .text-fg-ab-inverse-80 { color: var(--kol-fg-ab-inverse-80); }
715
+ .text-fg-ab-inverse-88 { color: var(--kol-fg-ab-inverse-88); }
716
+ .text-fg-ab-inverse-96 { color: var(--kol-fg-ab-inverse-96); }
717
+ .border-fg-ab-inverse-01 { border-color: var(--kol-fg-ab-inverse-01); }
718
+ .border-fg-ab-inverse-02 { border-color: var(--kol-fg-ab-inverse-02); }
719
+ .border-fg-ab-inverse-04 { border-color: var(--kol-fg-ab-inverse-04); }
720
+ .border-fg-ab-inverse-08 { border-color: var(--kol-fg-ab-inverse-08); }
721
+ .border-fg-ab-inverse-12 { border-color: var(--kol-fg-ab-inverse-12); }
722
+ .border-fg-ab-inverse-16 { border-color: var(--kol-fg-ab-inverse-16); }
723
+ .border-fg-ab-inverse-24 { border-color: var(--kol-fg-ab-inverse-24); }
724
+ .border-fg-ab-inverse-32 { border-color: var(--kol-fg-ab-inverse-32); }
725
+ .border-fg-ab-inverse-40 { border-color: var(--kol-fg-ab-inverse-40); }
726
+ .border-fg-ab-inverse-48 { border-color: var(--kol-fg-ab-inverse-48); }
727
+ .border-fg-ab-inverse-64 { border-color: var(--kol-fg-ab-inverse-64); }
728
+ .border-fg-ab-inverse-72 { border-color: var(--kol-fg-ab-inverse-72); }
729
+ .border-fg-ab-inverse-80 { border-color: var(--kol-fg-ab-inverse-80); }
730
+ .border-fg-ab-inverse-88 { border-color: var(--kol-fg-ab-inverse-88); }
731
+ .border-fg-ab-inverse-96 { border-color: var(--kol-fg-ab-inverse-96); }
package/kol-opaque.css CHANGED
@@ -219,22 +219,66 @@
219
219
  .border-oq-inverse-96 { border-color: var(--kol-oq-inverse-96); }
220
220
 
221
221
  /* ============================================================================
222
- * TOKENS — ABSOLUTE tiers (user ruling 2026-08-28: "you can make bg-oq-ab-*
223
- * and bg-oq-ab-inverse-*")
222
+ * TOKENS — the `ab` tiers: PURE poles, and they FLIP (user ruling 2026-08-30)
224
223
  *
225
- * The gap they close: the estate had opaque greys that FOLLOW the theme
226
- * (`oq-*`, `oq-inverse-*` — baked onto a surface token) and absolute inks that
227
- * are theme-invariant but TRANSLUCENT (`fg-ab-*`). "Opaque and theme-invariant"
228
- * was not expressible, which is exactly what a sunken control wants: a plate
229
- * that is darker than its plane, on both themes, that nothing bleeds through.
224
+ * `ab` mixes the absolute ends of the range — #000000 / #ffffff — and which end
225
+ * it starts from follows the THEME'S OWN SIDE, not the ink's:
230
226
  *
231
- * Same construction as the tiers above, with the absolutes standing in for the
232
- * surface pair — so these are flat greys that never move:
233
- * oq-ab-NN black NN% into WHITE — a light ground darkening
234
- * oq-ab-inverse-NN white NN% into BLACK — a dark ground lightening
227
+ * light theme ab-NN = white NN% into black → ab-96 is 245, under a 250 page
228
+ * dark theme ab-NN = black NN% into white → ab-96 is 10, under an 18 page
229
+ *
230
+ * So `oq-ab-96` IS the well, in both themes, with no per-theme alias. That is
231
+ * the whole reason this family exists: a percentage of the page mixed into the
232
+ * page cannot darken it, so a well needs a pole outside the theme's range.
233
+ *
234
+ * NOTE THE DIRECTION. `fg-*` / `oq-*` flip toward the INK (light ink on dark).
235
+ * `ab-*` flips toward the GROUND. `ab-inverse-*` is the opposite pole in each
236
+ * theme, so it is the one that contrasts.
237
+ *
238
+ * These were frozen from 2026-08-28 until now — both ladders read the same
239
+ * number in either theme, which is why `sunken` could not be expressed with
240
+ * them and got patched with `oq-inverse-96` instead. `absolute-*` stays frozen;
241
+ * that is its job, and it is a different family.
235
242
  * ============================================================================ */
236
243
 
237
- :root {
244
+ /* LIGHT — the ground is white, so `ab` starts from white */
245
+ :root,
246
+ :is([data-theme="light"], .light) {
247
+ --kol-oq-ab-01: color-mix(in srgb, var(--kol-color-ab-white) 1%, var(--kol-color-ab-black));
248
+ --kol-oq-ab-02: color-mix(in srgb, var(--kol-color-ab-white) 2%, var(--kol-color-ab-black));
249
+ --kol-oq-ab-04: color-mix(in srgb, var(--kol-color-ab-white) 4%, var(--kol-color-ab-black));
250
+ --kol-oq-ab-08: color-mix(in srgb, var(--kol-color-ab-white) 8%, var(--kol-color-ab-black));
251
+ --kol-oq-ab-12: color-mix(in srgb, var(--kol-color-ab-white) 12%, var(--kol-color-ab-black));
252
+ --kol-oq-ab-16: color-mix(in srgb, var(--kol-color-ab-white) 16%, var(--kol-color-ab-black));
253
+ --kol-oq-ab-24: color-mix(in srgb, var(--kol-color-ab-white) 24%, var(--kol-color-ab-black));
254
+ --kol-oq-ab-32: color-mix(in srgb, var(--kol-color-ab-white) 32%, var(--kol-color-ab-black));
255
+ --kol-oq-ab-40: color-mix(in srgb, var(--kol-color-ab-white) 40%, var(--kol-color-ab-black));
256
+ --kol-oq-ab-48: color-mix(in srgb, var(--kol-color-ab-white) 48%, var(--kol-color-ab-black));
257
+ --kol-oq-ab-64: color-mix(in srgb, var(--kol-color-ab-white) 64%, var(--kol-color-ab-black));
258
+ --kol-oq-ab-72: color-mix(in srgb, var(--kol-color-ab-white) 72%, var(--kol-color-ab-black));
259
+ --kol-oq-ab-80: color-mix(in srgb, var(--kol-color-ab-white) 80%, var(--kol-color-ab-black));
260
+ --kol-oq-ab-88: color-mix(in srgb, var(--kol-color-ab-white) 88%, var(--kol-color-ab-black));
261
+ --kol-oq-ab-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, var(--kol-color-ab-black));
262
+
263
+ --kol-oq-ab-inverse-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, var(--kol-color-ab-white));
264
+ --kol-oq-ab-inverse-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, var(--kol-color-ab-white));
265
+ --kol-oq-ab-inverse-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, var(--kol-color-ab-white));
266
+ --kol-oq-ab-inverse-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, var(--kol-color-ab-white));
267
+ --kol-oq-ab-inverse-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, var(--kol-color-ab-white));
268
+ --kol-oq-ab-inverse-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, var(--kol-color-ab-white));
269
+ --kol-oq-ab-inverse-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, var(--kol-color-ab-white));
270
+ --kol-oq-ab-inverse-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, var(--kol-color-ab-white));
271
+ --kol-oq-ab-inverse-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, var(--kol-color-ab-white));
272
+ --kol-oq-ab-inverse-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, var(--kol-color-ab-white));
273
+ --kol-oq-ab-inverse-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, var(--kol-color-ab-white));
274
+ --kol-oq-ab-inverse-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, var(--kol-color-ab-white));
275
+ --kol-oq-ab-inverse-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, var(--kol-color-ab-white));
276
+ --kol-oq-ab-inverse-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, var(--kol-color-ab-white));
277
+ --kol-oq-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, var(--kol-color-ab-white));
278
+ }
279
+
280
+ /* DARK — the ground is black, so `ab` starts from black */
281
+ :is([data-theme="dark"], .dark) {
238
282
  --kol-oq-ab-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, var(--kol-color-ab-white));
239
283
  --kol-oq-ab-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, var(--kol-color-ab-white));
240
284
  --kol-oq-ab-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, var(--kol-color-ab-white));
@@ -268,6 +312,42 @@
268
312
  --kol-oq-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, var(--kol-color-ab-black));
269
313
  }
270
314
 
315
+ /* system-follow: the block a user who never touched the toggle gets */
316
+ @media (prefers-color-scheme: dark) {
317
+ :root:not([data-theme="light"]):not(.light) {
318
+ --kol-oq-ab-01: color-mix(in srgb, var(--kol-color-ab-black) 1%, var(--kol-color-ab-white));
319
+ --kol-oq-ab-02: color-mix(in srgb, var(--kol-color-ab-black) 2%, var(--kol-color-ab-white));
320
+ --kol-oq-ab-04: color-mix(in srgb, var(--kol-color-ab-black) 4%, var(--kol-color-ab-white));
321
+ --kol-oq-ab-08: color-mix(in srgb, var(--kol-color-ab-black) 8%, var(--kol-color-ab-white));
322
+ --kol-oq-ab-12: color-mix(in srgb, var(--kol-color-ab-black) 12%, var(--kol-color-ab-white));
323
+ --kol-oq-ab-16: color-mix(in srgb, var(--kol-color-ab-black) 16%, var(--kol-color-ab-white));
324
+ --kol-oq-ab-24: color-mix(in srgb, var(--kol-color-ab-black) 24%, var(--kol-color-ab-white));
325
+ --kol-oq-ab-32: color-mix(in srgb, var(--kol-color-ab-black) 32%, var(--kol-color-ab-white));
326
+ --kol-oq-ab-40: color-mix(in srgb, var(--kol-color-ab-black) 40%, var(--kol-color-ab-white));
327
+ --kol-oq-ab-48: color-mix(in srgb, var(--kol-color-ab-black) 48%, var(--kol-color-ab-white));
328
+ --kol-oq-ab-64: color-mix(in srgb, var(--kol-color-ab-black) 64%, var(--kol-color-ab-white));
329
+ --kol-oq-ab-72: color-mix(in srgb, var(--kol-color-ab-black) 72%, var(--kol-color-ab-white));
330
+ --kol-oq-ab-80: color-mix(in srgb, var(--kol-color-ab-black) 80%, var(--kol-color-ab-white));
331
+ --kol-oq-ab-88: color-mix(in srgb, var(--kol-color-ab-black) 88%, var(--kol-color-ab-white));
332
+ --kol-oq-ab-96: color-mix(in srgb, var(--kol-color-ab-black) 96%, var(--kol-color-ab-white));
333
+
334
+ --kol-oq-ab-inverse-01: color-mix(in srgb, var(--kol-color-ab-white) 1%, var(--kol-color-ab-black));
335
+ --kol-oq-ab-inverse-02: color-mix(in srgb, var(--kol-color-ab-white) 2%, var(--kol-color-ab-black));
336
+ --kol-oq-ab-inverse-04: color-mix(in srgb, var(--kol-color-ab-white) 4%, var(--kol-color-ab-black));
337
+ --kol-oq-ab-inverse-08: color-mix(in srgb, var(--kol-color-ab-white) 8%, var(--kol-color-ab-black));
338
+ --kol-oq-ab-inverse-12: color-mix(in srgb, var(--kol-color-ab-white) 12%, var(--kol-color-ab-black));
339
+ --kol-oq-ab-inverse-16: color-mix(in srgb, var(--kol-color-ab-white) 16%, var(--kol-color-ab-black));
340
+ --kol-oq-ab-inverse-24: color-mix(in srgb, var(--kol-color-ab-white) 24%, var(--kol-color-ab-black));
341
+ --kol-oq-ab-inverse-32: color-mix(in srgb, var(--kol-color-ab-white) 32%, var(--kol-color-ab-black));
342
+ --kol-oq-ab-inverse-40: color-mix(in srgb, var(--kol-color-ab-white) 40%, var(--kol-color-ab-black));
343
+ --kol-oq-ab-inverse-48: color-mix(in srgb, var(--kol-color-ab-white) 48%, var(--kol-color-ab-black));
344
+ --kol-oq-ab-inverse-64: color-mix(in srgb, var(--kol-color-ab-white) 64%, var(--kol-color-ab-black));
345
+ --kol-oq-ab-inverse-72: color-mix(in srgb, var(--kol-color-ab-white) 72%, var(--kol-color-ab-black));
346
+ --kol-oq-ab-inverse-80: color-mix(in srgb, var(--kol-color-ab-white) 80%, var(--kol-color-ab-black));
347
+ --kol-oq-ab-inverse-88: color-mix(in srgb, var(--kol-color-ab-white) 88%, var(--kol-color-ab-black));
348
+ --kol-oq-ab-inverse-96: color-mix(in srgb, var(--kol-color-ab-white) 96%, var(--kol-color-ab-black));
349
+ }
350
+ }
271
351
  /* CLASSES — absolute tiers */
272
352
  .bg-oq-ab-01 { background-color: var(--kol-oq-ab-01); }
273
353
  .bg-oq-ab-02 { background-color: var(--kol-oq-ab-02); }
@@ -396,3 +476,144 @@
396
476
  .border-oq-ab-inverse-80 { border-color: var(--kol-oq-ab-inverse-80); }
397
477
  .border-oq-ab-inverse-88 { border-color: var(--kol-oq-ab-inverse-88); }
398
478
  .border-oq-ab-inverse-96 { border-color: var(--kol-oq-ab-inverse-96); }
479
+
480
+ /* ============================================================================
481
+ * TOKENS — `absolute` opaque tiers (user ruling 2026-08-30)
482
+ *
483
+ * The `oq` half of the same split. `oq-ab-*` mixes the PURE poles (#000/#fff);
484
+ * these mix the THEME'S OWN poles (#0e0e11 / #fcfbf8), frozen in both themes.
485
+ *
486
+ * oq-absolute-NN near-black NN% into near-white — a light ground darkening
487
+ * oq-absolute-inverse-NN near-white NN% into near-black — a dark ground lightening
488
+ *
489
+ * Why both families exist: `ab` can step PAST the theme's ink, which is what a
490
+ * well needs; `absolute` sits exactly on the theme's own two ends, which is
491
+ * what chrome that must match a surface without following the theme needs.
492
+ * Neither flips — the flipping pairs are `oq-*` / `oq-inverse-*`.
493
+ * ============================================================================ */
494
+
495
+ :root {
496
+ --kol-oq-absolute-01: color-mix(in srgb, var(--kol-color-black) 1%, var(--kol-color-white));
497
+ --kol-oq-absolute-02: color-mix(in srgb, var(--kol-color-black) 2%, var(--kol-color-white));
498
+ --kol-oq-absolute-04: color-mix(in srgb, var(--kol-color-black) 4%, var(--kol-color-white));
499
+ --kol-oq-absolute-08: color-mix(in srgb, var(--kol-color-black) 8%, var(--kol-color-white));
500
+ --kol-oq-absolute-12: color-mix(in srgb, var(--kol-color-black) 12%, var(--kol-color-white));
501
+ --kol-oq-absolute-16: color-mix(in srgb, var(--kol-color-black) 16%, var(--kol-color-white));
502
+ --kol-oq-absolute-24: color-mix(in srgb, var(--kol-color-black) 24%, var(--kol-color-white));
503
+ --kol-oq-absolute-32: color-mix(in srgb, var(--kol-color-black) 32%, var(--kol-color-white));
504
+ --kol-oq-absolute-40: color-mix(in srgb, var(--kol-color-black) 40%, var(--kol-color-white));
505
+ --kol-oq-absolute-48: color-mix(in srgb, var(--kol-color-black) 48%, var(--kol-color-white));
506
+ --kol-oq-absolute-64: color-mix(in srgb, var(--kol-color-black) 64%, var(--kol-color-white));
507
+ --kol-oq-absolute-72: color-mix(in srgb, var(--kol-color-black) 72%, var(--kol-color-white));
508
+ --kol-oq-absolute-80: color-mix(in srgb, var(--kol-color-black) 80%, var(--kol-color-white));
509
+ --kol-oq-absolute-88: color-mix(in srgb, var(--kol-color-black) 88%, var(--kol-color-white));
510
+ --kol-oq-absolute-96: color-mix(in srgb, var(--kol-color-black) 96%, var(--kol-color-white));
511
+
512
+ --kol-oq-absolute-inverse-01: color-mix(in srgb, var(--kol-color-white) 1%, var(--kol-color-black));
513
+ --kol-oq-absolute-inverse-02: color-mix(in srgb, var(--kol-color-white) 2%, var(--kol-color-black));
514
+ --kol-oq-absolute-inverse-04: color-mix(in srgb, var(--kol-color-white) 4%, var(--kol-color-black));
515
+ --kol-oq-absolute-inverse-08: color-mix(in srgb, var(--kol-color-white) 8%, var(--kol-color-black));
516
+ --kol-oq-absolute-inverse-12: color-mix(in srgb, var(--kol-color-white) 12%, var(--kol-color-black));
517
+ --kol-oq-absolute-inverse-16: color-mix(in srgb, var(--kol-color-white) 16%, var(--kol-color-black));
518
+ --kol-oq-absolute-inverse-24: color-mix(in srgb, var(--kol-color-white) 24%, var(--kol-color-black));
519
+ --kol-oq-absolute-inverse-32: color-mix(in srgb, var(--kol-color-white) 32%, var(--kol-color-black));
520
+ --kol-oq-absolute-inverse-40: color-mix(in srgb, var(--kol-color-white) 40%, var(--kol-color-black));
521
+ --kol-oq-absolute-inverse-48: color-mix(in srgb, var(--kol-color-white) 48%, var(--kol-color-black));
522
+ --kol-oq-absolute-inverse-64: color-mix(in srgb, var(--kol-color-white) 64%, var(--kol-color-black));
523
+ --kol-oq-absolute-inverse-72: color-mix(in srgb, var(--kol-color-white) 72%, var(--kol-color-black));
524
+ --kol-oq-absolute-inverse-80: color-mix(in srgb, var(--kol-color-white) 80%, var(--kol-color-black));
525
+ --kol-oq-absolute-inverse-88: color-mix(in srgb, var(--kol-color-white) 88%, var(--kol-color-black));
526
+ --kol-oq-absolute-inverse-96: color-mix(in srgb, var(--kol-color-white) 96%, var(--kol-color-black));
527
+ }
528
+
529
+ /* CLASSES — absolute opaque tiers */
530
+ .bg-oq-absolute-01 { background-color: var(--kol-oq-absolute-01); }
531
+ .bg-oq-absolute-02 { background-color: var(--kol-oq-absolute-02); }
532
+ .bg-oq-absolute-04 { background-color: var(--kol-oq-absolute-04); }
533
+ .bg-oq-absolute-08 { background-color: var(--kol-oq-absolute-08); }
534
+ .bg-oq-absolute-12 { background-color: var(--kol-oq-absolute-12); }
535
+ .bg-oq-absolute-16 { background-color: var(--kol-oq-absolute-16); }
536
+ .bg-oq-absolute-24 { background-color: var(--kol-oq-absolute-24); }
537
+ .bg-oq-absolute-32 { background-color: var(--kol-oq-absolute-32); }
538
+ .bg-oq-absolute-40 { background-color: var(--kol-oq-absolute-40); }
539
+ .bg-oq-absolute-48 { background-color: var(--kol-oq-absolute-48); }
540
+ .bg-oq-absolute-64 { background-color: var(--kol-oq-absolute-64); }
541
+ .bg-oq-absolute-72 { background-color: var(--kol-oq-absolute-72); }
542
+ .bg-oq-absolute-80 { background-color: var(--kol-oq-absolute-80); }
543
+ .bg-oq-absolute-88 { background-color: var(--kol-oq-absolute-88); }
544
+ .bg-oq-absolute-96 { background-color: var(--kol-oq-absolute-96); }
545
+ .text-oq-absolute-01 { color: var(--kol-oq-absolute-01); }
546
+ .text-oq-absolute-02 { color: var(--kol-oq-absolute-02); }
547
+ .text-oq-absolute-04 { color: var(--kol-oq-absolute-04); }
548
+ .text-oq-absolute-08 { color: var(--kol-oq-absolute-08); }
549
+ .text-oq-absolute-12 { color: var(--kol-oq-absolute-12); }
550
+ .text-oq-absolute-16 { color: var(--kol-oq-absolute-16); }
551
+ .text-oq-absolute-24 { color: var(--kol-oq-absolute-24); }
552
+ .text-oq-absolute-32 { color: var(--kol-oq-absolute-32); }
553
+ .text-oq-absolute-40 { color: var(--kol-oq-absolute-40); }
554
+ .text-oq-absolute-48 { color: var(--kol-oq-absolute-48); }
555
+ .text-oq-absolute-64 { color: var(--kol-oq-absolute-64); }
556
+ .text-oq-absolute-72 { color: var(--kol-oq-absolute-72); }
557
+ .text-oq-absolute-80 { color: var(--kol-oq-absolute-80); }
558
+ .text-oq-absolute-88 { color: var(--kol-oq-absolute-88); }
559
+ .text-oq-absolute-96 { color: var(--kol-oq-absolute-96); }
560
+ .border-oq-absolute-01 { border-color: var(--kol-oq-absolute-01); }
561
+ .border-oq-absolute-02 { border-color: var(--kol-oq-absolute-02); }
562
+ .border-oq-absolute-04 { border-color: var(--kol-oq-absolute-04); }
563
+ .border-oq-absolute-08 { border-color: var(--kol-oq-absolute-08); }
564
+ .border-oq-absolute-12 { border-color: var(--kol-oq-absolute-12); }
565
+ .border-oq-absolute-16 { border-color: var(--kol-oq-absolute-16); }
566
+ .border-oq-absolute-24 { border-color: var(--kol-oq-absolute-24); }
567
+ .border-oq-absolute-32 { border-color: var(--kol-oq-absolute-32); }
568
+ .border-oq-absolute-40 { border-color: var(--kol-oq-absolute-40); }
569
+ .border-oq-absolute-48 { border-color: var(--kol-oq-absolute-48); }
570
+ .border-oq-absolute-64 { border-color: var(--kol-oq-absolute-64); }
571
+ .border-oq-absolute-72 { border-color: var(--kol-oq-absolute-72); }
572
+ .border-oq-absolute-80 { border-color: var(--kol-oq-absolute-80); }
573
+ .border-oq-absolute-88 { border-color: var(--kol-oq-absolute-88); }
574
+ .border-oq-absolute-96 { border-color: var(--kol-oq-absolute-96); }
575
+ .bg-oq-absolute-inverse-01 { background-color: var(--kol-oq-absolute-inverse-01); }
576
+ .bg-oq-absolute-inverse-02 { background-color: var(--kol-oq-absolute-inverse-02); }
577
+ .bg-oq-absolute-inverse-04 { background-color: var(--kol-oq-absolute-inverse-04); }
578
+ .bg-oq-absolute-inverse-08 { background-color: var(--kol-oq-absolute-inverse-08); }
579
+ .bg-oq-absolute-inverse-12 { background-color: var(--kol-oq-absolute-inverse-12); }
580
+ .bg-oq-absolute-inverse-16 { background-color: var(--kol-oq-absolute-inverse-16); }
581
+ .bg-oq-absolute-inverse-24 { background-color: var(--kol-oq-absolute-inverse-24); }
582
+ .bg-oq-absolute-inverse-32 { background-color: var(--kol-oq-absolute-inverse-32); }
583
+ .bg-oq-absolute-inverse-40 { background-color: var(--kol-oq-absolute-inverse-40); }
584
+ .bg-oq-absolute-inverse-48 { background-color: var(--kol-oq-absolute-inverse-48); }
585
+ .bg-oq-absolute-inverse-64 { background-color: var(--kol-oq-absolute-inverse-64); }
586
+ .bg-oq-absolute-inverse-72 { background-color: var(--kol-oq-absolute-inverse-72); }
587
+ .bg-oq-absolute-inverse-80 { background-color: var(--kol-oq-absolute-inverse-80); }
588
+ .bg-oq-absolute-inverse-88 { background-color: var(--kol-oq-absolute-inverse-88); }
589
+ .bg-oq-absolute-inverse-96 { background-color: var(--kol-oq-absolute-inverse-96); }
590
+ .text-oq-absolute-inverse-01 { color: var(--kol-oq-absolute-inverse-01); }
591
+ .text-oq-absolute-inverse-02 { color: var(--kol-oq-absolute-inverse-02); }
592
+ .text-oq-absolute-inverse-04 { color: var(--kol-oq-absolute-inverse-04); }
593
+ .text-oq-absolute-inverse-08 { color: var(--kol-oq-absolute-inverse-08); }
594
+ .text-oq-absolute-inverse-12 { color: var(--kol-oq-absolute-inverse-12); }
595
+ .text-oq-absolute-inverse-16 { color: var(--kol-oq-absolute-inverse-16); }
596
+ .text-oq-absolute-inverse-24 { color: var(--kol-oq-absolute-inverse-24); }
597
+ .text-oq-absolute-inverse-32 { color: var(--kol-oq-absolute-inverse-32); }
598
+ .text-oq-absolute-inverse-40 { color: var(--kol-oq-absolute-inverse-40); }
599
+ .text-oq-absolute-inverse-48 { color: var(--kol-oq-absolute-inverse-48); }
600
+ .text-oq-absolute-inverse-64 { color: var(--kol-oq-absolute-inverse-64); }
601
+ .text-oq-absolute-inverse-72 { color: var(--kol-oq-absolute-inverse-72); }
602
+ .text-oq-absolute-inverse-80 { color: var(--kol-oq-absolute-inverse-80); }
603
+ .text-oq-absolute-inverse-88 { color: var(--kol-oq-absolute-inverse-88); }
604
+ .text-oq-absolute-inverse-96 { color: var(--kol-oq-absolute-inverse-96); }
605
+ .border-oq-absolute-inverse-01 { border-color: var(--kol-oq-absolute-inverse-01); }
606
+ .border-oq-absolute-inverse-02 { border-color: var(--kol-oq-absolute-inverse-02); }
607
+ .border-oq-absolute-inverse-04 { border-color: var(--kol-oq-absolute-inverse-04); }
608
+ .border-oq-absolute-inverse-08 { border-color: var(--kol-oq-absolute-inverse-08); }
609
+ .border-oq-absolute-inverse-12 { border-color: var(--kol-oq-absolute-inverse-12); }
610
+ .border-oq-absolute-inverse-16 { border-color: var(--kol-oq-absolute-inverse-16); }
611
+ .border-oq-absolute-inverse-24 { border-color: var(--kol-oq-absolute-inverse-24); }
612
+ .border-oq-absolute-inverse-32 { border-color: var(--kol-oq-absolute-inverse-32); }
613
+ .border-oq-absolute-inverse-40 { border-color: var(--kol-oq-absolute-inverse-40); }
614
+ .border-oq-absolute-inverse-48 { border-color: var(--kol-oq-absolute-inverse-48); }
615
+ .border-oq-absolute-inverse-64 { border-color: var(--kol-oq-absolute-inverse-64); }
616
+ .border-oq-absolute-inverse-72 { border-color: var(--kol-oq-absolute-inverse-72); }
617
+ .border-oq-absolute-inverse-80 { border-color: var(--kol-oq-absolute-inverse-80); }
618
+ .border-oq-absolute-inverse-88 { border-color: var(--kol-oq-absolute-inverse-88); }
619
+ .border-oq-absolute-inverse-96 { border-color: var(--kol-oq-absolute-inverse-96); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.102.0",
3
+ "version": "0.104.0",
4
4
  "description": "KOL (Kolkrabbi) design-system tokens + base CSS — brand-neutral. The canonical token/cascade layer every other KOL package and consumer builds on.",
5
5
  "license": "MIT",
6
6
  "type": "module",