@kolkrabbi/kol-theme 0.7.4 → 0.7.5

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.
@@ -49,6 +49,9 @@
49
49
 
50
50
  /* Dark Mode — surface overrides */
51
51
  :is([data-theme="dark"], .dark) {
52
+ --kol-link: #60A5FA;
53
+ --kol-link-hover: #93C5FD;
54
+
52
55
  --kol-surface-primary: #121215;
53
56
  --kol-surface-on-primary: #fafafa;
54
57
 
package/kol-color.css CHANGED
@@ -34,6 +34,16 @@
34
34
  --kol-accent-on-primary: var(--kol-surface-primary);
35
35
  --kol-accent-primary-strong: color-mix(in srgb, var(--kol-accent-primary) 80%, var(--kol-surface-primary));
36
36
 
37
+ /* ---------------------------------------------------------------------------
38
+ * HYPERLINKS — the one text role with its own color (2026-07-15, chess
39
+ * consumer audit finding 3: no link token, no a{} rule → links rendered as
40
+ * body ink). Theme-owned hex defaults in the --ui-info blue family; the
41
+ * brand layer overrides the tokens, consumers override per element.
42
+ * --------------------------------------------------------------------------- */
43
+
44
+ --kol-link: #2563EB;
45
+ --kol-link-hover: #1D4ED8;
46
+
37
47
  /* ---------------------------------------------------------------------------
38
48
  * UI STATE — error / warning / info / success.
39
49
  * Direct hex (not ramp-dependent). Intentionally not part of the brand layer
@@ -74,6 +84,9 @@
74
84
 
75
85
  @media (prefers-color-scheme: dark) {
76
86
  :root:not([data-theme="light"]) {
87
+ --kol-link: #60A5FA;
88
+ --kol-link-hover: #93C5FD;
89
+
77
90
  --kol-surface-primary: #121215;
78
91
  --kol-surface-on-primary: #FAFAFA;
79
92
 
@@ -88,6 +101,15 @@
88
101
  }
89
102
  }
90
103
 
104
+ /* =============================================================================
105
+ * BASE ANCHOR RULE — unstyled links get the link color. Sits in the
106
+ * components layer, so any utility class or later-loading chrome sheet
107
+ * (kol-framework, brand) still wins per the cascade contract (§5).
108
+ * ============================================================================= */
109
+
110
+ a { color: var(--kol-link); }
111
+ a:hover { color: var(--kol-link-hover); }
112
+
91
113
  /* =============================================================================
92
114
  * CONTEXT-AWARE SURFACE INVERSE
93
115
  * ============================================================================= */
@@ -140,6 +140,51 @@
140
140
  }
141
141
 
142
142
 
143
+ /* ═══════════════════════════════════════════════════════════════
144
+ * FullscreenOverlay — atoms/FullscreenOverlay.jsx
145
+ * The classes existed in JSX with NO rules anywhere (found 2026-07-15 via
146
+ * the chess archive overlay — close button floated in dead space).
147
+ * Anatomy: fixed dim backdrop → full-bleed sheet → absolute corner close.
148
+ * ═══════════════════════════════════════════════════════════════ */
149
+
150
+ .kol-overlay {
151
+ position: fixed;
152
+ inset: 0;
153
+ z-index: 100;
154
+ background: color-mix(in srgb, var(--kol-color-absolute-black) 55%, transparent);
155
+ display: grid;
156
+ place-items: center;
157
+ overflow-y: auto;
158
+ padding: 24px;
159
+ }
160
+
161
+ /* the sheet HUGS its content (the consumer's panel) — backdrop clicks land
162
+ * on .kol-overlay itself, so outside-dismiss works; the close button rides
163
+ * the panel's corner instead of floating at the viewport edge */
164
+ .kol-overlay-sheet {
165
+ position: relative;
166
+ max-width: 100%;
167
+ }
168
+
169
+ .kol-overlay-close {
170
+ position: absolute;
171
+ top: 12px;
172
+ right: 12px;
173
+ z-index: 10;
174
+ display: inline-flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ width: 32px;
178
+ height: 32px;
179
+ border-radius: var(--kol-radius-sm);
180
+ border: 1px solid var(--kol-oq-16);
181
+ background: var(--kol-surface-primary);
182
+ color: var(--kol-surface-on-primary);
183
+ font-size: 16px;
184
+ line-height: 1;
185
+ cursor: pointer;
186
+ }
187
+
143
188
  /* ═══════════════════════════════════════════════════════════════
144
189
  * Button — atoms/Button.jsx
145
190
  *
@@ -244,6 +289,38 @@
244
289
  }
245
290
  }
246
291
 
292
+ /* Grey (2026-07-15, user-ordered) — pill-subtle's visual weight as a real
293
+ * Button variant on the opaque tier: rest oq-12, hover/active one stop past
294
+ * each, same state math as the rest of the family. */
295
+ .kol-btn-grey {
296
+ background: var(--kol-oq-12);
297
+ color: var(--kol-surface-on-primary);
298
+ border: 1px solid transparent;
299
+ }
300
+ @media (hover: hover) {
301
+ .kol-btn-grey:not(.kol-btn-animate):hover {
302
+ background-color: var(--kol-oq-16);
303
+ color: var(--kol-surface-on-primary);
304
+ }
305
+ }
306
+
307
+ /* Destructive actions (2026-07-15, chess consumer audit finding 1: red was
308
+ * being hacked onto normal buttons via className). Accent's shape on the
309
+ * --ui-error state token — filled, opaque interaction stops, white label
310
+ * (error red carries it in both themes). */
311
+ .kol-btn-danger {
312
+ background: var(--ui-error);
313
+ color: var(--kol-color-absolute-white);
314
+ border: 1px solid transparent;
315
+ font-weight: 500;
316
+ }
317
+ @media (hover: hover) {
318
+ .kol-btn-danger:not(.kol-btn-animate):hover {
319
+ background-color: color-mix(in srgb, var(--ui-error) 80%, var(--kol-surface-primary));
320
+ color: var(--kol-color-absolute-white);
321
+ }
322
+ }
323
+
247
324
  .kol-btn-sm { padding: 4px 12px; }
