kerfjs 5.0.0-beta.29 → 5.0.0-beta.30

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/CHANGELOG.md CHANGED
@@ -1,11 +1,102 @@
1
1
  # Changelog
2
2
 
3
+ - Added `wa-dialog.hide-actions` support to `@kerfjs/ui/webawesome.css`, hiding
4
+ Web Awesome's directly exported `header-actions` shadow part for dialogs that
5
+ provide their own dismissal affordance.
6
+
3
7
  All notable changes to **kerf** are documented in this file.
4
8
 
5
9
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
10
 
7
11
  ## [Unreleased]
8
12
 
13
+ - Added catalog-driven CSS value diagnostics across `eslint-plugin-kerfjs`,
14
+ `kerf-ui-analyze`, and `kerf-ui-doctor`. Stable `KUI-L013`–`KUI-L017`
15
+ findings now identify raw or unknown values, wrong-dimension helpers,
16
+ incomplete expressions, declaration-list escapes, and review-worthy
17
+ off-scale spacing from first- or third-party component catalogs.
18
+ - Extended the property-specific `@kerfjs/ui/css-values` contracts: `List.flex`
19
+ now uses finite keywords or `flex()`, `Skeleton` dimensions use `CssSize` and
20
+ `CssLength`, and `SelectChoice.color` uses `uiColor()` or `colorVar()`.
21
+ Removed the unrestricted `style` escape hatches from `ListItem` and
22
+ `ListActionRow` before the 5.0 stable release; use `className`, public tokens,
23
+ and cataloged props instead.
24
+ - Added typed, CSS-free `@kerfjs/ui/css-values` builders and branded complete
25
+ versus expression length types. `List.gap` now accepts direct spacing-token
26
+ shorthands or complete `CssLength` values and rejects unrestricted CSS strings.
27
+ - Added the public recursive `JSXChildren` type from both `kerfjs` and
28
+ `kerfjs/jsx-runtime`, giving third-party function components a canonical
29
+ declaration for nullable, signal-backed, and arbitrarily nested readonly
30
+ child content that matches the runtime.
31
+ - Added the public recursive `KerfUiContent` type across semantic UI content
32
+ zones, so nullable conditionals and mutable or readonly nested component
33
+ arrays compose directly without a `Fragment` while raw strings, numbers, and
34
+ signals remain rejected outside explicit text positions.
35
+ - Fixed bottom `Workbench` drawers overshooting and snapping during collapse
36
+ transitions by anchoring fixed-height content to the shell's stable bottom
37
+ edge.
38
+ - Fixed bottom `CollapsiblePanel` drawers overshooting their open position and
39
+ snapping back by anchoring fixed-height content to the panel's stable bottom
40
+ edge throughout the transform transition.
41
+ - Formalized named `SafeHtml` prop slots as explicit `zone.jsx.prop` bindings
42
+ in the UI composition catalog and generalized `ui-composition` linting beyond
43
+ Toolbar, including statically visible `children`, cardinality, aliases,
44
+ namespaces, arrays, fragments, and branches.
45
+ - Added `ToolbarControlGroup.avatarImage`, painting contained avatar imagery on
46
+ a lone group or on the pressed highlight when the group has multiple buttons.
47
+ - Split the AppTab and TabBar catalog routes into focused component specimens,
48
+ and moved their controlled selection, tabpanel, overflow, add/close, and
49
+ reorder lifecycle into a separate application-tabs composition demo.
50
+ - Fixed `wireNavStack` focus ownership across controlled navigation: pushes
51
+ focus the new top view, pops restore its remembered descendant, and removed
52
+ targets fall back through `data-nav-focus`, the first enabled control, and
53
+ the view container.
54
+ - Fixed compact mixed-content `ToolbarControlGroup` dropdown triggers being
55
+ forced into an icon-only width, which painted the label across its separator
56
+ and the Web Awesome caret outside the group.
57
+ - Made `ListItem` clip label, status, and dormant trailing painting to its
58
+ rounded row boundary so compact and constrained rows cannot visibly overflow;
59
+ described rows now grow enough to keep their owned two-line label readable.
60
+ - Fixed compact toolbar `Select` focus to follow its owning group's pill or
61
+ rounded geometry and restored consistent spacing between popup icons and labels.
62
+ - Fixed the compact-toolbar recipe's independent overflow action to use the
63
+ same full-height pill geometry as its adjacent toolbar controls.
64
+ - Fixed the catalog footer's `Components` relationship selector to fit its icon
65
+ and plural label and give popup headings/items consistent border clearance.
66
+ - Fixed a collapsible `TokenSearchField` inside a rounded
67
+ `ToolbarControlGroup` retaining its independent pill radius instead of using
68
+ the group's shared concentric highlight radius.
69
+ - Updated the header-composition catalog demo's supporting copy to use the
70
+ horizontal `ListInsetText` geometry, aligning it with the value-table content
71
+ edge across responsive, RTL, and zoomed layouts.
72
+ - Updated the `Pane` catalog demo's secondary header copy to use
73
+ `ListInsetText`, aligning it with the standard pane content gutter at wide and
74
+ narrow sizes instead of maintaining demo-only padding.
75
+ - Completed `NavStack` navigation transitions by cross-fading top and bottom
76
+ chrome alongside content slides, added per-view bottom toolbars with a
77
+ persistent fallback, and replaced the static focused demo with a working
78
+ push/pop flow.
79
+ - Replaced the static compact `SplitView` detail specimen with a controlled,
80
+ interactive list-to-detail drill-down whose Back action restores the list;
81
+ the roomy example now demonstrates controlled selection as well.
82
+ - Documented and demonstrated list-first dialog bodies: use `List` with
83
+ `bodyInset="none"`, and wrap bare dialog copy in `ListInsetText` so content
84
+ shares the standard list gutter without double-insetting.
85
+ - Fixed `@kerfjs/ui`'s collapsible `TokenSearchField` keep-open ownership in
86
+ WebKit: when `focusout.relatedTarget` is missing during pointer activation of
87
+ an external `data-token-search-keep-open` surface, the helper now uses the
88
+ actual pointer target instead of collapsing and removing the target before
89
+ its click handler runs.
90
+ - Added a first-class vibrant `pop` semantic color for attractive non-status
91
+ emphasis, with complete light/dark/increased-contrast token roles and typed
92
+ StateBanner, ListHeader indicator, and ToolbarControlGroup selected tones.
93
+ - Fixed managed `TokenSearchField` Clear focus before the next input task, so
94
+ immediate typing stays in the replacement editor instead of triggering page
95
+ shortcuts; genuine later focus handoffs and selections remain untouched.
96
+ - Fixed `@kerfjs/ui/tab-scaffold` bottom-tab labels being vertically clipped by
97
+ flex shrinkage while retaining horizontal ellipsis for long labels.
98
+ - Made inset selection and hover highlights follow their owning control's pill
99
+ or rounded shape, with concentric inner radii derived from the full inset.
9
100
  - Fixed animated `ResizableRegion` overlays so remembered desktop dimensions
