@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 +17 -0
- package/kol-color.css +6 -0
- package/kol-components-atoms.css +1 -1
- package/kol-components-foundry.css +8 -73
- package/kol-components-molecules.css +17 -12
- package/kol-components-organisms.css +3 -0
- package/kol-components-workshop.css +38 -0
- package/package.json +1 -1
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
|
* --------------------------------------------------------------------------- */
|
package/kol-components-atoms.css
CHANGED
|
@@ -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
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
|
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
|
|
1630
|
-
*
|
|
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
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
.kol-playback-scrub::-
|
|
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
|
|
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
|
}
|