248
325
  .kol-btn-md { padding: 6px 16px; }
249
326
  .kol-btn-lg { padding: 8px 20px; }
@@ -255,6 +332,8 @@
255
332
  .kol-btn-accent:not(.kol-btn-animate):not(:disabled):active { background-color: color-mix(in srgb, var(--kol-accent-primary) 70%, var(--kol-surface-primary)); }
256
333
  .kol-btn-outline:not(.kol-btn-animate):not(:disabled):active,
257
334
  .kol-btn-ghost:not(.kol-btn-animate):not(:disabled):active { background-color: var(--kol-oq-08); }
335
+ .kol-btn-danger:not(.kol-btn-animate):not(:disabled):active { background-color: color-mix(in srgb, var(--ui-error) 70%, var(--kol-surface-primary)); }
336
+ .kol-btn-grey:not(.kol-btn-animate):not(:disabled):active { background-color: var(--kol-oq-24); }
258
337
 
259
338
  .kol-btn:disabled,
260
339
  .kol-btn[disabled] {
@@ -41,14 +41,23 @@
41
41
  border-radius: 4px;
42
42
  }
43
43
 
44
+ /* fluid sizes by width AND height (2026-07-15 100dvh stage): the square is
45
+ * the largest that fits both the column width and the viewport minus the
46
+ * stage chrome. Mobile budget is bigger (strip + transport + notation min). */
44
47
  .chess-board--fluid {
45
- width: 100%;
48
+ width: min(100%, calc(100dvh - 200px));
46
49
  height: auto;
47
50
  aspect-ratio: 1;
48
51
  max-width: 760px;
49
52
  min-width: 280px;
50
53
  }
51
54
 
55
+ @media (max-width: 1023px) {
56
+ .chess-board--fluid {
57
+ width: min(100%, calc(100dvh - 380px));
58
+ }
59
+ }
60
+
52
61
 
53
62
  .chess-board__grid {
54
63
  display: grid;
@@ -535,6 +544,8 @@
535
544
  color: var(--kol-status-danger);
536
545
  }
537
546
 
547
+ /* no text-transform (casing law) — the JSX authors 'CHESS.COM' in-case;
548
+ * color rides the theme link tokens instead of accent (= ink) */
538
549
  .analysis-table__link {
539
550
  display: inline-flex;
540
551
  align-items: center;
@@ -542,11 +553,11 @@
542
553
  font-family: var(--kol-font-family-mono);
543
554
  font-size: 0.7rem;
544
555
  letter-spacing: 0.12em;
545
- text-transform: uppercase;
546
- color: var(--kol-accent-primary);
556
+ color: var(--kol-link);
547
557
  }
548
558
 
549
559
  .analysis-table__link:hover {
560
+ color: var(--kol-link-hover);
550
561
  text-decoration: underline;
551
562
  }
552
563
 
