@kerfjs/ui 5.0.0-beta.61 → 5.0.0-beta.63
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 -0
- package/ai/component-catalog-extension.schema.json +13 -0
- package/ai/component-catalog.json +20 -7
- package/ai/component-composition.json +17 -3
- package/ai/components/list-item.md +1 -1
- package/ai/components/pane.md +3 -2
- package/ai/components/select.md +1 -0
- package/ai/components/toolbar-text.md +2 -1
- package/ai/components/workbench.md +3 -2
- package/ai/public-api-signatures-v1.md +162 -48
- package/ai/skill.md +11 -5
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +3 -2
- package/catalog-projection-cli.mjs +96 -0
- package/catalog-projection.d.mts +55 -0
- package/catalog-projection.mjs +62 -0
- package/dist/browser/catalog.js +1 -1
- package/dist/browser/collapsible-panel.js +2 -0
- package/dist/browser/nav-stack.js +1 -0
- package/dist/browser/split-view.js +1 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench.js +1 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.js +11 -10
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +9 -3
- package/dist/chip.js +1 -1
- package/dist/{chunk-EZVNC4J6.js → chunk-3BYFWTP3.js} +7 -3
- package/dist/chunk-3BYFWTP3.js.map +1 -0
- package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
- package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
- package/dist/chunk-7AKGPBCC.js +76 -0
- package/dist/chunk-7AKGPBCC.js.map +1 -0
- package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
- package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
- package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
- package/dist/chunk-CQHN45XR.js.map +1 -0
- package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
- package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
- package/dist/{chunk-TEYARRAK.js → chunk-F7OCOBTG.js} +5 -2
- package/dist/chunk-F7OCOBTG.js.map +1 -0
- package/dist/{chunk-5PESG2VP.js → chunk-HXCMWANP.js} +6 -5
- package/dist/chunk-HXCMWANP.js.map +1 -0
- package/dist/{chunk-NYL63PSD.js → chunk-IA4D5XNT.js} +61 -10
- package/dist/chunk-IA4D5XNT.js.map +1 -0
- package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
- package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
- package/dist/{chunk-Y74NWGQW.js → chunk-KFYANKJI.js} +66 -22
- package/dist/chunk-KFYANKJI.js.map +1 -0
- package/dist/chunk-MOSIE4Z2.js +51 -0
- package/dist/chunk-MOSIE4Z2.js.map +1 -0
- package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
- package/dist/chunk-NXWE5S57.js.map +1 -0
- package/dist/{chunk-NNMLEDMD.js → chunk-OBAFAH5B.js} +36 -8
- package/dist/chunk-OBAFAH5B.js.map +1 -0
- package/dist/{chunk-A3CKOW2R.js → chunk-R75GGNWY.js} +123 -20
- package/dist/chunk-R75GGNWY.js.map +1 -0
- package/dist/chunk-RGS4WX2M.js +44 -0
- package/dist/chunk-RGS4WX2M.js.map +1 -0
- package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
- package/dist/chunk-RKTTF3L4.js.map +1 -0
- package/dist/{chunk-RRB26JRJ.js → chunk-RTJNJTG3.js} +2 -2
- package/dist/{chunk-RRB26JRJ.js.map → chunk-RTJNJTG3.js.map} +1 -1
- package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
- package/dist/chunk-SMZGAPCU.js.map +1 -0
- package/dist/{chunk-C4OYOKWX.js → chunk-UA6JW52D.js} +36 -2
- package/dist/chunk-UA6JW52D.js.map +1 -0
- package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
- package/dist/chunk-V3DX3K65.js.map +1 -0
- package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
- package/dist/chunk-WF75U3V4.js.map +1 -0
- package/dist/{chunk-VCBTX62E.js → chunk-ZRWXFDDS.js} +2 -2
- package/dist/chunk-ZRWXFDDS.js.map +1 -0
- package/dist/collapsible-panel.d.ts +18 -7
- package/dist/collapsible-panel.js +19 -3
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/content-item.d.ts +36 -5
- package/dist/content-item.js +1 -1
- package/dist/disclosure-arrow.js +2 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +22 -22
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/lucide-icon.d.ts +5 -2
- package/dist/lucide-icon.js +2 -1
- package/dist/nav-stack.d.ts +3 -1
- package/dist/nav-stack.js +2 -1
- package/dist/pane.d.ts +10 -4
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
- package/dist/popup-menu-register.js +38 -1
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +2 -2
- package/dist/popup-menu.js +1 -1
- package/dist/select.d.ts +2 -0
- package/dist/select.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +2 -1
- package/dist/split-view.js.map +1 -1
- package/dist/styles/app-tab.css +84 -0
- package/dist/styles/chip.css +14 -0
- package/dist/styles/content-item.css +36 -0
- package/dist/styles/list-action-row.css +4 -3
- package/dist/styles/list-header.css +4 -3
- package/dist/styles/list-item.css +21 -11
- package/dist/styles/lucide-icon.css +5 -0
- package/dist/styles/nav-stack.css +13 -0
- package/dist/styles/pane.css +36 -2
- package/dist/styles/popup-menu.css +15 -10
- package/dist/styles/resizable-region.css +9 -0
- package/dist/styles/select.css +26 -0
- package/dist/styles/split-view.css +6 -0
- package/dist/styles/sunken-panel.css +7 -0
- package/dist/styles/tab-bar.css +3 -0
- package/dist/styles/tab-scaffold.css +13 -0
- package/dist/styles/text.css +29 -0
- package/dist/styles/token-search-field.css +29 -6
- package/dist/styles/toolbar-control-group.css +35 -0
- package/dist/styles/toolbar-text.css +15 -6
- package/dist/styles/toolbar.css +7 -0
- package/dist/styles/workbench.css +260 -90
- package/dist/sunken-panel.d.ts +6 -1
- package/dist/sunken-panel.js +1 -1
- package/dist/tab-bar.d.ts +6 -2
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +3 -0
- package/dist/tab-scaffold.js +1 -0
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/text.d.ts +14 -3
- package/dist/text.js +1 -1
- package/dist/token-search-field.js +2 -1
- package/dist/toolbar-control-group.d.ts +5 -1
- package/dist/toolbar-control-group.js +2 -1
- package/dist/toolbar-text.d.ts +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +7 -4
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-content-items.d.ts +9 -0
- package/dist/wire-content-items.js +62 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.js +2 -1
- package/dist/wire-workbench.d.ts +7 -0
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench.d.ts +24 -8
- package/dist/workbench.js +2 -1
- package/docs/accessibility.md +21 -5
- package/docs/catalog.md +36 -0
- package/docs/collapsible-panel.md +12 -4
- package/docs/component-contract.md +10 -4
- package/docs/component-selection.md +65 -15
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/examples/component-catalog-extension.json +6 -0
- package/docs/layout.md +61 -3
- package/docs/nav-stack.md +5 -0
- package/docs/split-view.md +5 -0
- package/docs/sunken-panel.md +30 -1
- package/docs/tab-scaffold.md +5 -0
- package/docs/ui-analyzer.md +4 -0
- package/docs/webawesome-theme.md +36 -6
- package/docs/workbench.md +60 -14
- package/llms.txt +12 -4
- package/package.json +16 -2
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/dist/chunk-3SXMEK3B.js.map +0 -1
- package/dist/chunk-4R777DUZ.js +0 -34
- package/dist/chunk-4R777DUZ.js.map +0 -1
- package/dist/chunk-5PESG2VP.js.map +0 -1
- package/dist/chunk-6ZXOQEAN.js.map +0 -1
- package/dist/chunk-7JUBXOIV.js.map +0 -1
- package/dist/chunk-A3CKOW2R.js.map +0 -1
- package/dist/chunk-AUKT3KMG.js.map +0 -1
- package/dist/chunk-C4OYOKWX.js.map +0 -1
- package/dist/chunk-EAC4CDY7.js.map +0 -1
- package/dist/chunk-EZVNC4J6.js.map +0 -1
- package/dist/chunk-MA73TA6D.js +0 -42
- package/dist/chunk-MA73TA6D.js.map +0 -1
- package/dist/chunk-MERWRTBG.js +0 -45
- package/dist/chunk-MERWRTBG.js.map +0 -1
- package/dist/chunk-N3GKMPDW.js.map +0 -1
- package/dist/chunk-NNMLEDMD.js.map +0 -1
- package/dist/chunk-NYL63PSD.js.map +0 -1
- package/dist/chunk-TEYARRAK.js.map +0 -1
- package/dist/chunk-VCBTX62E.js.map +0 -1
- package/dist/chunk-Y74NWGQW.js.map +0 -1
package/README.md
CHANGED
|
@@ -342,6 +342,10 @@ guidance, public hooks, and explicit geometry ownership; then concatenate its
|
|
|
342
342
|
identity alongside each input when ids could collide. This makes a combined
|
|
343
343
|
tool reason about both sides of a composition using one vocabulary without
|
|
344
344
|
pretending app-local components are `@kerfjs/ui` exports.
|
|
345
|
+
For a consumer UX demo, `@kerfjs/ui/catalog-projection` derives rows and
|
|
346
|
+
relationships from that extension; `kerf-catalog-demo --write` emits a typed
|
|
347
|
+
module and `--check` catches drift. See the [catalog guide](./docs/catalog.md)
|
|
348
|
+
for repository base and source path configuration.
|
|
345
349
|
|
|
346
350
|
Composition-aware consumers use
|
|
347
351
|
[`component-composition-extension.schema.json`](./ai/component-composition-extension.schema.json),
|
|
@@ -52,6 +52,14 @@
|
|
|
52
52
|
"items": { "type": "string" },
|
|
53
53
|
"uniqueItems": true
|
|
54
54
|
},
|
|
55
|
+
"uses": {
|
|
56
|
+
"description": "Directly composed Kerf or consumer catalog entry ids.",
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": { "type": "string", "minLength": 1 },
|
|
59
|
+
"uniqueItems": true
|
|
60
|
+
},
|
|
61
|
+
"source": { "$ref": "#/$defs/repositoryPath" },
|
|
62
|
+
"demoSource": { "$ref": "#/$defs/repositoryPath" },
|
|
55
63
|
"geometry": { "$ref": "#/$defs/geometry" },
|
|
56
64
|
"documentation": { "type": "string", "minLength": 1 }
|
|
57
65
|
},
|
|
@@ -74,6 +82,11 @@
|
|
|
74
82
|
},
|
|
75
83
|
"geometryOwner": {
|
|
76
84
|
"enum": ["self", "parent", "child", "none", "conditional"]
|
|
85
|
+
},
|
|
86
|
+
"repositoryPath": {
|
|
87
|
+
"description": "A repository-relative POSIX path without traversal or empty segments.",
|
|
88
|
+
"type": "string",
|
|
89
|
+
"pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$"
|
|
77
90
|
}
|
|
78
91
|
}
|
|
79
92
|
}
|
|
@@ -582,7 +582,8 @@
|
|
|
582
582
|
"useWhen": [
|
|
583
583
|
"An application column needs shared header, content, and optional footer organization with exactly one scrolling content owner.",
|
|
584
584
|
"A pane boundary needs an opt-in separator on any combination of logical sides.",
|
|
585
|
-
"Pinned chrome needs a divider from the scrolling content only while content is scrolled beneath it (wireScrollDividers)."
|
|
585
|
+
"Pinned chrome needs a divider from the scrolling content only while content is scrolled beneath it (wireScrollDividers).",
|
|
586
|
+
"A lowered background must cover the scrolling work viewport and blank space after short content without a second scroll container (appearance: sunken)."
|
|
586
587
|
],
|
|
587
588
|
"avoidWhen": [
|
|
588
589
|
"Do not use Pane as a padded card or add a competing scroll owner around its content slot.",
|
|
@@ -602,7 +603,8 @@
|
|
|
602
603
|
"which logical boundaries show separators",
|
|
603
604
|
"which sides may compensate for device safe areas in an app-owned arrangement (safeAreaEdges)",
|
|
604
605
|
"responsive placement and visibility",
|
|
605
|
-
"whether the chrome dividers follow the scroll, always show, or never show (chromeDividers)"
|
|
606
|
+
"whether the chrome dividers follow the scroll, always show, or never show (chromeDividers)",
|
|
607
|
+
"default or sunken scrolling work surface (appearance)"
|
|
606
608
|
],
|
|
607
609
|
"variants": [
|
|
608
610
|
"content only",
|
|
@@ -667,7 +669,9 @@
|
|
|
667
669
|
"--kui-edge-inset-inline-end",
|
|
668
670
|
"--kui-edge-inset-inline-start",
|
|
669
671
|
"--kui-pane-separator-color",
|
|
670
|
-
"--kui-pane-separator-width"
|
|
672
|
+
"--kui-pane-separator-width",
|
|
673
|
+
"--kui-pane-chrome-background",
|
|
674
|
+
"--kui-sunken-panel-background"
|
|
671
675
|
],
|
|
672
676
|
"links": {
|
|
673
677
|
"catalogRoute": "?component=pane",
|
|
@@ -1161,6 +1165,11 @@
|
|
|
1161
1165
|
"import": "@kerfjs/ui/wire-workbench",
|
|
1162
1166
|
"required": false,
|
|
1163
1167
|
"stateAttributes": [
|
|
1168
|
+
{
|
|
1169
|
+
"name": "data-responsive-overlay-active",
|
|
1170
|
+
"on": "kui-workbench__rail and kui-workbench__drawer",
|
|
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
|
+
},
|
|
1164
1173
|
{
|
|
1165
1174
|
"name": "data-handle-inset",
|
|
1166
1175
|
"on": "kui-workbench__rail",
|
|
@@ -1202,7 +1211,8 @@
|
|
|
1202
1211
|
"kui-workbench__panel-content",
|
|
1203
1212
|
"kui-workbench__handle",
|
|
1204
1213
|
"kui-workbench__handle-icon",
|
|
1205
|
-
"kui-workbench__restore"
|
|
1214
|
+
"kui-workbench__restore",
|
|
1215
|
+
"kui-workbench__backdrop"
|
|
1206
1216
|
],
|
|
1207
1217
|
"publicTokens": [
|
|
1208
1218
|
"--kui-workbench-rail-width",
|
|
@@ -1850,7 +1860,7 @@
|
|
|
1850
1860
|
],
|
|
1851
1861
|
"avoidWhen": [
|
|
1852
1862
|
"Do not omit headingLevel when the text is the page or section heading.",
|
|
1853
|
-
"
|
|
1863
|
+
"Large, default, and small are intentionally quiet toolbar identity text and have no tone option. Use xlarge-fixed for a normal-color toolbar heading at the fixed font-l step; use Text with an h2-h6 variant for a content subsection title, or ListHeader for a list or menu section."
|
|
1854
1864
|
],
|
|
1855
1865
|
"alternatives": [
|
|
1856
1866
|
{
|
|
@@ -1870,6 +1880,7 @@
|
|
|
1870
1880
|
],
|
|
1871
1881
|
"variants": [
|
|
1872
1882
|
"xlarge",
|
|
1883
|
+
"xlarge-fixed (fixed font-l heading)",
|
|
1873
1884
|
"large",
|
|
1874
1885
|
"default",
|
|
1875
1886
|
"small",
|
|
@@ -3097,7 +3108,7 @@
|
|
|
3097
3108
|
"border": "self",
|
|
3098
3109
|
"padding": "self",
|
|
3099
3110
|
"notes": [
|
|
3100
|
-
"Public resting
|
|
3111
|
+
"Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones."
|
|
3101
3112
|
]
|
|
3102
3113
|
},
|
|
3103
3114
|
"delivery": {
|
|
@@ -3601,7 +3612,8 @@
|
|
|
3601
3612
|
"overflow dividers on each side with tabs scrolled out of view (wired by wireScrollDividers)"
|
|
3602
3613
|
],
|
|
3603
3614
|
"accessibility": [
|
|
3604
|
-
"Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
|
|
3615
|
+
"Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model.",
|
|
3616
|
+
"Call wireTabBars for keyboard focus and selection, including the pinned leading tab's WebKit RTL scroll correction."
|
|
3605
3617
|
],
|
|
3606
3618
|
"geometry": {
|
|
3607
3619
|
"margin": "none",
|
|
@@ -4152,6 +4164,7 @@
|
|
|
4152
4164
|
"form, toolbar-borderless, or navigation presentation",
|
|
4153
4165
|
"default or compact size",
|
|
4154
4166
|
"label or icon-only selected presentation",
|
|
4167
|
+
"optional caret-free round icon-only trigger",
|
|
4155
4168
|
"select- or group-owned focus ring",
|
|
4156
4169
|
"label maximum width and truncation",
|
|
4157
4170
|
"fit-content, max-content, or fill trigger width",
|
|
@@ -589,6 +589,11 @@
|
|
|
589
589
|
"id": "whether the chrome dividers follow the scroll, always show, or never show (chromeDividers)",
|
|
590
590
|
"owner": "application",
|
|
591
591
|
"required": false
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"id": "default or sunken scrolling work surface (appearance)",
|
|
595
|
+
"owner": "application",
|
|
596
|
+
"required": false
|
|
592
597
|
}
|
|
593
598
|
],
|
|
594
599
|
"wiring": {
|
|
@@ -645,7 +650,9 @@
|
|
|
645
650
|
"--kui-edge-inset-inline-end",
|
|
646
651
|
"--kui-edge-inset-inline-start",
|
|
647
652
|
"--kui-pane-separator-color",
|
|
648
|
-
"--kui-pane-separator-width"
|
|
653
|
+
"--kui-pane-separator-width",
|
|
654
|
+
"--kui-pane-chrome-background",
|
|
655
|
+
"--kui-sunken-panel-background"
|
|
649
656
|
]
|
|
650
657
|
},
|
|
651
658
|
"diagnostics": [],
|
|
@@ -1084,6 +1091,12 @@
|
|
|
1084
1091
|
"helpers": ["wireWorkbench", "wireScrollDividers"],
|
|
1085
1092
|
"obligations": [],
|
|
1086
1093
|
"stateAttributes": [
|
|
1094
|
+
{
|
|
1095
|
+
"name": "data-responsive-overlay-active",
|
|
1096
|
+
"on": "kui-workbench__rail and kui-workbench__drawer",
|
|
1097
|
+
"helper": "wireWorkbench",
|
|
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
|
+
},
|
|
1087
1100
|
{
|
|
1088
1101
|
"name": "data-handle-inset",
|
|
1089
1102
|
"on": "kui-workbench__rail",
|
|
@@ -1145,7 +1158,8 @@
|
|
|
1145
1158
|
"kui-workbench__panel-content",
|
|
1146
1159
|
"kui-workbench__handle",
|
|
1147
1160
|
"kui-workbench__handle-icon",
|
|
1148
|
-
"kui-workbench__restore"
|
|
1161
|
+
"kui-workbench__restore",
|
|
1162
|
+
"kui-workbench__backdrop"
|
|
1149
1163
|
],
|
|
1150
1164
|
"publicTokens": [
|
|
1151
1165
|
"--kui-workbench-rail-width",
|
|
@@ -2531,7 +2545,7 @@
|
|
|
2531
2545
|
"border": "self",
|
|
2532
2546
|
"padding": "self",
|
|
2533
2547
|
"notes": [
|
|
2534
|
-
"Public resting
|
|
2548
|
+
"Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones."
|
|
2535
2549
|
]
|
|
2536
2550
|
}
|
|
2537
2551
|
},
|
|
@@ -69,7 +69,7 @@ No wiring helper.
|
|
|
69
69
|
|
|
70
70
|
Margin: self · border: self · padding: self (layout role: navigation). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
71
71
|
|
|
72
|
-
- Public resting
|
|
72
|
+
- Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones.
|
|
73
73
|
|
|
74
74
|
## Accessibility
|
|
75
75
|
|
package/ai/components/pane.md
CHANGED
|
@@ -13,6 +13,7 @@ Organize a sidebar, main area, inspector, or dialog column into fixed vertical h
|
|
|
13
13
|
- An application column needs shared header, content, and optional footer organization with exactly one scrolling content owner.
|
|
14
14
|
- A pane boundary needs an opt-in separator on any combination of logical sides.
|
|
15
15
|
- Pinned chrome needs a divider from the scrolling content only while content is scrolled beneath it (wireScrollDividers).
|
|
16
|
+
- A lowered background must cover the scrolling work viewport and blank space after short content without a second scroll container (appearance: sunken).
|
|
16
17
|
|
|
17
18
|
**Not when:**
|
|
18
19
|
|
|
@@ -60,7 +61,7 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
|
|
|
60
61
|
|
|
61
62
|
## State and wiring
|
|
62
63
|
|
|
63
|
-
**The app owns:** root and content semantics; accessible labels; header, content, and footer children; which logical boundaries show separators; which sides may compensate for device safe areas in an app-owned arrangement (safeAreaEdges); responsive placement and visibility; whether the chrome dividers follow the scroll, always show, or never show (chromeDividers).
|
|
64
|
+
**The app owns:** root and content semantics; accessible labels; header, content, and footer children; which logical boundaries show separators; which sides may compensate for device safe areas in an app-owned arrangement (safeAreaEdges); responsive placement and visibility; whether the chrome dividers follow the scroll, always show, or never show (chromeDividers); default or sunken scrolling work surface (appearance).
|
|
64
65
|
|
|
65
66
|
**Wiring:** `wireScrollDividers` is optional.
|
|
66
67
|
|
|
@@ -89,7 +90,7 @@ Public class hooks (select for layout placement only, never to change the compon
|
|
|
89
90
|
|
|
90
91
|
Never put `kui-pane`, `kui-pane__content`, `kui-pane__footer`, `kui-pane__header`, `kui-pane__toolbar` on an element you write; render `Pane` instead (`KUI-L103`).
|
|
91
92
|
|
|
92
|
-
Public tokens it reads: `--kui-edge-inset-block-end`, `--kui-edge-inset-block-start`, `--kui-edge-inset-inline-end`, `--kui-edge-inset-inline-start`, `--kui-pane-separator-color`, `--kui-pane-separator-width`. Set a token only where its public contract allows; prefer a prop.
|
|
93
|
+
Public tokens it reads: `--kui-edge-inset-block-end`, `--kui-edge-inset-block-start`, `--kui-edge-inset-inline-end`, `--kui-edge-inset-inline-start`, `--kui-pane-separator-color`, `--kui-pane-separator-width`, `--kui-pane-chrome-background`, `--kui-sunken-panel-background`. Set a token only where its public contract allows; prefer a prop.
|
|
93
94
|
|
|
94
95
|
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
95
96
|
|
package/ai/components/select.md
CHANGED
|
@@ -46,6 +46,7 @@ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md
|
|
|
46
46
|
- form, toolbar-borderless, or navigation presentation
|
|
47
47
|
- default or compact size
|
|
48
48
|
- label or icon-only selected presentation
|
|
49
|
+
- optional caret-free round icon-only trigger
|
|
49
50
|
- select- or group-owned focus ring
|
|
50
51
|
- label maximum width and truncation
|
|
51
52
|
- fit-content, max-content, or fill trigger width
|
|
@@ -13,7 +13,7 @@ Extra-large through extra-small toolbar identity text.
|
|
|
13
13
|
**Not when:**
|
|
14
14
|
|
|
15
15
|
- Do not omit headingLevel when the text is the page or section heading.
|
|
16
|
-
-
|
|
16
|
+
- Large, default, and small are intentionally quiet toolbar identity text and have no tone option. Use xlarge-fixed for a normal-color toolbar heading at the fixed font-l step; use Text with an h2-h6 variant for a content subsection title, or ListHeader for a list or menu section.
|
|
17
17
|
|
|
18
18
|
**Alternatives:**
|
|
19
19
|
|
|
@@ -33,6 +33,7 @@ Exact prop names and types: [`@kerfjs/ui/toolbar-text`](../public-api-signatures
|
|
|
33
33
|
**Variants (configure, do not restyle):**
|
|
34
34
|
|
|
35
35
|
- xlarge
|
|
36
|
+
- xlarge-fixed (fixed font-l heading)
|
|
36
37
|
- large
|
|
37
38
|
- default
|
|
38
39
|
- small
|
|
@@ -76,6 +76,7 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
|
|
|
76
76
|
|
|
77
77
|
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
78
78
|
|
|
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.
|
|
79
80
|
- `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.
|
|
80
81
|
- `data-resizing` on `kui-workbench__rail` (`wireWorkbench`): Present on a resizable rail or the drawer while a pointer drag resizes it.
|
|
81
82
|
- `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.
|
|
@@ -99,9 +100,9 @@ Margin: none · border: self · padding: child (layout role: structure). `self`
|
|
|
99
100
|
|
|
100
101
|
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
101
102
|
|
|
102
|
-
Public class hooks (select for layout placement only, never to change the component's look): `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`.
|
|
103
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`, `kui-workbench__backdrop`.
|
|
103
104
|
|
|
104
|
-
Never put `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore` on an element you write; render `Workbench` instead (`KUI-L103`).
|
|
105
|
+
Never put `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`, `kui-workbench__backdrop` on an element you write; render `Workbench` instead (`KUI-L103`).
|
|
105
106
|
|
|
106
107
|
Public tokens it reads: `--kui-workbench-rail-width`, `--kui-workbench-drawer-height`, `--kui-workbench-popup-z`, `--kui-workbench-overlay-z`, `--kui-workbench-overlay-max-width`, `--kui-workbench-overlay-max-height`, `--kui-workbench-restore-inset`, `--kui-workbench-restore-z`, `--kui-workbench-overlay-dismiss-margin`. Set a token only where its public contract allows; prefer a prop.
|
|
107
108
|
|