@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# List-detail dialog
|
|
2
|
+
|
|
3
|
+
`@kerfjs/ui/list-detail-dialog` is the modal form of a list-detail layout: a
|
|
4
|
+
list column beside the selected item's detail, each running the dialog's full
|
|
5
|
+
height. It is one of three dialog types:
|
|
6
|
+
|
|
7
|
+
| Type | Use it for |
|
|
8
|
+
| -------------------------------------------------------------- | -------------------------------------------------------- |
|
|
9
|
+
| `DialogSurface` ([surface-scaffold.md](surface-scaffold.md)) | One pane: a title, a body, and footer buttons. |
|
|
10
|
+
| `ListDetailDialog` (this page) | Pick a record from a list and show its detail beside it. |
|
|
11
|
+
| `WorkbenchDialog` ([workbench-dialog.md](workbench-dialog.md)) | An editing task with side panels. |
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import {
|
|
15
|
+
ListDetailDialog,
|
|
16
|
+
openDialog,
|
|
17
|
+
} from "@kerfjs/ui/list-detail-dialog";
|
|
18
|
+
import { deviceClass } from "@kerfjs/ui/device-class";
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
In a browser bundler that honors the `browser` export condition, the import
|
|
22
|
+
also loads the stylesheets of every component it renders (DialogSurface,
|
|
23
|
+
SplitView, NavStack, Pane, and the toolbar components). Without that
|
|
24
|
+
condition, import `@kerfjs/ui/list-detail-dialog.css`, which pulls in the same
|
|
25
|
+
stylesheets, or `@kerfjs/ui/styles.css`.
|
|
26
|
+
|
|
27
|
+
## Where things go
|
|
28
|
+
|
|
29
|
+
- **The detail column owns the dialog's identity.** Its header toolbar carries
|
|
30
|
+
the primary title (an xl level-2 heading, with an optional `description`
|
|
31
|
+
line), the `actions` you pass, and the close control, last. Record actions go
|
|
32
|
+
in the detail `footer`, pinned below the scrolling detail.
|
|
33
|
+
- **The list column is secondary.** Its header carries `list.title` at the
|
|
34
|
+
default toolbar size, so it reads as pane identity beside the primary title,
|
|
35
|
+
followed by your `list.toolbar` controls. An add control or count can go in
|
|
36
|
+
`list.footer`.
|
|
37
|
+
- **The surface draws no header.** Both columns start at the dialog's top
|
|
38
|
+
edge, so the divider between them runs the dialog's full height.
|
|
39
|
+
- **The description is yours to name.** The detail `description` describes the
|
|
40
|
+
selected record, not the dialog, so it is not the dialog's accessible
|
|
41
|
+
description. Pass `describedBy`, the id of app-owned summary copy, to render
|
|
42
|
+
`aria-describedby` on the dialog.
|
|
43
|
+
|
|
44
|
+
Each column is a `Pane`: its header and footer stay pinned and its content
|
|
45
|
+
scrolls on its own. Pass content that owns its geometry, usually a `List`.
|
|
46
|
+
|
|
47
|
+
## Responsive by device class
|
|
48
|
+
|
|
49
|
+
The component is declarative. The app derives `compact` from the device class
|
|
50
|
+
and tracks its own selection and, on compact devices, whether the detail is
|
|
51
|
+
pushed:
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
const device = deviceClass();
|
|
55
|
+
const selected = signal("atlas");
|
|
56
|
+
const detailOpen = signal(false);
|
|
57
|
+
|
|
58
|
+
<ListDetailDialog
|
|
59
|
+
id="projects"
|
|
60
|
+
label="Project Details"
|
|
61
|
+
compact={device.value.compact}
|
|
62
|
+
detailActive={detailOpen.value}
|
|
63
|
+
backLabel="Back to Projects"
|
|
64
|
+
list={{
|
|
65
|
+
title: "Recent Projects",
|
|
66
|
+
content: <List>{rows}</List>,
|
|
67
|
+
}}
|
|
68
|
+
detail={{
|
|
69
|
+
title: project.name,
|
|
70
|
+
content: <List>{details}</List>,
|
|
71
|
+
footer: actions,
|
|
72
|
+
}}
|
|
73
|
+
/>;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **Roomy** (`compact: false`): a modal of `size` `large` with a definite
|
|
77
|
+
height (default 560px, bounded by the viewport; pass `maxHeight` instead to
|
|
78
|
+
size it to its content). The list column is 280px, at most 40% of the
|
|
79
|
+
dialog, by default; set `list.width` like SplitView's `listWidth`.
|
|
80
|
+
- **Compact** (`compact: true`): the dialog fills the screen and becomes a
|
|
81
|
+
`NavStack`. The list is the root view (titled `list.title`, with its toolbar
|
|
82
|
+
controls); `detailActive` pushes the detail (titled `detail.title`, with its
|
|
83
|
+
`actions`). Every view keeps the close control, and each view's `footer` is
|
|
84
|
+
pinned below it. The stack's back control dispatches `nav-back`; set
|
|
85
|
+
`detailActive` back to `false` in response. Wire `wireNavStack` above it for
|
|
86
|
+
the push and pop motion.
|
|
87
|
+
|
|
88
|
+
Render one `ListDetailDialog` for both presentations, so crossing the compact
|
|
89
|
+
breakpoint while it is open morphs it in place and it stays open.
|
|
90
|
+
|
|
91
|
+
## Opening and closing
|
|
92
|
+
|
|
93
|
+
It is a `DialogSurface` underneath: open it with `openDialog(element)` and close
|
|
94
|
+
it with `closeDialog(element)`, the close control, Escape, an element with
|
|
95
|
+
`data-dialog-close`, or (with `lightDismiss`) a press on the backdrop. Both
|
|
96
|
+
functions are re-exported from this subpath. Give sibling dialogs distinct
|
|
97
|
+
`rootAttributes['data-key']` values so a re-render morphs each into itself.
|
|
98
|
+
|
|
99
|
+
See the [list-detail dialog recipe](recipes.md#list-detail-dialog) for a
|
|
100
|
+
complete, production-backed example.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Manual test plan
|
|
2
|
+
|
|
3
|
+
Checks that automation cannot make truthfully. Run the catalog with
|
|
4
|
+
`npm run dev:lan` and open the printed URL on the device (see
|
|
5
|
+
[`ux-demo.md`](ux-demo.md)). Record the device, OS, and browser versions and the
|
|
6
|
+
result on the tracking ticket.
|
|
7
|
+
|
|
8
|
+
## DialogSurface bottom sheet: virtual keyboard and safe areas
|
|
9
|
+
|
|
10
|
+
Route: `?component=surface-scaffold`, example "Resizable Bottom Sheet". Run on
|
|
11
|
+
an iPhone (Safari) and an Android phone (Chrome).
|
|
12
|
+
|
|
13
|
+
1. Open the sheet and focus the Message field. The keyboard pushes the sheet's
|
|
14
|
+
content above it, and the panel runs behind the keyboard with no gap.
|
|
15
|
+
2. Rotate the phone, and pinch-zoom while the keyboard is open. The content
|
|
16
|
+
stays clear of the keyboard; while zoomed, the measured overlap is 0 and the
|
|
17
|
+
page relies on `dvh`.
|
|
18
|
+
3. Dismiss the keyboard. The bottom padding returns to the home-indicator safe
|
|
19
|
+
area, and the sheet's square bottom edge meets the screen edge.
|
|
20
|
+
4. Drag the grabber, with and without the keyboard open. The sheet resizes
|
|
21
|
+
between its minimum height and the screen less the top safe area.
|
|
22
|
+
|
|
23
|
+
Playwright cannot raise a virtual keyboard; the overlap formula is unit-tested
|
|
24
|
+
(`tests/unit/dialog-surface-controller.test.tsx`) and a simulated keyboard is covered
|
|
25
|
+
in `tests/browser/dialog-bottom-sheet.spec.ts`.
|
|
26
|
+
|
|
27
|
+
## Automated coverage summary
|
|
28
|
+
|
|
29
|
+
Nothing has moved from this plan into automation yet.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# MessageComposer
|
|
2
|
+
|
|
3
|
+
`MessageComposer` (`@kerfjs/ui/message-composer`, CSS `@kerfjs/ui/message-composer.css`) is the chat
|
|
4
|
+
or prompt composer: the place a person writes a message, assistant prompt, or
|
|
5
|
+
reply and sends it with a trailing action. It replaces app-owned composer
|
|
6
|
+
chrome, such as a `wa-textarea` and a button wrapped in application CSS that
|
|
7
|
+
draws a frame, a focus border, and a shadow.
|
|
8
|
+
|
|
9
|
+
## Contract
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
<MessageComposer
|
|
13
|
+
id="assistant-message"
|
|
14
|
+
name="message"
|
|
15
|
+
label="Message"
|
|
16
|
+
placeholder="Ask about this build"
|
|
17
|
+
hint="Answers use the latest nightly build."
|
|
18
|
+
minRows={1}
|
|
19
|
+
maxRows={8}
|
|
20
|
+
trailing={
|
|
21
|
+
<Button tone="brand" action="send-message">
|
|
22
|
+
Send
|
|
23
|
+
</Button>
|
|
24
|
+
}
|
|
25
|
+
/>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- **Frame.** The root is a raised surface (`--kui-color-surface-raised`) with
|
|
29
|
+
the standard 1px neutral border, the large radius (`--kui-radius-l`), and
|
|
30
|
+
`--kui-shadow-l`. While focus is anywhere within it, including on a trailing
|
|
31
|
+
action, the border turns `--kui-color-brand-border-loud`. The frame owns
|
|
32
|
+
8px padding, so a composer placed 8px from a container edge puts its text on
|
|
33
|
+
the same 17px column as a `List` of content items beside it.
|
|
34
|
+
- **Field.** A native, borderless `<textarea>` named by `label`. It sizes to
|
|
35
|
+
its content with `field-sizing: content`, between `minRows` (default 1) and
|
|
36
|
+
`maxRows` (default 8) lines, and scrolls past the maximum. Both bounds are
|
|
37
|
+
positive integers, and `maxRows` is at least `minRows`; otherwise `MessageComposer`
|
|
38
|
+
throws a `RangeError`. In an engine without `field-sizing`, the field keeps
|
|
39
|
+
a fixed height of three lines, clamped to the bounds, and scrolls.
|
|
40
|
+
- **Action row.** Below the field, a compact `Toolbar` (footer semantics,
|
|
41
|
+
named "<label> Actions") that the composer insets for you. Its leading zone
|
|
42
|
+
holds optional `leading` controls, such as an attach button or a model
|
|
43
|
+
`Select` in a `ToolbarControlGroup`, then the optional quiet `hint`; its
|
|
44
|
+
trailing zone holds `trailing`, normally one brand Send `Button`. Every
|
|
45
|
+
toolbar convention applies, from control groups to responsive relocation.
|
|
46
|
+
With an `id`, the hint is the field's accessible description
|
|
47
|
+
(`<id>-hint`).
|
|
48
|
+
- **Value.** `value` seeds the field (a restored draft, or `''`). The app
|
|
49
|
+
reads the textarea in its send action, clears it, and re-renders.
|
|
50
|
+
- **Disabled.** `disabled` disables the field; the app disables or marks busy
|
|
51
|
+
its own actions.
|
|
52
|
+
- **Placement.** Pass it as a `DialogSurface`'s `footer`, or use `slot` to
|
|
53
|
+
assign it to a web component slot. `rootAttributes` takes safe `data-*`
|
|
54
|
+
identity.
|
|
55
|
+
- **Enter to send.** `submitOnEnter` opts in to the keyboard contract below;
|
|
56
|
+
it marks the root `data-submit-on-enter="true"` (protected from
|
|
57
|
+
`rootAttributes`) and gives the field `aria-keyshortcuts="Enter"`.
|
|
58
|
+
|
|
59
|
+
The app owns sending, any other keyboard shortcut, what a sent message looks
|
|
60
|
+
like, and where the composer sits.
|
|
61
|
+
|
|
62
|
+
## Enter to send
|
|
63
|
+
|
|
64
|
+
Set `submitOnEnter` and call `wireMessageComposers` once over an ancestor of every
|
|
65
|
+
such composer; it returns a disposer:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { wireMessageComposers } from '@kerfjs/ui/wire-message-composers';
|
|
69
|
+
|
|
70
|
+
const stopMessageComposers = wireMessageComposers(app);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
In an opted-in composer's field:
|
|
74
|
+
|
|
75
|
+
| Key | Result |
|
|
76
|
+
| -------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
77
|
+
| Enter, Cmd+Enter, Ctrl+Enter | Clicks the composer's **first trailing action**; the newline is suppressed. |
|
|
78
|
+
| Shift+Enter, Alt+Enter | Inserts a newline, as in any textarea. |
|
|
79
|
+
| Enter committing an IME composition | Left to the input method: `isComposing`, keyCode 229, or between `compositionstart` and `compositionend`. |
|
|
80
|
+
| Enter on an empty or whitespace-only message | Nothing: no send and no newline. |
|
|
81
|
+
| Auto-repeating Enter (key held down) | Nothing. |
|
|
82
|
+
|
|
83
|
+
The first trailing action is the first `button` (a `Button`), `wa-button`, or
|
|
84
|
+
`[data-action]` element inside `actions`. Clicking it means the keyboard send
|
|
85
|
+
runs the same delegated `data-action` handler as a pointer send, so the app
|
|
86
|
+
writes one send handler that reads the field, clears it, and re-renders. The
|
|
87
|
+
click does not move focus, so the person keeps typing. Nothing is sent while
|
|
88
|
+
the field is `disabled`, or while that action has a `disabled` attribute or
|
|
89
|
+
property, `aria-busy="true"` (a busy `Button`), a `loading` attribute (a busy
|
|
90
|
+
`wa-button`), or `aria-disabled="true"`; the Enter is still suppressed, so a message waiting on
|
|
91
|
+
a busy Send does not gain a newline.
|
|
92
|
+
|
|
93
|
+
Leave `submitOnEnter` off for a long-form prompt where Enter should be a
|
|
94
|
+
newline, and send with the action alone. A visible `hint` may also state the
|
|
95
|
+
shortcut ("Enter to send, Shift+Enter for a new line") when the audience may
|
|
96
|
+
not expect it; `aria-keyshortcuts` already announces it to assistive
|
|
97
|
+
technology.
|
|
98
|
+
|
|
99
|
+
## In a chat dialog
|
|
100
|
+
|
|
101
|
+
A chat dialog floats the composer over its transcript. Use a `DialogSurface`
|
|
102
|
+
with `bodyLayout="fill-last"` and `footerPresentation="floating"` (and
|
|
103
|
+
`footerInset="none"`, since the composer draws its own frame), and slot the
|
|
104
|
+
composer into the footer:
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
<DialogSurface
|
|
108
|
+
id="assistant"
|
|
109
|
+
label="Assistant"
|
|
110
|
+
height={remify(560)}
|
|
111
|
+
bodyInset="none"
|
|
112
|
+
bodyLayout="fill-last"
|
|
113
|
+
footerPresentation="floating"
|
|
114
|
+
footerOffset={remify(8)}
|
|
115
|
+
footerInset="none"
|
|
116
|
+
footer={<MessageComposer submitOnEnter id="assistant-message" name="message" label="Message" placeholder="Ask about this build" trailing={send} />}
|
|
117
|
+
>
|
|
118
|
+
<StateBanner title="Answers use the latest nightly build." tone="neutral" />
|
|
119
|
+
<List gap="xs" controlInsets="tb" scrollable scrollClearance="block-end">{messages}</List>
|
|
120
|
+
</DialogSurface>;
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The floating footer is transparent, so the composer's own frame and shadow
|
|
124
|
+
lift it over the transcript. The transcript's `scrollClearance="block-end"`
|
|
125
|
+
lets messages scroll visibly beneath the composer while the last one still
|
|
126
|
+
comes to rest above it, following the composer's measured height as it grows.
|
|
127
|
+
Without the opt-in, the dialog body reserves that height below the transcript
|
|
128
|
+
instead.
|
|
129
|
+
|
|
130
|
+
## Do not
|
|
131
|
+
|
|
132
|
+
- Wrap it in a framed `ContentItem`, card, or bordered container; it owns its
|
|
133
|
+
frame, padding, and shadow.
|
|
134
|
+
- Style its field, frame, or action row from application CSS. A variation it
|
|
135
|
+
does not offer is a component gap.
|
|
136
|
+
- Use it for an ordinary form field submitted with the rest of a form; use
|
|
137
|
+
a `multiline` `TextField`.
|
|
138
|
+
|
|
139
|
+
## Verification
|
|
140
|
+
|
|
141
|
+
`tests/unit/message-composer.test.tsx` covers serialization, the hint description,
|
|
142
|
+
row bounds, and protected attributes; `tests/unit/wire-message-composers.test.tsx`
|
|
143
|
+
covers the Enter-to-send matrix (modifiers, IME, empty, repeat, disabled
|
|
144
|
+
field and actions, first action only, disposal). `tests/browser/message-composer.spec.ts` covers
|
|
145
|
+
the focus-within border, growth up to `maxRows` and then scrolling, the action
|
|
146
|
+
row geometry, and the send flow at wide and phone widths, and, in Chromium,
|
|
147
|
+
Firefox, and WebKit, Enter, Shift+Enter, Cmd/Ctrl+Enter, empty messages, and
|
|
148
|
+
IME composition (dispatched composition events and keyCode 229). In
|
|
149
|
+
Chromium it also drives a real IME composition through the DevTools protocol
|
|
150
|
+
(`Input.imeSetComposition`, then `Input.insertText` to commit). That test
|
|
151
|
+
asserts the engine's own event order: an Enter keydown flagged `isComposing`
|
|
152
|
+
while composing, the committing `Process` keydown with keyCode 229, then
|
|
153
|
+
`compositionend`. None of those sends, the committed text lands in the field,
|
|
154
|
+
and the next Enter sends it;
|
|
155
|
+
`tests/browser/surface-scaffold.spec.ts` covers the composer in the floating
|
|
156
|
+
footer of the chat dialog, including Enter to send.
|
package/docs/nav-stack.md
CHANGED
|
@@ -5,14 +5,19 @@ and out over one another while the top chrome settles. A **single-pane layout is
|
|
|
5
5
|
a `NavStack` with one entry**. It is one of the opt-in app layouts (see
|
|
6
6
|
[`../../docs/23-app-layouts.md`](../../docs/23-app-layouts.md)).
|
|
7
7
|
|
|
8
|
-
Import the component and its
|
|
8
|
+
Import the component and its wiring helper:
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
|
-
import { NavStack, type NavStackView } from
|
|
12
|
-
import { wireNavStack } from
|
|
13
|
-
import '@kerfjs/ui/nav-stack.css';
|
|
11
|
+
import { NavStack, type NavStackView } from "@kerfjs/ui/nav-stack";
|
|
12
|
+
import { wireNavStack } from "@kerfjs/ui/wire-nav-stack";
|
|
14
13
|
```
|
|
15
14
|
|
|
15
|
+
In a browser bundler that honors the `browser` export condition (Vite, esbuild, and
|
|
16
|
+
webpack do by default), the import above also
|
|
17
|
+
loads NavStack's stylesheet and those of the components it renders internally
|
|
18
|
+
(`Toolbar`, `ToolbarControlGroup`, `ToolbarText`, `Pane`, `List`, `LucideIcon`). Without that condition, import the manual stylesheets instead:
|
|
19
|
+
`@kerfjs/ui/nav-stack.css` plus those components' CSS, or `@kerfjs/ui/styles.css`.
|
|
20
|
+
|
|
16
21
|
## State lives in the app
|
|
17
22
|
|
|
18
23
|
Like every `@kerfjs/ui` component, `NavStack` is declarative: the app owns the
|
|
@@ -20,28 +25,336 @@ stack as a `signal<NavStackView[]>`, `NavStack({ views })` renders it, and
|
|
|
20
25
|
`wireNavStack` animates the transitions.
|
|
21
26
|
|
|
22
27
|
```tsx
|
|
23
|
-
const views = signal<NavStackView[]>([
|
|
28
|
+
const views = signal<NavStackView[]>([
|
|
29
|
+
{
|
|
30
|
+
key: "inbox",
|
|
31
|
+
toolbar: { title: "Inbox" },
|
|
32
|
+
content: <InboxView />,
|
|
33
|
+
bottomToolbar: {
|
|
34
|
+
label: "Inbox status",
|
|
35
|
+
leading: <InboxStatus />,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
]);
|
|
24
39
|
|
|
25
40
|
// render inside mount():
|
|
26
41
|
<NavStack id="mail" label="Mail" views={views.value} />;
|
|
27
42
|
|
|
28
43
|
// once, after first render:
|
|
29
|
-
const dispose = wireNavStack(root, {
|
|
44
|
+
const dispose = wireNavStack(root, {
|
|
45
|
+
onBack: () => {
|
|
46
|
+
views.value = views.value.slice(0, -1);
|
|
47
|
+
},
|
|
48
|
+
});
|
|
30
49
|
|
|
31
50
|
// push / pop by editing the signal:
|
|
32
|
-
views.value = [
|
|
51
|
+
views.value = [
|
|
52
|
+
...views.value,
|
|
53
|
+
{ key: id, toolbar: { title: "Message" }, content: <MessageView id={id} /> },
|
|
54
|
+
];
|
|
33
55
|
```
|
|
34
56
|
|
|
35
57
|
`NavStack` renders every entry stacked, the last one active and the rest kept
|
|
36
|
-
mounted (so their DOM state
|
|
37
|
-
`key` (stable identity), `content`, an optional `
|
|
38
|
-
`
|
|
39
|
-
|
|
58
|
+
mounted (so their DOM state survives) but hidden. Each entry carries a
|
|
59
|
+
`key` (stable identity), `content`, an optional `toolbar` object with `title`,
|
|
60
|
+
`leading`, `center`, and `trailing` groups, and an optional structured
|
|
61
|
+
`bottomToolbar`. The component-level structured
|
|
62
|
+
`bottomToolbar` remains a persistent fallback for views that do not provide one.
|
|
63
|
+
Each view can also provide `header`, `footer`, `headerList`, `footerList`, and
|
|
64
|
+
`pane` configuration, as a `WorkbenchStaticPanel` does. With any of these,
|
|
65
|
+
the view renders a `Pane`: its header and footer stay pinned around the view's
|
|
66
|
+
scrolling content, and slide with that view during navigation. The header and
|
|
67
|
+
footer list configuration forwards to their `List`s; `pane` forwards
|
|
68
|
+
`contentElement`, `contentLabel`, `separators`, `safeAreaEdges`,
|
|
69
|
+
`chromeDividers`, `appearance`, `deepInset`, `scrollClearance`, `headerPresentation`, `tabIndex`,
|
|
70
|
+
and `outlined` to the Pane. Without those fields, the view
|
|
71
|
+
keeps its simple direct scroll area. Use `pane: { appearance: "sunken" }` for a
|
|
72
|
+
lowered scrolling work surface.
|
|
73
|
+
The back control appears automatically once the stack has more than one entry;
|
|
74
|
+
`wireNavStack`'s `onBack` is where the app pops its own signal.
|
|
75
|
+
|
|
76
|
+
See [Lowered work surfaces](layout.md#lowered-work-surfaces) for nested Pane
|
|
77
|
+
and layout content.
|
|
78
|
+
|
|
79
|
+
## The top toolbar
|
|
80
|
+
|
|
81
|
+
The top chrome is a real `Toolbar`, so it follows the same zone,
|
|
82
|
+
group, and responsive rules as every other toolbar. Its leading zone holds the
|
|
83
|
+
back control (a contained, bordered `ToolbarControlGroup`, shown once the stack has
|
|
84
|
+
depth), then `toolbar.leading`. `toolbar.trailing` fills the trailing zone.
|
|
85
|
+
Give each zone `ToolbarControlGroup`s or `ToolbarText`, as in any toolbar.
|
|
86
|
+
|
|
87
|
+
Where `toolbar.title` goes depends on the back control:
|
|
88
|
+
|
|
89
|
+
- **At the root** (no back control) the title is a filling `ToolbarText` at
|
|
90
|
+
the end of the leading zone, so it reads left-aligned.
|
|
91
|
+
- **Once the stack has depth**, the title is the center zone's only child and
|
|
92
|
+
the toolbar is `centerAlign="balanced"`, like a platform navigation bar. The
|
|
93
|
+
title sits on the bar's midpoint while the sides leave room, moves away from
|
|
94
|
+
a wider side when they do not, and truncates with an ellipsis before it
|
|
95
|
+
reaches the back control or a trailing group. It keeps the root title's
|
|
96
|
+
full-strength text color at its smaller size. This overrides a configured
|
|
97
|
+
`centerAlign`, which applies to view-owned center content.
|
|
98
|
+
- **A view that sets `toolbar.center`** owns the center zone, so its title
|
|
99
|
+
stays left-aligned in the leading zone at any depth.
|
|
100
|
+
|
|
101
|
+
Configure the toolbar with `toolbarConfig` instead of styling it:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<NavStack
|
|
105
|
+
id="mail"
|
|
106
|
+
label="Mail"
|
|
107
|
+
views={views.value}
|
|
108
|
+
backText={previousTitle}
|
|
109
|
+
toolbarConfig={{
|
|
110
|
+
headingLevel: 1,
|
|
111
|
+
titleSize: "xlarge",
|
|
112
|
+
dividerSides: "b",
|
|
113
|
+
responsive: "wrap",
|
|
114
|
+
}}
|
|
115
|
+
/>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
- Each view's `toolbar` can forward the `Toolbar` configuration (`dividerSides`,
|
|
119
|
+
`centerAlign`, `responsive`, `responsiveAt`, `safeAreaEdges`) and its `label`,
|
|
120
|
+
`titleSize`, and `headingLevel`. A view value overrides the corresponding
|
|
121
|
+
`toolbarConfig` default. Its `bottomToolbar` forwards the same `Toolbar`
|
|
122
|
+
configuration and has a required accessible `label`.
|
|
123
|
+
- `toolbarConfig` supplies stack-wide defaults (`dividerSides`,
|
|
124
|
+
`centerAlign`, `responsive`, `responsiveAt`, `safeAreaEdges`) and adds
|
|
125
|
+
`label` (the toolbar's accessible name), `titleSize` (the title's
|
|
126
|
+
`ToolbarText` size; default `xlarge` at the root, where the title is the page
|
|
127
|
+
heading, and `large` once a back control shares the bar; a Workbench panel's
|
|
128
|
+
stack keeps `large` at every depth), and `headingLevel` (expose the title as
|
|
129
|
+
a heading; default a plain span). The defaults keep the stack's own chrome:
|
|
130
|
+
no divider, the standard Toolbar height (a 44px control band with 8px above and below), and the top and side safe-area edges
|
|
131
|
+
claimed.
|
|
132
|
+
- `backIcon` replaces the default chevron-left icon. `backText` adds visible
|
|
133
|
+
text beside it (for example, the previous view's title); visible text names
|
|
134
|
+
the control, so `backLabel` applies only to the icon-only control.
|
|
135
|
+
|
|
136
|
+
`panelToggle` supplies a persistent final group in the trailing zone of every
|
|
137
|
+
view's top toolbar. `Workbench` uses it for a navigation panel's standard
|
|
138
|
+
collapse toggle; the active view still owns the preceding toolbar groups.
|
|
139
|
+
|
|
140
|
+
The catalog's **Configured Toolbar** example shows these together: a level-2
|
|
141
|
+
heading title over a bottom divider, leading and center groups on the root
|
|
142
|
+
view, a trailing group on the pushed view, and `backText` set to the previous
|
|
143
|
+
view's title.
|
|
144
|
+
|
|
145
|
+
Focus follows the controlled stack automatically. On push, `wireNavStack`
|
|
146
|
+
remembers the focused descendant of the departing view and moves focus into the
|
|
147
|
+
new top view. On pop it restores that exact descendant when it still exists. A
|
|
148
|
+
new view prefers a descendant marked `data-nav-focus`, then its first enabled
|
|
149
|
+
focusable descendant, and finally the view container itself. Use
|
|
150
|
+
`data-nav-focus` for a heading or primary control when DOM order is not the best
|
|
151
|
+
initial reading position; it may use `tabindex="-1"` for programmatic focus.
|
|
152
|
+
When a remembered control was removed during the controlled rerender, the same
|
|
153
|
+
fallback order applies. While focus rests on the view container itself (it
|
|
154
|
+
had nothing focusable, such as an inert loading placeholder), a later
|
|
155
|
+
re-render that morphs away the temporary `tabindex` keeps it there, and once
|
|
156
|
+
content with a focus target arrives under the same key, focus moves to it;
|
|
157
|
+
focus the person moved elsewhere is never reclaimed. Disposing the helper stops future transitions and
|
|
158
|
+
cleans up any temporary fallback `tabindex` it added.
|
|
159
|
+
|
|
160
|
+
## Separators and scroll dividers
|
|
161
|
+
|
|
162
|
+
`separator="auto"` (the default) draws a line under the top chrome and above
|
|
163
|
+
the optional bottom toolbar when the active view's Pane has
|
|
164
|
+
`appearance="sunken"`, even if its content fits and no scroll wiring runs. The
|
|
165
|
+
line follows the active view on push and pop. Set `separator="hidden"` to hide
|
|
166
|
+
both stack-owned edges, including lines requested by `chromeDividers`. The
|
|
167
|
+
existing 1px edges change color without moving the content. A view's own Pane
|
|
168
|
+
header and footer separators remain controlled by that Pane.
|
|
169
|
+
|
|
170
|
+
For a flat active view, the stack draws no permanent line. With
|
|
171
|
+
`wireScrollDividers(appRoot)` installed (see
|
|
172
|
+
[Layout › Scroll dividers](layout.md#scroll-dividers)), the top chrome shows a
|
|
173
|
+
line along its bottom edge only while the active view's content is scrolled
|
|
174
|
+
beneath it, and the bottom toolbar a line along its top edge only while more
|
|
175
|
+
content lies below it — neither when the content fits. The line follows the
|
|
176
|
+
active view across a push or pop. The chrome's line is overlaid on its bottom
|
|
177
|
+
edge and the bottom toolbar's is its always-present 1px top border, colored
|
|
178
|
+
only while shown, so neither ever moves the chrome or the content. When the view's only child is a `Pane`,
|
|
179
|
+
the line keys on whichever actually scrolls — the view, or the Pane's content —
|
|
180
|
+
and a Pane header or footer draws its own boundary instead. An explicit
|
|
181
|
+
`toolbarConfig.dividerSides` still draws a permanent Toolbar edge.
|
|
182
|
+
|
|
183
|
+
`chromeDividers` configures both lines for flat views, with the same values as a `Pane`'s:
|
|
184
|
+
`scroll` (the default) follows the scroll state above and draws nothing until
|
|
185
|
+
the wiring runs; `always` keeps both lines, with or without the wiring; `none`
|
|
186
|
+
drops them even when the wiring reports scroll state. A sunken active Pane still
|
|
187
|
+
shows the separator unless `separator="hidden"`. This option does not change the
|
|
188
|
+
top Toolbar's own `dividerSides`.
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
<NavStack id="settings" label="Settings" views={views.value} chromeDividers="always" />
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Background colors
|
|
195
|
+
|
|
196
|
+
`background` paints the stack, its docked chrome and bottom toolbar, and every
|
|
197
|
+
view in an app-chosen color from `@kerfjs/ui/css-values` instead of the
|
|
198
|
+
surface. One view's own color goes in its `pane: { background }`, which paints
|
|
199
|
+
over the stack's. Overlay chrome keeps the chrome material. The app keeps text
|
|
200
|
+
at AA over the color; forced colors paint `Canvas`. See
|
|
201
|
+
[Background colors](layout.md#background-colors).
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
<NavStack id="music" label="Music" views={views.value} background={uiColor("surface-raised")} />
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
`tint={{ color, scheme }}` re-derives the stack's surface and text tokens from
|
|
208
|
+
an app color instead, so its chrome, views, and content all take on the color
|
|
209
|
+
with text kept at AA. See [Tinted surfaces](layout.md#tinted-surfaces).
|
|
210
|
+
|
|
211
|
+
## Overlay chrome
|
|
212
|
+
|
|
213
|
+
`chromePresentation="overlay"` lays the top chrome over the active view's top
|
|
214
|
+
edge, like an iOS navigation bar, instead of docking it above the view
|
|
215
|
+
(`"docked"`, the default). The chrome paints the shared chrome material,
|
|
216
|
+
`--kui-chrome-material` behind `--kui-chrome-material-filter`, so content
|
|
217
|
+
scrolls visibly, blurred, beneath it.
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
<NavStack id="mail" label="Mail" views={views.value} chromePresentation="overlay" />
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
- **`wireNavStack` measures it.** The helper you already call for transitions
|
|
224
|
+
reads the live chrome's border-box height with a `ResizeObserver`, publishes
|
|
225
|
+
it on the stack root, and marks the root `data-chrome-overlay="measured"`.
|
|
226
|
+
Only then does the chrome leave its band. Unwired, or with `hideToolbar`, the
|
|
227
|
+
chrome stays docked, so it never covers content it has not measured. The
|
|
228
|
+
measurement follows the chrome as its title wraps, text grows, or a pushed
|
|
229
|
+
view changes its toolbar. A re-render that strips the measurement gets it
|
|
230
|
+
back before paint.
|
|
231
|
+
- **Every view clears it automatically.** The measured height becomes the
|
|
232
|
+
viewport's block-start edge context (`--kui-edge-inset-block-start`), the
|
|
233
|
+
same context that carries safe areas. A plain view pads and scroll-pads by
|
|
234
|
+
it, a sole `Pane` adds it to its content's (or its header's) block-start
|
|
235
|
+
inset, and a nested layout hands it on. The first item rests just below the
|
|
236
|
+
chrome, and anything focused or scrolled into view stops clear of it. No
|
|
237
|
+
`scrollClearance` prop is involved, so a Pane that also opts into
|
|
238
|
+
`scrollClearance` does not clear the chrome twice.
|
|
239
|
+
- **Safe area.** The chrome keeps claiming the top safe area: its toolbar pads
|
|
240
|
+
for it while the material paints through it. The measured height already
|
|
241
|
+
includes that padding, so views clear the chrome and the safe area exactly
|
|
242
|
+
once.
|
|
243
|
+
- **Transitions.** Only the live chrome is measured, never a cross-fading
|
|
244
|
+
copy. An overlay bar (top chrome or bottom toolbar) cross-fades its
|
|
245
|
+
contents, never its material: the live bar keeps the material at full
|
|
246
|
+
opacity while its new contents fade in, and the copy fading out above it
|
|
247
|
+
carries only the old contents, so the sliding views never show through the
|
|
248
|
+
chrome mid push or pop. The incoming view settles at the incoming chrome's
|
|
249
|
+
clearance.
|
|
250
|
+
- **Classic scrollbars.** Where the active view's scroller (the view, or a
|
|
251
|
+
sole header-less Pane's content) shows a classic, space-taking scrollbar,
|
|
252
|
+
`wireNavStack` measures it and the chrome ends where its track begins, so
|
|
253
|
+
the thumb and arrows stay visible and usable. An overlay scrollbar takes no
|
|
254
|
+
space and passes beneath the material like the content.
|
|
255
|
+
- **Dividers.** With `wireScrollDividers`, the line under the chrome still
|
|
256
|
+
appears only while content is scrolled beneath it.
|
|
257
|
+
- **Contrast.** The material keeps normal text at AA over any content. An
|
|
258
|
+
untoned `ToolbarText` in the chrome lifts itself: its title takes the normal
|
|
259
|
+
text color at every size and its `description` mixes the quiet color halfway
|
|
260
|
+
toward it, and a default-tone `ToolbarControlGroup` takes the normal text
|
|
261
|
+
color for its controls. Other quiet copy you place in the chrome has no such
|
|
262
|
+
lift, so keep it in the view (see
|
|
263
|
+
[Accessibility › Chrome material](accessibility.md#chrome-material)). The
|
|
264
|
+
material turns opaque under `prefers-reduced-transparency`,
|
|
265
|
+
`prefers-contrast: more`, or without `backdrop-filter`, and forced colors
|
|
266
|
+
paint `Canvas` with a `CanvasText` bottom edge.
|
|
267
|
+
|
|
268
|
+
`SplitView`'s `compactStack.chromePresentation` and a Workbench navigation
|
|
269
|
+
panel's `navStack.chromePresentation` forward the same option.
|
|
270
|
+
`chromePresentation` governs only the top chrome; the bottom toolbar has its
|
|
271
|
+
own option below.
|
|
272
|
+
|
|
273
|
+
### Overlay bottom toolbar
|
|
274
|
+
|
|
275
|
+
`bottomToolbarPresentation="overlay"` does the same for the bottom toolbar,
|
|
276
|
+
like an iOS toolbar: it lies over the active view's bottom edge on the same
|
|
277
|
+
chrome material instead of docking below the view (`"docked"`, the default).
|
|
278
|
+
It is a separate prop, so either bar can be overlaid alone, and it mirrors
|
|
279
|
+
`Pane.headerPresentation` and `DialogSurface.footerPresentation` in naming one
|
|
280
|
+
edge.
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
<NavStack
|
|
284
|
+
id="mail"
|
|
285
|
+
label="Mail"
|
|
286
|
+
views={views.value}
|
|
287
|
+
chromePresentation="overlay"
|
|
288
|
+
bottomToolbarPresentation="overlay"
|
|
289
|
+
bottomToolbar={{ label: 'Mail Actions', trailing: composeGroup }}
|
|
290
|
+
/>
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
- **`wireNavStack` measures it.** It reads the live bottom toolbar's
|
|
294
|
+
border-box height (never a cross-fading copy's), publishes it on the stack
|
|
295
|
+
root, and marks the root `data-bottom-toolbar-overlay="measured"`. Only then
|
|
296
|
+
does the toolbar leave its band. Unwired, or while no bottom toolbar is
|
|
297
|
+
shown (a view without one and no stack-level fallback), it stays docked. The
|
|
298
|
+
measurement follows a view-owned toolbar as views push and pop, and a
|
|
299
|
+
re-render that strips it gets it back before paint.
|
|
300
|
+
- **Every view clears it automatically.** The measured height becomes the
|
|
301
|
+
viewport's block-end edge context (`--kui-edge-inset-block-end`). A plain
|
|
302
|
+
view pads and scroll-pads by it, a sole `Pane` adds it to its content's
|
|
303
|
+
block-end inset (or its footer's, so the footer rests just above the
|
|
304
|
+
toolbar), and a nested layout hands it on. The last item rests just above
|
|
305
|
+
the toolbar, and anything focused or scrolled into view stops clear of it.
|
|
306
|
+
- **Safe area.** The toolbar keeps claiming the bottom safe area (the home
|
|
307
|
+
indicator), and the measured height includes it, so views clear both exactly
|
|
308
|
+
once. Inside a `TabNavigator` scene the tab bar owns that edge, so the
|
|
309
|
+
stack's toolbar sits just above the tab bar and counts no safe area.
|
|
310
|
+
- **Classic scrollbars and dividers.** The toolbar ends where a classic
|
|
311
|
+
scrollbar's track begins (a sole Pane with a footer ends its scroller above
|
|
312
|
+
the toolbar, so nothing needs leaving there). With `wireScrollDividers`, the
|
|
313
|
+
toolbar's top line still appears only while more content lies below.
|
|
314
|
+
- **Contrast.** An untoned `ToolbarText` lifts itself as in the top chrome,
|
|
315
|
+
and a default-tone `ToolbarControlGroup` in either overlaid bar takes the
|
|
316
|
+
normal text color for its controls, so labels and icons keep AA over the
|
|
317
|
+
content beneath. The material has the same opaque fallbacks; in forced
|
|
318
|
+
colors the toolbar paints `Canvas` and its always-present 1px top border
|
|
319
|
+
becomes a `CanvasText` edge, which the measurement includes.
|
|
320
|
+
|
|
321
|
+
`SplitView`'s `compactStack.bottomToolbarPresentation` and a Workbench
|
|
322
|
+
navigation panel's `navStack.bottomToolbarPresentation` forward it too.
|
|
323
|
+
|
|
324
|
+
### Clear chrome
|
|
325
|
+
|
|
326
|
+
`chromePresentation="clear"` and `bottomToolbarPresentation="clear"` lay the
|
|
327
|
+
bars over the active view like `overlay`, with the same measuring and edge
|
|
328
|
+
insets, but fully transparent, for chrome over imagery. Keep their controls
|
|
329
|
+
in glass control groups (`ToolbarControlGroup material="glass"`); the stack's
|
|
330
|
+
own back control is one automatically under clear chrome. They stay
|
|
331
|
+
clear while content scrolls beneath them; with `scrollEdge="material"` (or
|
|
332
|
+
`"surface"`) a backing fades in gradually, opacity only, over
|
|
333
|
+
`scrollEdgeDistance` pixels of scroll (default 60): behind the top chrome as
|
|
334
|
+
the view's content scrolls beneath it, and behind the bottom toolbar until
|
|
335
|
+
the content nears its end. Clear bars draw no scroll
|
|
336
|
+
divider, turn opaque under reduced transparency or increased contrast, and
|
|
337
|
+
paint `Canvas` in forced colors. See [Clear header](layout.md#clear-header).
|
|
338
|
+
|
|
339
|
+
## Safe areas
|
|
340
|
+
|
|
341
|
+
The stack paints through a device's unsafe areas. Its chrome pads for the top
|
|
342
|
+
and side insets, its bottom toolbar for the bottom and side insets, and each
|
|
343
|
+
view pads the remaining edges inside its scroller, so content scrolls under the
|
|
344
|
+
unsafe area but can always be scrolled clear. A view whose only child is a
|
|
345
|
+
`Pane` or layout lets that child own the insets. See [Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
40
346
|
|
|
41
347
|
## Transitions
|
|
42
348
|
|
|
43
349
|
`wireNavStack(root, { onBack, duration? })` observes the rendered stack and
|
|
44
350
|
animates each change: a pushed view slides in from the trailing edge; a popped
|
|
45
|
-
view slides back off it over the revealed view
|
|
46
|
-
|
|
47
|
-
|
|
351
|
+
view slides back off it over the revealed view; and snapshots of the previous
|
|
352
|
+
top and bottom chrome cross-fade into the active view's chrome. The preserved
|
|
353
|
+
underlying view remains visible during a push, while remaining inaccessible.
|
|
354
|
+
Starting transforms and opacity apply instantly before the transition begins.
|
|
355
|
+
A new navigation settles the previous transition and cancels its pending frames
|
|
356
|
+
and cleanup timers; disposal removes temporary copies and exiting views. Focus moves to
|
|
357
|
+
the new top view independently of animation duration. It returns a disposer.
|
|
358
|
+
The animation honors `prefers-reduced-motion` (transitions collapse to instant)
|
|
359
|
+
and `duration: 0` disables it. Applicable at every device size and inside
|
|
360
|
+
dialogs.
|