@kolkrabbi/kol-theme 0.161.0 → 0.163.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-animation.css CHANGED
@@ -371,6 +371,23 @@
371
371
  .kol-rail-grab::before { transition: none; }
372
372
  }
373
373
 
374
+ /* THE LINE VARIANT (2026-10-01, `useDragResize({ variant: 'line' })`) — no pill: the whole edge
375
+ * lights up under the pointer and while dragging, the way an editor's pane border does. A
376
+ * double-click toggles the rail; the cursor is the same `col-resize`. */
377
+ .kol-rail-grab--line::before {
378
+ top: 0;
379
+ translate: -50% 0;
380
+ height: 100%;
381
+ border-radius: 0;
382
+ background: var(--kol-oq-48);
383
+ transition: opacity 120ms ease, background-color 120ms ease;
384
+ }
385
+ .kol-rail-grab--line:hover::before,
386
+ .kol-rail-grab--line:focus-visible::before,
387
+ .kol-rail-grab--line.is-dragging::before { opacity: 1; background: var(--kol-oq-96); transition-delay: 0ms; }
388
+ /* near is not enough for a line — it lights on the edge itself, not 20px out */
389
+ .kol-rail-grab--line.is-near:not(:hover):not(.is-dragging):not(:focus-visible)::before { opacity: 0; }
390
+
374
391
  /* A RIGHT-HAND RAIL's handle sits on its LEFT edge, facing the page (2026-09-30 — the modifier
375
392
  * EditorShell has stamped since 0.x, `kol-rail-grab--${side}`, had no rule, so a right rail's pill
376
393
  * sat on its outer edge; the workshop shell's right rail needs the same). */
package/kol-color.css CHANGED
@@ -221,6 +221,12 @@
221
221
  color: var(--kol-surface-on-inverse);
222
222
  }
223
223
 
224
+ /* the sunken surface had a token and no class (2026-10-01) — the preview stage reached for
225
+ * `bg-[var(--kol-surface-sunken)]`. Ground only: what sits in a well keeps its own ink. */
226
+ .bg-surface-sunken {
227
+ background-color: var(--kol-surface-sunken);
228
+ }
229
+
224
230
  /* ---------------------------------------------------------------------------
225
231
  * Elevation Utilities
226
232
  * --------------------------------------------------------------------------- */
