@kolkrabbi/kol-theme 0.155.0 → 0.156.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.
@@ -196,3 +196,31 @@
196
196
  --kol-surface-absolute-split: var(--kol-surface-ab-split);
197
197
  --kol-surface-absolute-split-inverse: var(--kol-surface-ab-split-inverse);
198
198
  }
199
+
200
+ /* ═══════════════════════════════════════════════════════════════
201
+ * THE CONTROL LADDER, AS TOKENS — and its TOUCH RUNG (ruling D5, apps review 2026-09-29)
202
+ *
203
+ * 22 · 26 · 32 · 40 (01-foundations/09-sizes.md). Every PINNED control height — an icon-only
204
+ * square, a dropdown trigger, a segmented strip, an IconFrame, a menu trigger — reads these, so the
205
+ * pinned boxes and the derived ones (padding + line-height + ring) move together.
206
+ *
207
+ * On a coarse pointer every text field must type at 16px or iOS zooms the page into it
208
+ * (OverlaySearchFieldZoomsIOS, 2026-09-01) — which put 16px text in a 26px `sm` box beside 12px
209
+ * buttons (the user: "bigger text than its relative height"). So on touch the WHOLE ladder takes
210
+ * 16 / 22 type and every box grows with it: xs 32 · sm 32 · md 36 · lg 40. One row, one height,
211
+ * on a phone as at a desk. The type rule lives with the controls (kol-components-atoms.css).
212
+ * ═══════════════════════════════════════════════════════════════ */
213
+ :root {
214
+ --kol-ctl-xs: 22px;
215
+ --kol-ctl-sm: 26px;
216
+ --kol-ctl-md: 32px;
217
+ --kol-ctl-lg: 40px;
218
+ }
219
+ @media (pointer: coarse) {
220
+ :root {
221
+ --kol-ctl-xs: 32px;
222
+ --kol-ctl-sm: 32px;
223
+ --kol-ctl-md: 36px;
224
+ --kol-ctl-lg: 40px;
225
+ }
226
+ }
@@ -296,10 +296,10 @@
296
296
  * shorter, at `xs` 2px shorter. Three families (control shell, text button,
297
297
  * segmented) already agreed on 22/26/32/40, so the squares conform to them, not
298
298
  * the other way round. Glyphs are untouched — SOLO still resolves 16/20/24. */
299
- .kol-btn-icon.kol-btn-xs { width: 22px; height: 22px; padding: 0; }
300
- .kol-btn-icon.kol-btn-sm { width: 26px; height: 26px; padding: 0; }
301
- .kol-btn-icon.kol-btn-md { width: 32px; height: 32px; padding: 0; }
302
- .kol-btn-icon.kol-btn-lg { width: 40px; height: 40px; padding: 0; }
299
+ .kol-btn-icon.kol-btn-xs { width: var(--kol-ctl-xs); height: var(--kol-ctl-xs); padding: 0; }
300
+ .kol-btn-icon.kol-btn-sm { width: var(--kol-ctl-sm); height: var(--kol-ctl-sm); padding: 0; }
301
+ .kol-btn-icon.kol-btn-md { width: var(--kol-ctl-md); height: var(--kol-ctl-md); padding: 0; }
302
+ .kol-btn-icon.kol-btn-lg { width: var(--kol-ctl-lg); height: var(--kol-ctl-lg); padding: 0; }
303
303
 
304
304
  /* ─── Variants — the ground ones are TONES now (2026-09-03) ───
305
305
  * `.kol-btn-primary` · `-secondary` · `-outline` · `-ghost` · `-grey` are
@@ -1170,10 +1170,10 @@ a.kol-icon-frame {
1170
1170
  /* pinned squares — the box never moves with glyph size (user law 2026-07-28),
1171
1171
  * on the size's HEIGHT so a frame lines up with the Button, Input and Dropdown
1172
1172
  * beside it (user ruling 2026-09-02 — see .kol-btn-icon above). 22/26/32/40. */
