@kolkrabbi/kol-theme 0.106.0 → 0.108.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.
@@ -433,12 +433,15 @@
433
433
  }
434
434
 
435
435
  @media (hover: hover) {
436
- .kol-btn:hover .kol-icon-default {
436
+ /* the trigger is excluded here too — it IS a Button, so a consumer giving it
437
+ * a hover-icon would animate on hover, and the law is rest and open only
438
+ * (validate-dd-trigger.mjs T1) */
439
+ .kol-btn:not(.kol-dd-trigger):hover .kol-icon-default {
437
440
  opacity: 0;
438
441
  transform: translateY(-4px);
439
442
  }
440
443
 
441
- .kol-btn:hover .kol-icon-hover {
444
+ .kol-btn:not(.kol-dd-trigger):hover .kol-icon-hover {
442
445
  opacity: 1;
443
446
  transform: translateY(0);
444
447
  }
@@ -1324,7 +1324,22 @@
1324
1324
  * ink `fg-96`. `.kol-tone-inverse` stays selected for any class
1325
1325
  * hand-stamped on the old name.
1326
1326
  * ───────────────────────────────────────────────────────────────────── */
1327
- /* THE SUNKEN TONE IS `surface-tertiary`, NOT `oq-inverse-96` (measured on
1327
+ /* THE WELL TAKES THE PAGE'S WASH TOO (SunkenWellEatenByPageWash, kol-fxr
1328
+ * 2026-08-30). `--kol-surface-sunken` is derived from `surface-primary`, but
1329
+ * `AppShell`'s `pageWash` paints a film ON TOP of that page — and the control's
1330
+ * opaque fill does not receive it. At the ruled `fg-02` rung the light page
1331
+ * lands 250 × 0.98 + 18 × 0.02 = 245, which is EXACTLY the well: measured delta
1332
+ * [0,0,0], four controls rendering as bare text with no pill.
1333
+ *
1334
+ * Deepening the well would have worked by luck and broken on the next rung
1335
+ * change. Instead every sunken surface paints the same film the page does, so
1336
+ * the five levels hold by construction whatever `pageWash` is set to. The
1337
+ * property is unset outside an AppShell and falls back to `transparent`.
1338
+ *
1339
+ * State washes stack ON TOP of it — `linear-gradient(state), linear-gradient(wash)`
1340
+ * — because one background-color cannot carry two translucent layers.
1341
+ *
1342
+ * THE SUNKEN TONE IS `surface-tertiary`, NOT `oq-inverse-96` (measured on
1328
1343
  * kol-fxr's /settings, 2026-08-30). The whole set read `--kol-oq-inverse-96`,
1329
1344
  * which is `color-mix(#0e0e11 96%, #fcfbf8)` — four percent of near-WHITE mixed
1330
1345
  * in. On the dark theme that lands at luminance **23.7 against an 18.2 page**:
@@ -1341,13 +1356,13 @@
1341
1356
  * `surface-tertiary` is `#0e0e11` in dark (14.2, genuinely below the page) and
1342
1357
  * `#ffffff` in light, so it is theme-correct on both sides where a mix toward
1343
1358
  * a fixed near-white could only ever be right on one. */
1344
- .kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse { background-color: var(--kol-surface-sunken); }
1359
+ .kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse { background-color: var(--kol-surface-sunken); background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent)); }
1345
1360
  .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); }
1346
1361
  .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: var(--kol-fg-04); }
1347
- .kol-control.kol-tone-sunken, .kol-control.kol-tone-inverse { background-color: var(--kol-surface-sunken); }
1348
- .kol-expand.kol-tone-sunken, .kol-expand.kol-tone-inverse { background-color: var(--kol-surface-sunken); }
1362
+ .kol-control.kol-tone-sunken, .kol-control.kol-tone-inverse { background-color: var(--kol-surface-sunken); background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent)); }
1363
+ .kol-expand.kol-tone-sunken, .kol-expand.kol-tone-inverse { background-color: var(--kol-surface-sunken); background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent)); }
1349
1364
  /* the tone's fill, one selector — nothing left to cancel (2026-08-28) */
