@kerfjs/ui 5.0.0-beta.11 → 5.0.0-beta.110
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 +707 -160
- package/ai/application-ui-diagnostic-ids-v1.json +115 -0
- package/ai/application-ui-profile-sync.cjs +548 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +106 -0
- package/ai/application-ui-profile.defaults.json +222 -0
- package/ai/application-ui-profile.mjs +653 -0
- package/ai/application-ui-profile.schema.json +140 -0
- package/ai/catalog-authoring.json +34 -0
- package/ai/catalog-authoring.schema.json +105 -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 +104 -0
- package/ai/component-catalog.json +9111 -1376
- package/ai/component-catalog.schema.json +94 -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 +570 -0
- package/ai/component-composition.d.ts +143 -0
- package/ai/component-composition.json +10437 -0
- package/ai/component-composition.schema.json +444 -0
- package/ai/components/README.md +206 -0
- package/ai/components/anchored-surface.md +99 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/backdrop-image.md +84 -0
- package/ai/components/badge.md +77 -0
- package/ai/components/button.md +94 -0
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +90 -0
- package/ai/components/chip.md +80 -0
- package/ai/components/choice-chips.md +93 -0
- package/ai/components/collapsible-panel.md +103 -0
- package/ai/components/color-field.md +92 -0
- package/ai/components/color-picker.md +93 -0
- package/ai/components/color-swatches.md +82 -0
- package/ai/components/column-track.md +78 -0
- package/ai/components/combobox.md +90 -0
- package/ai/components/content-item.md +101 -0
- package/ai/components/content-swap.md +78 -0
- package/ai/components/corner-status.md +88 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/disclosure.md +88 -0
- package/ai/components/document-baseline.md +77 -0
- package/ai/components/edge-activity-indicator.md +81 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/file-picker.md +89 -0
- package/ai/components/floating-toolbar.md +82 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/framed-list.md +80 -0
- package/ai/components/grid.md +101 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +108 -0
- package/ai/components/list-detail-dialog.md +90 -0
- package/ai/components/list-header.md +91 -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 +108 -0
- package/ai/components/list.md +127 -0
- package/ai/components/loading-spinner.md +73 -0
- package/ai/components/lucide-icon.md +99 -0
- package/ai/components/message-composer.md +85 -0
- package/ai/components/nav-stack.md +120 -0
- package/ai/components/pane.md +127 -0
- package/ai/components/popup-menu.md +174 -0
- package/ai/components/progress-bar.md +82 -0
- package/ai/components/progress-ring.md +80 -0
- package/ai/components/radio-group.md +89 -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-media-detail.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/search-field.md +108 -0
- package/ai/components/segmented-control.md +83 -0
- package/ai/components/select.md +118 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/slider.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-button.md +83 -0
- package/ai/components/split-view.md +105 -0
- package/ai/components/state-banner.md +96 -0
- package/ai/components/summary-row.md +85 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +117 -0
- package/ai/components/switch.md +81 -0
- package/ai/components/tab-bar.md +114 -0
- package/ai/components/tab-navigator.md +105 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/tag-field.md +86 -0
- package/ai/components/text-field.md +102 -0
- package/ai/components/text.md +93 -0
- package/ai/components/toast.md +85 -0
- package/ai/components/toolbar-control-group.md +127 -0
- package/ai/components/toolbar-text.md +100 -0
- package/ai/components/toolbar.md +103 -0
- package/ai/components/tooltip.md +81 -0
- package/ai/components/value-table.md +80 -0
- package/ai/components/wa-accordion-item.md +61 -0
- package/ai/components/wa-accordion.md +71 -0
- package/ai/components/wa-animated-image.md +56 -0
- package/ai/components/wa-animation.md +56 -0
- package/ai/components/wa-avatar.md +56 -0
- package/ai/components/wa-badge.md +62 -0
- package/ai/components/wa-breadcrumb-item.md +54 -0
- package/ai/components/wa-breadcrumb.md +56 -0
- package/ai/components/wa-button-group.md +62 -0
- package/ai/components/wa-button.md +61 -0
- package/ai/components/wa-callout.md +60 -0
- package/ai/components/wa-card.md +67 -0
- package/ai/components/wa-carousel-item.md +54 -0
- package/ai/components/wa-carousel.md +56 -0
- package/ai/components/wa-checkbox-group.md +62 -0
- package/ai/components/wa-checkbox.md +61 -0
- package/ai/components/wa-color-picker.md +63 -0
- package/ai/components/wa-comparison.md +56 -0
- package/ai/components/wa-copy-button.md +56 -0
- package/ai/components/wa-details.md +67 -0
- package/ai/components/wa-dialog.md +65 -0
- package/ai/components/wa-divider.md +54 -0
- package/ai/components/wa-drawer.md +62 -0
- package/ai/components/wa-dropdown-item.md +62 -0
- package/ai/components/wa-dropdown.md +62 -0
- package/ai/components/wa-format-bytes.md +54 -0
- package/ai/components/wa-format-date.md +54 -0
- package/ai/components/wa-format-number.md +54 -0
- package/ai/components/wa-icon.md +59 -0
- package/ai/components/wa-include.md +55 -0
- package/ai/components/wa-input.md +62 -0
- package/ai/components/wa-intersection-observer.md +54 -0
- package/ai/components/wa-known-date.md +54 -0
- package/ai/components/wa-markdown.md +54 -0
- package/ai/components/wa-mutation-observer.md +54 -0
- package/ai/components/wa-number-input.md +56 -0
- package/ai/components/wa-option.md +61 -0
- package/ai/components/wa-otp-input.md +54 -0
- package/ai/components/wa-page.md +62 -0
- package/ai/components/wa-pagination.md +56 -0
- package/ai/components/wa-popover.md +61 -0
- package/ai/components/wa-popup.md +60 -0
- package/ai/components/wa-progress-bar.md +60 -0
- package/ai/components/wa-progress-ring.md +60 -0
- package/ai/components/wa-qr-code.md +54 -0
- package/ai/components/wa-radio-group.md +67 -0
- package/ai/components/wa-radio.md +61 -0
- package/ai/components/wa-random-content.md +54 -0
- package/ai/components/wa-rating.md +56 -0
- package/ai/components/wa-relative-time.md +54 -0
- package/ai/components/wa-resize-observer.md +54 -0
- package/ai/components/wa-scroller.md +61 -0
- package/ai/components/wa-select.md +65 -0
- package/ai/components/wa-skeleton.md +60 -0
- package/ai/components/wa-slider.md +61 -0
- package/ai/components/wa-spinner.md +60 -0
- package/ai/components/wa-split-panel.md +60 -0
- package/ai/components/wa-step.md +56 -0
- package/ai/components/wa-stepper.md +56 -0
- package/ai/components/wa-switch.md +60 -0
- package/ai/components/wa-tab-group.md +71 -0
- package/ai/components/wa-tab-panel.md +62 -0
- package/ai/components/wa-tab.md +61 -0
- package/ai/components/wa-tag-input.md +62 -0
- package/ai/components/wa-tag.md +62 -0
- package/ai/components/wa-textarea.md +60 -0
- package/ai/components/wa-time-input.md +56 -0
- package/ai/components/wa-toast-item.md +62 -0
- package/ai/components/wa-toast.md +62 -0
- package/ai/components/wa-tooltip.md +61 -0
- package/ai/components/wa-tree-item.md +56 -0
- package/ai/components/wa-tree.md +56 -0
- package/ai/components/wa-zoomable-frame.md +56 -0
- package/ai/components/workbench-dialog.md +90 -0
- package/ai/components/workbench.md +120 -0
- package/ai/public-api-signatures-v1.md +6114 -445
- package/ai/skill.md +545 -65
- package/ai/webawesome-jsx-signatures-v1.md +12 -2
- package/analyzer/cli.mjs +49 -0
- package/analyzer/component-ownership.d.mts +72 -0
- package/analyzer/component-ownership.mjs +429 -0
- package/analyzer/index.d.mts +53 -0
- package/analyzer/index.mjs +2375 -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/catalog-projection-cli.mjs +96 -0
- package/catalog-projection.d.mts +55 -0
- package/catalog-projection.mjs +62 -0
- package/dist/anchored-surface.d.ts +69 -0
- package/dist/anchored-surface.js +3 -0
- package/dist/anchored-surface.js.map +1 -0
- package/dist/backdrop-image.d.ts +132 -0
- package/dist/backdrop-image.js +5 -0
- package/dist/backdrop-image.js.map +1 -0
- package/dist/badge.d.ts +91 -0
- package/dist/badge.js +4 -0
- package/dist/badge.js.map +1 -0
- package/dist/browser/anchored-surface.js +3 -0
- package/dist/browser/backdrop-image.js +3 -0
- package/dist/browser/badge.js +3 -0
- package/dist/browser/button.js +5 -0
- package/dist/browser/catalog.js +29 -0
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/browser/checkbox.js +4 -0
- package/dist/browser/chip.js +3 -0
- package/dist/browser/choice-chips.js +3 -0
- package/dist/browser/collapsible-panel.js +9 -0
- package/dist/browser/color-field.js +4 -0
- package/dist/browser/color-picker.js +5 -0
- package/dist/browser/color-swatches.js +3 -0
- package/dist/browser/column-track.js +3 -0
- package/dist/browser/combobox.js +3 -0
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/content-swap.js +3 -0
- package/dist/browser/corner-status.js +3 -0
- package/dist/browser/disclosure.js +5 -0
- package/dist/browser/edge-activity-indicator.js +3 -0
- package/dist/browser/file-picker.js +3 -0
- package/dist/browser/framed-list.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/list-action-row.js +3 -0
- package/dist/browser/list-detail-dialog.js +14 -0
- package/dist/browser/list-header.js +3 -1
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +1 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/message-composer.js +5 -0
- package/dist/browser/nav-stack.js +11 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +4 -0
- package/dist/browser/progress-bar.js +3 -0
- package/dist/browser/progress-ring.js +3 -0
- package/dist/browser/radio-group.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/search-field.js +4 -0
- package/dist/browser/segmented-control.js +0 -1
- package/dist/browser/select.js +2 -1
- package/dist/browser/slider.js +3 -0
- package/dist/browser/spacer.js +3 -0
- package/dist/browser/split-button.js +5 -0
- package/dist/browser/split-view.js +13 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/summary-row.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +4 -0
- package/dist/browser/switch.js +3 -0
- package/dist/browser/tab-bar-item.js +4 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/browser/tag-field.js +5 -0
- package/dist/browser/text-field.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench-dialog.js +15 -0
- package/dist/browser/workbench.js +14 -0
- package/dist/button.d.ts +121 -0
- package/dist/button.js +7 -0
- package/dist/button.js.map +1 -0
- package/dist/catalog-resources.d.ts +50 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +134 -101
- package/dist/catalog.js +700 -108
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox-group.d.ts +70 -0
- package/dist/checkbox-group.js +7 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.d.ts +45 -0
- package/dist/checkbox.js +6 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.d.ts +117 -0
- package/dist/chip.js +4 -0
- package/dist/chip.js.map +1 -0
- package/dist/choice-chips.d.ts +116 -0
- package/dist/choice-chips.js +3 -0
- package/dist/choice-chips.js.map +1 -0
- package/dist/chunk-2FW7D4IG.js +52 -0
- package/dist/chunk-2FW7D4IG.js.map +1 -0
- package/dist/chunk-2GOCOLQL.js +270 -0
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/chunk-2LM3PYHA.js +300 -0
- package/dist/chunk-2LM3PYHA.js.map +1 -0
- package/dist/chunk-36HVQ72F.js +123 -0
- package/dist/chunk-36HVQ72F.js.map +1 -0
- package/dist/chunk-3GLYIIFR.js +230 -0
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/chunk-3VZ6SFD4.js +8 -0
- package/dist/chunk-3VZ6SFD4.js.map +1 -0
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-3Z7N2NAZ.js +385 -0
- package/dist/chunk-3Z7N2NAZ.js.map +1 -0
- package/dist/chunk-4OV272LF.js +93 -0
- package/dist/chunk-4OV272LF.js.map +1 -0
- package/dist/chunk-4RECPEHI.js +67 -0
- package/dist/chunk-4RECPEHI.js.map +1 -0
- package/dist/chunk-4UB5Z3ZZ.js +68 -0
- package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
- package/dist/chunk-5J6Z4BWY.js +141 -0
- package/dist/chunk-5J6Z4BWY.js.map +1 -0
- package/dist/chunk-5USKCWGL.js +113 -0
- package/dist/chunk-5USKCWGL.js.map +1 -0
- package/dist/chunk-6C6DLP3W.js +31 -0
- package/dist/chunk-6C6DLP3W.js.map +1 -0
- package/dist/chunk-6CDILXF4.js +204 -0
- package/dist/chunk-6CDILXF4.js.map +1 -0
- package/dist/chunk-6VVIW7VB.js +69 -0
- package/dist/chunk-6VVIW7VB.js.map +1 -0
- package/dist/chunk-7AK5I7U7.js +55 -0
- package/dist/chunk-7AK5I7U7.js.map +1 -0
- package/dist/chunk-7K6U6FCN.js +122 -0
- package/dist/chunk-7K6U6FCN.js.map +1 -0
- package/dist/chunk-AMIHGFLP.js +59 -0
- package/dist/chunk-AMIHGFLP.js.map +1 -0
- package/dist/chunk-AN5IWMTM.js +24 -0
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/chunk-ATGAJVZ6.js +268 -0
- package/dist/chunk-ATGAJVZ6.js.map +1 -0
- package/dist/chunk-AYPGXR2E.js +20 -0
- package/dist/chunk-AYPGXR2E.js.map +1 -0
- package/dist/chunk-B53PS2LE.js +34 -0
- package/dist/chunk-B53PS2LE.js.map +1 -0
- package/dist/chunk-BKUMG2KB.js +95 -0
- package/dist/chunk-BKUMG2KB.js.map +1 -0
- package/dist/chunk-C26Q6P4Q.js +76 -0
- package/dist/chunk-C26Q6P4Q.js.map +1 -0
- package/dist/chunk-CEJ5FK6G.js +288 -0
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/chunk-CIAUILRR.js +222 -0
- package/dist/chunk-CIAUILRR.js.map +1 -0
- package/dist/chunk-CNM6ZWP2.js +38 -0
- package/dist/chunk-CNM6ZWP2.js.map +1 -0
- package/dist/chunk-CPSGUGAY.js +527 -0
- package/dist/chunk-CPSGUGAY.js.map +1 -0
- package/dist/chunk-CTQUDCY5.js +26 -0
- package/dist/chunk-CTQUDCY5.js.map +1 -0
- package/dist/chunk-CVD5IZGB.js +66 -0
- package/dist/chunk-CVD5IZGB.js.map +1 -0
- package/dist/chunk-D4MXSAMI.js +50 -0
- package/dist/chunk-D4MXSAMI.js.map +1 -0
- package/dist/chunk-D5RGM3XA.js +38 -0
- package/dist/chunk-D5RGM3XA.js.map +1 -0
- package/dist/chunk-DZJ4GBSP.js +59 -0
- package/dist/chunk-DZJ4GBSP.js.map +1 -0
- package/dist/chunk-EIET4QLK.js +51 -0
- package/dist/chunk-EIET4QLK.js.map +1 -0
- package/dist/chunk-EKHDLBRP.js +86 -0
- package/dist/chunk-EKHDLBRP.js.map +1 -0
- package/dist/chunk-EYDXFOSH.js +457 -0
- package/dist/chunk-EYDXFOSH.js.map +1 -0
- package/dist/chunk-G3J7JDP6.js +29 -0
- package/dist/chunk-G3J7JDP6.js.map +1 -0
- package/dist/chunk-GS2QD3N7.js +14 -0
- package/dist/chunk-GS2QD3N7.js.map +1 -0
- package/dist/chunk-GXSX6Q6O.js +42 -0
- package/dist/chunk-GXSX6Q6O.js.map +1 -0
- package/dist/chunk-HDXUHLTQ.js +90 -0
- package/dist/chunk-HDXUHLTQ.js.map +1 -0
- package/dist/chunk-HJXVVFBT.js +108 -0
- package/dist/chunk-HJXVVFBT.js.map +1 -0
- package/dist/chunk-HQZG3OFL.js +158 -0
- package/dist/chunk-HQZG3OFL.js.map +1 -0
- package/dist/chunk-HTERKONR.js +49 -0
- package/dist/chunk-HTERKONR.js.map +1 -0
- package/dist/chunk-HU5IHXCI.js +73 -0
- package/dist/chunk-HU5IHXCI.js.map +1 -0
- package/dist/chunk-IKS72C6P.js +53 -0
- package/dist/chunk-IKS72C6P.js.map +1 -0
- package/dist/chunk-IO27YTL3.js +73 -0
- package/dist/chunk-IO27YTL3.js.map +1 -0
- package/dist/chunk-IQSRHXZR.js +164 -0
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/chunk-ITUQC4FW.js +163 -0
- package/dist/chunk-ITUQC4FW.js.map +1 -0
- package/dist/chunk-JCCN3U6X.js +176 -0
- package/dist/chunk-JCCN3U6X.js.map +1 -0
- package/dist/chunk-K57NINLH.js +137 -0
- package/dist/chunk-K57NINLH.js.map +1 -0
- package/dist/chunk-KC6WUSNS.js +34 -0
- package/dist/chunk-KC6WUSNS.js.map +1 -0
- package/dist/chunk-KCS6NJ3O.js +82 -0
- package/dist/chunk-KCS6NJ3O.js.map +1 -0
- package/dist/chunk-KDQZ3E5C.js +75 -0
- package/dist/chunk-KDQZ3E5C.js.map +1 -0
- package/dist/chunk-KH4KEMSP.js +71 -0
- package/dist/chunk-KH4KEMSP.js.map +1 -0
- package/dist/chunk-KK3S5OTW.js +98 -0
- package/dist/chunk-KK3S5OTW.js.map +1 -0
- package/dist/chunk-KPINJHIC.js +122 -0
- package/dist/chunk-KPINJHIC.js.map +1 -0
- package/dist/chunk-LMHN2TJL.js +167 -0
- package/dist/chunk-LMHN2TJL.js.map +1 -0
- package/dist/chunk-LTBVP6VN.js +59 -0
- package/dist/chunk-LTBVP6VN.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
- package/dist/chunk-LZUUUHNH.js.map +1 -0
- package/dist/chunk-MHMWQ7RB.js +19 -0
- package/dist/chunk-MHMWQ7RB.js.map +1 -0
- package/dist/chunk-MJ5RU6XT.js +173 -0
- package/dist/chunk-MJ5RU6XT.js.map +1 -0
- package/dist/chunk-MVKHSAKE.js +169 -0
- package/dist/chunk-MVKHSAKE.js.map +1 -0
- package/dist/chunk-NB6POCFH.js +103 -0
- package/dist/chunk-NB6POCFH.js.map +1 -0
- package/dist/chunk-NR6O74ST.js +169 -0
- package/dist/chunk-NR6O74ST.js.map +1 -0
- package/dist/chunk-OHPYT2BH.js +82 -0
- package/dist/chunk-OHPYT2BH.js.map +1 -0
- package/dist/chunk-OQP3PFKQ.js +341 -0
- package/dist/chunk-OQP3PFKQ.js.map +1 -0
- package/dist/chunk-OZ6X76G5.js +547 -0
- package/dist/chunk-OZ6X76G5.js.map +1 -0
- package/dist/chunk-P7EJ4CAD.js +147 -0
- package/dist/chunk-P7EJ4CAD.js.map +1 -0
- package/dist/chunk-QDSZTQXL.js +28 -0
- package/dist/chunk-QDSZTQXL.js.map +1 -0
- package/dist/chunk-QH5KOFNS.js +39 -0
- package/dist/chunk-QH5KOFNS.js.map +1 -0
- package/dist/chunk-QPTJ5DOO.js +87 -0
- package/dist/chunk-QPTJ5DOO.js.map +1 -0
- package/dist/chunk-QYMJHS4K.js +36 -0
- package/dist/chunk-QYMJHS4K.js.map +1 -0
- package/dist/chunk-RMWNO6BA.js +89 -0
- package/dist/chunk-RMWNO6BA.js.map +1 -0
- package/dist/chunk-S2XULQEK.js +52 -0
- package/dist/chunk-S2XULQEK.js.map +1 -0
- package/dist/chunk-S3ECMF23.js +33 -0
- package/dist/chunk-S3ECMF23.js.map +1 -0
- package/dist/chunk-S4Y3YTAI.js +35 -0
- package/dist/chunk-S4Y3YTAI.js.map +1 -0
- package/dist/chunk-S4ZGTDSG.js +18 -0
- package/dist/chunk-S4ZGTDSG.js.map +1 -0
- package/dist/chunk-SCDWURBO.js +136 -0
- package/dist/chunk-SCDWURBO.js.map +1 -0
- package/dist/chunk-SOFPUW3O.js +196 -0
- package/dist/chunk-SOFPUW3O.js.map +1 -0
- package/dist/chunk-SQ5DH66U.js +37 -0
- package/dist/chunk-SQ5DH66U.js.map +1 -0
- package/dist/chunk-T74YB76U.js +547 -0
- package/dist/chunk-T74YB76U.js.map +1 -0
- package/dist/chunk-TI2GV36S.js +90 -0
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
- package/dist/chunk-TKNVL53O.js.map +1 -0
- package/dist/chunk-TNJLNLVE.js +115 -0
- package/dist/chunk-TNJLNLVE.js.map +1 -0
- package/dist/chunk-TUID42UE.js +15 -0
- package/dist/chunk-TUID42UE.js.map +1 -0
- package/dist/chunk-UMNHJSIO.js +848 -0
- package/dist/chunk-UMNHJSIO.js.map +1 -0
- package/dist/chunk-VEME3D7K.js +298 -0
- package/dist/chunk-VEME3D7K.js.map +1 -0
- package/dist/chunk-WPNIKZMJ.js +507 -0
- package/dist/chunk-WPNIKZMJ.js.map +1 -0
- package/dist/chunk-WSEJ2FDE.js +162 -0
- package/dist/chunk-WSEJ2FDE.js.map +1 -0
- package/dist/chunk-WVS6CUCT.js +48 -0
- package/dist/chunk-WVS6CUCT.js.map +1 -0
- package/dist/chunk-XWNXGFX3.js +381 -0
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/chunk-Y6KT7ZTR.js +109 -0
- package/dist/chunk-Y6KT7ZTR.js.map +1 -0
- package/dist/chunk-YMUIQRWK.js +44 -0
- package/dist/chunk-YMUIQRWK.js.map +1 -0
- package/dist/chunk-ZCDRLN3B.js +138 -0
- package/dist/chunk-ZCDRLN3B.js.map +1 -0
- package/dist/chunk-ZKKO4MHC.js +25 -0
- package/dist/chunk-ZKKO4MHC.js.map +1 -0
- package/dist/chunk-ZN7KUMPY.js +48 -0
- package/dist/chunk-ZN7KUMPY.js.map +1 -0
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/chunk-ZX2QQJXD.js +249 -0
- package/dist/chunk-ZX2QQJXD.js.map +1 -0
- package/dist/collapsible-panel.d.ts +96 -17
- package/dist/collapsible-panel.js +133 -14
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/color-field.d.ts +51 -0
- package/dist/color-field.js +92 -0
- package/dist/color-field.js.map +1 -0
- package/dist/color-picker.d.ts +113 -0
- package/dist/color-picker.js +8 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/color-swatches.d.ts +56 -0
- package/dist/color-swatches.js +4 -0
- package/dist/color-swatches.js.map +1 -0
- package/dist/column-track.d.ts +41 -0
- package/dist/column-track.js +4 -0
- package/dist/column-track.js.map +1 -0
- package/dist/combobox.d.ts +40 -0
- package/dist/combobox.js +3 -0
- package/dist/combobox.js.map +1 -0
- package/dist/content-item.d.ts +128 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/content-swap.d.ts +34 -0
- package/dist/content-swap.js +3 -0
- package/dist/content-swap.js.map +1 -0
- package/dist/corner-status.d.ts +36 -0
- package/dist/corner-status.js +3 -0
- package/dist/corner-status.js.map +1 -0
- package/dist/css-values.d.ts +127 -0
- package/dist/css-values.js +3 -0
- package/dist/css-values.js.map +1 -0
- package/dist/device-class.js +34 -6
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.d.ts +6 -1
- package/dist/disclosure-arrow.js +2 -1
- package/dist/disclosure.d.ts +66 -0
- package/dist/disclosure.js +51 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/edge-activity-indicator.d.ts +28 -0
- package/dist/edge-activity-indicator.js +3 -0
- package/dist/edge-activity-indicator.js.map +1 -0
- package/dist/empty-state.d.ts +5 -2
- package/dist/empty-state.js +2 -1
- package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
- package/dist/file-picker.d.ts +54 -0
- package/dist/file-picker.js +3 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
- package/dist/floating-toolbar.d.ts +29 -6
- package/dist/floating-toolbar.js +1 -1
- package/dist/framed-list.d.ts +47 -0
- package/dist/framed-list.js +4 -0
- package/dist/framed-list.js.map +1 -0
- package/dist/grid.d.ts +58 -0
- package/dist/grid.js +6 -0
- package/dist/grid.js.map +1 -0
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +10 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/index.d.ts +72 -17
- package/dist/index.js +84 -25
- package/dist/list-action-row.d.ts +69 -12
- package/dist/list-action-row.js +8 -1
- package/dist/list-detail-dialog.d.ts +123 -0
- package/dist/list-detail-dialog.js +167 -0
- package/dist/list-detail-dialog.js.map +1 -0
- package/dist/list-header.d.ts +72 -10
- package/dist/list-header.js +4 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -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 +49 -5
- package/dist/list-item.js +4 -1
- package/dist/list.d.ts +149 -0
- package/dist/list.js +7 -0
- package/dist/list.js.map +1 -0
- package/dist/loading-spinner.d.ts +12 -2
- package/dist/loading-spinner.js +2 -1
- package/dist/lucide-icon.d.ts +23 -3
- package/dist/lucide-icon.js +2 -1
- package/dist/message-composer.d.ts +70 -0
- package/dist/message-composer.js +6 -0
- package/dist/message-composer.js.map +1 -0
- package/dist/nav-stack-CU_0dKtI.d.ts +194 -0
- package/dist/nav-stack.d.ts +15 -38
- package/dist/nav-stack.js +14 -1
- package/dist/pane.d.ts +258 -0
- package/dist/pane.js +6 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
- package/dist/popup-menu-register.d.ts +11 -0
- package/dist/popup-menu-register.js +13 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +153 -0
- package/dist/popup-menu.js +7 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/progress-bar.d.ts +52 -0
- package/dist/progress-bar.js +68 -0
- package/dist/progress-bar.js.map +1 -0
- package/dist/progress-ring.d.ts +44 -0
- package/dist/progress-ring.js +73 -0
- package/dist/progress-ring.js.map +1 -0
- package/dist/radio-group.d.ts +62 -0
- package/dist/radio-group.js +4 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +53 -0
- package/dist/row.js +7 -0
- package/dist/row.js.map +1 -0
- package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
- package/dist/search-field-CrGTN5sa.d.ts +208 -0
- package/dist/search-field-model.d.ts +3 -0
- package/dist/search-field-model.js +3 -0
- package/dist/search-field-model.js.map +1 -0
- package/dist/search-field.d.ts +3 -0
- package/dist/search-field.js +5 -0
- package/dist/search-field.js.map +1 -0
- package/dist/segmented-control.d.ts +14 -9
- package/dist/segmented-control.js +1 -2
- package/dist/select-register.d.ts +6 -3
- package/dist/select-register.js +402 -8
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +128 -9
- package/dist/select.js +6 -1
- package/dist/selection.d.ts +54 -0
- package/dist/selection.js +3 -0
- package/dist/selection.js.map +1 -0
- package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
- package/dist/semantic-tone-CdW013KF.d.ts +4 -0
- package/dist/sides-BPSWde0A.d.ts +4 -0
- package/dist/skeleton.d.ts +14 -7
- package/dist/skeleton.js +2 -1
- package/dist/slider.d.ts +74 -0
- package/dist/slider.js +103 -0
- package/dist/slider.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-button.d.ts +69 -0
- package/dist/split-button.js +7 -0
- package/dist/split-button.js.map +1 -0
- package/dist/split-view.d.ts +66 -6
- package/dist/split-view.js +14 -15
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +41 -7
- package/dist/state-banner.js +4 -1
- package/dist/styles/anchored-surface.css +44 -0
- package/dist/styles/backdrop-image.css +241 -0
- package/dist/styles/badge.css +157 -0
- package/dist/styles/button.css +293 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
- package/dist/styles/catalog/components/catalog-example.css +250 -0
- package/dist/styles/catalog/components/catalog-stage.css +61 -0
- package/dist/styles/catalog/components/catalog.css +26 -0
- package/dist/styles/catalog.css +5 -522
- package/dist/styles/checkbox-group.css +63 -0
- package/dist/styles/checkbox.css +122 -0
- package/dist/styles/chip.css +234 -0
- package/dist/styles/choice-chips.css +205 -0
- package/dist/styles/collapsible-panel.css +450 -16
- package/dist/styles/color-field.css +125 -0
- package/dist/styles/color-picker.css +366 -0
- package/dist/styles/color-swatches.css +122 -0
- package/dist/styles/column-track.css +57 -0
- package/dist/styles/combobox.css +115 -0
- package/dist/styles/components/actions/button/button.css +293 -0
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
- package/dist/styles/components/actions/split-button/split-button.css +141 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
- package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
- package/dist/styles/components/collections/list/list.css +293 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
- package/dist/styles/components/collections/list-header/list-header.css +236 -0
- package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
- package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
- package/dist/styles/components/collections/list-item/list-item.css +461 -0
- package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
- package/dist/styles/components/data-display/value-table/value-table.css +183 -0
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
- package/dist/styles/components/feedback/badge/badge.css +157 -0
- package/dist/styles/components/feedback/chip/chip.css +234 -0
- package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
- package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
- package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
- package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
- package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
- package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
- package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
- package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
- package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
- package/dist/styles/components/forms/color-field/color-field.css +125 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
- package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
- package/dist/styles/components/forms/combobox/combobox.css +115 -0
- package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
- package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
- package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
- package/dist/styles/components/forms/search-field/search-field.css +441 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +580 -0
- package/dist/styles/components/forms/slider/slider.css +241 -0
- package/dist/styles/components/forms/switch/switch.css +132 -0
- package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
- package/dist/styles/components/forms/text-field/text-field.css +193 -0
- package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
- package/dist/styles/components/layout/column-track/column-track.css +57 -0
- package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
- package/dist/styles/components/layout/grid/grid.css +88 -0
- package/dist/styles/components/layout/pane/pane.css +780 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
- package/dist/styles/components/layout/row/row.css +125 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +171 -0
- package/dist/styles/components/layout/workbench/workbench.css +1098 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
- package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
- package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +241 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +168 -0
- package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +744 -0
- package/dist/styles/components/typography/text/text.css +232 -0
- package/dist/styles/content-item.css +168 -0
- package/dist/styles/content-swap.css +154 -0
- package/dist/styles/corner-status.css +60 -0
- package/dist/styles/disclosure-arrow.css +20 -0
- package/dist/styles/disclosure.css +136 -0
- package/dist/styles/document.css +98 -0
- package/dist/styles/edge-activity-indicator.css +127 -0
- package/dist/styles/file-picker.css +81 -0
- package/dist/styles/floating-toolbar.css +87 -6
- package/dist/styles/foundation.css +490 -50
- package/dist/styles/framed-list.css +53 -0
- package/dist/styles/grid.css +88 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +324 -18
- package/dist/styles/list-detail-dialog.css +11 -0
- package/dist/styles/list-header.css +135 -59
- package/dist/styles/list-inset-control.css +30 -0
- package/dist/styles/list-inset-text.css +29 -0
- package/dist/styles/list-item.css +371 -33
- package/dist/styles/list.css +293 -0
- package/dist/styles/loading-spinner.css +4 -0
- package/dist/styles/lucide-icon.css +9 -0
- package/dist/styles/message-composer.css +84 -0
- package/dist/styles/nav-stack.css +555 -47
- package/dist/styles/overlay-sheet.css +211 -0
- package/dist/styles/overlay-toast.css +149 -0
- package/dist/styles/overlay-tooltip.css +55 -0
- package/dist/styles/pane.css +780 -0
- package/dist/styles/popup-menu.css +498 -0
- package/dist/styles/progress-bar.css +168 -0
- package/dist/styles/progress-ring.css +91 -0
- package/dist/styles/radio-group.css +158 -0
- package/dist/styles/resizable-region.css +439 -4
- package/dist/styles/row.css +125 -0
- package/dist/styles/search-field.css +441 -0
- package/dist/styles/segmented-control.css +36 -9
- package/dist/styles/select.css +516 -74
- package/dist/styles/skeleton.css +64 -3
- package/dist/styles/slider.css +241 -0
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-button.css +141 -0
- package/dist/styles/split-view.css +139 -3
- package/dist/styles/state-banner.css +164 -25
- package/dist/styles/styles.css +38 -3
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +34 -0
- package/dist/styles/surface-scaffold.css +744 -0
- package/dist/styles/switch.css +132 -0
- package/dist/styles/tab-bar-item.css +389 -0
- package/dist/styles/tab-bar.css +167 -9
- package/dist/styles/tab-navigator.css +460 -0
- package/dist/styles/tag-field.css +8 -0
- package/dist/styles/text-field.css +193 -0
- package/dist/styles/text.css +232 -0
- package/dist/styles/toolbar-control-group.css +1000 -37
- package/dist/styles/toolbar-text.css +223 -7
- package/dist/styles/toolbar.css +433 -11
- package/dist/styles/value-table.css +115 -7
- package/dist/styles/webawesome.css +474 -18
- package/dist/styles/workbench-dialog.css +10 -0
- package/dist/styles/workbench.css +1011 -7
- package/dist/summary-row.d.ts +56 -0
- package/dist/summary-row.js +4 -0
- package/dist/summary-row.js.map +1 -0
- package/dist/sunken-panel.d.ts +38 -0
- package/dist/sunken-panel.js +4 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold-register.d.ts +12 -0
- package/dist/surface-scaffold-register.js +10 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +280 -0
- package/dist/surface-scaffold.js +8 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/switch.d.ts +38 -0
- package/dist/switch.js +4 -0
- package/dist/switch.js.map +1 -0
- package/dist/tab-bar-item.d.ts +65 -0
- package/dist/tab-bar-item.js +6 -0
- package/dist/tab-bar-item.js.map +1 -0
- package/dist/tab-bar.d.ts +33 -7
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.d.ts +154 -0
- package/dist/tab-navigator.js +131 -0
- package/dist/tab-navigator.js.map +1 -0
- package/dist/tag-field.d.ts +52 -0
- package/dist/tag-field.js +6 -0
- package/dist/tag-field.js.map +1 -0
- package/dist/text-field.d.ts +91 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.d.ts +103 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +112 -8
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +63 -9
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +77 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-DmHWkSd6.d.ts +207 -0
- package/dist/value-table.d.ts +30 -4
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +11 -1
- package/dist/wire-catalog.d.ts +117 -5
- package/dist/wire-catalog.js +314 -14
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-checkboxes.d.ts +10 -0
- package/dist/wire-checkboxes.js +3 -0
- package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
- package/dist/wire-choice-chips.d.ts +17 -0
- package/dist/wire-choice-chips.js +4 -0
- package/dist/wire-choice-chips.js.map +1 -0
- package/dist/wire-color-fields.d.ts +33 -0
- package/dist/wire-color-fields.js +82 -0
- package/dist/wire-color-fields.js.map +1 -0
- package/dist/wire-color-pickers.d.ts +35 -0
- package/dist/wire-color-pickers.js +9 -0
- package/dist/wire-color-pickers.js.map +1 -0
- package/dist/wire-comboboxes.d.ts +26 -0
- package/dist/wire-comboboxes.js +4 -0
- package/dist/wire-comboboxes.js.map +1 -0
- package/dist/wire-content-items.d.ts +15 -0
- package/dist/wire-content-items.js +208 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-corner-status.d.ts +11 -0
- package/dist/wire-corner-status.js +3 -0
- package/dist/wire-corner-status.js.map +1 -0
- package/dist/wire-file-pickers.d.ts +27 -0
- package/dist/wire-file-pickers.js +3 -0
- package/dist/wire-file-pickers.js.map +1 -0
- package/dist/wire-list-focus-scroll.d.ts +16 -0
- package/dist/wire-list-focus-scroll.js +3 -0
- package/dist/wire-list-focus-scroll.js.map +1 -0
- package/dist/wire-list-reorder.d.ts +41 -0
- package/dist/wire-list-reorder.js +3 -0
- package/dist/wire-list-reorder.js.map +1 -0
- package/dist/wire-message-composers.d.ts +17 -0
- package/dist/wire-message-composers.js +3 -0
- package/dist/wire-message-composers.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +352 -15
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-overlay-sheets.d.ts +20 -0
- package/dist/wire-overlay-sheets.js +4 -0
- package/dist/wire-overlay-sheets.js.map +1 -0
- package/dist/wire-pane-chrome.d.ts +21 -0
- package/dist/wire-pane-chrome.js +67 -0
- package/dist/wire-pane-chrome.js.map +1 -0
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +87 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
- package/dist/wire-search-fields.js +6 -0
- package/dist/wire-search-fields.js.map +1 -0
- package/dist/wire-sidebar.d.ts +24 -4
- package/dist/wire-sidebar.js +159 -45
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-sliders.d.ts +12 -0
- package/dist/wire-sliders.js +31 -0
- package/dist/wire-sliders.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +6 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +13 -0
- package/dist/wire-tab-navigator.js +153 -0
- package/dist/wire-tab-navigator.js.map +1 -0
- package/dist/wire-tag-fields.d.ts +41 -0
- package/dist/wire-tag-fields.js +258 -0
- package/dist/wire-tag-fields.js.map +1 -0
- package/dist/wire-text-fields.d.ts +12 -0
- package/dist/wire-text-fields.js +3 -0
- package/dist/wire-text-fields.js.map +1 -0
- package/dist/wire-toolbar-visibility.d.ts +13 -0
- package/dist/wire-toolbar-visibility.js +3 -0
- package/dist/wire-toolbar-visibility.js.map +1 -0
- package/dist/wire-workbench.d.ts +116 -0
- package/dist/wire-workbench.js +6 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench-dialog.d.ts +106 -0
- package/dist/workbench-dialog.js +127 -0
- package/dist/workbench-dialog.js.map +1 -0
- package/dist/workbench.d.ts +258 -10
- package/dist/workbench.js +21 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +829 -41
- package/docs/anchored-surface.md +107 -0
- package/docs/app-layouts.md +200 -10
- package/docs/apple-hig.md +2 -0
- package/docs/backdrop-image.md +128 -0
- package/docs/catalog.md +599 -63
- package/docs/collapsible-panel.md +308 -25
- package/docs/color-field.md +65 -0
- package/docs/color-picker.md +102 -0
- package/docs/color-swatches.md +46 -0
- package/docs/component-contract.md +865 -57
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +1124 -108
- package/docs/design/templates/button/emphasis-dark.svg +1 -0
- package/docs/design/templates/button/emphasis.svg +1 -0
- package/docs/design/templates/button/full-width-dark.svg +1 -0
- package/docs/design/templates/button/full-width.svg +1 -0
- package/docs/design/templates/button/icons-dark.svg +1 -0
- package/docs/design/templates/button/icons.svg +1 -0
- package/docs/design/templates/button/pill-dark.svg +1 -0
- package/docs/design/templates/button/pill.svg +1 -0
- package/docs/design/templates/button/states-dark.svg +1 -0
- package/docs/design/templates/button/states.svg +1 -0
- package/docs/design/templates/button/toggles-dark.svg +1 -0
- package/docs/design/templates/button/toggles.svg +1 -0
- package/docs/design/templates/button/tones-dark.svg +1 -0
- package/docs/design/templates/button/tones.svg +1 -0
- package/docs/design/templates/button-dark.svg +1 -0
- package/docs/design/templates/button.svg +1 -0
- package/docs/design/templates/checkbox/compact-dark.svg +1 -0
- package/docs/design/templates/checkbox/compact.svg +1 -0
- package/docs/design/templates/checkbox/error-dark.svg +1 -0
- package/docs/design/templates/checkbox/error.svg +1 -0
- package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
- package/docs/design/templates/checkbox/mixed.svg +1 -0
- package/docs/design/templates/checkbox/states-dark.svg +1 -0
- package/docs/design/templates/checkbox/states.svg +1 -0
- package/docs/design/templates/checkbox-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical.svg +1 -0
- package/docs/design/templates/checkbox-group-dark.svg +1 -0
- package/docs/design/templates/checkbox-group.svg +1 -0
- package/docs/design/templates/checkbox.svg +1 -0
- package/docs/design/templates/chip/action-filters-dark.svg +1 -0
- package/docs/design/templates/chip/action-filters.svg +1 -0
- package/docs/design/templates/chip/tags-dark.svg +1 -0
- package/docs/design/templates/chip/tags.svg +1 -0
- package/docs/design/templates/chip-dark.svg +1 -0
- package/docs/design/templates/chip.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
- package/docs/design/templates/choice-chips/multiple.svg +1 -0
- package/docs/design/templates/choice-chips-dark.svg +1 -0
- package/docs/design/templates/choice-chips.svg +1 -0
- package/docs/design/templates/color-field/compact-dark.svg +1 -0
- package/docs/design/templates/color-field/compact.svg +1 -0
- package/docs/design/templates/color-field/error-dark.svg +1 -0
- package/docs/design/templates/color-field/error.svg +1 -0
- package/docs/design/templates/color-field/hint-dark.svg +1 -0
- package/docs/design/templates/color-field/hint.svg +1 -0
- package/docs/design/templates/color-field-dark.svg +1 -0
- package/docs/design/templates/color-field.svg +1 -0
- package/docs/design/templates/color-picker/gray-dark.svg +1 -0
- package/docs/design/templates/color-picker/gray.svg +1 -0
- package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
- package/docs/design/templates/color-picker/hsb.svg +1 -0
- package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
- package/docs/design/templates/color-picker/rgb.svg +1 -0
- package/docs/design/templates/color-picker-dark.svg +1 -0
- package/docs/design/templates/color-picker.svg +1 -0
- package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
- package/docs/design/templates/color-swatches/palette.svg +1 -0
- package/docs/design/templates/color-swatches-dark.svg +1 -0
- package/docs/design/templates/color-swatches.svg +1 -0
- package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
- package/docs/design/templates/disclosure/embedded.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
- package/docs/design/templates/disclosure/plain-dark.svg +1 -0
- package/docs/design/templates/disclosure/plain.svg +1 -0
- package/docs/design/templates/disclosure-dark.svg +1 -0
- package/docs/design/templates/disclosure.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -7
- package/docs/design/templates/empty-state.svg +1 -7
- 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 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -7
- package/docs/design/templates/list-action-row.svg +1 -7
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- 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/size-l-dark.svg +1 -0
- package/docs/design/templates/list-header/size-l.svg +1 -0
- package/docs/design/templates/list-header/size-m-dark.svg +1 -0
- package/docs/design/templates/list-header/size-m.svg +1 -0
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xl.svg +1 -0
- package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xs.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -11
- package/docs/design/templates/list-header.svg +1 -11
- package/docs/design/templates/list-item/default-dark.svg +1 -1
- package/docs/design/templates/list-item/default.svg +1 -1
- package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-item/icon-tile.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -1
- package/docs/design/templates/list-item/multiline.svg +1 -1
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item/trailing-dark.svg +1 -1
- package/docs/design/templates/list-item/trailing.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -11
- package/docs/design/templates/list-item.svg +1 -11
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/message-composer/chat-dark.svg +1 -0
- package/docs/design/templates/message-composer/chat.svg +1 -0
- package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
- package/docs/design/templates/message-composer/prompt.svg +1 -0
- package/docs/design/templates/message-composer-dark.svg +1 -0
- package/docs/design/templates/message-composer.svg +1 -0
- package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
- package/docs/design/templates/progress-bar/determinate.svg +1 -0
- package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
- package/docs/design/templates/progress-bar/tones.svg +1 -0
- package/docs/design/templates/progress-bar-dark.svg +1 -0
- package/docs/design/templates/progress-bar.svg +1 -0
- package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
- package/docs/design/templates/progress-ring/sizes.svg +1 -0
- package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
- package/docs/design/templates/progress-ring/tones.svg +1 -0
- package/docs/design/templates/progress-ring-dark.svg +1 -0
- package/docs/design/templates/progress-ring.svg +1 -0
- package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/radio-group/horizontal.svg +1 -0
- package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
- package/docs/design/templates/radio-group/vertical.svg +1 -0
- package/docs/design/templates/radio-group-dark.svg +1 -0
- package/docs/design/templates/radio-group.svg +1 -0
- package/docs/design/templates/search-field/empty-dark.svg +1 -0
- package/docs/design/templates/search-field/empty.svg +1 -0
- package/docs/design/templates/search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/search-field/tokens.svg +1 -0
- package/docs/design/templates/search-field-dark.svg +1 -0
- package/docs/design/templates/search-field.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -7
- package/docs/design/templates/segmented-control.svg +1 -7
- package/docs/design/templates/select/compact-dark.svg +1 -0
- package/docs/design/templates/select/compact.svg +1 -0
- package/docs/design/templates/select/form-dark.svg +1 -0
- package/docs/design/templates/select/form.svg +1 -0
- package/docs/design/templates/select/icons-dark.svg +1 -0
- package/docs/design/templates/select/icons.svg +1 -0
- package/docs/design/templates/select-dark.svg +1 -0
- package/docs/design/templates/select.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -9
- package/docs/design/templates/skeleton.svg +1 -9
- package/docs/design/templates/slider/compact-dark.svg +1 -0
- package/docs/design/templates/slider/compact.svg +1 -0
- package/docs/design/templates/slider/readout-dark.svg +1 -0
- package/docs/design/templates/slider/readout.svg +1 -0
- package/docs/design/templates/slider/ticks-dark.svg +1 -0
- package/docs/design/templates/slider/ticks.svg +1 -0
- package/docs/design/templates/slider-dark.svg +1 -0
- package/docs/design/templates/slider.svg +1 -0
- package/docs/design/templates/split-button/full-width-dark.svg +1 -0
- package/docs/design/templates/split-button/full-width.svg +1 -0
- package/docs/design/templates/split-button/pill-dark.svg +1 -0
- package/docs/design/templates/split-button/pill.svg +1 -0
- package/docs/design/templates/split-button/states-dark.svg +1 -0
- package/docs/design/templates/split-button/states.svg +1 -0
- package/docs/design/templates/split-button/tones-dark.svg +1 -0
- package/docs/design/templates/split-button/tones.svg +1 -0
- package/docs/design/templates/split-button-dark.svg +1 -0
- package/docs/design/templates/split-button.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-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 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/strip-dark.svg +1 -0
- package/docs/design/templates/state-banner/strip.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -11
- package/docs/design/templates/state-banner.svg +1 -11
- package/docs/design/templates/switch/compact-dark.svg +1 -0
- package/docs/design/templates/switch/compact.svg +1 -0
- package/docs/design/templates/switch/states-dark.svg +1 -0
- package/docs/design/templates/switch/states.svg +1 -0
- package/docs/design/templates/switch-dark.svg +1 -0
- package/docs/design/templates/switch.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -5
- package/docs/design/templates/tab-bar.svg +1 -5
- package/docs/design/templates/tag-field/error-dark.svg +1 -0
- package/docs/design/templates/tag-field/error.svg +1 -0
- package/docs/design/templates/tag-field/tags-dark.svg +1 -0
- package/docs/design/templates/tag-field/tags.svg +1 -0
- package/docs/design/templates/tag-field-dark.svg +1 -0
- package/docs/design/templates/tag-field.svg +1 -0
- package/docs/design/templates/text-field/compact-dark.svg +1 -0
- package/docs/design/templates/text-field/compact.svg +1 -0
- package/docs/design/templates/text-field/error-dark.svg +1 -0
- package/docs/design/templates/text-field/error.svg +1 -0
- package/docs/design/templates/text-field/labeled-dark.svg +1 -0
- package/docs/design/templates/text-field/labeled.svg +1 -0
- package/docs/design/templates/text-field/multiline-dark.svg +1 -0
- package/docs/design/templates/text-field/multiline.svg +1 -0
- package/docs/design/templates/text-field/number-dark.svg +1 -0
- package/docs/design/templates/text-field/number.svg +1 -0
- package/docs/design/templates/text-field/search-dark.svg +1 -0
- package/docs/design/templates/text-field/search.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -0
- package/docs/design/templates/text-field.svg +1 -0
- 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/width-visibility-320-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
- package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
- package/docs/design/templates/toolbar-control-group.svg +1 -11
- package/docs/design/templates/toolbar-dark.svg +1 -5
- package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/small.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -9
- package/docs/design/templates/toolbar-text.svg +1 -9
- package/docs/design/templates/toolbar.svg +1 -5
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -5
- package/docs/design/templates/value-table.svg +1 -5
- package/docs/design/templates.md +87 -33
- package/docs/design-philosophy.md +65 -20
- package/docs/device-class.md +10 -9
- package/docs/disclosure.md +97 -0
- package/docs/document-baseline.md +93 -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 +52 -0
- package/docs/examples/component-composition-extension.json +80 -0
- package/docs/layout.md +946 -53
- package/docs/list-detail-dialog.md +100 -0
- package/docs/manual-test-plan.md +29 -0
- package/docs/message-composer.md +156 -0
- package/docs/nav-stack.md +327 -14
- package/docs/overlay-toast.md +62 -0
- package/docs/overlay-tooltip.md +53 -0
- package/docs/progress.md +62 -0
- package/docs/recipes.md +147 -73
- package/docs/slider.md +64 -0
- package/docs/split-view.md +96 -7
- package/docs/sunken-panel.md +106 -0
- package/docs/surface-scaffold.md +487 -0
- package/docs/tab-navigator.md +291 -0
- package/docs/tag-field.md +66 -0
- package/docs/type-contracts.md +137 -0
- package/docs/ui-analyzer.md +406 -0
- package/docs/ui-doctor.md +298 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +58 -17
- package/docs/webawesome-migration.md +82 -0
- package/docs/webawesome-theme.md +306 -47
- package/docs/workbench-dialog.md +88 -0
- package/docs/workbench.md +637 -12
- package/docs/writing.md +154 -0
- package/doctor/cli.mjs +120 -0
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/config.schema.json +94 -0
- package/doctor/copy-capitalization-checks.mjs +603 -0
- package/doctor/eslint-diagnostics.d.mts +24 -0
- package/doctor/eslint-diagnostics.mjs +24 -0
- package/doctor/index.d.mts +122 -0
- package/doctor/index.mjs +1424 -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 +940 -54
- package/package.json +488 -43
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/traversal-exclusions.mjs +86 -0
- package/ux-demo/recipes/app-shell.tsx +204 -16
- package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
- package/ux-demo/recipes/compact-toolbar.tsx +135 -14
- package/ux-demo/recipes/composer-form.tsx +135 -24
- package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +11 -3
- package/ux-demo/recipes/loading-inspector.tsx +162 -39
- package/ux-demo/recipes/media-detail.tsx +272 -0
- package/ux-demo/recipes/mount-recipe.ts +28 -11
- package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
- package/ux-demo/recipes/navigation-stack.tsx +79 -24
- package/ux-demo/recipes/types.ts +18 -2
- package/ux-demo/recipes/workspace-header.tsx +86 -5
- package/vite-ux-review.d.mts +83 -0
- package/vite-ux-review.mjs +120 -0
- package/dist/app-tab.d.ts +0 -30
- package/dist/app-tab.js +0 -5
- package/dist/app-tab.js.map +0 -1
- package/dist/browser/app-tab.js +0 -4
- package/dist/browser/panel-header.js +0 -7
- package/dist/browser/token-search-field.js +0 -4
- package/dist/chunk-2Z5TWHKQ.js +0 -34
- package/dist/chunk-2Z5TWHKQ.js.map +0 -1
- package/dist/chunk-37T3VNIZ.js +0 -19
- package/dist/chunk-37T3VNIZ.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-5ATCDSQS.js +0 -42
- package/dist/chunk-5ATCDSQS.js.map +0 -1
- package/dist/chunk-5E2HVJ33.js +0 -10
- package/dist/chunk-5E2HVJ33.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js +0 -31
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7JB7VPRI.js +0 -34
- package/dist/chunk-7JB7VPRI.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-AVZHJN6C.js +0 -14
- package/dist/chunk-AVZHJN6C.js.map +0 -1
- package/dist/chunk-B24C4A6T.js +0 -22
- package/dist/chunk-B24C4A6T.js.map +0 -1
- package/dist/chunk-BLK3UEEI.js +0 -23
- package/dist/chunk-BLK3UEEI.js.map +0 -1
- package/dist/chunk-CH4SQ6H5.js +0 -39
- package/dist/chunk-CH4SQ6H5.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-I7INRJO4.js +0 -17
- package/dist/chunk-I7INRJO4.js.map +0 -1
- package/dist/chunk-L4OKFDJY.js +0 -24
- package/dist/chunk-L4OKFDJY.js.map +0 -1
- package/dist/chunk-LCOBDOCC.js +0 -265
- package/dist/chunk-LCOBDOCC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-RNPGFQ33.js +0 -10
- package/dist/chunk-RNPGFQ33.js.map +0 -1
- package/dist/chunk-RUNWEPR4.js +0 -10
- package/dist/chunk-RUNWEPR4.js.map +0 -1
- package/dist/chunk-W2FK7ZNY.js +0 -26
- 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-XE5ZLPCC.js +0 -20
- package/dist/chunk-XE5ZLPCC.js.map +0 -1
- package/dist/chunk-XXMOARTH.js +0 -229
- package/dist/chunk-XXMOARTH.js.map +0 -1
- package/dist/chunk-YGN7OMLT.js.map +0 -1
- package/dist/panel-header.d.ts +0 -36
- package/dist/panel-header.js +0 -7
- package/dist/panel-header.js.map +0 -1
- package/dist/styles/app-tab.css +0 -152
- package/dist/styles/panel-header.css +0 -64
- package/dist/styles/tab-scaffold.css +0 -84
- package/dist/styles/token-search-field.css +0 -289
- package/dist/tab-scaffold.d.ts +0 -30
- package/dist/tab-scaffold.js +0 -16
- package/dist/tab-scaffold.js.map +0 -1
- package/dist/token-search-field.d.ts +0 -43
- package/dist/token-search-field.js +0 -4
- package/dist/token-search-field.js.map +0 -1
- package/dist/wire-tab-scaffold.d.ts +0 -11
- package/dist/wire-tab-scaffold.js +0 -16
- package/dist/wire-tab-scaffold.js.map +0 -1
- package/dist/wire-token-search-fields.js +0 -5
- package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-actions.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
- package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
- package/docs/design/templates/panel-header/no-icon.svg +0 -1
- package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
- package/docs/design/templates/panel-header/page-heading.svg +0 -1
- package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
- package/docs/design/templates/panel-header/title-only.svg +0 -1
- package/docs/design/templates/panel-header-dark.svg +0 -13
- package/docs/design/templates/panel-header.svg +0 -13
- package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
- package/docs/design/templates/token-search-field/empty.svg +0 -1
- package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
- package/docs/design/templates/token-search-field/tokens.svg +0 -1
- package/docs/design/templates/token-search-field-dark.svg +0 -7
- package/docs/design/templates/token-search-field.svg +0 -7
- package/docs/tab-scaffold.md +0 -41
- package/ux-demo/recipes/recipes.css +0 -448
package/docs/layout.md
CHANGED
|
@@ -1,64 +1,533 @@
|
|
|
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.
|
|
31
|
+
|
|
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.
|
|
38
|
+
|
|
39
|
+
### Deep content inset
|
|
40
|
+
|
|
41
|
+
Set `deepInset` on a `Pane` to add 8px of padding on every side of its scrolling
|
|
42
|
+
content. A `ContentItem` or `ListItem` that normally sits 8px from the pane's
|
|
43
|
+
inline edge then sits 16px from it. The default is `false`. This extra padding
|
|
44
|
+
adds to any device safe-area inset; a header or footer still owns the safe-area
|
|
45
|
+
padding at its edge while the content keeps its extra 8px. The pane's header,
|
|
46
|
+
footer, background, and separators still reach their usual edges.
|
|
47
|
+
For opaque edge-to-edge content, set `--kui-pane-scrollbar-gutter: stable` on the
|
|
48
|
+
Pane or an ancestor. This reserves a vertical scrollbar gutter so a child that
|
|
49
|
+
bleeds through the inline padding stops before the scroll indicator. The default
|
|
50
|
+
is `auto`; the optional gutter is outside the published content inset values.
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Pane deepInset>
|
|
54
|
+
<ContentItem>Project Atlas</ContentItem>
|
|
55
|
+
</Pane>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The pane leaves `--kui-layout-inline-margin` at its normal 8px value. Nested
|
|
59
|
+
`Row`, `List`, and `Grid` therefore keep their usual item spacing; they do
|
|
60
|
+
not inherit a doubled margin. `PaneConfig.deepInset` forwards through
|
|
61
|
+
Workbench `mainPane`, panel `pane`, CollapsiblePanel `pane`, and a
|
|
62
|
+
`NavStackView.pane`.
|
|
63
|
+
|
|
64
|
+
### Focusable pane
|
|
65
|
+
|
|
66
|
+
Set `tabIndex={0}` to put the whole Pane in the Tab order, or `tabIndex={-1}`
|
|
67
|
+
when application code should focus it without adding a Tab stop. Keyboard focus
|
|
68
|
+
draws the standard focus ring. Set `outlined` to keep that ring visible as an
|
|
69
|
+
application-controlled state, such as a drop target, whether or not the Pane is
|
|
70
|
+
focused. `PaneConfig` forwards both options through layouts that render a Pane.
|
|
71
|
+
Give a focusable Pane a useful `label` when it represents a distinct region.
|
|
72
|
+
The ring paints above edge-to-edge child surfaces without intercepting their
|
|
73
|
+
buttons, selects, or nested scrolling.
|
|
74
|
+
|
|
75
|
+
### Lowered work surfaces
|
|
76
|
+
|
|
77
|
+
Set `appearance="sunken"` when the work area itself should use the lowered
|
|
78
|
+
surface color, including blank space below short content and the scroll
|
|
79
|
+
viewport. The default appearance is unchanged. The fixed Pane paints its
|
|
80
|
+
content scroller; with `chromePlacement="auto"`, the Pane root paints the
|
|
81
|
+
surface because it becomes the scroller in a short viewport. Header and footer
|
|
82
|
+
chrome stay on the normal surface. No second scroll container or
|
|
83
|
+
`SunkenPanel` wrapper is needed.
|
|
84
|
+
Sunken panes draw their header/footer dividers by default, even when short
|
|
85
|
+
content does not scroll. Pass `chromeDividers="scroll"` to restore scroll-state
|
|
86
|
+
dividers or `"none"` to hide them.
|
|
87
|
+
For custom chrome colors in auto mode, set `--kui-pane-chrome-background`
|
|
88
|
+
on the Pane; it defaults to `--kui-color-surface`.
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
<Pane appearance="sunken" footer={<MessageComposer />}>
|
|
92
|
+
<Conversation />
|
|
93
|
+
</Pane>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`PaneConfig.appearance` forwards through Workbench `mainPane`, panel `pane`,
|
|
97
|
+
and CollapsiblePanel `pane`. Workbench also applies that choice to its main or
|
|
98
|
+
panel region when it renders no Pane chrome. Set `appearance: "sunken"` on a
|
|
99
|
+
`NavStackView` or `TabNavigatorTab` when its view or scene owns scrolling.
|
|
100
|
+
For a `SplitView`, put a `Pane` in the list or detail region and set its
|
|
101
|
+
appearance; SplitView only arranges the regions and does not own their scroll.
|
|
102
|
+
Choose the innermost owner when composing layouts.
|
|
103
|
+
|
|
104
|
+
The color uses `--kui-sunken-panel-background`, falling back to
|
|
105
|
+
`--kui-color-surface-lowered`, just like `SunkenPanel`. Select one scroll owner
|
|
106
|
+
in a nested layout so a translucent override paints once. The public color
|
|
107
|
+
override may be set at a Pane or layout boundary.
|
|
108
|
+
|
|
109
|
+
### Background colors
|
|
110
|
+
|
|
111
|
+
Set `background` when a pane needs a surface color of its own, such as a
|
|
112
|
+
media detail page painted in its artwork's color. It takes a typed color from
|
|
113
|
+
`@kerfjs/ui/css-values`: `uiColor('surface-raised')` for a theme token,
|
|
114
|
+
`fillColor('#1f2a44')` for an app-chosen literal, or `colorVar('--app-hue')`
|
|
115
|
+
for an app-owned custom property. The color paints the whole pane, header and
|
|
116
|
+
footer included, and replaces the appearance's fill: a sunken pane with a
|
|
117
|
+
background drops its lowered color and grain. Omitted, the pane keeps its
|
|
118
|
+
default.
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import { fillColor } from "@kerfjs/ui/css-values";
|
|
122
|
+
|
|
123
|
+
<Pane background={fillColor("#1f2a44")} header={<AlbumToolbar />}>
|
|
124
|
+
<AlbumTracks />
|
|
125
|
+
</Pane>;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`PaneConfig.background` forwards like `appearance`, so a Workbench `mainPane`
|
|
129
|
+
or panel `pane`, a CollapsiblePanel `pane`, or a `NavStackView` `pane` takes
|
|
130
|
+
it. `NavStack` and `TabNavigator` take their own `background` for the stack
|
|
131
|
+
or navigator surface and their docked bars, and a `TabNavigatorTab` takes one
|
|
132
|
+
for its scene. Overlay chrome keeps the translucent chrome material over any
|
|
133
|
+
of them.
|
|
134
|
+
|
|
135
|
+
The app owns contrast: keep text at AA over the color you choose. A dark
|
|
136
|
+
color needs dark-tone controls or a scoped tint for its content. In forced
|
|
137
|
+
colors every background paints `Canvas`.
|
|
138
|
+
|
|
139
|
+
### Tinted surfaces
|
|
140
|
+
|
|
141
|
+
Set `tint` when a whole region should take on a color, the way a media detail
|
|
142
|
+
page takes on its artwork's color: `tint={{ color, scheme }}`. `color` is a
|
|
143
|
+
`@kerfjs/ui/css-values` color, usually one the app already knows about its
|
|
144
|
+
artwork, and `scheme` says whether that color reads as a `'light'` or a
|
|
145
|
+
`'dark'` surface. Kerf does no color detection; the app declares the scheme.
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
import { fillColor } from "@kerfjs/ui/css-values";
|
|
149
|
+
|
|
150
|
+
<Pane tint={{ color: fillColor(album.bottomColor), scheme: "dark" }} header={<AlbumToolbar />}>
|
|
151
|
+
<AlbumTracks />
|
|
152
|
+
</Pane>;
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The pane paints its tinted surface, and everything inside it re-derives from
|
|
156
|
+
the color: the surface and raised surface, normal and quiet text, link and
|
|
157
|
+
brand text, and everything built on them (quiet fills, the lowered surface,
|
|
158
|
+
the chrome material behind overlay headers, popup rows). Each token's
|
|
159
|
+
lightness is clamped into a band that keeps text at WCAG AA over any color: a
|
|
160
|
+
light tint's surface stays at or above 90% OKLCH lightness under dark text,
|
|
161
|
+
and a dark tint's surface at or below 30% under light text. Chroma is capped,
|
|
162
|
+
so text stays near-neutral and the surface reads as a tint of the color. A
|
|
163
|
+
seed sweep across hue and lightness holds every text token at 4.5:1 or better
|
|
164
|
+
over the surface, raised surface, and quiet fills, with and without the Web
|
|
165
|
+
Awesome theme (`tests/browser/tone-contrast.spec.ts`).
|
|
166
|
+
|
|
167
|
+
The scope also takes the declared `color-scheme` and the Web Awesome
|
|
168
|
+
`wa-light` / `wa-dark` class, so Web Awesome components inside it re-derive
|
|
169
|
+
their own fills. Without relative color syntax, and under
|
|
170
|
+
`prefers-contrast: more`, the scope keeps the plain palette in its declared
|
|
171
|
+
scheme. `tint` and `background` combine: `background` paints the pane, and
|
|
172
|
+
`tint` still re-derives the tokens for its content.
|
|
173
|
+
|
|
174
|
+
Add `accent` (usually the artwork's most vivid color) to re-derive the brand
|
|
175
|
+
ramp too: `tint={{ color, scheme, accent }}`. Loud fills (primary buttons, the
|
|
176
|
+
current popup row, checked controls) and their text, brand text and links,
|
|
177
|
+
text on brand fills, and the focus ring all take the accent's hue. Lightness
|
|
178
|
+
is clamped so each pair keeps AA for any accent, including vivid green and
|
|
179
|
+
cyan after gamut clipping: in a light scope the fill stays at or below 46%
|
|
180
|
+
OKLCH lightness under white text, brand text at most 36%, and text on brand
|
|
181
|
+
fills at most 30%; in a dark scope the fill stays between 72% and 85% under
|
|
182
|
+
near-black text, brand text at least 94% against a raised tint surface, and
|
|
183
|
+
text on brand fills at least 95% with chroma capped at 0.12. The dark focus
|
|
184
|
+
ring starts at 78% to stay visible on raised tinted surfaces. The browser
|
|
185
|
+
regression sweeps 36 hues, four chroma levels, and three seed lightnesses in
|
|
186
|
+
both schemes with and without the Web Awesome theme.
|
|
187
|
+
|
|
188
|
+
`PaneConfig.tint` forwards like `background`. `NavStack`, `TabNavigator`, and
|
|
189
|
+
each `TabNavigatorTab` take `tint` for the stack, the navigator, or one scene.
|
|
190
|
+
|
|
191
|
+
Pass any combination of logical sides to `separators`: `block-start`,
|
|
192
|
+
`block-end`, `inline-start`, and `inline-end`. Every line is off by default and
|
|
193
|
+
each enabled side uses `--kui-pane-separator-width` (1px) and
|
|
194
|
+
`--kui-pane-separator-color` (`--kui-color-neutral-border-normal`). Logical sides keep pane
|
|
195
|
+
boundaries correct in both left-to-right and right-to-left layouts.
|
|
196
|
+
|
|
197
|
+
### Scroll dividers
|
|
198
|
+
|
|
199
|
+
Toolbars draw no divider by default. The line between pinned chrome and the
|
|
200
|
+
content that scrolls beside it is scroll state, not decoration: it shows only
|
|
201
|
+
while content is scrolled away from that edge, the way platform navigation bars
|
|
202
|
+
gain a hairline once content moves beneath them.
|
|
203
|
+
|
|
204
|
+
- A near edge (top, left) hides at the scroll start.
|
|
205
|
+
- A far edge (bottom, right) hides at the scroll end, and whenever the content
|
|
206
|
+
fits and nothing scrolls.
|
|
207
|
+
|
|
208
|
+
Call `wireScrollDividers` from `@kerfjs/ui/wire-scroll-dividers` once at the
|
|
209
|
+
application root and keep its disposer:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import { wireScrollDividers } from "@kerfjs/ui/wire-scroll-dividers";
|
|
213
|
+
|
|
214
|
+
const stop = wireScrollDividers(appRoot);
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
It covers, by structure, every `Pane` below the root (the header's bottom line
|
|
218
|
+
and the footer's top line, whatever the chrome holds — a `Toolbar`, a
|
|
219
|
+
`mainHeader` list, a `TabBar`) and every `TabBar` strip (a line on each side
|
|
220
|
+
whose tabs are scrolled out of view). That includes the panes a `Workbench`,
|
|
221
|
+
`CollapsiblePanel`, or `Catalog` renders; `wireCatalog` installs it for its
|
|
222
|
+
own root. It also covers every `NavStack` (the top chrome's bottom line and the
|
|
223
|
+
bottom toolbar's top line, around the active view) and every `TabNavigator`
|
|
224
|
+
(the bar's top line, over the active scene). The layout keys on whichever
|
|
225
|
+
element actually scrolls there: the view or scene itself, or, through a sole
|
|
226
|
+
child with no chrome of its own on that edge, a `Pane`'s content or a nested
|
|
227
|
+
`NavStack`'s active view. A sole `Pane` fills its view or scene, so its content
|
|
228
|
+
scrolls under its pinned header; with a header it draws the line under that
|
|
229
|
+
header itself, so the stack's chrome never doubles it. It follows re-renders: panes that appear later are paired, and an
|
|
230
|
+
attribute a morph drops returns before paint.
|
|
231
|
+
|
|
232
|
+
Multiple calls in one document share one attribute writer, including calls on
|
|
233
|
+
overlapping roots. Each call contributes its own root and optional named
|
|
234
|
+
targets; its disposer removes only that registration. When the last disposer
|
|
235
|
+
runs, the writer removes the attributes it owns. An app that calls `wireCatalog`
|
|
236
|
+
for a root already has scroll dividers there and does not need another call.
|
|
237
|
+
|
|
238
|
+
The wiring only reports state; every component draws its own line. It writes
|
|
239
|
+
`data-scroll-overflow` (the edges with content hidden beyond them, in canonical
|
|
240
|
+
`t`/`r`/`b`/`l` order) on each scroller and `data-scroll-divider` (the sides to
|
|
241
|
+
draw) on each piece of chrome, and the Pane, NavStack, TabNavigator, TabBar,
|
|
242
|
+
Toolbar, and List stylesheets draw from those. The line is an inset shadow or a pseudo-element
|
|
243
|
+
inside the component, so no state ever moves the chrome, the content, or a tab.
|
|
244
|
+
Never write a border onto a component to show one.
|
|
245
|
+
|
|
246
|
+
Configure a pane with `chromeDividers`: `scroll` (the plain-pane default) follows
|
|
247
|
+
the scroll state and draws nothing until the wiring runs; `always` (the sunken
|
|
248
|
+
pane default) keeps both lines; `none` drops them. Explicit values override
|
|
249
|
+
either default. Layouts forward it through `PaneConfig`
|
|
250
|
+
(`mainPane.chromeDividers`, a panel's `pane.chromeDividers`). A `NavStack` and a
|
|
251
|
+
`TabNavigator` take the same `chromeDividers` for their own chrome (the stack's
|
|
252
|
+
top chrome and bottom toolbar, the scaffold's bar), and a `SplitView` forwards
|
|
253
|
+
it to its compact stack through `compactStack`.
|
|
254
|
+
|
|
255
|
+
For an app-owned arrangement outside a `Pane`, name the scroller and its chrome
|
|
256
|
+
by `id` in `targets`; a `Toolbar` or `List` named as chrome draws the divider
|
|
257
|
+
on its side facing the scroller. Both take an `id` prop, so the components
|
|
258
|
+
themselves are named, never a wrapper:
|
|
259
|
+
|
|
260
|
+
```tsx
|
|
261
|
+
<Toolbar id="results-toolbar" label="Results" leading={title} />
|
|
262
|
+
<List id="results" scrollable flex>{rows}</List>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
wireScrollDividers(appRoot, {
|
|
267
|
+
targets: [{ scroller: "results", top: "results-toolbar", bottom: "status" }],
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
A CSS-only version is not used: scroll-driven animations are not available in
|
|
272
|
+
Firefox, scroll-state container queries only in Chromium, and neither lets
|
|
273
|
+
the pinned chrome — a sibling of the scroller — read the scroller's state on
|
|
274
|
+
its own. One wiring keeps the behavior identical in every engine.
|
|
275
|
+
|
|
276
|
+
### Overlay header
|
|
277
|
+
|
|
278
|
+
`headerPresentation="overlay"` lays a Pane's header over the top of its
|
|
279
|
+
scrolling content instead of giving it its own row, the way platform
|
|
280
|
+
navigation bars let content scroll visibly beneath a translucent bar:
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
<Pane
|
|
284
|
+
label="Inbox"
|
|
285
|
+
headerPresentation="overlay"
|
|
286
|
+
header={<Toolbar label="Inbox" leading={<ToolbarText text="Inbox" size="xlarge" />} />}
|
|
287
|
+
>
|
|
288
|
+
{messages}
|
|
289
|
+
</Pane>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
The header paints the shared chrome material, `--kui-chrome-material` (the
|
|
293
|
+
surface at 80% opacity) behind `--kui-chrome-material-filter` (a blur and
|
|
294
|
+
saturation backdrop filter), so content passing beneath it reads as softened
|
|
295
|
+
color, not as competing text. The material becomes the opaque surface under
|
|
296
|
+
`prefers-reduced-transparency: reduce` or `prefers-contrast: more`, where
|
|
297
|
+
the browser lacks `backdrop-filter`, on a slow-updating display
|
|
298
|
+
(`update: slow`), and when the app sets `data-kui-effects="static"` on the
|
|
299
|
+
root element (see [Chrome material](accessibility.md#chrome-material)). In forced colors the header paints
|
|
300
|
+
`Canvas` with a `CanvasText` bottom edge.
|
|
301
|
+
|
|
302
|
+
`wireScrollDividers` measures each overlay header (its border-box height,
|
|
303
|
+
safe-area padding included) with a `ResizeObserver` and publishes it on the
|
|
304
|
+
Pane as the `--kui-scroll-clearance-block-start` context (see
|
|
305
|
+
[Scroll clearance](#scroll-clearance)). The Pane's content clears it
|
|
306
|
+
automatically, with no `scrollClearance` prop. At rest the first item sits just
|
|
307
|
+
below the header. Mid-scroll, content passes beneath it, and anything focused
|
|
308
|
+
or scrolled into view still comes to rest clear of it. The clearance follows
|
|
309
|
+
the header as its title wraps or its text grows. The header draws its scroll
|
|
310
|
+
divider as a docked header does, once content is scrolled beneath it. The
|
|
311
|
+
wiring also marks the Pane `data-header-overlay="measured"`, and only then
|
|
312
|
+
does the header move over the content. Until the wiring runs, the header stays
|
|
313
|
+
docked in its own row, so it can never cover content it has not measured. A
|
|
314
|
+
re-render that drops the measurement gets it back before paint.
|
|
315
|
+
|
|
316
|
+
The overlay needs pinned chrome. With `chromePlacement="auto"`, the header
|
|
317
|
+
stays docked. `PaneConfig` carries `headerPresentation`, so a Workbench
|
|
318
|
+
`mainPane` or panel `pane`, a `CollapsiblePanel` `pane`, or a `NavStack` view's
|
|
319
|
+
`pane` can lay its header over its content the same way. Overlay-header text
|
|
320
|
+
must stay at AA over whatever passes beneath: an untoned `ToolbarText` there
|
|
321
|
+
takes the normal text color for its title and lifts its `description` toward
|
|
322
|
+
it, and other quiet secondary copy belongs in the content (see
|
|
323
|
+
[Accessibility › Chrome material](accessibility.md#chrome-material)).
|
|
324
|
+
|
|
325
|
+
An overlay scrollbar (macOS by default) passes beneath the header like the
|
|
326
|
+
content. A classic, space-taking scrollbar (Windows and Linux, or macOS with
|
|
327
|
+
"always show scrollbars") stays uncovered: the wiring also measures the
|
|
328
|
+
content's vertical scrollbar (`offsetWidth` beyond `clientWidth`) and publishes
|
|
329
|
+
its inline size on the Pane as `--kui-pane-scrollbar-inline-size`, and the
|
|
330
|
+
header ends where the scrollbar's track begins, so its thumb and arrow buttons
|
|
331
|
+
remain visible and usable. The measurement follows the scrollbar as content
|
|
332
|
+
starts or stops overflowing.
|
|
333
|
+
|
|
334
|
+
A pane is safe-area aware. Its background and separators paint through a
|
|
335
|
+
device's unsafe areas while its header, content, and footer pad for each side
|
|
336
|
+
the pane still reaches; the content's block insets are scroll padding, so its
|
|
337
|
+
first and last items can always be scrolled clear. Layouts clear the sides a
|
|
338
|
+
pane does not reach. In an app-owned arrangement, pass `safeAreaEdges` (the
|
|
339
|
+
same logical sides as `separators`; all four by default, `[]` to opt out). See
|
|
340
|
+
[Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
24
341
|
|
|
25
342
|
`.kui-content` is a vertical stack with a 24px gap between major children.
|
|
26
343
|
Sections may contain adjacent `ListItem` rows without adding another major gap.
|
|
27
|
-
Ordinary surface-like children
|
|
28
|
-
geometry
|
|
29
|
-
|
|
30
|
-
- 8px inline margin from the pane edge
|
|
31
|
-
- 1px border, transparent by default
|
|
32
|
-
- 8px internal padding and 8px internal gap
|
|
33
|
-
- `calc(1px + remify(11px))`, or 12px, rounded corners
|
|
344
|
+
Ordinary surface-like children are `ContentItem`s and own their complete
|
|
345
|
+
geometry (see [Content items](#content-items)).
|
|
34
346
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
347
|
+
Nested selection and hover highlights stay concentric and match their owning
|
|
348
|
+
control's shape. Their inner radius is the outer radius minus the full inset,
|
|
349
|
+
expressed by the shared `--kui-layout-highlight-inset` token (2px by default).
|
|
350
|
+
For example, `SegmentedControl` and `ToolbarControlGroup` place each highlight
|
|
351
|
+
behind a 1px control border and 1px control padding, so a rounded control's 12px
|
|
352
|
+
outer radius produces a 10px highlight radius; a 22px pill produces 20px.
|
|
39
353
|
|
|
40
354
|
A visible parent surface does not make every child another visible card. The
|
|
41
|
-
composer recipe keeps its form as the single surface, uses `
|
|
355
|
+
composer recipe keeps its form as the single surface, uses a heading `Toolbar` for
|
|
42
356
|
its task hierarchy, and places field and action control edges on the shared 8px
|
|
43
357
|
inline gutter instead of nesting them inside another padded content item. A
|
|
44
358
|
conditional `StateBanner` remains visibly distinct because it communicates
|
|
45
359
|
semantic status.
|
|
46
360
|
|
|
361
|
+
### Clear header
|
|
362
|
+
|
|
363
|
+
`headerPresentation="clear"` is an overlay header with no fill: the same
|
|
364
|
+
measuring, placement, and scroll clearance as `overlay`, but fully
|
|
365
|
+
transparent, for a header laid over imagery such as a `BackdropImage` hero.
|
|
366
|
+
The header is not what keeps its controls legible over the image: put them
|
|
367
|
+
in glass control groups (`ToolbarControlGroup material="glass"`), or give the
|
|
368
|
+
content a scrim. A clear header draws no scroll divider. Set `underChrome` on a
|
|
369
|
+
`BackdropImage` that opens the content to run its artwork up beneath the
|
|
370
|
+
header.
|
|
371
|
+
|
|
372
|
+
A clear header stays clear while content scrolls beneath it. To fade a
|
|
373
|
+
backing in gradually instead, the scroll-edge effect of iOS, set
|
|
374
|
+
`scrollEdge="material"` (the translucent chrome material) or
|
|
375
|
+
`scrollEdge="surface"` (the opaque surface). The backing tracks the scroll:
|
|
376
|
+
it is fully clear at rest and fully in once content has scrolled
|
|
377
|
+
`scrollEdgeDistance` pixels beneath the header (default 60), and out again as
|
|
378
|
+
you return to the top. Only its opacity changes; the blur itself never
|
|
379
|
+
animates. `wireScrollDividers` publishes the progress
|
|
380
|
+
(`--kui-scroll-edge-progress`, 0 to 1) from the scroll it already tracks, so
|
|
381
|
+
it works in every engine with no extra wiring; unwired, the header stays
|
|
382
|
+
clear.
|
|
383
|
+
|
|
384
|
+
```tsx
|
|
385
|
+
<Pane
|
|
386
|
+
label="Album"
|
|
387
|
+
headerPresentation="clear"
|
|
388
|
+
scrollEdge="material"
|
|
389
|
+
header={<Toolbar label="Album" leading={<BackGroup />} trailing={<AlbumActions />} />}
|
|
390
|
+
>
|
|
391
|
+
<BackdropImage src={art} alt="" fadeTo={uiColor("surface")} underChrome>
|
|
392
|
+
<Tracks />
|
|
393
|
+
</BackdropImage>
|
|
394
|
+
</Pane>
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
Clear chrome turns opaque where transparency would hurt: under
|
|
398
|
+
`prefers-reduced-transparency: reduce` or `prefers-contrast: more` it paints
|
|
399
|
+
the opaque material, and in forced colors it paints `Canvas` with a
|
|
400
|
+
`CanvasText` edge. Under the static-effects switch or on a slow-updating
|
|
401
|
+
display, the scroll edge snaps on while content lies beneath the bar instead
|
|
402
|
+
of tracking the scroll.
|
|
403
|
+
`NavStack` (`chromePresentation`, `bottomToolbarPresentation`) and
|
|
404
|
+
`TabNavigator` (`barPresentation`) take the same `clear` value and
|
|
405
|
+
`scrollEdge` and `scrollEdgeDistance` props; a bottom bar fades its backing
|
|
406
|
+
out over the last `scrollEdgeDistance` pixels, clearing once the content
|
|
407
|
+
reaches its end.
|
|
408
|
+
|
|
409
|
+
## Content items
|
|
410
|
+
|
|
411
|
+
Render an ordinary surface-like `.kui-content` child with `ContentItem` from
|
|
412
|
+
`@kerfjs/ui/content-item` (browser-aware bundlers receive its CSS automatically;
|
|
413
|
+
`@kerfjs/ui/layout.css` and `@kerfjs/ui/content-item.css` both deliver it). It
|
|
414
|
+
owns its complete geometry:
|
|
415
|
+
|
|
416
|
+
- 8px inline margin from the pane edge
|
|
417
|
+
- 1px border, transparent by default
|
|
418
|
+
- 8px internal padding
|
|
419
|
+
- `calc(1px + remify(11px))`, or 12px, rounded corners
|
|
420
|
+
|
|
421
|
+
```tsx
|
|
422
|
+
import { ContentItem } from "@kerfjs/ui/content-item";
|
|
423
|
+
|
|
424
|
+
<Pane label="Inspector">
|
|
425
|
+
<ContentItem>{details}</ContentItem>
|
|
426
|
+
<ContentItem frame="framed">{pendingChanges}</ContentItem>
|
|
427
|
+
<ContentItem appearance="success">{completedWork}</ContentItem>
|
|
428
|
+
<ContentItem flush>{markdownPreview}</ContentItem>
|
|
429
|
+
<ContentItem shape="pill">{summary}</ContentItem>
|
|
430
|
+
</Pane>;
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
`frame="framed"` paints the standard neutral border in the 1px the item always
|
|
434
|
+
reserves, so framed and unframed items share the same geometry. Frame an item
|
|
435
|
+
only when it marks a real distinction and must read as visibly bounded; do not
|
|
436
|
+
frame it to make it "look contained". `shape="pill"` selects the 22px pill
|
|
437
|
+
radius expressed as `calc(1px + remify(21px))`. `appearance="surface"` paints
|
|
438
|
+
the base surface. The `neutral`, `info`, `pop`, `success`, `warning`, and
|
|
439
|
+
`danger` appearances coordinate the same quiet status background, border, and
|
|
440
|
+
foreground tokens as `StateBanner`; `transparent` is the default. A lowered,
|
|
441
|
+
inset surface around a content stack is `SunkenPanel`, and bare text that only
|
|
442
|
+
needs to align with neighboring items is `ListInsetText`. Safe `data-*`
|
|
443
|
+
metadata goes in `rootAttributes`. Pass `ariaLabel` only for a distinct named
|
|
444
|
+
region (`role="region"`), and `focusTarget` to make the item a programmatic
|
|
445
|
+
focus target (`tabindex="-1"`), for example a NavStack view's `data-nav-focus`
|
|
446
|
+
target. `flush` removes block padding and both block borders while retaining
|
|
447
|
+
the inline margin, padding, and border. Use it for content such as a markdown
|
|
448
|
+
preview that must reach the item's top and bottom edges. `title` passes through
|
|
449
|
+
to the root element as a native tooltip.
|
|
450
|
+
|
|
451
|
+
For a static item that needs focus, set `tabIndex={0}` for a Tab stop or
|
|
452
|
+
`tabIndex={-1}` for programmatic focus. Set `outlined` for a persistent focus
|
|
453
|
+
ring, such as a drop target, on static or interactive items. Interactive items
|
|
454
|
+
retain their own Tab stop, keyboard activation, selection, and disabled behavior;
|
|
455
|
+
`focusTarget` remains the shorthand for a static programmatic target.
|
|
456
|
+
|
|
457
|
+
For a selectable card, set `interactive`, a delegated `action`, and an optional
|
|
458
|
+
`itemId`. Wire `wireContentItems(root)` once on the containing app root; it
|
|
459
|
+
activates focused cards with Enter or Space and forwards the resulting click to
|
|
460
|
+
the app's ordinary `data-action` handler. `selectionMode="toggle"` maps
|
|
461
|
+
`selected` to a button's `aria-pressed`; `selectionMode="single"` maps it to an
|
|
462
|
+
option's `aria-selected` and belongs in an app-owned `role="listbox"` container.
|
|
463
|
+
For a card with nested controls and multi-selection, place
|
|
464
|
+
`selectionMode="multiple"` cards inside a `List selectionMode="multiple"` with
|
|
465
|
+
`ariaLabel`. The List is a labeled `grid` with `aria-multiselectable`, each card
|
|
466
|
+
is a focusable `row` with `aria-selected`, and its content is a `gridcell` that
|
|
467
|
+
may contain native controls. The app owns the selection set, including
|
|
468
|
+
Shift/Cmd extension; the card renders the supplied `selected` state and
|
|
469
|
+
dispatches its `action`. Give nested controls their own actions.
|
|
470
|
+
When the app delegates clicks by `data-action`, guard the card's selection
|
|
471
|
+
handler with `isContentItemActivation(event, card)` from
|
|
472
|
+
`@kerfjs/ui/wire-content-items`; it ignores clicks from nested controls that
|
|
473
|
+
have no separate action, including a `PopupMenu` trigger.
|
|
474
|
+
`wireContentItems` moves focus among enabled rows with Up/Down and Home/End
|
|
475
|
+
when a row has focus; arrows from nested controls retain their native behavior.
|
|
476
|
+
An interactive card is a Tab stop, and `disabled` removes its action and Tab
|
|
477
|
+
stop while exposing `aria-disabled`. Hover uses the normal neutral fill so it
|
|
478
|
+
remains visible on a lowered surface; hover, pressed, focus, and selected paints
|
|
479
|
+
do not change geometry. A single-action card has no interactive descendants.
|
|
480
|
+
For a rich card without card selection, render a static `ContentItem` with
|
|
481
|
+
sibling buttons inside it. Each button then has its own focus stop and action.
|
|
482
|
+
`ListActionRow` already packages this pattern for a simple two-action row.
|
|
483
|
+
`rootAttributes` still accepts safe app `data-*` metadata, while the card owns
|
|
484
|
+
its interaction data.
|
|
485
|
+
|
|
486
|
+
The rendered classes — `.kui-content-item`, `.kui-content-item--framed`,
|
|
487
|
+
`.kui-content-item--pill`, and `.kui-content-item--flush` — stay public for the
|
|
488
|
+
rare element that must carry the
|
|
489
|
+
geometry itself (for example a `<ul>` list or a `Text` paragraph in an
|
|
490
|
+
application-owned adapter). Prefer `ContentItem` everywhere else so the framing
|
|
491
|
+
choice is typed. A plain `<div class="kui-content-item">` is exactly what
|
|
492
|
+
`ContentItem` renders, so the catalog records that element
|
|
493
|
+
(`rootElement: "div"`): `eslint-plugin-kerfjs`'s `ui-public-boundaries` reports
|
|
494
|
+
it in application code as `KUI-L103` ("render `ContentItem`"), and
|
|
495
|
+
`npm run check:guidance` derives the same boundary from the catalog to reject it
|
|
496
|
+
in the package's examples, browser fixtures, and UX catalog.
|
|
497
|
+
|
|
498
|
+
These classes, the layout utilities (`.kui-content`, `.kui-scroll-owner`,
|
|
499
|
+
`.kui-control-cluster`, `.kui-inline-metadata`), and `.kui-app-root` are the
|
|
500
|
+
catalog's `boundaries.placeableClasses`: the only public classes an application
|
|
501
|
+
writes onto its own elements. Every other public class is a component's
|
|
502
|
+
rendered anatomy — render `Pane` rather than writing `.kui-pane` /
|
|
503
|
+
`.kui-pane__content` onto an `<aside>` — and `eslint-plugin-kerfjs`'s
|
|
504
|
+
`ui-public-boundaries` reports it on an application-owned element as
|
|
505
|
+
`KUI-L103`. Selecting those classes in CSS to place your own content in a
|
|
506
|
+
component's context stays allowed (see `KUI-L019`).
|
|
507
|
+
|
|
47
508
|
## Public roles and tokens
|
|
48
509
|
|
|
49
|
-
| Need
|
|
50
|
-
|
|
|
51
|
-
| Unpadded
|
|
52
|
-
| Scrolling pane content
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
510
|
+
| Need | Class | Token / default |
|
|
511
|
+
| ---------------------------------------- | ------------------------------------ | ------------------------------------------------------------------ |
|
|
512
|
+
| Unpadded header/content/footer structure | `Pane`, `.kui-pane` | — |
|
|
513
|
+
| Scrolling pane content | `.kui-pane__content` | — |
|
|
514
|
+
| Optional logical-edge separators | `Pane.separators` | `--kui-pane-separator-width: 1px` |
|
|
515
|
+
| Safe-area sides a pane may pad | `Pane.safeAreaEdges` | `--kui-safe-area-*: env(safe-area-inset-*)`, routed by each layout |
|
|
516
|
+
| Header laid over scrolling content | `Pane.headerPresentation` | `--kui-chrome-material`, `--kui-chrome-material-filter` |
|
|
517
|
+
| Dialog title bar laid over its body | `DialogSurface.headerPresentation` | `--kui-chrome-material-raised`, `--kui-chrome-material-filter` |
|
|
518
|
+
| Stack top bar laid over the active view | `NavStack.chromePresentation` | `--kui-chrome-material`, `--kui-chrome-material-filter` |
|
|
519
|
+
| Stack bottom toolbar laid over the view | `NavStack.bottomToolbarPresentation` | `--kui-chrome-material`, `--kui-chrome-material-filter` |
|
|
520
|
+
| Tab bar laid over the active scene | `TabNavigator.barPresentation` | `--kui-chrome-material`, `--kui-chrome-material-filter` |
|
|
521
|
+
| Major vertical rhythm | `.kui-content` | `--kui-layout-content-gap: 24px` |
|
|
522
|
+
| Self-contained child geometry | `ContentItem` | 8px margin + 1px border + 8px padding |
|
|
523
|
+
| Pill child | `ContentItem shape="pill"` | `--kui-layout-pill-radius: 22px` |
|
|
524
|
+
| Visibly framed child | `ContentItem frame="framed"` | neutral 1px border, same geometry |
|
|
525
|
+
| Related controls | `.kui-control-cluster` | `--kui-layout-control-gap: 8px` |
|
|
526
|
+
| Inline metadata | `.kui-inline-metadata` | `--kui-layout-metadata-gap: 4px` |
|
|
527
|
+
| Explicit scroll owner outside a pane | `.kui-scroll-owner` | `overflow: auto` |
|
|
59
528
|
|
|
60
529
|
The component layer applies the same contract to `Toolbar`, `ListHeader`,
|
|
61
|
-
`ListItem`, `
|
|
530
|
+
`ListItem`, `Toolbar`, `StateBanner`, `ValueTable`,
|
|
62
531
|
`ValueTableRow`, tabs, and form controls. A value-table row separator starts at
|
|
63
532
|
the row's 8px content inset, or at 40px when the row contains its 24px leading
|
|
64
533
|
icon and 8px gap, and always ends 8px from the right edge. Each value-table row
|
|
@@ -66,13 +535,32 @@ also keeps 8px of root-scaled block padding independently of its semantic inline
|
|
|
66
535
|
inset. Most interactive rows and toolbar groups are 44px tall.
|
|
67
536
|
Toolbar groups reserve a real 1px outer border around a 42px inner area, even
|
|
68
537
|
when their border and background are transparent.
|
|
69
|
-
`
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
a
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
538
|
+
A `Toolbar` lays its zones out against one 44px control band at its top: an
|
|
539
|
+
ordinary `ToolbarText`, `ToolbarControlGroup`, or standalone trailing
|
|
540
|
+
`Button` no taller than the band is centered in it by its own size, and a
|
|
541
|
+
taller one (a wrapped title, a second trailing row) starts at the band's top
|
|
542
|
+
and grows down, so it never moves the other controls. A wrapped `ToolbarText`
|
|
543
|
+
centers its first line in the band. Other direct zone content centers against
|
|
544
|
+
the zone's full height by default, including when a sibling makes that zone
|
|
545
|
+
taller than the control band.
|
|
546
|
+
The leading zone clips a shrinking title but reserves 4px of paint overflow
|
|
547
|
+
for the focus outline of a control at its edge. Focus rings in all three zones
|
|
548
|
+
remain visible at narrow and wide widths.
|
|
549
|
+
Trailing icon actions share one axis: a toolbar control centers its glyph in
|
|
550
|
+
that 44px slot at the 8px inline margin, and a `ListHeader` action centers its
|
|
551
|
+
fitted 36px square in a slot of the same size (a transparent hit layer extends
|
|
552
|
+
its pointer target to fill that 44px slot), so a Pane header's trailing toolbar
|
|
553
|
+
action and the `ListHeader` action beneath it line up (30px from the pane edge
|
|
554
|
+
at the default scale).
|
|
555
|
+
Panel, dialog, and page headings are plain `Toolbar` compositions. The leading
|
|
556
|
+
zone holds an optional icon `ToolbarControlGroup` and a direct extra-large
|
|
557
|
+
`ToolbarText`; actions belong in a trailing group. Omit empty groups. Supporting
|
|
558
|
+
copy is app-owned content below the toolbar and aligns with the intended content
|
|
559
|
+
edge.
|
|
560
|
+
When the title itself opens editing, set `ToolbarText action="edit-title"` and
|
|
561
|
+
render it directly in the leading zone beside any status chip. The button
|
|
562
|
+
shrinks and ellipsizes at the space left by its siblings without filling unused
|
|
563
|
+
space; the app swaps its own input into the edit state.
|
|
76
564
|
|
|
77
565
|
## Spacing scale
|
|
78
566
|
|
|
@@ -81,18 +569,423 @@ expressing exactly one relationship — pick the step by **how connected two
|
|
|
81
569
|
elements are**, not by eye. Every scalable value is `remify`-authored against the
|
|
82
570
|
fixed 16px baseline, so it delivers as `rem`.
|
|
83
571
|
|
|
84
|
-
| Value | Token
|
|
85
|
-
|
|
|
86
|
-
| 0px
|
|
87
|
-
| 4px
|
|
88
|
-
| 8px
|
|
89
|
-
| 16px
|
|
90
|
-
| 24px
|
|
572
|
+
| Value | Token | Relationship — when to use |
|
|
573
|
+
| ----- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
574
|
+
| 0px | `--kui-space-none` | No separation. The elements read as a single unit (a control and its own affordance, adjacent `ListItem` rows). |
|
|
575
|
+
| 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). |
|
|
576
|
+
| 8px | `--kui-space-xs` | Standard. Between elements **within a group** — the content-item padding/gutter, gaps between toolbar controls in a group. |
|
|
577
|
+
| 16px | `--kui-space-m` | Minor. Between **homogeneous groups** — two lists, two sibling sections of the same kind. |
|
|
578
|
+
| 24px | `--kui-space-l` | Major. Between **heterogeneous groups** — the `.kui-content` rhythm between major, differing regions. |
|
|
91
579
|
|
|
92
|
-
The two relationships that get confused most are 8px vs 24px: 8px is
|
|
93
|
-
group, 24px is
|
|
580
|
+
The two relationships that get confused most are 8px vs 24px: 8px is _inside_ a
|
|
581
|
+
group, 24px is _between_ major, differing regions. 16px sits between them for
|
|
94
582
|
same-kind groups.
|
|
95
583
|
|
|
584
|
+
For `Row.gap`, `Grid.gap`, and `List.gap`, pass one token name (`gap="xs"`,
|
|
585
|
+
`gap="m"`) to use it on both axes, or pass
|
|
586
|
+
`gap={{ column: 'none', row: 'm' }}` to set each axis independently. Each axis
|
|
587
|
+
also accepts a complete typed `CssLength`, including `space('xs')` from
|
|
588
|
+
`@kerfjs/ui/css-values`. A List is a single vertical column, so its row gap
|
|
589
|
+
separates items; its column gap is exposed for the same CSS axis contract.
|
|
590
|
+
Use `rem`, `em`, `px`, `pct`, `lengthVar`, and `calc(plus(...))` only when a
|
|
591
|
+
named spacing relationship does not express the requirement; do not pass raw
|
|
592
|
+
CSS strings.
|
|
593
|
+
|
|
594
|
+
## Text
|
|
595
|
+
|
|
596
|
+
`FieldLabel` from `@kerfjs/ui/text` gives a read-only or click-to-edit field
|
|
597
|
+
preview the same visible heading as a themed Web Awesome form control. Put it
|
|
598
|
+
in `ListInsetControl sides="trl"` above the preview so its text starts at the
|
|
599
|
+
same 17px content column as a `ContentItem` value. Unlike a native `<label>`, it
|
|
600
|
+
is a plain element: give it an `id` and name the preview's group with
|
|
601
|
+
`aria-labelledby`. Keep the app's preview/edit switching and hint copy beside
|
|
602
|
+
the preview; use the live control's own `label` when editing.
|
|
603
|
+
|
|
604
|
+
```tsx
|
|
605
|
+
import { ContentItem } from "@kerfjs/ui/content-item";
|
|
606
|
+
import { ListInsetControl } from "@kerfjs/ui/list-inset-control";
|
|
607
|
+
import { FieldLabel } from "@kerfjs/ui/text";
|
|
608
|
+
|
|
609
|
+
<div role="group" aria-labelledby="needed-by-label">
|
|
610
|
+
<ListInsetControl sides="trl">
|
|
611
|
+
<FieldLabel id="needed-by-label">Needed By</FieldLabel>
|
|
612
|
+
</ListInsetControl>
|
|
613
|
+
<ContentItem>October 16, 2026</ContentItem>
|
|
614
|
+
</div>;
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
Use `Text` from `@kerfjs/ui/text` for ordinary semantic headings, paragraphs,
|
|
618
|
+
and inline secondary text. It renders a native `p` by default; set `variant` to
|
|
619
|
+
`h1`–`h6` when the document outline calls for a heading, or `span` for inline
|
|
620
|
+
copy inside a row, label, or table cell. Ordinary global, `data-*`, and `aria-*`
|
|
621
|
+
attributes pass through. Block variants reset their native margin, own a 1px
|
|
622
|
+
transparent border, and supply the standard 8px item padding. The `span`
|
|
623
|
+
variant owns no margin, border, or padding. Choose heading levels from the
|
|
624
|
+
document outline, not for visual size. Toolbar identity and page-heading
|
|
625
|
+
compositions continue to use `ToolbarText`.
|
|
626
|
+
|
|
627
|
+
`Text.controlMargins` accepts canonical physical `Sides` (`t`, `r`, `b`, `l`,
|
|
628
|
+
in that order, or empty). Selected edges gain the exterior
|
|
629
|
+
`--kui-layout-inline-margin` gutter (8px by default); the border and padding
|
|
630
|
+
stay unchanged, including with `flush`. Use `controlMargins="rl"` for a
|
|
631
|
+
single text box that needs the control gutter without a Row wrapper. Do not
|
|
632
|
+
combine it with a parent inset on the same edges. Spans remain native inline
|
|
633
|
+
elements: horizontal margins separate inline content, while vertical margins
|
|
634
|
+
do not create line spacing.
|
|
635
|
+
|
|
636
|
+
`Text` is also the answer for a normal-color subsection title. `ToolbarText`
|
|
637
|
+
below `xlarge` (`large`, `default`, `small`) is deliberately quiet: it labels a
|
|
638
|
+
toolbar's identity — a pane name or a status — and must not compete with the
|
|
639
|
+
content and controls around it. Set `tone="dark"` on a loud-filled toolbar
|
|
640
|
+
surface (the inverse `--kui-color-neutral-fill-loud`) to use
|
|
641
|
+
`--kui-color-neutral-on-loud` at every size, matching dark control groups; it
|
|
642
|
+
inverts with the color scheme. Over a dark photo or scrim keep the default
|
|
643
|
+
tone inside a `BackdropImage` overlay, which takes the dark scheme under its
|
|
644
|
+
`scrim`. Default tone keeps existing identity and heading colors. A subsection title is
|
|
645
|
+
document content, not toolbar identity: use `Text` with the `h2`–`h6` variant
|
|
646
|
+
the outline calls for (inside a `List` with `controlInsets`, its text lines up
|
|
647
|
+
with content items). Use `ListHeader` when the section is a list or menu group
|
|
648
|
+
that needs a count, badge, action, or disclosure, and keep extra-large
|
|
649
|
+
`ToolbarText` for the panel, dialog, or page title. A narrow peripheral rail or
|
|
650
|
+
drawer is the exception that proves the rule: beside a work area that already
|
|
651
|
+
carries the extra-large title, its header names the pane with the default size,
|
|
652
|
+
because extra-large would truncate there ("Inspector" becomes "Ins…" in a 160px
|
|
653
|
+
rail) and pane identity should stay quiet.
|
|
654
|
+
|
|
655
|
+
`ListHeader.size` controls its label's visual scale independently of
|
|
656
|
+
`headingLevel`: `sm` is the current compact uppercase style and remains the
|
|
657
|
+
default; `xs` uses the 2xs font with capitalized words; `m`, `l`, and `xl` match
|
|
658
|
+
the themed h5, h4, and h3 typography. Pick `headingLevel` from the document
|
|
659
|
+
outline even when a different size suits the layout. `FieldLabel` stays at the
|
|
660
|
+
small uppercase style of the default ListHeader.
|
|
661
|
+
|
|
662
|
+
Presentation is independent of the native element: use `tone="quiet"` for
|
|
663
|
+
supporting copy, `tone="danger"` for error or validation copy, `size="compact"`
|
|
664
|
+
for compact metadata, `size="large"` for prominent copy, `size="xlarge"` for
|
|
665
|
+
display copy, and `font="monospace"` for code or identifiers (the
|
|
666
|
+
`--kui-font-mono` stack, which Kerf owns even with Web Awesome loaded). These
|
|
667
|
+
finite props compose with each other and with every semantic `variant`; omit
|
|
668
|
+
them to inherit the surrounding color, size, and font.
|
|
669
|
+
|
|
670
|
+
Control long copy with `wrap`: `normal` (default) restores ordinary wrapping,
|
|
671
|
+
`anywhere` breaks long unbroken strings, `nowrap` holds one line, and
|
|
672
|
+
`truncate` holds one line with an ellipsis. `truncate` sets `min-width: 0`, so
|
|
673
|
+
Text can shrink beside a fixed-size sibling in a `Row`; the sibling keeps its
|
|
674
|
+
width. On `normal` or `anywhere`, set a positive integer `maxLines` to clamp
|
|
675
|
+
wrapped text with an ellipsis. Omit `maxLines` for unlimited lines. The cap is
|
|
676
|
+
incompatible with `nowrap` and `truncate`.
|
|
677
|
+
|
|
678
|
+
With `wrap="truncate"`, `truncate` chooses where the ellipsis goes: `end`
|
|
679
|
+
(default) keeps the start; `start` keeps the tail, for a branch name or the
|
|
680
|
+
end of an identifier; and `middle` keeps the start and a suffix, for a file
|
|
681
|
+
path. `truncateKeep` sets that suffix: `segment` (default) keeps the last path
|
|
682
|
+
segment with its `/` or `\` separator (the last 10 characters when there is
|
|
683
|
+
none), or a number keeps that many trailing characters. `middle` needs string
|
|
684
|
+
or number children so it can split them. Both positions are for left-to-right
|
|
685
|
+
identifiers and paths, keep the whole value in the DOM in order for assistive
|
|
686
|
+
technology, and show it as the element's `title` unless you pass your own.
|
|
687
|
+
Never hand-roll these with `direction: rtl` or split spans in app CSS.
|
|
688
|
+
|
|
689
|
+
```tsx
|
|
690
|
+
import { Text } from "@kerfjs/ui/text";
|
|
691
|
+
|
|
692
|
+
<Text variant="h2" id="details-title">Details</Text>;
|
|
693
|
+
<Text variant="h3">Notifications</Text>; // normal-color subsection title
|
|
694
|
+
<Text aria-describedby="details-title">Supporting copy</Text>;
|
|
695
|
+
<Text tone="quiet" size="compact">Updated yesterday</Text>;
|
|
696
|
+
<Text size="large">A prominent summary</Text>;
|
|
697
|
+
<Text variant="h2" size="xlarge">A display-sized section title</Text>;
|
|
698
|
+
<strong>Inbox<Text variant="span" tone="quiet" size="compact"> · 3 msg</Text></strong>;
|
|
699
|
+
<Text tone="danger" font="monospace">ERR_INVALID_ID</Text>;
|
|
700
|
+
<Text wrap="anywhere">A-very-long-unbroken-identifier</Text>;
|
|
701
|
+
<Text wrap="truncate" variant="span">Long vendor name</Text>;
|
|
702
|
+
<Text wrap="truncate" truncate="middle" font="monospace">{path}</Text>;
|
|
703
|
+
<Text wrap="truncate" truncate="start" variant="span">{branchName}</Text>;
|
|
704
|
+
<Text wrap="normal" maxLines={2}>A long summary capped at two lines.</Text>;
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
## Spacer
|
|
708
|
+
|
|
709
|
+
Use `Spacer` from `@kerfjs/ui/spacer` for one intentional empty dimension that
|
|
710
|
+
is not the repeated relationship owned by a parent's `gap`. Its `width` and
|
|
711
|
+
`height` accept the same finite `UiSpaceName` vocabulary or a complete typed
|
|
712
|
+
`CssLength`. Fixed spacers use `flex: 0 0 auto`, so flex layouts do not compress
|
|
713
|
+
the requested dimension. Pass `flex` to use `1 1 auto` and consume the remaining
|
|
714
|
+
space along a `Row`, `List`, or other flex parent's main axis.
|
|
715
|
+
|
|
716
|
+
```tsx
|
|
717
|
+
import { Row } from "@kerfjs/ui/row";
|
|
718
|
+
import { Spacer } from "@kerfjs/ui/spacer";
|
|
719
|
+
|
|
720
|
+
<Row gap="none">
|
|
721
|
+
<button>Back</button>
|
|
722
|
+
<Spacer flex />
|
|
723
|
+
<button>Save</button>
|
|
724
|
+
</Row>;
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
Spacer is always decorative (`aria-hidden="true"`), accepts no children, and
|
|
728
|
+
uses physical width and height. Prefer `Row.gap` or `List.gap` for uniform
|
|
729
|
+
sibling rhythm, and never use Spacer to cancel or duplicate component-owned
|
|
730
|
+
insets.
|
|
731
|
+
|
|
732
|
+
## Grid
|
|
733
|
+
|
|
734
|
+
Use `Grid` from `@kerfjs/ui/grid` when equal-width columns must share the
|
|
735
|
+
available width. Set a fixed positive `columns` count or a typed
|
|
736
|
+
`minColumnWidth` for automatic container-width collapse. Fixed tracks use
|
|
737
|
+
`minmax(0, 1fr)`; responsive tracks use `auto-fit` and cap their minimum at
|
|
738
|
+
100% so a narrow container keeps one column without overflow. Grid defaults
|
|
739
|
+
to the `xs` gap and accepts the same finite spacing names, complete typed
|
|
740
|
+
`CssLength` values, and typed flex-participation contract as Row.
|
|
741
|
+
|
|
742
|
+
```tsx
|
|
743
|
+
import { Grid } from "@kerfjs/ui/grid";
|
|
744
|
+
import { px } from "@kerfjs/ui/css-values";
|
|
745
|
+
|
|
746
|
+
<Grid columns={2} gap="m">
|
|
747
|
+
<label>Quantity <input /></label>
|
|
748
|
+
<label>Unit <input /></label>
|
|
749
|
+
</Grid>;
|
|
750
|
+
|
|
751
|
+
<Grid columns={2} gap={{ column: 'none', row: 'm' }}>
|
|
752
|
+
<DocumentTile />
|
|
753
|
+
<DocumentTile />
|
|
754
|
+
<DocumentTile />
|
|
755
|
+
<DocumentTile />
|
|
756
|
+
</Grid>;
|
|
757
|
+
|
|
758
|
+
<Grid minColumnWidth={px(376)} gap="m">
|
|
759
|
+
<label>Provider <input /></label>
|
|
760
|
+
<label>Endpoint <input /></label>
|
|
761
|
+
</Grid>;
|
|
762
|
+
|
|
763
|
+
<Grid minColumnWidth={px(160)} autoFill gap="m">
|
|
764
|
+
<DocumentTile />
|
|
765
|
+
</Grid>;
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
`columns` must be a positive safe integer; invalid counts throw instead of
|
|
769
|
+
silently producing invalid CSS. Import `px` from `@kerfjs/ui/css-values` for a
|
|
770
|
+
pixel minimum. `columns` and `minColumnWidth` are mutually exclusive. In the
|
|
771
|
+
responsive mode, the container width decides how many equal tracks fit; constrain
|
|
772
|
+
the Grid's outer width when the form should have a maximum count.
|
|
773
|
+
`autoFill` keeps the unoccupied responsive tracks so one or two tiles retain
|
|
774
|
+
their shared track width rather than expanding across an otherwise empty row.
|
|
775
|
+
It requires `minColumnWidth`; the default `auto-fit` keeps the existing form
|
|
776
|
+
behavior. When Grid is a direct child of a flex-owned `ListInsetControl`, pass
|
|
777
|
+
`flex` so the Grid takes the available row width instead of shrink-wrapping.
|
|
778
|
+
`textInsets` adds the standard 17px physical-side inset and `controlInsets`
|
|
779
|
+
adds 8px on selected sides; text insets take precedence where they overlap.
|
|
780
|
+
Grid is layout-only by default and adds no ARIA grid role. With
|
|
781
|
+
`selectionMode="multiple"` and a required `ariaLabel`, it supplies a labeled
|
|
782
|
+
multi-select grid for `ContentItem selectionMode="multiple"` tiles. Their
|
|
783
|
+
row/gridcell structure can contain independent controls, while
|
|
784
|
+
`wireContentItems` follows the rendered tile positions with arrow keys.
|
|
785
|
+
The application owns child
|
|
786
|
+
semantics.
|
|
787
|
+
Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
|
|
788
|
+
tracks, and use `ResizableRegion` when people must adjust a boundary.
|
|
789
|
+
|
|
790
|
+
## Column tracks
|
|
791
|
+
|
|
792
|
+
A board of parallel columns (kanban lanes) is a `ColumnTrack`: one horizontal
|
|
793
|
+
scroll owner that fills its parent's height, with columns that sit flush and
|
|
794
|
+
own their insets and vertical scrolling. By default columns share the width
|
|
795
|
+
equally but never narrow below `minColumnWidth` (250px), so a narrow board
|
|
796
|
+
scrolls sideways instead of crushing them. `layout="paged"` gives each column
|
|
797
|
+
nearly the visible width, lets the next one `peek` in (24px), snaps to column
|
|
798
|
+
starts, hides the scrollbar, and scrolls smoothly unless reduced motion is
|
|
799
|
+
preferred. Choose the layout per device class in the app.
|
|
800
|
+
|
|
801
|
+
## Row and List alignment
|
|
802
|
+
|
|
803
|
+
Use `Row` for a horizontal flex layout and `List` for a vertical one. `Row`
|
|
804
|
+
defaults to `hAlign="left"`, `vAlign="full"`, `gap="xs"`, and no wrapping;
|
|
805
|
+
`List` retains its existing full-width, top-aligned defaults and zero gap.
|
|
806
|
+
Both components accept the same physical-axis vocabulary, with baseline
|
|
807
|
+
alignment additionally available on the horizontal `Row` cross axis:
|
|
808
|
+
|
|
809
|
+
| Axis | Values and aliases | Flex behavior |
|
|
810
|
+
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
811
|
+
| 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. |
|
|
812
|
+
| 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. |
|
|
813
|
+
|
|
814
|
+
`center` and `middle` gather the children in the middle and keep their `gap`;
|
|
815
|
+
`space-around` spreads equal space around each child instead.
|
|
816
|
+
|
|
817
|
+
Cross-axis `space-around` and `space-between` are not valid `align-items`
|
|
818
|
+
values. Kerf therefore maps `middle` to centered items and `full` to stretched
|
|
819
|
+
items, while applying the requested distribution to `align-content` when a
|
|
820
|
+
Row wraps. Prefer the descriptive values in application code; the short and
|
|
821
|
+
CSS-shaped aliases are provided for compact or migrated call sites.
|
|
822
|
+
`baseline` is Row-only because CSS baseline alignment applies to a flex
|
|
823
|
+
container's cross axis; a vertical List's `vAlign` controls main-axis
|
|
824
|
+
distribution through `justify-content`, which has no baseline value.
|
|
825
|
+
|
|
826
|
+
`Row.flex` and `List.flex` share one typed participation contract. Omit the prop
|
|
827
|
+
for the CSS initial value, pass `true` for `1 1 auto`, select the finite
|
|
828
|
+
`"none"`, `"auto"`, or `"initial"` keyword, or use
|
|
829
|
+
`flex(grow, shrink, basis)` from `@kerfjs/ui/css-values` for a complete branded
|
|
830
|
+
shorthand. A `CssLength` is not a flex shorthand, and arbitrary strings are
|
|
831
|
+
rejected by the type contract.
|
|
832
|
+
|
|
833
|
+
### Filling a fixed-height parent
|
|
834
|
+
|
|
835
|
+
`flex` sizes a Row, List, or Grid inside a flex layout. When one of them is the
|
|
836
|
+
layout **root** of a parent with a definite height (an app mount container
|
|
837
|
+
with the `.kui-app-root` height chain, a dialog body, or a fixed-height catalog
|
|
838
|
+
frame), pass `fill` instead: the root takes the parent's full height
|
|
839
|
+
(`height: 100%`), so its `flex` children can grow into it. Use `fill` only on
|
|
840
|
+
that sole layout root; a sibling inside a flex layout keeps using `flex`.
|
|
841
|
+
|
|
842
|
+
A `scrollable` List owns its overflow: its rows keep their natural height and
|
|
843
|
+
scroll rather than shrink. To bound one by an ancestor's `max-height` instead
|
|
844
|
+
of a definite height, make that ancestor a flex column and pass `flex` (not
|
|
845
|
+
`fill`): `<List flex scrollable>` takes at most the remaining height and
|
|
846
|
+
scrolls the rest, with no app-owned scrolling wrapper.
|
|
847
|
+
|
|
848
|
+
A scrollable List is also a keyboard-focusable scroller: Chromium gives it a
|
|
849
|
+
Tab stop when it holds no focusable rows, and a dialog may focus it first.
|
|
850
|
+
When it has focus it draws the theme focus ring inset by the ring width and
|
|
851
|
+
rounded with `--kui-radius-m`, so a rounded or `overflow: hidden` parent
|
|
852
|
+
never clips it. Do not style `.kui-list` focus yourself.
|
|
853
|
+
|
|
854
|
+
### Scroll clearance
|
|
855
|
+
|
|
856
|
+
Chrome that lies over a scroll owner's block edge (a `DialogSurface` floating
|
|
857
|
+
footer over a transcript, or translucent chrome over a scrolling region)
|
|
858
|
+
publishes how far it covers that edge through an inherited context:
|
|
859
|
+
`--kui-scroll-clearance-block-start` and `--kui-scroll-clearance-block-end`.
|
|
860
|
+
A scroll owner opts in per edge with `scrollClearance` (`"block-start"`,
|
|
861
|
+
`"block-end"`, or `"both"`) on a `scrollable` `List` or a `Pane`. It adds the
|
|
862
|
+
published clearance to its own block padding and `scroll-padding`, so content
|
|
863
|
+
scrolls visibly beneath the chrome while the first and last items (and any
|
|
864
|
+
item focused or scrolled into view) still come to rest clear of it. Without
|
|
865
|
+
the prop the context is ignored. `PaneConfig` carries `scrollClearance` too,
|
|
866
|
+
so a composed Pane opts in the same way: a Workbench `mainPane` or panel
|
|
867
|
+
`pane`, a `CollapsiblePanel` `pane`, or a `NavStack` view's `pane` (for
|
|
868
|
+
example a NavStack view inside a dialog with a floating composer).
|
|
869
|
+
|
|
870
|
+
Opt in only the one scroller that reaches the covered edge; a nested scroller
|
|
871
|
+
must not opt in again. `DialogSurface` publishes block-end for its floating
|
|
872
|
+
footer and block-start for its floating header (see
|
|
873
|
+
`docs/surface-scaffold.md`), and clears the context in every dialog body. A `Pane` with `headerPresentation="overlay"` publishes block-start for
|
|
874
|
+
its own header, once `wireScrollDividers` has measured it, and its content
|
|
875
|
+
clears it without the prop (see [Overlay header](#overlay-header)). When an application overlays its own chrome on a region (for example a
|
|
876
|
+
translucent toolbar laid over the top of a scrolling list), it publishes the
|
|
877
|
+
chrome's block size on that region's container, the one place where an app
|
|
878
|
+
sets this context:
|
|
879
|
+
|
|
880
|
+
```tsx
|
|
881
|
+
<section style="position:relative;display:grid;--kui-scroll-clearance-block-start:48px">
|
|
882
|
+
<List scrollable scrollClearance="block-start">{rows}</List>
|
|
883
|
+
{translucentToolbar}
|
|
884
|
+
</section>;
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
### Framed result pickers
|
|
888
|
+
|
|
889
|
+
For a bounded, framed list of `ListItem` rows (search results, duplicate
|
|
890
|
+
candidates, a recent-items picker), configure the List instead of wrapping it
|
|
891
|
+
in an app-owned scroller:
|
|
892
|
+
|
|
893
|
+
```tsx
|
|
894
|
+
<List scrollable frame gap="2xs" minHeight={rem(4.25)} maxHeight={rem(14)}>
|
|
895
|
+
{candidates.map((candidate) => (
|
|
896
|
+
<ListItem action="pick-duplicate" itemId={candidate.id} label={candidate.title} description={candidate.detail} multiline />
|
|
897
|
+
))}
|
|
898
|
+
</List>;
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
`frame` draws a 1px `--kui-color-neutral-border-normal` border with the
|
|
902
|
+
`--kui-radius-m` control radius and a 4px inset on every side (replacing
|
|
903
|
+
`inset`, `textInsets`, and `controlInsets`). That inset is exactly a row's
|
|
904
|
+
focus-ring reach, so the first and last rows' rings stay inside the clip at
|
|
905
|
+
the scroll extremes. Every `scrollable` List, framed or not, carries block
|
|
906
|
+
scroll padding of that reach plus 2px of slack (6px; nothing moves at rest),
|
|
907
|
+
so a middle row focused or scrolled into view also stops with its ring inside
|
|
908
|
+
the clip, even where Chromium's focus scroll stops a pixel short of the padded
|
|
909
|
+
target. An unframed scrollable List has no inset, so its first and last rows
|
|
910
|
+
still meet the clip at the scroll extremes; use `frame` when those rows must
|
|
911
|
+
show a whole ring.
|
|
912
|
+
How far `focus()` scrolls a partly visible row is up to the engine: Chromium
|
|
913
|
+
brings it to the nearest edge, Firefox leaves it until about half of it is
|
|
914
|
+
hidden and then centers it, and WebKit leaves a partly visible row where it
|
|
915
|
+
is. Call `wireListFocusScroll(root)` from `@kerfjs/ui/wire-list-focus-scroll`
|
|
916
|
+
once at the app root (keep its disposer) to make keyboard focus consistent:
|
|
917
|
+
when a `:focus-visible` element inside a `scrollable` List has a ring that
|
|
918
|
+
crosses the clip, it calls `scrollIntoView({ block: 'nearest' })`, which
|
|
919
|
+
honors the List's scroll padding in every engine. It leaves pointer focus
|
|
920
|
+
alone, so a click never scrolls its row from under the pointer, and it is a
|
|
921
|
+
no-op where Chromium has already scrolled. `maxHeight` and `minHeight` take typed
|
|
922
|
+
`CssLength`s from `@kerfjs/ui/css-values` and bound the List directly, with no
|
|
923
|
+
flex-column ancestor; pair `maxHeight` with `scrollable`. A frame of settings
|
|
924
|
+
rows with dividers between them is a `FramedList`, not a framed List.
|
|
925
|
+
|
|
926
|
+
For long reading content, such as a reader view, pass `inset="document"`: 24px
|
|
927
|
+
block and 32px inline on all four sides, narrowing to 16px inline below 576px.
|
|
928
|
+
It replaces any `textInsets`/`controlInsets` on that List.
|
|
929
|
+
|
|
930
|
+
For a page's content column (a settings page, a setup form), pass
|
|
931
|
+
`contentWidth`: `compact` (440px), `medium` (640px), or `wide` (864px) of
|
|
932
|
+
content, plus the List's own insets, so it composes with `inset="document"`.
|
|
933
|
+
The column is centered by default; `contentAlign="start"` keeps it at the
|
|
934
|
+
leading edge. Never cap and center a page column with application CSS.
|
|
935
|
+
|
|
936
|
+
A List is transparent by default. Pass `surface="base"` (the page surface) or
|
|
937
|
+
`surface="raised"` to paint a solid background behind the stack and its
|
|
938
|
+
insets — for example a banner strip above a sunken work area, which otherwise
|
|
939
|
+
shows the lowered tint around the banner. Give that strip `controlInsets="tb"`
|
|
940
|
+
so the banner's own inline margin, not a second List inset, sets its edges. A
|
|
941
|
+
lowered region is a `SunkenPanel`, not a List surface.
|
|
942
|
+
|
|
943
|
+
Put route, test, or recipe metadata on the same root with `rootAttributes`,
|
|
944
|
+
which accepts safe `data-*` pairs and keeps each component's structural
|
|
945
|
+
attributes (`data-component`, `data-flex`, `data-fill`, alignment, inset, and
|
|
946
|
+
column markers) protected. A `List` or `Row` root also takes `aria-*`
|
|
947
|
+
attributes and a structural `role` (`region`, `group`, `list`, `status`, a
|
|
948
|
+
landmark, …), so a labeled drop-target region or an `aria-busy` stack needs no
|
|
949
|
+
wrapper; widget roles are dropped, and a multi-select `List` keeps its own
|
|
950
|
+
grid role and name:
|
|
951
|
+
|
|
952
|
+
```tsx
|
|
953
|
+
<Row gap="none" fill rootAttributes={{ "data-recipe": "sidebar" }}>
|
|
954
|
+
<CollapsiblePanel id="rail" side="left" collapsed={railCollapsed.value}>
|
|
955
|
+
…
|
|
956
|
+
</CollapsiblePanel>
|
|
957
|
+
<List flex>…</List>
|
|
958
|
+
</Row>
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
Do not wrap a layout in a frame `Pane` just to get a definite height or a root
|
|
962
|
+
attribute: the pane's content slot becomes a scroll owner that never scrolls,
|
|
963
|
+
and its safe-area padding keeps an edge-docked rail or drawer from painting
|
|
964
|
+
through the unsafe area. A `Pane` is for a real column with a header, one
|
|
965
|
+
scrolling content region, or a footer.
|
|
966
|
+
|
|
967
|
+
`Row`, `Grid`, and `List` also accept `textInsets` and `controlInsets` using the shared
|
|
968
|
+
physical `Sides` union. Values follow canonical top/right/bottom/left order
|
|
969
|
+
(`t`, `rb`, `tbl`, `trbl`, and so on). A selected control side adds 8px of
|
|
970
|
+
padding. A selected text side adds the complete content-item alignment inset —
|
|
971
|
+
8px outer margin + 1px border + 8px inner padding, represented as 17px of
|
|
972
|
+
container padding. When both props select the same side, the text inset wins.
|
|
973
|
+
Each nested `Row`, `Grid`, or `List` resolves its own four inset sides;
|
|
974
|
+
unselected sides reset to zero instead of inheriting a same-type parent's inset selection.
|
|
975
|
+
The same holds for `gap` and `flex` on a nested `List`, `Row`, or `Grid`: an
|
|
976
|
+
omitted prop falls back to that component's own default (no gap for `List`,
|
|
977
|
+
`xs` for `Row` and `Grid`; the CSS initial `flex`) rather than the enclosing
|
|
978
|
+
instance's value.
|
|
979
|
+
|
|
980
|
+
`ListInsetText` and `ListInsetControl` use the same `sides` vocabulary and
|
|
981
|
+
default to `trbl`. The text wrapper applies its complete 8/1/8 geometry only on
|
|
982
|
+
selected sides; the control wrapper applies its 8px outer margin only on
|
|
983
|
+
selected sides. Every direct child of `ListInsetControl` grows to fill the row
|
|
984
|
+
(a `Select`, a `TextField`, or a `Button` spans the full inset width), and
|
|
985
|
+
several children share the row with an 8px gap; stack controls vertically with
|
|
986
|
+
a `List` using `controlInsets` instead. Pass `sides="rl"` for tight text that
|
|
987
|
+
keeps the horizontal inset without adding vertical box space.
|
|
988
|
+
|
|
96
989
|
`--kui-space-s` (12px) and `--kui-space-xl` (32px) exist but are **off the
|
|
97
990
|
canonical rhythm** — reach for them only as a deliberate exception, never as a
|
|
98
991
|
default step. Prefer the five canonical tokens so spacing stays legible and
|
|
@@ -109,7 +1002,7 @@ consistent across every surface.
|
|
|
109
1002
|
4. Keep one scrolling content owner per pane. Toolbar and footer siblings stay
|
|
110
1003
|
fixed while the content scrolls.
|
|
111
1004
|
5. A split item keeps dormant and interactive regions separate. For example,
|
|
112
|
-
`ListHeader` renders its title/
|
|
1005
|
+
`ListHeader` renders its title/indicator cluster separately from its optional
|
|
113
1006
|
logical-end 44px action. The header fills the available inline width and its
|
|
114
1007
|
action glyph defaults to 18px; disclosure mode makes the title cluster itself
|
|
115
1008
|
the button and supplies the production `DisclosureArrow` unless `actionIcon`
|