10
101
  cannot make their content overflow the responsive panel cap on narrow screens.
11
102
  - Added configuration-first application-panel policies across `ResizableRegion`,
package/ai/cursorrules CHANGED
@@ -1,4 +1,4 @@
1
- <!-- kerf-skill-version: 1.20.0 -->
1
+ <!-- kerf-skill-version: 1.21.0 -->
2
2
 
3
3
  # kerf.cursorrules — rules for building apps with kerf
4
4
 
@@ -87,6 +87,7 @@ import {
87
87
  isSafeHtml,
88
88
  raw,
89
89
  Fragment,
90
+ type JSXChildren,
90
91
  } from "kerfjs";
91
92
 
92
93
  // Optional, only when you need granular collection updates:
@@ -114,6 +115,7 @@ if (import.meta.env.DEV) await import("kerfjs/dev");
114
115
  | `attr(name)` | dynamic factory — `attr<N,V=string>(name)` returns `(value: V) => { readonly [name]: V }`; both generics off → N inferred, V defaults to string; specify both to constrain values |
115
116
  | `toElement(jsx)` | parse JSX into a DOM node (SVG-aware). Single-root → `Element`; multi-root (`<><svg/> label</>`, two icons side by side) → `DocumentFragment` that `appendChild`/`replaceChildren`/`append` inlines into the parent. |
