@kerfjs/ui 5.0.0-beta.63 → 5.0.0-beta.65
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/ai/component-catalog.json +28 -12
- package/ai/component-composition.json +21 -3
- package/ai/components/content-item.md +4 -1
- package/ai/components/list.md +4 -2
- package/ai/components/token-search-field.md +3 -0
- package/ai/components/workbench.md +1 -0
- package/ai/public-api-signatures-v1.md +24 -11
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.js +3 -3
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-UCKKT6KO.js → chunk-2EKHENQK.js} +7 -1
- package/dist/chunk-2EKHENQK.js.map +1 -0
- package/dist/{chunk-RTJNJTG3.js → chunk-5SYE4CCT.js} +42 -5
- package/dist/chunk-5SYE4CCT.js.map +1 -0
- package/dist/{chunk-IA4D5XNT.js → chunk-FJSZYEBM.js} +2 -2
- package/dist/{chunk-IA4D5XNT.js.map → chunk-FJSZYEBM.js.map} +1 -1
- package/dist/{chunk-ZRWXFDDS.js → chunk-J3KGJ6P6.js} +1 -1
- package/dist/{chunk-ZRWXFDDS.js.map → chunk-J3KGJ6P6.js.map} +1 -1
- package/dist/{chunk-7AKGPBCC.js → chunk-NCSWXG7G.js} +8 -4
- package/dist/chunk-NCSWXG7G.js.map +1 -0
- package/dist/{chunk-R75GGNWY.js → chunk-P4UXSYIJ.js} +58 -8
- package/dist/chunk-P4UXSYIJ.js.map +1 -0
- package/dist/{chunk-KFYANKJI.js → chunk-PWQAVNON.js} +3 -3
- package/dist/{chunk-KFYANKJI.js.map → chunk-PWQAVNON.js.map} +1 -1
- package/dist/{chunk-OBAFAH5B.js → chunk-TJK44RQC.js} +33 -8
- package/dist/chunk-TJK44RQC.js.map +1 -0
- package/dist/{chunk-NAPE7WUS.js → chunk-W2AC6Q2A.js} +9 -1
- package/dist/chunk-W2AC6Q2A.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/content-item.d.ts +7 -3
- package/dist/content-item.js +1 -1
- package/dist/grid.d.ts +5 -1
- package/dist/grid.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -6
- package/dist/list.d.ts +5 -1
- package/dist/list.js +1 -1
- package/dist/popup-menu-register.js +181 -5
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +2 -1
- package/dist/popup-menu.js +1 -1
- package/dist/styles/catalog/components/catalog-example.css +4 -0
- package/dist/styles/content-item.css +11 -2
- package/dist/styles/grid.css +7 -0
- package/dist/styles/popup-menu.css +9 -0
- package/dist/styles/segmented-control.css +3 -0
- package/dist/styles/token-search-field.css +51 -5
- package/dist/styles/toolbar-control-group.css +14 -0
- package/dist/styles/workbench.css +7 -25
- package/dist/{token-search-field-DvgFLhLL.d.ts → token-search-field-CVGwDn2y.d.ts} +30 -6
- package/dist/token-search-field.d.ts +1 -1
- package/dist/token-search-field.js +1 -1
- package/dist/token-search-model.d.ts +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-content-items.d.ts +3 -1
- package/dist/wire-content-items.js +30 -6
- package/dist/wire-content-items.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +29 -4
- package/docs/catalog.md +6 -2
- package/docs/component-contract.md +34 -2
- package/docs/component-selection.md +16 -0
- package/docs/layout.md +42 -10
- package/docs/surface-scaffold.md +6 -3
- package/docs/ux-demo.md +1 -0
- package/docs/workbench.md +5 -1
- package/package.json +1 -1
- package/dist/chunk-7AKGPBCC.js.map +0 -1
- package/dist/chunk-NAPE7WUS.js.map +0 -1
- package/dist/chunk-OBAFAH5B.js.map +0 -1
- package/dist/chunk-R75GGNWY.js.map +0 -1
- package/dist/chunk-RTJNJTG3.js.map +0 -1
- package/dist/chunk-UCKKT6KO.js.map +0 -1
|
@@ -1170,6 +1170,11 @@
|
|
|
1170
1170
|
"on": "kui-workbench__rail and kui-workbench__drawer",
|
|
1171
1171
|
"meaning": "Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions."
|
|
1172
1172
|
},
|
|
1173
|
+
{
|
|
1174
|
+
"name": "data-numeric-overlays",
|
|
1175
|
+
"on": "kui-workbench",
|
|
1176
|
+
"meaning": "Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active."
|
|
1177
|
+
},
|
|
1173
1178
|
{
|
|
1174
1179
|
"name": "data-handle-inset",
|
|
1175
1180
|
"on": "kui-workbench__rail",
|
|
@@ -2726,7 +2731,8 @@
|
|
|
2726
2731
|
"Choose a finite gap shorthand such as xs or m, or compose a typed length with @kerfjs/ui/css-values when the spacing scale is insufficient.",
|
|
2727
2732
|
"Use a finite flex keyword or the flex() builder when List participates in flexible layout.",
|
|
2728
2733
|
"Apply the standard text or control inset to selected physical sides without an application wrapper.",
|
|
2729
|
-
"Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row."
|
|
2734
|
+
"Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row.",
|
|
2735
|
+
"Use selectionMode=\"multiple\" and ariaLabel to group selectable rich ContentItem rows in a multi-select grid."
|
|
2730
2736
|
],
|
|
2731
2737
|
"avoidWhen": [
|
|
2732
2738
|
"Do not use List as semantic list markup; use ul/ol when list semantics are required and apply layout deliberately.",
|
|
@@ -2737,7 +2743,8 @@
|
|
|
2737
2743
|
"appOwns": [
|
|
2738
2744
|
"child semantics and content",
|
|
2739
2745
|
"the bounded height needed for scrolling",
|
|
2740
|
-
"typed gap, flex, alignment, and divider choices"
|
|
2746
|
+
"typed gap, flex, alignment, and divider choices",
|
|
2747
|
+
"the accessible label and selection state of a multi-select grid"
|
|
2741
2748
|
],
|
|
2742
2749
|
"variants": [
|
|
2743
2750
|
"no gap",
|
|
@@ -2752,10 +2759,11 @@
|
|
|
2752
2759
|
"top/right/bottom/left text and control inset combinations",
|
|
2753
2760
|
"fill: the layout root fills a definite-height parent",
|
|
2754
2761
|
"rootAttributes: safe data-* metadata on the root",
|
|
2755
|
-
"scroll dividers when named as wireScrollDividers targets chrome"
|
|
2762
|
+
"scroll dividers when named as wireScrollDividers targets chrome",
|
|
2763
|
+
"multi-select grid for rich ContentItem rows"
|
|
2756
2764
|
],
|
|
2757
2765
|
"accessibility": [
|
|
2758
|
-
"List adds layout only and no list role;
|
|
2766
|
+
"List adds layout only and no list role by default; selectionMode=\"multiple\" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.",
|
|
2759
2767
|
"Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
|
|
2760
2768
|
],
|
|
2761
2769
|
"geometry": {
|
|
@@ -3307,7 +3315,8 @@
|
|
|
3307
3315
|
"useWhen": [
|
|
3308
3316
|
"An ordinary surface-like child of a Pane or .kui-content stack needs the shared content-item geometry so its content edge lands at the standard 17px inset.",
|
|
3309
3317
|
"A content item marks a real distinction and must read as visibly bounded: pass frame=\"framed\" (the border is always reserved, so geometry does not change).",
|
|
3310
|
-
"A content item should follow a pill control's 22px radius: pass shape=\"pill\"."
|
|
3318
|
+
"A content item should follow a pill control's 22px radius: pass shape=\"pill\".",
|
|
3319
|
+
"A selectable rich card needs nested controls: use selectionMode=\"multiple\" inside a labeled List multi-select grid."
|
|
3311
3320
|
],
|
|
3312
3321
|
"avoidWhen": [
|
|
3313
3322
|
"Do not wrap a component that already owns content-item geometry (ListItem, ListHeader, StateBanner, Toolbar, ValueTable) or pad around a ContentItem; either double-insets.",
|
|
@@ -3337,19 +3346,22 @@
|
|
|
3337
3346
|
"whether the item marks a real distinction that warrants a visible frame",
|
|
3338
3347
|
"corner shape",
|
|
3339
3348
|
"region semantics and accessible name",
|
|
3340
|
-
"whether the item is a programmatic focus target"
|
|
3349
|
+
"whether the item is a programmatic focus target",
|
|
3350
|
+
"the selection set and Shift/Cmd extension for multi-select rich cards"
|
|
3341
3351
|
],
|
|
3342
3352
|
"variants": [
|
|
3343
3353
|
"unframed rounded item",
|
|
3344
3354
|
"framed rounded item",
|
|
3345
3355
|
"pill item",
|
|
3346
3356
|
"framed pill item",
|
|
3347
|
-
"named focus-target region"
|
|
3357
|
+
"named focus-target region",
|
|
3358
|
+
"multi-select rich grid row"
|
|
3348
3359
|
],
|
|
3349
3360
|
"accessibility": [
|
|
3350
3361
|
"An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role=\"region\").",
|
|
3351
3362
|
"focusTarget makes the item a programmatic focus target (tabindex=\"-1\", never a tab stop), such as a NavStack view's data-nav-focus target.",
|
|
3352
|
-
"The frame is decorative and never the only signal of state."
|
|
3363
|
+
"The frame is decorative and never the only signal of state.",
|
|
3364
|
+
"selectionMode=\"multiple\" renders a focusable row with aria-selected and a gridcell for nested controls; place it in a labeled List selectionMode=\"multiple\" grid. wireContentItems moves focus among rows with Up/Down and Home/End while nested controls retain those keys. Guard the app's delegated card action with isContentItemActivation so a nested control does not select the row."
|
|
3353
3365
|
],
|
|
3354
3366
|
"geometry": {
|
|
3355
3367
|
"margin": "self",
|
|
@@ -3832,7 +3844,8 @@
|
|
|
3832
3844
|
},
|
|
3833
3845
|
"useWhen": [
|
|
3834
3846
|
"Combine DOM-owned free text with ordered editable/removable filter tokens in one searchbox.",
|
|
3835
|
-
"Enable collapsible mode when an empty, unfocused search should reduce to one iconic action, standalone or inside a toolbar group."
|
|
3847
|
+
"Enable collapsible mode when an empty, unfocused search should reduce to one iconic action, standalone or inside a toolbar group.",
|
|
3848
|
+
"Use presentation=\"form-field\" for a structured search query beside Web Awesome form controls, with a visible label, optional hint, and required marker."
|
|
3836
3849
|
],
|
|
3837
3850
|
"avoidWhen": [
|
|
3838
3851
|
"Do not use for ordinary text input or separately labeled filter controls."
|
|
@@ -3847,19 +3860,22 @@
|
|
|
3847
3860
|
"the grammar and evaluation callback when using the optional managed model, or parsing, suggestions, tokens, and query execution in manual mode",
|
|
3848
3861
|
"results",
|
|
3849
3862
|
"the revision that rebuilds the DOM-owned editor for a programmatic text replacement",
|
|
3850
|
-
"optional override of the collapsible expand/collapse/focus, which wireTokenSearchFields manages by default (adopt an app expanded signal, opt out per behavior, or drive it via the returned handle)"
|
|
3863
|
+
"optional override of the collapsible expand/collapse/focus, which wireTokenSearchFields manages by default (adopt an app expanded signal, opt out per behavior, or drive it via the returned handle)",
|
|
3864
|
+
"validation of a required form-field value"
|
|
3851
3865
|
],
|
|
3852
3866
|
"variants": [
|
|
3853
3867
|
"tokens",
|
|
3854
3868
|
"free text",
|
|
3855
3869
|
"disabled",
|
|
3856
|
-
"collapsible standalone or toolbar composition"
|
|
3870
|
+
"collapsible standalone or toolbar composition",
|
|
3871
|
+
"visible form-field label, hint, and required marker"
|
|
3857
3872
|
],
|
|
3858
3873
|
"accessibility": [
|
|
3859
3874
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
3860
3875
|
"Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.",
|
|
3861
3876
|
"Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
|
|
3862
|
-
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out."
|
|
3877
|
+
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.",
|
|
3878
|
+
"The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireTokenSearchFields focus the editor from a label click. The app validates required input."
|
|
3863
3879
|
],
|
|
3864
3880
|
"geometry": {
|
|
3865
3881
|
"margin": "none",
|
|
@@ -1097,6 +1097,12 @@
|
|
|
1097
1097
|
"helper": "wireWorkbench",
|
|
1098
1098
|
"meaning": "Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions."
|
|
1099
1099
|
},
|
|
1100
|
+
{
|
|
1101
|
+
"name": "data-numeric-overlays",
|
|
1102
|
+
"on": "kui-workbench",
|
|
1103
|
+
"helper": "wireWorkbench",
|
|
1104
|
+
"meaning": "Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active."
|
|
1105
|
+
},
|
|
1100
1106
|
{
|
|
1101
1107
|
"name": "data-handle-inset",
|
|
1102
1108
|
"on": "kui-workbench__rail",
|
|
@@ -2252,6 +2258,11 @@
|
|
|
2252
2258
|
"id": "typed gap, flex, alignment, and divider choices",
|
|
2253
2259
|
"owner": "application",
|
|
2254
2260
|
"required": false
|
|
2261
|
+
},
|
|
2262
|
+
{
|
|
2263
|
+
"id": "the accessible label and selection state of a multi-select grid",
|
|
2264
|
+
"owner": "application",
|
|
2265
|
+
"required": false
|
|
2255
2266
|
}
|
|
2256
2267
|
],
|
|
2257
2268
|
"wiring": {
|
|
@@ -2287,7 +2298,7 @@
|
|
|
2287
2298
|
},
|
|
2288
2299
|
"accessibility": {
|
|
2289
2300
|
"obligations": [
|
|
2290
|
-
"List adds layout only and no list role;
|
|
2301
|
+
"List adds layout only and no list role by default; selectionMode=\"multiple\" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.",
|
|
2291
2302
|
"Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
|
|
2292
2303
|
]
|
|
2293
2304
|
},
|
|
@@ -2740,6 +2751,11 @@
|
|
|
2740
2751
|
"id": "whether the item is a programmatic focus target",
|
|
2741
2752
|
"owner": "application",
|
|
2742
2753
|
"required": false
|
|
2754
|
+
},
|
|
2755
|
+
{
|
|
2756
|
+
"id": "the selection set and Shift/Cmd extension for multi-select rich cards",
|
|
2757
|
+
"owner": "application",
|
|
2758
|
+
"required": false
|
|
2743
2759
|
}
|
|
2744
2760
|
],
|
|
2745
2761
|
"wiring": {
|
|
@@ -2764,7 +2780,8 @@
|
|
|
2764
2780
|
"obligations": [
|
|
2765
2781
|
"An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role=\"region\").",
|
|
2766
2782
|
"focusTarget makes the item a programmatic focus target (tabindex=\"-1\", never a tab stop), such as a NavStack view's data-nav-focus target.",
|
|
2767
|
-
"The frame is decorative and never the only signal of state."
|
|
2783
|
+
"The frame is decorative and never the only signal of state.",
|
|
2784
|
+
"selectionMode=\"multiple\" renders a focusable row with aria-selected and a gridcell for nested controls; place it in a labeled List selectionMode=\"multiple\" grid. wireContentItems moves focus among rows with Up/Down and Home/End while nested controls retain those keys. Guard the app's delegated card action with isContentItemActivation so a nested control does not select the row."
|
|
2768
2785
|
]
|
|
2769
2786
|
},
|
|
2770
2787
|
"cssValueProps": [],
|
|
@@ -3237,7 +3254,8 @@
|
|
|
3237
3254
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
3238
3255
|
"Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.",
|
|
3239
3256
|
"Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
|
|
3240
|
-
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out."
|
|
3257
|
+
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.",
|
|
3258
|
+
"The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireTokenSearchFields focus the editor from a label click. The app validates required input."
|
|
3241
3259
|
]
|
|
3242
3260
|
},
|
|
3243
3261
|
"cssValueProps": [],
|
|
@@ -13,6 +13,7 @@ Render one self-contained .kui-content child that owns its 8px inline margin, re
|
|
|
13
13
|
- An ordinary surface-like child of a Pane or .kui-content stack needs the shared content-item geometry so its content edge lands at the standard 17px inset.
|
|
14
14
|
- A content item marks a real distinction and must read as visibly bounded: pass frame="framed" (the border is always reserved, so geometry does not change).
|
|
15
15
|
- A content item should follow a pill control's 22px radius: pass shape="pill".
|
|
16
|
+
- A selectable rich card needs nested controls: use selectionMode="multiple" inside a labeled List multi-select grid.
|
|
16
17
|
|
|
17
18
|
**Not when:**
|
|
18
19
|
|
|
@@ -44,6 +45,7 @@ Exact prop names and types: [`@kerfjs/ui/content-item`](../public-api-signatures
|
|
|
44
45
|
- pill item
|
|
45
46
|
- framed pill item
|
|
46
47
|
- named focus-target region
|
|
48
|
+
- multi-select rich grid row
|
|
47
49
|
|
|
48
50
|
## Composition
|
|
49
51
|
|
|
@@ -53,7 +55,7 @@ Exact prop names and types: [`@kerfjs/ui/content-item`](../public-api-signatures
|
|
|
53
55
|
|
|
54
56
|
## State and wiring
|
|
55
57
|
|
|
56
|
-
**The app owns:** the item content; whether the item marks a real distinction that warrants a visible frame; corner shape; region semantics and accessible name; whether the item is a programmatic focus target.
|
|
58
|
+
**The app owns:** the item content; whether the item marks a real distinction that warrants a visible frame; corner shape; region semantics and accessible name; whether the item is a programmatic focus target; the selection set and Shift/Cmd extension for multi-select rich cards.
|
|
57
59
|
|
|
58
60
|
No wiring helper.
|
|
59
61
|
|
|
@@ -68,6 +70,7 @@ Margin: self · border: self · padding: self (layout role: structure). `self` m
|
|
|
68
70
|
- An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role="region").
|
|
69
71
|
- focusTarget makes the item a programmatic focus target (tabindex="-1", never a tab stop), such as a NavStack view's data-nav-focus target.
|
|
70
72
|
- The frame is decorative and never the only signal of state.
|
|
73
|
+
- selectionMode="multiple" renders a focusable row with aria-selected and a gridcell for nested controls; place it in a labeled List selectionMode="multiple" grid. wireContentItems moves focus among rows with Up/Down and Home/End while nested controls retain those keys. Guard the app's delegated card action with isContentItemActivation so a nested control does not select the row.
|
|
71
74
|
|
|
72
75
|
## Styling boundary
|
|
73
76
|
|
package/ai/components/list.md
CHANGED
|
@@ -16,6 +16,7 @@ Standardize vertical component layout, optional physical-side text/control inset
|
|
|
16
16
|
- Use a finite flex keyword or the flex() builder when List participates in flexible layout.
|
|
17
17
|
- Apply the standard text or control inset to selected physical sides without an application wrapper.
|
|
18
18
|
- Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row.
|
|
19
|
+
- Use selectionMode="multiple" and ariaLabel to group selectable rich ContentItem rows in a multi-select grid.
|
|
19
20
|
|
|
20
21
|
**Not when:**
|
|
21
22
|
|
|
@@ -49,6 +50,7 @@ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#k
|
|
|
49
50
|
- fill: the layout root fills a definite-height parent
|
|
50
51
|
- rootAttributes: safe data-\* metadata on the root
|
|
51
52
|
- scroll dividers when named as wireScrollDividers targets chrome
|
|
53
|
+
- multi-select grid for rich ContentItem rows
|
|
52
54
|
|
|
53
55
|
**CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
|
|
54
56
|
|
|
@@ -64,7 +66,7 @@ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#k
|
|
|
64
66
|
|
|
65
67
|
## State and wiring
|
|
66
68
|
|
|
67
|
-
**The app owns:** child semantics and content; the bounded height needed for scrolling; typed gap, flex, alignment, and divider choices.
|
|
69
|
+
**The app owns:** child semantics and content; the bounded height needed for scrolling; typed gap, flex, alignment, and divider choices; the accessible label and selection state of a multi-select grid.
|
|
68
70
|
|
|
69
71
|
**Wiring:** `wireScrollDividers` is optional.
|
|
70
72
|
|
|
@@ -81,7 +83,7 @@ Margin: none · border: conditional · padding: conditional (layout role: naviga
|
|
|
81
83
|
|
|
82
84
|
## Accessibility
|
|
83
85
|
|
|
84
|
-
- List adds layout only and no list role;
|
|
86
|
+
- List adds layout only and no list role by default; selectionMode="multiple" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.
|
|
85
87
|
- Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll.
|
|
86
88
|
|
|
87
89
|
## Styling boundary
|
|
@@ -10,6 +10,7 @@ Token-controlled, optionally collapsible search editor with ordered, editable, r
|
|
|
10
10
|
|
|
11
11
|
- Combine DOM-owned free text with ordered editable/removable filter tokens in one searchbox.
|
|
12
12
|
- Enable collapsible mode when an empty, unfocused search should reduce to one iconic action, standalone or inside a toolbar group.
|
|
13
|
+
- Use presentation="form-field" for a structured search query beside Web Awesome form controls, with a visible label, optional hint, and required marker.
|
|
13
14
|
|
|
14
15
|
**Not when:**
|
|
15
16
|
|
|
@@ -40,6 +41,7 @@ Exact prop names and types: [`@kerfjs/ui/token-search-field`](../public-api-sign
|
|
|
40
41
|
- free text
|
|
41
42
|
- disabled
|
|
42
43
|
- collapsible standalone or toolbar composition
|
|
44
|
+
- visible form-field label, hint, and required marker
|
|
43
45
|
|
|
44
46
|
## Composition
|
|
45
47
|
|
|
@@ -79,6 +81,7 @@ Margin: none · border: self · padding: self (layout role: controls). `self` me
|
|
|
79
81
|
- Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.
|
|
80
82
|
- Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.
|
|
81
83
|
- In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.
|
|
84
|
+
- The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireTokenSearchFields focus the editor from a label click. The app validates required input.
|
|
82
85
|
|
|
83
86
|
## Styling boundary
|
|
84
87
|
|
|
@@ -77,6 +77,7 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
|
|
|
77
77
|
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
78
78
|
|
|
79
79
|
- `data-responsive-overlay-active` on `kui-workbench__rail and kui-workbench__drawer` (`wireWorkbench`): Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions.
|
|
80
|
+
- `data-numeric-overlays` on `kui-workbench` (`wireWorkbench`): Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active.
|
|
80
81
|
- `data-handle-inset` on `kui-workbench__rail` (`wireWorkbench`): Written by the shared resize wiring when the work-area minimum or a parent clamp holds a rail's maximum near its size. It carries no Workbench styling; the Workbench handle stays at the rail's inner edge.
|
|
81
82
|
- `data-resizing` on `kui-workbench__rail` (`wireWorkbench`): Present on a resizable rail or the drawer while a pointer drag resizes it.
|
|
82
83
|
- `data-scroll-overflow` on `kui-pane__content of each panel and work-area Pane` (`wireScrollDividers`): The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Public API signatures for the UI authoring corpus
|
|
2
2
|
|
|
3
|
-
Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.
|
|
3
|
+
Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.65` and `kerfjs@5.0.0-beta.65`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
|
|
4
4
|
|
|
5
5
|
## `@kerfjs/ui/css-values`
|
|
6
6
|
|
|
@@ -494,7 +494,8 @@ declare function closePopupMenu(menu: PopupMenuElement): void;
|
|
|
494
494
|
* `nestedDropdown`) or a `PopupSurface` sizes and insets it as usual. Items
|
|
495
495
|
* dispatch through delegated `data-action`s; the app owns the commands and any
|
|
496
496
|
* open-state reaction. Import `@kerfjs/ui/popup-menu/register` once to register
|
|
497
|
-
* the Web Awesome elements.
|
|
497
|
+
* the Web Awesome elements. At viewport widths up to 480px, submenus appear
|
|
498
|
+
* above or below their parent menu so their rows do not cover the parent list.
|
|
498
499
|
*/
|
|
499
500
|
declare function PopupMenu({ text, label, icon, items, placement, caret, disabled, rootAttributes, slot, context, }: PopupMenuProps): SafeHtml;
|
|
500
501
|
|
|
@@ -628,6 +629,10 @@ type ListRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
|
|
|
628
629
|
}>;
|
|
629
630
|
interface ListProps {
|
|
630
631
|
children?: KerfUiContent;
|
|
632
|
+
/** Make this list a labeled multi-select grid for `ContentItem selectionMode="multiple"` rows. */
|
|
633
|
+
selectionMode?: 'multiple';
|
|
634
|
+
/** Accessible name for the multi-select grid. */
|
|
635
|
+
ariaLabel?: string;
|
|
631
636
|
/** Use the standard item gap, a named UI spacing token, or a typed CSS length. Defaults to no gap. */
|
|
632
637
|
gap?: boolean | UiSpaceName | CssLength;
|
|
633
638
|
/** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
|
|
@@ -664,7 +669,7 @@ interface ListProps {
|
|
|
664
669
|
*/
|
|
665
670
|
type ListConfig = Pick<ListProps, 'gap' | 'hAlign' | 'vAlign' | 'dividerSides' | 'textInsets' | 'controlInsets'>;
|
|
666
671
|
/** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */
|
|
667
|
-
declare function List({ children, gap, flex, fill, hAlign, vAlign, scrollable, dividerSides, textInsets, controlInsets, className, rootAttributes, slot, }: ListProps): kerfjs.SafeHtml;
|
|
672
|
+
declare function List({ children, selectionMode, ariaLabel, gap, flex, fill, hAlign, vAlign, scrollable, dividerSides, textInsets, controlInsets, className, rootAttributes, slot, }: ListProps): kerfjs.SafeHtml;
|
|
668
673
|
|
|
669
674
|
export { CssFlex, CssFlexKeyword, CssLength, HorizontalAlignment, List, type ListConfig, type ListProps, ListVerticalAlignment, Sides, UiSpaceName };
|
|
670
675
|
```
|
|
@@ -877,8 +882,8 @@ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
|
877
882
|
type ContentItemFrame = 'none' | 'framed';
|
|
878
883
|
/** Corner shape: the 12px rounded rectangle or the 22px pill. */
|
|
879
884
|
type ContentItemShape = 'rounded' | 'pill';
|
|
880
|
-
/** `single` uses option
|
|
881
|
-
type ContentItemSelectionMode = 'none' | 'single' | 'toggle';
|
|
885
|
+
/** `single` uses an option; `multiple` uses a grid row; `toggle` uses a pressed button. */
|
|
886
|
+
type ContentItemSelectionMode = 'none' | 'single' | 'multiple' | 'toggle';
|
|
882
887
|
type ContentItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
|
|
883
888
|
'data-component'?: never;
|
|
884
889
|
}>;
|
|
@@ -901,8 +906,12 @@ interface ContentItemBaseProps {
|
|
|
901
906
|
* marks a real distinction. Defaults to `none` (transparent border).
|
|
902
907
|
*/
|
|
903
908
|
frame?: ContentItemFrame;
|
|
909
|
+
/** Remove block padding and block borders while retaining inline geometry. */
|
|
910
|
+
flush?: boolean;
|
|
904
911
|
/** Corner shape. Defaults to `rounded`. */
|
|
905
912
|
shape?: ContentItemShape;
|
|
913
|
+
/** Native hover tooltip. */
|
|
914
|
+
title?: string;
|
|
906
915
|
/**
|
|
907
916
|
* Names the item as a distinct region (`role="region"`). Omit it for an
|
|
908
917
|
* ordinary item, which stays a non-landmark grouping.
|
|
@@ -944,7 +953,7 @@ type ContentItemProps = ContentItemBaseProps & ({
|
|
|
944
953
|
* border (transparent unless `framed`), 8px padding, and a rounded or pill
|
|
945
954
|
* radius. It owns that whole geometry, so wrappers must not add more.
|
|
946
955
|
*/
|
|
947
|
-
declare function ContentItem({ children, frame, shape, ariaLabel, focusTarget, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
|
|
956
|
+
declare function ContentItem({ children, frame, flush, shape, title, ariaLabel, focusTarget, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
|
|
948
957
|
|
|
949
958
|
export { ContentItem, type ContentItemFrame, type ContentItemProps, type ContentItemSelectionMode, type ContentItemShape };
|
|
950
959
|
```
|
|
@@ -2391,7 +2400,7 @@ import 'lucide';
|
|
|
2391
2400
|
declare function Catalog({ id, brand, sections, active, content, collapsed, theme, headerActions, secondarySections, sidebarFooter, status, geometryOverlay, stageRootAttributes, selectAction, toggleSidebarAction, toggleThemeAction, toggleSecondaryAction, headerPlacement, footerPlacement, sidebar, mainToolbar, footerToolbar, className, slot, }: CatalogProps): kerfjs.SafeHtml;
|
|
2392
2401
|
|
|
2393
2402
|
/** How a specimen aligns its visible edge with its `ListHeader` label. */
|
|
2394
|
-
type CatalogExampleAlign = 'glyph' | 'inline-control' | 'none';
|
|
2403
|
+
type CatalogExampleAlign = 'glyph' | 'inline-control' | 'text-trigger' | 'none';
|
|
2395
2404
|
interface CatalogExampleViewport {
|
|
2396
2405
|
layout?: 'grid' | 'flex' | 'flex-column';
|
|
2397
2406
|
width?: 'full' | 'compact' | 'medium' | 'wide' | 'text' | 'control';
|
|
@@ -2905,14 +2914,14 @@ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
|
|
|
2905
2914
|
```ts
|
|
2906
2915
|
import 'kerfjs';
|
|
2907
2916
|
import './semantic-content-BbzjvSu9.js';
|
|
2908
|
-
export { T as TokenSearchEditorAttributes, a as TokenSearchField, b as TokenSearchFieldProps, c as TokenSearchFieldValue, j as TokenSearchToken, p as placeTokenSearchCaret, r as readTokenSearchField } from './token-search-field-
|
|
2917
|
+
export { T as TokenSearchEditorAttributes, a as TokenSearchField, b as TokenSearchFieldProps, c as TokenSearchFieldValue, j as TokenSearchToken, k as TokenSearchTrailingAction, p as placeTokenSearchCaret, r as readTokenSearchField } from './token-search-field-CVGwDn2y.js';
|
|
2909
2918
|
```
|
|
2910
2919
|
|
|
2911
2920
|
## `@kerfjs/ui/wire-token-search-fields`
|
|
2912
2921
|
|
|
2913
2922
|
```ts
|
|
2914
2923
|
import { Signal } from 'kerfjs';
|
|
2915
|
-
import { d as TokenSearchModel } from './token-search-field-
|
|
2924
|
+
import { d as TokenSearchModel } from './token-search-field-CVGwDn2y.js';
|
|
2916
2925
|
import './semantic-content-BbzjvSu9.js';
|
|
2917
2926
|
|
|
2918
2927
|
interface TokenSearchSubmit {
|
|
@@ -3379,6 +3388,7 @@ type GridRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
|
|
|
3379
3388
|
'data-component'?: never;
|
|
3380
3389
|
'data-columns'?: never;
|
|
3381
3390
|
'data-min-column-width'?: never;
|
|
3391
|
+
'data-auto-fill'?: never;
|
|
3382
3392
|
'data-flex'?: never;
|
|
3383
3393
|
'data-fill'?: never;
|
|
3384
3394
|
}>;
|
|
@@ -3404,13 +3414,16 @@ type GridProps = GridCommonProps & ({
|
|
|
3404
3414
|
/** Number of equal-width columns. Must be a positive safe integer. */
|
|
3405
3415
|
columns: number;
|
|
3406
3416
|
minColumnWidth?: never;
|
|
3417
|
+
autoFill?: never;
|
|
3407
3418
|
} | {
|
|
3408
3419
|
columns?: never;
|
|
3409
3420
|
/** Fit equal columns of at least this width; collapse as the container narrows. */
|
|
3410
3421
|
minColumnWidth: CssLength;
|
|
3422
|
+
/** Keep empty tracks instead of stretching a sparse row. Defaults to false. */
|
|
3423
|
+
autoFill?: boolean;
|
|
3411
3424
|
});
|
|
3412
3425
|
/** Render equal tracks with a fixed count or a responsive minimum width. */
|
|
3413
|
-
declare function Grid({ children, columns, minColumnWidth, gap, flex, fill, className, rootAttributes, slot, }: GridProps): kerfjs.SafeHtml;
|
|
3426
|
+
declare function Grid({ children, columns, minColumnWidth, autoFill, gap, flex, fill, className, rootAttributes, slot, }: GridProps): kerfjs.SafeHtml;
|
|
3414
3427
|
|
|
3415
3428
|
export { CssFlex, CssFlexKeyword, CssLength, Grid, type GridProps, UiSpaceName };
|
|
3416
3429
|
```
|
|
@@ -3442,6 +3455,6 @@ export { CssLength, Spacer, type SpacerProps, UiSpaceName };
|
|
|
3442
3455
|
|
|
3443
3456
|
```ts
|
|
3444
3457
|
import 'kerfjs';
|
|
3445
|
-
export { d as TokenSearchModel, e as TokenSearchModelOptions, f as TokenSearchResolvedToken, g as TokenSearchRule, h as TokenSearchState, i as TokenSearchSuggestion,
|
|
3458
|
+
export { d as TokenSearchModel, e as TokenSearchModelOptions, f as TokenSearchResolvedToken, g as TokenSearchRule, h as TokenSearchState, i as TokenSearchSuggestion, l as createTokenSearchModel } from './token-search-field-CVGwDn2y.js';
|
|
3446
3459
|
import './semantic-content-BbzjvSu9.js';
|
|
3447
3460
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Web Awesome JSX signatures for the UI authoring corpus
|
|
2
2
|
|
|
3
|
-
Generated from the emitted `@kerfjs/ui@5.0.0-beta.
|
|
3
|
+
Generated from the emitted `@kerfjs/ui@5.0.0-beta.65` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
6
|
import { KerfCustomElement } from 'kerfjs/jsx-runtime';
|
package/dist/catalog.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ import 'lucide';
|
|
|
25
25
|
declare function Catalog({ id, brand, sections, active, content, collapsed, theme, headerActions, secondarySections, sidebarFooter, status, geometryOverlay, stageRootAttributes, selectAction, toggleSidebarAction, toggleThemeAction, toggleSecondaryAction, headerPlacement, footerPlacement, sidebar, mainToolbar, footerToolbar, className, slot, }: CatalogProps): kerfjs.SafeHtml;
|
|
26
26
|
|
|
27
27
|
/** How a specimen aligns its visible edge with its `ListHeader` label. */
|
|
28
|
-
type CatalogExampleAlign = 'glyph' | 'inline-control' | 'none';
|
|
28
|
+
type CatalogExampleAlign = 'glyph' | 'inline-control' | 'text-trigger' | 'none';
|
|
29
29
|
interface CatalogExampleViewport {
|
|
30
30
|
layout?: 'grid' | 'flex' | 'flex-column';
|
|
31
31
|
width?: 'full' | 'compact' | 'medium' | 'wide' | 'text' | 'control';
|
package/dist/catalog.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Workbench } from './chunk-
|
|
1
|
+
import { Workbench } from './chunk-PWQAVNON.js';
|
|
2
2
|
|
|
3
|
-
import { PopupMenu } from './chunk-
|
|
3
|
+
import { PopupMenu } from './chunk-J3KGJ6P6.js';
|
|
4
4
|
|
|
5
5
|
import { Row } from './chunk-VZOFZPSO.js';
|
|
6
6
|
import { ListHeader } from './chunk-5IJ6UGNZ.js';
|
|
@@ -15,7 +15,7 @@ import { ToolbarText } from './chunk-V3DX3K65.js';
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
import { List } from './chunk-
|
|
18
|
+
import { List } from './chunk-W2AC6Q2A.js';
|
|
19
19
|
|
|
20
20
|
import { ToolbarControlGroup, ToolbarActionLink } from './chunk-NXWE5S57.js';
|
|
21
21
|
import { Toolbar } from './chunk-RGS4WX2M.js';
|