1350
- .kol-dd-trigger.kol-tone-sunken, .kol-dd-trigger.kol-tone-inverse { background-color: var(--kol-surface-sunken); }
1365
+ .kol-dd-trigger.kol-tone-sunken, .kol-dd-trigger.kol-tone-inverse { background-color: var(--kol-surface-sunken); background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent)); }
1351
1366
  /* THE PANEL IS OPAQUE (user 2026-08-28: "transparent doesn't work for
1352
1367
  * dropdown") — it floats over page content, and every `fg-*` stop is an alpha
1353
1368
  * wash that the content reads through. `oq-inverse-*`, the opaque tier, bakes
@@ -1355,7 +1370,7 @@
1355
1370
  * lands ~23.5 against the #121215 page's 18: lighter than the page, the wrong
1356
1371
  * side of it. `surface-tertiary` is the flat twin of what the trigger renders:
1357
1372
  * #0e0e11 (14.0) in dark against the trigger's 14.2, #ffffff in light. */
1358
- .kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-surface-sunken); }
1373
+ .kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-surface-sunken); background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent)); }
1359
1374
  /* the rest of the set — Button (icon-only especially), IconFrame, ThemeToggle:
1360
1375
  * the well, transparent edge, fg-96 ink; hover the CONTRAST wash, pressed the
1361
1376
  * fg-08 chip — both LAYERED over the well (a gradient image over the fill),
@@ -1373,24 +1388,35 @@
1373
1388
  * when that was first fixed it went to an 8% wash — the same strength as
1374
1389
  * `selected`, which put hover 0.4 from selected in dark and 1.5 in light. A
1375
1390
  * hovered unselected control was indistinguishable from the selected one.
1376
- * 04 and 08 are ~10 apart on both themes; the ladder reads. */
1391
+ * 04 and 08 are ~10 apart on both themes; the ladder reads.
1392
+ *
1393
+ * ⛔ THE TRIGGER IS EXCLUDED. `.kol-dd-trigger` carries `.kol-btn`, so every
1394
+ * `.kol-btn.kol-tone-sunken` state rule matches it unless it says otherwise —
1395
+ * and "REST AND OPEN ARE THE ONLY STATES" for a Dropdown trigger is a law
1396
+ * written TWICE at the top of this file (2026-07-15, re-called 2026-08-09 and
1397
+ * 2026-08-28). The atoms sheet excludes the trigger from all eight variant
1398
+ * hovers; these tone rules did not, so the law held everywhere except the one
1399
+ * tone the settings page uses. Repeatedly reported and repeatedly missed,
1400
+ * because the exclusion was checked in `kol-components-atoms.css` and the
1401
+ * offending rule lives here. */
1377
1402
  .kol-btn.kol-tone-sunken,
1378
1403
  .kol-icon-frame.kol-tone-sunken,
1379
1404
  .kol-theme-toggle.kol-tone-sunken {
1380
1405
  background-color: var(--kol-surface-sunken);
1406
+ background-image: linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent));
1381
1407
  border-color: transparent;
1382
1408
  color: var(--kol-fg-96);
1383
1409
  }
1384
1410
  @media (hover: hover) {
1385
- .kol-btn.kol-tone-sunken:not(.kol-btn-animate):not(:disabled):hover {
1411
+ .kol-btn.kol-tone-sunken:not(.kol-btn-animate):not(:disabled):not(.kol-dd-trigger):hover {
1386
1412
  background-color: var(--kol-surface-sunken);
1387
- background-image: linear-gradient(var(--kol-fg-04), var(--kol-fg-04));
1413
+ background-image: linear-gradient(var(--kol-fg-04), var(--kol-fg-04)), linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent));
1388
1414
  color: var(--kol-fg-96);
1389
1415
  }
1390
1416
  }
1391
- .kol-btn.kol-tone-sunken.kol-btn-pressed,
1392
- .kol-btn.kol-tone-sunken:not(:disabled):active {
1417
+ .kol-btn.kol-tone-sunken.kol-btn-pressed:not(.kol-dd-trigger),
1418
+ .kol-btn.kol-tone-sunken:not(:disabled):not(.kol-dd-trigger):active {
1393
1419
  background-color: var(--kol-surface-sunken);
1394
- background-image: linear-gradient(var(--kol-fg-08), var(--kol-fg-08));
1420
+ background-image: linear-gradient(var(--kol-fg-08), var(--kol-fg-08)), linear-gradient(var(--kol-shell-page-wash, transparent), var(--kol-shell-page-wash, transparent));
1395
1421
  color: var(--kol-fg-96);
1396
1422
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.106.0",
3
+ "version": "0.108.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",