@@ -1315,7 +1315,7 @@ a.kol-icon-frame {
1315
1315
  * field to the token's line-height (h-4 / h-[18px] / h-[22px]), so a 16px face
1316
1316
  * in an unlifted 16px box would clip. */
1317
1317
  /* `.kol-control--bare` is a MARKER, not chrome (OverlaySearchFieldZoomsIOS,
1318
- * 2026-09-01): SearchInput's `bare` body plan — the overlay palette's field —
1318
+ * 2026-09-01): SearchInput's `bare` body plan — the search modal's field —
1319
1319
  * sits in a plain <label>, outside both shells, and was the field that put a
1320
1320
  * whole mobile review in a zoomed page. The marker carries no rules of its
1321
1321
  * own; it exists so the floor below keys on every body plan the DS ships,
@@ -211,79 +211,14 @@
211
211
  font-size: 0.7rem;
212
212
  }
213
213
 
214
- .font-viewer-slider-group input[type='range'] {
215
- flex: 1;
216
- height: 15px;
217
- padding: 7px 0;
218
- cursor: pointer;
219
- background: linear-gradient(var(--fv-black), var(--fv-black)) center/100% 1px no-repeat;
220
- -webkit-appearance: none;
221
- appearance: none;
222
- }
223
-
224
- .font-viewer-slider-group input[type='range']::-webkit-slider-runnable-track,
225
- .font-viewer-slider-group input[type='range']::-moz-range-track {
226
- width: 100%;
227
- height: 1px;
228
- background: transparent;
229
- }
230
-
231
- .font-viewer-slider-group input[type='range']::-webkit-slider-runnable-track {
232
- border-radius: 9999px;
233
- }
234
-
235
- .font-viewer-slider-group input[type='range']::-webkit-slider-thumb {
236
- -webkit-appearance: none;
237
- appearance: none;
238
- height: 15px;
239
- width: 15px;
240
- border-radius: 50%;
241
- background: var(--fv-black);
242
- cursor: pointer;
243
- margin-top: 0;
244
- }
245
-
246
- .font-viewer-slider-group input[type='range']::-moz-range-thumb {
247
- height: 15px;
248
- width: 15px;
249
- border-radius: 50%;
250
- background: var(--fv-black);
251
- cursor: pointer;
252
- }
253
-
254
- .font-viewer-slider-group input[type='range']::-moz-range-track {
255
- border-radius: 9999px;
256
- }
257
-
258
- .font-viewer-slider-group input[type='range']::-ms-track {
259
- width: 100%;
260
- height: 1px;
261
- background: transparent;
262
- border-color: transparent;
263
- color: transparent;
264
- }
265
-
266
- .font-viewer-slider-group input[type='range']::-ms-fill-lower,
267
- .font-viewer-slider-group input[type='range']::-ms-fill-upper {
268
- background: var(--fv-black);
269
- }
270
-
271
- .font-viewer-slider-group input[type='range']::-ms-thumb {
272
- height: 15px;
273
- width: 15px;
274
- border-radius: 50%;
275
- background: var(--fv-black);
276
- cursor: pointer;
277
- }
278
-
279
- .font-viewer-slider-group input[type='range']::-webkit-slider-thumb,
280
- .font-viewer-slider-group input[type='range']::-moz-range-thumb {
281
- height: 15px;
282
- width: 15px;
283
- border-radius: 50%;
284
- background: var(--fv-black);
285
- cursor: pointer;
286
- }
214
+ /* The range is `Slider` now (2026-10-02 — the ~65 lines that drew one here are in
215
+ * `_tmp/2026-10-02-foundry-slider-css/`). The viewer keeps its own two-color scheme (`--fv-*`,
216
+ * swapped at runtime), so the slider's track, knob and readout are bound to it here. */
217
+ .font-viewer-slider-group { --kol-slider-track: var(--fv-black); }
218
+ .font-viewer-slider-group .slider-black::-webkit-slider-thumb { background: var(--fv-black); }
219
+ .font-viewer-slider-group .slider-black::-moz-range-thumb { background: var(--fv-black); }
220
+ .font-viewer-slider-group label,
221
+ .font-viewer-slider-group span { color: var(--fv-black); background: transparent; padding: 0; }
287
222
 
288
223
  .font-viewer-variable-axes {
289
224
  margin-top: 12px;
@@ -493,6 +493,8 @@
493
493
  display: inline-flex;
494
494
  align-items: center;
495
495
  justify-content: center;
496
+ /* the icon and the label were flush (2026-10-01) — `icon` renders beside the text with nothing between */
497
+ gap: 6px;
496
498
  border-radius: 4px;
497
499
  font-family: var(--kol-font-family-mono);
498
500
  font-weight: 470;
@@ -942,7 +944,7 @@
942
944
  color: var(--kol-oq-96);
943
945
  /* NO BORDER, NO SHADOW (user 2026-08-01). Both were tried and both were
944
946
  * wrong: the shadow was another product's floating-card idiom, and the
945
- * hairline left an empty palette reading as a bordered empty box. The SCRIM
947
+ * hairline left an empty search modal reading as a bordered empty box. The SCRIM
946
948
  * is the separation — a 60% tint is already a stronger edge than an
947
949
  * 8%-opacity line. */
948
950
  /* `sm` — the radius this repo's chrome actually uses. */
@@ -1626,8 +1628,8 @@
1626
1628
  /* THE QUICKTIME BAR (PlaybackBarAndAudioSheet, kol-r2b2 2026-08-27 — ruled
1627
1629
  * against the reference). White glyphs on the frosted strip whatever the theme:
1628
1630
  * the ghost IconFrame paints --kol-oq-48, a theme color, and the bar sits on
1629
- * media, not on the theme. The scrubber is a native range — a 2px track at 40 %
1630
- * white, a tall 4 × 28 white pill for the knob — pseudo-elements, so CSS. */
1631
+ * media, not on the theme. The scrubber is a native range — a 2px track, a tall
1632
+ * 4 × 28 pill for the knob — pseudo-elements, so CSS. */
1631
1633
  .kol-playback-bar .kol-icon-frame { color: var(--kol-color-ab-white); opacity: 0.8; }
1632
1634
  .kol-playback-bar .kol-icon-frame:hover,
1633
1635
  .kol-playback-bar .kol-icon-frame:focus-visible { opacity: 1; }
@@ -1639,18 +1641,21 @@
1639
1641
  outline: none;
1640
1642
  cursor: pointer;
1641
1643
  }
1642
- .kol-playback-scrub::-webkit-slider-runnable-track { height: 2px; border-radius: 1px; background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1643
- .kol-playback-scrub::-webkit-slider-thumb { -webkit-appearance: none; width: 4px; height: 28px; margin-top: -13px; border-radius: 2px; background: var(--kol-color-ab-white); }
1644
- .kol-playback-scrub::-moz-range-track { height: 2px; border-radius: 1px; background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1645
- .kol-playback-scrub::-moz-range-thumb { width: 4px; height: 28px; border: 0; border-radius: 2px; background: var(--kol-color-ab-white); }
1644
+ /* THE SCRUBBER IS A SLIDER VARIANT (2026-10-02, `Slider variant="scrub"`), so at rest it takes the
1645
+ * THEME's ink — an opaque rail and knob, the look the docked bar already had — and reads the
1646
+ * slider's own `--kol-slider-track` seam. Only the bar FLOATING over media paints it white. */
1647
+ .kol-playback-scrub::-webkit-slider-runnable-track { height: 2px; border-radius: 1px; background: var(--kol-slider-track, var(--kol-oq-24)); }
1648
+ .kol-playback-scrub::-webkit-slider-thumb { -webkit-appearance: none; width: 4px; height: 28px; margin-top: -13px; border-radius: 2px; background: var(--kol-oq-80); }
1649
+ .kol-playback-scrub::-moz-range-track { height: 2px; border-radius: 1px; background: var(--kol-slider-track, var(--kol-oq-24)); }
1650
+ .kol-playback-scrub::-moz-range-thumb { width: 4px; height: 28px; border: 0; border-radius: 2px; background: var(--kol-oq-80); }
1651
+ .kol-playback-bar:not(.kol-playback-bar--docked) .kol-playback-scrub::-webkit-slider-runnable-track { background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1652
+ .kol-playback-bar:not(.kol-playback-bar--docked) .kol-playback-scrub::-webkit-slider-thumb { background: var(--kol-color-ab-white); }
1653
+ .kol-playback-bar:not(.kol-playback-bar--docked) .kol-playback-scrub::-moz-range-track { background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1654
+ .kol-playback-bar:not(.kol-playback-bar--docked) .kol-playback-scrub::-moz-range-thumb { background: var(--kol-color-ab-white); }
1646
1655
  /* DOCKED (2026-09-23) — the bar in the Quick Look window's footer. It sits on the window, not on
1647
1656
  * media, so it takes the theme's ink on an opaque plate instead of white on a dark wash. */
1648
1657
  .kol-playback-bar--docked { background: var(--kol-oq-08); color: var(--kol-oq-80); }
1649
1658
  .kol-playback-bar--docked .kol-icon-frame { color: var(--kol-oq-80); }
1650
- .kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-runnable-track { background: var(--kol-oq-24); }
1651
- .kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-thumb { background: var(--kol-oq-80); }
1652
- .kol-playback-bar--docked .kol-playback-scrub::-moz-range-track { background: var(--kol-oq-24); }
1653
- .kol-playback-bar--docked .kol-playback-scrub::-moz-range-thumb { background: var(--kol-oq-80); }
1654
1659
 
1655
1660
  /* ColumnBrowser rows — ONE SELECTED STATE (ColumnBrowserSeams, kol-r2b2
1656
1661
  * 2026-08-28; user: "ONLY one selected state can exist, not TWO"). The row's
@@ -2203,7 +2208,7 @@
2203
2208
  /* ─── the families that keep their own plates ─── */
2204
2209
  .kol-view-toggle { background-color: var(--kol-tone-bg, var(--kol-surface-secondary)); }
2205
2210
  /* keyboard focus in the well wears the DS ring, not the browser's blue (a button regains focus when
2206
- * the search palette it opened closes, 2026-09-23) */
2211
+ * the search modal it opened closes, 2026-09-23) */
2207
2212
  .kol-view-toggle button:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--kol-oq-24); }
2208
2213
  /* the sunken well's chip ladder (rest · +fg-04 hover · +fg-08 selected) — on the
2209
2214
  * element, or inherited from a sunken wrapper */
@@ -180,6 +180,9 @@
180
180
  .kol-table-wrapper.kol-table--simple { border: none; border-radius: 0; }
181
181
  .kol-table-wrapper.kol-table--simple .kol-table-thead { background: none; border-bottom: 1px solid var(--kol-fg-12); }
182
182
  .kol-table-wrapper.kol-table--simple .kol-table-row { border-bottom: 1px solid var(--kol-fg-08); }
183
+ /* no rule under the last row unless asked (`lastRule`, 2026-10-01) — whatever follows the table
184
+ * usually brings its own divider, and the pair read as a double line */
185
+ .kol-table-wrapper.kol-table--simple:not(.kol-table--last-rule) tbody .kol-table-row:last-child { border-bottom: none; }
183
186
  /* compact — record-surface density (2026-08-09): tighter cell box for the
184
187
  * RecordManager table; the reference's rows sit near half the default. */
185
188
  .kol-table-wrapper.kol-table--compact .kol-table th,
@@ -116,6 +116,14 @@
116
116
  overscroll-behavior: contain;
117
117
  }
118
118
 
119
+ /* THE RAIL FADES OUT AT ITS FOOT (2026-10-01 — user, on shadcn's sidebar: "look how they use
120
+ * gradient fade for information to reveals on scroll"). A long list runs out under a fade instead
121
+ * of being cut by the window edge; the rail's own bottom padding (`pb-14` on the aside) keeps the last row clear of it. */
122
+ .shell-rail {
123
+ -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 3rem), transparent);
124
+ mask-image: linear-gradient(to bottom, #000 calc(100% - 3rem), transparent);
125
+ }
126
+
119
127
  .shell-rail--nav {
120
128
  border-right: 1px solid var(--kol-oq-08);
121
129
  padding-inline-end: var(--kol-pad-chrome-x);
@@ -126,6 +134,36 @@
126
134
  padding-inline-start: var(--kol-pad-chrome-x);
127
135
  }
