@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/docs/split-view.md
CHANGED
|
@@ -8,11 +8,29 @@ on compact ones. One of the opt-in app layouts (see
|
|
|
8
8
|
```ts
|
|
9
9
|
import { SplitView } from "@kerfjs/ui/split-view";
|
|
10
10
|
import { deviceClass } from "@kerfjs/ui/device-class";
|
|
11
|
-
|
|
12
|
-
// plus nav-stack.css when the compact path is reachable, and
|
|
13
|
-
// wireResizableRegions / wireNavStack for the interactive behavior.
|
|
11
|
+
// plus wireResizableRegions / wireNavStack for the interactive behavior.
|
|
14
12
|
```
|
|
15
13
|
|
|
14
|
+
In a browser bundler that honors the `browser` export condition (Vite, esbuild, and
|
|
15
|
+
webpack do by default), the import above also
|
|
16
|
+
loads SplitView's stylesheet and those of the components it renders internally
|
|
17
|
+
(its compact `NavStack`, `ResizableRegion`, and the toolbar
|
|
18
|
+
components). Without that condition, import the manual stylesheets instead:
|
|
19
|
+
`@kerfjs/ui/split-view.css` plus those components' CSS, or `@kerfjs/ui/styles.css`.
|
|
20
|
+
|
|
21
|
+
## Safe areas
|
|
22
|
+
|
|
23
|
+
The list pane grows by the inline-start unsafe inset and pads for the edges it
|
|
24
|
+
touches; the detail pads for its own outer edges. Neither is inset on the
|
|
25
|
+
shared interior edge. A pane whose only child is a `Pane` lets that child own
|
|
26
|
+
the insets, and the compact form hands them to its `NavStack`. See
|
|
27
|
+
[Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
28
|
+
|
|
29
|
+
For a lowered list or detail background, render a `Pane` in that region with
|
|
30
|
+
`appearance="sunken"`. SplitView arranges regions but does not own their
|
|
31
|
+
vertical scroll; its compact NavStack form can use the view's or nested Pane's
|
|
32
|
+
appearance. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
33
|
+
|
|
16
34
|
## Responsive by device class
|
|
17
35
|
|
|
18
36
|
`SplitView` is declarative; the app derives `compact` from the device class and
|
|
@@ -37,13 +55,84 @@ const selected = signal<string | null>(null);
|
|
|
37
55
|
|
|
38
56
|
- **Roomy** (`compact: false`): both panes show. With `resizable`, the list sits
|
|
39
57
|
in a `ResizableRegion` (wire it with `wireResizableRegions`); without it the
|
|
40
|
-
list takes a fixed
|
|
41
|
-
|
|
58
|
+
list takes a fixed width and the detail fills the rest. Set it with
|
|
59
|
+
`listWidth`: a number of CSS pixels (default 320), or `{ size, maxFraction }`
|
|
60
|
+
to cap the preferred size at that share of the SplitView's own width, so a
|
|
61
|
+
narrow container (a dialog, a small window) always leaves the detail in view —
|
|
62
|
+
`listWidth={{ size: 432, maxFraction: 0.5 }}` is 432px until the split is
|
|
63
|
+
narrower than 864px, then half of it. `listWidth` is for the fixed split; a
|
|
64
|
+
resizable list is sized by `resizable` (combining them throws). The
|
|
65
|
+
`--kui-split-view-list-width` token remains for theme-level defaults; the
|
|
66
|
+
prop wins over it.
|
|
42
67
|
- **Compact** (`compact: true`): the split collapses to a `NavStack`. The list is
|
|
43
68
|
the root; when `detailActive` is true the detail is pushed over it with an
|
|
44
69
|
automatic back control (wire it with `wireNavStack`, whose `onBack` clears the
|
|
45
70
|
app's selection). This is the portrait-tablet / handset presentation; as a
|
|
46
71
|
dialog the compact form is a full-screen or large partial-cover modal.
|
|
47
72
|
|
|
73
|
+
## Filling its container
|
|
74
|
+
|
|
75
|
+
A SplitView fills its container's block size: give the container a definite
|
|
76
|
+
height (a fixed or viewport-bounded `height`, a flex item that grows, a grid
|
|
77
|
+
row) and the split stretches to it, with each `Pane` owning its own scrolling.
|
|
78
|
+
That holds in a block box, a fixed-size native popover or dialog, a flex column
|
|
79
|
+
below a header, and a grid; no app-side `display: grid` /
|
|
80
|
+
`grid-template-rows: minmax(0, 1fr)` wrapper is needed. A container sized only
|
|
81
|
+
by `max-height` has no height to fill, so the split takes its content height;
|
|
82
|
+
give such a container a `height` instead.
|
|
83
|
+
|
|
84
|
+
## Configuring the list region and the compact stack
|
|
85
|
+
|
|
86
|
+
`resizable` forwards the list's `ResizableRegion` configuration alongside
|
|
87
|
+
`size`, `min`, and `max`: `separator` (`"hidden"` keeps the resize hit target
|
|
88
|
+
but paints no line), `handleIcon`, `contentOverflow`, and collapse —
|
|
89
|
+
`collapsed`, `transitioning`, `collapseMotion`, `restoreControl`, and
|
|
90
|
+
`restorePosition`. A collapsed list snaps to zero width, renders `inert` and
|
|
91
|
+
`aria-hidden`, and the detail fills the split; the app owns the `collapsed`
|
|
92
|
+
flag and renders the restore control (usually a `FloatingToolbar`). Omitted
|
|
93
|
+
options keep the region's defaults.
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
resizable={{
|
|
97
|
+
size: listWidth.value,
|
|
98
|
+
min: 220,
|
|
99
|
+
max: 480,
|
|
100
|
+
collapsed: listCollapsed.value,
|
|
101
|
+
restoreControl: <ShowThreadsToolbar />,
|
|
102
|
+
}}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`compactStack` configures the compact `NavStack`: `toolbarConfig`, `backIcon`,
|
|
106
|
+
`backText`, `hideToolbar`, the persistent `bottomToolbar`, and `chromeDividers`
|
|
107
|
+
forward to the stack, and `list` / `detail` give each view its own structured
|
|
108
|
+
top `toolbar` (`leading`, `center`, `trailing`) and `bottomToolbar`:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
compactStack={{
|
|
112
|
+
backText: "Threads",
|
|
113
|
+
toolbarConfig: { headingLevel: 1 },
|
|
114
|
+
list: { toolbar: { trailing: <ComposeGroup /> } },
|
|
115
|
+
detail: {
|
|
116
|
+
toolbar: { trailing: <ReplyGroup /> },
|
|
117
|
+
bottomToolbar: { label: "Message Actions", leading: <MessageActions /> },
|
|
118
|
+
},
|
|
119
|
+
}}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The catalog's **Interactive Compact Drill-Down** example exercises this exact
|
|
123
|
+
controlled flow: a list action sets the selected message, `detailActive` pushes
|
|
124
|
+
its detail, and the wired Back action clears the selection to reveal the
|
|
125
|
+
preserved list. It also forwards `compactStack`: a level-2 heading title over
|
|
126
|
+
a bottom divider, a Compose group on the list view, and a Reply group plus a
|
|
127
|
+
bottom toolbar on the detail. Use the same structure in application demos so
|
|
128
|
+
compact examples show the interaction rather than rendering a disconnected
|
|
129
|
+
detail state.
|
|
130
|
+
|
|
131
|
+
The catalog's **Resizable, Collapsible List** example forwards `resizable`: a
|
|
132
|
+
hidden separator that still resizes the list (its committed width comes back
|
|
133
|
+
through `wireResizableRegions`' `onCommit` into the app's size signal), a Hide
|
|
134
|
+
control in the list's own toolbar, and a `FloatingToolbar` restore control in
|
|
135
|
+
the split's bottom-start corner.
|
|
136
|
+
|
|
48
137
|
Compose the interactive wiring from the existing helpers — `SplitView` adds no
|
|
49
138
|
wire of its own.
|
package/docs/sunken-panel.md
CHANGED
|
@@ -8,7 +8,7 @@ issue tracker or component catalog.
|
|
|
8
8
|
```tsx
|
|
9
9
|
import { SunkenPanel } from '@kerfjs/ui/sunken-panel';
|
|
10
10
|
|
|
11
|
-
<SunkenPanel ariaLabel="Release
|
|
11
|
+
<SunkenPanel ariaLabel="Release Workspace">
|
|
12
12
|
<ReleaseSummary />
|
|
13
13
|
<ReleaseChecks />
|
|
14
14
|
</SunkenPanel>;
|
|
@@ -23,6 +23,28 @@ The default `shape="rounded"` uses the shared rounded-rectangle radius. Choose
|
|
|
23
23
|
</SunkenPanel>
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
## Filling a work area
|
|
27
|
+
|
|
28
|
+
Set `fill` when the panel is the direct layout root of a parent with a definite
|
|
29
|
+
height. Inside a flex column, use `flex` so it takes the remaining space and
|
|
30
|
+
can shrink with its parent. Like `Grid`, `flex` accepts `true` (equivalent to
|
|
31
|
+
`1 1 auto`), a CSS flex keyword, or a typed `CssFlex` value. The panel keeps
|
|
32
|
+
`min-height: 0`, allowing its parent to own scrolling.
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<List fill>
|
|
36
|
+
<Toolbar label="Work Area" />
|
|
37
|
+
<SunkenPanel flex>
|
|
38
|
+
<WorkArea />
|
|
39
|
+
</SunkenPanel>
|
|
40
|
+
</List>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Inside a `Pane`, the Pane's content remains the scroll owner. Place a
|
|
44
|
+
`SunkenPanel fill` in a definite-height Pane content region when the surface
|
|
45
|
+
itself needs to cover empty space, or use `flex` when a flex parent allocates
|
|
46
|
+
the remaining space. The panel does not add another scroller.
|
|
47
|
+
|
|
26
48
|
## Ownership
|
|
27
49
|
|
|
28
50
|
The root owns its lowered background, 8px padding, and 8px vertical gap.
|
|
@@ -34,10 +56,20 @@ Use `ariaLabel` only when the surface is a distinct region people need to find
|
|
|
34
56
|
by name. With a label, the root receives `role="region"`; without one it remains
|
|
35
57
|
a non-landmark grouping.
|
|
36
58
|
|
|
59
|
+
Set `tabIndex={0}` to include the whole panel in the Tab order, or
|
|
60
|
+
`tabIndex={-1}` for a programmatic focus target. Keyboard focus draws the
|
|
61
|
+
standard focus ring. `outlined` keeps the same ring visible independently of
|
|
62
|
+
focus, for example while the panel is a drop target. Give a focusable work area
|
|
63
|
+
an `ariaLabel` when it is a distinct named region.
|
|
64
|
+
|
|
37
65
|
Do not use `SunkenPanel` merely to add padding, as a substitute for pane
|
|
38
66
|
header/content/footer anatomy, or around a child that already owns the same
|
|
39
67
|
outer surface.
|
|
40
68
|
|
|
69
|
+
For a lowered scrolling work area with Pane chrome, use
|
|
70
|
+
[`Pane appearance="sunken"`](layout.md#lowered-work-surfaces). It paints the
|
|
71
|
+
scroll viewport and empty space without adding a second scroller.
|
|
72
|
+
|
|
41
73
|
## Public styling boundary
|
|
42
74
|
|
|
43
75
|
Override the public properties at the composition boundary:
|
|
@@ -48,6 +80,27 @@ Override the public properties at the composition boundary:
|
|
|
48
80
|
- `--kui-sunken-panel-gap`
|
|
49
81
|
- `--kui-sunken-panel-radius`
|
|
50
82
|
|
|
83
|
+
The default background uses the shared translucent lowered-surface token.
|
|
84
|
+
Nested panels composite naturally at every depth: darker in light mode and
|
|
85
|
+
lighter in dark mode, without wrappers, depth classes, or per-instance token
|
|
86
|
+
assignments. Pane and Web Awesome sunken surfaces use the same palette.
|
|
87
|
+
See [Contextual transparency](./webawesome-theme.md#contextual-transparency).
|
|
88
|
+
Keep ordinary composition on these defaults; public properties are theming
|
|
89
|
+
escape hatches, not a reason to restyle each demo or nesting level.
|
|
90
|
+
|
|
91
|
+
Every sunken surface — SunkenPanel, `Pane appearance="sunken"`, sunken
|
|
92
|
+
Workbench regions and TabNavigator scenes, and Web Awesome
|
|
93
|
+
`appearance="sunken"` — paints `--kui-sunken-surface`: a fine, monochrome
|
|
94
|
+
grain (a seeded 100px tile at 4% maximum opacity) over the lowered color. The
|
|
95
|
+
tile is drawn once per page, at runtime, by the first sunken surface that
|
|
96
|
+
renders (nothing ships as an asset; server rendering paints the flat color
|
|
97
|
+
until the browser renders one). Translucent children such as a `ValueTable`
|
|
98
|
+
let the grain show through rather than adding their own. Set
|
|
99
|
+
`--kui-sunken-texture: none` at `:root` for a flat lowered surface, or to
|
|
100
|
+
another image; call `ensureSunkenTexture()` (exported from
|
|
101
|
+
`@kerfjs/ui/sunken-panel`) on a page whose only sunken surfaces are Web Awesome
|
|
102
|
+
elements.
|
|
103
|
+
|
|
51
104
|
The public root class is `.kui-sunken-panel`. Prefer the properties above over
|
|
52
105
|
styling descendants. The `square` shape deliberately overrides the radius
|
|
53
106
|
property with zero; use `rounded` when customizing the radius token.
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# Dialog and popup surface scaffolds
|
|
2
|
+
|
|
3
|
+
`DialogSurface` and `PopupSurface` configure recurring Web Awesome surface
|
|
4
|
+
geometry without application `::part()` overrides. They do not replace Web
|
|
5
|
+
Awesome behavior: the application still owns open state, dismissal policy, ids,
|
|
6
|
+
labels, and content. With `@kerfjs/ui/popup-menu/register` imported, a dropdown
|
|
7
|
+
inside `PopupSurface` also keeps keyboard item navigation made during its show
|
|
8
|
+
animation when Web Awesome completes its initial focus handoff.
|
|
9
|
+
|
|
10
|
+
Wrap one `wa-dialog` with `DialogSurface`. Choose `size` (`small`, `medium`, or
|
|
11
|
+
`large`), `presentation` (`modal`, `side-sheet`, or `fullscreen`), and independent
|
|
12
|
+
`bodyInset` / `footerInset` (`none`, `compact`, or `comfortable`). The defaults
|
|
13
|
+
match Kerf's medium modal, 8px body, and 16px footer rhythm.
|
|
14
|
+
|
|
15
|
+
The modal size presets have preferred widths of 400px, 560px, and 800px,
|
|
16
|
+
respectively, before the viewport width cap. Set `preferredWidth` to a branded
|
|
17
|
+
`CssLength` when the desktop shell needs another width. It takes precedence over
|
|
18
|
+
`size`, while the viewport cap still applies. For example, 832px and 480px
|
|
19
|
+
desktop preferences can share the same responsive dialog without changing its
|
|
20
|
+
resource tracks or preview aspect sizing.
|
|
21
|
+
|
|
22
|
+
### Sibling dialogs keep their identity
|
|
23
|
+
|
|
24
|
+
Every `DialogSurface` root has the same structure, so two sibling dialogs that
|
|
25
|
+
are rendered conditionally are matched by position when the page re-renders:
|
|
26
|
+
one open dialog's element (with its accessible name and open state) can be
|
|
27
|
+
reused for another, and Web Awesome events such as `wa-after-hide` fire on the
|
|
28
|
+
wrong dialog or not at all. Give each sibling a stable key on its root with
|
|
29
|
+
`rootAttributes`, instead of wrapping it in an app `div`:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
<DialogSurface rootAttributes={{ "data-key": "project-setup" }}>
|
|
33
|
+
<wa-dialog label="Set up project">…</wa-dialog>
|
|
34
|
+
</DialogSurface>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`rootAttributes` takes `data-*` identity only; the surface's own configuration
|
|
38
|
+
attributes (`data-size`, `data-presentation`, …) stay protected.
|
|
39
|
+
|
|
40
|
+
### Modal viewport bounds
|
|
41
|
+
|
|
42
|
+
`viewportGutter` accepts a branded `CssLength` from `@kerfjs/ui/css-values`.
|
|
43
|
+
It sets the minimum horizontal clearance; `preferredWidth` overrides the `size`
|
|
44
|
+
preset when supplied. `maxHeight` accepts a branded length or `"viewport"`; explicit caps are
|
|
45
|
+
clamped to the dynamic viewport height minus twice the gutter (16px per edge
|
|
46
|
+
when the gutter is omitted). Negative gutters/caps clamp to zero. Omitting
|
|
47
|
+
both options preserves Web Awesome's existing width and phone height caps.
|
|
48
|
+
These options apply only to `presentation="modal"`; side sheets and fullscreen
|
|
49
|
+
surfaces keep their own geometry.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import '@kerfjs/ui/surface-scaffold/register';
|
|
53
|
+
import { remify } from '@kerfjs/ui/css-values';
|
|
54
|
+
import { DialogSurface } from '@kerfjs/ui/surface-scaffold';
|
|
55
|
+
|
|
56
|
+
<DialogSurface preferredWidth={remify(832)} viewportGutter={remify(8)} maxHeight="viewport" bodyInset="none">
|
|
57
|
+
<wa-dialog label="Close Workspace">{/* Application-owned content and footer */}</wa-dialog>
|
|
58
|
+
</DialogSurface>;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This gives a desktop modal an 832px preferred width and a phone modal an 8px edge gutter with a `calc(100dvh - 16px)` height
|
|
62
|
+
cap without application selectors on Kerf roots or Web Awesome parts. A cap
|
|
63
|
+
is not a fixed height: short content stays naturally sized, and taller content
|
|
64
|
+
scrolls in Web Awesome's body while its header/footer remain outside that
|
|
65
|
+
scroll owner. Choosing a larger cap cannot guarantee that arbitrary content
|
|
66
|
+
fits without scrolling; preview tracks, canvas aspect ratios and content sizing
|
|
67
|
+
remain application-owned.
|
|
68
|
+
|
|
69
|
+
Responsive policy is explicit application state: read `deviceClass()` during
|
|
70
|
+
the render to choose the gutter, cap or presentation. For example use
|
|
71
|
+
`viewportGutter={remify(device.value.handset ? 8 : 16)}` with `maxHeight="viewport"`.
|
|
72
|
+
The scaffold introduces no hidden breakpoint or automatic fullscreen switch.
|
|
73
|
+
An application can configure device-class breakpoints when its phone policy
|
|
74
|
+
differs from the default. Prefer a typed cap such as `maxHeight={remify(640)}`
|
|
75
|
+
when the modal should stop growing before the viewport bound.
|
|
76
|
+
|
|
77
|
+
### Filling the dialog
|
|
78
|
+
|
|
79
|
+
`maxHeight` caps a modal that sizes to its content. A layout that fills the
|
|
80
|
+
dialog (a list-detail `SplitView`, a `Pane` with its own chrome and scroller)
|
|
81
|
+
needs a height to fill instead: set `height` to a branded length or
|
|
82
|
+
`"viewport"`. It is bounded exactly like `maxHeight` (the dynamic viewport minus
|
|
83
|
+
both gutters) and takes precedence over it. `bodyLayout="fill"` then gives the
|
|
84
|
+
body's whole height to its one child, which owns its own scrolling; the body
|
|
85
|
+
itself stops scrolling. Combine it with `bodyInset="none"`.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<DialogSurface size="large" height={remify(640)} viewportGutter={remify(8)} bodyInset="none" bodyLayout="fill">
|
|
89
|
+
<wa-dialog label="Repository Status">
|
|
90
|
+
<SplitView id="repo-split" label="Changes" listWidth={{ size: 432, maxFraction: 0.5 }} list={list} detail={detail} />
|
|
91
|
+
</wa-dialog>
|
|
92
|
+
</DialogSurface>;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Chat dialogs: a floating footer over a filling transcript
|
|
96
|
+
|
|
97
|
+
A chat-style dialog keeps a heading or notices above one scrolling transcript
|
|
98
|
+
and floats its composer over the body's block end. Two props compose it:
|
|
99
|
+
|
|
100
|
+
- `bodyLayout="fill-last"` stacks the body's children: the leading children
|
|
101
|
+
keep their natural height, and the last one takes the remaining height and
|
|
102
|
+
owns its scrolling (a `scrollable` `List` transcript). The body itself stops
|
|
103
|
+
scrolling. `PopoverDialogSurface` accepts the same layout.
|
|
104
|
+
- `footerPresentation="floating"` lays the footer over the body's block end,
|
|
105
|
+
`footerOffset` (a branded `CssLength`, default the 16px container inset)
|
|
106
|
+
from the panel's inline and block-end edges, on a transparent background.
|
|
107
|
+
The modal panel is its positioning context. The default `docked` footer
|
|
108
|
+
sits below the body as before.
|
|
109
|
+
|
|
110
|
+
The register measures the footer (it follows a composer that grows, wraps, or
|
|
111
|
+
hides) and the body reserves that height plus the offset after its own inset,
|
|
112
|
+
with a matching `scroll-padding`. Flowing body content scrolls beneath the
|
|
113
|
+
floating footer and its end stays reachable above it; with `fill` or
|
|
114
|
+
`fill-last` the filling child's scrollport ends at the footer's top. Content
|
|
115
|
+
is never hidden beneath the footer.
|
|
116
|
+
|
|
117
|
+
To let a filling transcript scroll visibly beneath the floating footer, opt
|
|
118
|
+
its scroller in with `scrollClearance="block-end"` (a `scrollable` `List`, or a
|
|
119
|
+
`Pane`, as the `fill` or last `fill-last` child). The body then stops
|
|
120
|
+
reserving the footer below that child, so the child reaches the panel's block
|
|
121
|
+
end, and publishes the footer's clearance (measured height plus offset) as the
|
|
122
|
+
inherited `--kui-scroll-clearance-block-end` context. The child adds it to its
|
|
123
|
+
own block-end padding and `scroll-padding`: messages pass beneath the
|
|
124
|
+
transparent footer mid-scroll, the last message rests above the composer at
|
|
125
|
+
the end, and focus or `scrollIntoView` never leaves an item hidden beneath it.
|
|
126
|
+
The context is general: chrome that overlays a region's block-start or
|
|
127
|
+
block-end edge publishes `--kui-scroll-clearance-block-start` / `-end`, and a
|
|
128
|
+
scroll owner opts in per edge (see `docs/layout.md` "Scroll clearance"). A
|
|
129
|
+
dialog body clears any clearance inherited from the page.
|
|
130
|
+
|
|
131
|
+
Choose the offset like any other responsive value: the scaffold adds no
|
|
132
|
+
breakpoint. An 8px offset lines a composer up with the transcript's
|
|
133
|
+
content-item edges when the body has `bodyInset="none"` and list geometry;
|
|
134
|
+
`viewportGutter` and `footerOffset` can follow `deviceClass()` when a phone
|
|
135
|
+
needs tighter edges. Put a [`Composer`](./composer.md) in the floating footer
|
|
136
|
+
with `footerInset="none"`: its raised frame and shadow lift it over the
|
|
137
|
+
transcript, and its field grows the measured footer. With `submitOnEnter` and
|
|
138
|
+
`wireComposers(root)`, Enter sends through the same action as the Send button.
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
<DialogSurface height={remify(560)} viewportGutter={remify(8)} bodyInset="none" bodyLayout="fill-last" footerPresentation="floating" footerOffset={remify(8)} footerInset="none">
|
|
142
|
+
<wa-dialog label="Assistant">
|
|
143
|
+
<StateBanner title="Answers use the latest nightly build." tone="neutral" />
|
|
144
|
+
<List gap="xs" controlInsets="tb" scrollable scrollClearance="block-end">
|
|
145
|
+
{messages.map((message) => (
|
|
146
|
+
<ContentItem bubble={message.mine ? 'end' : 'start'} appearance={message.mine ? 'brand-loud' : 'neutral'}>
|
|
147
|
+
<Text variant="span">{message.text}</Text>
|
|
148
|
+
</ContentItem>
|
|
149
|
+
))}
|
|
150
|
+
</List>
|
|
151
|
+
<Composer submitOnEnter slot="footer" id="assistant-message" name="message" label="Message" placeholder="Ask about this build" actions={<wa-button variant="brand" data-action="send-message">Send</wa-button>} />
|
|
152
|
+
</wa-dialog>
|
|
153
|
+
</DialogSurface>;
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### A floating title bar
|
|
157
|
+
|
|
158
|
+
`headerPresentation="floating"` lays the dialog's header (its title and close
|
|
159
|
+
control) over the body's block-start edge on the translucent chrome material,
|
|
160
|
+
`--kui-chrome-material-raised` (the raised panel surface at 80% opacity)
|
|
161
|
+
behind `--kui-chrome-material-filter` (a blur and saturation backdrop filter).
|
|
162
|
+
Content passing beneath the title bar reads as softened color, not as
|
|
163
|
+
competing text. The default `docked` header sits above the body as before.
|
|
164
|
+
|
|
165
|
+
The register measures the header the same way it measures the footer (it
|
|
166
|
+
follows a title that wraps, text that grows, or a `without-header` toggle).
|
|
167
|
+
The body reserves the measured height before its own inset, with a matching
|
|
168
|
+
`scroll-padding`, so flowing content starts below the title bar and scrolls
|
|
169
|
+
beneath it. A dialog without the register has no measurement, so its header
|
|
170
|
+
stays docked rather than covering content.
|
|
171
|
+
|
|
172
|
+
To let a filling transcript scroll visibly beneath the title bar, make it the
|
|
173
|
+
body's only child (`bodyLayout="fill"`, or `fill-last` with no leading rows)
|
|
174
|
+
and opt its scroller in with block-start `scrollClearance`. The body then
|
|
175
|
+
stops reserving the header, so the child reaches the panel's block-start
|
|
176
|
+
edge, and publishes the header's height as `--kui-scroll-clearance-block-start`.
|
|
177
|
+
Leading `fill-last` rows (a notice above the transcript) keep the body's
|
|
178
|
+
reservation: they never sit beneath the title bar. Combined with a floating
|
|
179
|
+
composer and `scrollClearance="both"`, the transcript scrolls beneath both:
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
<DialogSurface height={remify(560)} viewportGutter={remify(8)} bodyInset="none" bodyLayout="fill" headerPresentation="floating" footerPresentation="floating" footerOffset={remify(8)} footerInset="none">
|
|
183
|
+
<wa-dialog label="Release Thread">
|
|
184
|
+
<ToolbarText slot="label" text="Release Thread" size="xlarge" description="Engineering · 5.2 candidate" />
|
|
185
|
+
<List gap="xs" controlInsets="tb" scrollable scrollClearance="both">
|
|
186
|
+
{bubbles}
|
|
187
|
+
</List>
|
|
188
|
+
<Composer submitOnEnter slot="footer" id="thread-message" name="message" label="Message" placeholder="Reply to the thread" actions={<wa-button variant="brand" data-action="send-message">Send</wa-button>} />
|
|
189
|
+
</wa-dialog>
|
|
190
|
+
</DialogSurface>;
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Like a `Pane`'s overlay header, the title bar draws its divider as scroll
|
|
194
|
+
state: a 1px line along its bottom edge only while the body, or a filling
|
|
195
|
+
child that reaches beneath it, is scrolled away from its top, and none at
|
|
196
|
+
rest. The register follows those scrollers (a nested scroller that starts
|
|
197
|
+
below the title bar never counts), and the line is an inset shadow, so it
|
|
198
|
+
never moves the header or the content.
|
|
199
|
+
|
|
200
|
+
The material turns opaque under `prefers-reduced-transparency: reduce` or
|
|
201
|
+
`prefers-contrast: more`, and where the browser lacks `backdrop-filter`; in
|
|
202
|
+
forced colors the header paints `Canvas` with a `CanvasText` bottom edge.
|
|
203
|
+
|
|
204
|
+
For a title with a short supporting line, slot a `ToolbarText` as the label
|
|
205
|
+
(`<ToolbarText slot="label" text="Release Thread" size="xlarge" description="Engineering · 5.2 candidate" />`).
|
|
206
|
+
On the floating title bar an untoned `ToolbarText` keeps AA by itself: its
|
|
207
|
+
title takes the normal text color and its description lifts halfway toward
|
|
208
|
+
it. Any other quiet copy you place there can fall below AA over the content
|
|
209
|
+
passing beneath it, so keep it in the body (see
|
|
210
|
+
[Accessibility › Chrome material](accessibility.md#chrome-material)).
|
|
211
|
+
|
|
212
|
+
Treat a dialog body as a `List` by default. When its rows or sections own their
|
|
213
|
+
standard list geometry, set `bodyInset="none"` so the dialog does not add a
|
|
214
|
+
second inset. Bare prose is still a list child: wrap it in `ListInsetText` so its
|
|
215
|
+
text edge receives the standard 8px margin + 1px transparent border + 8px
|
|
216
|
+
padding and aligns with bordered siblings. Reserve `compact` or `comfortable`
|
|
217
|
+
body insets for exceptional content that does not already have list/content-item
|
|
218
|
+
geometry.
|
|
219
|
+
|
|
220
|
+
## Non-modal dialogs: `PopoverDialogSurface`
|
|
221
|
+
|
|
222
|
+
`wa-dialog` is modal: it makes the page inert until it closes. When a dialog
|
|
223
|
+
should leave the page interactive and close on Escape or a press outside (a
|
|
224
|
+
status panel, a quick inspector), render `PopoverDialogSurface` instead of a
|
|
225
|
+
hand-built popover with application chrome CSS. It is a native
|
|
226
|
+
`popover="auto"` section with `role="dialog"` that owns Kerf's dialog chrome
|
|
227
|
+
(raised surface, border, large radius and shadow, and a backdrop) and the
|
|
228
|
+
same geometry props as a modal `DialogSurface`: `size`, `preferredWidth`,
|
|
229
|
+
`viewportGutter` (16px by default), `height` / `maxHeight`, and `bodyLayout`
|
|
230
|
+
(`flow`, `fill`, or `fill-last`).
|
|
231
|
+
Name it with `label` or `labelledBy`. To give it an accessible description,
|
|
232
|
+
pass `describedBy`, the id of the element that holds the summary. It renders as
|
|
233
|
+
`aria-describedby` on the `role="dialog"` root and usually names a title
|
|
234
|
+
`ToolbarText`'s `descriptionId`:
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
<PopoverDialogSurface id="connection-details" labelledBy="connection-title" describedBy="connection-summary" bodyLayout="fill-last">
|
|
238
|
+
<Toolbar label="Connection Details Heading" leading={<ToolbarText text="Connection Details" size="xlarge" id="connection-title" description="Connected to the build server." descriptionId="connection-summary" />} />
|
|
239
|
+
{details}
|
|
240
|
+
</PopoverDialogSurface>;
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`DialogSurface` has no `describedBy`. It wraps a `wa-dialog` that the app
|
|
244
|
+
authors, so the app names and describes that dialog on its own markup.
|
|
245
|
+
|
|
246
|
+
Open it with a control's `popoverTarget` (or `showPopover()`); the browser
|
|
247
|
+
places it centered in the top layer, light-dismisses it, and restores nothing
|
|
248
|
+
else, so move focus into it with `autofocus` on its first control when that
|
|
249
|
+
matters. A closed surface stays hidden; only the open one lays out.
|
|
250
|
+
`presentation="embedded"` renders the same surface in flow, with no top
|
|
251
|
+
layer and never wider than its container, for a catalog specimen or an inline
|
|
252
|
+
preview.
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
<button type="button" popoverTarget="repository-status">Repository Status</button>
|
|
256
|
+
<PopoverDialogSurface id="repository-status" label="Repository Status" preferredWidth={remify(1024)} height={remify(640)} viewportGutter={remify(8)} bodyLayout="fill">
|
|
257
|
+
<SplitView id="repo-split" label="Changes" list={list} detail={detail} />
|
|
258
|
+
</PopoverDialogSurface>;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Use `DialogSurface` with `wa-dialog` whenever the task must block the page.
|
|
262
|
+
|
|
263
|
+
Wrap one `PopupMenu` (or another single `wa-dropdown`) with `PopupSurface`. `inset="list-zero"` removes menu
|
|
264
|
+
padding for a child that already owns row insets, `compact` uses 4px, and
|
|
265
|
+
`standard` uses the shared 8px surface inset. Keep the dropdown trigger named and
|
|
266
|
+
preserve `data-morph-skip-children` when its upgraded light-DOM items must retain
|
|
267
|
+
identity across Kerf rerenders. Import `@kerfjs/ui/popup-menu/register` once for
|
|
268
|
+
the focus handoff fix when wrapping a raw `wa-dropdown`.
|
|
269
|
+
|
|
270
|
+
Import `@kerfjs/ui/surface-scaffold/register` once when using `DialogSurface`: it registers `wa-dialog`, measures each surface's footer for a floating footer's body clearance, draws a floating header's divider while content is scrolled beneath it, and repairs Web Awesome 3.12 native dialog names before the first modal opening. Headed dialogs reference the rendered title, including live slotted labels; headerless dialogs use the public `label`. Explicit host `aria-label` and pre-existing native names are preserved. A host that is itself an explicit dialog (`role="dialog"` or `"alertdialog"` with its own name) keeps that name alone: the native panel is left unnamed, so one dialog carries the name. Geometry-only markup stays CSS-free and does not register Web Awesome implicitly.
|