@kerfjs/ui 5.0.0-beta.77 → 5.0.0-beta.79
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 +9 -4
- package/ai/application-ui-diagnostic-ids-v1.json +4 -0
- package/ai/compile-time-contracts-v1.json +3 -3
- package/ai/component-catalog.json +152 -31
- package/ai/component-composition-rules.json +6 -14
- package/ai/component-composition.json +123 -29
- package/ai/components/README.md +1 -1
- package/ai/components/document-baseline.md +1 -1
- package/ai/components/nav-stack.md +6 -6
- package/ai/components/pane.md +3 -1
- package/ai/components/surface-scaffold.md +11 -2
- package/ai/components/{tab-scaffold.md → tab-navigator.md} +14 -14
- package/ai/components/token-search-field.md +1 -0
- package/ai/components/toolbar-control-group.md +2 -0
- package/ai/components/toolbar-text.md +2 -0
- package/ai/components/toolbar.md +6 -8
- package/ai/public-api-signatures-v1.md +68 -140
- package/ai/skill.md +15 -4
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/nav-stack.js +2 -0
- package/dist/browser/split-view.js +2 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/catalog-resources.d.ts +3 -3
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +3 -3
- package/dist/{chunk-WJN3V2H5.js → chunk-2GOCOLQL.js} +18 -4
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/{chunk-QYXKMLHO.js → chunk-3CXRQAYT.js} +2 -2
- package/dist/chunk-3CXRQAYT.js.map +1 -0
- package/dist/{chunk-G4VKQP7B.js → chunk-3SXWV2IR.js} +5 -1
- package/dist/chunk-3SXWV2IR.js.map +1 -0
- package/dist/{chunk-VLPE6OPN.js → chunk-62VMNBV2.js} +6 -2
- package/dist/chunk-62VMNBV2.js.map +1 -0
- package/dist/{chunk-XIZRXI7N.js → chunk-A7DYEERU.js} +13 -1
- package/dist/chunk-A7DYEERU.js.map +1 -0
- package/dist/{chunk-6VQPLV3O.js → chunk-DSLRNR43.js} +9 -8
- package/dist/chunk-DSLRNR43.js.map +1 -0
- package/dist/{chunk-AOAW55JN.js → chunk-DXQZ3BEO.js} +4 -1
- package/dist/chunk-DXQZ3BEO.js.map +1 -0
- package/dist/chunk-IKCUPTR2.js +170 -0
- package/dist/chunk-IKCUPTR2.js.map +1 -0
- package/dist/{chunk-Z6PE5T7N.js → chunk-JL4BBZP4.js} +4 -3
- package/dist/chunk-JL4BBZP4.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -8
- package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
- package/dist/nav-stack.d.ts +11 -93
- package/dist/nav-stack.js +5 -1
- package/dist/pane.d.ts +5 -2
- package/dist/pane.js +1 -1
- package/dist/split-view.d.ts +9 -4
- package/dist/split-view.js +7 -3
- package/dist/split-view.js.map +1 -1
- package/dist/styles/components/actions/toolbar/toolbar.css +7 -14
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +63 -13
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +8 -1
- package/dist/styles/components/forms/token-search-field/token-search-field.css +12 -1
- package/dist/styles/components/layout/pane/pane.css +18 -1
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +6 -12
- package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +18 -1
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +55 -0
- package/dist/styles/nav-stack.css +6 -12
- package/dist/styles/pane.css +18 -1
- package/dist/styles/surface-scaffold.css +55 -0
- package/dist/styles/{tab-scaffold.css → tab-navigator.css} +18 -1
- package/dist/styles/token-search-field.css +12 -1
- package/dist/styles/toolbar-control-group.css +63 -13
- package/dist/styles/toolbar-text.css +8 -1
- package/dist/styles/toolbar.css +7 -14
- package/dist/surface-scaffold-register.d.ts +4 -0
- package/dist/surface-scaffold-register.js +59 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +10 -2
- package/dist/surface-scaffold.js +1 -1
- package/dist/{tab-scaffold.d.ts → tab-navigator.d.ts} +12 -10
- package/dist/{tab-scaffold.js → tab-navigator.js} +4 -3
- package/dist/tab-navigator.js.map +1 -0
- package/dist/token-search-field.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-scroll-dividers.d.ts +3 -3
- package/dist/wire-scroll-dividers.js +1 -1
- package/dist/wire-tab-navigator.d.ts +11 -0
- package/dist/{wire-tab-scaffold.js → wire-tab-navigator.js} +3 -3
- package/dist/wire-tab-navigator.js.map +1 -0
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-toolbar-visibility.js +1 -1
- package/dist/workbench.d.ts +5 -13
- package/dist/workbench.js +1 -1
- package/docs/app-layouts.md +44 -11
- package/docs/component-contract.md +9 -2
- package/docs/component-selection.md +17 -15
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
- package/docs/design/templates/token-search-field/empty.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates.md +1 -1
- package/docs/examples/application-ui-profile.json +4 -4
- package/docs/layout.md +31 -8
- package/docs/nav-stack.md +30 -18
- package/docs/recipes.md +6 -2
- package/docs/split-view.md +7 -4
- package/docs/surface-scaffold.md +46 -0
- package/docs/{tab-scaffold.md → tab-navigator.md} +83 -11
- package/docs/type-contracts.md +3 -3
- package/docs/ui-analyzer.md +5 -0
- package/docs/ui-doctor.md +33 -0
- package/docs/workbench.md +3 -2
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/index.mjs +43 -13
- package/llms.txt +18 -6
- package/package.json +16 -11
- package/ux-demo/recipes/list-detail-dialog.tsx +4 -0
- package/ux-demo/recipes/navigation-stack.tsx +2 -2
- package/dist/browser/tab-scaffold.js +0 -4
- package/dist/chunk-6VQPLV3O.js.map +0 -1
- package/dist/chunk-AOAW55JN.js.map +0 -1
- package/dist/chunk-G4VKQP7B.js.map +0 -1
- package/dist/chunk-QYXKMLHO.js.map +0 -1
- package/dist/chunk-VLPE6OPN.js.map +0 -1
- package/dist/chunk-WJN3V2H5.js.map +0 -1
- package/dist/chunk-XIZRXI7N.js.map +0 -1
- package/dist/chunk-Z4EPMX25.js +0 -123
- package/dist/chunk-Z4EPMX25.js.map +0 -1
- package/dist/chunk-Z6PE5T7N.js.map +0 -1
- package/dist/tab-scaffold.js.map +0 -1
- package/dist/wire-tab-scaffold.d.ts +0 -11
- package/dist/wire-tab-scaffold.js.map +0 -1
package/README.md
CHANGED
|
@@ -37,6 +37,11 @@ back to the root or component-local support code placed in the wrong folder.
|
|
|
37
37
|
Browser verification always builds current source: both `npm run test:e2e`
|
|
38
38
|
and direct focused Playwright commands run the catalog/conformance preflights
|
|
39
39
|
and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
|
|
40
|
+
Failed Playwright tests retain traces and screenshots alongside an HTML report.
|
|
41
|
+
CI runs the complete suite in concurrent Chromium, Firefox, and WebKit jobs,
|
|
42
|
+
while the `ui` job checks the package. A failing browser job uploads its report
|
|
43
|
+
and per-test evidence for 14 days as
|
|
44
|
+
`ui-browser-failure-<browser>-<run>-<attempt>`.
|
|
40
45
|
|
|
41
46
|
When authoring a component gallery, follow the single
|
|
42
47
|
[Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
|
|
@@ -230,8 +235,8 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
|
|
|
230
235
|
| `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
|
|
231
236
|
| `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
|
|
232
237
|
| `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
|
|
233
|
-
| `
|
|
234
|
-
| `
|
|
238
|
+
| `TabNavigator` | `@kerfjs/ui/tab-navigator` | `@kerfjs/ui/tab-navigator.css` |
|
|
239
|
+
| `wireTabNavigator` | `@kerfjs/ui/wire-tab-navigator` | — |
|
|
235
240
|
| `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
|
|
236
241
|
| `wireWorkbench` | `@kerfjs/ui/wire-workbench` | — |
|
|
237
242
|
| `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
|
|
@@ -260,11 +265,11 @@ Application layouts are separate component subpaths. Browser-condition imports
|
|
|
260
265
|
include their reachable CSS; use the matching manual CSS export when your
|
|
261
266
|
bundler does not select the browser condition. Add a wire subpath when the
|
|
262
267
|
layout has interactive behavior. The catalog
|
|
263
|
-
entries for `nav-stack`, `split-view`, `tab-
|
|
268
|
+
entries for `nav-stack`, `split-view`, `tab-navigator`, `workbench`, and
|
|
264
269
|
`collapsible-panel` document their selection rules, ownership boundaries,
|
|
265
270
|
public classes, tokens, and focused demos. See
|
|
266
271
|
[`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
|
|
267
|
-
`NavStack` and `
|
|
272
|
+
`NavStack` and `TabNavigator` expose `chromeDividers="scroll" | "always" |
|
|
268
273
|
"none"` for their chrome lines; `SplitView` forwards the setting to its
|
|
269
274
|
compact stack. A sole `Pane` in a view or scene fills it, keeping the Pane's
|
|
270
275
|
header in place while its own content scrolls.
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
"KUI-D010",
|
|
30
30
|
"KUI-D011",
|
|
31
31
|
"KUI-D020",
|
|
32
|
+
"KUI-D030",
|
|
33
|
+
"KUI-D031",
|
|
34
|
+
"KUI-D032",
|
|
32
35
|
"KUI-L001",
|
|
33
36
|
"KUI-L002",
|
|
34
37
|
"KUI-L003",
|
|
@@ -104,6 +107,7 @@
|
|
|
104
107
|
"KUI-T011"
|
|
105
108
|
],
|
|
106
109
|
"retired": {
|
|
110
|
+
"KUI-C101": "Toolbar zones accept KerfUiContent directly; grouping is a recommended presentation choice, not a composition requirement. Kept in ids so existing profile exceptions still load.",
|
|
107
111
|
"KUI-L005": "Folded into KUI-L019: any application rule whose subject is a cataloged component, forced dimensions included. Kept in ids so existing profile exceptions that name it still load."
|
|
108
112
|
}
|
|
109
113
|
}
|
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"id": "KUI-T008",
|
|
65
|
-
"publicImport": "@kerfjs/ui/tab-
|
|
66
|
-
"symbols": ["
|
|
65
|
+
"publicImport": "@kerfjs/ui/tab-navigator",
|
|
66
|
+
"symbols": ["TabNavigatorTab", "TabNavigatorProps"],
|
|
67
67
|
"kind": "literal-identity",
|
|
68
|
-
"summary": "Literal
|
|
68
|
+
"summary": "Literal TabNavigator active ids are constrained to the declared tab ids; dynamic integrations may widen the generic to string."
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
"id": "KUI-T009",
|
|
@@ -478,7 +478,7 @@
|
|
|
478
478
|
"publicExports": [],
|
|
479
479
|
"useWhen": [
|
|
480
480
|
"An application wants Kerf UI to own document-level box sizing, body typography, native table-cell and form-control font metrics, surface, and link color.",
|
|
481
|
-
"A full-height shell (Workbench, SplitView, NavStack, or
|
|
481
|
+
"A full-height shell (Workbench, SplitView, NavStack, or TabNavigator) mounts into one direct container: put .kui-app-root on that container."
|
|
482
482
|
],
|
|
483
483
|
"avoidWhen": [
|
|
484
484
|
"Do not put .kui-app-root on several sibling containers; each requests the full available document height.",
|
|
@@ -624,7 +624,8 @@
|
|
|
624
624
|
"An application column needs shared header, content, and optional footer organization with exactly one scrolling content owner.",
|
|
625
625
|
"A pane boundary needs an opt-in separator on any combination of logical sides.",
|
|
626
626
|
"Pinned chrome needs a divider from the scrolling content only while content is scrolled beneath it (wireScrollDividers).",
|
|
627
|
-
"A lowered background must cover the scrolling work viewport and blank space after short content without a second scroll container (appearance: sunken)."
|
|
627
|
+
"A lowered background must cover the scrolling work viewport and blank space after short content without a second scroll container (appearance: sunken).",
|
|
628
|
+
"A child table or other component needs edge-to-edge decoration with text aligned to other pane content."
|
|
628
629
|
],
|
|
629
630
|
"avoidWhen": [
|
|
630
631
|
"Do not use Pane as a padded card or add a competing scroll owner around its content slot.",
|
|
@@ -667,8 +668,9 @@
|
|
|
667
668
|
"border": "conditional",
|
|
668
669
|
"padding": "child",
|
|
669
670
|
"notes": [
|
|
670
|
-
|
|
671
|
-
"Safe areas: the root and separators paint through unsafe areas while header, content, and footer pad the sides the pane still reaches (routed by --kui-edge-inset-*); content block insets are scroll padding."
|
|
671
|
+
"The pane is unpadded; separators are independently opt-in on logical edges and default off.",
|
|
672
|
+
"Safe areas: the root and separators paint through unsafe areas while header, content, and footer pad the sides the pane still reaches (routed by --kui-edge-inset-*); content block insets are scroll padding.",
|
|
673
|
+
"The scrolling content exposes its resolved logical inline padding to descendants as --kui-pane-content-inset-inline-start/end, including safe areas and deepInset."
|
|
672
674
|
]
|
|
673
675
|
},
|
|
674
676
|
"delivery": {
|
|
@@ -712,6 +714,8 @@
|
|
|
712
714
|
"--kui-pane-separator-color",
|
|
713
715
|
"--kui-pane-separator-width",
|
|
714
716
|
"--kui-pane-chrome-background",
|
|
717
|
+
"--kui-pane-content-inset-inline-start",
|
|
718
|
+
"--kui-pane-content-inset-inline-end",
|
|
715
719
|
"--kui-sunken-panel-background"
|
|
716
720
|
],
|
|
717
721
|
"links": {
|
|
@@ -745,7 +749,7 @@
|
|
|
745
749
|
],
|
|
746
750
|
"avoidWhen": [
|
|
747
751
|
"Do not use NavStack when a list and detail should remain visible together; use SplitView.",
|
|
748
|
-
"Do not use it for co-equal top-level destinations on compact devices; wrap one stack per destination in
|
|
752
|
+
"Do not use it for co-equal top-level destinations on compact devices; wrap one stack per destination in TabNavigator."
|
|
749
753
|
],
|
|
750
754
|
"alternatives": [
|
|
751
755
|
{
|
|
@@ -754,20 +758,20 @@
|
|
|
754
758
|
"when": "Promote a list-to-detail stack to SplitView once both regions fit together."
|
|
755
759
|
},
|
|
756
760
|
{
|
|
757
|
-
"id": "tab-
|
|
761
|
+
"id": "tab-navigator",
|
|
758
762
|
"relationship": "composes-with",
|
|
759
|
-
"when": "Use one NavStack as each
|
|
763
|
+
"when": "Use one NavStack as each TabNavigator tab's persistent content."
|
|
760
764
|
}
|
|
761
765
|
],
|
|
762
766
|
"appOwns": [
|
|
763
767
|
"ordered view stack and stable keys",
|
|
764
|
-
"view content and
|
|
768
|
+
"view content and structured top and bottom toolbar configurations",
|
|
765
769
|
"push and pop actions",
|
|
766
770
|
"preferred initial focus targets when DOM order is insufficient",
|
|
767
|
-
"per-view bottom toolbar
|
|
771
|
+
"per-view bottom toolbar or a persistent structured fallback",
|
|
768
772
|
"per-view leading, center, and trailing top-toolbar groups",
|
|
769
|
-
"per-view
|
|
770
|
-
"top-toolbar
|
|
773
|
+
"per-view header and footer with List and Pane configuration",
|
|
774
|
+
"top-toolbar defaults, title size, and heading level",
|
|
771
775
|
"whether the chrome and bottom-toolbar dividers follow the scroll, always show, or never show (chromeDividers)"
|
|
772
776
|
],
|
|
773
777
|
"variants": [
|
|
@@ -859,7 +863,6 @@
|
|
|
859
863
|
"kui-nav-stack__chrome-copy",
|
|
860
864
|
"kui-nav-stack__chrome-copy--bottom",
|
|
861
865
|
"kui-nav-stack__chrome-copy--exiting",
|
|
862
|
-
"kui-nav-stack__header",
|
|
863
866
|
"kui-nav-stack__viewport",
|
|
864
867
|
"kui-nav-stack__view",
|
|
865
868
|
"kui-nav-stack__view--entering",
|
|
@@ -1012,27 +1015,27 @@
|
|
|
1012
1015
|
}
|
|
1013
1016
|
},
|
|
1014
1017
|
{
|
|
1015
|
-
"id": "tab-
|
|
1016
|
-
"name": "
|
|
1018
|
+
"id": "tab-navigator",
|
|
1019
|
+
"name": "TabNavigator",
|
|
1017
1020
|
"category": "Structure",
|
|
1018
1021
|
"kind": "component",
|
|
1019
1022
|
"source": "kerf",
|
|
1020
|
-
"description": "A controlled compact-device bottom tab
|
|
1023
|
+
"description": "A controlled compact-device bottom tab navigator that keeps every destination scene mounted so its navigation and scroll state survive selection changes.",
|
|
1021
1024
|
"uses": [
|
|
1022
1025
|
"badge"
|
|
1023
1026
|
],
|
|
1024
1027
|
"purpose": "Switch among two to five co-equal top-level destinations on compact devices while preserving each destination's independent content state.",
|
|
1025
1028
|
"publicExports": [
|
|
1026
|
-
"
|
|
1027
|
-
"
|
|
1028
|
-
"
|
|
1029
|
+
"TabNavigatorTab",
|
|
1030
|
+
"TabNavigatorProps",
|
|
1031
|
+
"TabNavigator"
|
|
1029
1032
|
],
|
|
1030
1033
|
"useWhen": [
|
|
1031
1034
|
"A handset or portrait-tablet app has two to five co-equal top-level destinations.",
|
|
1032
1035
|
"Each destination must stay mounted so its NavStack and scroll position survive tab switches."
|
|
1033
1036
|
],
|
|
1034
1037
|
"avoidWhen": [
|
|
1035
|
-
"Do not use
|
|
1038
|
+
"Do not use TabNavigator for document tabs or reorderable work items; use TabBar.",
|
|
1036
1039
|
"Do not retain the bottom bar on desktop when the same destinations should be promoted to a Workbench rail or sidebar."
|
|
1037
1040
|
],
|
|
1038
1041
|
"alternatives": [
|
|
@@ -1073,22 +1076,22 @@
|
|
|
1073
1076
|
"border": "conditional",
|
|
1074
1077
|
"padding": "self",
|
|
1075
1078
|
"notes": [
|
|
1076
|
-
"The
|
|
1079
|
+
"The navigator owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry.",
|
|
1077
1080
|
"The bar's top line is scroll state (wireScrollDividers): it shows only while the active scene's content continues below the bar, by coloring the bar's always-present 1px top border."
|
|
1078
1081
|
]
|
|
1079
1082
|
},
|
|
1080
1083
|
"delivery": {
|
|
1081
|
-
"moduleImport": "@kerfjs/ui/tab-
|
|
1082
|
-
"browserImport": "@kerfjs/ui/tab-
|
|
1083
|
-
"manualCssImport": "@kerfjs/ui/tab-
|
|
1084
|
+
"moduleImport": "@kerfjs/ui/tab-navigator",
|
|
1085
|
+
"browserImport": "@kerfjs/ui/tab-navigator",
|
|
1086
|
+
"manualCssImport": "@kerfjs/ui/tab-navigator.css",
|
|
1084
1087
|
"sideEffects": [
|
|
1085
1088
|
"browser-condition-css"
|
|
1086
1089
|
]
|
|
1087
1090
|
},
|
|
1088
1091
|
"wiring": [
|
|
1089
1092
|
{
|
|
1090
|
-
"export": "
|
|
1091
|
-
"import": "@kerfjs/ui/wire-tab-
|
|
1093
|
+
"export": "wireTabNavigator",
|
|
1094
|
+
"import": "@kerfjs/ui/wire-tab-navigator",
|
|
1092
1095
|
"required": true
|
|
1093
1096
|
},
|
|
1094
1097
|
{
|
|
@@ -1121,8 +1124,8 @@
|
|
|
1121
1124
|
],
|
|
1122
1125
|
"publicTokens": [],
|
|
1123
1126
|
"links": {
|
|
1124
|
-
"catalogRoute": "?component=tab-
|
|
1125
|
-
"documentation": "docs/tab-
|
|
1127
|
+
"catalogRoute": "?component=tab-navigator",
|
|
1128
|
+
"documentation": "docs/tab-navigator.md",
|
|
1126
1129
|
"recipe": "docs/app-layouts.md#decision-matrix"
|
|
1127
1130
|
}
|
|
1128
1131
|
},
|
|
@@ -1615,6 +1618,16 @@
|
|
|
1615
1618
|
"name": "data-toolbar-visibility-probe",
|
|
1616
1619
|
"on": "private aria-hidden measurement boxes under Toolbar",
|
|
1617
1620
|
"meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
|
|
1621
|
+
},
|
|
1622
|
+
{
|
|
1623
|
+
"name": "data-morph-preserve",
|
|
1624
|
+
"on": "private aria-hidden measurement boxes and visibility state children",
|
|
1625
|
+
"meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
|
|
1626
|
+
},
|
|
1627
|
+
{
|
|
1628
|
+
"name": "data-toolbar-visibility-state",
|
|
1629
|
+
"on": "private hidden children of width-managed items and paired busy statuses",
|
|
1630
|
+
"meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
|
|
1618
1631
|
}
|
|
1619
1632
|
]
|
|
1620
1633
|
}
|
|
@@ -1747,6 +1760,16 @@
|
|
|
1747
1760
|
"name": "data-toolbar-visibility-probe",
|
|
1748
1761
|
"on": "private aria-hidden measurement boxes under Toolbar",
|
|
1749
1762
|
"meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
"name": "data-morph-preserve",
|
|
1766
|
+
"on": "private aria-hidden measurement boxes and visibility state children",
|
|
1767
|
+
"meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
|
|
1768
|
+
},
|
|
1769
|
+
{
|
|
1770
|
+
"name": "data-toolbar-visibility-state",
|
|
1771
|
+
"on": "private hidden children of width-managed items and paired busy statuses",
|
|
1772
|
+
"meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
|
|
1750
1773
|
}
|
|
1751
1774
|
]
|
|
1752
1775
|
}
|
|
@@ -1855,7 +1878,7 @@
|
|
|
1855
1878
|
"category": "Structure",
|
|
1856
1879
|
"kind": "component",
|
|
1857
1880
|
"source": "kerf",
|
|
1858
|
-
"description": "Typed Web Awesome dialog and
|
|
1881
|
+
"description": "Typed Web Awesome dialog preferred widths and viewport bounds, presentation, and popup inset composition.",
|
|
1859
1882
|
"uses": [
|
|
1860
1883
|
"wa-dialog",
|
|
1861
1884
|
"wa-dropdown",
|
|
@@ -1868,7 +1891,8 @@
|
|
|
1868
1891
|
],
|
|
1869
1892
|
"useWhen": [
|
|
1870
1893
|
"A Web Awesome dialog or dropdown needs a standard size, presentation, body/footer inset, or list-compatible menu inset.",
|
|
1871
|
-
"A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText."
|
|
1894
|
+
"A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText.",
|
|
1895
|
+
"A modal needs a typed preferred width, viewport gutter, or dynamic viewport-bounded height cap while retaining native body scrolling and footer actions."
|
|
1872
1896
|
],
|
|
1873
1897
|
"avoidWhen": [
|
|
1874
1898
|
"Do not use it as a generic layout wrapper or to replace application-owned modal state and focus lifecycle.",
|
|
@@ -1885,6 +1909,7 @@
|
|
|
1885
1909
|
"variants": [
|
|
1886
1910
|
"small, medium, or large dialog",
|
|
1887
1911
|
"modal, side-sheet, or fullscreen dialog",
|
|
1912
|
+
"typed modal preferred width, viewport gutter, and maximum height, including viewport cap",
|
|
1888
1913
|
"none, compact, or comfortable body and footer inset",
|
|
1889
1914
|
"standard, compact, or zero-inset popup menu"
|
|
1890
1915
|
],
|
|
@@ -1900,8 +1925,10 @@
|
|
|
1900
1925
|
"delivery": {
|
|
1901
1926
|
"browserImport": "@kerfjs/ui/surface-scaffold",
|
|
1902
1927
|
"manualCssImport": "@kerfjs/ui/surface-scaffold.css",
|
|
1928
|
+
"registrationImport": "@kerfjs/ui/surface-scaffold/register",
|
|
1903
1929
|
"sideEffects": [
|
|
1904
|
-
"browser-condition-css"
|
|
1930
|
+
"browser-condition-css",
|
|
1931
|
+
"custom-element-registration"
|
|
1905
1932
|
]
|
|
1906
1933
|
},
|
|
1907
1934
|
"wiring": [],
|
|
@@ -1918,7 +1945,86 @@
|
|
|
1918
1945
|
"catalogRoute": "?component=surface-scaffold",
|
|
1919
1946
|
"documentation": "docs/surface-scaffold.md",
|
|
1920
1947
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1921
|
-
}
|
|
1948
|
+
},
|
|
1949
|
+
"cssValueProps": [
|
|
1950
|
+
{
|
|
1951
|
+
"path": "preferredWidth",
|
|
1952
|
+
"grammar": "length",
|
|
1953
|
+
"helpers": [
|
|
1954
|
+
"px",
|
|
1955
|
+
"rem",
|
|
1956
|
+
"remify",
|
|
1957
|
+
"em",
|
|
1958
|
+
"pct",
|
|
1959
|
+
"space",
|
|
1960
|
+
"lengthVar",
|
|
1961
|
+
"calc"
|
|
1962
|
+
],
|
|
1963
|
+
"nonStandaloneHelpers": [
|
|
1964
|
+
"plus"
|
|
1965
|
+
],
|
|
1966
|
+
"shorthands": [],
|
|
1967
|
+
"canonicalShorthands": [],
|
|
1968
|
+
"exceptionalShorthands": [],
|
|
1969
|
+
"rawPolicy": "forbid",
|
|
1970
|
+
"examples": [
|
|
1971
|
+
"preferredWidth={remify(832)}"
|
|
1972
|
+
]
|
|
1973
|
+
},
|
|
1974
|
+
{
|
|
1975
|
+
"path": "viewportGutter",
|
|
1976
|
+
"grammar": "length",
|
|
1977
|
+
"helpers": [
|
|
1978
|
+
"px",
|
|
1979
|
+
"rem",
|
|
1980
|
+
"remify",
|
|
1981
|
+
"em",
|
|
1982
|
+
"pct",
|
|
1983
|
+
"space",
|
|
1984
|
+
"lengthVar",
|
|
1985
|
+
"calc"
|
|
1986
|
+
],
|
|
1987
|
+
"nonStandaloneHelpers": [
|
|
1988
|
+
"plus"
|
|
1989
|
+
],
|
|
1990
|
+
"shorthands": [],
|
|
1991
|
+
"canonicalShorthands": [],
|
|
1992
|
+
"exceptionalShorthands": [],
|
|
1993
|
+
"rawPolicy": "forbid",
|
|
1994
|
+
"examples": [
|
|
1995
|
+
"viewportGutter={remify(8)}"
|
|
1996
|
+
]
|
|
1997
|
+
},
|
|
1998
|
+
{
|
|
1999
|
+
"path": "maxHeight",
|
|
2000
|
+
"grammar": "length",
|
|
2001
|
+
"helpers": [
|
|
2002
|
+
"px",
|
|
2003
|
+
"rem",
|
|
2004
|
+
"remify",
|
|
2005
|
+
"em",
|
|
2006
|
+
"pct",
|
|
2007
|
+
"space",
|
|
2008
|
+
"lengthVar",
|
|
2009
|
+
"calc"
|
|
2010
|
+
],
|
|
2011
|
+
"nonStandaloneHelpers": [
|
|
2012
|
+
"plus"
|
|
2013
|
+
],
|
|
2014
|
+
"shorthands": [
|
|
2015
|
+
"viewport"
|
|
2016
|
+
],
|
|
2017
|
+
"canonicalShorthands": [
|
|
2018
|
+
"viewport"
|
|
2019
|
+
],
|
|
2020
|
+
"exceptionalShorthands": [],
|
|
2021
|
+
"rawPolicy": "forbid",
|
|
2022
|
+
"examples": [
|
|
2023
|
+
"maxHeight=\"viewport\"",
|
|
2024
|
+
"maxHeight={remify(640)}"
|
|
2025
|
+
]
|
|
2026
|
+
}
|
|
2027
|
+
]
|
|
1922
2028
|
},
|
|
1923
2029
|
{
|
|
1924
2030
|
"id": "floating-toolbar",
|
|
@@ -2099,6 +2205,16 @@
|
|
|
2099
2205
|
"name": "data-toolbar-visibility-probe",
|
|
2100
2206
|
"on": "private aria-hidden measurement boxes under Toolbar",
|
|
2101
2207
|
"meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
|
|
2208
|
+
},
|
|
2209
|
+
{
|
|
2210
|
+
"name": "data-morph-preserve",
|
|
2211
|
+
"on": "private aria-hidden measurement boxes and visibility state children",
|
|
2212
|
+
"meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
|
|
2213
|
+
},
|
|
2214
|
+
{
|
|
2215
|
+
"name": "data-toolbar-visibility-state",
|
|
2216
|
+
"on": "private hidden children of width-managed items and paired busy statuses",
|
|
2217
|
+
"meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
|
|
2102
2218
|
}
|
|
2103
2219
|
]
|
|
2104
2220
|
}
|
|
@@ -4187,6 +4303,11 @@
|
|
|
4187
4303
|
"name": "data-empty",
|
|
4188
4304
|
"on": "the text span inside kui-token-search__editor",
|
|
4189
4305
|
"meaning": "\"true\" on that span while it holds no text."
|
|
4306
|
+
},
|
|
4307
|
+
{
|
|
4308
|
+
"name": "data-placeholder-visible",
|
|
4309
|
+
"on": "the kui-token-search root",
|
|
4310
|
+
"meaning": "Tracks whether the DOM-owned editor is empty so its placeholder stays outside the editable area."
|
|
4190
4311
|
}
|
|
4191
4312
|
]
|
|
4192
4313
|
}
|
|
@@ -11,38 +11,30 @@
|
|
|
11
11
|
{
|
|
12
12
|
"id": "leading",
|
|
13
13
|
"jsx": { "prop": "leading" },
|
|
14
|
-
"accepts": ["
|
|
14
|
+
"accepts": ["KerfUiContent"],
|
|
15
15
|
"cardinality": { "min": 0, "max": "unbounded" },
|
|
16
16
|
"exclusiveWith": []
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"id": "center",
|
|
20
20
|
"jsx": { "prop": "center" },
|
|
21
|
-
"accepts": ["
|
|
21
|
+
"accepts": ["KerfUiContent"],
|
|
22
22
|
"cardinality": { "min": 0, "max": "unbounded" },
|
|
23
23
|
"exclusiveWith": []
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"id": "trailing",
|
|
27
27
|
"jsx": { "prop": "trailing" },
|
|
28
|
-
"accepts": ["
|
|
28
|
+
"accepts": ["KerfUiContent"],
|
|
29
29
|
"cardinality": { "min": 0, "max": "unbounded" },
|
|
30
30
|
"exclusiveWith": []
|
|
31
31
|
}
|
|
32
32
|
],
|
|
33
33
|
"children": {
|
|
34
|
-
"mode": "
|
|
35
|
-
"concepts": [
|
|
34
|
+
"mode": "any",
|
|
35
|
+
"concepts": [],
|
|
36
36
|
"requiredConcepts": []
|
|
37
|
-
}
|
|
38
|
-
"diagnostics": [
|
|
39
|
-
{
|
|
40
|
-
"id": "KUI-C101",
|
|
41
|
-
"severity": "error",
|
|
42
|
-
"when": "a direct zone child is neither ToolbarText nor ToolbarControlGroup nor a standalone wa-button in trailing",
|
|
43
|
-
"message": "Wrap toolbar controls in ToolbarControlGroup; only ToolbarText and ToolbarControlGroup, plus one standalone primary wa-button in trailing, are direct zone children."
|
|
44
|
-
}
|
|
45
|
-
]
|
|
37
|
+
}
|
|
46
38
|
},
|
|
47
39
|
"@kerfjs/ui:pane": {
|
|
48
40
|
"_source": "docs/layout.md#anatomy",
|