@kerfjs/ui 5.0.0-beta.10 → 5.0.0-beta.100
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 +630 -132
- package/ai/application-ui-diagnostic-ids-v1.json +114 -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 +96 -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 +6401 -931
- 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 +551 -0
- package/ai/component-composition.d.ts +132 -0
- package/ai/component-composition.json +8729 -0
- package/ai/component-composition.schema.json +412 -0
- package/ai/components/README.md +185 -0
- package/ai/components/anchored-surface.md +99 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +76 -0
- package/ai/components/chip.md +76 -0
- package/ai/components/choice-chips.md +87 -0
- package/ai/components/collapsible-panel.md +103 -0
- package/ai/components/column-track.md +78 -0
- package/ai/components/combobox.md +88 -0
- package/ai/components/composer.md +83 -0
- package/ai/components/content-item.md +98 -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/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 +88 -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/icon-button.md +82 -0
- package/ai/components/icon-toggle-button.md +80 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +108 -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 +125 -0
- package/ai/components/loading-spinner.md +73 -0
- package/ai/components/lucide-icon.md +97 -0
- package/ai/components/nav-stack.md +115 -0
- package/ai/components/pane.md +115 -0
- package/ai/components/popup-menu.md +171 -0
- package/ai/components/recipe-app-shell.md +57 -0
- package/ai/components/recipe-collapsible-sidebar.md +57 -0
- package/ai/components/recipe-compact-toolbar.md +57 -0
- package/ai/components/recipe-composer-form.md +57 -0
- package/ai/components/recipe-list-detail-dialog.md +57 -0
- package/ai/components/recipe-list-workspace-states.md +57 -0
- package/ai/components/recipe-loading-inspector.md +57 -0
- package/ai/components/recipe-navigation-sidebar.md +57 -0
- package/ai/components/recipe-navigation-stack.md +57 -0
- package/ai/components/recipe-workspace-header.md +57 -0
- package/ai/components/resize.md +106 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +116 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-button.md +80 -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 +105 -0
- package/ai/components/tab-bar.md +114 -0
- package/ai/components/tab-navigator.md +100 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/text.md +90 -0
- package/ai/components/token-search-field.md +107 -0
- package/ai/components/toolbar-control-group.md +125 -0
- package/ai/components/toolbar-text.md +100 -0
- package/ai/components/toolbar.md +103 -0
- package/ai/components/value-table.md +80 -0
- package/ai/components/wa-accordion-item.md +55 -0
- package/ai/components/wa-accordion.md +65 -0
- package/ai/components/wa-animated-image.md +55 -0
- package/ai/components/wa-animation.md +55 -0
- package/ai/components/wa-avatar.md +55 -0
- package/ai/components/wa-badge.md +55 -0
- package/ai/components/wa-breadcrumb-item.md +53 -0
- package/ai/components/wa-breadcrumb.md +55 -0
- package/ai/components/wa-button-group.md +60 -0
- package/ai/components/wa-button.md +59 -0
- package/ai/components/wa-callout.md +58 -0
- package/ai/components/wa-card.md +59 -0
- package/ai/components/wa-carousel-item.md +53 -0
- package/ai/components/wa-carousel.md +55 -0
- package/ai/components/wa-checkbox-group.md +55 -0
- package/ai/components/wa-checkbox.md +55 -0
- package/ai/components/wa-color-picker.md +55 -0
- package/ai/components/wa-comparison.md +55 -0
- package/ai/components/wa-copy-button.md +55 -0
- package/ai/components/wa-details.md +61 -0
- package/ai/components/wa-dialog.md +59 -0
- package/ai/components/wa-divider.md +53 -0
- package/ai/components/wa-drawer.md +55 -0
- package/ai/components/wa-dropdown-item.md +60 -0
- package/ai/components/wa-dropdown.md +60 -0
- package/ai/components/wa-format-bytes.md +53 -0
- package/ai/components/wa-format-date.md +53 -0
- package/ai/components/wa-format-number.md +53 -0
- package/ai/components/wa-icon.md +58 -0
- package/ai/components/wa-include.md +53 -0
- package/ai/components/wa-input.md +59 -0
- package/ai/components/wa-intersection-observer.md +53 -0
- package/ai/components/wa-known-date.md +53 -0
- package/ai/components/wa-markdown.md +53 -0
- package/ai/components/wa-mutation-observer.md +53 -0
- package/ai/components/wa-number-input.md +55 -0
- package/ai/components/wa-option.md +59 -0
- package/ai/components/wa-otp-input.md +53 -0
- package/ai/components/wa-page.md +53 -0
- package/ai/components/wa-pagination.md +55 -0
- package/ai/components/wa-popover.md +55 -0
- package/ai/components/wa-popup.md +53 -0
- package/ai/components/wa-progress-bar.md +53 -0
- package/ai/components/wa-progress-ring.md +53 -0
- package/ai/components/wa-qr-code.md +53 -0
- package/ai/components/wa-radio-group.md +59 -0
- package/ai/components/wa-radio.md +55 -0
- package/ai/components/wa-random-content.md +53 -0
- package/ai/components/wa-rating.md +55 -0
- package/ai/components/wa-relative-time.md +53 -0
- package/ai/components/wa-resize-observer.md +53 -0
- package/ai/components/wa-scroller.md +53 -0
- package/ai/components/wa-select.md +63 -0
- package/ai/components/wa-skeleton.md +53 -0
- package/ai/components/wa-slider.md +55 -0
- package/ai/components/wa-spinner.md +58 -0
- package/ai/components/wa-split-panel.md +58 -0
- package/ai/components/wa-switch.md +53 -0
- package/ai/components/wa-tab-group.md +69 -0
- package/ai/components/wa-tab-panel.md +60 -0
- package/ai/components/wa-tab.md +59 -0
- package/ai/components/wa-tag.md +59 -0
- package/ai/components/wa-textarea.md +53 -0
- package/ai/components/wa-time-input.md +55 -0
- package/ai/components/wa-toast-item.md +60 -0
- package/ai/components/wa-toast.md +60 -0
- package/ai/components/wa-tooltip.md +55 -0
- package/ai/components/wa-tree-item.md +55 -0
- package/ai/components/wa-tree.md +55 -0
- package/ai/components/wa-zoomable-frame.md +55 -0
- package/ai/components/workbench.md +120 -0
- package/ai/public-api-signatures-v1.md +4261 -459
- package/ai/skill.md +441 -63
- package/ai/webawesome-jsx-signatures-v1.md +9 -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/app-tab.d.ts +39 -4
- package/dist/app-tab.js +2 -1
- package/dist/badge.d.ts +83 -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/badge.js +3 -0
- package/dist/browser/catalog.js +28 -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/column-track.js +3 -0
- package/dist/browser/combobox.js +3 -0
- package/dist/browser/composer.js +4 -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/edge-activity-indicator.js +3 -0
- package/dist/browser/file-picker.js +3 -0
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/framed-list.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/icon-button.js +4 -0
- package/dist/browser/icon-toggle-button.js +4 -0
- package/dist/browser/list-action-row.js +2 -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/nav-stack.js +11 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/segmented-control.js +0 -1
- package/dist/browser/select.js +2 -1
- 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 +3 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench.js +14 -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 +668 -105
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +69 -0
- package/dist/chip.js +3 -0
- package/dist/chip.js.map +1 -0
- package/dist/choice-chips.d.ts +82 -0
- package/dist/choice-chips.js +3 -0
- package/dist/choice-chips.js.map +1 -0
- package/dist/chunk-2GOCOLQL.js +270 -0
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/chunk-2MSPNRWJ.js +82 -0
- package/dist/chunk-2MSPNRWJ.js.map +1 -0
- package/dist/chunk-34U4ANDJ.js +119 -0
- package/dist/chunk-34U4ANDJ.js.map +1 -0
- package/dist/chunk-3GLYIIFR.js +230 -0
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-3VXDSIBJ.js} +7 -4
- package/dist/chunk-3VXDSIBJ.js.map +1 -0
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-4UB5Z3ZZ.js +68 -0
- package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
- package/dist/chunk-6C6DLP3W.js +31 -0
- package/dist/chunk-6C6DLP3W.js.map +1 -0
- package/dist/chunk-7IUEBNCO.js +108 -0
- package/dist/chunk-7IUEBNCO.js.map +1 -0
- package/dist/chunk-AN5IWMTM.js +24 -0
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/chunk-AV7CPAPT.js +82 -0
- package/dist/chunk-AV7CPAPT.js.map +1 -0
- package/dist/chunk-B53PS2LE.js +34 -0
- package/dist/chunk-B53PS2LE.js.map +1 -0
- package/dist/chunk-CA7LNX3J.js +44 -0
- package/dist/chunk-CA7LNX3J.js.map +1 -0
- package/dist/chunk-CEJ5FK6G.js +288 -0
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/chunk-CMETHPKR.js +175 -0
- package/dist/chunk-CMETHPKR.js.map +1 -0
- package/dist/chunk-CMLPFIC5.js +46 -0
- package/dist/chunk-CMLPFIC5.js.map +1 -0
- package/dist/chunk-CVD5IZGB.js +66 -0
- package/dist/chunk-CVD5IZGB.js.map +1 -0
- package/dist/chunk-CXZXHZTR.js +514 -0
- package/dist/chunk-CXZXHZTR.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-ELCMSQNJ.js +49 -0
- package/dist/chunk-ELCMSQNJ.js.map +1 -0
- package/dist/chunk-EOO6PYGF.js +162 -0
- package/dist/chunk-EOO6PYGF.js.map +1 -0
- package/dist/chunk-ETCWQLJV.js +85 -0
- package/dist/chunk-ETCWQLJV.js.map +1 -0
- package/dist/chunk-FDZNYD4C.js +138 -0
- package/dist/chunk-FDZNYD4C.js.map +1 -0
- package/dist/chunk-FR76ZJQC.js +90 -0
- package/dist/chunk-FR76ZJQC.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-HGV7J4T6.js +86 -0
- package/dist/chunk-HGV7J4T6.js.map +1 -0
- package/dist/chunk-HLDRH23D.js +84 -0
- package/dist/chunk-HLDRH23D.js.map +1 -0
- package/dist/chunk-HQZYKJ56.js +302 -0
- package/dist/chunk-HQZYKJ56.js.map +1 -0
- package/dist/chunk-HZPHCSCS.js +95 -0
- package/dist/chunk-HZPHCSCS.js.map +1 -0
- package/dist/chunk-IKS72C6P.js +53 -0
- package/dist/chunk-IKS72C6P.js.map +1 -0
- package/dist/chunk-IM3GKYOG.js +202 -0
- package/dist/chunk-IM3GKYOG.js.map +1 -0
- package/dist/chunk-INI4WDWC.js +125 -0
- package/dist/chunk-INI4WDWC.js.map +1 -0
- package/dist/chunk-IQSRHXZR.js +164 -0
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/chunk-JOR5LGYE.js +55 -0
- package/dist/chunk-JOR5LGYE.js.map +1 -0
- package/dist/chunk-K4AT3V3J.js +545 -0
- package/dist/chunk-K4AT3V3J.js.map +1 -0
- package/dist/chunk-KCS6NJ3O.js +82 -0
- package/dist/chunk-KCS6NJ3O.js.map +1 -0
- package/dist/chunk-KH4KEMSP.js +71 -0
- package/dist/chunk-KH4KEMSP.js.map +1 -0
- package/dist/chunk-LL45C7BB.js +122 -0
- package/dist/chunk-LL45C7BB.js.map +1 -0
- package/dist/chunk-LOSRXZAH.js +100 -0
- package/dist/chunk-LOSRXZAH.js.map +1 -0
- package/dist/chunk-MF6ZUUJZ.js +300 -0
- package/dist/chunk-MF6ZUUJZ.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-MXNIVEVL.js +48 -0
- package/dist/chunk-MXNIVEVL.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-NS2TBYM4.js} +8 -5
- package/dist/chunk-NS2TBYM4.js.map +1 -0
- package/dist/chunk-PIVY32AE.js +140 -0
- package/dist/chunk-PIVY32AE.js.map +1 -0
- package/dist/chunk-PYBBYSZ3.js +526 -0
- package/dist/chunk-PYBBYSZ3.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-QIG4IGUP.js +139 -0
- package/dist/chunk-QIG4IGUP.js.map +1 -0
- package/dist/chunk-QLA25V2K.js +493 -0
- package/dist/chunk-QLA25V2K.js.map +1 -0
- package/dist/chunk-QROYYGWU.js +52 -0
- package/dist/chunk-QROYYGWU.js.map +1 -0
- package/dist/chunk-QYMJHS4K.js +36 -0
- package/dist/chunk-QYMJHS4K.js.map +1 -0
- package/dist/chunk-RHD7RKGI.js +176 -0
- package/dist/chunk-RHD7RKGI.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-T4WJ5VGP.js +165 -0
- package/dist/chunk-T4WJ5VGP.js.map +1 -0
- package/dist/chunk-TDMHA7C3.js +251 -0
- package/dist/chunk-TDMHA7C3.js.map +1 -0
- package/dist/chunk-TGLUDQP2.js +138 -0
- package/dist/chunk-TGLUDQP2.js.map +1 -0
- package/dist/chunk-TLMMFQWM.js +222 -0
- package/dist/chunk-TLMMFQWM.js.map +1 -0
- package/dist/chunk-U6QYTMDB.js +85 -0
- package/dist/chunk-U6QYTMDB.js.map +1 -0
- package/dist/chunk-UMKV7YVQ.js +20 -0
- package/dist/chunk-UMKV7YVQ.js.map +1 -0
- package/dist/chunk-VFYO3UGZ.js +45 -0
- package/dist/chunk-VFYO3UGZ.js.map +1 -0
- package/dist/chunk-W4IK7AWD.js +73 -0
- package/dist/chunk-W4IK7AWD.js.map +1 -0
- package/dist/chunk-WVS6CUCT.js +48 -0
- package/dist/chunk-WVS6CUCT.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-YOA5W5ZH.js +807 -0
- package/dist/chunk-YOA5W5ZH.js.map +1 -0
- package/dist/chunk-YQ2AC4E2.js +59 -0
- package/dist/chunk-YQ2AC4E2.js.map +1 -0
- package/dist/chunk-ZKKO4MHC.js +25 -0
- package/dist/chunk-ZKKO4MHC.js.map +1 -0
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/collapsible-panel.d.ts +96 -17
- package/dist/collapsible-panel.js +132 -14
- package/dist/collapsible-panel.js.map +1 -1
- 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/composer.d.ts +62 -0
- package/dist/composer.js +5 -0
- package/dist/composer.js.map +1 -0
- package/dist/content-item.d.ts +116 -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/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 +47 -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 +51 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- 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 +9 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/icon-button.d.ts +46 -0
- package/dist/icon-button.js +6 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/icon-toggle-button.d.ts +42 -0
- package/dist/icon-toggle-button.js +6 -0
- package/dist/icon-toggle-button.js.map +1 -0
- package/dist/index.d.ts +63 -17
- package/dist/index.js +66 -23
- package/dist/list-action-row.d.ts +69 -12
- package/dist/list-action-row.js +5 -1
- package/dist/list-header.d.ts +65 -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 +128 -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 +15 -3
- package/dist/lucide-icon.js +2 -1
- package/dist/nav-stack-VXTumzKa.d.ts +158 -0
- package/dist/nav-stack.d.ts +15 -38
- package/dist/nav-stack.js +13 -1
- package/dist/pane.d.ts +153 -0
- package/dist/pane.js +5 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
- package/dist/popup-menu-register.d.ts +10 -0
- package/dist/popup-menu-register.js +336 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +125 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +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/segmented-control.d.ts +12 -9
- package/dist/segmented-control.js +1 -2
- package/dist/select-register.js +255 -3
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +103 -8
- package/dist/select.js +4 -1
- 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/spacer.d.ts +18 -0
- package/dist/spacer.js +4 -0
- package/dist/spacer.js.map +1 -0
- package/dist/split-button.d.ts +57 -0
- package/dist/split-button.js +7 -0
- package/dist/split-button.js.map +1 -0
- package/dist/split-view.d.ts +63 -6
- package/dist/split-view.js +149 -10
- 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 +41 -0
- package/dist/styles/app-tab.css +232 -0
- package/dist/styles/badge.css +145 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
- package/dist/styles/catalog/components/catalog-example.css +204 -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 -498
- package/dist/styles/chip.css +208 -0
- package/dist/styles/choice-chips.css +154 -0
- package/dist/styles/collapsible-panel.css +450 -16
- package/dist/styles/column-track.css +57 -0
- package/dist/styles/combobox.css +113 -0
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
- package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +370 -0
- package/dist/styles/components/actions/split-button/split-button.css +95 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +443 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1069 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +269 -0
- package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
- package/dist/styles/components/collections/list/list.css +250 -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 +229 -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 +41 -0
- package/dist/styles/components/feedback/badge/badge.css +145 -0
- package/dist/styles/components/feedback/chip/chip.css +208 -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/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +297 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
- package/dist/styles/components/forms/combobox/combobox.css +113 -0
- package/dist/styles/components/forms/composer/composer.css +100 -0
- package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +455 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +432 -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 +382 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
- package/dist/styles/components/layout/row/row.css +114 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +146 -0
- package/dist/styles/components/layout/workbench/workbench.css +1086 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +342 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +197 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +325 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +138 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +31 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +425 -0
- package/dist/styles/components/typography/text/text.css +220 -0
- package/dist/styles/composer.css +100 -0
- package/dist/styles/content-item.css +138 -0
- package/dist/styles/content-swap.css +154 -0
- package/dist/styles/corner-status.css +60 -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 +119 -0
- package/dist/styles/foundation.css +261 -45
- package/dist/styles/framed-list.css +47 -0
- package/dist/styles/grid.css +88 -0
- package/dist/styles/icon-button.css +22 -0
- package/dist/styles/icon-toggle-button.css +83 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +324 -18
- package/dist/styles/list-header.css +128 -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 +250 -0
- package/dist/styles/loading-spinner.css +4 -0
- package/dist/styles/lucide-icon.css +9 -0
- package/dist/styles/nav-stack.css +280 -49
- package/dist/styles/pane.css +382 -0
- package/dist/styles/popup-menu.css +370 -0
- package/dist/styles/resizable-region.css +438 -4
- package/dist/styles/row.css +114 -0
- package/dist/styles/segmented-control.css +36 -9
- package/dist/styles/select.css +338 -21
- package/dist/styles/skeleton.css +64 -3
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-button.css +95 -0
- package/dist/styles/split-view.css +114 -3
- package/dist/styles/state-banner.css +146 -22
- package/dist/styles/styles.css +23 -1
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +31 -0
- package/dist/styles/surface-scaffold.css +425 -0
- package/dist/styles/tab-bar.css +161 -9
- package/dist/styles/tab-navigator.css +325 -0
- package/dist/styles/text.css +220 -0
- package/dist/styles/token-search-field.css +202 -59
- package/dist/styles/toolbar-control-group.css +894 -36
- package/dist/styles/toolbar-text.css +236 -7
- package/dist/styles/toolbar.css +393 -11
- package/dist/styles/value-table.css +115 -7
- package/dist/styles/webawesome.css +410 -17
- package/dist/styles/workbench.css +999 -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 +9 -0
- package/dist/surface-scaffold-register.js +151 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +170 -0
- package/dist/surface-scaffold.js +4 -0
- package/dist/surface-scaffold.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 +114 -0
- package/dist/tab-navigator.js +102 -0
- package/dist/tab-navigator.js.map +1 -0
- package/dist/text.d.ts +98 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/token-search-field.d.ts +3 -43
- package/dist/token-search-field.js +2 -1
- package/dist/token-search-model-aYR0YAei.d.ts +184 -0
- package/dist/token-search-model.d.ts +3 -0
- package/dist/token-search-model.js +3 -0
- package/dist/token-search-model.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +96 -7
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +58 -9
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +71 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-CVgIwSdq.d.ts +189 -0
- package/dist/value-table.d.ts +30 -4
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +8 -1
- package/dist/wire-catalog.d.ts +111 -5
- package/dist/wire-catalog.js +302 -14
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-comboboxes.d.ts +26 -0
- package/dist/wire-comboboxes.js +3 -0
- package/dist/wire-comboboxes.js.map +1 -0
- package/dist/wire-composers.d.ts +16 -0
- package/dist/wire-composers.js +3 -0
- package/dist/wire-composers.js.map +1 -0
- package/dist/wire-content-items.d.ts +11 -0
- package/dist/wire-content-items.js +139 -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 +26 -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-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +326 -15
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +87 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.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-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-token-search-fields.d.ts +28 -10
- package/dist/wire-token-search-fields.js +2 -1
- 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.d.ts +253 -10
- package/dist/workbench.js +20 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +640 -33
- package/docs/anchored-surface.md +101 -0
- package/docs/app-layouts.md +159 -10
- package/docs/apple-hig.md +2 -0
- package/docs/catalog.md +565 -63
- package/docs/collapsible-panel.md +308 -25
- package/docs/component-contract.md +816 -53
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +962 -99
- package/docs/composer.md +143 -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/composer/chat-dark.svg +1 -0
- package/docs/design/templates/composer/chat.svg +1 -0
- package/docs/design/templates/composer/prompt-dark.svg +1 -0
- package/docs/design/templates/composer/prompt.svg +1 -0
- package/docs/design/templates/composer-dark.svg +1 -0
- package/docs/design/templates/composer.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
- package/docs/design/templates/empty-state/filtered.svg +1 -0
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
- package/docs/design/templates/empty-state/with-action.svg +1 -0
- package/docs/design/templates/empty-state-dark.svg +1 -0
- package/docs/design/templates/empty-state.svg +1 -0
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -0
- package/docs/design/templates/list-action-row/default.svg +1 -0
- package/docs/design/templates/list-action-row/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 -0
- package/docs/design/templates/list-action-row/selected.svg +1 -0
- 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 -0
- package/docs/design/templates/list-action-row.svg +1 -0
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -0
- package/docs/design/templates/list-header/action.svg +1 -0
- package/docs/design/templates/list-header/count-dark.svg +1 -0
- package/docs/design/templates/list-header/count.svg +1 -0
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
- package/docs/design/templates/list-header/inline-action.svg +1 -0
- package/docs/design/templates/list-header/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 -0
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +1 -0
- package/docs/design/templates/list-header.svg +1 -0
- package/docs/design/templates/list-item/default-dark.svg +1 -0
- package/docs/design/templates/list-item/default.svg +1 -0
- package/docs/design/templates/list-item/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 -0
- package/docs/design/templates/list-item/multiline.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -0
- package/docs/design/templates/list-item/selected.svg +1 -0
- package/docs/design/templates/list-item/trailing-dark.svg +1 -0
- package/docs/design/templates/list-item/trailing.svg +1 -0
- package/docs/design/templates/list-item-dark.svg +1 -0
- package/docs/design/templates/list-item.svg +1 -0
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
- package/docs/design/templates/segmented-control/equal.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small.svg +1 -0
- package/docs/design/templates/segmented-control-dark.svg +1 -0
- package/docs/design/templates/segmented-control.svg +1 -0
- package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
- package/docs/design/templates/skeleton/avatar.svg +1 -0
- package/docs/design/templates/skeleton/block-dark.svg +1 -0
- package/docs/design/templates/skeleton/block.svg +1 -0
- package/docs/design/templates/skeleton/lines-dark.svg +1 -0
- package/docs/design/templates/skeleton/lines.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -0
- package/docs/design/templates/skeleton.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -0
- package/docs/design/templates/state-banner/danger.svg +1 -0
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -0
- package/docs/design/templates/state-banner/info.svg +1 -0
- package/docs/design/templates/state-banner/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 -0
- package/docs/design/templates/state-banner/success.svg +1 -0
- package/docs/design/templates/state-banner/warning-dark.svg +1 -0
- package/docs/design/templates/state-banner/warning.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +1 -0
- package/docs/design/templates/state-banner.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
- package/docs/design/templates/tab-bar-dark.svg +1 -0
- package/docs/design/templates/tab-bar.svg +1 -0
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
- package/docs/design/templates/token-search-field/empty.svg +1 -0
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/token-search-field/tokens.svg +1 -0
- package/docs/design/templates/token-search-field-dark.svg +1 -0
- package/docs/design/templates/token-search-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
- package/docs/design/templates/toolbar/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/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 -0
- 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 -0
- package/docs/design/templates/toolbar-text/default.svg +1 -0
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/large.svg +1 -0
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/small.svg +1 -0
- package/docs/design/templates/toolbar-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-text.svg +1 -0
- package/docs/design/templates/toolbar.svg +1 -0
- package/docs/design/templates/value-table/details-dark.svg +1 -0
- package/docs/design/templates/value-table/details.svg +1 -0
- package/docs/design/templates/value-table-dark.svg +1 -0
- package/docs/design/templates/value-table.svg +1 -0
- package/docs/design/templates.md +75 -18
- package/docs/design-philosophy.md +65 -20
- package/docs/device-class.md +10 -9
- 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 +796 -53
- package/docs/nav-stack.md +287 -14
- package/docs/recipes.md +129 -73
- package/docs/split-view.md +96 -7
- package/docs/sunken-panel.md +106 -0
- package/docs/surface-scaffold.md +270 -0
- package/docs/tab-navigator.md +255 -0
- package/docs/type-contracts.md +137 -0
- package/docs/ui-analyzer.md +406 -0
- package/docs/ui-doctor.md +281 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +48 -17
- package/docs/webawesome-theme.md +215 -16
- package/docs/workbench.md +627 -12
- package/docs/writing.md +152 -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 +591 -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 +770 -50
- package/package.json +345 -27
- 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 +133 -21
- package/ux-demo/recipes/list-detail-dialog.tsx +255 -14
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +9 -3
- package/ux-demo/recipes/loading-inspector.tsx +162 -39
- package/ux-demo/recipes/mount-recipe.ts +26 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
- package/ux-demo/recipes/navigation-stack.tsx +79 -24
- package/ux-demo/recipes/types.ts +17 -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/browser/panel-header.js +0 -7
- 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-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-CVZYNJJ5.js +0 -265
- package/dist/chunk-CVZYNJJ5.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-LC3YSAZC.js +0 -39
- package/dist/chunk-LC3YSAZC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js +0 -10
- package/dist/chunk-MFKMHK5W.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-W5EQ3HYQ.js +0 -42
- package/dist/chunk-W5EQ3HYQ.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-XXMOARTH.js +0 -229
- package/dist/chunk-XXMOARTH.js.map +0 -1
- package/dist/chunk-Y5MRDTLC.js +0 -20
- package/dist/chunk-Y5MRDTLC.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/panel-header.css +0 -64
- package/dist/styles/tab-scaffold.css +0 -84
- 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/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/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/tab-scaffold.md +0 -41
- package/ux-demo/recipes/recipes.css +0 -448
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,296 @@ 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. Disposing the helper stops future transitions and
|
|
154
|
+
cleans up any temporary fallback `tabindex` it added.
|
|
155
|
+
|
|
156
|
+
## Separators and scroll dividers
|
|
157
|
+
|
|
158
|
+
`separator="auto"` (the default) draws a line under the top chrome and above
|
|
159
|
+
the optional bottom toolbar when the active view's Pane has
|
|
160
|
+
`appearance="sunken"`, even if its content fits and no scroll wiring runs. The
|
|
161
|
+
line follows the active view on push and pop. Set `separator="hidden"` to hide
|
|
162
|
+
both stack-owned edges, including lines requested by `chromeDividers`. The
|
|
163
|
+
existing 1px edges change color without moving the content. A view's own Pane
|
|
164
|
+
header and footer separators remain controlled by that Pane.
|
|
165
|
+
|
|
166
|
+
For a flat active view, the stack draws no permanent line. With
|
|
167
|
+
`wireScrollDividers(appRoot)` installed (see
|
|
168
|
+
[Layout › Scroll dividers](layout.md#scroll-dividers)), the top chrome shows a
|
|
169
|
+
line along its bottom edge only while the active view's content is scrolled
|
|
170
|
+
beneath it, and the bottom toolbar a line along its top edge only while more
|
|
171
|
+
content lies below it — neither when the content fits. The line follows the
|
|
172
|
+
active view across a push or pop. The chrome's line is overlaid on its bottom
|
|
173
|
+
edge and the bottom toolbar's is its always-present 1px top border, colored
|
|
174
|
+
only while shown, so neither ever moves the chrome or the content. When the view's only child is a `Pane`,
|
|
175
|
+
the line keys on whichever actually scrolls — the view, or the Pane's content —
|
|
176
|
+
and a Pane header or footer draws its own boundary instead. An explicit
|
|
177
|
+
`toolbarConfig.dividerSides` still draws a permanent Toolbar edge.
|
|
178
|
+
|
|
179
|
+
`chromeDividers` configures both lines for flat views, with the same values as a `Pane`'s:
|
|
180
|
+
`scroll` (the default) follows the scroll state above and draws nothing until
|
|
181
|
+
the wiring runs; `always` keeps both lines, with or without the wiring; `none`
|
|
182
|
+
drops them even when the wiring reports scroll state. A sunken active Pane still
|
|
183
|
+
shows the separator unless `separator="hidden"`. This option does not change the
|
|
184
|
+
top Toolbar's own `dividerSides`.
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
<NavStack id="settings" label="Settings" views={views.value} chromeDividers="always" />
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Overlay chrome
|
|
191
|
+
|
|
192
|
+
`chromePresentation="overlay"` lays the top chrome over the active view's top
|
|
193
|
+
edge, like an iOS navigation bar, instead of docking it above the view
|
|
194
|
+
(`"docked"`, the default). The chrome paints the shared chrome material,
|
|
195
|
+
`--kui-chrome-material` behind `--kui-chrome-material-filter`, so content
|
|
196
|
+
scrolls visibly, blurred, beneath it.
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
<NavStack id="mail" label="Mail" views={views.value} chromePresentation="overlay" />
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
- **`wireNavStack` measures it.** The helper you already call for transitions
|
|
203
|
+
reads the live chrome's border-box height with a `ResizeObserver`, publishes
|
|
204
|
+
it on the stack root, and marks the root `data-chrome-overlay="measured"`.
|
|
205
|
+
Only then does the chrome leave its band. Unwired, or with `hideToolbar`, the
|
|
206
|
+
chrome stays docked, so it never covers content it has not measured. The
|
|
207
|
+
measurement follows the chrome as its title wraps, text grows, or a pushed
|
|
208
|
+
view changes its toolbar. A re-render that strips the measurement gets it
|
|
209
|
+
back before paint.
|
|
210
|
+
- **Every view clears it automatically.** The measured height becomes the
|
|
211
|
+
viewport's block-start edge context (`--kui-edge-inset-block-start`), the
|
|
212
|
+
same context that carries safe areas. A plain view pads and scroll-pads by
|
|
213
|
+
it, a sole `Pane` adds it to its content's (or its header's) block-start
|
|
214
|
+
inset, and a nested layout hands it on. The first item rests just below the
|
|
215
|
+
chrome, and anything focused or scrolled into view stops clear of it. No
|
|
216
|
+
`scrollClearance` prop is involved, so a Pane that also opts into
|
|
217
|
+
`scrollClearance` does not clear the chrome twice.
|
|
218
|
+
- **Safe area.** The chrome keeps claiming the top safe area: its toolbar pads
|
|
219
|
+
for it while the material paints through it. The measured height already
|
|
220
|
+
includes that padding, so views clear the chrome and the safe area exactly
|
|
221
|
+
once.
|
|
222
|
+
- **Transitions.** Only the live chrome is measured, never a cross-fading
|
|
223
|
+
copy. The copy keeps painting over the top edge with the same material while
|
|
224
|
+
it fades, and the incoming view settles at the incoming chrome's clearance.
|
|
225
|
+
- **Classic scrollbars.** Where the active view's scroller (the view, or a
|
|
226
|
+
sole header-less Pane's content) shows a classic, space-taking scrollbar,
|
|
227
|
+
`wireNavStack` measures it and the chrome ends where its track begins, so
|
|
228
|
+
the thumb and arrows stay visible and usable. An overlay scrollbar takes no
|
|
229
|
+
space and passes beneath the material like the content.
|
|
230
|
+
- **Dividers.** With `wireScrollDividers`, the line under the chrome still
|
|
231
|
+
appears only while content is scrolled beneath it.
|
|
232
|
+
- **Contrast.** The material keeps normal text at AA over any content. An
|
|
233
|
+
untoned `ToolbarText` in the chrome lifts itself: its title takes the normal
|
|
234
|
+
text color at every size and its `description` mixes the quiet color halfway
|
|
235
|
+
toward it, and a default-tone `ToolbarControlGroup` takes the normal text
|
|
236
|
+
color for its controls. Other quiet copy you place in the chrome has no such
|
|
237
|
+
lift, so keep it in the view (see
|
|
238
|
+
[Accessibility › Chrome material](accessibility.md#chrome-material)). The
|
|
239
|
+
material turns opaque under `prefers-reduced-transparency`,
|
|
240
|
+
`prefers-contrast: more`, or without `backdrop-filter`, and forced colors
|
|
241
|
+
paint `Canvas` with a `CanvasText` bottom edge.
|
|
242
|
+
|
|
243
|
+
`SplitView`'s `compactStack.chromePresentation` and a Workbench navigation
|
|
244
|
+
panel's `navStack.chromePresentation` forward the same option.
|
|
245
|
+
`chromePresentation` governs only the top chrome; the bottom toolbar has its
|
|
246
|
+
own option below.
|
|
247
|
+
|
|
248
|
+
### Overlay bottom toolbar
|
|
249
|
+
|
|
250
|
+
`bottomToolbarPresentation="overlay"` does the same for the bottom toolbar,
|
|
251
|
+
like an iOS toolbar: it lies over the active view's bottom edge on the same
|
|
252
|
+
chrome material instead of docking below the view (`"docked"`, the default).
|
|
253
|
+
It is a separate prop, so either bar can be overlaid alone, and it mirrors
|
|
254
|
+
`Pane.headerPresentation` and `DialogSurface.footerPresentation` in naming one
|
|
255
|
+
edge.
|
|
256
|
+
|
|
257
|
+
```tsx
|
|
258
|
+
<NavStack
|
|
259
|
+
id="mail"
|
|
260
|
+
label="Mail"
|
|
261
|
+
views={views.value}
|
|
262
|
+
chromePresentation="overlay"
|
|
263
|
+
bottomToolbarPresentation="overlay"
|
|
264
|
+
bottomToolbar={{ label: 'Mail Actions', trailing: composeGroup }}
|
|
265
|
+
/>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
- **`wireNavStack` measures it.** It reads the live bottom toolbar's
|
|
269
|
+
border-box height (never a cross-fading copy's), publishes it on the stack
|
|
270
|
+
root, and marks the root `data-bottom-toolbar-overlay="measured"`. Only then
|
|
271
|
+
does the toolbar leave its band. Unwired, or while no bottom toolbar is
|
|
272
|
+
shown (a view without one and no stack-level fallback), it stays docked. The
|
|
273
|
+
measurement follows a view-owned toolbar as views push and pop, and a
|
|
274
|
+
re-render that strips it gets it back before paint.
|
|
275
|
+
- **Every view clears it automatically.** The measured height becomes the
|
|
276
|
+
viewport's block-end edge context (`--kui-edge-inset-block-end`). A plain
|
|
277
|
+
view pads and scroll-pads by it, a sole `Pane` adds it to its content's
|
|
278
|
+
block-end inset (or its footer's, so the footer rests just above the
|
|
279
|
+
toolbar), and a nested layout hands it on. The last item rests just above
|
|
280
|
+
the toolbar, and anything focused or scrolled into view stops clear of it.
|
|
281
|
+
- **Safe area.** The toolbar keeps claiming the bottom safe area (the home
|
|
282
|
+
indicator), and the measured height includes it, so views clear both exactly
|
|
283
|
+
once. Inside a `TabNavigator` scene the tab bar owns that edge, so the
|
|
284
|
+
stack's toolbar sits just above the tab bar and counts no safe area.
|
|
285
|
+
- **Classic scrollbars and dividers.** The toolbar ends where a classic
|
|
286
|
+
scrollbar's track begins (a sole Pane with a footer ends its scroller above
|
|
287
|
+
the toolbar, so nothing needs leaving there). With `wireScrollDividers`, the
|
|
288
|
+
toolbar's top line still appears only while more content lies below.
|
|
289
|
+
- **Contrast.** An untoned `ToolbarText` lifts itself as in the top chrome,
|
|
290
|
+
and a default-tone `ToolbarControlGroup` in either overlaid bar takes the
|
|
291
|
+
normal text color for its controls, so labels and icons keep AA over the
|
|
292
|
+
content beneath. The material has the same opaque fallbacks; in forced
|
|
293
|
+
colors the toolbar paints `Canvas` and its always-present 1px top border
|
|
294
|
+
becomes a `CanvasText` edge, which the measurement includes.
|
|
295
|
+
|
|
296
|
+
`SplitView`'s `compactStack.bottomToolbarPresentation` and a Workbench
|
|
297
|
+
navigation panel's `navStack.bottomToolbarPresentation` forward it too.
|
|
298
|
+
|
|
299
|
+
## Safe areas
|
|
300
|
+
|
|
301
|
+
The stack paints through a device's unsafe areas. Its chrome pads for the top
|
|
302
|
+
and side insets, its bottom toolbar for the bottom and side insets, and each
|
|
303
|
+
view pads the remaining edges inside its scroller, so content scrolls under the
|
|
304
|
+
unsafe area but can always be scrolled clear. A view whose only child is a
|
|
305
|
+
`Pane` or layout lets that child own the insets. See [Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
40
306
|
|
|
41
307
|
## Transitions
|
|
42
308
|
|
|
43
309
|
`wireNavStack(root, { onBack, duration? })` observes the rendered stack and
|
|
44
310
|
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
|
-
|
|
311
|
+
view slides back off it over the revealed view; and snapshots of the previous
|
|
312
|
+
top and bottom chrome cross-fade into the active view's chrome. The preserved
|
|
313
|
+
underlying view remains visible during a push, while remaining inaccessible.
|
|
314
|
+
Starting transforms and opacity apply instantly before the transition begins.
|
|
315
|
+
A new navigation settles the previous transition and cancels its pending frames
|
|
316
|
+
and cleanup timers; disposal removes temporary copies and exiting views. Focus moves to
|
|
317
|
+
the new top view independently of animation duration. It returns a disposer.
|
|
318
|
+
The animation honors `prefers-reduced-motion` (transitions collapse to instant)
|
|
319
|
+
and `duration: 0` disables it. Applicable at every device size and inside
|
|
320
|
+
dialogs.
|
package/docs/recipes.md
CHANGED
|
@@ -1,62 +1,75 @@
|
|
|
1
1
|
# Production composition recipes
|
|
2
2
|
|
|
3
|
-
These
|
|
4
|
-
code. Open each stable UX-catalog route to run it, then copy the linked TSX
|
|
5
|
-
|
|
6
|
-
and keep state in a per-instance application adapter. They
|
|
7
|
-
monolithic components.
|
|
3
|
+
These ten reference compositions sit between individual primitives and product
|
|
4
|
+
code. Open each stable UX-catalog route to run it, then copy the linked TSX. The
|
|
5
|
+
examples import public package subpaths, compose components through their
|
|
6
|
+
props and tokens, and keep state in a per-instance application adapter. They
|
|
7
|
+
ship no stylesheet of their own and are not new monolithic components.
|
|
8
8
|
|
|
9
9
|
Copy the recipe source together with the catalog-independent
|
|
10
10
|
[`mount-recipe.ts`](../ux-demo/recipes/mount-recipe.ts) adapter. It mounts the
|
|
11
11
|
controller at one stable application root, uses `delegateActions()` for recipe
|
|
12
|
-
commands, forwards form and dialog lifecycle events,
|
|
13
|
-
|
|
14
|
-
idempotent disposer:
|
|
12
|
+
commands, forwards form and dialog lifecycle events, runs the recipe's own
|
|
13
|
+
`wire()` (for example `wireWorkbench` or `wireSidebar`), retains every
|
|
14
|
+
disposer, and returns one idempotent disposer:
|
|
15
15
|
|
|
16
16
|
```ts
|
|
17
|
-
import { createRecipe } from
|
|
18
|
-
import { mountRecipe } from
|
|
17
|
+
import { createRecipe } from "./navigation-sidebar.js";
|
|
18
|
+
import { mountRecipe } from "./mount-recipe.js";
|
|
19
19
|
|
|
20
|
-
const root = document.querySelector<HTMLElement>(
|
|
20
|
+
const root = document.querySelector<HTMLElement>("#navigation")!;
|
|
21
21
|
const stopRecipe = mountRecipe(root, createRecipe(announce));
|
|
22
|
-
window.addEventListener(
|
|
22
|
+
window.addEventListener("pagehide", stopRecipe, { once: true });
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
The adapter is delivered as reference source, not a new package runtime export.
|
|
26
26
|
`delegate()` remains a valid alternative when an application needs selector-
|
|
27
27
|
specific dispatch; either way, wire once at a stable root and retain disposal.
|
|
28
28
|
|
|
29
|
-
## Desktop
|
|
30
|
-
|
|
31
|
-
[Open the recipe](../ux-demo/?component=recipe-app-shell) · [TSX source](../ux-demo/recipes/app-shell.tsx)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
## Desktop Application Shell
|
|
30
|
+
|
|
31
|
+
[Open the recipe](../ux-demo/?component=recipe-app-shell) · [TSX source](../ux-demo/recipes/app-shell.tsx)
|
|
32
|
+
|
|
33
|
+
A filling `List` (`fill`, with the recipe's `data-*` markers through
|
|
34
|
+
`rootAttributes`) stacks the app-bar `Toolbar` above a `Workbench`
|
|
35
|
+
(`@kerfjs/ui/workbench`): resizable navigation and inspector rails around the
|
|
36
|
+
task list. Each rail composes its own panel toolbar — a default-size title and
|
|
37
|
+
the standard hide toggle — and the work area's `mainToolbar` carries the xl
|
|
38
|
+
view title. While a rail is hidden, `Workbench` relocates its show toggle into
|
|
39
|
+
the work-area toolbar on the same logical edge (leading for the navigation
|
|
40
|
+
rail, trailing for the inspector), and `wireWorkbench` hands focus between the
|
|
41
|
+
two positions. Collapse a rail completely rather than preserving an empty icon
|
|
42
|
+
rail. Only the three real panes own a `.kui-pane__content` scroll owner; no
|
|
43
|
+
frame `Pane` wraps the layout in a scroll owner that never scrolls, and the
|
|
44
|
+
app-bar `Toolbar` claims the top edge and both sides with its own
|
|
45
|
+
`safeAreaEdges`.
|
|
46
|
+
|
|
47
|
+
On a narrow container the rails overlay the task list one at a time instead of
|
|
48
|
+
squeezing it, leaving a 44px strip on the far side that dismisses the overlay
|
|
49
|
+
(`responsiveOverlayAt`, on by default; `compactOverlay: 'full'` covers the
|
|
50
|
+
whole width). The app owns each rail's collapsed and size signals — which
|
|
51
|
+
`wireWorkbench` keeps in sync with resizing and overlay dismissal — plus
|
|
52
|
+
routing, persistence, and data. Adapt only public `--kui-layout-*` and
|
|
53
|
+
component variables.
|
|
54
|
+
|
|
55
|
+
## Navigation Sidebar
|
|
43
56
|
|
|
44
57
|
[Open the recipe](../ux-demo/?component=recipe-navigation-sidebar) · [TSX source](../ux-demo/recipes/navigation-sidebar.tsx)
|
|
45
58
|
|
|
46
59
|
One unpadded `.kui-pane` owns toolbar/content/footer structure. Its
|
|
47
|
-
`.kui-content` uses 24px major gaps; `ListHeader`, `ListItem`, and
|
|
48
|
-
|
|
60
|
+
`.kui-content` uses 24px major gaps; `ListHeader`, `ListItem`, and
|
|
61
|
+
`ContentItem` children own their 8px margin, 1px border, and 8px padding.
|
|
49
62
|
Rows and footer toolbar groups remain 44px tall. The app owns routes,
|
|
50
63
|
permissions, labels, selection, valid section counts and their localized
|
|
51
64
|
`countLabel` phrases, non-count badge content, disclosure state, and revealed
|
|
52
65
|
content. A toggled `ListHeader` supplies the production `DisclosureArrow` when
|
|
53
66
|
no custom `actionIcon` is needed; ordinary navigation rows stay chevron-free.
|
|
54
67
|
|
|
55
|
-
## Workspace
|
|
68
|
+
## Workspace Header
|
|
56
69
|
|
|
57
70
|
[Open the recipe](../ux-demo/?component=recipe-workspace-header) · [TSX source](../ux-demo/recipes/workspace-header.tsx)
|
|
58
71
|
|
|
59
|
-
|
|
72
|
+
The page heading is a direct `Toolbar`/`ToolbarText` composition while one control cluster holds secondary,
|
|
60
73
|
overflow, and primary actions. The app owns authorization and command policy;
|
|
61
74
|
controls relocate without changing focus order.
|
|
62
75
|
|
|
@@ -64,34 +77,48 @@ controls relocate without changing focus order.
|
|
|
64
77
|
|
|
65
78
|
[Open the recipe](../ux-demo/?component=recipe-list-detail-dialog) · [TSX source](../ux-demo/recipes/list-detail-dialog.tsx)
|
|
66
79
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
The
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
A list-detail dialog is laid out like a `Workbench` with a left sidebar: on
|
|
81
|
+
roomy devices the list is a full-height sidebar and the detail is a full-height
|
|
82
|
+
main column, each a `Pane` with its own top `Toolbar`. The sidebar's toolbar
|
|
83
|
+
carries its quiet default-size title (and it may add a bottom toolbar for
|
|
84
|
+
sidebar-only actions); the main column's toolbar carries the dialog's primary
|
|
85
|
+
extra-large title and the close control, and its footer carries the record
|
|
86
|
+
actions. The Web Awesome dialog therefore renders `without-header` there —
|
|
87
|
+
its label still names the modal — and the close button uses
|
|
88
|
+
`data-dialog="close"`. Web Awesome keeps modal focus and Escape, and the thin
|
|
89
|
+
recipe adapter restores the invoking control after the hide event.
|
|
90
|
+
`DialogSurface` chooses the large modal with no body inset, because the panes
|
|
91
|
+
own their geometry. Its explicit 16px `viewportGutter` and `maxHeight="viewport"`
|
|
92
|
+
bound the roomy modal to the dynamic viewport; the compact fullscreen
|
|
93
|
+
presentation retains its existing geometry. Application render state chooses
|
|
94
|
+
the presentation and can likewise choose gutter/cap values for a compact modal.
|
|
95
|
+
On compact devices the dialog becomes a full-screen sheet
|
|
96
|
+
with its own labeled header and footer actions, and `SplitView` becomes a
|
|
97
|
+
`NavStack` drill-down whose back control the application pops. The
|
|
98
|
+
application owns open state, selection, the pushed detail, dismissal policy,
|
|
99
|
+
and record actions. Do not put the primary title in a header spanning both
|
|
100
|
+
columns, rebuild the dialog, or reach into private shadow parts.
|
|
101
|
+
|
|
102
|
+
## Composer Form
|
|
80
103
|
|
|
81
104
|
[Open the recipe](../ux-demo/?component=recipe-composer-form) · [TSX source](../ux-demo/recipes/composer-form.tsx)
|
|
82
105
|
|
|
83
|
-
`
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
106
|
+
A direct `ToolbarText` supplies the task title, with app-owned supporting copy
|
|
107
|
+
below; their ids are referenced by the form. `ListInsetText` gives that bare
|
|
108
|
+
supporting copy the same content-item text inset as the fields. The title and
|
|
109
|
+
supporting line share a nested heading `List` with `gap="none"`, so the heading
|
|
110
|
+
unit stays together instead of taking the form's 24px section gap. Production
|
|
111
|
+
fields own labels, help, and native focus. One `List` owns the 24px major
|
|
112
|
+
rhythm; the field `List` and the action `Row` use `controlInsets` to sit on the
|
|
113
|
+
shared 8px inline gutter with 8px gaps between related controls, rather than
|
|
114
|
+
acquiring a second content-item padding inset. The app owns
|
|
88
115
|
validation, drafts, permissions, and transport. Persistent error or success
|
|
89
116
|
feedback is the only nested semantic surface and uses `StateBanner`, not a toast.
|
|
90
117
|
Because upgraded Web Awesome fields retain live value properties, controlled
|
|
91
118
|
resets synchronize both those properties and the rendered value attributes;
|
|
92
119
|
the Reset action also announces `Draft reset` through the catalog live region.
|
|
93
120
|
|
|
94
|
-
## List
|
|
121
|
+
## List Workspace States
|
|
95
122
|
|
|
96
123
|
[Open the recipe](../ux-demo/?component=recipe-list-workspace-states) · [TSX source](../ux-demo/recipes/list-workspace-states.tsx)
|
|
97
124
|
|
|
@@ -100,54 +127,75 @@ populated, stale/background refresh, and error/retry states. The recipe owns
|
|
|
100
127
|
feedback placement; the app owns fetching, cache age, retry policy, and domain
|
|
101
128
|
rows.
|
|
102
129
|
|
|
103
|
-
## Compact
|
|
130
|
+
## Compact Toolbar Choices and Actions
|
|
104
131
|
|
|
105
132
|
[Open the recipe](../ux-demo/?component=recipe-compact-toolbar) · [TSX source](../ux-demo/recipes/compact-toolbar.tsx)
|
|
106
133
|
|
|
107
134
|
Use `ToolbarControlGroup` for related commands, `SegmentedControl` for a few
|
|
108
135
|
visible exclusive choices, `Select` for a longer value list, and an ordinary
|
|
109
|
-
button for an independent command.
|
|
110
|
-
|
|
136
|
+
button for an independent command. Even that independent button sits in a
|
|
137
|
+
single-control `ToolbarControlGroup`, which keeps its height, pill shape, focus,
|
|
138
|
+
and hover treatment aligned with the adjacent toolbar controls. At compact
|
|
139
|
+
widths the toolbar stacks its zones and wraps whole trailing groups onto another
|
|
140
|
+
row, so the last action is never clipped. The app owns values, actions,
|
|
141
|
+
persistence, and responsive priority.
|
|
111
142
|
|
|
112
|
-
## Navigation
|
|
143
|
+
## Navigation Stack
|
|
113
144
|
|
|
114
145
|
[Open the recipe](../ux-demo/?component=recipe-navigation-stack) · [TSX source](../ux-demo/recipes/navigation-stack.tsx)
|
|
115
146
|
|
|
116
147
|
Drill from a library list into a detail and back with `NavStack`
|
|
117
148
|
(`@kerfjs/ui/nav-stack`): the app owns the stack as a signal of views and
|
|
118
149
|
pushes/pops it, `NavStack` renders it, and `wireNavStack` slides the content and
|
|
119
|
-
settles the chrome (reduced motion collapses the slide to instant).
|
|
120
|
-
|
|
150
|
+
settles the chrome (reduced motion collapses the slide to instant). See the
|
|
151
|
+
layout guide
|
|
121
152
|
[`app-layouts.md`](app-layouts.md) for choosing among `NavStack`, `SplitView`,
|
|
122
|
-
`Workbench`, and `
|
|
153
|
+
`Workbench`, and `TabNavigator`.
|
|
123
154
|
|
|
124
|
-
## Loading
|
|
155
|
+
## Loading Inspector
|
|
125
156
|
|
|
126
157
|
[Open the recipe](../ux-demo/?component=recipe-loading-inspector) · [TSX source](../ux-demo/recipes/loading-inspector.tsx)
|
|
127
158
|
|
|
128
159
|
A record inspector whose per-record values load asynchronously. Every
|
|
129
|
-
value-bearing component (`
|
|
160
|
+
value-bearing component (`ToolbarText`, `ValueTable`/`ValueTableRow`, `Select`,
|
|
130
161
|
`SegmentedControl`, `ListItem`, `StateBanner`) takes its `placeholder` from one
|
|
131
162
|
loading flag, so the same real chrome renders a faithful loading state and then
|
|
132
163
|
the populated record — no separate skeleton markup. The composition is the point;
|
|
133
|
-
`Skeleton` is the primitive it builds on.
|
|
164
|
+
`Skeleton` is the primitive it builds on. Its heading `Toolbar` uses
|
|
165
|
+
`responsive="wrap"`, so on a narrow inspector the toggle moves below a whole
|
|
166
|
+
record title instead of truncating it. The app owns the loading lifecycle and
|
|
134
167
|
which values are still unknown.
|
|
135
168
|
|
|
136
|
-
## Collapsible
|
|
169
|
+
## Collapsible Sidebar
|
|
137
170
|
|
|
138
171
|
[Open the recipe](../ux-demo/?component=recipe-collapsible-sidebar) · [TSX source](../ux-demo/recipes/collapsible-sidebar.tsx)
|
|
139
172
|
|
|
140
173
|
A mini app frame whose left navigation rail and bottom activity drawer are
|
|
141
174
|
standalone `CollapsiblePanel`s (`@kerfjs/ui/collapsible-panel`) driven by
|
|
142
|
-
`wireSidebar` (`@kerfjs/ui/wire-sidebar`). `
|
|
143
|
-
standard per-side
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
175
|
+
`wireSidebar` (`@kerfjs/ui/wire-sidebar`). Each panel takes a `toolbar` — a
|
|
176
|
+
title plus the standard per-side toggle — so the hide control lives in the
|
|
177
|
+
panel's own header, and `CollapsiblePanelRelocated` renders the matching show
|
|
178
|
+
control only while the panel is collapsed, so exactly one control owns each
|
|
179
|
+
action and a collapsed panel is still reachable. The rail's relocated toggle
|
|
180
|
+
leads the always-visible main header; the drawer's sits in a
|
|
181
|
+
`FloatingToolbar` passed as the drawer's own `restoreControl`, which the panel
|
|
182
|
+
floats in its column's safe-area-aware bottom-end corner, next to where the
|
|
183
|
+
drawer opens — do not hand-roll a conditional floating control beside the
|
|
184
|
+
panel. `wireSidebar` owns the toggle delegation, moves focus into a
|
|
185
|
+
panel on open, restores it on close (to the trigger, or to the panel's expand toggle when
|
|
186
|
+
the trigger sits inside the collapsed panel), and — when a `deviceClass()` reports
|
|
187
|
+
`compact` — presents the panels as a dismissable **overlay** (backdrop, Escape
|
|
188
|
+
and backdrop-click collapse, and a trapped Tab ring, the ARIA dialog pattern).
|
|
189
|
+
The overlay starts closed and opens only from a toggle; the rail's signal is
|
|
190
|
+
seeded from the device class with `inlineCollapsed: false`, so the first compact
|
|
191
|
+
render has no overlay and a wide crossing restores the open inline rail. It
|
|
192
|
+
also persists each panel's inline collapsed state through a supplied storage hook. A
|
|
193
|
+
filling `Row` (`fill` plus `rootAttributes`) is the root: it takes the frame's
|
|
194
|
+
definite height and places the rail beside a `List` column, and a one-column
|
|
195
|
+
`Grid` grows the main pane above the drawer. Because the panels sit at the real
|
|
196
|
+
frame edges, each grows through its edge's safe area and hands that edge back to
|
|
197
|
+
its siblings when it collapses; the drawer's activity log is a `ValueTable`. The app owns each
|
|
198
|
+
`collapsed` signal, the panel sizes, and the content; the wire owns the
|
|
151
199
|
ephemeral interaction. For a full three-pane shell use `Workbench` instead — see
|
|
152
200
|
[`app-layouts.md`](app-layouts.md). This recipe is covered end-to-end across
|
|
153
201
|
Chromium, Firefox, and WebKit by `tests/browser/collapsible-sidebar-recipe.spec.ts`.
|
|
@@ -159,9 +207,17 @@ Chromium, Firefox, and WebKit by `tests/browser/collapsible-sidebar-recipe.spec.
|
|
|
159
207
|
- For direct `wa-*` JSX, import types from `@kerfjs/ui/webawesome`. Import only
|
|
160
208
|
individual Web Awesome registration modules and theme them with
|
|
161
209
|
`@kerfjs/ui/webawesome.css`.
|
|
162
|
-
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
210
|
+
- Compose, don't style. A recipe ships no stylesheet, sets no inline style, and
|
|
211
|
+
names no class outside the published layout vocabulary (`.kui-content`,
|
|
212
|
+
`.kui-control-cluster`, …) and themed Web Awesome classes — a content item is
|
|
213
|
+
a `ContentItem`, not a hand-written `.kui-content-item`; it configures
|
|
214
|
+
components through props, `rootAttributes`, and tokens. When a recipe needs a
|
|
215
|
+
capability no component offers, record it as a component gap rather than
|
|
216
|
+
papering over it with CSS. `npm run check:recipes` enforces these rules on
|
|
217
|
+
every file in `ux-demo/recipes/`.
|
|
218
|
+
- Each recipe also exports a catalog-only `presentation`: the `CatalogExample`
|
|
219
|
+
viewport that frames it in the UX catalog and its ownership note. An
|
|
220
|
+
application that copies the recipe ignores that export and mounts the
|
|
221
|
+
controller into its own container.
|
|
166
222
|
- Start from the copyable mount adapter, or reproduce its complete boundary:
|
|
167
223
|
wire stable `data-action` hooks once and retain every disposer.
|