@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 +3 -1
- package/package.json +2 -2
- package/src/ThemeToggle.jsx +16 -15
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
|
|
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.
|
|
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.
|
|
30
|
+
"@kolkrabbi/kol-component": "0.15.1",
|
|
31
31
|
"@kolkrabbi/kol-icons": "0.8.11"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
package/src/ThemeToggle.jsx
CHANGED
|
@@ -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
|
|
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
|
-
?
|
|
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
|
|
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
|