@kolkrabbi/kol-theme 0.90.0 → 0.92.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.
- package/kol-components-atoms.css +21 -15
- package/kol-components-molecules.css +18 -40
- package/kol-design-tokens.css +13 -0
- package/package.json +1 -1
package/kol-components-atoms.css
CHANGED
|
@@ -243,7 +243,7 @@
|
|
|
243
243
|
border: 1px solid transparent;
|
|
244
244
|
}
|
|
245
245
|
@media (hover: hover) {
|
|
246
|
-
.kol-btn-primary:not(.kol-btn-animate):hover {
|
|
246
|
+
.kol-btn-primary:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
247
247
|
background-color: var(--kol-oq-08);
|
|
248
248
|
color: var(--kol-surface-on-primary);
|
|
249
249
|
}
|
|
@@ -256,7 +256,7 @@
|
|
|
256
256
|
font-weight: 500;
|
|
257
257
|
}
|
|
258
258
|
@media (hover: hover) {
|
|
259
|
-
.kol-btn-secondary:not(.kol-btn-animate):hover {
|
|
259
|
+
.kol-btn-secondary:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
260
260
|
background-color: var(--kol-oq-inverse-40);
|
|
261
261
|
color: var(--kol-surface-primary);
|
|
262
262
|
border-color: transparent;
|
|
@@ -270,7 +270,7 @@
|
|
|
270
270
|
font-weight: 500;
|
|
271
271
|
}
|
|
272
272
|
@media (hover: hover) {
|
|
273
|
-
.kol-btn-accent:not(.kol-btn-animate):hover {
|
|
273
|
+
.kol-btn-accent:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
274
274
|
background-color: var(--kol-accent-primary-strong);
|
|
275
275
|
color: var(--kol-accent-on-primary);
|
|
276
276
|
}
|
|
@@ -286,7 +286,7 @@
|
|
|
286
286
|
border: 1px solid var(--kol-oq-08);
|
|
287
287
|
}
|
|
288
288
|
@media (hover: hover) {
|
|
289
|
-
.kol-btn-outline:not(.kol-btn-animate):hover {
|
|
289
|
+
.kol-btn-outline:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
290
290
|
background-color: var(--kol-oq-02);
|
|
291
291
|
border-color: color-mix(in srgb, var(--kol-surface-on-primary) 25%, var(--kol-surface-primary));
|
|
292
292
|
color: var(--kol-surface-on-primary);
|
|
@@ -299,7 +299,7 @@
|
|
|
299
299
|
border: 1px solid transparent;
|
|
300
300
|
}
|
|
301
301
|
@media (hover: hover) {
|
|
302
|
-
.kol-btn-ghost:not(.kol-btn-animate):hover {
|
|
302
|
+
.kol-btn-ghost:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
303
303
|
background-color: var(--kol-oq-04);
|
|
304
304
|
color: var(--kol-surface-on-primary);
|
|
305
305
|
}
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
border: 1px solid transparent;
|
|
319
319
|
}
|
|
320
320
|
@media (hover: hover) {
|
|
321
|
-
.kol-btn-nav:not(.kol-btn-animate):hover {
|
|
321
|
+
.kol-btn-nav:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
322
322
|
background-color: var(--kol-oq-04);
|
|
323
323
|
color: var(--kol-surface-on-primary);
|
|
324
324
|
}
|
|
@@ -343,7 +343,7 @@
|
|
|
343
343
|
border: 1px solid transparent;
|
|
344
344
|
}
|
|
345
345
|
@media (hover: hover) {
|
|
346
|
-
.kol-btn-grey:not(.kol-btn-animate):hover {
|
|
346
|
+
.kol-btn-grey:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
347
347
|
background-color: var(--kol-oq-16);
|
|
348
348
|
color: var(--kol-surface-on-primary);
|
|
349
349
|
}
|
|
@@ -360,7 +360,7 @@
|
|
|
360
360
|
font-weight: 500;
|
|
361
361
|
}
|
|
362
362
|
@media (hover: hover) {
|
|
363
|
-
.kol-btn-danger:not(.kol-btn-animate):hover {
|
|
363
|
+
.kol-btn-danger:not(.kol-btn-animate):not(.kol-dd-trigger):hover {
|
|
364
364
|
background-color: color-mix(in srgb, var(--ui-error) 80%, var(--kol-surface-primary));
|
|
365
365
|
color: var(--kol-color-absolute-white);
|
|
366
366
|
}
|
|
@@ -372,13 +372,19 @@
|
|
|
372
372
|
|
|
373
373
|
/* Press feedback — one stop past hover (2026-07-08 button-states spec).
|
|
374
374
|
* Outside the hover guard: :active fires on touch too. */
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
.kol-btn-
|
|
375
|
+
/* NO HOVER, NO PRESS ON A DROPDOWN TRIGGER (user ruling 2026-08-28). Every
|
|
376
|
+
* variant excludes `.kol-dd-trigger` at the SOURCE. It used to be cancelled
|
|
377
|
+
* downstream — kol-components-molecules re-stated each variant's rest colours
|
|
378
|
+
* on :hover — and that restatement was specificity (0,4,0) against the sunken
|
|
379
|
+
* tone's (0,2,0), so hovering a SUNKEN trigger repainted it in the untoned
|
|
380
|
+
* fill: a light box beside two icon controls that stayed dark. */
|
|
381
|
+
.kol-btn-primary:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: var(--kol-oq-16); }
|
|
382
|
+
.kol-btn-secondary:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: var(--kol-oq-inverse-48); color: var(--kol-surface-primary); }
|
|
383
|
+
.kol-btn-accent:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: color-mix(in srgb, var(--kol-accent-primary) 70%, var(--kol-surface-primary)); }
|
|
384
|
+
.kol-btn-outline:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active,
|
|
385
|
+
.kol-btn-ghost:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: var(--kol-oq-08); }
|
|
386
|
+
.kol-btn-danger:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: color-mix(in srgb, var(--ui-error) 70%, var(--kol-surface-primary)); }
|
|
387
|
+
.kol-btn-grey:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):active { background-color: var(--kol-oq-24); }
|
|
382
388
|
|
|
383
389
|
.kol-btn:disabled,
|
|
384
390
|
.kol-btn[disabled] {
|
|
@@ -48,31 +48,15 @@
|
|
|
48
48
|
.kol-dd-trigger.kol-btn-sm { height: 28px; padding-block: 0; }
|
|
49
49
|
.kol-dd-trigger.kol-btn-md { height: 32px; padding-block: 0; }
|
|
50
50
|
.kol-dd-trigger.kol-btn-lg { height: 36px; padding-block: 0; }
|
|
51
|
-
/* REST AND OPEN ARE THE ONLY STATES (2026-07-15
|
|
52
|
-
* 2026-08-
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
|
|
58
|
-
.
|
|
59
|
-
|
|
60
|
-
color: var(--kol-surface-on-primary);
|
|
61
|
-
}
|
|
62
|
-
/* oq-08, NOT oq-16 (DropdownHeightAndHover, kol-fxr 2026-08-28). This is a
|
|
63
|
-
* pin-back to rest and it stopped being one: `.kol-btn-outline`'s rest border
|
|
64
|
-
* moved to `oq-08` on 2026-08-26 ("ONE outline border across the controls"),
|
|
65
|
-
* and this line kept the old `oq-16` — so the outline trigger quietly grew a
|
|
66
|
-
* hover the 2026-07-15 ruling forbids, and an untoned Dropdown lit while a
|
|
67
|
-
* sunken one beside it did not. A pin-back has to be re-read whenever the rest
|
|
68
|
-
* value it mirrors moves; that is the cost of expressing "no state" as a
|
|
69
|
-
* restatement rather than as an absence. */
|
|
70
|
-
.kol-dd-trigger.kol-btn-outline:not(:disabled):hover,
|
|
71
|
-
.kol-dd-trigger.kol-btn-outline:not(:disabled):active {
|
|
72
|
-
background: transparent;
|
|
73
|
-
color: var(--kol-surface-on-primary);
|
|
74
|
-
border-color: var(--kol-oq-08);
|
|
75
|
-
}
|
|
51
|
+
/* REST AND OPEN ARE THE ONLY STATES (2026-07-15, re-called 2026-08-09 and
|
|
52
|
+
* 2026-08-28). No :hover or :active rules for the trigger live here any more —
|
|
53
|
+
* kol-components-atoms.css excludes `.kol-dd-trigger` from every variant's
|
|
54
|
+
* hover and press instead. The pin-backs that stood here restated each
|
|
55
|
+
* variant's REST colours to cancel the button's, and that failed twice: one
|
|
56
|
+
* went stale when `.kol-btn-outline`'s rest border moved (2026-08-26), and a
|
|
57
|
+
* pin-back out-specifies the tone, so a sunken trigger hovered into the
|
|
58
|
+
* untoned fill. "No state" is an absence now, not a mirror. */
|
|
59
|
+
|
|
76
60
|
/* ONE PIECE MEANS ONE WIDTH (2026-08-09 user call — "they are connected").
|
|
77
61
|
* The trigger reserves the widest option's width by stacking every label in
|
|
78
62
|
* one grid cell (hidden ghosts), so the panel — pinned to the trigger by
|
|
@@ -1278,19 +1262,13 @@
|
|
|
1278
1262
|
* ink `fg-96`. `.kol-tone-inverse` stays selected for any class
|
|
1279
1263
|
* hand-stamped on the old name.
|
|
1280
1264
|
* ───────────────────────────────────────────────────────────────────── */
|
|
1281
|
-
.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse { background-color: var(--kol-
|
|
1265
|
+
.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse { background-color: var(--kol-tone-sunken-bg); }
|
|
1282
1266
|
.kol-view-toggle.kol-tone-sunken > button[aria-pressed="true"], .kol-view-toggle.kol-tone-inverse > button[aria-pressed="true"] { background-color: var(--kol-fg-08); }
|
|
1283
1267
|
.kol-view-toggle.kol-tone-sunken > button:not([aria-pressed="true"]):hover, .kol-view-toggle.kol-tone-inverse > button:not([aria-pressed="true"]):hover { background-color: color-mix(in srgb, var(--kol-color-absolute-white) 8%, transparent); }
|
|
1284
|
-
.kol-control.kol-tone-sunken, .kol-control.kol-tone-inverse { background-color: var(--kol-
|
|
1285
|
-
.kol-expand.kol-tone-sunken, .kol-expand.kol-tone-inverse { background-color: var(--kol-
|
|
1286
|
-
/*
|
|
1287
|
-
|
|
1288
|
-
* `.kol-dd-trigger:hover/:active` rules paint surface-secondary, so the tone
|
|
1289
|
-
* re-states its own fill on all three and nothing moves. Deleting them gives
|
|
1290
|
-
* the hover back. */
|
|
1291
|
-
.kol-dd-trigger.kol-tone-sunken, .kol-dd-trigger.kol-tone-inverse,
|
|
1292
|
-
.kol-dd-trigger.kol-tone-sunken:not(:disabled):hover, .kol-dd-trigger.kol-tone-inverse:not(:disabled):hover,
|
|
1293
|
-
.kol-dd-trigger.kol-tone-sunken:not(:disabled):active, .kol-dd-trigger.kol-tone-inverse:not(:disabled):active { background-color: var(--kol-fg-inverse-96); }
|
|
1268
|
+
.kol-control.kol-tone-sunken, .kol-control.kol-tone-inverse { background-color: var(--kol-tone-sunken-bg); }
|
|
1269
|
+
.kol-expand.kol-tone-sunken, .kol-expand.kol-tone-inverse { background-color: var(--kol-tone-sunken-bg); }
|
|
1270
|
+
/* the tone's fill, one selector — nothing left to cancel (2026-08-28) */
|
|
1271
|
+
.kol-dd-trigger.kol-tone-sunken, .kol-dd-trigger.kol-tone-inverse { background-color: var(--kol-tone-sunken-bg); }
|
|
1294
1272
|
/* THE PANEL IS OPAQUE (user 2026-08-28: "transparent doesn't work for
|
|
1295
1273
|
* dropdown") — it floats over page content, and every `fg-*` stop is an alpha
|
|
1296
1274
|
* wash that the content reads through. `oq-inverse-*`, the opaque tier, bakes
|
|
@@ -1298,7 +1276,7 @@
|
|
|
1298
1276
|
* lands ~23.5 against the #121215 page's 18: lighter than the page, the wrong
|
|
1299
1277
|
* side of it. `surface-tertiary` is the flat twin of what the trigger renders:
|
|
1300
1278
|
* #0e0e11 (14.0) in dark against the trigger's 14.2, #ffffff in light. */
|
|
1301
|
-
.kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-
|
|
1279
|
+
.kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-tone-sunken-bg); }
|
|
1302
1280
|
/* the rest of the set — Button (icon-only especially), IconFrame, ThemeToggle:
|
|
1303
1281
|
* the well, transparent edge, fg-96 ink; hover the white wash, pressed the
|
|
1304
1282
|
* fg-08 chip — both LAYERED over the well (a gradient image over the fill),
|
|
@@ -1306,20 +1284,20 @@
|
|
|
1306
1284
|
.kol-btn.kol-tone-sunken,
|
|
1307
1285
|
.kol-icon-frame.kol-tone-sunken,
|
|
1308
1286
|
.kol-theme-toggle.kol-tone-sunken {
|
|
1309
|
-
background-color: var(--kol-
|
|
1287
|
+
background-color: var(--kol-tone-sunken-bg);
|
|
1310
1288
|
border-color: transparent;
|
|
1311
1289
|
color: var(--kol-fg-96);
|
|
1312
1290
|
}
|
|
1313
1291
|
@media (hover: hover) {
|
|
1314
1292
|
.kol-btn.kol-tone-sunken:not(.kol-btn-animate):not(:disabled):hover {
|
|
1315
|
-
background-color: var(--kol-
|
|
1293
|
+
background-color: var(--kol-tone-sunken-bg);
|
|
1316
1294
|
background-image: linear-gradient(color-mix(in srgb, var(--kol-color-absolute-white) 8%, transparent), color-mix(in srgb, var(--kol-color-absolute-white) 8%, transparent));
|
|
1317
1295
|
color: var(--kol-fg-96);
|
|
1318
1296
|
}
|
|
1319
1297
|
}
|
|
1320
1298
|
.kol-btn.kol-tone-sunken.kol-btn-pressed,
|
|
1321
1299
|
.kol-btn.kol-tone-sunken:not(:disabled):active {
|
|
1322
|
-
background-color: var(--kol-
|
|
1300
|
+
background-color: var(--kol-tone-sunken-bg);
|
|
1323
1301
|
background-image: linear-gradient(var(--kol-fg-08), var(--kol-fg-08));
|
|
1324
1302
|
color: var(--kol-fg-96);
|
|
1325
1303
|
}
|
package/kol-design-tokens.css
CHANGED
|
@@ -74,6 +74,19 @@
|
|
|
74
74
|
* first fifth of the duration and the rest on a settle you cannot see — so
|
|
75
75
|
* every motion read as instant no matter what duration it was given, and a
|
|
76
76
|
* small hover affordance never showed its move at all. */
|
|
77
|
+
/* THE SUNKEN PLATE (ControlToneSunken, user ruling 2026-08-28) — the one fill
|
|
78
|
+
* every `tone="sunken"` control paints: ViewToggle's well, Input, SearchInput,
|
|
79
|
+
* the Dropdown trigger AND its panel, Button, IconFrame, ThemeToggle.
|
|
80
|
+
*
|
|
81
|
+
* OPAQUE and theme-invariant, and both halves are the ruling: "opaque so it
|
|
82
|
+
* doesn't bleed". A translucent well renders whatever is under it, which is
|
|
83
|
+
* how this went wrong twice in a day — `fg-absolute-24` and `fg-inverse-96`
|
|
84
|
+
* are washes, and the second one also follows the theme stamp, so an app
|
|
85
|
+
* painting a dark page without stamping `data-theme` got a near-white control
|
|
86
|
+
* row. Sunken means BELOW the plane; a plate that changes with the plane
|
|
87
|
+
* cannot say that. Ship one colour and let it be the same everywhere. */
|
|
88
|
+
--kol-tone-sunken-bg: color-mix(in srgb, var(--kol-color-absolute-white) 11%, var(--kol-color-absolute-black));
|
|
89
|
+
|
|
77
90
|
--kol-ease-house: cubic-bezier(0.4, 0, 0.2, 1);
|
|
78
91
|
/* the bounce — overshoots past its target and settles back (y > 1 is what
|
|
79
92
|
* makes it bounce; house only decelerates). For a press that should feel
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kolkrabbi/kol-theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.92.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",
|