116
117
  | `raw(html)` | inject pre-escaped HTML |
118
+ | `JSXChildren` | recursive type for general-purpose component `children`: SafeHtml, primitives, read-only signals, nullish/boolean empty values, and readonly arrays at any depth. Use a narrower union for semantically restricted slots |
117
119
  | `arraySignal(initial?)` | granular keyed-list signal at `kerfjs/array-signal` subpath; `each()` reconciles in O(patches) |
118
120
  | `` html`…` `` | tagged template at `kerfjs/html` subpath — JSX-identical runtime semantics with NO build step (CDN/importmap projects). Real HTML attribute names (`class`, not `className`); holes only in text positions or as a COMPLETE attribute value (`attr=${v}` / `attr="${v}"`) |
119
121
 
package/ai/manifest.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
- "kerfjsVersion": "5.0.0-beta.29",
2
+ "kerfjsVersion": "5.0.0-beta.30",
3
3
  "files": [
4
4
  {
5
5
  "name": "skill",
6
6
  "source": "kerf.claude-skill.md",
7
7
  "bundle": "ai/skill.md",
8
8
  "dest": ".claude/skills/kerf-app/SKILL.md",
9
- "version": "1.22.0",
10
- "sha256": "dc99b0ca5e911be11cbfa2ae515c0e161a414a5185895069535c41ba56664e70",
9
+ "version": "1.23.0",
10
+ "sha256": "28b82b4d31b98814c8fbbe1cb0bcf716192deb494c020b9af41a30830e6a0007",
11
11
  "history": {
12
12
  "1.0.0": "bef982cb743fd4c73e666ee5cf774112e57c93ebb13b24bbacbf08577db0930a",
13
13
  "1.1.0": "f2aadb21e33dd389028951ae1ecbd9f8ba68648b3c5beba43fb4dfa2ab29f195",
@@ -36,7 +36,8 @@
36
36
  "1.19.0": "bbbe87446cc4e1be250d27152adfd385431f4498cde320534f65f10f853ab7f9",
37
37
  "1.20.0": "aa88ccdbf969624bbc6cefadba76ada1f090fae436597a7bab564e24c467287f",
38
38
  "1.21.0": "265b747eeb9c3d445c60d66a1109eec42705075b7cd154d107bd79d543c1e7e5",
39
- "1.22.0": "dc99b0ca5e911be11cbfa2ae515c0e161a414a5185895069535c41ba56664e70"
39
+ "1.22.0": "dc99b0ca5e911be11cbfa2ae515c0e161a414a5185895069535c41ba56664e70",
40
+ "1.23.0": "28b82b4d31b98814c8fbbe1cb0bcf716192deb494c020b9af41a30830e6a0007"
40
41
  }
41
42
  },
42
43
  {
@@ -44,8 +45,8 @@
44
45
  "source": "kerf.cursorrules",
45
46
  "bundle": "ai/cursorrules",
46
47
  "dest": ".cursorrules",
47
- "version": "1.20.0",
48
- "sha256": "5e7b8d8ddc41f60220961417c9ae01c193fae045378a10a3e9c96a0e3cf10a03",
48
+ "version": "1.21.0",
49
+ "sha256": "a1b663b44650b1a04f89c60b26b002322fc6789650291477e14e13329c3ce25f",
49
50
  "history": {
50
51
  "1.0.0": "98f7faff2b7585ef9cc511add42ea5d9bf0cbae8307b066af090e9281136d2ab",
51
52
  "1.1.0": "a2ec8c221dc694c98b81009cd2d99f9159a45fda94585de2f54471b227099eda",
@@ -72,7 +73,8 @@
72
73
  "1.17.0": "6ad51fb0eec468f584346d1d7b4d1c2eca2cb52b04891b38ba44e93b57eb9e1c",
73
74
  "1.18.0": "de3eea1bc181da629694d19a0817d252a868e4704437fbdd9e923856b8a0890a",
74
75
  "1.19.0": "c5b91e449f6feccaa36a04cb7f8550d3e414eb2795ea6c5dccdf6071206b3261",
75
- "1.20.0": "5e7b8d8ddc41f60220961417c9ae01c193fae045378a10a3e9c96a0e3cf10a03"
76
+ "1.20.0": "5e7b8d8ddc41f60220961417c9ae01c193fae045378a10a3e9c96a0e3cf10a03",
77
+ "1.21.0": "a1b663b44650b1a04f89c60b26b002322fc6789650291477e14e13329c3ce25f"
76
78
  }
77
79
  }
78
80
  ]