128
136
 
137
+ /* THE RAIL'S THIRD STATE — ICONS (user ruling 2026-10-02: *"I wanted that icon state on the rails"*).
138
+ * Beside visible and hidden: the left rail as a strip, one glyph per group. Its grid track is the
139
+ * framework's collapsed-rail width (`--kol-sidenav-w-collapsed`, set in ShellLayout), so the strip
140
+ * drops the open rail's inner inset and centres its glyphs.
141
+ *
142
+ * HOVER OPENS IT OVER THE PAGE (`.is-peek`, stamped by ShellNavColumn): the column grows to the
143
+ * open rail's width past its own track, on the sticky tier with the page's surface behind it, so
144
+ * the page under it does not reflow — a hover must not move the thing you are reading. */
145
+ .shell-rail--icons {
146
+ padding-inline-end: 0;
147
+ }
148
+ .shell-rail--icons.is-peek {
149
+ width: var(--kol-shell-nav-w);
150
+ z-index: var(--kol-z-sticky);
151
+ background: var(--kol-surface-primary);
152
+ padding-inline-end: var(--kol-pad-chrome-x);
153
+ }
154
+ .shell-rail-icons {
155
+ display: flex;
156
+ flex-direction: column;
157
+ align-items: center;
158
+ gap: var(--kol-spacing-1);
159
+ }
160
+ /* the group you are in: the rail's active wash HELD ON (the 2026-08-12 ruling `.kol-shell-rail`
161
+ * already carries — navigation is location, never a pressed tool) */
162
+ .shell-rail-icons .kol-btn-nav[aria-current="page"] {
163
+ background-color: var(--kol-oq-04);
164
+ color: var(--kol-oq-96);
165
+ }
166
+
129
167
  .shell-main {
130
168
  min-width: 0;
131
169
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.161.0",
3
+ "version": "0.163.0",
4
4
  "description": "Tokens and base CSS",
5
5
  "license": "MIT",
6
6
  "type": "module",