@kolkrabbi/kol-theme 0.110.0 → 0.112.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.
@@ -74,11 +74,18 @@
74
74
  * flips toward the ground, `oq-ab-96` IS the well everywhere — 245 under a
75
75
  * 250 page in light, 10 under an 18 page in dark. The per-theme alias this
76
76
  * replaced was the tell that the ladder underneath was wrong. */
77
- /* THE POLE ITSELF (user 2026-08-30: *"in light mode we could fix the sunken
78
- * to use fff? fully white?"*). `100` is the ab ladder's endpoint — the ground
79
- * pole, no mix — so the well is pure #ffffff in light and pure #000000 in
80
- * dark, and it is still ONE token because `ab` flips toward the ground.
81
- * A washed page cannot close this gap the way it closed the 96 rung. */
77
+ /* ASYMMETRIC BY RULING (user 2026-08-30: pure white in light, the 96 rung in
78
+ * dark *"I really only wanted that extreme for light"*).
79
+ *
80
+ * LIGHT takes the pole, `oq-ab-100` = #ffffff. A page wash moves 250 → 245,
81
+ * and at the old 96 rung the well was ALSO 245 — the collision this closes.
82
+ * At the pole the gap is 10 and no wash rung can reach it.
83
+ * DARK stays at `oq-ab-96` = 10 under an 18 page. Pure #000 was a 23-level
84
+ * step and too deep; dark never had the collision anyway, because its wash is
85
+ * a white film that moves the page AWAY from the well.
86
+ *
87
+ * Two declarations, not one. The single-token version was my elegance, not a
88
+ * requirement — the two themes want different depths and that is allowed. */
82
89
  --kol-surface-sunken: var(--kol-oq-ab-100);
83
90
 
84
91
  --kol-surface-inverse: #0e0e11;
@@ -107,6 +114,8 @@
107
114
  --kol-surface-on-secondary: #f8f8f8;
108
115
 
109
116
  --kol-surface-tertiary: #0e0e11;
117
+ /* the well is the 96 rung in dark, not the pole — see the light block */
118
+ --kol-surface-sunken: var(--kol-oq-ab-96);
110
119
  --kol-surface-on-tertiary: #ffffff;
111
120
 
112
121
 
@@ -153,6 +162,8 @@
153
162
  --kol-surface-on-secondary: #f8f8f8;
154
163
 
155
164
  --kol-surface-tertiary: #0e0e11;
165
+ /* the well is the 96 rung in dark, not the pole — see the light block */
166
+ --kol-surface-sunken: var(--kol-oq-ab-96);
156
167
  --kol-surface-on-tertiary: #ffffff;
157
168
 
158
169
 
@@ -1317,3 +1317,40 @@ a.kol-icon-frame {
1317
1317
  padding: 0;
1318
1318
  }
1319
1319
 
1320
+
1321
+ /* ── COARSE-POINTER TEXT FLOOR ──────────────────────────────────────────────
1322
+ * iOS Safari zooms the page whenever a focused text field computes under 16px,
1323
+ * and it does NOT zoom back out on blur (InputTypeScaleZoomsIOS, kol-website
1324
+ * 2026-08-31). The DS's `sm` (12px) and `md` (14px) rungs both trip it, and md
1325
+ * is the default — so every consumer with an input has it, on every iPhone.
1326
+ *
1327
+ * The cost is that it does not look like a font-size bug: the page stays zoomed
1328
+ * and every subsequent screenshot reads as a catastrophic gutter failure. A
1329
+ * mobile audit chased a non-existent overflow across a dozen routes because of
1330
+ * this one rule.
1331
+ *
1332
+ * NOT a re-litigation of MobileTouchFloor (2026-08-26, "no type floor, 24px hit
1333
+ * floor"). That ruling is about legibility — how big text is DRAWN for a human.
1334
+ * This is a hard platform behaviour keyed on the computed `font-size` of the
1335
+ * focused field, regardless of how legible it is. Pointer devices do not move.
1336
+ *
1337
+ * `maximum-scale=1` would also stop it and is the wrong fix — it kills
1338
+ * pinch-zoom for everyone and fails WCAG 1.4.4.
1339
+ *
1340
+ * The type class (`kol-mono-*`) sits on the SHELL and the field INHERITS it, so
1341
+ * an element+class rule here beats it cleanly rather than tying on specificity
1342
+ * (ARCHITECTURE §5). The height pin travels with the size: Input pins its inner
1343
+ * field to the token's line-height (h-4 / h-[18px] / h-[22px]), so a 16px face
1344
+ * in an unlifted 16px box would clip. */
1345
+ @media (pointer: coarse) {
1346
+ .kol-control input,
1347
+ .kol-expand input {
1348
+ font-size: 16px;
1349
+ line-height: 22px;
1350
+ height: 22px;
1351
+ }
1352
+ .kol-control textarea {
1353
+ font-size: 16px;
1354
+ line-height: 22px;
1355
+ }
1356
+ }
@@ -78,3 +78,43 @@
78
78
  background-color: var(--kol-fg-24);
79
79
  color: inherit;
80
80
  }
81
+
82
+ /* ── THE RAIL AS A DRAWER ────────────────────────────────────────────────────
83
+ * `AppShell touch="drawer"` below `drawerBelow` (ShellRailNoDrawerOnMobile,
84
+ * kol-chess 2026-08-31). At 390 the 48px rail is 12.3% of the viewport spent on
85
+ * chrome in the one place there is none to spare — a chess board went from
86
+ * 302px to 350px the moment it folded. `railToggleKey` could not help: it is a
87
+ * KEY, and a phone has no keyboard.
88
+ *
89
+ * JS owns the breakpoint and stamps `data-rail-drawer` on the shell root; CSS
90
+ * only paints. No media query here — the fold width is a prop, so a query would
91
+ * be a second source of truth for it. And no `!important`: the rail reads its
92
+ * own `--kol-shell-drawer-width` in drawer mode instead of the live rail token,
93
+ * so nothing here is fighting an inline style. */
94
+ [data-rail-drawer] .kol-shell-rail {
95
+ transform: translateX(-100%);
96
+ transition: transform 220ms cubic-bezier(0.4, 0, 0.2, 1);
97
+ }
98
+ [data-rail-drawer="open"] .kol-shell-rail {
99
+ transform: translateX(0);
100
+ }
101
+ @media (prefers-reduced-motion: reduce) {
102
+ [data-rail-drawer] .kol-shell-rail { transition: none; }
103
+ }
104
+
105
+ /* Above the rail, so it stays tappable with the drawer open. */
106
+ .kol-shell-drawer-trigger {
107
+ position: fixed;
108
+ top: 12px;
109
+ left: 12px;
110
+ z-index: calc(var(--kol-z-sticky) + 2);
111
+ width: 32px;
112
+ height: 32px;
113
+ }
114
+
115
+ .kol-shell-drawer-scrim {
116
+ position: fixed;
117
+ inset: 0;
118
+ z-index: calc(var(--kol-z-sticky) - 1);
119
+ background: color-mix(in srgb, var(--kol-color-ab-black) 48%, transparent);
120
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.110.0",
3
+ "version": "0.112.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",