@kerfjs/ui 5.0.0-beta.53 → 5.0.0-beta.55
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/README.md +4 -2
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/component-catalog-v2.json +138 -5
- package/ai/component-catalog-v2.schema.json +2 -1
- package/ai/component-catalog.json +208 -16
- package/ai/public-api-signatures-v1.md +462 -39
- package/ai/skill.md +28 -20
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +48 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/dist/app-tab.d.ts +7 -5
- package/dist/app-tab.js +1 -1
- package/dist/browser/popup-menu.js +3 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +10 -4
- package/dist/catalog.js +243 -300
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-7IUSV4XG.js → chunk-24PHKUR3.js} +2 -2
- package/dist/chunk-24PHKUR3.js.map +1 -0
- package/dist/{chunk-EKYZCRCX.js → chunk-3CGQ7ZNO.js} +54 -22
- package/dist/chunk-3CGQ7ZNO.js.map +1 -0
- package/dist/{chunk-UKKSMZYT.js → chunk-46263QLK.js} +51 -1
- package/dist/chunk-46263QLK.js.map +1 -0
- package/dist/chunk-4BIMLITI.js +92 -0
- package/dist/chunk-4BIMLITI.js.map +1 -0
- package/dist/{chunk-NDUGJ4TU.js → chunk-5NDQABWK.js} +1 -1
- package/dist/{chunk-NDUGJ4TU.js.map → chunk-5NDQABWK.js.map} +1 -1
- package/dist/{chunk-ZK5EGVFP.js → chunk-5OLVUEND.js} +12 -2
- package/dist/chunk-5OLVUEND.js.map +1 -0
- package/dist/{chunk-CMUIXJZM.js → chunk-BSKEH3UC.js} +2 -2
- package/dist/{chunk-CMUIXJZM.js.map → chunk-BSKEH3UC.js.map} +1 -1
- package/dist/chunk-EAX2GSS4.js +384 -0
- package/dist/chunk-EAX2GSS4.js.map +1 -0
- package/dist/chunk-KH6VUGHU.js +399 -0
- package/dist/chunk-KH6VUGHU.js.map +1 -0
- package/dist/{chunk-BJJKFVWW.js → chunk-LZXQVUGN.js} +2 -2
- package/dist/chunk-LZXQVUGN.js.map +1 -0
- package/dist/chunk-N7FHFNT6.js +55 -0
- package/dist/chunk-N7FHFNT6.js.map +1 -0
- package/dist/{chunk-CCMKJWLX.js → chunk-NE5JAOQS.js} +7 -7
- package/dist/chunk-NE5JAOQS.js.map +1 -0
- package/dist/chunk-PSHUSWQH.js +18 -0
- package/dist/chunk-PSHUSWQH.js.map +1 -0
- package/dist/{chunk-KPNTVB7A.js → chunk-R754MHXX.js} +3 -3
- package/dist/{chunk-KPNTVB7A.js.map → chunk-R754MHXX.js.map} +1 -1
- package/dist/{chunk-HJKRCKDR.js → chunk-RNRUVPJ3.js} +4 -2
- package/dist/chunk-RNRUVPJ3.js.map +1 -0
- package/dist/{chunk-VOCPXGQN.js → chunk-VHADGP3B.js} +9 -8
- package/dist/chunk-VHADGP3B.js.map +1 -0
- package/dist/chunk-XQV2B4IL.js +14 -0
- package/dist/chunk-XQV2B4IL.js.map +1 -0
- package/dist/collapsible-panel.d.ts +46 -15
- package/dist/collapsible-panel.js +42 -10
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/floating-toolbar.d.ts +5 -2
- package/dist/floating-toolbar.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -18
- package/dist/list-header.js +1 -1
- package/dist/list-inset-text.d.ts +7 -1
- package/dist/list-inset-text.js +2 -1
- package/dist/panel-toolbar-BFQxFITu.d.ts +52 -0
- package/dist/popup-menu-register.d.ts +9 -0
- package/dist/popup-menu-register.js +30 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +71 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +4 -1
- package/dist/resizable-region.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog/components/catalog-example.css +0 -16
- package/dist/styles/catalog/components/catalog-stage.css +8 -13
- package/dist/styles/catalog/components/catalog.css +8 -18
- package/dist/styles/catalog.css +0 -5
- package/dist/styles/collapsible-panel.css +88 -10
- package/dist/styles/floating-toolbar.css +11 -6
- package/dist/styles/popup-menu.css +12 -0
- package/dist/styles/resizable-region.css +81 -13
- package/dist/styles/state-banner.css +13 -4
- package/dist/styles/styles.css +1 -0
- package/dist/styles/tab-bar.css +31 -3
- package/dist/styles/toolbar-control-group.css +13 -0
- package/dist/styles/toolbar.css +43 -2
- package/dist/styles/workbench.css +503 -10
- package/dist/text.js +1 -1
- package/dist/token-search-field.d.ts +10 -1
- package/dist/token-search-field.js +1 -1
- package/dist/{types-CEsieBZi.d.ts → types-D6vzj-VT.d.ts} +15 -0
- package/dist/wire-catalog.d.ts +13 -1
- package/dist/wire-catalog.js +18 -3
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-sidebar.js +6 -3
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-workbench.d.ts +109 -0
- package/dist/wire-workbench.js +6 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench.d.ts +166 -6
- package/dist/workbench.js +11 -104
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +66 -10
- package/docs/app-layouts.md +12 -1
- package/docs/catalog.md +27 -9
- package/docs/collapsible-panel.md +114 -1
- package/docs/component-contract.md +2 -2
- package/docs/component-selection.md +41 -23
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/document-baseline.md +4 -0
- package/docs/layout.md +10 -1
- package/docs/recipes.md +48 -39
- package/docs/surface-scaffold.md +1 -1
- package/docs/type-contracts.md +2 -1
- package/docs/ui-analyzer.md +94 -19
- package/docs/ui-doctor.md +6 -0
- package/docs/ux-demo.md +7 -3
- package/docs/webawesome-theme.md +11 -2
- package/docs/workbench.md +388 -8
- package/llms.txt +13 -8
- package/package.json +17 -2
- package/ux-demo/recipes/app-shell.tsx +141 -223
- package/ux-demo/recipes/collapsible-sidebar.tsx +48 -78
- package/ux-demo/recipes/list-detail-dialog.tsx +150 -54
- package/ux-demo/recipes/mount-recipe.ts +0 -5
- package/ux-demo/recipes/types.ts +0 -1
- package/dist/chunk-7IUSV4XG.js.map +0 -1
- package/dist/chunk-BJJKFVWW.js.map +0 -1
- package/dist/chunk-CCMKJWLX.js.map +0 -1
- package/dist/chunk-EKYZCRCX.js.map +0 -1
- package/dist/chunk-HJKRCKDR.js.map +0 -1
- package/dist/chunk-UKKSMZYT.js.map +0 -1
- package/dist/chunk-VOCPXGQN.js.map +0 -1
- package/dist/chunk-ZK5EGVFP.js.map +0 -1
- package/dist/styles/catalog/components/catalog-detail.css +0 -35
- package/dist/styles/catalog/components/catalog-resource-footer.css +0 -37
- package/dist/styles/catalog/components/catalog-secondary-sections.css +0 -38
- package/dist/styles/catalog/components/catalog-section-list.css +0 -22
- package/dist/styles/catalog/components/catalog-sidebar.css +0 -82
package/README.md
CHANGED
|
@@ -184,6 +184,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
|
|
|
184
184
|
| `ToolbarControlGroup`, `ToolbarActionLink` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
|
|
185
185
|
| `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
|
|
186
186
|
| `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
|
|
187
|
+
| `PopupMenu` (register with `@kerfjs/ui/popup-menu/register`) | `@kerfjs/ui/popup-menu` | `@kerfjs/ui/popup-menu.css` |
|
|
187
188
|
| `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
|
|
188
189
|
| `Text` | `@kerfjs/ui/text` | `@kerfjs/ui/text.css` |
|
|
189
190
|
| `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
|
|
@@ -203,6 +204,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
|
|
|
203
204
|
| `TabScaffold` | `@kerfjs/ui/tab-scaffold` | `@kerfjs/ui/tab-scaffold.css` |
|
|
204
205
|
| `wireTabScaffold` | `@kerfjs/ui/wire-tab-scaffold` | — |
|
|
205
206
|
| `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
|
|
207
|
+
| `wireWorkbench` | `@kerfjs/ui/wire-workbench` | — |
|
|
206
208
|
| `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
|
|
207
209
|
| `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
|
|
208
210
|
| Content and navigation composition | — | `@kerfjs/ui/layout.css` |
|
|
@@ -245,7 +247,7 @@ onto another trailing-aligned row under every `responsive` policy, and a
|
|
|
245
247
|
same way. Wrapping keeps every command visible at its full 44px target without
|
|
246
248
|
moving focus or DOM identity. When a product wants fewer visible commands at
|
|
247
249
|
narrow widths, it chooses them: render a lower-priority command inside an
|
|
248
|
-
app-owned "More"
|
|
250
|
+
app-owned "More" `PopupMenu` (in a `single` group with `nestedDropdown`).
|
|
249
251
|
|
|
250
252
|
`DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
|
|
251
253
|
`--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
|
|
@@ -644,7 +646,7 @@ import "@kerfjs/ui/webawesome.css";
|
|
|
644
646
|
import "@kerfjs/ui/select/register";
|
|
645
647
|
```
|
|
646
648
|
|
|
647
|
-
That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
|
|
649
|
+
That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it. `PopupMenu` follows the same rule: import `@kerfjs/ui/popup-menu/register` once to register the dropdown, item, button, and divider elements it renders.
|
|
648
650
|
Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
|
|
649
651
|
nonempty visible label takes precedence when both are supplied. Kerf names the
|
|
650
652
|
actual shadow combobox without adding visible label spacing; this also works
|
|
@@ -329,6 +329,64 @@
|
|
|
329
329
|
"composition": "generated-permissive-default"
|
|
330
330
|
}
|
|
331
331
|
},
|
|
332
|
+
{
|
|
333
|
+
"key": "@kerfjs/ui:document-baseline",
|
|
334
|
+
"package": "@kerfjs/ui",
|
|
335
|
+
"id": "document-baseline",
|
|
336
|
+
"name": "Document baseline",
|
|
337
|
+
"kind": "composition",
|
|
338
|
+
"source": "kerf",
|
|
339
|
+
"parents": { "mode": "any", "entries": [] },
|
|
340
|
+
"contexts": ["application-ui"],
|
|
341
|
+
"zones": [],
|
|
342
|
+
"children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
|
|
343
|
+
"state": [
|
|
344
|
+
{
|
|
345
|
+
"id": "the one direct mount container",
|
|
346
|
+
"owner": "application",
|
|
347
|
+
"required": false
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"id": "application overrides loaded after the baseline",
|
|
351
|
+
"owner": "application",
|
|
352
|
+
"required": false
|
|
353
|
+
}
|
|
354
|
+
],
|
|
355
|
+
"wiring": {
|
|
356
|
+
"required": false,
|
|
357
|
+
"helpers": [],
|
|
358
|
+
"obligations": [],
|
|
359
|
+
"stateAttributes": []
|
|
360
|
+
},
|
|
361
|
+
"responsive": { "owner": "not-applicable", "behaviors": [] },
|
|
362
|
+
"layout": {
|
|
363
|
+
"roles": ["foundation"],
|
|
364
|
+
"geometry": {
|
|
365
|
+
"margin": "none",
|
|
366
|
+
"border": "none",
|
|
367
|
+
"padding": "none",
|
|
368
|
+
"notes": [
|
|
369
|
+
"The body margin is removed; .kui-app-root only sets height: 100% and owns no inset."
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
"accessibility": {
|
|
374
|
+
"obligations": [
|
|
375
|
+
"Links keep the semantic link color at zero specificity so application focus and link styles still apply."
|
|
376
|
+
]
|
|
377
|
+
},
|
|
378
|
+
"cssValueProps": [],
|
|
379
|
+
"boundaries": {
|
|
380
|
+
"rootClass": "kui-app-root",
|
|
381
|
+
"publicClasses": ["kui-app-root"],
|
|
382
|
+
"publicTokens": []
|
|
383
|
+
},
|
|
384
|
+
"diagnostics": [],
|
|
385
|
+
"provenance": {
|
|
386
|
+
"selection": "ai/component-catalog.json",
|
|
387
|
+
"composition": "generated-permissive-default"
|
|
388
|
+
}
|
|
389
|
+
},
|
|
332
390
|
{
|
|
333
391
|
"key": "@kerfjs/ui:layout",
|
|
334
392
|
"package": "@kerfjs/ui",
|
|
@@ -887,9 +945,22 @@
|
|
|
887
945
|
],
|
|
888
946
|
"wiring": {
|
|
889
947
|
"required": false,
|
|
890
|
-
"helpers": [],
|
|
948
|
+
"helpers": ["wireWorkbench"],
|
|
891
949
|
"obligations": [],
|
|
892
|
-
"stateAttributes": [
|
|
950
|
+
"stateAttributes": [
|
|
951
|
+
{
|
|
952
|
+
"name": "data-handle-inset",
|
|
953
|
+
"on": "kui-workbench__rail",
|
|
954
|
+
"helper": "wireWorkbench",
|
|
955
|
+
"meaning": "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."
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
"name": "data-resizing",
|
|
959
|
+
"on": "kui-workbench__rail",
|
|
960
|
+
"helper": "wireWorkbench",
|
|
961
|
+
"meaning": "Present on a resizable rail or the drawer while a pointer drag resizes it."
|
|
962
|
+
}
|
|
963
|
+
]
|
|
893
964
|
},
|
|
894
965
|
"responsive": { "owner": "not-applicable", "behaviors": [] },
|
|
895
966
|
"layout": {
|
|
@@ -906,7 +977,10 @@
|
|
|
906
977
|
"accessibility": {
|
|
907
978
|
"obligations": [
|
|
908
979
|
"Give the Workbench and each meaningful rail or drawer an accessible label.",
|
|
909
|
-
"Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control."
|
|
980
|
+
"Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control.",
|
|
981
|
+
"A resizable panel's separator is a focusable role=\"separator\" with its size in aria-valuenow and limits in aria-valuemin/aria-valuemax; arrow keys resize by 16px, Shift+arrow by 64px, and Home/End jump to the limits. It leaves the tab order while its panel is collapsed or not inline.",
|
|
982
|
+
"Given a panel's collapsed signal, wireWorkbench closes an open overlay panel on Escape or an outside press and, however the panel closed, returns focus stranded inside it to the control that opened it, else to its restore control.",
|
|
983
|
+
"An overlay panel can cover the toolbar toggle that opened it (a narrow right rail covers an editor toolbar's trailing toggle), so give every panel that may overlay its own close control in its header: a Pane header Toolbar with a single ToolbarControlGroup around the collapsiblePanelToggleIcon(side, false) button."
|
|
910
984
|
]
|
|
911
985
|
},
|
|
912
986
|
"cssValueProps": [],
|
|
@@ -921,6 +995,8 @@
|
|
|
921
995
|
"kui-workbench__center",
|
|
922
996
|
"kui-workbench__main",
|
|
923
997
|
"kui-workbench__panel-content",
|
|
998
|
+
"kui-workbench__handle",
|
|
999
|
+
"kui-workbench__handle-icon",
|
|
924
1000
|
"kui-workbench__restore"
|
|
925
1001
|
],
|
|
926
1002
|
"publicTokens": [
|
|
@@ -930,8 +1006,9 @@
|
|
|
930
1006
|
"--kui-workbench-overlay-z",
|
|
931
1007
|
"--kui-workbench-overlay-max-width",
|
|
932
1008
|
"--kui-workbench-overlay-max-height",
|
|
1009
|
+
"--kui-workbench-restore-inset",
|
|
933
1010
|
"--kui-workbench-restore-z",
|
|
934
|
-
"--kui-workbench-
|
|
1011
|
+
"--kui-workbench-overlay-dismiss-margin"
|
|
935
1012
|
]
|
|
936
1013
|
},
|
|
937
1014
|
"diagnostics": [],
|
|
@@ -1035,8 +1112,8 @@
|
|
|
1035
1112
|
"--kui-collapsible-panel-height",
|
|
1036
1113
|
"--kui-collapsible-panel-popup-z",
|
|
1037
1114
|
"--kui-collapsible-panel-overlay-z",
|
|
1038
|
-
"--kui-collapsible-panel-restore-z",
|
|
1039
1115
|
"--kui-collapsible-panel-restore-inset",
|
|
1116
|
+
"--kui-collapsible-panel-restore-z",
|
|
1040
1117
|
"--kui-collapsible-panel-backdrop-z"
|
|
1041
1118
|
]
|
|
1042
1119
|
},
|
|
@@ -2979,6 +3056,62 @@
|
|
|
2979
3056
|
"composition": "README.md#web-awesome-theme"
|
|
2980
3057
|
}
|
|
2981
3058
|
},
|
|
3059
|
+
{
|
|
3060
|
+
"key": "@kerfjs/ui:popup-menu",
|
|
3061
|
+
"package": "@kerfjs/ui",
|
|
3062
|
+
"id": "popup-menu",
|
|
3063
|
+
"name": "PopupMenu",
|
|
3064
|
+
"kind": "component",
|
|
3065
|
+
"source": "kerf",
|
|
3066
|
+
"parents": { "mode": "any", "entries": [] },
|
|
3067
|
+
"contexts": ["application-ui"],
|
|
3068
|
+
"zones": [],
|
|
3069
|
+
"children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
|
|
3070
|
+
"state": [
|
|
3071
|
+
{
|
|
3072
|
+
"id": "commands and their delegated actions",
|
|
3073
|
+
"owner": "application",
|
|
3074
|
+
"required": false
|
|
3075
|
+
},
|
|
3076
|
+
{
|
|
3077
|
+
"id": "which items are enabled",
|
|
3078
|
+
"owner": "application",
|
|
3079
|
+
"required": false
|
|
3080
|
+
},
|
|
3081
|
+
{
|
|
3082
|
+
"id": "reactions to the menu opening or closing",
|
|
3083
|
+
"owner": "application",
|
|
3084
|
+
"required": false
|
|
3085
|
+
}
|
|
3086
|
+
],
|
|
3087
|
+
"wiring": {
|
|
3088
|
+
"required": false,
|
|
3089
|
+
"helpers": [],
|
|
3090
|
+
"obligations": [],
|
|
3091
|
+
"stateAttributes": []
|
|
3092
|
+
},
|
|
3093
|
+
"responsive": { "owner": "not-applicable", "behaviors": [] },
|
|
3094
|
+
"layout": {
|
|
3095
|
+
"roles": ["controls"],
|
|
3096
|
+
"geometry": { "margin": "none", "border": "child", "padding": "child" }
|
|
3097
|
+
},
|
|
3098
|
+
"accessibility": {
|
|
3099
|
+
"obligations": [
|
|
3100
|
+
"An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. Web Awesome provides menu roles, arrow-key navigation, typeahead, and Escape."
|
|
3101
|
+
]
|
|
3102
|
+
},
|
|
3103
|
+
"cssValueProps": [],
|
|
3104
|
+
"boundaries": {
|
|
3105
|
+
"rootClass": "kui-popup-menu",
|
|
3106
|
+
"publicClasses": ["kui-popup-menu", "kui-popup-menu__label"],
|
|
3107
|
+
"publicTokens": []
|
|
3108
|
+
},
|
|
3109
|
+
"diagnostics": [],
|
|
3110
|
+
"provenance": {
|
|
3111
|
+
"selection": "ai/component-catalog.json",
|
|
3112
|
+
"composition": "generated-permissive-default"
|
|
3113
|
+
}
|
|
3114
|
+
},
|
|
2982
3115
|
{
|
|
2983
3116
|
"key": "@kerfjs/ui:feedback",
|
|
2984
3117
|
"package": "@kerfjs/ui",
|
|
@@ -137,10 +137,11 @@
|
|
|
137
137
|
"kind": { "enum": ["component", "composition", "recipe"] },
|
|
138
138
|
"purpose": { "type": "string", "minLength": 1 },
|
|
139
139
|
"publicExports": {
|
|
140
|
+
"description": "Each export's name and the package.json#exports subpath that serves it. An entry from a private application omits subpath: the application is bundled, never imported by package name, so the name resolves through the entry's source file.",
|
|
140
141
|
"type": "array",
|
|
141
142
|
"items": {
|
|
142
143
|
"type": "object",
|
|
143
|
-
"required": ["name"
|
|
144
|
+
"required": ["name"],
|
|
144
145
|
"properties": {
|
|
145
146
|
"name": { "type": "string", "minLength": 1 },
|
|
146
147
|
"subpath": { "type": "string", "pattern": "^\\." }
|
|
@@ -353,6 +353,67 @@
|
|
|
353
353
|
"recipe": "docs/component-selection.md#foundation-tokens"
|
|
354
354
|
}
|
|
355
355
|
},
|
|
356
|
+
{
|
|
357
|
+
"id": "document-baseline",
|
|
358
|
+
"name": "Document baseline",
|
|
359
|
+
"category": "Foundation",
|
|
360
|
+
"kind": "composition",
|
|
361
|
+
"source": "kerf",
|
|
362
|
+
"description": "Opt-in document-level defaults: border-box sizing, body margin/font/surface, link color, and the html → body → .kui-app-root full-height chain.",
|
|
363
|
+
"uses": [],
|
|
364
|
+
"purpose": "Let an application opt into Kerf UI-owned document defaults and a definite full-height chain for a percentage-height application shell.",
|
|
365
|
+
"publicExports": [],
|
|
366
|
+
"useWhen": [
|
|
367
|
+
"An application wants Kerf UI to own document-level box sizing, body typography, surface, and link color.",
|
|
368
|
+
"A full-height shell (Workbench, SplitView, NavStack, or TabScaffold) mounts into one direct container: put .kui-app-root on that container."
|
|
369
|
+
],
|
|
370
|
+
"avoidWhen": [
|
|
371
|
+
"Do not put .kui-app-root on several sibling containers; each requests the full available document height.",
|
|
372
|
+
"Do not import it where the host page already owns document-level defaults it would override."
|
|
373
|
+
],
|
|
374
|
+
"alternatives": [
|
|
375
|
+
{
|
|
376
|
+
"id": "foundation",
|
|
377
|
+
"relationship": "composes-with",
|
|
378
|
+
"when": "Import the foundation tokens the baseline reads; the baseline itself adds only global document selectors."
|
|
379
|
+
}
|
|
380
|
+
],
|
|
381
|
+
"appOwns": [
|
|
382
|
+
"the one direct mount container",
|
|
383
|
+
"application overrides loaded after the baseline"
|
|
384
|
+
],
|
|
385
|
+
"variants": [
|
|
386
|
+
"document-flow page (no .kui-app-root)",
|
|
387
|
+
"full-height application root"
|
|
388
|
+
],
|
|
389
|
+
"accessibility": [
|
|
390
|
+
"Links keep the semantic link color at zero specificity so application focus and link styles still apply."
|
|
391
|
+
],
|
|
392
|
+
"geometry": {
|
|
393
|
+
"margin": "none",
|
|
394
|
+
"border": "none",
|
|
395
|
+
"padding": "none",
|
|
396
|
+
"notes": [
|
|
397
|
+
"The body margin is removed; .kui-app-root only sets height: 100% and owns no inset."
|
|
398
|
+
]
|
|
399
|
+
},
|
|
400
|
+
"delivery": {
|
|
401
|
+
"manualCssImport": "@kerfjs/ui/document.css",
|
|
402
|
+
"sideEffects": [
|
|
403
|
+
"css"
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
"wiring": [],
|
|
407
|
+
"publicClasses": [
|
|
408
|
+
"kui-app-root"
|
|
409
|
+
],
|
|
410
|
+
"publicTokens": [],
|
|
411
|
+
"links": {
|
|
412
|
+
"catalogRoute": "?component=document-baseline",
|
|
413
|
+
"documentation": "docs/document-baseline.md",
|
|
414
|
+
"recipe": "docs/document-baseline.md"
|
|
415
|
+
}
|
|
416
|
+
},
|
|
356
417
|
{
|
|
357
418
|
"id": "layout",
|
|
358
419
|
"name": "Application layout",
|
|
@@ -851,20 +912,30 @@
|
|
|
851
912
|
"category": "Structure",
|
|
852
913
|
"kind": "component",
|
|
853
914
|
"source": "kerf",
|
|
854
|
-
"description": "A desktop-class multi-panel workspace with independently collapsible left and right rails and a bottom drawer around one central work area.",
|
|
915
|
+
"description": "A desktop-class multi-panel workspace with independently collapsible, optionally drag-resizable left and right rails and a bottom drawer around one central work area.",
|
|
855
916
|
"uses": [],
|
|
856
917
|
"purpose": "Arrange a complex tool or editor as a stable central work area with optional peripheral rails and a bottom drawer.",
|
|
857
918
|
"publicExports": [
|
|
858
919
|
"Workbench",
|
|
920
|
+
"WorkbenchChromePlacement",
|
|
921
|
+
"WorkbenchCompactOverlay",
|
|
922
|
+
"WorkbenchMainBottomToolbar",
|
|
923
|
+
"WorkbenchMainToolbar",
|
|
859
924
|
"WorkbenchPanel",
|
|
860
|
-
"
|
|
925
|
+
"WorkbenchPanelResizable",
|
|
926
|
+
"WorkbenchPanelToggle",
|
|
927
|
+
"WorkbenchPanelToolbar",
|
|
928
|
+
"WorkbenchProps",
|
|
929
|
+
"WorkbenchResponsiveOverlayAt"
|
|
861
930
|
],
|
|
862
931
|
"useWhen": [
|
|
863
|
-
"A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions."
|
|
932
|
+
"A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions.",
|
|
933
|
+
"A desktop-class tool should let people size its peripheral panels by dragging or with the keyboard; opt each panel in with resizable and wire it with wireWorkbench."
|
|
864
934
|
],
|
|
865
935
|
"avoidWhen": [
|
|
866
936
|
"Do not shrink the full multi-panel shell onto compact devices; present peripheral content through NavStack or overlay drawers instead.",
|
|
867
|
-
"Do not use Workbench for one standalone collapsible rail or drawer; use CollapsiblePanel."
|
|
937
|
+
"Do not use Workbench for one standalone collapsible rail or drawer; use CollapsiblePanel.",
|
|
938
|
+
"Do not offer resizing where rails present as compact overlay drawers or are replaced; set a panel's responsiveOverlayAt, or pass deviceClass so wireWorkbench suspends resizing on compact classes."
|
|
868
939
|
],
|
|
869
940
|
"alternatives": [
|
|
870
941
|
{
|
|
@@ -887,6 +958,10 @@
|
|
|
887
958
|
"bottom drawer",
|
|
888
959
|
"all panels",
|
|
889
960
|
"independently collapsed panels",
|
|
961
|
+
"opt-in drag and keyboard resizable panels with min/max limits",
|
|
962
|
+
"resizable rails that leave the work area a minimum width and shrink in proportion when the Workbench narrows",
|
|
963
|
+
"rails or a drawer that present as overlays below a narrow or compact Workbench container breakpoint",
|
|
964
|
+
"transient overlay panels wired with wireWorkbench: collapsed on entering the breakpoint, closed by Escape or an outside press",
|
|
890
965
|
"hidden separator",
|
|
891
966
|
"slide, fade-slide, or instant content",
|
|
892
967
|
"clipped, scrolling, or popup-visible content",
|
|
@@ -896,7 +971,10 @@
|
|
|
896
971
|
],
|
|
897
972
|
"accessibility": [
|
|
898
973
|
"Give the Workbench and each meaningful rail or drawer an accessible label.",
|
|
899
|
-
"Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control."
|
|
974
|
+
"Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control.",
|
|
975
|
+
"A resizable panel's separator is a focusable role=\"separator\" with its size in aria-valuenow and limits in aria-valuemin/aria-valuemax; arrow keys resize by 16px, Shift+arrow by 64px, and Home/End jump to the limits. It leaves the tab order while its panel is collapsed or not inline.",
|
|
976
|
+
"Given a panel's collapsed signal, wireWorkbench closes an open overlay panel on Escape or an outside press and, however the panel closed, returns focus stranded inside it to the control that opened it, else to its restore control.",
|
|
977
|
+
"An overlay panel can cover the toolbar toggle that opened it (a narrow right rail covers an editor toolbar's trailing toggle), so give every panel that may overlay its own close control in its header: a Pane header Toolbar with a single ToolbarControlGroup around the collapsiblePanelToggleIcon(side, false) button."
|
|
900
978
|
],
|
|
901
979
|
"geometry": {
|
|
902
980
|
"margin": "none",
|
|
@@ -913,7 +991,25 @@
|
|
|
913
991
|
"manual-css"
|
|
914
992
|
]
|
|
915
993
|
},
|
|
916
|
-
"wiring": [
|
|
994
|
+
"wiring": [
|
|
995
|
+
{
|
|
996
|
+
"export": "wireWorkbench",
|
|
997
|
+
"import": "@kerfjs/ui/wire-workbench",
|
|
998
|
+
"required": false,
|
|
999
|
+
"stateAttributes": [
|
|
1000
|
+
{
|
|
1001
|
+
"name": "data-handle-inset",
|
|
1002
|
+
"on": "kui-workbench__rail",
|
|
1003
|
+
"meaning": "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."
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
"name": "data-resizing",
|
|
1007
|
+
"on": "kui-workbench__rail",
|
|
1008
|
+
"meaning": "Present on a resizable rail or the drawer while a pointer drag resizes it."
|
|
1009
|
+
}
|
|
1010
|
+
]
|
|
1011
|
+
}
|
|
1012
|
+
],
|
|
917
1013
|
"publicClasses": [
|
|
918
1014
|
"kui-workbench",
|
|
919
1015
|
"kui-workbench__rail",
|
|
@@ -923,6 +1019,8 @@
|
|
|
923
1019
|
"kui-workbench__center",
|
|
924
1020
|
"kui-workbench__main",
|
|
925
1021
|
"kui-workbench__panel-content",
|
|
1022
|
+
"kui-workbench__handle",
|
|
1023
|
+
"kui-workbench__handle-icon",
|
|
926
1024
|
"kui-workbench__restore"
|
|
927
1025
|
],
|
|
928
1026
|
"publicTokens": [
|
|
@@ -932,8 +1030,9 @@
|
|
|
932
1030
|
"--kui-workbench-overlay-z",
|
|
933
1031
|
"--kui-workbench-overlay-max-width",
|
|
934
1032
|
"--kui-workbench-overlay-max-height",
|
|
1033
|
+
"--kui-workbench-restore-inset",
|
|
935
1034
|
"--kui-workbench-restore-z",
|
|
936
|
-
"--kui-workbench-
|
|
1035
|
+
"--kui-workbench-overlay-dismiss-margin"
|
|
937
1036
|
],
|
|
938
1037
|
"links": {
|
|
939
1038
|
"catalogRoute": "?component=workbench",
|
|
@@ -955,10 +1054,14 @@
|
|
|
955
1054
|
"publicExports": [
|
|
956
1055
|
"CollapsiblePanelSide",
|
|
957
1056
|
"collapsiblePanelToggleIcon",
|
|
1057
|
+
"CollapsiblePanelToolbarToggle",
|
|
1058
|
+
"CollapsiblePanelToolbar",
|
|
958
1059
|
"CollapsiblePanelToggleProps",
|
|
959
1060
|
"CollapsiblePanelToggle",
|
|
960
1061
|
"CollapsiblePanelProps",
|
|
961
|
-
"CollapsiblePanel"
|
|
1062
|
+
"CollapsiblePanel",
|
|
1063
|
+
"CollapsiblePanelRelocatedProps",
|
|
1064
|
+
"CollapsiblePanelRelocated"
|
|
962
1065
|
],
|
|
963
1066
|
"useWhen": [
|
|
964
1067
|
"An application needs one collapsible side rail or bottom drawer outside a full Workbench.",
|
|
@@ -1057,8 +1160,8 @@
|
|
|
1057
1160
|
"--kui-collapsible-panel-height",
|
|
1058
1161
|
"--kui-collapsible-panel-popup-z",
|
|
1059
1162
|
"--kui-collapsible-panel-overlay-z",
|
|
1060
|
-
"--kui-collapsible-panel-restore-z",
|
|
1061
1163
|
"--kui-collapsible-panel-restore-inset",
|
|
1164
|
+
"--kui-collapsible-panel-restore-z",
|
|
1062
1165
|
"--kui-collapsible-panel-backdrop-z"
|
|
1063
1166
|
],
|
|
1064
1167
|
"links": {
|
|
@@ -3241,6 +3344,7 @@
|
|
|
3241
3344
|
"tokens",
|
|
3242
3345
|
"query execution",
|
|
3243
3346
|
"results",
|
|
3347
|
+
"the revision that rebuilds the DOM-owned editor for a programmatic text replacement",
|
|
3244
3348
|
"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)"
|
|
3245
3349
|
],
|
|
3246
3350
|
"variants": [
|
|
@@ -3492,7 +3596,10 @@
|
|
|
3492
3596
|
"canonicalShorthands": [],
|
|
3493
3597
|
"exceptionalShorthands": [],
|
|
3494
3598
|
"rawPolicy": "forbid",
|
|
3495
|
-
"examples": [
|
|
3599
|
+
"examples": [
|
|
3600
|
+
"color: uiColor(\"success-on-quiet\")",
|
|
3601
|
+
"color: foregroundColorVar(\"--app-choice-color\")"
|
|
3602
|
+
]
|
|
3496
3603
|
}
|
|
3497
3604
|
],
|
|
3498
3605
|
"useWhen": [
|
|
@@ -3583,6 +3690,85 @@
|
|
|
3583
3690
|
"recipe": "docs/component-selection.md#web-awesome-overlap-policy"
|
|
3584
3691
|
}
|
|
3585
3692
|
},
|
|
3693
|
+
{
|
|
3694
|
+
"id": "popup-menu",
|
|
3695
|
+
"name": "PopupMenu",
|
|
3696
|
+
"category": "Controls",
|
|
3697
|
+
"kind": "component",
|
|
3698
|
+
"source": "kerf",
|
|
3699
|
+
"description": "A trigger button that opens a typed list of commands, built on the Web Awesome dropdown.",
|
|
3700
|
+
"uses": [
|
|
3701
|
+
"wa-dropdown",
|
|
3702
|
+
"wa-dropdown-item",
|
|
3703
|
+
"wa-button",
|
|
3704
|
+
"wa-divider"
|
|
3705
|
+
],
|
|
3706
|
+
"purpose": "A trigger button that opens a typed list of commands, built on the Web Awesome dropdown.",
|
|
3707
|
+
"publicExports": [
|
|
3708
|
+
"PopupMenu"
|
|
3709
|
+
],
|
|
3710
|
+
"useWhen": [
|
|
3711
|
+
"Offer a short list of commands behind one trigger, such as a toolbar sort or More menu.",
|
|
3712
|
+
"Group related commands under headings and dividers in one popup."
|
|
3713
|
+
],
|
|
3714
|
+
"avoidWhen": [
|
|
3715
|
+
"Do not use it to choose a persistent value (use Select) or for navigation rows (use ListItem).",
|
|
3716
|
+
"Do not hand-write wa-dropdown / wa-dropdown-item markup for an action menu; use PopupMenu."
|
|
3717
|
+
],
|
|
3718
|
+
"alternatives": [
|
|
3719
|
+
{
|
|
3720
|
+
"id": "select",
|
|
3721
|
+
"relationship": "nearest"
|
|
3722
|
+
},
|
|
3723
|
+
{
|
|
3724
|
+
"id": "wa-dropdown",
|
|
3725
|
+
"relationship": "prefer-over"
|
|
3726
|
+
}
|
|
3727
|
+
],
|
|
3728
|
+
"appOwns": [
|
|
3729
|
+
"commands and their delegated actions",
|
|
3730
|
+
"which items are enabled",
|
|
3731
|
+
"reactions to the menu opening or closing"
|
|
3732
|
+
],
|
|
3733
|
+
"variants": [
|
|
3734
|
+
"icon trigger",
|
|
3735
|
+
"text trigger",
|
|
3736
|
+
"icon and text trigger",
|
|
3737
|
+
"headings and dividers",
|
|
3738
|
+
"item icons",
|
|
3739
|
+
"disabled items",
|
|
3740
|
+
"placement"
|
|
3741
|
+
],
|
|
3742
|
+
"accessibility": [
|
|
3743
|
+
"An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. Web Awesome provides menu roles, arrow-key navigation, typeahead, and Escape."
|
|
3744
|
+
],
|
|
3745
|
+
"geometry": {
|
|
3746
|
+
"margin": "none",
|
|
3747
|
+
"border": "child",
|
|
3748
|
+
"padding": "child"
|
|
3749
|
+
},
|
|
3750
|
+
"delivery": {
|
|
3751
|
+
"browserImport": "@kerfjs/ui/popup-menu",
|
|
3752
|
+
"manualCssImport": "@kerfjs/ui/popup-menu.css",
|
|
3753
|
+
"registrationImport": "@kerfjs/ui/popup-menu/register",
|
|
3754
|
+
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
3755
|
+
"sideEffects": [
|
|
3756
|
+
"browser-condition-css",
|
|
3757
|
+
"custom-element-registration"
|
|
3758
|
+
]
|
|
3759
|
+
},
|
|
3760
|
+
"wiring": [],
|
|
3761
|
+
"publicClasses": [
|
|
3762
|
+
"kui-popup-menu",
|
|
3763
|
+
"kui-popup-menu__label"
|
|
3764
|
+
],
|
|
3765
|
+
"publicTokens": [],
|
|
3766
|
+
"links": {
|
|
3767
|
+
"catalogRoute": "?component=popup-menu",
|
|
3768
|
+
"documentation": "docs/component-selection.md",
|
|
3769
|
+
"recipe": "docs/component-selection.md#web-awesome-overlap-policy"
|
|
3770
|
+
}
|
|
3771
|
+
},
|
|
3586
3772
|
{
|
|
3587
3773
|
"id": "feedback",
|
|
3588
3774
|
"name": "Feedback",
|
|
@@ -4235,6 +4421,10 @@
|
|
|
4235
4421
|
],
|
|
4236
4422
|
"recommendation": "conditional",
|
|
4237
4423
|
"alternatives": [
|
|
4424
|
+
{
|
|
4425
|
+
"id": "popup-menu",
|
|
4426
|
+
"relationship": "prefer-kerf"
|
|
4427
|
+
},
|
|
4238
4428
|
{
|
|
4239
4429
|
"id": "select",
|
|
4240
4430
|
"relationship": "prefer-kerf"
|
|
@@ -4278,6 +4468,10 @@
|
|
|
4278
4468
|
],
|
|
4279
4469
|
"recommendation": "conditional",
|
|
4280
4470
|
"alternatives": [
|
|
4471
|
+
{
|
|
4472
|
+
"id": "popup-menu",
|
|
4473
|
+
"relationship": "prefer-kerf"
|
|
4474
|
+
},
|
|
4281
4475
|
{
|
|
4282
4476
|
"id": "select",
|
|
4283
4477
|
"relationship": "prefer-kerf"
|
|
@@ -6846,16 +7040,14 @@
|
|
|
6846
7040
|
"category": "Recipes",
|
|
6847
7041
|
"kind": "recipe",
|
|
6848
7042
|
"source": "kerf",
|
|
6849
|
-
"purpose": "
|
|
7043
|
+
"purpose": "App bar above a Workbench with resizable navigation and inspector rails, relocated rail toggles, narrow-container overlays, and explicit pane scroll owners.",
|
|
6850
7044
|
"uses": [
|
|
6851
7045
|
"pane",
|
|
6852
7046
|
"toolbar",
|
|
6853
7047
|
"toolbar-text",
|
|
6854
7048
|
"toolbar-control-group",
|
|
6855
|
-
"
|
|
6856
|
-
"
|
|
6857
|
-
"resize",
|
|
6858
|
-
"list-header",
|
|
7049
|
+
"workbench",
|
|
7050
|
+
"list",
|
|
6859
7051
|
"list-item",
|
|
6860
7052
|
"value-table",
|
|
6861
7053
|
"lucide-icon",
|
|
@@ -6980,7 +7172,7 @@
|
|
|
6980
7172
|
"category": "Recipes",
|
|
6981
7173
|
"kind": "recipe",
|
|
6982
7174
|
"source": "kerf",
|
|
6983
|
-
"purpose": "Production modal
|
|
7175
|
+
"purpose": "Production modal laid out as a workbench: a full-height SplitView list sidebar with its own toolbar beside a full-height detail column that carries the primary title, close control, and record actions; a full-screen drill-down on compact devices.",
|
|
6984
7176
|
"uses": [
|
|
6985
7177
|
"surface-scaffold",
|
|
6986
7178
|
"split-view",
|