@kerfjs/ui 4.5.0-beta.1 → 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 +461 -116
- package/ai/application-ui-diagnostic-ids-v1.json +23 -1
- package/ai/application-ui-profile-sync.cjs +21 -2
- package/ai/application-ui-profile.d.ts +4 -0
- package/ai/application-ui-profile.defaults.json +63 -8
- package/ai/application-ui-profile.mjs +28 -1
- package/ai/application-ui-profile.schema.json +10 -0
- package/ai/catalog-authoring.json +13 -4
- package/ai/catalog-authoring.schema.json +52 -8
- package/ai/compile-time-contracts-v1.json +63 -16
- package/ai/compile-time-contracts-v1.schema.json +4 -1
- package/ai/component-catalog-extension.schema.json +25 -0
- package/ai/component-catalog.json +5585 -1175
- package/ai/component-catalog.schema.json +78 -1
- package/ai/component-class-owners.cjs +83 -0
- package/ai/component-composition-extension.d.ts +7 -0
- package/ai/component-composition-extension.schema.json +7 -0
- package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +281 -49
- 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 +3851 -441
- package/ai/skill.md +402 -70
- package/ai/webawesome-jsx-signatures-v1.md +9 -2
- package/analyzer/cli.mjs +5 -2
- package/analyzer/component-ownership.d.mts +72 -0
- package/analyzer/component-ownership.mjs +429 -0
- package/analyzer/index.d.mts +8 -0
- package/analyzer/index.mjs +1687 -49
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -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/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-item.js +1 -0
- package/dist/browser/nav-stack.js +11 -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/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 +17 -1
- package/dist/catalog-resources.js +5 -5
- package/dist/catalog-resources.js.map +1 -1
- package/dist/catalog.d.ts +123 -121
- package/dist/catalog.js +598 -269
- 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-Y6LYKFXY.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-QO55FN2Y.js → chunk-AN5IWMTM.js} +7 -3
- 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-PX3YSS5C.js → chunk-B53PS2LE.js} +5 -3
- 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-RKVQEH4J.js → chunk-CVD5IZGB.js} +10 -5
- 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-KWWR5VMS.js → chunk-DZJ4GBSP.js} +19 -5
- 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-JRKSK2HX.js → chunk-INI4WDWC.js} +53 -7
- 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-M7JBER5U.js → chunk-JOR5LGYE.js} +18 -4
- 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-SRSJO5QE.js → chunk-KH4KEMSP.js} +34 -3
- 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-7KEUJIIC.js → chunk-MF6ZUUJZ.js} +93 -11
- 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-IJBSZ4NX.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-LPOMRC4C.js → chunk-S3ECMF23.js} +11 -3
- 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-PSKN344N.js → chunk-T4WJ5VGP.js} +63 -12
- 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-Y45PPBDV.js → chunk-TGLUDQP2.js} +47 -14
- 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 +104 -27
- 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 +1 -1
- 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 +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 +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 +59 -20
- package/dist/index.js +66 -29
- package/dist/list-action-row.d.ts +69 -12
- package/dist/list-action-row.js +5 -1
- package/dist/list-header.d.ts +36 -2
- package/dist/list-header.js +4 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
- package/dist/list-inset-control.d.ts +10 -4
- package/dist/list-inset-control.js +1 -1
- package/dist/list-inset-text.d.ts +17 -12
- package/dist/list-inset-text.js +2 -1
- package/dist/list-item.d.ts +49 -5
- package/dist/list-item.js +4 -1
- package/dist/list.d.ts +121 -12
- package/dist/list.js +5 -1
- 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 +111 -7
- package/dist/pane.js +2 -1
- 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 +7 -4
- 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 +95 -6
- 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 +88 -9
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +37 -6
- 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 -575
- 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 +87 -6
- package/dist/styles/foundation.css +254 -53
- 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 +1 -21
- package/dist/styles/list-action-row.css +323 -17
- package/dist/styles/list-header.css +128 -59
- package/dist/styles/list-inset-control.css +25 -2
- package/dist/styles/list-inset-text.css +27 -12
- package/dist/styles/list-item.css +371 -33
- package/dist/styles/list.css +214 -7
- 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 +322 -2
- 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 +34 -3
- package/dist/styles/select.css +338 -23
- 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 +141 -42
- package/dist/styles/styles.css +22 -1
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +13 -4
- 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 +886 -42
- package/dist/styles/toolbar-text.css +184 -7
- package/dist/styles/toolbar.css +363 -17
- package/dist/styles/value-table.css +115 -7
- package/dist/styles/webawesome.css +282 -20
- 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 +23 -4
- package/dist/sunken-panel.js +2 -1
- 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 +31 -6
- 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 -59
- 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 +87 -4
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +46 -12
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +71 -9
- 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 +88 -13
- package/dist/wire-catalog.js +240 -206
- 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 +312 -16
- 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 +122 -19
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.d.ts +1 -0
- 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 +5 -1
- 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 -62
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +617 -32
- 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 +403 -110
- package/docs/collapsible-panel.md +272 -16
- package/docs/component-contract.md +700 -79
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +908 -79
- 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 -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 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/compact-dark.svg +1 -1
- package/docs/design/templates/list/compact.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- 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 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- 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 -1
- package/docs/design/templates/list-header.svg +1 -1
- 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 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- 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 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/skeleton-dark.svg +1 -1
- package/docs/design/templates/skeleton.svg +1 -1
- 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 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- 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 -1
- package/docs/design/templates/state-banner.svg +1 -1
- 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 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
- package/docs/design/templates/token-search-field/empty.svg +1 -1
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
- package/docs/design/templates/token-search-field/tokens.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- 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/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 -1
- package/docs/design/templates/toolbar-control-group.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- 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 -1
- package/docs/design/templates/toolbar-text.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- 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 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design/templates.md +19 -9
- package/docs/design-philosophy.md +58 -11
- package/docs/device-class.md +2 -1
- package/docs/document-baseline.md +93 -0
- package/docs/examples/application-ui-profile.json +8 -8
- package/docs/examples/command-palette-adapter.tsx +9 -7
- package/docs/examples/component-catalog-extension.json +8 -1
- package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +8 -9
- package/docs/layout.md +764 -40
- package/docs/nav-stack.md +275 -11
- package/docs/recipes.md +125 -69
- package/docs/split-view.md +94 -5
- package/docs/sunken-panel.md +54 -1
- package/docs/surface-scaffold.md +270 -0
- package/docs/tab-navigator.md +255 -0
- package/docs/type-contracts.md +57 -22
- package/docs/ui-analyzer.md +334 -14
- package/docs/ui-doctor.md +207 -10
- package/docs/ui-evaluator.md +17 -0
- package/docs/ux-demo.md +47 -16
- package/docs/webawesome-theme.md +148 -14
- package/docs/workbench.md +600 -11
- package/docs/writing.md +152 -0
- package/doctor/cli.mjs +5 -0
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/config.schema.json +26 -0
- package/doctor/copy-capitalization-checks.mjs +591 -0
- package/doctor/eslint-diagnostics.d.mts +16 -0
- package/doctor/eslint-diagnostics.mjs +17 -0
- package/doctor/index.d.mts +6 -0
- package/doctor/index.mjs +214 -47
- package/evaluator/index.mjs +73 -8
- package/llms.txt +702 -56
- package/package.json +256 -25
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/traversal-exclusions.mjs +60 -1
- package/ux-demo/recipes/app-shell.tsx +181 -189
- package/ux-demo/recipes/collapsible-sidebar.tsx +177 -139
- package/ux-demo/recipes/compact-toolbar.tsx +120 -101
- package/ux-demo/recipes/composer-form.tsx +86 -62
- package/ux-demo/recipes/list-detail-dialog.tsx +219 -114
- package/ux-demo/recipes/list-workspace-states.tsx +95 -80
- package/ux-demo/recipes/loaders.ts +5 -2
- package/ux-demo/recipes/loading-inspector.tsx +157 -117
- package/ux-demo/recipes/mount-recipe.ts +0 -5
- package/ux-demo/recipes/navigation-sidebar.tsx +98 -83
- package/ux-demo/recipes/navigation-stack.tsx +42 -29
- package/ux-demo/recipes/types.ts +14 -1
- package/ux-demo/recipes/workspace-header.tsx +77 -51
- package/vite-ux-review.d.mts +83 -0
- package/vite-ux-review.mjs +120 -0
- package/ai/component-catalog-extension-v2.d.ts +0 -7
- package/ai/component-catalog-extension-v2.schema.json +0 -7
- package/ai/component-catalog-v2.d.ts +0 -67
- package/ai/component-catalog-v2.json +0 -4675
- package/ai/component-catalog-v2.schema.json +0 -246
- package/dist/browser/panel-header.js +0 -7
- package/dist/chunk-5VTB2BKP.js +0 -35
- package/dist/chunk-5VTB2BKP.js.map +0 -1
- package/dist/chunk-6WTETUZ6.js +0 -21
- package/dist/chunk-6WTETUZ6.js.map +0 -1
- package/dist/chunk-7KEUJIIC.js.map +0 -1
- package/dist/chunk-7XRDUG4Y.js +0 -58
- package/dist/chunk-7XRDUG4Y.js.map +0 -1
- package/dist/chunk-B3A3IVO5.js +0 -83
- package/dist/chunk-B3A3IVO5.js.map +0 -1
- package/dist/chunk-DPDBVKNA.js +0 -113
- package/dist/chunk-DPDBVKNA.js.map +0 -1
- package/dist/chunk-FEAMR7S4.js +0 -68
- package/dist/chunk-FEAMR7S4.js.map +0 -1
- package/dist/chunk-FEY65TBV.js +0 -15
- package/dist/chunk-FEY65TBV.js.map +0 -1
- package/dist/chunk-IJBSZ4NX.js.map +0 -1
- package/dist/chunk-J5BFYY7Q.js +0 -35
- package/dist/chunk-J5BFYY7Q.js.map +0 -1
- package/dist/chunk-JRKSK2HX.js.map +0 -1
- package/dist/chunk-KWWR5VMS.js.map +0 -1
- package/dist/chunk-LPOMRC4C.js.map +0 -1
- package/dist/chunk-M7JBER5U.js.map +0 -1
- package/dist/chunk-NENBUYX5.js +0 -79
- package/dist/chunk-NENBUYX5.js.map +0 -1
- package/dist/chunk-NWSEP5RT.js +0 -117
- package/dist/chunk-NWSEP5RT.js.map +0 -1
- package/dist/chunk-OJWWHFH3.js +0 -426
- package/dist/chunk-OJWWHFH3.js.map +0 -1
- package/dist/chunk-PSKN344N.js.map +0 -1
- package/dist/chunk-PX3YSS5C.js.map +0 -1
- package/dist/chunk-QO55FN2Y.js.map +0 -1
- package/dist/chunk-R7ZWUN64.js +0 -38
- package/dist/chunk-R7ZWUN64.js.map +0 -1
- package/dist/chunk-RKVQEH4J.js.map +0 -1
- package/dist/chunk-SRSJO5QE.js.map +0 -1
- package/dist/chunk-SYDMYBPG.js +0 -31
- package/dist/chunk-SYDMYBPG.js.map +0 -1
- package/dist/chunk-TB6DY7H5.js +0 -25
- package/dist/chunk-TB6DY7H5.js.map +0 -1
- package/dist/chunk-UFZKLBCF.js +0 -108
- package/dist/chunk-UFZKLBCF.js.map +0 -1
- package/dist/chunk-UKKSMZYT.js +0 -281
- package/dist/chunk-UKKSMZYT.js.map +0 -1
- package/dist/chunk-W2FK7ZNY.js +0 -26
- package/dist/chunk-W2FK7ZNY.js.map +0 -1
- package/dist/chunk-W5L2JSBY.js +0 -40
- package/dist/chunk-W5L2JSBY.js.map +0 -1
- package/dist/chunk-Y45PPBDV.js.map +0 -1
- package/dist/chunk-Y6LYKFXY.js.map +0 -1
- package/dist/divider-sides-267FA7sY.d.ts +0 -4
- package/dist/panel-header.d.ts +0 -42
- 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 -51
- package/dist/tab-scaffold.js.map +0 -1
- package/dist/wire-tab-scaffold.d.ts +0 -11
- package/dist/wire-tab-scaffold.js +0 -21
- 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 -1
- package/docs/design/templates/panel-header.svg +0 -1
- package/docs/tab-scaffold.md +0 -50
- package/ux-demo/recipes/recipes.css +0 -448
package/dist/wire-nav-stack.js
CHANGED
|
@@ -1,7 +1,36 @@
|
|
|
1
1
|
import { delegate } from 'kerfjs';
|
|
2
2
|
|
|
3
|
-
// src/wire-nav-stack.ts
|
|
3
|
+
// src/components/navigation/nav-stack/wiring/wire-nav-stack.ts
|
|
4
4
|
var DEFAULT_DURATION = 200;
|
|
5
|
+
var CHROME_OVERLAY = "data-chrome-overlay";
|
|
6
|
+
var BOTTOM_TOOLBAR_OVERLAY = "data-bottom-toolbar-overlay";
|
|
7
|
+
var OVERLAY_EDGES = [
|
|
8
|
+
{
|
|
9
|
+
presentation: "data-chrome-presentation",
|
|
10
|
+
element: ":scope > [data-nav-stack-chrome]:not([data-nav-chrome-copy])",
|
|
11
|
+
blockSize: "--_kui-nav-stack-chrome-block-size",
|
|
12
|
+
scrollbarInlineSize: "--_kui-nav-stack-scrollbar-inline-size",
|
|
13
|
+
// A Pane header lies beneath the chrome and starts its content below it.
|
|
14
|
+
paneChrome: ":scope > :is(.kui-pane__header, .kui-pane__toolbar)"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
presentation: "data-bottom-toolbar-presentation",
|
|
18
|
+
element: ":scope > [data-nav-stack-bottom]:not([data-nav-chrome-copy])",
|
|
19
|
+
blockSize: "--_kui-nav-stack-bottom-block-size",
|
|
20
|
+
scrollbarInlineSize: "--_kui-nav-stack-bottom-scrollbar-inline-size",
|
|
21
|
+
// A Pane footer lies beneath the toolbar and ends its content above it.
|
|
22
|
+
paneChrome: ":scope > .kui-pane__footer"
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
var NESTED_LAYOUT = ["nav-stack", "split-view", "workbench", "tab-scaffold"].map((name) => `[data-component="${name}"]`).join(", ");
|
|
26
|
+
var FOCUSABLE_SELECTOR = [
|
|
27
|
+
"a[href]",
|
|
28
|
+
"button:not([disabled])",
|
|
29
|
+
"input:not([disabled])",
|
|
30
|
+
"select:not([disabled])",
|
|
31
|
+
"textarea:not([disabled])",
|
|
32
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
33
|
+
].join(",");
|
|
5
34
|
function viewsOf(viewport) {
|
|
6
35
|
return Array.from(
|
|
7
36
|
viewport.querySelectorAll(":scope > .kui-nav-stack__view")
|
|
@@ -16,6 +45,16 @@ function topView(viewport) {
|
|
|
16
45
|
function reducedMotion(view) {
|
|
17
46
|
return typeof view.matchMedia === "function" && view.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
18
47
|
}
|
|
48
|
+
function chromeOf(section) {
|
|
49
|
+
return Array.from(
|
|
50
|
+
section.querySelectorAll(
|
|
51
|
+
":scope > [data-nav-stack-chrome]:not([data-nav-chrome-copy]), :scope > [data-nav-stack-bottom]:not([data-nav-chrome-copy])"
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function availableFocusTarget(element) {
|
|
56
|
+
return element instanceof HTMLElement && element.isConnected && !element.matches('[disabled], [aria-disabled="true"]') && !element.closest('[inert], [hidden], [aria-hidden="true"]');
|
|
57
|
+
}
|
|
19
58
|
function wireNavStack(root, options = {}) {
|
|
20
59
|
const section = root.matches('[data-component="nav-stack"]') ? root : root.querySelector('[data-component="nav-stack"]');
|
|
21
60
|
const viewport = section?.querySelector("[data-nav-stack-viewport]");
|
|
@@ -23,6 +62,13 @@ function wireNavStack(root, options = {}) {
|
|
|
23
62
|
};
|
|
24
63
|
const view = section.ownerDocument.defaultView ?? window;
|
|
25
64
|
const duration = options.duration ?? DEFAULT_DURATION;
|
|
65
|
+
const previousDuration = section.style.getPropertyValue(
|
|
66
|
+
"--kui-nav-stack-transition-duration"
|
|
67
|
+
);
|
|
68
|
+
section.style.setProperty(
|
|
69
|
+
"--kui-nav-stack-transition-duration",
|
|
70
|
+
`${Math.max(0, duration)}ms`
|
|
71
|
+
);
|
|
26
72
|
const disposeBack = delegate(
|
|
27
73
|
section,
|
|
28
74
|
"click",
|
|
@@ -31,6 +77,37 @@ function wireNavStack(root, options = {}) {
|
|
|
31
77
|
);
|
|
32
78
|
let activeKey = topView(viewport)?.dataset.navKey;
|
|
33
79
|
const timers = /* @__PURE__ */ new Set();
|
|
80
|
+
const frames = /* @__PURE__ */ new Set();
|
|
81
|
+
const frame = (fn) => {
|
|
82
|
+
const id = view.requestAnimationFrame(() => {
|
|
83
|
+
frames.delete(id);
|
|
84
|
+
fn();
|
|
85
|
+
});
|
|
86
|
+
frames.add(id);
|
|
87
|
+
};
|
|
88
|
+
const finishTransition = () => {
|
|
89
|
+
for (const id of frames) view.cancelAnimationFrame(id);
|
|
90
|
+
frames.clear();
|
|
91
|
+
for (const id of timers) view.clearTimeout(id);
|
|
92
|
+
timers.clear();
|
|
93
|
+
section.querySelectorAll(":scope > [data-nav-chrome-copy]").forEach((element) => element.remove());
|
|
94
|
+
chromeOf(section).forEach(
|
|
95
|
+
(element) => element.classList.remove("kui-nav-stack__chrome--entering")
|
|
96
|
+
);
|
|
97
|
+
viewsOf(viewport).forEach((element) => {
|
|
98
|
+
if (element.dataset.navExiting === "true") element.remove();
|
|
99
|
+
else {
|
|
100
|
+
element.classList.remove("kui-nav-stack__view--entering");
|
|
101
|
+
delete element.dataset.navRevealed;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
delete section.dataset.navChromeTransition;
|
|
105
|
+
};
|
|
106
|
+
const rememberedFocus = /* @__PURE__ */ new Map();
|
|
107
|
+
const generatedFallbacks = /* @__PURE__ */ new Map();
|
|
108
|
+
let chromeSnapshots = chromeOf(section).map(
|
|
109
|
+
(element) => element.cloneNode(true)
|
|
110
|
+
);
|
|
34
111
|
const settle = (fn) => {
|
|
35
112
|
if (duration <= 0 || reducedMotion(view)) {
|
|
36
113
|
fn();
|
|
@@ -48,53 +125,272 @@ function wireNavStack(root, options = {}) {
|
|
|
48
125
|
el.classList.add("kui-nav-stack__view--entering");
|
|
49
126
|
if (animated) {
|
|
50
127
|
void el.offsetWidth;
|
|
51
|
-
|
|
52
|
-
() => el.classList.remove("kui-nav-stack__view--entering")
|
|
53
|
-
);
|
|
128
|
+
frame(() => el.classList.remove("kui-nav-stack__view--entering"));
|
|
54
129
|
} else {
|
|
55
130
|
el.classList.remove("kui-nav-stack__view--entering");
|
|
56
131
|
}
|
|
57
132
|
} else if (animated) {
|
|
58
|
-
|
|
59
|
-
() => el.classList.add("kui-nav-stack__view--exiting")
|
|
60
|
-
);
|
|
133
|
+
frame(() => el.classList.add("kui-nav-stack__view--exiting"));
|
|
61
134
|
} else {
|
|
62
135
|
el.classList.add("kui-nav-stack__view--exiting");
|
|
63
136
|
}
|
|
64
137
|
};
|
|
138
|
+
const rememberFocusedView = (target) => {
|
|
139
|
+
if (!(target instanceof HTMLElement)) return;
|
|
140
|
+
const owner = target.closest(".kui-nav-stack__view");
|
|
141
|
+
const key = owner?.dataset.navKey;
|
|
142
|
+
if (key && owner !== target && viewport.contains(owner))
|
|
143
|
+
rememberedFocus.set(key, target);
|
|
144
|
+
};
|
|
145
|
+
const focusInto = (targetView) => {
|
|
146
|
+
const key = targetView.dataset.navKey;
|
|
147
|
+
const remembered = key ? rememberedFocus.get(key) : void 0;
|
|
148
|
+
const preferred = Array.from(
|
|
149
|
+
targetView.querySelectorAll("[data-nav-focus]")
|
|
150
|
+
).find(availableFocusTarget);
|
|
151
|
+
const first = Array.from(
|
|
152
|
+
targetView.querySelectorAll(FOCUSABLE_SELECTOR)
|
|
153
|
+
).find(availableFocusTarget);
|
|
154
|
+
const target = (availableFocusTarget(remembered) && targetView.contains(remembered) ? remembered : void 0) ?? preferred ?? first;
|
|
155
|
+
if (target) {
|
|
156
|
+
target.focus({ preventScroll: true });
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!generatedFallbacks.has(targetView)) {
|
|
160
|
+
generatedFallbacks.set(
|
|
161
|
+
targetView,
|
|
162
|
+
targetView.hasAttribute("tabindex") ? targetView.getAttribute("tabindex") : null
|
|
163
|
+
);
|
|
164
|
+
targetView.tabIndex = -1;
|
|
165
|
+
}
|
|
166
|
+
targetView.focus({ preventScroll: true });
|
|
167
|
+
};
|
|
168
|
+
const edges = OVERLAY_EDGES.map((edge) => [
|
|
169
|
+
edge,
|
|
170
|
+
{ covers: false }
|
|
171
|
+
]);
|
|
172
|
+
const measuredEdge = (state) => state.element !== void 0 && state.size !== void 0;
|
|
173
|
+
let measuredScroller;
|
|
174
|
+
let scrollbarSize = 0;
|
|
175
|
+
const writeProperty = (name, value) => {
|
|
176
|
+
if (section.style.getPropertyValue(name) === value) return;
|
|
177
|
+
if (value) section.style.setProperty(name, value);
|
|
178
|
+
else section.style.removeProperty(name);
|
|
179
|
+
};
|
|
180
|
+
const publishOverlay = () => {
|
|
181
|
+
for (const [edge, state] of edges) {
|
|
182
|
+
const measured = measuredEdge(state);
|
|
183
|
+
writeProperty(edge.blockSize, measured ? `${state.size}px` : "");
|
|
184
|
+
writeProperty(
|
|
185
|
+
edge.scrollbarInlineSize,
|
|
186
|
+
measured && state.covers && scrollbarSize > 0 ? `${scrollbarSize}px` : ""
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
if (section.getAttribute("style") === "") section.removeAttribute("style");
|
|
190
|
+
const [top, bottom] = edges.map(([, state]) => measuredEdge(state));
|
|
191
|
+
if (top && section.getAttribute(CHROME_OVERLAY) !== "measured")
|
|
192
|
+
section.setAttribute(CHROME_OVERLAY, "measured");
|
|
193
|
+
else if (!top && section.hasAttribute(CHROME_OVERLAY))
|
|
194
|
+
section.removeAttribute(CHROME_OVERLAY);
|
|
195
|
+
if (bottom && section.getAttribute(BOTTOM_TOOLBAR_OVERLAY) !== "measured")
|
|
196
|
+
section.setAttribute(BOTTOM_TOOLBAR_OVERLAY, "measured");
|
|
197
|
+
else if (!bottom && section.hasAttribute(BOTTOM_TOOLBAR_OVERLAY))
|
|
198
|
+
section.removeAttribute(BOTTOM_TOOLBAR_OVERLAY);
|
|
199
|
+
};
|
|
200
|
+
const activeScroller = () => {
|
|
201
|
+
const top = topView(viewport);
|
|
202
|
+
const only = top?.children.length === 1 ? top.children[0] : void 0;
|
|
203
|
+
if (!only) return { scroller: top };
|
|
204
|
+
if (only.matches(".kui-pane"))
|
|
205
|
+
return {
|
|
206
|
+
scroller: only.querySelector(":scope > .kui-pane__content") ?? void 0,
|
|
207
|
+
pane: only
|
|
208
|
+
};
|
|
209
|
+
return { scroller: only.matches(NESTED_LAYOUT) ? void 0 : top };
|
|
210
|
+
};
|
|
211
|
+
const measureScrollbar = () => {
|
|
212
|
+
const scroller = measuredScroller;
|
|
213
|
+
if (!scroller) {
|
|
214
|
+
scrollbarSize = 0;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const style = view.getComputedStyle(scroller);
|
|
218
|
+
scrollbarSize = Math.max(
|
|
219
|
+
0,
|
|
220
|
+
scroller.offsetWidth - scroller.clientWidth - (Number.parseFloat(style.borderLeftWidth) || 0) - (Number.parseFloat(style.borderRightWidth) || 0)
|
|
221
|
+
);
|
|
222
|
+
};
|
|
223
|
+
const chromeObserver = view.ResizeObserver ? new view.ResizeObserver((entries) => {
|
|
224
|
+
for (const entry of entries) {
|
|
225
|
+
const state = edges.find(
|
|
226
|
+
([, edgeState]) => edgeState.element === entry.target
|
|
227
|
+
)?.[1];
|
|
228
|
+
if (state)
|
|
229
|
+
state.size = entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height;
|
|
230
|
+
else if (entry.target === measuredScroller) measureScrollbar();
|
|
231
|
+
}
|
|
232
|
+
publishOverlay();
|
|
233
|
+
}) : void 0;
|
|
234
|
+
const syncOverlay = () => {
|
|
235
|
+
for (const [edge, state] of edges) {
|
|
236
|
+
const element = section.getAttribute(edge.presentation) === "overlay" ? section.querySelector(edge.element) ?? void 0 : void 0;
|
|
237
|
+
if (element === state.element) continue;
|
|
238
|
+
if (state.element) chromeObserver?.unobserve(state.element);
|
|
239
|
+
state.element = element;
|
|
240
|
+
if (!element) state.size = void 0;
|
|
241
|
+
else {
|
|
242
|
+
if (state.size === void 0 || !chromeObserver)
|
|
243
|
+
state.size = element.getBoundingClientRect().height;
|
|
244
|
+
chromeObserver?.observe(element, { box: "border-box" });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const { scroller, pane } = activeScroller();
|
|
248
|
+
for (const [edge, state] of edges)
|
|
249
|
+
state.covers = state.element !== void 0 && scroller !== void 0 && !pane?.querySelector(edge.paneChrome);
|
|
250
|
+
const covered = edges.some(([, state]) => state.covers) ? scroller : void 0;
|
|
251
|
+
if (covered !== measuredScroller) {
|
|
252
|
+
if (measuredScroller) chromeObserver?.unobserve(measuredScroller);
|
|
253
|
+
measuredScroller = covered;
|
|
254
|
+
measureScrollbar();
|
|
255
|
+
if (measuredScroller) chromeObserver?.observe(measuredScroller);
|
|
256
|
+
}
|
|
257
|
+
publishOverlay();
|
|
258
|
+
};
|
|
259
|
+
const overlayObserver = new MutationObserver(syncOverlay);
|
|
260
|
+
overlayObserver.observe(section, {
|
|
261
|
+
childList: true,
|
|
262
|
+
attributes: true,
|
|
263
|
+
attributeFilter: [
|
|
264
|
+
...OVERLAY_EDGES.map((edge) => edge.presentation),
|
|
265
|
+
CHROME_OVERLAY,
|
|
266
|
+
BOTTOM_TOOLBAR_OVERLAY,
|
|
267
|
+
"style"
|
|
268
|
+
]
|
|
269
|
+
});
|
|
270
|
+
syncOverlay();
|
|
271
|
+
const onFocusIn = (event) => rememberFocusedView(event.target);
|
|
272
|
+
section.addEventListener("focusin", onFocusIn);
|
|
273
|
+
rememberFocusedView(section.ownerDocument.activeElement);
|
|
274
|
+
const crossFadeChrome = () => {
|
|
275
|
+
const current = chromeOf(section);
|
|
276
|
+
const animated = duration > 0 && !reducedMotion(view);
|
|
277
|
+
if (!animated) {
|
|
278
|
+
chromeSnapshots = current.map(
|
|
279
|
+
(element) => element.cloneNode(true)
|
|
280
|
+
);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
section.dataset.navChromeTransition = "true";
|
|
284
|
+
const copies = chromeSnapshots.map((snapshot) => {
|
|
285
|
+
const copy = snapshot.cloneNode(true);
|
|
286
|
+
copy.classList.add("kui-nav-stack__chrome-copy");
|
|
287
|
+
copy.dataset.navChromeCopy = "";
|
|
288
|
+
copy.setAttribute("aria-hidden", "true");
|
|
289
|
+
copy.setAttribute("inert", "");
|
|
290
|
+
if (copy.hasAttribute("data-nav-stack-bottom"))
|
|
291
|
+
copy.classList.add("kui-nav-stack__chrome-copy--bottom");
|
|
292
|
+
section.append(copy);
|
|
293
|
+
return copy;
|
|
294
|
+
});
|
|
295
|
+
current.forEach(
|
|
296
|
+
(element) => element.classList.add("kui-nav-stack__chrome--entering")
|
|
297
|
+
);
|
|
298
|
+
void section.offsetWidth;
|
|
299
|
+
frame(() => {
|
|
300
|
+
current.forEach(
|
|
301
|
+
(element) => element.classList.remove("kui-nav-stack__chrome--entering")
|
|
302
|
+
);
|
|
303
|
+
copies.forEach(
|
|
304
|
+
(copy) => copy.classList.add("kui-nav-stack__chrome-copy--exiting")
|
|
305
|
+
);
|
|
306
|
+
});
|
|
307
|
+
settle(() => {
|
|
308
|
+
copies.forEach((copy) => copy.remove());
|
|
309
|
+
delete section.dataset.navChromeTransition;
|
|
310
|
+
});
|
|
311
|
+
chromeSnapshots = current.map((element) => {
|
|
312
|
+
const snapshot = element.cloneNode(true);
|
|
313
|
+
snapshot.classList.remove("kui-nav-stack__chrome--entering");
|
|
314
|
+
return snapshot;
|
|
315
|
+
});
|
|
316
|
+
};
|
|
65
317
|
const observer = new MutationObserver((records) => {
|
|
66
318
|
const removed = [];
|
|
67
|
-
let added = false;
|
|
68
319
|
for (const record of records) {
|
|
320
|
+
if (record.target !== viewport) continue;
|
|
69
321
|
record.removedNodes.forEach((node) => {
|
|
70
322
|
if (node instanceof HTMLElement && node.classList.contains("kui-nav-stack__view") && node.dataset.navExiting !== "true")
|
|
71
323
|
removed.push(node);
|
|
72
324
|
});
|
|
73
|
-
record.addedNodes.forEach((node) => {
|
|
74
|
-
if (node instanceof HTMLElement && node.classList.contains("kui-nav-stack__view"))
|
|
75
|
-
added = true;
|
|
76
|
-
});
|
|
77
325
|
}
|
|
78
326
|
const top = topView(viewport);
|
|
79
327
|
const currentKey = top?.dataset.navKey;
|
|
80
328
|
const poppedTop = removed.find((node) => node.dataset.navKey === activeKey);
|
|
81
329
|
if (poppedTop && currentKey !== activeKey) {
|
|
330
|
+
finishTransition();
|
|
331
|
+
poppedTop.classList.remove(
|
|
332
|
+
"kui-nav-stack__view--entering",
|
|
333
|
+
"kui-nav-stack__view--exiting"
|
|
334
|
+
);
|
|
82
335
|
poppedTop.dataset.navExiting = "true";
|
|
83
336
|
poppedTop.setAttribute("aria-hidden", "true");
|
|
84
337
|
viewport.append(poppedTop);
|
|
338
|
+
void poppedTop.offsetWidth;
|
|
85
339
|
play(poppedTop, "exiting");
|
|
340
|
+
crossFadeChrome();
|
|
341
|
+
if (top) focusInto(top);
|
|
86
342
|
settle(() => poppedTop.remove());
|
|
87
|
-
} else if (
|
|
343
|
+
} else if (currentKey !== activeKey && top) {
|
|
344
|
+
finishTransition();
|
|
345
|
+
const previous = viewsOf(viewport).find(
|
|
346
|
+
(element) => element.dataset.navKey === activeKey
|
|
347
|
+
);
|
|
348
|
+
if (previous) {
|
|
349
|
+
previous.dataset.navRevealed = "true";
|
|
350
|
+
settle(() => delete previous.dataset.navRevealed);
|
|
351
|
+
}
|
|
352
|
+
rememberFocusedView(section.ownerDocument.activeElement);
|
|
88
353
|
play(top, "entering");
|
|
354
|
+
crossFadeChrome();
|
|
355
|
+
focusInto(top);
|
|
89
356
|
}
|
|
90
357
|
activeKey = currentKey;
|
|
358
|
+
syncOverlay();
|
|
359
|
+
});
|
|
360
|
+
observer.observe(viewport, {
|
|
361
|
+
childList: true,
|
|
362
|
+
subtree: true,
|
|
363
|
+
attributes: true,
|
|
364
|
+
attributeFilter: ["data-nav-key", "data-nav-active"]
|
|
91
365
|
});
|
|
92
|
-
observer.observe(viewport, { childList: true });
|
|
93
366
|
return () => {
|
|
94
367
|
disposeBack();
|
|
368
|
+
section.removeEventListener("focusin", onFocusIn);
|
|
95
369
|
observer.disconnect();
|
|
96
|
-
|
|
97
|
-
|
|
370
|
+
overlayObserver.disconnect();
|
|
371
|
+
chromeObserver?.disconnect();
|
|
372
|
+
for (const [, state] of edges) {
|
|
373
|
+
state.element = void 0;
|
|
374
|
+
state.size = void 0;
|
|
375
|
+
state.covers = false;
|
|
376
|
+
}
|
|
377
|
+
measuredScroller = void 0;
|
|
378
|
+
scrollbarSize = 0;
|
|
379
|
+
publishOverlay();
|
|
380
|
+
finishTransition();
|
|
381
|
+
for (const [element, previousTabIndex] of generatedFallbacks) {
|
|
382
|
+
if (!element.isConnected || element.tabIndex !== -1) continue;
|
|
383
|
+
if (previousTabIndex === null) element.removeAttribute("tabindex");
|
|
384
|
+
else element.setAttribute("tabindex", previousTabIndex);
|
|
385
|
+
}
|
|
386
|
+
generatedFallbacks.clear();
|
|
387
|
+
rememberedFocus.clear();
|
|
388
|
+
if (previousDuration)
|
|
389
|
+
section.style.setProperty(
|
|
390
|
+
"--kui-nav-stack-transition-duration",
|
|
391
|
+
previousDuration
|
|
392
|
+
);
|
|
393
|
+
else section.style.removeProperty("--kui-nav-stack-transition-duration");
|
|
98
394
|
};
|
|
99
395
|
}
|
|
100
396
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wire-nav-stack.ts"],"names":[],"mappings":"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","file":"wire-nav-stack.js","sourcesContent":["import { delegate } from 'kerfjs';\n\nexport interface WireNavStackOptions {\n /** Invoked when the back control is activated. The app pops its own stack. */\n onBack?: () => void;\n /** Transition duration in ms (default 200). Set 0 to disable animation. */\n duration?: number;\n}\n\nconst DEFAULT_DURATION = 200;\n\nfunction viewsOf(viewport: Element): HTMLElement[] {\n return Array.from(\n viewport.querySelectorAll<HTMLElement>(':scope > .kui-nav-stack__view'),\n );\n}\n\nfunction topView(viewport: Element): HTMLElement | undefined {\n const live = viewsOf(viewport).filter(\n (view) => view.dataset.navExiting !== 'true',\n );\n return live[live.length - 1];\n}\n\nfunction reducedMotion(view: Window): boolean {\n return (\n typeof view.matchMedia === 'function' &&\n view.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/**\n * Animate a `NavStack`'s push/pop transitions and wire its back control. The app\n * owns the stack (a signal of `NavStackView[]`) and re-renders `NavStack` when it\n * changes; this helper slides the content and settles the chrome across each\n * change, and calls `onBack` when the back control is used. Returns a disposer.\n */\nexport function wireNavStack(\n root: Element,\n options: WireNavStackOptions = {},\n): () => void {\n const section = root.matches('[data-component=\"nav-stack\"]')\n ? root\n : root.querySelector('[data-component=\"nav-stack\"]');\n const viewport = section?.querySelector('[data-nav-stack-viewport]');\n if (!(section instanceof HTMLElement) || !viewport) return () => {};\n\n const view = section.ownerDocument.defaultView ?? window;\n const duration = options.duration ?? DEFAULT_DURATION;\n const disposeBack = delegate(section, 'click', '[data-nav-back]', () =>\n options.onBack?.(),\n );\n\n let activeKey = topView(viewport)?.dataset.navKey;\n const timers = new Set<number>();\n\n const settle = (fn: () => void): void => {\n if (duration <= 0 || reducedMotion(view)) {\n fn();\n return;\n }\n const timer = view.setTimeout(() => {\n timers.delete(timer);\n fn();\n }, duration);\n timers.add(timer);\n };\n\n const play = (el: HTMLElement, kind: 'entering' | 'exiting'): void => {\n const animated = duration > 0 && !reducedMotion(view);\n if (kind === 'entering') {\n // Push: start the incoming view off the trailing edge, then release it so\n // it slides to rest (translateX(100%) → 0).\n el.classList.add('kui-nav-stack__view--entering');\n if (animated) {\n // Force a reflow so the starting transform applies before we clear it.\n void el.offsetWidth;\n view.requestAnimationFrame(() =>\n el.classList.remove('kui-nav-stack__view--entering'),\n );\n } else {\n el.classList.remove('kui-nav-stack__view--entering');\n }\n } else if (animated) {\n // Pop: the outgoing view is at rest; add the off-edge class on the next\n // frame so it slides OUT (translateX(0) → 100%), not in.\n view.requestAnimationFrame(() =>\n el.classList.add('kui-nav-stack__view--exiting'),\n );\n } else {\n el.classList.add('kui-nav-stack__view--exiting');\n }\n };\n\n const observer = new MutationObserver((records) => {\n const removed: HTMLElement[] = [];\n let added = false;\n for (const record of records) {\n record.removedNodes.forEach((node) => {\n if (\n node instanceof HTMLElement &&\n node.classList.contains('kui-nav-stack__view') &&\n node.dataset.navExiting !== 'true'\n )\n removed.push(node);\n });\n record.addedNodes.forEach((node) => {\n if (\n node instanceof HTMLElement &&\n node.classList.contains('kui-nav-stack__view')\n )\n added = true;\n });\n }\n\n const top = topView(viewport);\n const currentKey = top?.dataset.navKey;\n const poppedTop = removed.find((node) => node.dataset.navKey === activeKey);\n\n if (poppedTop && currentKey !== activeKey) {\n // Pop: bring the removed node back briefly to slide it out over the revealed view.\n poppedTop.dataset.navExiting = 'true';\n poppedTop.setAttribute('aria-hidden', 'true');\n viewport.append(poppedTop);\n play(poppedTop, 'exiting');\n settle(() => poppedTop.remove());\n } else if (added && currentKey !== activeKey && top) {\n // Push: slide the new top in.\n play(top, 'entering');\n }\n\n activeKey = currentKey;\n });\n observer.observe(viewport, { childList: true });\n\n return () => {\n disposeBack();\n observer.disconnect();\n for (const timer of timers) view.clearTimeout(timer);\n timers.clear();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/navigation/nav-stack/wiring/wire-nav-stack.ts"],"names":[],"mappings":";;;AASA,IAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAM,cAAA,GAAiB,qBAAA;AAEvB,IAAM,sBAAA,GAAyB,6BAAA;AAmB/B,IAAM,aAAA,GAAwC;AAAA,EAC5C;AAAA,IACE,YAAA,EAAc,0BAAA;AAAA,IACd,OAAA,EAAS,8DAAA;AAAA,IACT,SAAA,EAAW,oCAAA;AAAA,IACX,mBAAA,EAAqB,wCAAA;AAAA;AAAA,IAErB,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,YAAA,EAAc,kCAAA;AAAA,IACd,OAAA,EAAS,8DAAA;AAAA,IACT,SAAA,EAAW,oCAAA;AAAA,IACX,mBAAA,EAAqB,+CAAA;AAAA;AAAA,IAErB,UAAA,EAAY;AAAA;AAEhB,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,WAAA,EAAa,YAAA,EAAc,aAAa,cAAc,CAAA,CAC1E,GAAA,CAAI,CAAC,SAAS,CAAA,iBAAA,EAAoB,IAAI,CAAA,EAAA,CAAI,CAAA,CAC1C,KAAK,IAAI,CAAA;AACZ,IAAM,kBAAA,GAAqB;AAAA,EACzB,SAAA;AAAA,EACA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAEV,SAAS,QAAQ,QAAA,EAAkC;AACjD,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,QAAA,CAAS,iBAA8B,+BAA+B;AAAA,GACxE;AACF;AAEA,SAAS,QAAQ,QAAA,EAA4C;AAC3D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA;AAAA,IAC7B,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,KAAe;AAAA,GACxC;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC7B;AAEA,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,OACE,OAAO,IAAA,CAAK,UAAA,KAAe,cAC3B,IAAA,CAAK,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAExD;AAEA,SAAS,SAAS,OAAA,EAAqC;AACrD,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,OAAA,CAAQ,gBAAA;AAAA,MACN;AAAA;AACF,GACF;AACF;AAEA,SAAS,qBACP,OAAA,EACwB;AACxB,EAAA,OACE,OAAA,YAAmB,WAAA,IACnB,OAAA,CAAQ,WAAA,IACR,CAAC,OAAA,CAAQ,OAAA,CAAQ,oCAAoC,CAAA,IACrD,CAAC,OAAA,CAAQ,OAAA,CAAQ,yCAAyC,CAAA;AAE9D;AAWO,SAAS,YAAA,CACd,IAAA,EACA,OAAA,GAA+B,EAAC,EACpB;AACZ,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,8BAA8B,IACvD,IAAA,GACA,IAAA,CAAK,cAAc,8BAA8B,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,aAAA,CAAc,2BAA2B,CAAA;AACnE,EAAA,IAAI,EAAE,OAAA,YAAmB,WAAA,CAAA,IAAgB,CAAC,QAAA,SAAiB,MAAM;AAAA,EAAC,CAAA;AAElE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,WAAA,IAAe,MAAA;AAClD,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,gBAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,QAAQ,KAAA,CAAM,gBAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAA,CAAQ,KAAA,CAAM,WAAA;AAAA,IACZ,qCAAA;AAAA,IACA,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA,EAAA;AAAA,GAC1B;AACA,EAAA,MAAM,WAAA,GAAc,QAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,iBAAA;AAAA,IAAmB,MAChE,QAAQ,MAAA;AAAS,GACnB;AAEA,EAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAA,CAAQ,MAAA;AAC3C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAyB;AACtC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,qBAAA,CAAsB,MAAM;AAC1C,MAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAChB,MAAA,EAAA,EAAG;AAAA,IACL,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,EACf,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAY;AACnC,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,IAAA,CAAK,oBAAA,CAAqB,EAAE,CAAA;AACrD,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AAC7C,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,OAAA,CACG,gBAAA,CAA8B,iCAAiC,CAAA,CAC/D,OAAA,CAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,QAAA,CAAS,OAAO,CAAA,CAAE,OAAA;AAAA,MAAQ,CAAC,OAAA,KACzB,OAAA,CAAQ,SAAA,CAAU,OAAO,iCAAiC;AAAA,KAC5D;AACA,IAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY;AACrC,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,UAAA,KAAe,MAAA,UAAgB,MAAA,EAAO;AAAA,WACrD;AACH,QAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,+BAA+B,CAAA;AACxD,QAAA,OAAO,QAAQ,OAAA,CAAQ,WAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,QAAQ,OAAA,CAAQ,mBAAA;AAAA,EACzB,CAAA;AACA,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAyB;AACrD,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAgC;AAC/D,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,OAAO,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,OAAA,KAC3C,OAAA,CAAQ,SAAA,CAAU,IAAI;AAAA,GACxB;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAyB;AACvC,IAAA,IAAI,QAAA,IAAY,CAAA,IAAK,aAAA,CAAc,IAAI,CAAA,EAAG;AACxC,MAAA,EAAA,EAAG;AACH,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,MAAM;AAClC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,MAAA,EAAA,EAAG;AAAA,IACL,GAAG,QAAQ,CAAA;AACX,IAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,EAAiB,IAAA,KAAuC;AACpE,IAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,IAAK,CAAC,cAAc,IAAI,CAAA;AACpD,IAAA,IAAI,SAAS,UAAA,EAAY;AAGvB,MAAA,EAAA,CAAG,SAAA,CAAU,IAAI,+BAA+B,CAAA;AAChD,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,KAAK,EAAA,CAAG,WAAA;AACR,QAAA,KAAA,CAAM,MAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,+BAA+B,CAAC,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,SAAA,CAAU,OAAO,+BAA+B,CAAA;AAAA,MACrD;AAAA,IACF,WAAW,QAAA,EAAU;AAGnB,MAAA,KAAA,CAAM,MAAM,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,8BAA8B,CAAC,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,SAAA,CAAU,IAAI,8BAA8B,CAAA;AAAA,IACjD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,MAAA,KAAiC;AAC5D,IAAA,IAAI,EAAE,kBAAkB,WAAA,CAAA,EAAc;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAqB,sBAAsB,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,OAAO,OAAA,CAAQ,MAAA;AAC3B,IAAA,IAAI,GAAA,IAAO,KAAA,KAAU,MAAA,IAAU,QAAA,CAAS,SAAS,KAAK,CAAA;AACpD,MAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,UAAA,KAAkC;AACnD,IAAA,MAAM,GAAA,GAAM,WAAW,OAAA,CAAQ,MAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,GAAA,GAAM,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AACpD,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,MACtB,UAAA,CAAW,iBAA8B,kBAAkB;AAAA,KAC7D,CAAE,KAAK,oBAAoB,CAAA;AAC3B,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,MAClB,UAAA,CAAW,iBAA8B,kBAAkB;AAAA,KAC7D,CAAE,KAAK,oBAAoB,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAA,CACH,oBAAA,CAAqB,UAAU,CAAA,IAAK,UAAA,CAAW,SAAS,UAAU,CAAA,GAC/D,UAAA,GACA,MAAA,KACJ,SAAA,IACA,KAAA;AACF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA,EAAG;AACvC,MAAA,kBAAA,CAAmB,GAAA;AAAA,QACjB,UAAA;AAAA,QACA,WAAW,YAAA,CAAa,UAAU,IAC9B,UAAA,CAAW,YAAA,CAAa,UAAU,CAAA,GAClC;AAAA,OACN;AACA,MAAA,UAAA,CAAW,QAAA,GAAW,EAAA;AAAA,IACxB;AACA,IAAA,UAAA,CAAW,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,EAC1C,CAAA;AAiBA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAmC;AAAA,IAClE,IAAA;AAAA,IACA,EAAE,QAAQ,KAAA;AAAM,GACjB,CAAA;AACD,EAAA,MAAM,eAAe,CAAC,KAAA,KACpB,MAAM,OAAA,KAAY,MAAA,IAAa,MAAM,IAAA,KAAS,MAAA;AAChD,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAAwB;AAC3D,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAiB,IAAI,MAAM,KAAA,EAAO;AACpD,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,SAC3C,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA;AAAA,EACxC,CAAA;AACA,EAAA,MAAM,iBAAiB,MAAY;AACjC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAA,EAAO;AACjC,MAAA,MAAM,QAAA,GAAW,aAAa,KAAK,CAAA;AACnC,MAAA,aAAA,CAAc,KAAK,SAAA,EAAW,QAAA,GAAW,GAAG,KAAA,CAAM,IAAI,OAAO,EAAE,CAAA;AAC/D,MAAA,aAAA;AAAA,QACE,IAAA,CAAK,mBAAA;AAAA,QACL,YAAY,KAAA,CAAM,MAAA,IAAU,gBAAgB,CAAA,GACxC,CAAA,EAAG,aAAa,CAAA,EAAA,CAAA,GAChB;AAAA,OACN;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,YAAA,CAAa,OAAO,MAAM,EAAA,EAAI,OAAA,CAAQ,gBAAgB,OAAO,CAAA;AAEzE,IAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,KAAK,CAAA,KAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAClE,IAAA,IAAI,GAAA,IAAO,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA,KAAM,UAAA;AAClD,MAAA,OAAA,CAAQ,YAAA,CAAa,gBAAgB,UAAU,CAAA;AAAA,SAAA,IACxC,CAAC,GAAA,IAAO,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA;AAClD,MAAA,OAAA,CAAQ,gBAAgB,cAAc,CAAA;AACxC,IAAA,IAAI,MAAA,IAAU,OAAA,CAAQ,YAAA,CAAa,sBAAsB,CAAA,KAAM,UAAA;AAC7D,MAAA,OAAA,CAAQ,YAAA,CAAa,wBAAwB,UAAU,CAAA;AAAA,SAAA,IAChD,CAAC,MAAA,IAAU,OAAA,CAAQ,YAAA,CAAa,sBAAsB,CAAA;AAC7D,MAAA,OAAA,CAAQ,gBAAgB,sBAAsB,CAAA;AAAA,EAClD,CAAA;AAMA,EAAA,MAAM,iBAAiB,MAAkD;AACvE,IAAA,MAAM,GAAA,GAAM,QAAQ,QAAQ,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,MAAA,KAAW,IAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA;AAC5D,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,UAAU,GAAA,EAAI;AAClC,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAW,CAAA;AAC1B,MAAA,OAAO;AAAA,QACL,QAAA,EACE,IAAA,CAAK,aAAA,CAA2B,6BAA6B,CAAA,IAC7D,MAAA;AAAA,QACF,IAAA,EAAM;AAAA,OACR;AACF,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAQ,aAAa,CAAA,GAAI,SAAY,GAAA,EAAI;AAAA,EACnE,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAY;AACnC,IAAA,MAAM,QAAA,GAAW,gBAAA;AACjB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,aAAA,GAAgB,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAC5C,IAAA,aAAA,GAAgB,IAAA,CAAK,GAAA;AAAA,MACnB,CAAA;AAAA,MACA,QAAA,CAAS,WAAA,GACP,QAAA,CAAS,WAAA,IACR,OAAO,UAAA,CAAW,KAAA,CAAM,eAAe,CAAA,IAAK,CAAA,CAAA,IAC5C,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,gBAAgB,CAAA,IAAK,CAAA;AAAA,KAClD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA,GACxB,IAAI,IAAA,CAAK,cAAA,CAAe,CAAC,OAAA,KAAY;AACnC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,QAClB,CAAC,GAAG,SAAS,CAAA,KAAM,SAAA,CAAU,YAAY,KAAA,CAAM;AAAA,UAC7C,CAAC,CAAA;AACL,MAAA,IAAI,KAAA;AACF,QAAA,KAAA,CAAM,IAAA,GACJ,MAAM,aAAA,GAAgB,CAAC,GAAG,SAAA,IAC1B,KAAA,CAAM,MAAA,CAAO,qBAAA,EAAsB,CAAE,MAAA;AAAA,WAAA,IAChC,KAAA,CAAM,MAAA,KAAW,gBAAA,EAAkB,gBAAA,EAAiB;AAAA,IAC/D;AACA,IAAA,cAAA,EAAe;AAAA,EACjB,CAAC,CAAA,GACD,MAAA;AACJ,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAA,EAAO;AACjC,MAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,YAAY,CAAA,KAAM,SAAA,GACvC,OAAA,CAAQ,aAAA,CAA2B,IAAA,CAAK,OAAO,CAAA,IAAK,MAAA,GACrD,MAAA;AACN,MAAA,IAAI,OAAA,KAAY,MAAM,OAAA,EAAS;AAC/B,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,SAAA,CAAU,MAAM,OAAO,CAAA;AAC1D,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,IAAI,CAAC,OAAA,EAAS,KAAA,CAAM,IAAA,GAAO,MAAA;AAAA,WACtB;AAIH,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAa,CAAC,cAAA;AAC/B,UAAA,KAAA,CAAM,IAAA,GAAO,OAAA,CAAQ,qBAAA,EAAsB,CAAE,MAAA;AAE/C,QAAA,cAAA,EAAgB,OAAA,CAAQ,OAAA,EAAS,EAAE,GAAA,EAAK,cAAc,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,cAAA,EAAe;AAC1C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAA;AAC1B,MAAA,KAAA,CAAM,MAAA,GACJ,KAAA,CAAM,OAAA,KAAY,MAAA,IAClB,QAAA,KAAa,UACb,CAAC,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,CAAM,MAAM,CAAA,GAClD,QAAA,GACA,MAAA;AACJ,IAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,MAAA,IAAI,gBAAA,EAAkB,cAAA,EAAgB,SAAA,CAAU,gBAAgB,CAAA;AAChE,MAAA,gBAAA,GAAmB,OAAA;AACnB,MAAA,gBAAA,EAAiB;AACjB,MAAA,IAAI,gBAAA,EAAkB,cAAA,EAAgB,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAChE;AACA,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,IAAI,gBAAA,CAAiB,WAAW,CAAA;AACxD,EAAA,eAAA,CAAgB,QAAQ,OAAA,EAAS;AAAA,IAC/B,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,MACf,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,YAAY,CAAA;AAAA,MAChD,cAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA;AACF,GACD,CAAA;AACD,EAAA,WAAA,EAAY;AAEZ,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KACjB,mBAAA,CAAoB,MAAM,MAAwB,CAAA;AACpD,EAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC7C,EAAA,mBAAA,CAAoB,OAAA,CAAQ,cAAc,aAAa,CAAA;AAEvD,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,MAAM,OAAA,GAAU,SAAS,OAAO,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,IAAK,CAAC,cAAc,IAAI,CAAA;AACpD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,eAAA,GAAkB,OAAA,CAAQ,GAAA;AAAA,QAAI,CAAC,OAAA,KAC7B,OAAA,CAAQ,SAAA,CAAU,IAAI;AAAA,OACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,QAAQ,mBAAA,GAAsB,MAAA;AACtC,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,KAAa;AAC/C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,4BAA4B,CAAA;AAC/C,MAAA,IAAA,CAAK,QAAQ,aAAA,GAAgB,EAAA;AAC7B,MAAA,IAAA,CAAK,YAAA,CAAa,eAAe,MAAM,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,CAAA;AAC7B,MAAA,IAAI,IAAA,CAAK,aAAa,uBAAuB,CAAA;AAC3C,QAAA,IAAA,CAAK,SAAA,CAAU,IAAI,oCAAoC,CAAA;AACzD,MAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,OAAA;AAAA,MAAQ,CAAC,OAAA,KACf,OAAA,CAAQ,SAAA,CAAU,IAAI,iCAAiC;AAAA,KACzD;AACA,IAAA,KAAK,OAAA,CAAQ,WAAA;AACb,IAAA,KAAA,CAAM,MAAM;AACV,MAAA,OAAA,CAAQ,OAAA;AAAA,QAAQ,CAAC,OAAA,KACf,OAAA,CAAQ,SAAA,CAAU,OAAO,iCAAiC;AAAA,OAC5D;AACA,MAAA,MAAA,CAAO,OAAA;AAAA,QAAQ,CAAC,IAAA,KACd,IAAA,CAAK,SAAA,CAAU,IAAI,qCAAqC;AAAA,OAC1D;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,MAAM;AACX,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA;AACtC,MAAA,OAAO,QAAQ,OAAA,CAAQ,mBAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,KAAY;AACzC,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AACvC,MAAA,QAAA,CAAS,SAAA,CAAU,OAAO,iCAAiC,CAAA;AAC3D,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,OAAA,KAAY;AACjD,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAChC,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,KAAS;AACpC,QAAA,IACE,IAAA,YAAgB,eAChB,IAAA,CAAK,SAAA,CAAU,SAAS,qBAAqB,CAAA,IAC7C,IAAA,CAAK,OAAA,CAAQ,UAAA,KAAe,MAAA;AAE5B,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,QAAQ,QAAQ,CAAA;AAC5B,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,MAAA;AAChC,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,WAAW,SAAS,CAAA;AAE1E,IAAA,IAAI,SAAA,IAAa,eAAe,SAAA,EAAW;AACzC,MAAA,gBAAA,EAAiB;AAEjB,MAAA,SAAA,CAAU,SAAA,CAAU,MAAA;AAAA,QAClB,+BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,SAAA,CAAU,QAAQ,UAAA,GAAa,MAAA;AAC/B,MAAA,SAAA,CAAU,YAAA,CAAa,eAAe,MAAM,CAAA;AAC5C,MAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AACzB,MAAA,KAAK,SAAA,CAAU,WAAA;AACf,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AACzB,MAAA,eAAA,EAAgB;AAChB,MAAA,IAAI,GAAA,YAAe,GAAG,CAAA;AACtB,MAAA,MAAA,CAAO,MAAM,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,UAAA,KAAe,SAAA,IAAa,GAAA,EAAK;AAC1C,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA;AAAA,QACjC,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,KAAW;AAAA,OAC1C;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,QAAQ,WAAA,GAAc,MAAA;AAC/B,QAAA,MAAA,CAAO,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AAAA,MAClD;AAEA,MAAA,mBAAA,CAAoB,OAAA,CAAQ,cAAc,aAAa,CAAA;AACvD,MAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AACpB,MAAA,eAAA,EAAgB;AAChB,MAAA,SAAA,CAAU,GAAG,CAAA;AAAA,IACf;AAEA,IAAA,SAAA,GAAY,UAAA;AAEZ,IAAA,WAAA,EAAY;AAAA,EACd,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,QAAQ,QAAA,EAAU;AAAA,IACzB,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB,CAAC,cAAA,EAAgB,iBAAiB;AAAA,GACpD,CAAA;AAED,EAAA,OAAO,MAAM;AACX,IAAA,WAAA,EAAY;AACZ,IAAA,OAAA,CAAQ,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAChD,IAAA,QAAA,CAAS,UAAA,EAAW;AACpB,IAAA,eAAA,CAAgB,UAAA,EAAW;AAC3B,IAAA,cAAA,EAAgB,UAAA,EAAW;AAC3B,IAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,KAAA,EAAO;AAC7B,MAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAChB,MAAA,KAAA,CAAM,IAAA,GAAO,MAAA;AACb,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AAAA,IACjB;AACA,IAAA,gBAAA,GAAmB,MAAA;AACnB,IAAA,aAAA,GAAgB,CAAA;AAChB,IAAA,cAAA,EAAe;AACf,IAAA,gBAAA,EAAiB;AACjB,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,gBAAgB,CAAA,IAAK,kBAAA,EAAoB;AAC5D,MAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,aAAa,EAAA,EAAI;AACrD,MAAA,IAAI,gBAAA,KAAqB,IAAA,EAAM,OAAA,CAAQ,eAAA,CAAgB,UAAU,CAAA;AAAA,WAC5D,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAY,gBAAgB,CAAA;AAAA,IACxD;AACA,IAAA,kBAAA,CAAmB,KAAA,EAAM;AACzB,IAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,IAAA,IAAI,gBAAA;AACF,MAAA,OAAA,CAAQ,KAAA,CAAM,WAAA;AAAA,QACZ,qCAAA;AAAA,QACA;AAAA,OACF;AAAA,SACG,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,qCAAqC,CAAA;AAAA,EACzE,CAAA;AACF","file":"wire-nav-stack.js","sourcesContent":["import { delegate } from 'kerfjs';\n\nexport interface WireNavStackOptions {\n /** Invoked when the back control is activated. The app pops its own stack. */\n onBack?: () => void;\n /** Transition duration in ms (default 200). Set 0 to disable animation. */\n duration?: number;\n}\n\nconst DEFAULT_DURATION = 200;\n/** On an overlay-chrome NavStack: the wiring has measured its live chrome. */\nconst CHROME_OVERLAY = 'data-chrome-overlay';\n/** On an overlay-bottom-toolbar NavStack: the wiring has measured it. */\nconst BOTTOM_TOOLBAR_OVERLAY = 'data-bottom-toolbar-overlay';\n/**\n * One overlay-capable chrome edge of a NavStack: the top chrome\n * (`chromePresentation`) or the bottom toolbar (`bottomToolbarPresentation`).\n * Each names the root attribute that opts it in, its live element (never a\n * cross-fading copy), the border-box block size the wiring publishes on the\n * root once it has measured that element (beside its gate), the root\n * property for the classic scrollbar inline size it leaves uncovered, and\n * the sole-Pane slot that, when present, keeps the Pane's scroller clear of\n * it.\n */\ninterface OverlayEdge {\n readonly presentation: string;\n readonly element: string;\n readonly blockSize: string;\n readonly scrollbarInlineSize: string;\n readonly paneChrome: string;\n}\n\nconst OVERLAY_EDGES: readonly OverlayEdge[] = [\n {\n presentation: 'data-chrome-presentation',\n element: ':scope > [data-nav-stack-chrome]:not([data-nav-chrome-copy])',\n blockSize: '--_kui-nav-stack-chrome-block-size',\n scrollbarInlineSize: '--_kui-nav-stack-scrollbar-inline-size',\n // A Pane header lies beneath the chrome and starts its content below it.\n paneChrome: ':scope > :is(.kui-pane__header, .kui-pane__toolbar)',\n },\n {\n presentation: 'data-bottom-toolbar-presentation',\n element: ':scope > [data-nav-stack-bottom]:not([data-nav-chrome-copy])',\n blockSize: '--_kui-nav-stack-bottom-block-size',\n scrollbarInlineSize: '--_kui-nav-stack-bottom-scrollbar-inline-size',\n // A Pane footer lies beneath the toolbar and ends its content above it.\n paneChrome: ':scope > .kui-pane__footer',\n },\n];\n/** A layout that, as a view's only child, owns its own chrome and scroller. */\nconst NESTED_LAYOUT = ['nav-stack', 'split-view', 'workbench', 'tab-scaffold']\n .map((name) => `[data-component=\"${name}\"]`)\n .join(', ');\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nfunction viewsOf(viewport: Element): HTMLElement[] {\n return Array.from(\n viewport.querySelectorAll<HTMLElement>(':scope > .kui-nav-stack__view'),\n );\n}\n\nfunction topView(viewport: Element): HTMLElement | undefined {\n const live = viewsOf(viewport).filter(\n (view) => view.dataset.navExiting !== 'true',\n );\n return live[live.length - 1];\n}\n\nfunction reducedMotion(view: Window): boolean {\n return (\n typeof view.matchMedia === 'function' &&\n view.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\nfunction chromeOf(section: HTMLElement): HTMLElement[] {\n return Array.from(\n section.querySelectorAll<HTMLElement>(\n ':scope > [data-nav-stack-chrome]:not([data-nav-chrome-copy]), :scope > [data-nav-stack-bottom]:not([data-nav-chrome-copy])',\n ),\n );\n}\n\nfunction availableFocusTarget(\n element: Element | null | undefined,\n): element is HTMLElement {\n return (\n element instanceof HTMLElement &&\n element.isConnected &&\n !element.matches('[disabled], [aria-disabled=\"true\"]') &&\n !element.closest('[inert], [hidden], [aria-hidden=\"true\"]')\n );\n}\n\n/**\n * Animate a `NavStack`'s push/pop transitions and wire its back control. The app\n * owns the stack (a signal of `NavStackView[]`) and re-renders `NavStack` when it\n * changes; this helper slides the content and settles the chrome across each\n * change, moves focus into every new top view, restores that view's last focused\n * descendant on pop, and calls `onBack` when the back control is used. Mark a\n * preferred initial target with `data-nav-focus`; otherwise the first focusable\n * descendant (or the view itself) receives focus. Returns a disposer.\n */\nexport function wireNavStack(\n root: Element,\n options: WireNavStackOptions = {},\n): () => void {\n const section = root.matches('[data-component=\"nav-stack\"]')\n ? root\n : root.querySelector('[data-component=\"nav-stack\"]');\n const viewport = section?.querySelector('[data-nav-stack-viewport]');\n if (!(section instanceof HTMLElement) || !viewport) return () => {};\n\n const view = section.ownerDocument.defaultView ?? window;\n const duration = options.duration ?? DEFAULT_DURATION;\n const previousDuration = section.style.getPropertyValue(\n '--kui-nav-stack-transition-duration',\n );\n section.style.setProperty(\n '--kui-nav-stack-transition-duration',\n `${Math.max(0, duration)}ms`,\n );\n const disposeBack = delegate(section, 'click', '[data-nav-back]', () =>\n options.onBack?.(),\n );\n\n let activeKey = topView(viewport)?.dataset.navKey;\n const timers = new Set<number>();\n const frames = new Set<number>();\n const frame = (fn: () => void): void => {\n const id = view.requestAnimationFrame(() => {\n frames.delete(id);\n fn();\n });\n frames.add(id);\n };\n const finishTransition = (): void => {\n for (const id of frames) view.cancelAnimationFrame(id);\n frames.clear();\n for (const id of timers) view.clearTimeout(id);\n timers.clear();\n section\n .querySelectorAll<HTMLElement>(':scope > [data-nav-chrome-copy]')\n .forEach((element) => element.remove());\n chromeOf(section).forEach((element) =>\n element.classList.remove('kui-nav-stack__chrome--entering'),\n );\n viewsOf(viewport).forEach((element) => {\n if (element.dataset.navExiting === 'true') element.remove();\n else {\n element.classList.remove('kui-nav-stack__view--entering');\n delete element.dataset.navRevealed;\n }\n });\n delete section.dataset.navChromeTransition;\n };\n const rememberedFocus = new Map<string, HTMLElement>();\n const generatedFallbacks = new Map<HTMLElement, string | null>();\n let chromeSnapshots = chromeOf(section).map((element) =>\n element.cloneNode(true),\n ) as HTMLElement[];\n\n const settle = (fn: () => void): void => {\n if (duration <= 0 || reducedMotion(view)) {\n fn();\n return;\n }\n const timer = view.setTimeout(() => {\n timers.delete(timer);\n fn();\n }, duration);\n timers.add(timer);\n };\n\n const play = (el: HTMLElement, kind: 'entering' | 'exiting'): void => {\n const animated = duration > 0 && !reducedMotion(view);\n if (kind === 'entering') {\n // Push: start the incoming view off the trailing edge, then release it so\n // it slides to rest (translateX(100%) → 0).\n el.classList.add('kui-nav-stack__view--entering');\n if (animated) {\n // Force a reflow so the starting transform applies before we clear it.\n void el.offsetWidth;\n frame(() => el.classList.remove('kui-nav-stack__view--entering'));\n } else {\n el.classList.remove('kui-nav-stack__view--entering');\n }\n } else if (animated) {\n // Pop: the outgoing view is at rest; add the off-edge class on the next\n // frame so it slides OUT (translateX(0) → 100%), not in.\n frame(() => el.classList.add('kui-nav-stack__view--exiting'));\n } else {\n el.classList.add('kui-nav-stack__view--exiting');\n }\n };\n\n const rememberFocusedView = (target: Element | null): void => {\n if (!(target instanceof HTMLElement)) return;\n const owner = target.closest<HTMLElement>('.kui-nav-stack__view');\n const key = owner?.dataset.navKey;\n if (key && owner !== target && viewport.contains(owner))\n rememberedFocus.set(key, target);\n };\n\n const focusInto = (targetView: HTMLElement): void => {\n const key = targetView.dataset.navKey;\n const remembered = key ? rememberedFocus.get(key) : undefined;\n const preferred = Array.from(\n targetView.querySelectorAll<HTMLElement>('[data-nav-focus]'),\n ).find(availableFocusTarget);\n const first = Array.from(\n targetView.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).find(availableFocusTarget);\n const target =\n (availableFocusTarget(remembered) && targetView.contains(remembered)\n ? remembered\n : undefined) ??\n preferred ??\n first;\n if (target) {\n target.focus({ preventScroll: true });\n return;\n }\n\n if (!generatedFallbacks.has(targetView)) {\n generatedFallbacks.set(\n targetView,\n targetView.hasAttribute('tabindex')\n ? targetView.getAttribute('tabindex')\n : null,\n );\n targetView.tabIndex = -1;\n }\n targetView.focus({ preventScroll: true });\n };\n\n // Overlay chrome (`chromePresentation=\"overlay\"` for the top chrome,\n // `bottomToolbarPresentation=\"overlay\"` for the bottom toolbar): measure\n // each live edge element, never a cross-fading copy, and publish its\n // border-box block size with the gate that lays it over the viewport. The\n // size follows the element as it wraps, zooms, or changes with the active\n // view, and a re-render that strips the published state gets it back\n // before paint. The active view's classic (space-taking) vertical\n // scrollbar is measured too, so each overlaid edge ends where its track\n // begins.\n interface EdgeState {\n element?: HTMLElement;\n size?: number;\n /** The active scroller's track lies beneath this edge. */\n covers: boolean;\n }\n const edges = OVERLAY_EDGES.map((edge): [OverlayEdge, EdgeState] => [\n edge,\n { covers: false },\n ]);\n const measuredEdge = (state: EdgeState): boolean =>\n state.element !== undefined && state.size !== undefined;\n let measuredScroller: HTMLElement | undefined;\n let scrollbarSize = 0;\n const writeProperty = (name: string, value: string): void => {\n if (section.style.getPropertyValue(name) === value) return;\n if (value) section.style.setProperty(name, value);\n else section.style.removeProperty(name);\n };\n const publishOverlay = (): void => {\n for (const [edge, state] of edges) {\n const measured = measuredEdge(state);\n writeProperty(edge.blockSize, measured ? `${state.size}px` : '');\n writeProperty(\n edge.scrollbarInlineSize,\n measured && state.covers && scrollbarSize > 0\n ? `${scrollbarSize}px`\n : '',\n );\n }\n if (section.getAttribute('style') === '') section.removeAttribute('style');\n // Each gate changes only when it must, so the root observer settles.\n const [top, bottom] = edges.map(([, state]) => measuredEdge(state));\n if (top && section.getAttribute(CHROME_OVERLAY) !== 'measured')\n section.setAttribute(CHROME_OVERLAY, 'measured');\n else if (!top && section.hasAttribute(CHROME_OVERLAY))\n section.removeAttribute(CHROME_OVERLAY);\n if (bottom && section.getAttribute(BOTTOM_TOOLBAR_OVERLAY) !== 'measured')\n section.setAttribute(BOTTOM_TOOLBAR_OVERLAY, 'measured');\n else if (!bottom && section.hasAttribute(BOTTOM_TOOLBAR_OVERLAY))\n section.removeAttribute(BOTTOM_TOOLBAR_OVERLAY);\n };\n /**\n * The element that scrolls beneath the overlaid edges in the active view\n * (the view itself, or a sole Pane's content), and that sole Pane, whose\n * own header or footer keeps its scroller clear of the matching edge.\n */\n const activeScroller = (): { scroller?: HTMLElement; pane?: Element } => {\n const top = topView(viewport);\n const only = top?.children.length === 1 ? top.children[0] : undefined;\n if (!only) return { scroller: top };\n if (only.matches('.kui-pane'))\n return {\n scroller:\n only.querySelector<HTMLElement>(':scope > .kui-pane__content') ??\n undefined,\n pane: only,\n };\n return { scroller: only.matches(NESTED_LAYOUT) ? undefined : top };\n };\n const measureScrollbar = (): void => {\n const scroller = measuredScroller;\n if (!scroller) {\n scrollbarSize = 0;\n return;\n }\n const style = view.getComputedStyle(scroller);\n scrollbarSize = Math.max(\n 0,\n scroller.offsetWidth -\n scroller.clientWidth -\n (Number.parseFloat(style.borderLeftWidth) || 0) -\n (Number.parseFloat(style.borderRightWidth) || 0),\n );\n };\n const chromeObserver = view.ResizeObserver\n ? new view.ResizeObserver((entries) => {\n for (const entry of entries) {\n const state = edges.find(\n ([, edgeState]) => edgeState.element === entry.target,\n )?.[1];\n if (state)\n state.size =\n entry.borderBoxSize?.[0]?.blockSize ??\n entry.target.getBoundingClientRect().height;\n else if (entry.target === measuredScroller) measureScrollbar();\n }\n publishOverlay();\n })\n : undefined;\n const syncOverlay = (): void => {\n for (const [edge, state] of edges) {\n const element =\n section.getAttribute(edge.presentation) === 'overlay'\n ? (section.querySelector<HTMLElement>(edge.element) ?? undefined)\n : undefined;\n if (element === state.element) continue;\n if (state.element) chromeObserver?.unobserve(state.element);\n state.element = element;\n if (!element) state.size = undefined;\n else {\n // A replacement keeps the last size until the observer reports it\n // after layout; a first one (or one with no observer to report it)\n // is measured at once.\n if (state.size === undefined || !chromeObserver)\n state.size = element.getBoundingClientRect().height;\n // The border box: a forced-colors edge changes no content box.\n chromeObserver?.observe(element, { box: 'border-box' });\n }\n }\n // A scrollbar appearing or leaving resizes the scroller's content box.\n const { scroller, pane } = activeScroller();\n for (const [edge, state] of edges)\n state.covers =\n state.element !== undefined &&\n scroller !== undefined &&\n !pane?.querySelector(edge.paneChrome);\n const covered = edges.some(([, state]) => state.covers)\n ? scroller\n : undefined;\n if (covered !== measuredScroller) {\n if (measuredScroller) chromeObserver?.unobserve(measuredScroller);\n measuredScroller = covered;\n measureScrollbar();\n if (measuredScroller) chromeObserver?.observe(measuredScroller);\n }\n publishOverlay();\n };\n const overlayObserver = new MutationObserver(syncOverlay);\n overlayObserver.observe(section, {\n childList: true,\n attributes: true,\n attributeFilter: [\n ...OVERLAY_EDGES.map((edge) => edge.presentation),\n CHROME_OVERLAY,\n BOTTOM_TOOLBAR_OVERLAY,\n 'style',\n ],\n });\n syncOverlay();\n\n const onFocusIn = (event: Event): void =>\n rememberFocusedView(event.target as Element | null);\n section.addEventListener('focusin', onFocusIn);\n rememberFocusedView(section.ownerDocument.activeElement);\n\n const crossFadeChrome = (): void => {\n const current = chromeOf(section);\n const animated = duration > 0 && !reducedMotion(view);\n if (!animated) {\n chromeSnapshots = current.map((element) =>\n element.cloneNode(true),\n ) as HTMLElement[];\n return;\n }\n\n section.dataset.navChromeTransition = 'true';\n const copies = chromeSnapshots.map((snapshot) => {\n const copy = snapshot.cloneNode(true) as HTMLElement;\n copy.classList.add('kui-nav-stack__chrome-copy');\n copy.dataset.navChromeCopy = '';\n copy.setAttribute('aria-hidden', 'true');\n copy.setAttribute('inert', '');\n if (copy.hasAttribute('data-nav-stack-bottom'))\n copy.classList.add('kui-nav-stack__chrome-copy--bottom');\n section.append(copy);\n return copy;\n });\n\n current.forEach((element) =>\n element.classList.add('kui-nav-stack__chrome--entering'),\n );\n void section.offsetWidth;\n frame(() => {\n current.forEach((element) =>\n element.classList.remove('kui-nav-stack__chrome--entering'),\n );\n copies.forEach((copy) =>\n copy.classList.add('kui-nav-stack__chrome-copy--exiting'),\n );\n });\n settle(() => {\n copies.forEach((copy) => copy.remove());\n delete section.dataset.navChromeTransition;\n });\n chromeSnapshots = current.map((element) => {\n const snapshot = element.cloneNode(true) as HTMLElement;\n snapshot.classList.remove('kui-nav-stack__chrome--entering');\n return snapshot;\n });\n };\n\n const observer = new MutationObserver((records) => {\n const removed: HTMLElement[] = [];\n for (const record of records) {\n if (record.target !== viewport) continue;\n record.removedNodes.forEach((node) => {\n if (\n node instanceof HTMLElement &&\n node.classList.contains('kui-nav-stack__view') &&\n node.dataset.navExiting !== 'true'\n )\n removed.push(node);\n });\n }\n\n const top = topView(viewport);\n const currentKey = top?.dataset.navKey;\n const poppedTop = removed.find((node) => node.dataset.navKey === activeKey);\n\n if (poppedTop && currentKey !== activeKey) {\n finishTransition();\n // Pop: bring the removed node back briefly to slide it out over the revealed view.\n poppedTop.classList.remove(\n 'kui-nav-stack__view--entering',\n 'kui-nav-stack__view--exiting',\n );\n poppedTop.dataset.navExiting = 'true';\n poppedTop.setAttribute('aria-hidden', 'true');\n viewport.append(poppedTop);\n void poppedTop.offsetWidth;\n play(poppedTop, 'exiting');\n crossFadeChrome();\n if (top) focusInto(top);\n settle(() => poppedTop.remove());\n } else if (currentKey !== activeKey && top) {\n finishTransition();\n const previous = viewsOf(viewport).find(\n (element) => element.dataset.navKey === activeKey,\n );\n if (previous) {\n previous.dataset.navRevealed = 'true';\n settle(() => delete previous.dataset.navRevealed);\n }\n // Push: slide the new top in.\n rememberFocusedView(section.ownerDocument.activeElement);\n play(top, 'entering');\n crossFadeChrome();\n focusInto(top);\n }\n\n activeKey = currentKey;\n // The active view, and so the scroller beneath the chrome, may change.\n syncOverlay();\n });\n observer.observe(viewport, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-nav-key', 'data-nav-active'],\n });\n\n return () => {\n disposeBack();\n section.removeEventListener('focusin', onFocusIn);\n observer.disconnect();\n overlayObserver.disconnect();\n chromeObserver?.disconnect();\n for (const [, state] of edges) {\n state.element = undefined;\n state.size = undefined;\n state.covers = false;\n }\n measuredScroller = undefined;\n scrollbarSize = 0;\n publishOverlay();\n finishTransition();\n for (const [element, previousTabIndex] of generatedFallbacks) {\n if (!element.isConnected || element.tabIndex !== -1) continue;\n if (previousTabIndex === null) element.removeAttribute('tabindex');\n else element.setAttribute('tabindex', previousTabIndex);\n }\n generatedFallbacks.clear();\n rememberedFocus.clear();\n if (previousDuration)\n section.style.setProperty(\n '--kui-nav-stack-transition-duration',\n previousDuration,\n );\n else section.style.removeProperty('--kui-nav-stack-transition-duration');\n };\n}\n"]}
|
|
@@ -9,7 +9,8 @@ interface WireResizableRegionsOptions {
|
|
|
9
9
|
onPreview?: (change: ResizeCommit) => void;
|
|
10
10
|
onCommit: (change: ResizeCommit) => void;
|
|
11
11
|
}
|
|
12
|
+
|
|
12
13
|
/** Wire pointer and separator-keyboard behavior for every ResizableRegion below root. */
|
|
13
|
-
declare function wireResizableRegions(root: HTMLElement,
|
|
14
|
+
declare function wireResizableRegions(root: HTMLElement, options: WireResizableRegionsOptions): () => void;
|
|
14
15
|
|
|
15
16
|
export { type ResizeCommit, type WireResizableRegionsOptions, wireResizableRegions };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An app-owned scroll arrangement outside a `Pane`: the `id` of the element
|
|
3
|
+
* that scrolls and the `id`s of the pinned chrome on each physical side of it.
|
|
4
|
+
* Each named chrome element shows its divider on the side facing the scroller
|
|
5
|
+
* while content is scrolled away beyond that side. Ids are resolved below the
|
|
6
|
+
* wired root on every refresh, so a re-render that replaces an element keeps
|
|
7
|
+
* the pairing.
|
|
8
|
+
*/
|
|
9
|
+
interface ScrollDividerTarget {
|
|
10
|
+
/** The `id` of the scrolling element. */
|
|
11
|
+
scroller: string;
|
|
12
|
+
/** Chrome above the scroller: shows its bottom divider once scrolled down. */
|
|
13
|
+
top?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Chrome right of the scroller: shows its left divider while content is
|
|
16
|
+
* hidden beyond the scroller's right edge (never when nothing overflows).
|
|
17
|
+
*/
|
|
18
|
+
right?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Chrome below the scroller: shows its top divider while content is hidden
|
|
21
|
+
* beyond the scroller's bottom edge (never when nothing overflows).
|
|
22
|
+
*/
|
|
23
|
+
bottom?: string;
|
|
24
|
+
/** Chrome left of the scroller: shows its right divider once scrolled right. */
|
|
25
|
+
left?: string;
|
|
26
|
+
}
|
|
27
|
+
interface WireScrollDividersOptions {
|
|
28
|
+
/**
|
|
29
|
+
* App-owned scroll arrangements to pair beyond the ones found by structure
|
|
30
|
+
* (every `Pane`'s header and footer around its content, every `NavStack`'s
|
|
31
|
+
* and `TabNavigator`'s chrome around its active region, and every `TabBar`
|
|
32
|
+
* strip).
|
|
33
|
+
*/
|
|
34
|
+
targets?: readonly ScrollDividerTarget[];
|
|
35
|
+
}
|
|
36
|
+
type Root = HTMLElement | Document;
|
|
37
|
+
/**
|
|
38
|
+
* Wire scroll dividers below `root`: a divider between pinned chrome and the
|
|
39
|
+
* content that scrolls beside it shows only while content is scrolled away
|
|
40
|
+
* from that edge. Near edges (top, left) hide at the scroll start; far edges
|
|
41
|
+
* (bottom, right) hide at the scroll end and whenever nothing overflows.
|
|
42
|
+
*
|
|
43
|
+
* The wiring only reports scroll state; each component draws its own divider
|
|
44
|
+
* from it. It writes `data-scroll-overflow` (the edges with hidden content, in
|
|
45
|
+
* canonical `t`/`r`/`b`/`l` order) on each scroller, and `data-scroll-divider`
|
|
46
|
+
* (the sides to draw) on each paired chrome element:
|
|
47
|
+
*
|
|
48
|
+
* - every `Pane` with a header or footer: its header shows a bottom divider and
|
|
49
|
+
* its footer a top divider (drawn by the Pane, per its `chromeDividers`);
|
|
50
|
+
* - every `NavStack`'s top chrome and bottom toolbar around its active view,
|
|
51
|
+
* and every `TabNavigator`'s bar under its active scene: the chrome shows a
|
|
52
|
+
* bottom (top chrome) or top (bottom toolbar, bar) divider. The scroller is
|
|
53
|
+
* whichever element actually scrolls there: the view or scene itself, or,
|
|
54
|
+
* through a sole child with no chrome of its own on that edge, a `Pane`'s
|
|
55
|
+
* content or a nested `NavStack` / `TabNavigator` region (a Pane's own header
|
|
56
|
+
* or footer draws that boundary instead);
|
|
57
|
+
* - every `TabBar` strip: the bar draws a divider on each side of the strip
|
|
58
|
+
* whose tabs are scrolled out of view;
|
|
59
|
+
* - each app-owned `targets` pairing: a `Toolbar` or `List` named as chrome
|
|
60
|
+
* draws the divider on its facing side.
|
|
61
|
+
*
|
|
62
|
+
* It also measures every `Pane` header laid over its content
|
|
63
|
+
* (`headerPresentation="overlay"`, with fixed chrome placement): it publishes
|
|
64
|
+
* the header's border-box block size on the Pane root as the inherited
|
|
65
|
+
* `--kui-scroll-clearance-block-start` context, and marks the root
|
|
66
|
+
* `data-header-overlay="measured"`, which moves the header over the content
|
|
67
|
+
* and has the content clear it. The measurement follows the header as it
|
|
68
|
+
* wraps, zooms, or changes content, and both are restored before paint if a
|
|
69
|
+
* re-render drops them.
|
|
70
|
+
*
|
|
71
|
+
* Structure is re-read after every DOM change below root that can change a
|
|
72
|
+
* pairing — a structural element or target id added, removed, or re-classed;
|
|
73
|
+
* mutations inside scrolled content (a row's class, a list's rows) do not
|
|
74
|
+
* re-read it. Either way the scrollers are re-measured once the next frame
|
|
75
|
+
* has laid out, before it paints, so a large render never forces a layout
|
|
76
|
+
* (where `ResizeObserver` is missing, structure is measured at once and
|
|
77
|
+
* content in the next animation frame) — and a re-render that drops the
|
|
78
|
+
* attributes gets them back before paint.
|
|
79
|
+
* Scroll is tracked with one capturing listener per registered root, and size
|
|
80
|
+
* changes of each scroller and its children with a `ResizeObserver`. Overlapping registrations
|
|
81
|
+
* share one attribute writer; each disposer removes its registration, and the
|
|
82
|
+
* final disposer removes the wiring-owned attributes. See
|
|
83
|
+
* `docs/23-app-layouts.md` §3.7.
|
|
84
|
+
*/
|
|
85
|
+
declare function wireScrollDividers(root: Root, { targets }?: WireScrollDividersOptions): () => void;
|
|
86
|
+
|
|
87
|
+
export { type ScrollDividerTarget, type WireScrollDividersOptions, wireScrollDividers };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"wire-scroll-dividers.js"}
|
package/dist/wire-sidebar.d.ts
CHANGED
|
@@ -14,9 +14,18 @@ interface WireSidebarPanel {
|
|
|
14
14
|
collapsed: Signal<boolean>;
|
|
15
15
|
/** `data-action` value the panel's toggle button(s) carry. */
|
|
16
16
|
toggleAction: string;
|
|
17
|
-
/** When set, the collapsed state is loaded from and saved to
|
|
18
|
-
* this key (a persistence hook), so the panel remembers
|
|
17
|
+
/** When set, the panel's inline collapsed state is loaded from and saved to
|
|
18
|
+
* `storage` under this key (a persistence hook), so the panel remembers the
|
|
19
|
+
* user's inline choice. A compact overlay's open/closed state is transient
|
|
20
|
+
* and is never persisted. */
|
|
19
21
|
storageKey?: string;
|
|
22
|
+
/** The panel's inline (non-compact) collapsed state when `storage` holds no
|
|
23
|
+
* choice for it; wire-up seeds the signal with it. Defaults to the signal's
|
|
24
|
+
* own value. Set it when the app seeds the signal from the device class
|
|
25
|
+
* (`signal(device.value.compact)`) so a compact first render already starts
|
|
26
|
+
* collapsed while a later crossing to a wide class still restores this
|
|
27
|
+
* inline default. */
|
|
28
|
+
inlineCollapsed?: boolean;
|
|
20
29
|
}
|
|
21
30
|
interface WireSidebarOptions {
|
|
22
31
|
panels: readonly WireSidebarPanel[];
|
|
@@ -26,8 +35,19 @@ interface WireSidebarOptions {
|
|
|
26
35
|
* dismissable backdrop, Escape and backdrop-click collapse it, and focus is
|
|
27
36
|
* trapped within the open panel (the ARIA dialog pattern). Without it the panel
|
|
28
37
|
* is always inline.
|
|
38
|
+
*
|
|
39
|
+
* An overlay is transient and user-initiated: whenever the compact overlay
|
|
40
|
+
* presentation begins (wire-up on a compact device, or a crossing from a wide
|
|
41
|
+
* class), every panel starts collapsed so nothing blocks the page until the
|
|
42
|
+
* user opens it. The inline state is remembered and restored when the device
|
|
43
|
+
* crosses back to a wide class (and on disposal).
|
|
29
44
|
*/
|
|
30
45
|
deviceClass?: ReadonlySignal<DeviceClass>;
|
|
46
|
+
/** Compact devices either overlay the panels (default) or hide them in favor
|
|
47
|
+
* of an application-owned responsive replacement. */
|
|
48
|
+
compactPresentation?: 'overlay' | 'hidden';
|
|
49
|
+
/** Collapse the other panels when one opens in compact overlay mode. */
|
|
50
|
+
exclusiveCompact?: boolean;
|
|
31
51
|
/** Persistence store (default `globalThis.localStorage`, if present). */
|
|
32
52
|
storage?: SidebarStorage;
|
|
33
53
|
}
|
|
@@ -36,8 +56,8 @@ interface WireSidebarOptions {
|
|
|
36
56
|
* delegation with focus restore, focus-into on open, an optional compact overlay
|
|
37
57
|
* (backdrop + Escape + focus trap) driven by {@link deviceClass}, and an optional
|
|
38
58
|
* persistence hook. The app owns each `collapsed` signal and the layout; this wire
|
|
39
|
-
* owns the interaction. Returns a disposer. See `docs/
|
|
59
|
+
* owns the interaction. Returns a disposer. See `ui/docs/collapsible-panel.md` and `docs/23-app-layouts.md`.
|
|
40
60
|
*/
|
|
41
|
-
declare function wireSidebar(root: HTMLElement, { panels, deviceClass, storage }: WireSidebarOptions): () => void;
|
|
61
|
+
declare function wireSidebar(root: HTMLElement, { panels, deviceClass, compactPresentation, exclusiveCompact, storage, }: WireSidebarOptions): () => void;
|
|
42
62
|
|
|
43
63
|
export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wireSidebar };
|