1173
- .kol-icon-frame-xs { width: 22px; height: 22px; }
1174
- .kol-icon-frame-sm { width: 26px; height: 26px; }
1175
- .kol-icon-frame-md { width: 32px; height: 32px; }
1176
- .kol-icon-frame-lg { width: 40px; height: 40px; }
1173
+ .kol-icon-frame-xs { width: var(--kol-ctl-xs); height: var(--kol-ctl-xs); }
1174
+ .kol-icon-frame-sm { width: var(--kol-ctl-sm); height: var(--kol-ctl-sm); }
1175
+ .kol-icon-frame-md { width: var(--kol-ctl-md); height: var(--kol-ctl-md); }
1176
+ .kol-icon-frame-lg { width: var(--kol-ctl-lg); height: var(--kol-ctl-lg); }
1177
1177
 
1178
1178
  /* `.kol-icon-frame-{primary,secondary,accent,outline,ghost,nav,grey,danger}` — tone aliases, see TONE */
1179
1179
  .kol-icon-frame-plate {
@@ -1310,6 +1310,15 @@ a.kol-icon-frame {
1310
1310
  * own; it exists so the floor below keys on every body plan the DS ships,
1311
1311
  * including the chrome-less one. */
1312
1312
  @media (pointer: coarse) {
1313
+ /* THE TOUCH RUNG (D5, 2026-09-29 — see kol-base-tokens.css): every text control types 16 / 22 on
1314
+ * touch, so a derived box grows exactly as the pinned tokens do — xs/sm 4+4+22+2 = 32, md
1315
+ * 6+6+22+2 = 36, lg 40. Two classes, so it outranks the size's own kol-mono-* class. */
1316
+ .kol-btn.kol-btn-xs, .kol-btn.kol-btn-sm, .kol-btn.kol-btn-md, .kol-btn.kol-btn-lg,
1317
+ .kol-control.kol-control-xs, .kol-control.kol-control-sm, .kol-control.kol-control-md, .kol-control.kol-control-lg,
1318
+ .kol-seg .kol-seg-cell, .kol-menu-btn.kol-menu-btn {
1319
+ font-size: 16px;
1320
+ line-height: 22px;
1321
+ }
1313
1322
  .kol-control input,
1314
1323
  .kol-control--bare input,
1315
1324
  .kol-expand input {
@@ -59,10 +59,10 @@
59
59
  gap: 0;
60
60
  position: relative;
61
61
  }
62
- .kol-dd-trigger.kol-btn-xs { height: 22px; padding-block: 0; }
63
- .kol-dd-trigger.kol-btn-sm { height: 26px; padding-block: 0; }
64
- .kol-dd-trigger.kol-btn-md { height: 32px; padding-block: 0; }
65
- .kol-dd-trigger.kol-btn-lg { height: 40px; padding-block: 0; }
62
+ .kol-dd-trigger.kol-btn-xs { height: var(--kol-ctl-xs); padding-block: 0; }
63
+ .kol-dd-trigger.kol-btn-sm { height: var(--kol-ctl-sm); padding-block: 0; }
64
+ .kol-dd-trigger.kol-btn-md { height: var(--kol-ctl-md); padding-block: 0; }
65
+ .kol-dd-trigger.kol-btn-lg { height: var(--kol-ctl-lg); padding-block: 0; }
66
66
  /* REST AND OPEN ARE THE ONLY STATES (2026-07-15, re-called 2026-08-09 and
67
67
  * 2026-08-28). No :hover or :active rules for the trigger live here any more —
68
68
  * kol-components-atoms.css excludes `.kol-dd-trigger` from every variant's
@@ -581,14 +581,14 @@
581
581
  * forced the pin). Same principle as .kol-btn-icon's pinned square:
582
582
  * the box never moves. */
583
583
  box-sizing: border-box;
584
- height: 32px; /* md — .kol-btn-md */
584
+ height: var(--kol-ctl-md); /* md — .kol-btn-md */
585
585
  }
586
586
 
587
587
  /* Sizes mirror .kol-btn-{sm,md,lg} exactly: pinned height above + cell
588
588
  * padding per size (below) + mono type (12/14/16) applied in JSX. */
589
- .kol-seg--xs { height: 22px; }
590
- .kol-seg--sm { height: 26px; }
591
- .kol-seg--lg { height: 40px; }
589
+ .kol-seg--xs { height: var(--kol-ctl-xs); }
590
+ .kol-seg--sm { height: var(--kol-ctl-sm); }
591
+ .kol-seg--lg { height: var(--kol-ctl-lg); }
592
592
  .kol-seg--xs .kol-seg-cell { padding: 4px 8px; }
593
593
  .kol-seg--sm .kol-seg-cell { padding: 4px 12px; }
594
594
  .kol-seg--lg .kol-seg-cell { padding: 8px 20px; }
@@ -41,7 +41,9 @@
41
41
  .kol-shell-page {
42
42
  display: flex;
43
43
  flex-direction: column;
44
- min-height: 100vh;
44
+ /* less the phone bar (`--kol-shell-bar-h`, set by AppShell `touch="bar"`): the content column
45
+ * already pads for it, so a full-height page ends above the bar, not under it (2026-09-29) */
46
+ min-height: calc(100vh - var(--kol-shell-bar-h, 0px));
45
47
  padding: var(--kol-shell-page-pad);
46
48
  /* PageShellScrollbarGutter (kol-monitor 2026-08-28): in `fixed` mode this
47
49
  * element IS the scroll container and reserves the gutter; in `scroll` mode
@@ -58,7 +60,7 @@
58
60
  }
59
61
  /* `mode="fixed"` — the element is the scroll container; pair with a
60
62
  * `flex:1 overflow:auto` body (the settings idiom) */
61
- .kol-shell-page--fixed { min-height: 0; height: 100vh; overflow: hidden; }
63
+ .kol-shell-page--fixed { min-height: 0; height: calc(100vh - var(--kol-shell-bar-h, 0px)); overflow: hidden; }
62
64
  /* `width="capped"` — the SITE tier: the framework container ladder, centred.
63
65
  * `bleed` (the default, unclassed) fills the window — the app tier. The one
64
66
  * real difference between a shell page and a `.kol-page`, and it is a prop
@@ -202,6 +204,34 @@
202
204
  background: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
203
205
  }
204
206
 
207
+ /* ── THE PHONE BAR (AppShell `touch="bar"`, apps review 2026-09-29) — the rail as kol-component's
208
+ * MobileTabBar below 768; past five destinations the fifth tab is More, and More is this sheet,
209
+ * floated just above the bar. The scrim sits under the bar, so More stays tappable to close. */
210
+ .kol-phone-nav-scrim {
211
+ position: fixed;
212
+ inset: 0;
213
+ z-index: calc(var(--kol-z-sticky) - 1);
214
+ border: 0;
215
+ padding: 0;
216
+ cursor: default;
217
+ }
218
+ .kol-phone-nav-more {
219
+ position: fixed;
220
+ left: 12px;
221
+ right: 12px;
222
+ bottom: calc(56px + env(safe-area-inset-bottom, 0px) + 8px);
223
+ z-index: var(--kol-z-sticky);
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: 2px;
227
+ max-height: 60dvh;
228
+ overflow-y: auto;
229
+ padding: 8px;
230
+ border-radius: var(--kol-radius-sm);
231
+ background: var(--kol-surface-primary);
232
+ border: 1px solid var(--kol-oq-08);
233
+ }
234
+
205
235
  /* ── THE TAP OPENER IS THE LINE (ShellRailCollapsedWithTapOpen, kol-mirror
206
236
  * 2026-09-01; corrected by RailGrabTapIsALine, kol-monitor 2026-09-02 — user:
207
237
  * "it was a thicker line" · "who decided it should be a chevron?"). `touch=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.155.0",
3
+ "version": "0.156.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",