package/ai/skill.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: kerf-app
3
3
  description: Build UIs in the kerf reactive framework and its @kerfjs/ui component package (https://github.com/brianwestphal/kerf). Use this skill whenever the user is writing or modifying code that imports `kerfjs` or `@kerfjs/ui`, asks to add a feature to a kerf app, or asks "how do I do X in kerf?". Use it proactively the moment you spot a kerf import in the file you're editing.
4
- kerf-skill-version: 1.22.0
4
+ kerf-skill-version: 1.23.0
5
5
  ---
6
6
 
7
7
  # Building apps with kerf
@@ -93,6 +93,7 @@ import {
93
93
  isSafeHtml,
94
94
  raw,
95
95
  Fragment,
96
+ type JSXChildren,
96
97
  } from "kerfjs";
97
98
 
98
99
  // Optional, only when you need granular collection updates:
@@ -120,6 +121,7 @@ if (import.meta.env.DEV) await import("kerfjs/dev");
120
121
  | `attr(name)` | dynamic factory — `attr<N,V=string>(name)` returns `(value: V) => { readonly [name]: V }`; both generics off → N inferred, V defaults to string; specify both to constrain values |
121
122
  | `toElement(jsx)` | parse JSX into a DOM node (SVG-aware). Single-root → `Element`; multi-root (`<><svg/> label</>`, two icons side by side) → `DocumentFragment` that `appendChild`/`replaceChildren`/`append` inlines into the parent. |
122
123
  | `raw(html)` | inject pre-escaped HTML |
124
+ | `JSXChildren` | recursive type for general-purpose component `children`: SafeHtml, primitives, read-only signals, nullish/boolean empty values, and readonly arrays at any depth. Use a narrower union for semantically restricted slots |
123
125
  | `arraySignal(initial?)` | granular keyed-list signal (subpath `kerfjs/array-signal`); `each()` reconciles in O(patches) |
124
126
  | `` html`…` `` | tagged template (subpath `kerfjs/html`) — JSX-identical runtime semantics with NO build step, for CDN/importmap projects. Real HTML attribute names (`class`, not `className`); holes only in text positions or as a COMPLETE attribute value (`attr=${v}` / `attr="${v}"`) |
125
127
 
@@ -1,6 +1,6 @@
1
1
  import { itemVersion } from './chunk-5WRGJZV6.js';
2
2
  import { parseRowTemplate, rowContractError, parseSingleRow, collectTemplateChildren } from './chunk-WKIPLNVO.js';
3
- import { captureRowBindings, listSafeHtml, boundTextNodeOf, syncFormProp, newBindingContext, disposeRowBindings, wireBindings, isSafeHtml, _setBindingContext, TEXT_MARKER_PREFIX, ROW_TEXT_PREFIX, wireRowBindings, carryOrRewireRowBindings, granularListSafeHtml } from './chunk-QFUNWHKH.js';
3
+ import { captureRowBindings, listSafeHtml, boundTextNodeOf, syncFormProp, newBindingContext, disposeRowBindings, wireBindings, isSafeHtml, _setBindingContext, TEXT_MARKER_PREFIX, ROW_TEXT_PREFIX, wireRowBindings, carryOrRewireRowBindings, granularListSafeHtml } from './chunk-JRKE6XEK.js';
4
4
  import { effect } from './chunk-Y2FOYPBV.js';
5
5
  import { LIST_MARKER_PREFIX, flattenWithoutListItems, collectLists, flatten } from './chunk-BDX3R4OM.js';
6
6
  import { devHooks } from './chunk-CEQMZYLR.js';
@@ -1497,4 +1497,4 @@ function collectComments(node, out) {
1497
1497
 
1498
1498
  export { captureFocus, each, morph, mount, moveNode, restoreFocus };
1499
1499
 
1500
- //# sourceMappingURL=chunk-V757BT6U.js.map
1500
+ //# sourceMappingURL=chunk-DLY444MN.js.map