@kerfjs/ui 5.0.0-beta.6 → 5.0.0-beta.61
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 +494 -138
- package/ai/application-ui-diagnostic-ids-v1.json +109 -0
- package/ai/application-ui-profile-sync.cjs +529 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +102 -0
- package/ai/application-ui-profile.defaults.json +96 -0
- package/ai/application-ui-profile.mjs +626 -0
- package/ai/application-ui-profile.schema.json +130 -0
- package/ai/catalog-authoring.json +36 -0
- package/ai/catalog-authoring.schema.json +109 -0
- package/ai/compile-time-contracts-v1.json +149 -0
- package/ai/compile-time-contracts-v1.schema.json +52 -0
- package/ai/component-catalog-extension.schema.json +79 -0
- package/ai/component-catalog.json +4041 -591
- package/ai/component-catalog.schema.json +78 -1
- package/ai/component-class-owners.cjs +83 -0
- package/ai/component-composition-extension.d.ts +7 -0
- package/ai/component-composition-extension.schema.json +7 -0
- package/ai/component-composition-rules.json +524 -0
- package/ai/component-composition.d.ts +125 -0
- package/ai/component-composition.json +7074 -0
- package/ai/component-composition.schema.json +375 -0
- package/ai/components/README.md +171 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +72 -0
- package/ai/components/chip.md +72 -0
- package/ai/components/collapsible-panel.md +102 -0
- package/ai/components/content-item.md +90 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/document-baseline.md +75 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/floating-toolbar.md +82 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/grid.md +96 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +91 -0
- package/ai/components/list-header.md +89 -0
- package/ai/components/list-inset-control.md +74 -0
- package/ai/components/list-inset-text.md +72 -0
- package/ai/components/list-item.md +94 -0
- package/ai/components/list.md +103 -0
- package/ai/components/loading-spinner.md +72 -0
- package/ai/components/lucide-icon.md +66 -0
- package/ai/components/nav-stack.md +103 -0
- package/ai/components/pane.md +100 -0
- package/ai/components/popup-menu.md +171 -0
- package/ai/components/recipe-app-shell.md +57 -0
- package/ai/components/recipe-collapsible-sidebar.md +57 -0
- package/ai/components/recipe-compact-toolbar.md +57 -0
- package/ai/components/recipe-composer-form.md +57 -0
- package/ai/components/recipe-list-detail-dialog.md +57 -0
- package/ai/components/recipe-list-workspace-states.md +57 -0
- package/ai/components/recipe-loading-inspector.md +57 -0
- package/ai/components/recipe-navigation-sidebar.md +57 -0
- package/ai/components/recipe-navigation-stack.md +57 -0
- package/ai/components/recipe-workspace-header.md +57 -0
- package/ai/components/resize.md +106 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +112 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-view.md +102 -0
- package/ai/components/state-banner.md +94 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +78 -0
- package/ai/components/tab-bar.md +112 -0
- package/ai/components/tab-scaffold.md +94 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/text.md +83 -0
- package/ai/components/token-search-field.md +103 -0
- package/ai/components/toolbar-control-group.md +102 -0
- package/ai/components/toolbar-text.md +78 -0
- package/ai/components/toolbar.md +97 -0
- package/ai/components/value-table.md +73 -0
- package/ai/components/wa-accordion-item.md +55 -0
- package/ai/components/wa-accordion.md +65 -0
- package/ai/components/wa-animated-image.md +55 -0
- package/ai/components/wa-animation.md +55 -0
- package/ai/components/wa-avatar.md +55 -0
- package/ai/components/wa-badge.md +55 -0
- package/ai/components/wa-breadcrumb-item.md +53 -0
- package/ai/components/wa-breadcrumb.md +55 -0
- package/ai/components/wa-button-group.md +59 -0
- package/ai/components/wa-button.md +55 -0
- package/ai/components/wa-callout.md +58 -0
- package/ai/components/wa-card.md +59 -0
- package/ai/components/wa-carousel-item.md +53 -0
- package/ai/components/wa-carousel.md +55 -0
- package/ai/components/wa-checkbox-group.md +55 -0
- package/ai/components/wa-checkbox.md +55 -0
- package/ai/components/wa-color-picker.md +55 -0
- package/ai/components/wa-comparison.md +55 -0
- package/ai/components/wa-copy-button.md +55 -0
- package/ai/components/wa-details.md +61 -0
- package/ai/components/wa-dialog.md +59 -0
- package/ai/components/wa-divider.md +53 -0
- package/ai/components/wa-drawer.md +55 -0
- package/ai/components/wa-dropdown-item.md +60 -0
- package/ai/components/wa-dropdown.md +60 -0
- package/ai/components/wa-format-bytes.md +53 -0
- package/ai/components/wa-format-date.md +53 -0
- package/ai/components/wa-format-number.md +53 -0
- package/ai/components/wa-icon.md +58 -0
- package/ai/components/wa-include.md +53 -0
- package/ai/components/wa-input.md +59 -0
- package/ai/components/wa-intersection-observer.md +53 -0
- package/ai/components/wa-known-date.md +53 -0
- package/ai/components/wa-markdown.md +53 -0
- package/ai/components/wa-mutation-observer.md +53 -0
- package/ai/components/wa-number-input.md +55 -0
- package/ai/components/wa-option.md +59 -0
- package/ai/components/wa-otp-input.md +53 -0
- package/ai/components/wa-page.md +53 -0
- package/ai/components/wa-pagination.md +55 -0
- package/ai/components/wa-popover.md +55 -0
- package/ai/components/wa-popup.md +53 -0
- package/ai/components/wa-progress-bar.md +53 -0
- package/ai/components/wa-progress-ring.md +53 -0
- package/ai/components/wa-qr-code.md +53 -0
- package/ai/components/wa-radio-group.md +59 -0
- package/ai/components/wa-radio.md +55 -0
- package/ai/components/wa-random-content.md +53 -0
- package/ai/components/wa-rating.md +55 -0
- package/ai/components/wa-relative-time.md +53 -0
- package/ai/components/wa-resize-observer.md +53 -0
- package/ai/components/wa-scroller.md +53 -0
- package/ai/components/wa-select.md +63 -0
- package/ai/components/wa-skeleton.md +53 -0
- package/ai/components/wa-slider.md +55 -0
- package/ai/components/wa-spinner.md +58 -0
- package/ai/components/wa-split-panel.md +58 -0
- package/ai/components/wa-switch.md +53 -0
- package/ai/components/wa-tab-group.md +69 -0
- package/ai/components/wa-tab-panel.md +60 -0
- package/ai/components/wa-tab.md +59 -0
- package/ai/components/wa-tag.md +59 -0
- package/ai/components/wa-textarea.md +53 -0
- package/ai/components/wa-time-input.md +55 -0
- package/ai/components/wa-toast-item.md +60 -0
- package/ai/components/wa-toast.md +60 -0
- package/ai/components/wa-tooltip.md +55 -0
- package/ai/components/wa-tree-item.md +55 -0
- package/ai/components/wa-tree.md +55 -0
- package/ai/components/wa-zoomable-frame.md +55 -0
- package/ai/components/workbench.md +114 -0
- package/ai/public-api-signatures-v1.md +2597 -190
- package/ai/skill.md +259 -65
- package/ai/webawesome-jsx-signatures-v1.md +9 -2
- package/analyzer/cli.mjs +49 -0
- package/analyzer/component-ownership.d.mts +56 -0
- package/analyzer/component-ownership.mjs +184 -0
- package/analyzer/index.d.mts +49 -0
- package/analyzer/index.mjs +1458 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/analyzer/report.schema.json +66 -0
- package/analyzer/selectors.d.mts +21 -0
- package/analyzer/selectors.mjs +212 -0
- package/dist/app-tab.d.ts +41 -4
- package/dist/app-tab.js +3 -1
- package/dist/badge.d.ts +52 -0
- package/dist/badge.js +3 -0
- package/dist/badge.js.map +1 -0
- package/dist/browser/app-tab.js +1 -0
- package/dist/browser/badge.js +3 -0
- package/dist/browser/catalog.js +25 -0
- package/dist/browser/chip.js +3 -0
- package/dist/browser/collapsible-panel.js +7 -0
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/list-action-row.js +5 -0
- package/dist/browser/list-header.js +8 -0
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +5 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/{panel-header.js → nav-stack.js} +4 -2
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/select.js +2 -0
- package/dist/browser/skeleton.js +3 -0
- package/dist/browser/spacer.js +3 -0
- package/dist/browser/split-view.js +10 -0
- package/dist/browser/state-banner.js +2 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +3 -0
- package/dist/browser/tab-scaffold.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-text.js +1 -0
- package/dist/browser/value-table.js +1 -0
- package/dist/browser/workbench.js +10 -0
- package/dist/catalog-resources.d.ts +46 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +90 -0
- package/dist/catalog.js +501 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chip.d.ts +29 -0
- package/dist/chip.js +3 -0
- package/dist/chip.js.map +1 -0
- package/dist/chunk-2G2ZJQYK.js +152 -0
- package/dist/chunk-2G2ZJQYK.js.map +1 -0
- package/dist/chunk-3SXMEK3B.js +43 -0
- package/dist/chunk-3SXMEK3B.js.map +1 -0
- package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
- package/dist/chunk-4R777DUZ.js.map +1 -0
- package/dist/chunk-4SQK27MR.js +202 -0
- package/dist/chunk-4SQK27MR.js.map +1 -0
- package/dist/chunk-5I7QGQVT.js +24 -0
- package/dist/chunk-5I7QGQVT.js.map +1 -0
- package/dist/chunk-5PESG2VP.js +115 -0
- package/dist/chunk-5PESG2VP.js.map +1 -0
- package/dist/chunk-5Q3N6EV7.js +156 -0
- package/dist/chunk-5Q3N6EV7.js.map +1 -0
- package/dist/chunk-6ZXOQEAN.js +27 -0
- package/dist/chunk-6ZXOQEAN.js.map +1 -0
- package/dist/chunk-7JUBXOIV.js +103 -0
- package/dist/chunk-7JUBXOIV.js.map +1 -0
- package/dist/chunk-A3CKOW2R.js +622 -0
- package/dist/chunk-A3CKOW2R.js.map +1 -0
- package/dist/chunk-AHEG27M7.js +66 -0
- package/dist/chunk-AHEG27M7.js.map +1 -0
- package/dist/chunk-AUKT3KMG.js +37 -0
- package/dist/chunk-AUKT3KMG.js.map +1 -0
- package/dist/chunk-AYUHMAI6.js +48 -0
- package/dist/chunk-AYUHMAI6.js.map +1 -0
- package/dist/chunk-BFPBS5Y4.js +250 -0
- package/dist/chunk-BFPBS5Y4.js.map +1 -0
- package/dist/{chunk-MQIZAD4A.js → chunk-C4OYOKWX.js} +138 -22
- package/dist/chunk-C4OYOKWX.js.map +1 -0
- package/dist/chunk-DG6G5EPF.js +35 -0
- package/dist/chunk-DG6G5EPF.js.map +1 -0
- package/dist/chunk-E36EVCKG.js +34 -0
- package/dist/chunk-E36EVCKG.js.map +1 -0
- package/dist/chunk-EAC4CDY7.js +57 -0
- package/dist/chunk-EAC4CDY7.js.map +1 -0
- package/dist/chunk-EZVNC4J6.js +104 -0
- package/dist/chunk-EZVNC4J6.js.map +1 -0
- package/dist/chunk-F4QMLOXJ.js +135 -0
- package/dist/chunk-F4QMLOXJ.js.map +1 -0
- package/dist/chunk-GLDWRCAM.js +49 -0
- package/dist/chunk-GLDWRCAM.js.map +1 -0
- package/dist/chunk-I3Q7KKYM.js +33 -0
- package/dist/chunk-I3Q7KKYM.js.map +1 -0
- package/dist/chunk-IA7TMD4Y.js +288 -0
- package/dist/chunk-IA7TMD4Y.js.map +1 -0
- package/dist/chunk-JCV4GXWB.js +249 -0
- package/dist/chunk-JCV4GXWB.js.map +1 -0
- package/dist/chunk-K47P7QZC.js +17 -0
- package/dist/chunk-K47P7QZC.js.map +1 -0
- package/dist/chunk-KLJKU6ZL.js +109 -0
- package/dist/chunk-KLJKU6ZL.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-KROD7KZK.js} +7 -4
- package/dist/chunk-KROD7KZK.js.map +1 -0
- package/dist/chunk-MA73TA6D.js +42 -0
- package/dist/chunk-MA73TA6D.js.map +1 -0
- package/dist/chunk-MERWRTBG.js +45 -0
- package/dist/chunk-MERWRTBG.js.map +1 -0
- package/dist/chunk-MEY33VWB.js +44 -0
- package/dist/chunk-MEY33VWB.js.map +1 -0
- package/dist/chunk-MP2GDBQZ.js +50 -0
- package/dist/chunk-MP2GDBQZ.js.map +1 -0
- package/dist/chunk-N3GKMPDW.js +51 -0
- package/dist/chunk-N3GKMPDW.js.map +1 -0
- package/dist/chunk-NAPE7WUS.js +75 -0
- package/dist/chunk-NAPE7WUS.js.map +1 -0
- package/dist/chunk-NN6GYOA2.js +47 -0
- package/dist/chunk-NN6GYOA2.js.map +1 -0
- package/dist/chunk-NNMLEDMD.js +399 -0
- package/dist/chunk-NNMLEDMD.js.map +1 -0
- package/dist/chunk-NYL63PSD.js +95 -0
- package/dist/chunk-NYL63PSD.js.map +1 -0
- package/dist/chunk-P7D3EMXM.js +52 -0
- package/dist/chunk-P7D3EMXM.js.map +1 -0
- package/dist/chunk-PSHUSWQH.js +18 -0
- package/dist/chunk-PSHUSWQH.js.map +1 -0
- package/dist/chunk-Q6YU3BT7.js +138 -0
- package/dist/chunk-Q6YU3BT7.js.map +1 -0
- package/dist/chunk-RRB26JRJ.js +247 -0
- package/dist/chunk-RRB26JRJ.js.map +1 -0
- package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
- package/dist/chunk-SRSJO5QE.js.map +1 -0
- package/dist/chunk-SWVW56CV.js +188 -0
- package/dist/chunk-SWVW56CV.js.map +1 -0
- package/dist/chunk-TEYARRAK.js +216 -0
- package/dist/chunk-TEYARRAK.js.map +1 -0
- package/dist/chunk-UCKKT6KO.js +71 -0
- package/dist/chunk-UCKKT6KO.js.map +1 -0
- package/dist/chunk-UIDKY4UB.js +14 -0
- package/dist/chunk-UIDKY4UB.js.map +1 -0
- package/dist/chunk-VCBTX62E.js +135 -0
- package/dist/chunk-VCBTX62E.js.map +1 -0
- package/dist/chunk-VZOFZPSO.js +71 -0
- package/dist/chunk-VZOFZPSO.js.map +1 -0
- package/dist/{chunk-TRNBHPNW.js → chunk-X5QSICJ3.js} +13 -7
- package/dist/chunk-X5QSICJ3.js.map +1 -0
- package/dist/chunk-Y74NWGQW.js +418 -0
- package/dist/chunk-Y74NWGQW.js.map +1 -0
- package/dist/chunk-ZLWQZUGF.js +27 -0
- package/dist/chunk-ZLWQZUGF.js.map +1 -0
- package/dist/collapsible-panel.d.ts +122 -0
- package/dist/collapsible-panel.js +115 -0
- package/dist/collapsible-panel.js.map +1 -0
- package/dist/content-item.d.ts +46 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/css-values.d.ts +107 -0
- package/dist/css-values.js +3 -0
- package/dist/css-values.js.map +1 -0
- package/dist/device-class.js +33 -5
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.d.ts +6 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/empty-state.d.ts +5 -2
- package/dist/empty-state.js +1 -1
- package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
- package/dist/floating-toolbar.d.ts +51 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/grid.d.ts +42 -0
- package/dist/grid.js +5 -0
- package/dist/grid.js.map +1 -0
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +9 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/index.d.ts +35 -14
- package/dist/index.js +43 -22
- package/dist/list-action-row.d.ts +64 -0
- package/dist/list-action-row.js +8 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/list-header.d.ts +99 -0
- package/dist/list-header.js +10 -0
- package/dist/list-header.js.map +1 -0
- package/dist/list-inset-control.d.ts +22 -0
- package/dist/list-inset-control.js +3 -0
- package/dist/list-inset-control.js.map +1 -0
- package/dist/list-inset-text.d.ts +30 -0
- package/dist/list-inset-text.js +4 -0
- package/dist/list-inset-text.js.map +1 -0
- package/dist/list-item.d.ts +62 -0
- package/dist/list-item.js +8 -0
- package/dist/list-item.js.map +1 -0
- package/dist/list.d.ts +59 -0
- package/dist/list.js +6 -0
- package/dist/list.js.map +1 -0
- package/dist/loading-spinner.d.ts +3 -1
- package/dist/loading-spinner.js +1 -1
- package/dist/lucide-icon.d.ts +3 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/nav-stack.d.ts +60 -10
- package/dist/nav-stack.js +6 -1
- package/dist/pane.d.ts +102 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-DqwtBxQL.d.ts +63 -0
- package/dist/popup-menu-register.d.ts +9 -0
- package/dist/popup-menu-register.js +31 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +99 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +48 -0
- package/dist/row.js +6 -0
- package/dist/row.js.map +1 -0
- package/dist/segmented-control.d.ts +13 -8
- package/dist/segmented-control.js +1 -1
- package/dist/select-register.d.ts +5 -1
- package/dist/select-register.js +243 -2
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +101 -8
- package/dist/select.js +4 -1
- package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
- package/dist/sides-BPSWde0A.d.ts +4 -0
- package/dist/skeleton.d.ts +31 -0
- package/dist/skeleton.js +4 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/spacer.d.ts +18 -0
- package/dist/spacer.js +4 -0
- package/dist/spacer.js.map +1 -0
- package/dist/split-view.d.ts +39 -7
- package/dist/split-view.js +120 -10
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +19 -5
- package/dist/state-banner.js +4 -1
- package/dist/styles/app-tab.css +104 -0
- package/dist/styles/badge.css +118 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
- package/dist/styles/catalog/components/catalog-example.css +164 -0
- package/dist/styles/catalog/components/catalog-stage.css +55 -0
- package/dist/styles/catalog/components/catalog.css +12 -0
- package/dist/styles/catalog.css +5 -0
- package/dist/styles/chip.css +118 -0
- package/dist/styles/collapsible-panel.css +575 -0
- package/dist/styles/content-item.css +30 -0
- package/dist/styles/document.css +23 -0
- package/dist/styles/floating-toolbar.css +119 -0
- package/dist/styles/foundation.css +178 -40
- package/dist/styles/grid.css +28 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +257 -0
- package/dist/styles/list-header.css +228 -0
- package/dist/styles/list-inset-control.css +30 -0
- package/dist/styles/list-inset-text.css +29 -0
- package/dist/styles/list-item.css +245 -0
- package/dist/styles/list.css +133 -0
- package/dist/styles/nav-stack.css +158 -50
- package/dist/styles/pane.css +229 -0
- package/dist/styles/popup-menu.css +271 -0
- package/dist/styles/resizable-region.css +429 -4
- package/dist/styles/row.css +111 -0
- package/dist/styles/segmented-control.css +33 -9
- package/dist/styles/select.css +262 -9
- package/dist/styles/skeleton.css +92 -0
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-view.css +108 -3
- package/dist/styles/state-banner.css +94 -19
- package/dist/styles/styles.css +14 -4
- package/dist/styles/sunken-panel.css +22 -0
- package/dist/styles/surface-scaffold.css +56 -0
- package/dist/styles/tab-bar.css +132 -9
- package/dist/styles/tab-scaffold.css +113 -3
- package/dist/styles/text.css +65 -0
- package/dist/styles/token-search-field.css +49 -43
- package/dist/styles/toolbar-control-group.css +465 -28
- package/dist/styles/toolbar-text.css +88 -4
- package/dist/styles/toolbar.css +322 -11
- package/dist/styles/value-table.css +34 -4
- package/dist/styles/webawesome.css +348 -10
- package/dist/styles/workbench.css +828 -7
- package/dist/sunken-panel.d.ts +22 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold.d.ts +30 -0
- package/dist/surface-scaffold.js +3 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/tab-bar.d.ts +31 -6
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +54 -7
- package/dist/tab-scaffold.js +82 -9
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/text.d.ts +38 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/token-search-field-DvgFLhLL.d.ts +130 -0
- package/dist/token-search-field.d.ts +3 -43
- package/dist/token-search-field.js +1 -1
- package/dist/token-search-model.d.ts +3 -0
- package/dist/token-search-model.js +3 -0
- package/dist/token-search-model.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +65 -7
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +37 -4
- package/dist/toolbar-text.js +3 -1
- package/dist/toolbar.d.ts +56 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-BuHELdXR.d.ts +117 -0
- package/dist/value-table.d.ts +13 -3
- package/dist/value-table.js +3 -1
- package/dist/webawesome.d.ts +8 -1
- package/dist/wire-catalog.d.ts +82 -0
- package/dist/wire-catalog.js +327 -0
- package/dist/wire-catalog.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +147 -7
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +69 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/wire-sidebar.d.ts +63 -0
- package/dist/wire-sidebar.js +231 -0
- package/dist/wire-sidebar.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +19 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-scaffold.js +9 -4
- package/dist/wire-tab-scaffold.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +65 -3
- 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 +218 -7
- package/dist/workbench.js +13 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +413 -23
- package/docs/app-layouts.md +106 -8
- package/docs/catalog.md +440 -0
- package/docs/collapsible-panel.md +363 -0
- package/docs/component-contract.md +560 -52
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +421 -89
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
- package/docs/design/templates/empty-state/filtered.svg +1 -0
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
- package/docs/design/templates/empty-state/with-action.svg +1 -0
- package/docs/design/templates/empty-state-dark.svg +1 -0
- package/docs/design/templates/empty-state.svg +1 -0
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -0
- package/docs/design/templates/list-action-row/default.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
- package/docs/design/templates/list-action-row/selected.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -0
- package/docs/design/templates/list-action-row.svg +1 -0
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -0
- package/docs/design/templates/list-header/action.svg +1 -0
- package/docs/design/templates/list-header/count-dark.svg +1 -0
- package/docs/design/templates/list-header/count.svg +1 -0
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
- package/docs/design/templates/list-header/inline-action.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +1 -0
- package/docs/design/templates/list-header.svg +1 -0
- package/docs/design/templates/list-item/default-dark.svg +1 -0
- package/docs/design/templates/list-item/default.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -0
- package/docs/design/templates/list-item/multiline.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -0
- package/docs/design/templates/list-item/selected.svg +1 -0
- package/docs/design/templates/list-item/trailing-dark.svg +1 -0
- package/docs/design/templates/list-item/trailing.svg +1 -0
- package/docs/design/templates/list-item-dark.svg +1 -0
- package/docs/design/templates/list-item.svg +1 -0
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
- package/docs/design/templates/segmented-control/equal.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small.svg +1 -0
- package/docs/design/templates/segmented-control-dark.svg +1 -0
- package/docs/design/templates/segmented-control.svg +1 -0
- package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
- package/docs/design/templates/skeleton/avatar.svg +1 -0
- package/docs/design/templates/skeleton/block-dark.svg +1 -0
- package/docs/design/templates/skeleton/block.svg +1 -0
- package/docs/design/templates/skeleton/lines-dark.svg +1 -0
- package/docs/design/templates/skeleton/lines.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -0
- package/docs/design/templates/skeleton.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -0
- package/docs/design/templates/state-banner/danger.svg +1 -0
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -0
- package/docs/design/templates/state-banner/info.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -0
- package/docs/design/templates/state-banner/success.svg +1 -0
- package/docs/design/templates/state-banner/warning-dark.svg +1 -0
- package/docs/design/templates/state-banner/warning.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +1 -0
- package/docs/design/templates/state-banner.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
- package/docs/design/templates/tab-bar-dark.svg +1 -0
- package/docs/design/templates/tab-bar.svg +1 -0
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
- package/docs/design/templates/token-search-field/empty.svg +1 -0
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/token-search-field/tokens.svg +1 -0
- package/docs/design/templates/token-search-field-dark.svg +1 -0
- package/docs/design/templates/token-search-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group.svg +1 -0
- package/docs/design/templates/toolbar-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default.svg +1 -0
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/large.svg +1 -0
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/small.svg +1 -0
- package/docs/design/templates/toolbar-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-text.svg +1 -0
- package/docs/design/templates/toolbar.svg +1 -0
- package/docs/design/templates/value-table/details-dark.svg +1 -0
- package/docs/design/templates/value-table/details.svg +1 -0
- package/docs/design/templates/value-table-dark.svg +1 -0
- package/docs/design/templates/value-table.svg +1 -0
- package/docs/design/templates.md +138 -0
- package/docs/design-philosophy.md +48 -20
- package/docs/device-class.md +10 -9
- package/docs/document-baseline.md +38 -0
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/command-palette-adapter.tsx +69 -17
- package/docs/examples/component-catalog-extension.json +45 -0
- package/docs/examples/component-composition-extension.json +80 -0
- package/docs/layout.md +409 -59
- package/docs/nav-stack.md +126 -14
- package/docs/recipes.md +137 -54
- package/docs/split-view.md +69 -6
- package/docs/sunken-panel.md +58 -0
- package/docs/surface-scaffold.md +25 -0
- package/docs/tab-scaffold.md +94 -10
- package/docs/type-contracts.md +134 -0
- package/docs/ui-analyzer.md +306 -0
- package/docs/ui-doctor.md +107 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +40 -16
- package/docs/webawesome-theme.md +175 -16
- package/docs/workbench.md +534 -12
- package/doctor/cli.mjs +115 -0
- package/doctor/config.schema.json +68 -0
- package/doctor/eslint-diagnostics.d.mts +24 -0
- package/doctor/eslint-diagnostics.mjs +24 -0
- package/doctor/index.d.mts +116 -0
- package/doctor/index.mjs +1277 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1203 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +423 -42
- package/package.json +241 -37
- package/traversal-exclusions.mjs +27 -0
- package/ux-demo/recipes/app-shell.tsx +205 -17
- package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
- package/ux-demo/recipes/compact-toolbar.tsx +135 -14
- package/ux-demo/recipes/composer-form.tsx +133 -21
- package/ux-demo/recipes/list-detail-dialog.tsx +282 -0
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +15 -5
- package/ux-demo/recipes/loading-inspector.tsx +204 -0
- package/ux-demo/recipes/mount-recipe.ts +28 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
- package/ux-demo/recipes/navigation-stack.tsx +79 -24
- package/ux-demo/recipes/types.ts +23 -2
- package/ux-demo/recipes/workspace-header.tsx +86 -5
- package/dist/browser/menu-action-row.js +0 -3
- package/dist/browser/menu-header.js +0 -5
- package/dist/browser/menu-item.js +0 -3
- package/dist/chunk-24Z2XE6C.js +0 -10
- package/dist/chunk-24Z2XE6C.js.map +0 -1
- package/dist/chunk-2RJBFNB6.js +0 -172
- package/dist/chunk-2RJBFNB6.js.map +0 -1
- package/dist/chunk-55DATV3A.js +0 -10
- package/dist/chunk-55DATV3A.js.map +0 -1
- package/dist/chunk-56RJXPHG.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7LDCTU7D.js +0 -134
- package/dist/chunk-7LDCTU7D.js.map +0 -1
- package/dist/chunk-AQNKJRFH.js +0 -79
- package/dist/chunk-AQNKJRFH.js.map +0 -1
- package/dist/chunk-CTQKI2XL.js +0 -28
- package/dist/chunk-CTQKI2XL.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-EGHL5S4P.js +0 -33
- package/dist/chunk-EGHL5S4P.js.map +0 -1
- package/dist/chunk-KZKSBUKC.js +0 -19
- package/dist/chunk-KZKSBUKC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-MBR3TYNL.js +0 -14
- package/dist/chunk-MBR3TYNL.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js +0 -10
- package/dist/chunk-MFKMHK5W.js.map +0 -1
- package/dist/chunk-MQIZAD4A.js.map +0 -1
- package/dist/chunk-NPPD2A6O.js +0 -40
- package/dist/chunk-NPPD2A6O.js.map +0 -1
- package/dist/chunk-R6JHHBKQ.js +0 -19
- package/dist/chunk-R6JHHBKQ.js.map +0 -1
- package/dist/chunk-RBTVBGRD.js +0 -23
- package/dist/chunk-RBTVBGRD.js.map +0 -1
- package/dist/chunk-S3TPM2LP.js +0 -23
- package/dist/chunk-S3TPM2LP.js.map +0 -1
- package/dist/chunk-TRNBHPNW.js.map +0 -1
- package/dist/chunk-VHW5YNIB.js +0 -17
- package/dist/chunk-VHW5YNIB.js.map +0 -1
- package/dist/chunk-W2FK7ZNY.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-XZXRLY5Q.js +0 -33
- package/dist/chunk-XZXRLY5Q.js.map +0 -1
- package/dist/menu-action-row.d.ts +0 -50
- package/dist/menu-action-row.js +0 -4
- package/dist/menu-action-row.js.map +0 -1
- package/dist/menu-header.d.ts +0 -41
- package/dist/menu-header.js +0 -6
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.d.ts +0 -31
- package/dist/menu-item.js +0 -4
- package/dist/menu-item.js.map +0 -1
- package/dist/panel-header.d.ts +0 -26
- package/dist/panel-header.js +0 -6
- package/dist/panel-header.js.map +0 -1
- package/dist/styles/menu-action-row.css +0 -160
- package/dist/styles/menu-header.css +0 -160
- package/dist/styles/menu-item.css +0 -123
- package/dist/styles/panel-header.css +0 -59
- package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
- package/ux-demo/recipes/recipes.css +0 -355
package/docs/layout.md
CHANGED
|
@@ -1,64 +1,213 @@
|
|
|
1
1
|
# Pane and content layout
|
|
2
2
|
|
|
3
|
-
Import `@kerfjs/ui/
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Import `Pane` from `@kerfjs/ui/pane`. Browser-aware bundlers receive its CSS
|
|
4
|
+
automatically; other consumers can import `@kerfjs/ui/pane.css`. Import
|
|
5
|
+
`@kerfjs/ui/layout.css` as well when using the `.kui-content` stack and control
|
|
6
|
+
layout classes; place `ContentItem` children from `@kerfjs/ui/content-item`. The vocabulary deliberately describes structure rather than
|
|
7
|
+
location: the same pane can be placed anywhere.
|
|
6
8
|
|
|
7
9
|
## Anatomy
|
|
8
10
|
|
|
9
11
|
```tsx
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
<Pane
|
|
13
|
+
element="aside"
|
|
14
|
+
label="Workspace"
|
|
15
|
+
contentElement="nav"
|
|
16
|
+
contentLabel="Workspace pages"
|
|
17
|
+
separators={["inline-end"]}
|
|
18
|
+
header={<Toolbar label="Workspace" ... />}
|
|
19
|
+
footer={<Toolbar label="Actions" ... />}
|
|
20
|
+
>
|
|
13
21
|
<section>...</section>
|
|
14
22
|
<section>...</section>
|
|
15
|
-
|
|
16
|
-
<footer class="kui-pane__footer"><Toolbar label="Actions" ... /></footer>
|
|
17
|
-
</aside>
|
|
23
|
+
</Pane>
|
|
18
24
|
```
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
scrolling content area, and an optional footer. A
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
`Pane` has no padding. It reserves rows for an optional vertical header, one
|
|
27
|
+
scrolling vertical content area, and an optional footer. A header may contain a
|
|
28
|
+
top toolbar followed by secondary toolbar or status rows. A main area or dialog
|
|
29
|
+
often omits the footer; a navigation pane commonly uses all three. Fixed chrome
|
|
30
|
+
stays outside `.kui-pane__content`, which is the pane's only scroll owner.
|
|
24
31
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
Tall fixed chrome can leave a short pane no room for its content (a small
|
|
33
|
+
window, or text at 200%). `chromePlacement="auto"` keeps the header and footer
|
|
34
|
+
pinned while the pane is at least 480px (30rem, so it scales with the text
|
|
35
|
+
size) tall, and below that lets the whole pane scroll as one column, header,
|
|
36
|
+
content, and footer together, so the content keeps its natural height. The
|
|
37
|
+
default `fixed` always pins them.
|
|
29
38
|
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
-
|
|
39
|
+
Pass any combination of logical sides to `separators`: `block-start`,
|
|
40
|
+
`block-end`, `inline-start`, and `inline-end`. Every line is off by default and
|
|
41
|
+
each enabled side uses `--kui-pane-separator-width` (1px) and
|
|
42
|
+
`--kui-pane-separator-color` (`--kui-color-neutral-border-normal`). Logical sides keep pane
|
|
43
|
+
boundaries correct in both left-to-right and right-to-left layouts.
|
|
44
|
+
|
|
45
|
+
### Scroll dividers
|
|
34
46
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
47
|
+
Toolbars draw no divider by default. The line between pinned chrome and the
|
|
48
|
+
content that scrolls beside it is scroll state, not decoration: it shows only
|
|
49
|
+
while content is scrolled away from that edge, the way platform navigation bars
|
|
50
|
+
gain a hairline once content moves beneath them.
|
|
51
|
+
|
|
52
|
+
- A near edge (top, left) hides at the scroll start.
|
|
53
|
+
- A far edge (bottom, right) hides at the scroll end, and whenever the content
|
|
54
|
+
fits and nothing scrolls.
|
|
55
|
+
|
|
56
|
+
Call `wireScrollDividers` from `@kerfjs/ui/wire-scroll-dividers` once at the
|
|
57
|
+
application root and keep its disposer:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { wireScrollDividers } from "@kerfjs/ui/wire-scroll-dividers";
|
|
61
|
+
|
|
62
|
+
const stop = wireScrollDividers(appRoot);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
It covers, by structure, every `Pane` below the root (the header's bottom line
|
|
66
|
+
and the footer's top line, whatever the chrome holds — a `Toolbar`, a
|
|
67
|
+
`mainHeader` list, a `TabBar`) and every `TabBar` strip (a line on each side
|
|
68
|
+
whose tabs are scrolled out of view). That includes the panes a `Workbench`,
|
|
69
|
+
`CollapsiblePanel`, or `Catalog` renders; `wireCatalog` installs it for its
|
|
70
|
+
own root. It also covers every `NavStack` (the top chrome's bottom line and the
|
|
71
|
+
bottom toolbar's top line, around the active view) and every `TabScaffold`
|
|
72
|
+
(the bar's top line, over the active scene). The layout keys on whichever
|
|
73
|
+
element actually scrolls there: the view or scene itself, or, through a sole
|
|
74
|
+
child with no chrome of its own on that edge, a `Pane`'s content or a nested
|
|
75
|
+
`NavStack`'s active view. A sole `Pane` fills its view or scene, so its content
|
|
76
|
+
scrolls under its pinned header; with a header it draws the line under that
|
|
77
|
+
header itself, so the stack's chrome never doubles it. It follows re-renders: panes that appear later are paired, and an
|
|
78
|
+
attribute a morph drops returns before paint.
|
|
79
|
+
|
|
80
|
+
The wiring only reports state; every component draws its own line. It writes
|
|
81
|
+
`data-scroll-overflow` (the edges with content hidden beyond them, in canonical
|
|
82
|
+
`t`/`r`/`b`/`l` order) on each scroller and `data-scroll-divider` (the sides to
|
|
83
|
+
draw) on each piece of chrome, and the Pane, NavStack, TabScaffold, TabBar,
|
|
84
|
+
Toolbar, and List stylesheets draw from those. The line is an inset shadow or a pseudo-element
|
|
85
|
+
inside the component, so no state ever moves the chrome, the content, or a tab.
|
|
86
|
+
Never write a border onto a component to show one.
|
|
87
|
+
|
|
88
|
+
Configure a pane with `chromeDividers`: `scroll` (the default) follows the
|
|
89
|
+
scroll state and draws nothing until the wiring runs; `always` keeps both lines;
|
|
90
|
+
`none` drops them. Layouts forward it through `PaneConfig`
|
|
91
|
+
(`mainPane.chromeDividers`, a panel's `pane.chromeDividers`). A `NavStack` and a
|
|
92
|
+
`TabScaffold` take the same `chromeDividers` for their own chrome (the stack's
|
|
93
|
+
top chrome and bottom toolbar, the scaffold's bar), and a `SplitView` forwards
|
|
94
|
+
it to its compact stack through `compactStack`.
|
|
95
|
+
|
|
96
|
+
For an app-owned arrangement outside a `Pane`, name the scroller and its chrome
|
|
97
|
+
by `id` in `targets`; a `Toolbar` or `List` named as chrome draws the divider
|
|
98
|
+
on its side facing the scroller:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
wireScrollDividers(appRoot, {
|
|
102
|
+
targets: [{ scroller: "results", top: "results-toolbar", bottom: "status" }],
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
A CSS-only version is not used: scroll-driven animations are not available in
|
|
107
|
+
Firefox, scroll-state container queries only in Chromium, and neither lets
|
|
108
|
+
the pinned chrome — a sibling of the scroller — read the scroller's state on
|
|
109
|
+
its own. One wiring keeps the behavior identical in every engine.
|
|
110
|
+
|
|
111
|
+
A pane is safe-area aware. Its background and separators paint through a
|
|
112
|
+
device's unsafe areas while its header, content, and footer pad for each side
|
|
113
|
+
the pane still reaches; the content's block insets are scroll padding, so its
|
|
114
|
+
first and last items can always be scrolled clear. Layouts clear the sides a
|
|
115
|
+
pane does not reach. In an app-owned arrangement, pass `safeAreaEdges` (the
|
|
116
|
+
same logical sides as `separators`; all four by default, `[]` to opt out). See
|
|
117
|
+
[Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
118
|
+
|
|
119
|
+
`.kui-content` is a vertical stack with a 24px gap between major children.
|
|
120
|
+
Sections may contain adjacent `ListItem` rows without adding another major gap.
|
|
121
|
+
Ordinary surface-like children are `ContentItem`s and own their complete
|
|
122
|
+
geometry (see [Content items](#content-items)).
|
|
123
|
+
|
|
124
|
+
Nested selection and hover highlights stay concentric and match their owning
|
|
125
|
+
control's shape. Their inner radius is the outer radius minus the full inset,
|
|
126
|
+
expressed by the shared `--kui-layout-highlight-inset` token (2px by default).
|
|
127
|
+
For example, `SegmentedControl` and `ToolbarControlGroup` place each highlight
|
|
128
|
+
behind a 1px control border and 1px control padding, so a rounded control's 12px
|
|
129
|
+
outer radius produces a 10px highlight radius; a 22px pill produces 20px.
|
|
39
130
|
|
|
40
131
|
A visible parent surface does not make every child another visible card. The
|
|
41
|
-
composer recipe keeps its form as the single surface, uses `
|
|
132
|
+
composer recipe keeps its form as the single surface, uses a heading `Toolbar` for
|
|
42
133
|
its task hierarchy, and places field and action control edges on the shared 8px
|
|
43
134
|
inline gutter instead of nesting them inside another padded content item. A
|
|
44
135
|
conditional `StateBanner` remains visibly distinct because it communicates
|
|
45
136
|
semantic status.
|
|
46
137
|
|
|
138
|
+
## Content items
|
|
139
|
+
|
|
140
|
+
Render an ordinary surface-like `.kui-content` child with `ContentItem` from
|
|
141
|
+
`@kerfjs/ui/content-item` (browser-aware bundlers receive its CSS automatically;
|
|
142
|
+
`@kerfjs/ui/layout.css` and `@kerfjs/ui/content-item.css` both deliver it). It
|
|
143
|
+
owns its complete geometry:
|
|
144
|
+
|
|
145
|
+
- 8px inline margin from the pane edge
|
|
146
|
+
- 1px border, transparent by default
|
|
147
|
+
- 8px internal padding
|
|
148
|
+
- `calc(1px + remify(11px))`, or 12px, rounded corners
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
import { ContentItem } from "@kerfjs/ui/content-item";
|
|
152
|
+
|
|
153
|
+
<Pane label="Inspector">
|
|
154
|
+
<ContentItem>{details}</ContentItem>
|
|
155
|
+
<ContentItem frame="framed">{pendingChanges}</ContentItem>
|
|
156
|
+
<ContentItem shape="pill">{summary}</ContentItem>
|
|
157
|
+
</Pane>;
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`frame="framed"` paints the standard neutral border in the 1px the item always
|
|
161
|
+
reserves, so framed and unframed items share the same geometry. Frame an item
|
|
162
|
+
only when it marks a real distinction and must read as visibly bounded; do not
|
|
163
|
+
frame it to make it "look contained". `shape="pill"` selects the 22px pill
|
|
164
|
+
radius expressed as `calc(1px + remify(21px))`. There is deliberately no filled
|
|
165
|
+
variant: a lowered, filled surface is `SunkenPanel`, and bare text that only
|
|
166
|
+
needs to align with neighboring items is `ListInsetText`. Safe `data-*`
|
|
167
|
+
metadata goes in `rootAttributes`. Pass `ariaLabel` only for a distinct named
|
|
168
|
+
region (`role="region"`), and `focusTarget` to make the item a programmatic
|
|
169
|
+
focus target (`tabindex="-1"`), for example a NavStack view's `data-nav-focus`
|
|
170
|
+
target.
|
|
171
|
+
|
|
172
|
+
The rendered classes — `.kui-content-item`, `.kui-content-item--framed`, and
|
|
173
|
+
`.kui-content-item--pill` — stay public for the rare element that must carry the
|
|
174
|
+
geometry itself (for example a `<ul>` list or a `Text` paragraph in an
|
|
175
|
+
application-owned adapter). Prefer `ContentItem` everywhere else so the framing
|
|
176
|
+
choice is typed. A plain `<div class="kui-content-item">` is exactly what
|
|
177
|
+
`ContentItem` renders, so the catalog records that element
|
|
178
|
+
(`rootElement: "div"`): `eslint-plugin-kerfjs`'s `ui-public-boundaries` reports
|
|
179
|
+
it in application code as `KUI-L103` ("render `ContentItem`"), and
|
|
180
|
+
`npm run check:guidance` derives the same boundary from the catalog to reject it
|
|
181
|
+
in the package's examples, browser fixtures, and UX catalog.
|
|
182
|
+
|
|
183
|
+
These classes, the layout utilities (`.kui-content`, `.kui-scroll-owner`,
|
|
184
|
+
`.kui-control-cluster`, `.kui-inline-metadata`), and `.kui-app-root` are the
|
|
185
|
+
catalog's `boundaries.placeableClasses`: the only public classes an application
|
|
186
|
+
writes onto its own elements. Every other public class is a component's
|
|
187
|
+
rendered anatomy — render `Pane` rather than writing `.kui-pane` /
|
|
188
|
+
`.kui-pane__content` onto an `<aside>` — and `eslint-plugin-kerfjs`'s
|
|
189
|
+
`ui-public-boundaries` reports it on an application-owned element as
|
|
190
|
+
`KUI-L103`. Selecting those classes in CSS to place your own content in a
|
|
191
|
+
component's context stays allowed (see `KUI-L019`).
|
|
192
|
+
|
|
47
193
|
## Public roles and tokens
|
|
48
194
|
|
|
49
|
-
| Need
|
|
50
|
-
|
|
|
51
|
-
| Unpadded
|
|
52
|
-
| Scrolling pane content
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
195
|
+
| Need | Class | Token / default |
|
|
196
|
+
| ---------------------------------------- | ---------------------------- | ------------------------------------------------------------------ |
|
|
197
|
+
| Unpadded header/content/footer structure | `Pane`, `.kui-pane` | — |
|
|
198
|
+
| Scrolling pane content | `.kui-pane__content` | — |
|
|
199
|
+
| Optional logical-edge separators | `Pane.separators` | `--kui-pane-separator-width: 1px` |
|
|
200
|
+
| Safe-area sides a pane may pad | `Pane.safeAreaEdges` | `--kui-safe-area-*: env(safe-area-inset-*)`, routed by each layout |
|
|
201
|
+
| Major vertical rhythm | `.kui-content` | `--kui-layout-content-gap: 24px` |
|
|
202
|
+
| Self-contained child geometry | `ContentItem` | 8px margin + 1px border + 8px padding |
|
|
203
|
+
| Pill child | `ContentItem shape="pill"` | `--kui-layout-pill-radius: 22px` |
|
|
204
|
+
| Visibly framed child | `ContentItem frame="framed"` | neutral 1px border, same geometry |
|
|
205
|
+
| Related controls | `.kui-control-cluster` | `--kui-layout-control-gap: 8px` |
|
|
206
|
+
| Inline metadata | `.kui-inline-metadata` | `--kui-layout-metadata-gap: 4px` |
|
|
207
|
+
| Explicit scroll owner outside a pane | `.kui-scroll-owner` | `overflow: auto` |
|
|
208
|
+
|
|
209
|
+
The component layer applies the same contract to `Toolbar`, `ListHeader`,
|
|
210
|
+
`ListItem`, `Toolbar`, `StateBanner`, `ValueTable`,
|
|
62
211
|
`ValueTableRow`, tabs, and form controls. A value-table row separator starts at
|
|
63
212
|
the row's 8px content inset, or at 40px when the row contains its 24px leading
|
|
64
213
|
icon and 8px gap, and always ends 8px from the right edge. Each value-table row
|
|
@@ -66,13 +215,22 @@ also keeps 8px of root-scaled block padding independently of its semantic inline
|
|
|
66
215
|
inset. Most interactive rows and toolbar groups are 44px tall.
|
|
67
216
|
Toolbar groups reserve a real 1px outer border around a 42px inner area, even
|
|
68
217
|
when their border and background are transparent.
|
|
69
|
-
`
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
218
|
+
A `Toolbar` lays its zones out against one 44px control band at its top: an
|
|
219
|
+
item no taller than the band is centered in it by its own size, and a taller
|
|
220
|
+
item (a wrapped title, a second trailing row) starts at the band's top and
|
|
221
|
+
grows down, so it never moves the other controls. A wrapped `ToolbarText`
|
|
222
|
+
centers its first line in the band.
|
|
223
|
+
Trailing icon actions share one axis: a toolbar control centers its glyph in
|
|
224
|
+
that 44px slot at the 8px inline margin, and a `ListHeader` action centers its
|
|
225
|
+
fitted 36px square in a slot of the same size (a transparent hit layer extends
|
|
226
|
+
its pointer target to fill that 44px slot), so a Pane header's trailing toolbar
|
|
227
|
+
action and the `ListHeader` action beneath it line up (30px from the pane edge
|
|
228
|
+
at the default scale).
|
|
229
|
+
Panel, dialog, and page headings are plain `Toolbar` compositions. The leading
|
|
230
|
+
zone holds an optional icon `ToolbarControlGroup` and a direct extra-large
|
|
231
|
+
`ToolbarText`; actions belong in a trailing group. Omit empty groups. Supporting
|
|
232
|
+
copy is app-owned content below the toolbar and aligns with the intended content
|
|
233
|
+
edge.
|
|
76
234
|
|
|
77
235
|
## Spacing scale
|
|
78
236
|
|
|
@@ -81,18 +239,210 @@ expressing exactly one relationship — pick the step by **how connected two
|
|
|
81
239
|
elements are**, not by eye. Every scalable value is `remify`-authored against the
|
|
82
240
|
fixed 16px baseline, so it delivers as `rem`.
|
|
83
241
|
|
|
84
|
-
| Value | Token
|
|
85
|
-
|
|
|
86
|
-
| 0px
|
|
87
|
-
| 4px
|
|
88
|
-
| 8px
|
|
89
|
-
| 16px
|
|
90
|
-
| 24px
|
|
242
|
+
| Value | Token | Relationship — when to use |
|
|
243
|
+
| ----- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
244
|
+
| 0px | `--kui-space-none` | No separation. The elements read as a single unit (a control and its own affordance, adjacent `ListItem` rows). |
|
|
245
|
+
| 4px | `--kui-space-2xs` | Very minor. Still one connected cluster, but readability or aesthetics demand a hair of air (inline metadata, an icon beside its label). |
|
|
246
|
+
| 8px | `--kui-space-xs` | Standard. Between elements **within a group** — the content-item padding/gutter, gaps between toolbar controls in a group. |
|
|
247
|
+
| 16px | `--kui-space-m` | Minor. Between **homogeneous groups** — two lists, two sibling sections of the same kind. |
|
|
248
|
+
| 24px | `--kui-space-l` | Major. Between **heterogeneous groups** — the `.kui-content` rhythm between major, differing regions. |
|
|
91
249
|
|
|
92
|
-
The two relationships that get confused most are 8px vs 24px: 8px is
|
|
93
|
-
group, 24px is
|
|
250
|
+
The two relationships that get confused most are 8px vs 24px: 8px is _inside_ a
|
|
251
|
+
group, 24px is _between_ major, differing regions. 16px sits between them for
|
|
94
252
|
same-kind groups.
|
|
95
253
|
|
|
254
|
+
For `Row.gap`, `Grid.gap`, and `List.gap`, pass these token names directly (`gap="xs"`, `gap="m"`) or use
|
|
255
|
+
`space('xs')` from `@kerfjs/ui/css-values` when composing a value in JavaScript.
|
|
256
|
+
Use `rem`, `em`, `px`, `pct`, `lengthVar`, and `calc(plus(...))` only when a
|
|
257
|
+
named spacing relationship does not express the requirement; do not pass raw
|
|
258
|
+
CSS strings.
|
|
259
|
+
|
|
260
|
+
## Text
|
|
261
|
+
|
|
262
|
+
Use `Text` from `@kerfjs/ui/text` for ordinary semantic headings, paragraphs,
|
|
263
|
+
and inline secondary text. It renders a native `p` by default; set `variant` to
|
|
264
|
+
`h1`–`h6` when the document outline calls for a heading, or `span` for inline
|
|
265
|
+
copy inside a row, label, or table cell. Ordinary global, `data-*`, and `aria-*`
|
|
266
|
+
attributes pass through. Block variants reset their native margin, own a 1px
|
|
267
|
+
transparent border, and supply the standard 8px item padding. The `span`
|
|
268
|
+
variant owns no margin, border, or padding. Choose heading levels from the
|
|
269
|
+
document outline, not for visual size. Toolbar identity and page-heading
|
|
270
|
+
compositions continue to use `ToolbarText`.
|
|
271
|
+
|
|
272
|
+
`Text` is also the answer for a normal-color subsection title. `ToolbarText`
|
|
273
|
+
below `xlarge` (`large`, `default`, `small`) is deliberately quiet: it labels a
|
|
274
|
+
toolbar's identity — a pane name or a status — and must not compete with the
|
|
275
|
+
content and controls around it, so it has no tone option. A subsection title is
|
|
276
|
+
document content, not toolbar identity: use `Text` with the `h2`–`h6` variant
|
|
277
|
+
the outline calls for (inside a `List` with `controlInsets`, its text lines up
|
|
278
|
+
with content items). Use `ListHeader` when the section is a list or menu group
|
|
279
|
+
that needs a count, badge, action, or disclosure, and keep extra-large
|
|
280
|
+
`ToolbarText` for the panel, dialog, or page title. A narrow peripheral rail or
|
|
281
|
+
drawer is the exception that proves the rule: beside a work area that already
|
|
282
|
+
carries the extra-large title, its header names the pane with the default size,
|
|
283
|
+
because extra-large would truncate there ("Inspector" becomes "Ins…" in a 160px
|
|
284
|
+
rail) and pane identity should stay quiet.
|
|
285
|
+
|
|
286
|
+
Presentation is independent of the native element: use `tone="quiet"` for
|
|
287
|
+
supporting copy, `tone="danger"` for error or validation copy, `size="compact"`
|
|
288
|
+
for compact metadata, `size="large"` for prominent copy, `size="xlarge"` for
|
|
289
|
+
display copy, and `font="monospace"` for code or identifiers (the
|
|
290
|
+
`--kui-font-mono` stack, which Kerf owns even with Web Awesome loaded). These
|
|
291
|
+
finite props compose with each other and with every semantic `variant`; omit
|
|
292
|
+
them to inherit the surrounding color, size, and font.
|
|
293
|
+
|
|
294
|
+
```tsx
|
|
295
|
+
import { Text } from "@kerfjs/ui/text";
|
|
296
|
+
|
|
297
|
+
<Text variant="h2" id="details-title">Details</Text>;
|
|
298
|
+
<Text variant="h3">Notifications</Text>; // normal-color subsection title
|
|
299
|
+
<Text aria-describedby="details-title">Supporting copy</Text>;
|
|
300
|
+
<Text tone="quiet" size="compact">Updated yesterday</Text>;
|
|
301
|
+
<Text size="large">A prominent summary</Text>;
|
|
302
|
+
<Text variant="h2" size="xlarge">A display-sized section title</Text>;
|
|
303
|
+
<strong>Inbox<Text variant="span" tone="quiet" size="compact"> · 3 msg</Text></strong>;
|
|
304
|
+
<Text tone="danger" font="monospace">ERR_INVALID_ID</Text>;
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Spacer
|
|
308
|
+
|
|
309
|
+
Use `Spacer` from `@kerfjs/ui/spacer` for one intentional empty dimension that
|
|
310
|
+
is not the repeated relationship owned by a parent's `gap`. Its `width` and
|
|
311
|
+
`height` accept the same finite `UiSpaceName` vocabulary or a complete typed
|
|
312
|
+
`CssLength`. Fixed spacers use `flex: 0 0 auto`, so flex layouts do not compress
|
|
313
|
+
the requested dimension. Pass `flex` to use `1 1 auto` and consume the remaining
|
|
314
|
+
space along a `Row`, `List`, or other flex parent's main axis.
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
import { Row } from "@kerfjs/ui/row";
|
|
318
|
+
import { Spacer } from "@kerfjs/ui/spacer";
|
|
319
|
+
|
|
320
|
+
<Row gap="none">
|
|
321
|
+
<button>Back</button>
|
|
322
|
+
<Spacer flex />
|
|
323
|
+
<button>Save</button>
|
|
324
|
+
</Row>;
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Spacer is always decorative (`aria-hidden="true"`), accepts no children, and
|
|
328
|
+
uses physical width and height. Prefer `Row.gap` or `List.gap` for uniform
|
|
329
|
+
sibling rhythm, and never use Spacer to cancel or duplicate component-owned
|
|
330
|
+
insets.
|
|
331
|
+
|
|
332
|
+
## Grid
|
|
333
|
+
|
|
334
|
+
Use `Grid` from `@kerfjs/ui/grid` when equal-width columns must share the
|
|
335
|
+
available width. Set a fixed positive `columns` count or a typed
|
|
336
|
+
`minColumnWidth` for automatic container-width collapse. Fixed tracks use
|
|
337
|
+
`minmax(0, 1fr)`; responsive tracks use `auto-fit` and cap their minimum at
|
|
338
|
+
100% so a narrow container keeps one column without overflow. Grid defaults
|
|
339
|
+
to the `xs` gap and accepts the same finite spacing names, complete typed
|
|
340
|
+
`CssLength` values, and typed flex-participation contract as Row.
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
import { Grid } from "@kerfjs/ui/grid";
|
|
344
|
+
import { px } from "@kerfjs/ui/css-values";
|
|
345
|
+
|
|
346
|
+
<Grid columns={2} gap="m">
|
|
347
|
+
<label>Quantity <input /></label>
|
|
348
|
+
<label>Unit <input /></label>
|
|
349
|
+
</Grid>;
|
|
350
|
+
|
|
351
|
+
<Grid minColumnWidth={px(376)} gap="m">
|
|
352
|
+
<label>Provider <input /></label>
|
|
353
|
+
<label>Endpoint <input /></label>
|
|
354
|
+
</Grid>;
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
`columns` must be a positive safe integer; invalid counts throw instead of
|
|
358
|
+
silently producing invalid CSS. Import `px` from `@kerfjs/ui/css-values` for a
|
|
359
|
+
pixel minimum. `columns` and `minColumnWidth` are mutually exclusive. In the
|
|
360
|
+
responsive mode, the container width decides how many equal tracks fit; constrain
|
|
361
|
+
the Grid's outer width when the form should have a maximum count. Grid is
|
|
362
|
+
layout-only and adds no ARIA grid role. The application owns child semantics.
|
|
363
|
+
Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
|
|
364
|
+
tracks, and use `ResizableRegion` when people must adjust a boundary.
|
|
365
|
+
|
|
366
|
+
## Row and List alignment
|
|
367
|
+
|
|
368
|
+
Use `Row` for a horizontal flex layout and `List` for a vertical one. `Row`
|
|
369
|
+
defaults to `hAlign="left"`, `vAlign="full"`, `gap="xs"`, and no wrapping;
|
|
370
|
+
`List` retains its existing full-width, top-aligned defaults and zero gap.
|
|
371
|
+
Both components accept the same physical-axis vocabulary, with baseline
|
|
372
|
+
alignment additionally available on the horizontal `Row` cross axis:
|
|
373
|
+
|
|
374
|
+
| Axis | Values and aliases | Flex behavior |
|
|
375
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
376
|
+
| Horizontal | `left` / `l` / `flex-start`; `center` / `c` / `space-around`; `right` / `r` / `flex-end`; `full` / `f` / `space-between` | Distributes a Row's children; aligns a List's children across its width. |
|
|
377
|
+
| Vertical | `top` / `t` / `flex-start`; `middle` / `m` / `c` / `space-around`; `bottom` / `b` / `flex-end`; `full` / `f` / `space-between`; Row-only `baseline` | Aligns a Row's children across its height; distributes a List's children. |
|
|
378
|
+
|
|
379
|
+
Cross-axis `space-around` and `space-between` are not valid `align-items`
|
|
380
|
+
values. Kerf therefore maps `middle` to centered items and `full` to stretched
|
|
381
|
+
items, while applying the requested distribution to `align-content` when a
|
|
382
|
+
Row wraps. Prefer the descriptive values in application code; the short and
|
|
383
|
+
CSS-shaped aliases are provided for compact or migrated call sites.
|
|
384
|
+
`baseline` is Row-only because CSS baseline alignment applies to a flex
|
|
385
|
+
container's cross axis; a vertical List's `vAlign` controls main-axis
|
|
386
|
+
distribution through `justify-content`, which has no baseline value.
|
|
387
|
+
|
|
388
|
+
`Row.flex` and `List.flex` share one typed participation contract. Omit the prop
|
|
389
|
+
for the CSS initial value, pass `true` for `1 1 auto`, select the finite
|
|
390
|
+
`"none"`, `"auto"`, or `"initial"` keyword, or use
|
|
391
|
+
`flex(grow, shrink, basis)` from `@kerfjs/ui/css-values` for a complete branded
|
|
392
|
+
shorthand. A `CssLength` is not a flex shorthand, and arbitrary strings are
|
|
393
|
+
rejected by the type contract.
|
|
394
|
+
|
|
395
|
+
### Filling a fixed-height parent
|
|
396
|
+
|
|
397
|
+
`flex` sizes a Row, List, or Grid inside a flex layout. When one of them is the
|
|
398
|
+
layout **root** of a parent with a definite height (an app mount container
|
|
399
|
+
with the `.kui-app-root` height chain, a dialog body, or a fixed-height catalog
|
|
400
|
+
frame), pass `fill` instead: the root takes the parent's full height
|
|
401
|
+
(`height: 100%`), so its `flex` children can grow into it. Use `fill` only on
|
|
402
|
+
that sole layout root; a sibling inside a flex layout keeps using `flex`.
|
|
403
|
+
|
|
404
|
+
Put route, test, or recipe metadata on the same root with `rootAttributes`,
|
|
405
|
+
which accepts safe `data-*` pairs and keeps each component's structural
|
|
406
|
+
attributes (`data-component`, `data-flex`, `data-fill`, alignment, inset, and
|
|
407
|
+
column markers) protected:
|
|
408
|
+
|
|
409
|
+
```tsx
|
|
410
|
+
<Row gap="none" fill rootAttributes={{ "data-recipe": "sidebar" }}>
|
|
411
|
+
<CollapsiblePanel id="rail" side="left" collapsed={railCollapsed.value}>
|
|
412
|
+
…
|
|
413
|
+
</CollapsiblePanel>
|
|
414
|
+
<List flex>…</List>
|
|
415
|
+
</Row>
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
Do not wrap a layout in a frame `Pane` just to get a definite height or a root
|
|
419
|
+
attribute: the pane's content slot becomes a scroll owner that never scrolls,
|
|
420
|
+
and its safe-area padding keeps an edge-docked rail or drawer from painting
|
|
421
|
+
through the unsafe area. A `Pane` is for a real column with a header, one
|
|
422
|
+
scrolling content region, or a footer.
|
|
423
|
+
|
|
424
|
+
Both components also accept `textInsets` and `controlInsets` using the shared
|
|
425
|
+
physical `Sides` union. Values follow canonical top/right/bottom/left order
|
|
426
|
+
(`t`, `rb`, `tbl`, `trbl`, and so on). A selected control side adds 8px of
|
|
427
|
+
padding. A selected text side adds the complete content-item alignment inset —
|
|
428
|
+
8px outer margin + 1px border + 8px inner padding, represented as 17px of
|
|
429
|
+
container padding. When both props select the same side, the text inset wins.
|
|
430
|
+
Each nested `Row` or `List` resolves its own four inset sides; unselected sides
|
|
431
|
+
reset to zero instead of inheriting a same-type parent's inset selection.
|
|
432
|
+
The same holds for `gap` and `flex` on a nested `List`, `Row`, or `Grid`: an
|
|
433
|
+
omitted prop falls back to that component's own default (no gap for `List`,
|
|
434
|
+
`xs` for `Row` and `Grid`; the CSS initial `flex`) rather than the enclosing
|
|
435
|
+
instance's value.
|
|
436
|
+
|
|
437
|
+
`ListInsetText` and `ListInsetControl` use the same `sides` vocabulary and
|
|
438
|
+
default to `trbl`. The text wrapper applies its complete 8/1/8 geometry only on
|
|
439
|
+
selected sides; the control wrapper applies its 8px outer margin only on
|
|
440
|
+
selected sides. Every direct child of `ListInsetControl` grows to fill the row
|
|
441
|
+
(a `Select`, a `wa-input`, or a `wa-button` spans the full inset width), and
|
|
442
|
+
several children share the row with an 8px gap; stack controls vertically with
|
|
443
|
+
a `List` using `controlInsets` instead. Pass `sides="rl"` for tight text that
|
|
444
|
+
keeps the horizontal inset without adding vertical box space.
|
|
445
|
+
|
|
96
446
|
`--kui-space-s` (12px) and `--kui-space-xl` (32px) exist but are **off the
|
|
97
447
|
canonical rhythm** — reach for them only as a deliberate exception, never as a
|
|
98
448
|
default step. Prefer the five canonical tokens so spacing stays legible and
|
|
@@ -109,14 +459,14 @@ consistent across every surface.
|
|
|
109
459
|
4. Keep one scrolling content owner per pane. Toolbar and footer siblings stay
|
|
110
460
|
fixed while the content scrolls.
|
|
111
461
|
5. A split item keeps dormant and interactive regions separate. For example,
|
|
112
|
-
`
|
|
462
|
+
`ListHeader` renders its title/count-or-badge cluster separately from its optional
|
|
113
463
|
logical-end 44px action. The header fills the available inline width and its
|
|
114
464
|
action glyph defaults to 18px; disclosure mode makes the title cluster itself
|
|
115
465
|
the button and supplies the production `DisclosureArrow` unless `actionIcon`
|
|
116
466
|
replaces it.
|
|
117
|
-
`
|
|
118
|
-
and trailing buttons. `
|
|
119
|
-
In multiline `
|
|
467
|
+
`ListActionRow` uses a noninteractive row root around sibling 44px primary
|
|
468
|
+
and trailing buttons. `ListItem.trailing` remains dormant content.
|
|
469
|
+
In multiline `ListItem` and `ListActionRow` rows, the leading icon stays
|
|
120
470
|
centered on the label's first line rather than the full wrapped label.
|
|
121
471
|
6. Reading width, column placement, and responsive relocation remain application
|
|
122
472
|
decisions. The shared classes define local geometry, not the whole shell.
|