@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
- * ALIASESthe 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",