@kolkrabbi/kol-theme 0.137.0 → 0.139.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.
@@ -249,7 +249,7 @@
249
249
  /* WEIGHT IS THE VARIANT'S, not the tone's: a tone is a ground, and a ground
250
250
  * must not re-weigh a label — a sunken secondary keeps its 500 (matrix-verified
251
251
  * 2026-09-03, the one regression the first cut had). */
252
- .kol-btn-secondary, .kol-btn-accent, .kol-btn-danger, .kol-btn.kol-tone-secondary { font-weight: 500; }
252
+ .kol-btn-secondary, .kol-btn-accent, .kol-btn-danger, .kol-btn.kol-tone-inverted { font-weight: 500; }
253
253
 
254
254
  .kol-btn:focus-visible {
255
255
  outline: 2px solid var(--kol-focus-ring);
@@ -1112,8 +1112,8 @@ a:hover .icon-hover,
1112
1112
  border-radius: var(--kol-radius-sm);
1113
1113
  padding: 0;
1114
1114
  /* paint from the TONE properties (kol-components-molecules.css, TONE); the
1115
- * variant classes are aliases of the tones, the fallback is `secondary`
1116
- * the frame's default since it was promoted — and a toned wrapper reaches a
1115
+ * variant classes are aliases of the tones, the fallback is the `secondary`
1116
+ * VARIANT's paint (the `inverted` tone) — the frame's default since it was promoted — and a toned wrapper reaches a
1117
1117
  * frame with no variant of its own. No states, as ever. */
1118
1118
  background-color: var(--kol-tone-bg, var(--kol-surface-on-primary));
1119
1119
  color: var(--kol-tone-fg, var(--kol-surface-primary));
@@ -857,10 +857,15 @@
857
857
  * rounded-[…] / shadow-[…] / bg-black/NN / backdrop-blur-[…] in package chrome.
858
858
  * ───────────────────────────────────────────────────────────────────── */
859
859
 
860
- /* LOOK ONLY — the call site owns the box. Three scrims exist and two are
861
- * `fixed inset-0` while one is `absolute inset-0`; baking position in would
862
- * have forced a wrong one on two of them. The class owns what was drifting:
863
- * the tint (60 / 50 / 50 across three files).
860
+ /* LOOK ONLY — the call site owns the box. Nine scrims wear it after the
861
+ * 2026-09-03 sweep (overlay-scrim-outliers: Modal · FullscreenOverlay ·
862
+ * ShellDrawer · ShellSearchOverlay · PageLayout's sidenav backdrop · FieldRow ·
863
+ * ShortcutsOverlay · TouchDeviceOverlay · the workshop's shortcuts sheet), and
864
+ * they are `fixed` or `absolute` by their own contract; baking position in
865
+ * would force a wrong one on some. The class owns what was drifting: the tint
866
+ * (60 / 50 / 50 across the first three files; an 8 % inverse wash + blur on
867
+ * the two shell overlays the sweep caught). ParamSheet is untinted on purpose;
868
+ * OverlayGlassPanel and PlaybackBar blur because they are surfaces, not scrims.
864
869
  * NO BLUR (user ruling 2026-09-01, OverlayScrimBlur): the 1px blur bought a
865
870
  * compositing layer on every overlay open, on a phone, for a separation the
866
871
  * 60% tint already carries. */
@@ -1170,6 +1175,9 @@
1170
1175
  * the clip path and the border path separately, and a hairline of the
1171
1176
  * lighter fill bleeds through on the arc, bright only on the curve. */
1172
1177
  .kol-card {
1178
+ /* NOT toned. A wrapper tone reaches the CONTROLS on a page and stops at the
1179
+ * card plate (user ruling 2026-09-03: "no just controls") — the plate is the
1180
+ * content-card system's box per variant. */
1173
1181
  background: var(--kol-card-bg);
1174
1182
  background-clip: padding-box;
1175
1183
  border-color: var(--kol-card-border);
@@ -1540,6 +1548,9 @@
1540
1548
  * `default` is not a tone: it is the ABSENCE of one — inherit the wrapper's,
1541
1549
  * else the family's fallback. (An alias of `primary` set on the element would
1542
1550
  * block the inheritance that ask 3 exists for.) `inverse` stays sunken's alias.
1551
+ * SEVEN since 0.138.0: `secondary` paints the page surface and `inverted` is
1552
+ * the text-colour fill the word `secondary` used to mean (tone-secondary-is-
1553
+ * inverse, the line of the user's ruling the first ticket did not carry).
1543
1554
  *
1544
1555
  * The rules live HERE, after every default they out-rank. Sunken's own
1545
1556
  * history — the well, its three-rung ladder, why it was raised until
@@ -1564,7 +1575,37 @@
1564
1575
  --kol-tone-panel-border-w: 0;
1565
1576
  --kol-tone-panel-border: transparent;
1566
1577
  }
1567
- .kol-tone-secondary,
1578
+ /* `secondary` PAINTS THE PAGE SURFACE (tone-secondary-is-inverse, kol-client-olina
1579
+ * 2026-09-03; user: "I told you I wanted primary surface as a tone … that tone
1580
+ * should be called secondary. What is currently secondary should be called
1581
+ * inverted."). 0.134.0 lifted the name from Button's `secondary` VARIANT, which
1582
+ * was already an inverse, and the page's own colour had no tone at all. The
1583
+ * variant keeps its pixels — it aliases `inverted` below — only the tone word
1584
+ * moved. Hover / press are primary's rungs over the page colour. */
1585
+ .kol-tone-secondary {
1586
+ --kol-tone-bg: var(--kol-surface-primary);
1587
+ --kol-tone-image: none;
1588
+ --kol-tone-fg: var(--kol-surface-on-primary);
1589
+ --kol-tone-border: transparent;
1590
+ --kol-tone-hover-bg: var(--kol-oq-08);
1591
+ --kol-tone-hover-image: none;
1592
+ --kol-tone-hover-fg: var(--kol-surface-on-primary);
1593
+ --kol-tone-hover-border: transparent;
1594
+ --kol-tone-active-bg: var(--kol-oq-16);
1595
+ --kol-tone-active-image: none;
1596
+ --kol-tone-pressed-bg: var(--kol-surface-on-primary);
1597
+ --kol-tone-pressed-image: none;
1598
+ --kol-tone-pressed-fg: var(--kol-surface-primary);
1599
+ --kol-tone-panel-bg: var(--kol-surface-primary);
1600
+ --kol-tone-panel-border-w: 0;
1601
+ --kol-tone-panel-border: transparent;
1602
+ }
1603
+ /* `inverted` — the text colour as fill: Button's / IconFrame's `secondary`
1604
+ * variant and the panel's `--secondary`, under the name the user gave it.
1605
+ * (`inverse` is NOT this: it is sunken's alias from 0.117.0, still on one
1606
+ * kol-website call, and stays that until it is dropped — the two words were
1607
+ * one letter apart and a live alias, so the new tone took the user's word.) */
1608
+ .kol-tone-inverted,
1568
1609
  :where(.kol-btn-secondary, .kol-icon-frame-secondary, .kol-dd-panel--secondary) {
1569
1610
  --kol-tone-bg: var(--kol-surface-on-primary);
1570
1611
  --kol-tone-image: none;
@@ -1758,6 +1799,18 @@
1758
1799
  :is(.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse, .kol-tone-sunken .kol-view-toggle) > button:not([aria-pressed="true"]):hover { background-color: var(--kol-fg-04); }
1759
1800
  /* the open search shell — was `bg-fg-04` on the element, sunken by class */
1760
1801
  .kol-expand--open { background-color: var(--kol-tone-bg, var(--kol-fg-04)); }
1802
+ /* THE SEGMENTED STRIP, SUNKEN (segmented-toggle-sunken-tone, kol-client-olina
1803
+ * 2026-09-03; user, on kol-fxr's labs rail: "is this a variant? its not what you
1804
+ * have"). It was not — it was fxr's kol-labs.css:220-226, and olina's inspector
1805
+ * carried the same three lines. Promoted verbatim: the shell's ring goes, the
1806
+ * selected cell takes the well and the fg-96 ink; rest cells stay as the
1807
+ * default paints them. `filled` / `tonal` keep their own selected law. On the
1808
+ * element, or inherited from a sunken wrapper. */
1809
+ :is(.kol-seg.kol-tone-sunken, .kol-seg.kol-tone-inverse, .kol-tone-sunken .kol-seg):not(.kol-seg--filled) { border-color: transparent; }
1810
+ :is(.kol-seg.kol-tone-sunken, .kol-seg.kol-tone-inverse, .kol-tone-sunken .kol-seg):not(.kol-seg--filled) .kol-seg-cell.is-active {
1811
+ background: var(--kol-surface-sunken);
1812
+ color: var(--kol-fg-96);
1813
+ }
1761
1814
  /* ⛔ THE TRIGGER IS EXCLUDED — rest and open are its only states (law, twice
1762
1815
  * at the top of this file). Pressed on a sunken button out-ranks its hover, as
1763
1816
  * it always did: this is the one rule the generic `.kol-btn-pressed` cannot
@@ -670,26 +670,29 @@
670
670
  .kol-filters-row {
671
671
  container-type: inline-size;
672
672
  }
673
- /* THE TRACK COUNT, COMPUTED ONCE AND READ TWICE (CatalogFilterFirstGroupTrackCount,
673
+ /* THE TRACK COUNT, MEASURED ONCE AND READ TWICE (CatalogFilterFirstGroupTrackCount,
674
674
  * kol-client-olina 2026-09-03). The first group was `(100cqw − 120px) / 6` — one
675
675
  * column of a six-track grid — while the catalog grid asks how many tracks FIT
676
- * (ceiling 6, floor `--kol-catalog-min`): on a capped page at 1280 the grid
677
- * renders five at 165 and the group measured 133, its right edge mid-card.
678
- * The 2026-08-27 "sits over the first card" law was only true at six.
676
+ * (ceiling 6, floor `minColumn`): on a capped page at 1280 the grid renders five
677
+ * at 165 and the group measured 133, its right edge mid-card. The 2026-08-27
678
+ * "sits over the first card" law was only true at six.
679
679
  *
680
- * Both now read one number: the count the grid actually renders
681
- * `min(cols, floor((W + gap) / (min + gap)))`, which is exactly what
682
- * `repeat(auto-fill, minmax(max(min, (W − 5·gap) / 6), 1fr))` resolved to, so
683
- * six-track pages are pixel-identical and narrower ones finally agree.
684
- * `100cqw` is each element's own container the filter row and the catalog
685
- * grid's wrapper are both `inline-size` containers of the page's width.
686
- * `round(down, …)` is CSS Values 4 (Firefox 118 · Chrome 125 · Safari 15.4). */
687
- .kol-filters-first,
688
- .kol-catalog-grid {
689
- --_kol-catalog-n: max(1, min(var(--kol-catalog-cols, 6), round(down, (100cqw + 24px) / (var(--kol-catalog-min, 160px) + 24px), 1)));
690
- }
680
+ * Both read `--kol-catalog-n`, the count the grid actually renders. CatalogPage
681
+ * MEASURES it (a ResizeObserver on the grid — `min(cols, floor((W + gap) /
682
+ * (min + gap)))`, exactly what `repeat(auto-fill, minmax())` resolved to) and
683
+ * publishes it on the page, so six-track pages are pixel-identical and narrower
684
+ * ones agree. Unset a ContentFilters outside CatalogPage falls back to 6,
685
+ * the pre-0.137.0 formula.
686
+ *
687
+ * ⚠️ 0.137.0 computed the count HERE with `round(down, (100cqw + 24px) / (min +
688
+ * 24px), 1)`. Chromium resolves a `<length> / <length>` division to a number;
689
+ * Firefox does not, so the declaration was invalid at computed-value time,
690
+ * `repeat(var(--n))` fell to `none`, and every catalog rendered ONE column — a
691
+ * ~1500px card (user: "is this supposed to be a joke? huge card"). Pulled the
692
+ * same hour; the count is measured in JS now, and CSS does one division by a
693
+ * NUMBER, which is Level 3 and everywhere. */
691
694
  .kol-filters-first {
692
695
  flex: none;
693
- width: calc((100cqw - (var(--_kol-catalog-n) - 1) * 24px) / var(--_kol-catalog-n));
696
+ width: calc((100cqw - (var(--kol-catalog-n, 6) - 1) * 24px) / var(--kol-catalog-n, 6));
694
697
  }
695
698
 
@@ -79,17 +79,19 @@
79
79
 
80
80
  /* ── CatalogPage ────────────────────────────────────────────────────────── */
81
81
 
82
- /* THE CATALOG GRID — a ceiling with a floor: up to `--kol-catalog-cols` (6)
83
- * tracks, none narrower than `--kol-catalog-min` (160; `CatalogPage minColumn`
84
- * sets it), gap 24. The count `--_kol-catalog-n` is computed in
85
- * kol-components-organisms.css and shared with `.kol-filters-first`, so the
86
- * filter row's first group is one track of THIS grid at every width the
87
- * grid used to be an inline `auto-fill` that resolved to the same tracks but
88
- * told nobody how many (CatalogFilterFirstGroupTrackCount, 2026-09-03). */
82
+ /* THE CATALOG GRID — a ceiling with a floor: up to 6 tracks, none narrower
83
+ * than `CatalogPage minColumn` (160), gap 24. The count is `--kol-catalog-n`,
84
+ * MEASURED by CatalogPage (a ResizeObserver on this element) and published on
85
+ * the page, where `.kol-filters-first` reads the same number — so the filter
86
+ * row's first group is one track of THIS grid at every width. The grid used to
87
+ * be an inline `auto-fill` that resolved to the same tracks but told nobody
88
+ * how many (CatalogFilterFirstGroupTrackCount, 2026-09-03). 0.137.0 computed
89
+ * the count in CSS with a length ÷ length inside `round()`, which Firefox
90
+ * rejects — one column, huge card — see kol-components-organisms.css. */
89
91
  .kol-catalog-grid {
90
92
  display: grid;
91
93
  gap: 24px;
92
- grid-template-columns: repeat(var(--_kol-catalog-n), minmax(0, 1fr));
94
+ grid-template-columns: repeat(var(--kol-catalog-n, 6), minmax(0, 1fr));
93
95
  }
94
96
 
95
97
  /* ── NavRail ────────────────────────────────────────────────────────────── */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.137.0",
3
+ "version": "0.139.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",