@kolkrabbi/kol-framework 0.10.1 → 0.10.3

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-framework.css CHANGED
@@ -500,7 +500,9 @@ body {
500
500
  font-size: 12px;
501
501
  font-weight: 500;
502
502
  letter-spacing: 0.12em;
503
- text-transform: uppercase;
503
+ /* text-transform REMOVED 2026-07-30 — casing is a content-layer concern and
504
+ * components never auto-case (standing law). The label is authored as "Exit"
505
+ * at the call site; if a consumer wants EXIT they type EXIT. */
504
506
  text-decoration: none;
505
507
  cursor: pointer;
506
508
  transition: background 200ms ease, border-color 200ms ease;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-framework",
3
- "version": "0.10.1",
3
+ "version": "0.10.3",
4
4
  "description": "KOL app shell — sidenav, layout, theme toggle, footer, heroes + brand color layer. SideNav takes nav data as props so the tree stays app-local.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,7 +27,7 @@
27
27
  "app-shell"
28
28
  ],
29
29
  "dependencies": {
30
- "@kolkrabbi/kol-component": "0.15.0",
30
+ "@kolkrabbi/kol-component": "0.15.1",
31
31
  "@kolkrabbi/kol-icons": "0.8.11"
32
32
  },
33
33
  "peerDependencies": {
@@ -43,18 +43,8 @@ import { useTheme } from './theme.js'
43
43
  * no consumer shifts a pixel; migrate at your own pace:
44
44
  * icon → button + fill none + label off
45
45
  * hop → button + fill subtle + fullWidth (old: chrome pinned md)
46
- * hop-bare → flush + fullWidth (old: 6/24 padding kept)
47
- *
48
- * NO INTERACTIVE STATES, ANY VARIANT (user ruling 2026-07-30): *"REMOVE ALL
49
- * STATES, no fucking hover… no variant at all should have an interactive state
50
- * — it's just a click 1-2, and it's themed."* It emitted `.kol-btn` +
51
- * `.kol-btn-nav`/`.kol-btn-primary`, which dragged the button state machine
52
- * along (base transition + focus ring, per-variant :hover wash, [aria-current]
53
- * shift). Those three were the only state sources; it now emits
54
- * `.kol-theme-toggle{,-none,-subtle,-flush}` instead, which declare the same
55
- * resting appearance and have no state rules to inherit. The SIZE classes
56
- * (`kol-btn-{sm,md,lg}`, `kol-btn-icon`) are pure padding/geometry and stay.
57
- * The glyph roll stays too — that animates a state CHANGE, it is not a state.
46
+ * hop-bare → flush + fullWidth. Horizontal pad stays 24px (sidenav gutter);
47
+ * vertical pad, type and glyph honour `size` since 2026-07-30.
58
48
  *
59
49
  * Theme state lives in useTheme (./theme.js); this component is only the
60
50
  * glyph-roll UI on top of it.
@@ -156,13 +146,24 @@ export default function ThemeToggle({
156
146
  }
157
147
  if (variant === 'hop' || variant === 'hop-bare') {
158
148
  const bare = variant === 'hop-bare'
149
+ /* hop-bare HONOURS `size` (user ruling 2026-07-30). It used to hardcode
150
+ * kol-mono-14 while its glyph still tracked `size`, so size="lg" produced a
151
+ * 24px glyph beside 14px text — and it took the SOLO glyph ladder despite
152
+ * carrying a label, against the glyph law in this docstring.
153
+ *
154
+ * One container across all three rungs: same bare full-width row, only the
155
+ * vertical pad, the type and the glyph move (4/6/8 · 12/14/16 · 14/16/18).
156
+ * The 24px horizontal gutter is FIXED at every size — it aligns the row with
157
+ * the sidenav's own pl-6, which is the whole reason this alias exists.
158
+ * `hop` stays pinned to md: its docstring promises old chrome verbatim. */
159
+ const barePadY = size === 'sm' ? 'py-1' : size === 'lg' ? 'py-2' : 'py-1.5'
159
160
  const chromeCls = bare
160
- ? 'w-full inline-flex items-center justify-start gap-2 py-1.5 px-6 kol-mono-14 bg-transparent text-emphasis'
161
+ ? `w-full inline-flex items-center justify-start gap-2 ${barePadY} px-6 ${mono} bg-transparent text-emphasis`
161
162
  : 'kol-theme-toggle kol-theme-toggle-subtle kol-btn-md kol-mono-14 w-full justify-start gap-2'
162
163
  return (
163
164
  <button {...shared} className={`${chromeCls} ${className}`.trim()}>
164
165
  <span className="inline-flex items-center justify-center shrink-0" aria-hidden="true">
165
- {iconSwap(glyphSolo)}
166
+ {iconSwap(bare ? glyphWithText : glyphSolo)}
166
167
  </span>
167
168
  <span className="kol-sidenav-hop-label flex-1 min-w-0 text-left">
168
169
  {MODE_LABEL[shown]}
@@ -188,7 +189,7 @@ export default function ThemeToggle({
188
189
 
189
190
  /* variant === 'button' (default) — the padded rung. fill is the one bg
190
191
  * element: subtle = the grey fill, none = the invisible container. Geometry
191
- * identical; no hover wash on either — see the no-states note below. */
192
+ * identical; no hover on either — no variant carries an interactive state. */
192
193
  const fillCls = fill === 'none' ? 'kol-theme-toggle-none' : 'kol-theme-toggle-subtle'
193
194
  if (!label) {
194
195
  // icon-only pins the square box per rung — geometry condition, not a variant