@@ -147,6 +147,21 @@
147
147
  justify-content: space-between;
148
148
  }
149
149
 
150
+ /* Dropdowns have NO hover and NO clicked state (2026-07-15 ruling) — the
151
+ * trigger borrows Button chrome for geometry/fill but its only states are
152
+ * rest and open. Scoped here so Button's own rules stay untouched. */
153
+ .kol-dd-trigger.kol-btn-primary:not(.kol-btn-animate):hover,
154
+ .kol-dd-trigger.kol-btn-primary:not(.kol-btn-animate):not(:disabled):active {
155
+ background: var(--kol-surface-secondary);
156
+ color: var(--kol-surface-on-primary);
157
+ }
158
+ .kol-dd-trigger.kol-btn-outline:not(.kol-btn-animate):hover,
159
+ .kol-dd-trigger.kol-btn-outline:not(.kol-btn-animate):not(:disabled):active {
160
+ background: transparent;
161
+ border-color: var(--kol-oq-16);
162
+ color: var(--kol-surface-on-primary);
163
+ }
164
+
150
165
  .kol-dd-trigger--open {
151
166
  border-radius: var(--kol-radius-sm) var(--kol-radius-sm) 0 0;
152
167
  }
@@ -165,6 +180,18 @@
165
180
  border-top: none;
166
181
  }
167
182
 
183
+ /* grey — the opaque grey chrome (oq-12, fill law:
184
+ * interactive surfaces never translucent). Dropdown-only chrome; rest = hover
185
+ * = active per the no-states dropdown ruling (no kol-btn-* class emitted, so
186
+ * no button state rules ever apply). */
187
+ .kol-dd-trigger--grey {
188
+ background-color: var(--kol-oq-12);
189
+ color: var(--kol-surface-on-primary);
190
+ border: 1px solid transparent;
191
+ }
192
+
193
+ .kol-dd-panel--grey { background-color: var(--kol-oq-12); }
194
+
168
195
  .kol-dd-div {
169
196
  height: 1px;
170
197
  background-color: var(--kol-border-default);
@@ -43,7 +43,10 @@
43
43
  .kol-table-wrapper {
44
44
  overflow-x: auto;
45
45
  scrollbar-width: none;
46
- border: 1px solid var(--kol-fg-08);
46
+ /* opaque border stop translucent fg-08 stacked with the collapsed table's
47
+ * own borders composited into darker seams over gradients (2026-07-15 chess
48
+ * audit finding 4); oq-* mirrors the same visual weight without alpha */
49
+ border: 1px solid var(--kol-oq-08);
47
50
  border-radius: 4px;
48
51
  /* Scroll affordance: with the scrollbar hidden, a clipped table reads as
49
52
  * cut-off data on narrow viewports. Edge shadows appear only on the
@@ -72,23 +75,24 @@
72
75
 
73
76
  .kol-table-thead {
74
77
  background: var(--kol-fg-04);
75
- border-bottom: 1px solid var(--kol-fg-08);
78
+ border-bottom: 1px solid var(--kol-oq-08);
76
79
  }
77
80
 
78
81
  .kol-table-row {
79
- border-bottom: 1px solid var(--kol-fg-08);
82
+ border-bottom: 1px solid var(--kol-oq-08);
80
83
  vertical-align: top;
81
84
  }
82
85
 
83
86
  .kol-table-row:last-child { border-bottom: none; }
84
87
 
88
+ /* no text-transform (casing law 2026-07-15): headers render as authored —
89
+ * consumers wanting caps author "DATE", not lowercase + CSS shouting */
85
90
  .kol-table-cell-title {
86
91
  padding: 12px 16px;
87
92
  font-family: var(--kol-font-family-mono);
88
93
  font-size: 0.75rem;
89
94
  font-weight: 400;
90
95
  line-height: 1.3;
91
- text-transform: uppercase;
92
96
  color: var(--kol-surface-on-primary);
93
97
  white-space: nowrap;
94
98
  }
@@ -205,13 +209,13 @@
205
209
  }
206
210
 
207
211
  .kol-table a {
208
- color: var(--kol-fg-88);
212
+ color: var(--kol-link);
209
213
  text-decoration: underline;
210
214
  text-decoration-thickness: 1px;
211
215
  text-underline-offset: 2px;
212
216
  }
213
217
 
214
- .kol-table a:hover { color: var(--kol-accent-primary); }
218
+ .kol-table a:hover { color: var(--kol-link-hover); }
215
219
 
216
220
  @media (max-width: 768px) {
217
221
  .kol-table-cell-title,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
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",