@kerfjs/ui 5.0.0-beta.10 → 5.0.0-beta.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +630 -132
- package/ai/application-ui-diagnostic-ids-v1.json +114 -0
- package/ai/application-ui-profile-sync.cjs +548 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +106 -0
- package/ai/application-ui-profile.defaults.json +96 -0
- package/ai/application-ui-profile.mjs +653 -0
- package/ai/application-ui-profile.schema.json +140 -0
- package/ai/catalog-authoring.json +34 -0
- package/ai/catalog-authoring.schema.json +105 -0
- package/ai/compile-time-contracts-v1.json +149 -0
- package/ai/compile-time-contracts-v1.schema.json +52 -0
- package/ai/component-catalog-extension.schema.json +104 -0
- package/ai/component-catalog.json +6401 -931
- package/ai/component-catalog.schema.json +94 -1
- package/ai/component-class-owners.cjs +83 -0
- package/ai/component-composition-extension.d.ts +7 -0
- package/ai/component-composition-extension.schema.json +7 -0
- package/ai/component-composition-rules.json +551 -0
- package/ai/component-composition.d.ts +132 -0
- package/ai/component-composition.json +8729 -0
- package/ai/component-composition.schema.json +412 -0
- package/ai/components/README.md +185 -0
- package/ai/components/anchored-surface.md +99 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +76 -0
- package/ai/components/chip.md +76 -0
- package/ai/components/choice-chips.md +87 -0
- package/ai/components/collapsible-panel.md +103 -0
- package/ai/components/column-track.md +78 -0
- package/ai/components/combobox.md +88 -0
- package/ai/components/composer.md +83 -0
- package/ai/components/content-item.md +98 -0
- package/ai/components/content-swap.md +78 -0
- package/ai/components/corner-status.md +88 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/document-baseline.md +77 -0
- package/ai/components/edge-activity-indicator.md +81 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/file-picker.md +88 -0
- package/ai/components/floating-toolbar.md +82 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/framed-list.md +80 -0
- package/ai/components/grid.md +101 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/icon-button.md +82 -0
- package/ai/components/icon-toggle-button.md +80 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +108 -0
- package/ai/components/list-header.md +91 -0
- package/ai/components/list-inset-control.md +74 -0
- package/ai/components/list-inset-text.md +72 -0
- package/ai/components/list-item.md +108 -0
- package/ai/components/list.md +125 -0
- package/ai/components/loading-spinner.md +73 -0
- package/ai/components/lucide-icon.md +97 -0
- package/ai/components/nav-stack.md +115 -0
- package/ai/components/pane.md +115 -0
- package/ai/components/popup-menu.md +171 -0
- package/ai/components/recipe-app-shell.md +57 -0
- package/ai/components/recipe-collapsible-sidebar.md +57 -0
- package/ai/components/recipe-compact-toolbar.md +57 -0
- package/ai/components/recipe-composer-form.md +57 -0
- package/ai/components/recipe-list-detail-dialog.md +57 -0
- package/ai/components/recipe-list-workspace-states.md +57 -0
- package/ai/components/recipe-loading-inspector.md +57 -0
- package/ai/components/recipe-navigation-sidebar.md +57 -0
- package/ai/components/recipe-navigation-stack.md +57 -0
- package/ai/components/recipe-workspace-header.md +57 -0
- package/ai/components/resize.md +106 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +116 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-button.md +80 -0
- package/ai/components/split-view.md +105 -0
- package/ai/components/state-banner.md +96 -0
- package/ai/components/summary-row.md +85 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +105 -0
- package/ai/components/tab-bar.md +114 -0
- package/ai/components/tab-navigator.md +100 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/text.md +90 -0
- package/ai/components/token-search-field.md +107 -0
- package/ai/components/toolbar-control-group.md +125 -0
- package/ai/components/toolbar-text.md +100 -0
- package/ai/components/toolbar.md +103 -0
- package/ai/components/value-table.md +80 -0
- package/ai/components/wa-accordion-item.md +55 -0
- package/ai/components/wa-accordion.md +65 -0
- package/ai/components/wa-animated-image.md +55 -0
- package/ai/components/wa-animation.md +55 -0
- package/ai/components/wa-avatar.md +55 -0
- package/ai/components/wa-badge.md +55 -0
- package/ai/components/wa-breadcrumb-item.md +53 -0
- package/ai/components/wa-breadcrumb.md +55 -0
- package/ai/components/wa-button-group.md +60 -0
- package/ai/components/wa-button.md +59 -0
- package/ai/components/wa-callout.md +58 -0
- package/ai/components/wa-card.md +59 -0
- package/ai/components/wa-carousel-item.md +53 -0
- package/ai/components/wa-carousel.md +55 -0
- package/ai/components/wa-checkbox-group.md +55 -0
- package/ai/components/wa-checkbox.md +55 -0
- package/ai/components/wa-color-picker.md +55 -0
- package/ai/components/wa-comparison.md +55 -0
- package/ai/components/wa-copy-button.md +55 -0
- package/ai/components/wa-details.md +61 -0
- package/ai/components/wa-dialog.md +59 -0
- package/ai/components/wa-divider.md +53 -0
- package/ai/components/wa-drawer.md +55 -0
- package/ai/components/wa-dropdown-item.md +60 -0
- package/ai/components/wa-dropdown.md +60 -0
- package/ai/components/wa-format-bytes.md +53 -0
- package/ai/components/wa-format-date.md +53 -0
- package/ai/components/wa-format-number.md +53 -0
- package/ai/components/wa-icon.md +58 -0
- package/ai/components/wa-include.md +53 -0
- package/ai/components/wa-input.md +59 -0
- package/ai/components/wa-intersection-observer.md +53 -0
- package/ai/components/wa-known-date.md +53 -0
- package/ai/components/wa-markdown.md +53 -0
- package/ai/components/wa-mutation-observer.md +53 -0
- package/ai/components/wa-number-input.md +55 -0
- package/ai/components/wa-option.md +59 -0
- package/ai/components/wa-otp-input.md +53 -0
- package/ai/components/wa-page.md +53 -0
- package/ai/components/wa-pagination.md +55 -0
- package/ai/components/wa-popover.md +55 -0
- package/ai/components/wa-popup.md +53 -0
- package/ai/components/wa-progress-bar.md +53 -0
- package/ai/components/wa-progress-ring.md +53 -0
- package/ai/components/wa-qr-code.md +53 -0
- package/ai/components/wa-radio-group.md +59 -0
- package/ai/components/wa-radio.md +55 -0
- package/ai/components/wa-random-content.md +53 -0
- package/ai/components/wa-rating.md +55 -0
- package/ai/components/wa-relative-time.md +53 -0
- package/ai/components/wa-resize-observer.md +53 -0
- package/ai/components/wa-scroller.md +53 -0
- package/ai/components/wa-select.md +63 -0
- package/ai/components/wa-skeleton.md +53 -0
- package/ai/components/wa-slider.md +55 -0
- package/ai/components/wa-spinner.md +58 -0
- package/ai/components/wa-split-panel.md +58 -0
- package/ai/components/wa-switch.md +53 -0
- package/ai/components/wa-tab-group.md +69 -0
- package/ai/components/wa-tab-panel.md +60 -0
- package/ai/components/wa-tab.md +59 -0
- package/ai/components/wa-tag.md +59 -0
- package/ai/components/wa-textarea.md +53 -0
- package/ai/components/wa-time-input.md +55 -0
- package/ai/components/wa-toast-item.md +60 -0
- package/ai/components/wa-toast.md +60 -0
- package/ai/components/wa-tooltip.md +55 -0
- package/ai/components/wa-tree-item.md +55 -0
- package/ai/components/wa-tree.md +55 -0
- package/ai/components/wa-zoomable-frame.md +55 -0
- package/ai/components/workbench.md +120 -0
- package/ai/public-api-signatures-v1.md +4261 -459
- package/ai/skill.md +441 -63
- package/ai/webawesome-jsx-signatures-v1.md +9 -2
- package/analyzer/cli.mjs +49 -0
- package/analyzer/component-ownership.d.mts +72 -0
- package/analyzer/component-ownership.mjs +429 -0
- package/analyzer/index.d.mts +53 -0
- package/analyzer/index.mjs +2375 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/analyzer/report.schema.json +66 -0
- package/analyzer/selectors.d.mts +21 -0
- package/analyzer/selectors.mjs +212 -0
- package/catalog-projection-cli.mjs +96 -0
- package/catalog-projection.d.mts +55 -0
- package/catalog-projection.mjs +62 -0
- package/dist/anchored-surface.d.ts +69 -0
- package/dist/anchored-surface.js +3 -0
- package/dist/anchored-surface.js.map +1 -0
- package/dist/app-tab.d.ts +39 -4
- package/dist/app-tab.js +2 -1
- package/dist/badge.d.ts +83 -0
- package/dist/badge.js +4 -0
- package/dist/badge.js.map +1 -0
- package/dist/browser/anchored-surface.js +3 -0
- package/dist/browser/badge.js +3 -0
- package/dist/browser/catalog.js +28 -0
- package/dist/browser/chip.js +3 -0
- package/dist/browser/choice-chips.js +3 -0
- package/dist/browser/collapsible-panel.js +9 -0
- package/dist/browser/column-track.js +3 -0
- package/dist/browser/combobox.js +3 -0
- package/dist/browser/composer.js +4 -0
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/content-swap.js +3 -0
- package/dist/browser/corner-status.js +3 -0
- package/dist/browser/edge-activity-indicator.js +3 -0
- package/dist/browser/file-picker.js +3 -0
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/framed-list.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/icon-button.js +4 -0
- package/dist/browser/icon-toggle-button.js +4 -0
- package/dist/browser/list-action-row.js +2 -0
- package/dist/browser/list-header.js +3 -1
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +1 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/nav-stack.js +11 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/segmented-control.js +0 -1
- package/dist/browser/select.js +2 -1
- package/dist/browser/spacer.js +3 -0
- package/dist/browser/split-button.js +5 -0
- package/dist/browser/split-view.js +13 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/summary-row.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +3 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench.js +14 -0
- package/dist/catalog-resources.d.ts +50 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +134 -101
- package/dist/catalog.js +668 -105
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +69 -0
- package/dist/chip.js +3 -0
- package/dist/chip.js.map +1 -0
- package/dist/choice-chips.d.ts +82 -0
- package/dist/choice-chips.js +3 -0
- package/dist/choice-chips.js.map +1 -0
- package/dist/chunk-2GOCOLQL.js +270 -0
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/chunk-2MSPNRWJ.js +82 -0
- package/dist/chunk-2MSPNRWJ.js.map +1 -0
- package/dist/chunk-34U4ANDJ.js +119 -0
- package/dist/chunk-34U4ANDJ.js.map +1 -0
- package/dist/chunk-3GLYIIFR.js +230 -0
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-3VXDSIBJ.js} +7 -4
- package/dist/chunk-3VXDSIBJ.js.map +1 -0
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-4UB5Z3ZZ.js +68 -0
- package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
- package/dist/chunk-6C6DLP3W.js +31 -0
- package/dist/chunk-6C6DLP3W.js.map +1 -0
- package/dist/chunk-7IUEBNCO.js +108 -0
- package/dist/chunk-7IUEBNCO.js.map +1 -0
- package/dist/chunk-AN5IWMTM.js +24 -0
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/chunk-AV7CPAPT.js +82 -0
- package/dist/chunk-AV7CPAPT.js.map +1 -0
- package/dist/chunk-B53PS2LE.js +34 -0
- package/dist/chunk-B53PS2LE.js.map +1 -0
- package/dist/chunk-CA7LNX3J.js +44 -0
- package/dist/chunk-CA7LNX3J.js.map +1 -0
- package/dist/chunk-CEJ5FK6G.js +288 -0
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/chunk-CMETHPKR.js +175 -0
- package/dist/chunk-CMETHPKR.js.map +1 -0
- package/dist/chunk-CMLPFIC5.js +46 -0
- package/dist/chunk-CMLPFIC5.js.map +1 -0
- package/dist/chunk-CVD5IZGB.js +66 -0
- package/dist/chunk-CVD5IZGB.js.map +1 -0
- package/dist/chunk-CXZXHZTR.js +514 -0
- package/dist/chunk-CXZXHZTR.js.map +1 -0
- package/dist/chunk-D5RGM3XA.js +38 -0
- package/dist/chunk-D5RGM3XA.js.map +1 -0
- package/dist/chunk-DZJ4GBSP.js +59 -0
- package/dist/chunk-DZJ4GBSP.js.map +1 -0
- package/dist/chunk-EIET4QLK.js +51 -0
- package/dist/chunk-EIET4QLK.js.map +1 -0
- package/dist/chunk-ELCMSQNJ.js +49 -0
- package/dist/chunk-ELCMSQNJ.js.map +1 -0
- package/dist/chunk-EOO6PYGF.js +162 -0
- package/dist/chunk-EOO6PYGF.js.map +1 -0
- package/dist/chunk-ETCWQLJV.js +85 -0
- package/dist/chunk-ETCWQLJV.js.map +1 -0
- package/dist/chunk-FDZNYD4C.js +138 -0
- package/dist/chunk-FDZNYD4C.js.map +1 -0
- package/dist/chunk-FR76ZJQC.js +90 -0
- package/dist/chunk-FR76ZJQC.js.map +1 -0
- package/dist/chunk-G3J7JDP6.js +29 -0
- package/dist/chunk-G3J7JDP6.js.map +1 -0
- package/dist/chunk-GS2QD3N7.js +14 -0
- package/dist/chunk-GS2QD3N7.js.map +1 -0
- package/dist/chunk-HGV7J4T6.js +86 -0
- package/dist/chunk-HGV7J4T6.js.map +1 -0
- package/dist/chunk-HLDRH23D.js +84 -0
- package/dist/chunk-HLDRH23D.js.map +1 -0
- package/dist/chunk-HQZYKJ56.js +302 -0
- package/dist/chunk-HQZYKJ56.js.map +1 -0
- package/dist/chunk-HZPHCSCS.js +95 -0
- package/dist/chunk-HZPHCSCS.js.map +1 -0
- package/dist/chunk-IKS72C6P.js +53 -0
- package/dist/chunk-IKS72C6P.js.map +1 -0
- package/dist/chunk-IM3GKYOG.js +202 -0
- package/dist/chunk-IM3GKYOG.js.map +1 -0
- package/dist/chunk-INI4WDWC.js +125 -0
- package/dist/chunk-INI4WDWC.js.map +1 -0
- package/dist/chunk-IQSRHXZR.js +164 -0
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/chunk-JOR5LGYE.js +55 -0
- package/dist/chunk-JOR5LGYE.js.map +1 -0
- package/dist/chunk-K4AT3V3J.js +545 -0
- package/dist/chunk-K4AT3V3J.js.map +1 -0
- package/dist/chunk-KCS6NJ3O.js +82 -0
- package/dist/chunk-KCS6NJ3O.js.map +1 -0
- package/dist/chunk-KH4KEMSP.js +71 -0
- package/dist/chunk-KH4KEMSP.js.map +1 -0
- package/dist/chunk-LL45C7BB.js +122 -0
- package/dist/chunk-LL45C7BB.js.map +1 -0
- package/dist/chunk-LOSRXZAH.js +100 -0
- package/dist/chunk-LOSRXZAH.js.map +1 -0
- package/dist/chunk-MF6ZUUJZ.js +300 -0
- package/dist/chunk-MF6ZUUJZ.js.map +1 -0
- package/dist/chunk-MHMWQ7RB.js +19 -0
- package/dist/chunk-MHMWQ7RB.js.map +1 -0
- package/dist/chunk-MJ5RU6XT.js +173 -0
- package/dist/chunk-MJ5RU6XT.js.map +1 -0
- package/dist/chunk-MXNIVEVL.js +48 -0
- package/dist/chunk-MXNIVEVL.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-NS2TBYM4.js} +8 -5
- package/dist/chunk-NS2TBYM4.js.map +1 -0
- package/dist/chunk-PIVY32AE.js +140 -0
- package/dist/chunk-PIVY32AE.js.map +1 -0
- package/dist/chunk-PYBBYSZ3.js +526 -0
- package/dist/chunk-PYBBYSZ3.js.map +1 -0
- package/dist/chunk-QDSZTQXL.js +28 -0
- package/dist/chunk-QDSZTQXL.js.map +1 -0
- package/dist/chunk-QH5KOFNS.js +39 -0
- package/dist/chunk-QH5KOFNS.js.map +1 -0
- package/dist/chunk-QIG4IGUP.js +139 -0
- package/dist/chunk-QIG4IGUP.js.map +1 -0
- package/dist/chunk-QLA25V2K.js +493 -0
- package/dist/chunk-QLA25V2K.js.map +1 -0
- package/dist/chunk-QROYYGWU.js +52 -0
- package/dist/chunk-QROYYGWU.js.map +1 -0
- package/dist/chunk-QYMJHS4K.js +36 -0
- package/dist/chunk-QYMJHS4K.js.map +1 -0
- package/dist/chunk-RHD7RKGI.js +176 -0
- package/dist/chunk-RHD7RKGI.js.map +1 -0
- package/dist/chunk-S2XULQEK.js +52 -0
- package/dist/chunk-S2XULQEK.js.map +1 -0
- package/dist/chunk-S3ECMF23.js +33 -0
- package/dist/chunk-S3ECMF23.js.map +1 -0
- package/dist/chunk-S4Y3YTAI.js +35 -0
- package/dist/chunk-S4Y3YTAI.js.map +1 -0
- package/dist/chunk-S4ZGTDSG.js +18 -0
- package/dist/chunk-S4ZGTDSG.js.map +1 -0
- package/dist/chunk-T4WJ5VGP.js +165 -0
- package/dist/chunk-T4WJ5VGP.js.map +1 -0
- package/dist/chunk-TDMHA7C3.js +251 -0
- package/dist/chunk-TDMHA7C3.js.map +1 -0
- package/dist/chunk-TGLUDQP2.js +138 -0
- package/dist/chunk-TGLUDQP2.js.map +1 -0
- package/dist/chunk-TLMMFQWM.js +222 -0
- package/dist/chunk-TLMMFQWM.js.map +1 -0
- package/dist/chunk-U6QYTMDB.js +85 -0
- package/dist/chunk-U6QYTMDB.js.map +1 -0
- package/dist/chunk-UMKV7YVQ.js +20 -0
- package/dist/chunk-UMKV7YVQ.js.map +1 -0
- package/dist/chunk-VFYO3UGZ.js +45 -0
- package/dist/chunk-VFYO3UGZ.js.map +1 -0
- package/dist/chunk-W4IK7AWD.js +73 -0
- package/dist/chunk-W4IK7AWD.js.map +1 -0
- package/dist/chunk-WVS6CUCT.js +48 -0
- package/dist/chunk-WVS6CUCT.js.map +1 -0
- package/dist/chunk-Y6KT7ZTR.js +109 -0
- package/dist/chunk-Y6KT7ZTR.js.map +1 -0
- package/dist/chunk-YMUIQRWK.js +44 -0
- package/dist/chunk-YMUIQRWK.js.map +1 -0
- package/dist/chunk-YOA5W5ZH.js +807 -0
- package/dist/chunk-YOA5W5ZH.js.map +1 -0
- package/dist/chunk-YQ2AC4E2.js +59 -0
- package/dist/chunk-YQ2AC4E2.js.map +1 -0
- package/dist/chunk-ZKKO4MHC.js +25 -0
- package/dist/chunk-ZKKO4MHC.js.map +1 -0
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/collapsible-panel.d.ts +96 -17
- package/dist/collapsible-panel.js +132 -14
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/column-track.d.ts +41 -0
- package/dist/column-track.js +4 -0
- package/dist/column-track.js.map +1 -0
- package/dist/combobox.d.ts +40 -0
- package/dist/combobox.js +3 -0
- package/dist/combobox.js.map +1 -0
- package/dist/composer.d.ts +62 -0
- package/dist/composer.js +5 -0
- package/dist/composer.js.map +1 -0
- package/dist/content-item.d.ts +116 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/content-swap.d.ts +34 -0
- package/dist/content-swap.js +3 -0
- package/dist/content-swap.js.map +1 -0
- package/dist/corner-status.d.ts +36 -0
- package/dist/corner-status.js +3 -0
- package/dist/corner-status.js.map +1 -0
- package/dist/css-values.d.ts +127 -0
- package/dist/css-values.js +3 -0
- package/dist/css-values.js.map +1 -0
- package/dist/device-class.js +34 -6
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.d.ts +6 -1
- package/dist/disclosure-arrow.js +2 -1
- package/dist/edge-activity-indicator.d.ts +28 -0
- package/dist/edge-activity-indicator.js +3 -0
- package/dist/edge-activity-indicator.js.map +1 -0
- package/dist/empty-state.d.ts +5 -2
- package/dist/empty-state.js +2 -1
- package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
- package/dist/file-picker.d.ts +47 -0
- package/dist/file-picker.js +3 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
- package/dist/floating-toolbar.d.ts +51 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/framed-list.d.ts +47 -0
- package/dist/framed-list.js +4 -0
- package/dist/framed-list.js.map +1 -0
- package/dist/grid.d.ts +58 -0
- package/dist/grid.js +6 -0
- package/dist/grid.js.map +1 -0
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +9 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/icon-button.d.ts +46 -0
- package/dist/icon-button.js +6 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/icon-toggle-button.d.ts +42 -0
- package/dist/icon-toggle-button.js +6 -0
- package/dist/icon-toggle-button.js.map +1 -0
- package/dist/index.d.ts +63 -17
- package/dist/index.js +66 -23
- package/dist/list-action-row.d.ts +69 -12
- package/dist/list-action-row.js +5 -1
- package/dist/list-header.d.ts +65 -10
- package/dist/list-header.js +4 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
- package/dist/list-inset-control.d.ts +22 -0
- package/dist/list-inset-control.js +3 -0
- package/dist/list-inset-control.js.map +1 -0
- package/dist/list-inset-text.d.ts +30 -0
- package/dist/list-inset-text.js +4 -0
- package/dist/list-inset-text.js.map +1 -0
- package/dist/list-item.d.ts +49 -5
- package/dist/list-item.js +4 -1
- package/dist/list.d.ts +128 -0
- package/dist/list.js +7 -0
- package/dist/list.js.map +1 -0
- package/dist/loading-spinner.d.ts +12 -2
- package/dist/loading-spinner.js +2 -1
- package/dist/lucide-icon.d.ts +15 -3
- package/dist/lucide-icon.js +2 -1
- package/dist/nav-stack-VXTumzKa.d.ts +158 -0
- package/dist/nav-stack.d.ts +15 -38
- package/dist/nav-stack.js +13 -1
- package/dist/pane.d.ts +153 -0
- package/dist/pane.js +5 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
- package/dist/popup-menu-register.d.ts +10 -0
- package/dist/popup-menu-register.js +336 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +125 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +53 -0
- package/dist/row.js +7 -0
- package/dist/row.js.map +1 -0
- package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
- package/dist/segmented-control.d.ts +12 -9
- package/dist/segmented-control.js +1 -2
- package/dist/select-register.js +255 -3
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +103 -8
- package/dist/select.js +4 -1
- package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
- package/dist/semantic-tone-CdW013KF.d.ts +4 -0
- package/dist/sides-BPSWde0A.d.ts +4 -0
- package/dist/skeleton.d.ts +14 -7
- package/dist/skeleton.js +2 -1
- package/dist/spacer.d.ts +18 -0
- package/dist/spacer.js +4 -0
- package/dist/spacer.js.map +1 -0
- package/dist/split-button.d.ts +57 -0
- package/dist/split-button.js +7 -0
- package/dist/split-button.js.map +1 -0
- package/dist/split-view.d.ts +63 -6
- package/dist/split-view.js +149 -10
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +41 -7
- package/dist/state-banner.js +4 -1
- package/dist/styles/anchored-surface.css +41 -0
- package/dist/styles/app-tab.css +232 -0
- package/dist/styles/badge.css +145 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
- package/dist/styles/catalog/components/catalog-example.css +204 -0
- package/dist/styles/catalog/components/catalog-stage.css +61 -0
- package/dist/styles/catalog/components/catalog.css +26 -0
- package/dist/styles/catalog.css +5 -498
- package/dist/styles/chip.css +208 -0
- package/dist/styles/choice-chips.css +154 -0
- package/dist/styles/collapsible-panel.css +450 -16
- package/dist/styles/column-track.css +57 -0
- package/dist/styles/combobox.css +113 -0
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
- package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +370 -0
- package/dist/styles/components/actions/split-button/split-button.css +95 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +443 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1069 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +269 -0
- package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
- package/dist/styles/components/collections/list/list.css +250 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
- package/dist/styles/components/collections/list-header/list-header.css +229 -0
- package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
- package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
- package/dist/styles/components/collections/list-item/list-item.css +461 -0
- package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
- package/dist/styles/components/data-display/value-table/value-table.css +183 -0
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +41 -0
- package/dist/styles/components/feedback/badge/badge.css +145 -0
- package/dist/styles/components/feedback/chip/chip.css +208 -0
- package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
- package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
- package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
- package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
- package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +297 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
- package/dist/styles/components/forms/combobox/combobox.css +113 -0
- package/dist/styles/components/forms/composer/composer.css +100 -0
- package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +455 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +432 -0
- package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
- package/dist/styles/components/layout/column-track/column-track.css +57 -0
- package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
- package/dist/styles/components/layout/grid/grid.css +88 -0
- package/dist/styles/components/layout/pane/pane.css +382 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
- package/dist/styles/components/layout/row/row.css +114 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +146 -0
- package/dist/styles/components/layout/workbench/workbench.css +1086 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +342 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +197 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +325 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +138 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +31 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +425 -0
- package/dist/styles/components/typography/text/text.css +220 -0
- package/dist/styles/composer.css +100 -0
- package/dist/styles/content-item.css +138 -0
- package/dist/styles/content-swap.css +154 -0
- package/dist/styles/corner-status.css +60 -0
- package/dist/styles/document.css +98 -0
- package/dist/styles/edge-activity-indicator.css +127 -0
- package/dist/styles/file-picker.css +81 -0
- package/dist/styles/floating-toolbar.css +119 -0
- package/dist/styles/foundation.css +261 -45
- package/dist/styles/framed-list.css +47 -0
- package/dist/styles/grid.css +88 -0
- package/dist/styles/icon-button.css +22 -0
- package/dist/styles/icon-toggle-button.css +83 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +324 -18
- package/dist/styles/list-header.css +128 -59
- package/dist/styles/list-inset-control.css +30 -0
- package/dist/styles/list-inset-text.css +29 -0
- package/dist/styles/list-item.css +371 -33
- package/dist/styles/list.css +250 -0
- package/dist/styles/loading-spinner.css +4 -0
- package/dist/styles/lucide-icon.css +9 -0
- package/dist/styles/nav-stack.css +280 -49
- package/dist/styles/pane.css +382 -0
- package/dist/styles/popup-menu.css +370 -0
- package/dist/styles/resizable-region.css +438 -4
- package/dist/styles/row.css +114 -0
- package/dist/styles/segmented-control.css +36 -9
- package/dist/styles/select.css +338 -21
- package/dist/styles/skeleton.css +64 -3
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-button.css +95 -0
- package/dist/styles/split-view.css +114 -3
- package/dist/styles/state-banner.css +146 -22
- package/dist/styles/styles.css +23 -1
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +31 -0
- package/dist/styles/surface-scaffold.css +425 -0
- package/dist/styles/tab-bar.css +161 -9
- package/dist/styles/tab-navigator.css +325 -0
- package/dist/styles/text.css +220 -0
- package/dist/styles/token-search-field.css +202 -59
- package/dist/styles/toolbar-control-group.css +894 -36
- package/dist/styles/toolbar-text.css +236 -7
- package/dist/styles/toolbar.css +393 -11
- package/dist/styles/value-table.css +115 -7
- package/dist/styles/webawesome.css +410 -17
- package/dist/styles/workbench.css +999 -7
- package/dist/summary-row.d.ts +56 -0
- package/dist/summary-row.js +4 -0
- package/dist/summary-row.js.map +1 -0
- package/dist/sunken-panel.d.ts +38 -0
- package/dist/sunken-panel.js +4 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold-register.d.ts +9 -0
- package/dist/surface-scaffold-register.js +151 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +170 -0
- package/dist/surface-scaffold.js +4 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/tab-bar.d.ts +33 -7
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.d.ts +114 -0
- package/dist/tab-navigator.js +102 -0
- package/dist/tab-navigator.js.map +1 -0
- package/dist/text.d.ts +98 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/token-search-field.d.ts +3 -43
- package/dist/token-search-field.js +2 -1
- package/dist/token-search-model-aYR0YAei.d.ts +184 -0
- package/dist/token-search-model.d.ts +3 -0
- package/dist/token-search-model.js +3 -0
- package/dist/token-search-model.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +96 -7
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +58 -9
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +71 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-CVgIwSdq.d.ts +189 -0
- package/dist/value-table.d.ts +30 -4
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +8 -1
- package/dist/wire-catalog.d.ts +111 -5
- package/dist/wire-catalog.js +302 -14
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-comboboxes.d.ts +26 -0
- package/dist/wire-comboboxes.js +3 -0
- package/dist/wire-comboboxes.js.map +1 -0
- package/dist/wire-composers.d.ts +16 -0
- package/dist/wire-composers.js +3 -0
- package/dist/wire-composers.js.map +1 -0
- package/dist/wire-content-items.d.ts +11 -0
- package/dist/wire-content-items.js +139 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-corner-status.d.ts +11 -0
- package/dist/wire-corner-status.js +3 -0
- package/dist/wire-corner-status.js.map +1 -0
- package/dist/wire-file-pickers.d.ts +26 -0
- package/dist/wire-file-pickers.js +3 -0
- package/dist/wire-file-pickers.js.map +1 -0
- package/dist/wire-list-focus-scroll.d.ts +16 -0
- package/dist/wire-list-focus-scroll.js +3 -0
- package/dist/wire-list-focus-scroll.js.map +1 -0
- package/dist/wire-list-reorder.d.ts +41 -0
- package/dist/wire-list-reorder.js +3 -0
- package/dist/wire-list-reorder.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +326 -15
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +87 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/wire-sidebar.d.ts +24 -4
- package/dist/wire-sidebar.js +159 -45
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.d.ts +6 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +13 -0
- package/dist/wire-tab-navigator.js +153 -0
- package/dist/wire-tab-navigator.js.map +1 -0
- package/dist/wire-token-search-fields.d.ts +28 -10
- package/dist/wire-token-search-fields.js +2 -1
- package/dist/wire-toolbar-visibility.d.ts +13 -0
- package/dist/wire-toolbar-visibility.js +3 -0
- package/dist/wire-toolbar-visibility.js.map +1 -0
- package/dist/wire-workbench.d.ts +116 -0
- package/dist/wire-workbench.js +6 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench.d.ts +253 -10
- package/dist/workbench.js +20 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +640 -33
- package/docs/anchored-surface.md +101 -0
- package/docs/app-layouts.md +159 -10
- package/docs/apple-hig.md +2 -0
- package/docs/catalog.md +565 -63
- package/docs/collapsible-panel.md +308 -25
- package/docs/component-contract.md +816 -53
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +962 -99
- package/docs/composer.md +143 -0
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
- package/docs/design/templates/choice-chips/multiple.svg +1 -0
- package/docs/design/templates/choice-chips-dark.svg +1 -0
- package/docs/design/templates/choice-chips.svg +1 -0
- package/docs/design/templates/composer/chat-dark.svg +1 -0
- package/docs/design/templates/composer/chat.svg +1 -0
- package/docs/design/templates/composer/prompt-dark.svg +1 -0
- package/docs/design/templates/composer/prompt.svg +1 -0
- package/docs/design/templates/composer-dark.svg +1 -0
- package/docs/design/templates/composer.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
- package/docs/design/templates/empty-state/filtered.svg +1 -0
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
- package/docs/design/templates/empty-state/with-action.svg +1 -0
- package/docs/design/templates/empty-state-dark.svg +1 -0
- package/docs/design/templates/empty-state.svg +1 -0
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -0
- package/docs/design/templates/list-action-row/default.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
- package/docs/design/templates/list-action-row/selected.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -0
- package/docs/design/templates/list-action-row.svg +1 -0
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -0
- package/docs/design/templates/list-header/action.svg +1 -0
- package/docs/design/templates/list-header/count-dark.svg +1 -0
- package/docs/design/templates/list-header/count.svg +1 -0
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
- package/docs/design/templates/list-header/inline-action.svg +1 -0
- package/docs/design/templates/list-header/size-l-dark.svg +1 -0
- package/docs/design/templates/list-header/size-l.svg +1 -0
- package/docs/design/templates/list-header/size-m-dark.svg +1 -0
- package/docs/design/templates/list-header/size-m.svg +1 -0
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xl.svg +1 -0
- package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xs.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +1 -0
- package/docs/design/templates/list-header.svg +1 -0
- package/docs/design/templates/list-item/default-dark.svg +1 -0
- package/docs/design/templates/list-item/default.svg +1 -0
- package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-item/icon-tile.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -0
- package/docs/design/templates/list-item/multiline.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -0
- package/docs/design/templates/list-item/selected.svg +1 -0
- package/docs/design/templates/list-item/trailing-dark.svg +1 -0
- package/docs/design/templates/list-item/trailing.svg +1 -0
- package/docs/design/templates/list-item-dark.svg +1 -0
- package/docs/design/templates/list-item.svg +1 -0
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
- package/docs/design/templates/segmented-control/equal.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small.svg +1 -0
- package/docs/design/templates/segmented-control-dark.svg +1 -0
- package/docs/design/templates/segmented-control.svg +1 -0
- package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
- package/docs/design/templates/skeleton/avatar.svg +1 -0
- package/docs/design/templates/skeleton/block-dark.svg +1 -0
- package/docs/design/templates/skeleton/block.svg +1 -0
- package/docs/design/templates/skeleton/lines-dark.svg +1 -0
- package/docs/design/templates/skeleton/lines.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -0
- package/docs/design/templates/skeleton.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -0
- package/docs/design/templates/state-banner/danger.svg +1 -0
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -0
- package/docs/design/templates/state-banner/info.svg +1 -0
- package/docs/design/templates/state-banner/strip-dark.svg +1 -0
- package/docs/design/templates/state-banner/strip.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -0
- package/docs/design/templates/state-banner/success.svg +1 -0
- package/docs/design/templates/state-banner/warning-dark.svg +1 -0
- package/docs/design/templates/state-banner/warning.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +1 -0
- package/docs/design/templates/state-banner.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
- package/docs/design/templates/tab-bar-dark.svg +1 -0
- package/docs/design/templates/tab-bar.svg +1 -0
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
- package/docs/design/templates/token-search-field/empty.svg +1 -0
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/token-search-field/tokens.svg +1 -0
- package/docs/design/templates/token-search-field-dark.svg +1 -0
- package/docs/design/templates/token-search-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
- package/docs/design/templates/toolbar-control-group.svg +1 -11
- package/docs/design/templates/toolbar-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default.svg +1 -0
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/large.svg +1 -0
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/small.svg +1 -0
- package/docs/design/templates/toolbar-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-text.svg +1 -0
- package/docs/design/templates/toolbar.svg +1 -0
- package/docs/design/templates/value-table/details-dark.svg +1 -0
- package/docs/design/templates/value-table/details.svg +1 -0
- package/docs/design/templates/value-table-dark.svg +1 -0
- package/docs/design/templates/value-table.svg +1 -0
- package/docs/design/templates.md +75 -18
- package/docs/design-philosophy.md +65 -20
- package/docs/device-class.md +10 -9
- package/docs/document-baseline.md +93 -0
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/command-palette-adapter.tsx +69 -17
- package/docs/examples/component-catalog-extension.json +52 -0
- package/docs/examples/component-composition-extension.json +80 -0
- package/docs/layout.md +796 -53
- package/docs/nav-stack.md +287 -14
- package/docs/recipes.md +129 -73
- package/docs/split-view.md +96 -7
- package/docs/sunken-panel.md +106 -0
- package/docs/surface-scaffold.md +270 -0
- package/docs/tab-navigator.md +255 -0
- package/docs/type-contracts.md +137 -0
- package/docs/ui-analyzer.md +406 -0
- package/docs/ui-doctor.md +281 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +48 -17
- package/docs/webawesome-theme.md +215 -16
- package/docs/workbench.md +627 -12
- package/docs/writing.md +152 -0
- package/doctor/cli.mjs +120 -0
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/config.schema.json +94 -0
- package/doctor/copy-capitalization-checks.mjs +591 -0
- package/doctor/eslint-diagnostics.d.mts +24 -0
- package/doctor/eslint-diagnostics.mjs +24 -0
- package/doctor/index.d.mts +122 -0
- package/doctor/index.mjs +1424 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1203 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +770 -50
- package/package.json +345 -27
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/traversal-exclusions.mjs +86 -0
- package/ux-demo/recipes/app-shell.tsx +204 -16
- package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
- package/ux-demo/recipes/compact-toolbar.tsx +135 -14
- package/ux-demo/recipes/composer-form.tsx +133 -21
- package/ux-demo/recipes/list-detail-dialog.tsx +255 -14
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +9 -3
- package/ux-demo/recipes/loading-inspector.tsx +162 -39
- package/ux-demo/recipes/mount-recipe.ts +26 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
- package/ux-demo/recipes/navigation-stack.tsx +79 -24
- package/ux-demo/recipes/types.ts +17 -2
- package/ux-demo/recipes/workspace-header.tsx +86 -5
- package/vite-ux-review.d.mts +83 -0
- package/vite-ux-review.mjs +120 -0
- package/dist/browser/panel-header.js +0 -7
- package/dist/chunk-2Z5TWHKQ.js +0 -34
- package/dist/chunk-2Z5TWHKQ.js.map +0 -1
- package/dist/chunk-37T3VNIZ.js +0 -19
- package/dist/chunk-37T3VNIZ.js.map +0 -1
- package/dist/chunk-55DATV3A.js +0 -10
- package/dist/chunk-55DATV3A.js.map +0 -1
- package/dist/chunk-56RJXPHG.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js +0 -31
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7JB7VPRI.js +0 -34
- package/dist/chunk-7JB7VPRI.js.map +0 -1
- package/dist/chunk-7LDCTU7D.js +0 -134
- package/dist/chunk-7LDCTU7D.js.map +0 -1
- package/dist/chunk-AQNKJRFH.js +0 -79
- package/dist/chunk-AQNKJRFH.js.map +0 -1
- package/dist/chunk-AVZHJN6C.js +0 -14
- package/dist/chunk-AVZHJN6C.js.map +0 -1
- package/dist/chunk-B24C4A6T.js +0 -22
- package/dist/chunk-B24C4A6T.js.map +0 -1
- package/dist/chunk-BLK3UEEI.js +0 -23
- package/dist/chunk-BLK3UEEI.js.map +0 -1
- package/dist/chunk-CVZYNJJ5.js +0 -265
- package/dist/chunk-CVZYNJJ5.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-I7INRJO4.js +0 -17
- package/dist/chunk-I7INRJO4.js.map +0 -1
- package/dist/chunk-L4OKFDJY.js +0 -24
- package/dist/chunk-L4OKFDJY.js.map +0 -1
- package/dist/chunk-LC3YSAZC.js +0 -39
- package/dist/chunk-LC3YSAZC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js +0 -10
- package/dist/chunk-MFKMHK5W.js.map +0 -1
- package/dist/chunk-RUNWEPR4.js +0 -10
- package/dist/chunk-RUNWEPR4.js.map +0 -1
- package/dist/chunk-W2FK7ZNY.js +0 -26
- package/dist/chunk-W2FK7ZNY.js.map +0 -1
- package/dist/chunk-W5EQ3HYQ.js +0 -42
- package/dist/chunk-W5EQ3HYQ.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-XXMOARTH.js +0 -229
- package/dist/chunk-XXMOARTH.js.map +0 -1
- package/dist/chunk-Y5MRDTLC.js +0 -20
- package/dist/chunk-Y5MRDTLC.js.map +0 -1
- package/dist/chunk-YGN7OMLT.js.map +0 -1
- package/dist/panel-header.d.ts +0 -36
- package/dist/panel-header.js +0 -7
- package/dist/panel-header.js.map +0 -1
- package/dist/styles/panel-header.css +0 -64
- package/dist/styles/tab-scaffold.css +0 -84
- package/dist/tab-scaffold.d.ts +0 -30
- package/dist/tab-scaffold.js +0 -16
- package/dist/tab-scaffold.js.map +0 -1
- package/dist/wire-tab-scaffold.d.ts +0 -11
- package/dist/wire-tab-scaffold.js +0 -16
- package/dist/wire-tab-scaffold.js.map +0 -1
- package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-actions.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
- package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
- package/docs/design/templates/panel-header/no-icon.svg +0 -1
- package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
- package/docs/design/templates/panel-header/page-heading.svg +0 -1
- package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
- package/docs/design/templates/panel-header/title-only.svg +0 -1
- package/docs/design/templates/panel-header-dark.svg +0 -13
- package/docs/design/templates/panel-header.svg +0 -13
- package/docs/tab-scaffold.md +0 -41
- package/ux-demo/recipes/recipes.css +0 -448
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/forms/combobox/combobox.tsx
|
|
4
|
+
var optionParts = (suggestion) => typeof suggestion === "string" ? { value: suggestion, label: suggestion } : suggestion;
|
|
5
|
+
function Combobox({
|
|
6
|
+
id,
|
|
7
|
+
label,
|
|
8
|
+
suggestions,
|
|
9
|
+
value = "",
|
|
10
|
+
placeholder,
|
|
11
|
+
hint,
|
|
12
|
+
name,
|
|
13
|
+
createLabel = "Create \u201C{value}\u201D",
|
|
14
|
+
disabled = false,
|
|
15
|
+
className = ""
|
|
16
|
+
}) {
|
|
17
|
+
const listId = `${id}-listbox`;
|
|
18
|
+
const hintId = hint ? `${id}-hint` : void 0;
|
|
19
|
+
return /* @__PURE__ */ jsxs(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
class: `kui-combobox ${className}`.trim(),
|
|
23
|
+
"data-component": "combobox",
|
|
24
|
+
"data-combobox-id": id,
|
|
25
|
+
"data-create-label": createLabel === false ? void 0 : createLabel,
|
|
26
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsx("label", { class: "kui-combobox__label", for: id, children: label }),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", { class: "kui-combobox__control", children: [
|
|
30
|
+
/* @__PURE__ */ jsx(
|
|
31
|
+
"input",
|
|
32
|
+
{
|
|
33
|
+
id,
|
|
34
|
+
class: "kui-combobox__input",
|
|
35
|
+
type: "text",
|
|
36
|
+
role: "combobox",
|
|
37
|
+
"aria-autocomplete": "list",
|
|
38
|
+
"aria-expanded": "false",
|
|
39
|
+
"aria-controls": listId,
|
|
40
|
+
"aria-describedby": hintId,
|
|
41
|
+
autocomplete: "off",
|
|
42
|
+
spellcheck: "false",
|
|
43
|
+
name,
|
|
44
|
+
value,
|
|
45
|
+
placeholder,
|
|
46
|
+
disabled
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ jsxs("ul", { class: "kui-combobox__listbox", id: listId, role: "listbox", hidden: true, children: [
|
|
50
|
+
suggestions.map((suggestion, index) => {
|
|
51
|
+
const option = optionParts(suggestion);
|
|
52
|
+
return /* @__PURE__ */ jsx(
|
|
53
|
+
"li",
|
|
54
|
+
{
|
|
55
|
+
class: "kui-combobox__option",
|
|
56
|
+
id: `${id}-option-${index}`,
|
|
57
|
+
role: "option",
|
|
58
|
+
"aria-selected": "false",
|
|
59
|
+
"data-value": option.value,
|
|
60
|
+
children: option.label
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}),
|
|
64
|
+
createLabel !== false && /* @__PURE__ */ jsx(
|
|
65
|
+
"li",
|
|
66
|
+
{
|
|
67
|
+
class: "kui-combobox__option",
|
|
68
|
+
id: `${id}-option-create`,
|
|
69
|
+
role: "option",
|
|
70
|
+
"aria-selected": "false",
|
|
71
|
+
"data-create": "",
|
|
72
|
+
hidden: true
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
] })
|
|
76
|
+
] }),
|
|
77
|
+
hint && /* @__PURE__ */ jsx("div", { class: "kui-combobox__hint", id: hintId, children: hint })
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { Combobox };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=chunk-ETCWQLJV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/combobox/combobox.tsx"],"names":[],"mappings":"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","file":"chunk-ETCWQLJV.js","sourcesContent":["/** A suggestion: a plain string, or a value with a distinct visible label. */\nexport type ComboboxSuggestion = string | { value: string; label: string };\n\nexport interface ComboboxProps {\n /** Unique id; it also identifies the field in `wireComboboxes` reports. */\n id: string;\n /** Visible field label. */\n label: string;\n /** Suggestions to filter as the person types. */\n suggestions: readonly ComboboxSuggestion[];\n /** Initial text; the field owns its text while the person types. */\n value?: string;\n placeholder?: string;\n /** Optional hint below the field, such as \"Press Enter to add\". */\n hint?: string;\n /** Form field name. */\n name?: string;\n /**\n * Offer to create the typed text when it matches no suggestion; the option\n * reads `createLabel` with `{value}` replaced. Omit to only allow\n * suggestions. Default `Create “{value}”`.\n */\n createLabel?: string | false;\n disabled?: boolean;\n className?: string;\n}\n\nconst optionParts = (suggestion: ComboboxSuggestion) =>\n typeof suggestion === 'string'\n ? { value: suggestion, label: suggestion }\n : suggestion;\n\n/**\n * A free-text field with a filtered suggestion list that can also create a new\n * value: the ARIA combobox pattern on a native input with the themed Web\n * Awesome field chrome. `wireComboboxes` filters, moves the active option,\n * and reports commits (Enter, comma, or a click). Use `Select` when only\n * existing values are allowed and nothing is typed.\n */\nexport function Combobox({\n id,\n label,\n suggestions,\n value = '',\n placeholder,\n hint,\n name,\n createLabel = 'Create “{value}”',\n disabled = false,\n className = '',\n}: ComboboxProps) {\n const listId = `${id}-listbox`;\n const hintId = hint ? `${id}-hint` : undefined;\n return (\n <div\n class={`kui-combobox ${className}`.trim()}\n data-component=\"combobox\"\n data-combobox-id={id}\n data-create-label={createLabel === false ? undefined : createLabel}\n data-disabled={disabled ? 'true' : undefined}\n >\n <label class=\"kui-combobox__label\" for={id}>\n {label}\n </label>\n <div class=\"kui-combobox__control\">\n <input\n id={id}\n class=\"kui-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"false\"\n aria-controls={listId}\n aria-describedby={hintId}\n autocomplete=\"off\"\n spellcheck=\"false\"\n name={name}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n />\n <ul class=\"kui-combobox__listbox\" id={listId} role=\"listbox\" hidden>\n {suggestions.map((suggestion, index) => {\n const option = optionParts(suggestion);\n return (\n <li\n class=\"kui-combobox__option\"\n id={`${id}-option-${index}`}\n role=\"option\"\n aria-selected=\"false\"\n data-value={option.value}\n >\n {option.label}\n </li>\n );\n })}\n {createLabel !== false && (\n <li\n class=\"kui-combobox__option\"\n id={`${id}-option-create`}\n role=\"option\"\n aria-selected=\"false\"\n data-create=\"\"\n hidden\n />\n )}\n </ul>\n </div>\n {hint && (\n <div class=\"kui-combobox__hint\" id={hintId}>\n {hint}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// src/components/forms/combobox/wiring/wire-comboboxes.ts
|
|
2
|
+
var INPUT = ".kui-combobox__input";
|
|
3
|
+
function partsOf(input) {
|
|
4
|
+
const field = input.closest('[data-component="combobox"]');
|
|
5
|
+
const listbox = field.querySelector('[role="listbox"]');
|
|
6
|
+
return {
|
|
7
|
+
field,
|
|
8
|
+
input,
|
|
9
|
+
listbox,
|
|
10
|
+
create: listbox.querySelector("[data-create]")
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
var visibleOptions = (parts) => [...parts.listbox.querySelectorAll('[role="option"]')].filter(
|
|
14
|
+
(option) => !option.hidden
|
|
15
|
+
);
|
|
16
|
+
var matches = (option, text) => option.textContent.toLowerCase().includes(text) || option.dataset.value.toLowerCase().includes(text);
|
|
17
|
+
function setActive(parts, option) {
|
|
18
|
+
for (const item of parts.listbox.querySelectorAll('[role="option"]'))
|
|
19
|
+
item.setAttribute("aria-selected", String(item === option));
|
|
20
|
+
if (option) {
|
|
21
|
+
parts.input.setAttribute("aria-activedescendant", option.id);
|
|
22
|
+
option.scrollIntoView?.({ block: "nearest" });
|
|
23
|
+
} else parts.input.removeAttribute("aria-activedescendant");
|
|
24
|
+
}
|
|
25
|
+
function activeOption(parts) {
|
|
26
|
+
const id = parts.input.getAttribute("aria-activedescendant");
|
|
27
|
+
return id ? parts.listbox.querySelector(`#${CSS.escape(id)}`) : null;
|
|
28
|
+
}
|
|
29
|
+
function close(parts) {
|
|
30
|
+
parts.listbox.hidden = true;
|
|
31
|
+
parts.input.setAttribute("aria-expanded", "false");
|
|
32
|
+
setActive(parts, null);
|
|
33
|
+
}
|
|
34
|
+
function update(parts) {
|
|
35
|
+
const typed = parts.input.value.trim();
|
|
36
|
+
const text = typed.toLowerCase();
|
|
37
|
+
let exact = false;
|
|
38
|
+
for (const option of parts.listbox.querySelectorAll(
|
|
39
|
+
'[role="option"]:not([data-create])'
|
|
40
|
+
)) {
|
|
41
|
+
option.hidden = text !== "" && !matches(option, text);
|
|
42
|
+
if (option.dataset.value.toLowerCase() === text) exact = true;
|
|
43
|
+
}
|
|
44
|
+
if (parts.create) {
|
|
45
|
+
parts.create.hidden = typed === "" || exact;
|
|
46
|
+
parts.create.dataset.value = typed;
|
|
47
|
+
parts.create.textContent = parts.field.dataset.createLabel.replaceAll(
|
|
48
|
+
"{value}",
|
|
49
|
+
typed
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
const options = visibleOptions(parts);
|
|
53
|
+
parts.listbox.hidden = options.length === 0;
|
|
54
|
+
parts.input.setAttribute("aria-expanded", String(options.length > 0));
|
|
55
|
+
if (!options.includes(activeOption(parts))) setActive(parts, null);
|
|
56
|
+
}
|
|
57
|
+
function wireComboboxes(root, { onCommit, commitKeys = [","] }) {
|
|
58
|
+
const commit = (parts, active) => {
|
|
59
|
+
const option = active ?? (parts.create ? null : visibleOptions(parts)[0] ?? null);
|
|
60
|
+
const typed = parts.input.value.trim();
|
|
61
|
+
const value = option ? option.dataset.value : typed;
|
|
62
|
+
const suggestion = [
|
|
63
|
+
...parts.listbox.querySelectorAll(
|
|
64
|
+
'[role="option"]:not([data-create])'
|
|
65
|
+
)
|
|
66
|
+
].find((item) => item.dataset.value.toLowerCase() === value.toLowerCase());
|
|
67
|
+
const created = !suggestion;
|
|
68
|
+
if (created && !parts.create) return;
|
|
69
|
+
close(parts);
|
|
70
|
+
onCommit({
|
|
71
|
+
id: parts.field.dataset.comboboxId,
|
|
72
|
+
value: suggestion?.dataset.value ?? value,
|
|
73
|
+
created,
|
|
74
|
+
input: parts.input
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const inputOf = (event) => event.target instanceof HTMLInputElement && event.target.matches(INPUT) ? event.target : null;
|
|
78
|
+
const onInput = (event) => {
|
|
79
|
+
const input = inputOf(event);
|
|
80
|
+
const parts = input && partsOf(input);
|
|
81
|
+
if (parts) update(parts);
|
|
82
|
+
};
|
|
83
|
+
const onFocus = onInput;
|
|
84
|
+
const onKeyDown = (event) => {
|
|
85
|
+
const keyboard = event;
|
|
86
|
+
const input = inputOf(keyboard);
|
|
87
|
+
const parts = input && partsOf(input);
|
|
88
|
+
if (!parts || keyboard.isComposing) return;
|
|
89
|
+
const options = visibleOptions(parts);
|
|
90
|
+
const current = activeOption(parts);
|
|
91
|
+
const index = current ? options.indexOf(current) : -1;
|
|
92
|
+
if (keyboard.key === "ArrowDown" || keyboard.key === "ArrowUp") {
|
|
93
|
+
keyboard.preventDefault();
|
|
94
|
+
if (parts.listbox.hidden) update(parts);
|
|
95
|
+
const open = visibleOptions(parts);
|
|
96
|
+
if (open.length === 0) return;
|
|
97
|
+
const step = keyboard.key === "ArrowDown" ? 1 : -1;
|
|
98
|
+
const next = index < 0 ? step > 0 ? 0 : open.length - 1 : (index + step + open.length) % open.length;
|
|
99
|
+
setActive(parts, open[next]);
|
|
100
|
+
} else if (keyboard.key === "Enter" || commitKeys.includes(keyboard.key)) {
|
|
101
|
+
if (!parts.input.value.trim() && !current) return;
|
|
102
|
+
keyboard.preventDefault();
|
|
103
|
+
commit(parts, current);
|
|
104
|
+
} else if (keyboard.key === "Escape" && !parts.listbox.hidden) {
|
|
105
|
+
keyboard.preventDefault();
|
|
106
|
+
close(parts);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const onPointerDown = (event) => {
|
|
110
|
+
const option = event.target instanceof Element ? event.target.closest(".kui-combobox__option") : null;
|
|
111
|
+
const input = option?.closest('[data-component="combobox"]')?.querySelector(INPUT);
|
|
112
|
+
const parts = input && partsOf(input);
|
|
113
|
+
if (!option || !parts) return;
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
commit(parts, option);
|
|
116
|
+
};
|
|
117
|
+
const onFocusOut = (event) => {
|
|
118
|
+
const input = inputOf(event);
|
|
119
|
+
const parts = input && partsOf(input);
|
|
120
|
+
if (parts) close(parts);
|
|
121
|
+
};
|
|
122
|
+
root.addEventListener("input", onInput);
|
|
123
|
+
root.addEventListener("focusin", onFocus);
|
|
124
|
+
root.addEventListener("keydown", onKeyDown);
|
|
125
|
+
root.addEventListener("pointerdown", onPointerDown);
|
|
126
|
+
root.addEventListener("focusout", onFocusOut);
|
|
127
|
+
return () => {
|
|
128
|
+
root.removeEventListener("input", onInput);
|
|
129
|
+
root.removeEventListener("focusin", onFocus);
|
|
130
|
+
root.removeEventListener("keydown", onKeyDown);
|
|
131
|
+
root.removeEventListener("pointerdown", onPointerDown);
|
|
132
|
+
root.removeEventListener("focusout", onFocusOut);
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { wireComboboxes };
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=chunk-FDZNYD4C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/combobox/wiring/wire-comboboxes.ts"],"names":[],"mappings":"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","file":"chunk-FDZNYD4C.js","sourcesContent":["type Root = HTMLElement | Document;\n\nconst INPUT = '.kui-combobox__input';\n\n/** A committed combobox value. */\nexport interface ComboboxCommit {\n id: string;\n value: string;\n /** True when the value matched no suggestion (the person created it). */\n created: boolean;\n /** The field's input; clear or keep its text after applying the commit. */\n input: HTMLInputElement;\n}\n\nexport interface WireComboboxesOptions {\n onCommit: (commit: ComboboxCommit) => void;\n /** Characters that commit the typed text besides Enter. Default `[',']`. */\n commitKeys?: readonly string[];\n}\n\ninterface Parts {\n field: HTMLElement;\n input: HTMLInputElement;\n listbox: HTMLElement;\n create: HTMLElement | null;\n}\n\n// `Combobox` renders the input inside its field with its listbox, and every\n// suggestion option with `data-value`, so the lookups below cannot miss.\nfunction partsOf(input: HTMLInputElement): Parts {\n const field = input.closest<HTMLElement>('[data-component=\"combobox\"]')!;\n const listbox = field.querySelector<HTMLElement>('[role=\"listbox\"]')!;\n return {\n field,\n input,\n listbox,\n create: listbox.querySelector<HTMLElement>('[data-create]'),\n };\n}\n\nconst visibleOptions = (parts: Parts) =>\n [...parts.listbox.querySelectorAll<HTMLElement>('[role=\"option\"]')].filter(\n (option) => !option.hidden,\n );\n\nconst matches = (option: HTMLElement, text: string) =>\n option.textContent!.toLowerCase().includes(text) ||\n option.dataset.value!.toLowerCase().includes(text);\n\nfunction setActive(parts: Parts, option: HTMLElement | null) {\n for (const item of parts.listbox.querySelectorAll('[role=\"option\"]'))\n item.setAttribute('aria-selected', String(item === option));\n if (option) {\n parts.input.setAttribute('aria-activedescendant', option.id);\n option.scrollIntoView?.({ block: 'nearest' });\n } else parts.input.removeAttribute('aria-activedescendant');\n}\n\nfunction activeOption(parts: Parts): HTMLElement | null {\n const id = parts.input.getAttribute('aria-activedescendant');\n return id\n ? parts.listbox.querySelector<HTMLElement>(`#${CSS.escape(id)}`)\n : null;\n}\n\nfunction close(parts: Parts) {\n parts.listbox.hidden = true;\n parts.input.setAttribute('aria-expanded', 'false');\n setActive(parts, null);\n}\n\n/** Filter the suggestions to the typed text and show the create option. */\nfunction update(parts: Parts) {\n const typed = parts.input.value.trim();\n const text = typed.toLowerCase();\n let exact = false;\n for (const option of parts.listbox.querySelectorAll<HTMLElement>(\n '[role=\"option\"]:not([data-create])',\n )) {\n option.hidden = text !== '' && !matches(option, text);\n if (option.dataset.value!.toLowerCase() === text) exact = true;\n }\n if (parts.create) {\n parts.create.hidden = typed === '' || exact;\n parts.create.dataset.value = typed;\n // A create option exists only when the field has a create label.\n parts.create.textContent = parts.field.dataset.createLabel!.replaceAll(\n '{value}',\n typed,\n );\n }\n const options = visibleOptions(parts);\n parts.listbox.hidden = options.length === 0;\n parts.input.setAttribute('aria-expanded', String(options.length > 0));\n if (!options.includes(activeOption(parts)!)) setActive(parts, null);\n}\n\n/**\n * Wire every `Combobox` below root: typing filters the suggestions (and offers\n * to create the typed text), ArrowDown/ArrowUp move the active option, Enter or\n * a commit key (comma by default) commits the active option or the typed text,\n * a click commits an option, and Escape or leaving the field closes the list.\n * Typed text that matches no suggestion commits only when the field offers\n * creation; otherwise Enter commits the first matching suggestion. Dispose with the owning application.\n */\nexport function wireComboboxes(\n root: Root,\n { onCommit, commitKeys = [','] }: WireComboboxesOptions,\n): () => void {\n const commit = (parts: Parts, active: HTMLElement | null) => {\n // Without a create option, Enter on partial text takes the first match.\n const option =\n active ?? (parts.create ? null : (visibleOptions(parts)[0] ?? null));\n const typed = parts.input.value.trim();\n // Callers commit only with an option or non-empty typed text.\n const value = option ? option.dataset.value! : typed;\n const suggestion = [\n ...parts.listbox.querySelectorAll<HTMLElement>(\n '[role=\"option\"]:not([data-create])',\n ),\n ].find((item) => item.dataset.value!.toLowerCase() === value.toLowerCase());\n const created = !suggestion;\n if (created && !parts.create) return;\n close(parts);\n onCommit({\n id: parts.field.dataset.comboboxId!,\n value: suggestion?.dataset.value ?? value,\n created,\n input: parts.input,\n });\n };\n const inputOf = (event: Event) =>\n event.target instanceof HTMLInputElement && event.target.matches(INPUT)\n ? event.target\n : null;\n const onInput = (event: Event) => {\n const input = inputOf(event);\n const parts = input && partsOf(input);\n if (parts) update(parts);\n };\n const onFocus = onInput;\n const onKeyDown = (event: Event) => {\n const keyboard = event as KeyboardEvent;\n const input = inputOf(keyboard);\n const parts = input && partsOf(input);\n if (!parts || keyboard.isComposing) return;\n const options = visibleOptions(parts);\n const current = activeOption(parts);\n const index = current ? options.indexOf(current) : -1;\n if (keyboard.key === 'ArrowDown' || keyboard.key === 'ArrowUp') {\n keyboard.preventDefault();\n if (parts.listbox.hidden) update(parts);\n const open = visibleOptions(parts);\n if (open.length === 0) return;\n const step = keyboard.key === 'ArrowDown' ? 1 : -1;\n const next =\n index < 0\n ? step > 0\n ? 0\n : open.length - 1\n : (index + step + open.length) % open.length;\n setActive(parts, open[next]!);\n } else if (keyboard.key === 'Enter' || commitKeys.includes(keyboard.key)) {\n if (!parts.input.value.trim() && !current) return;\n keyboard.preventDefault();\n commit(parts, current);\n } else if (keyboard.key === 'Escape' && !parts.listbox.hidden) {\n keyboard.preventDefault();\n close(parts);\n }\n };\n const onPointerDown = (event: Event) => {\n const option =\n event.target instanceof Element\n ? event.target.closest<HTMLElement>('.kui-combobox__option')\n : null;\n const input = option\n ?.closest('[data-component=\"combobox\"]')\n ?.querySelector<HTMLInputElement>(INPUT);\n const parts = input && partsOf(input);\n if (!option || !parts) return;\n // Keep focus in the field; commit on the press itself.\n event.preventDefault();\n commit(parts, option);\n };\n const onFocusOut = (event: Event) => {\n const input = inputOf(event);\n const parts = input && partsOf(input);\n if (parts) close(parts);\n };\n root.addEventListener('input', onInput);\n root.addEventListener('focusin', onFocus);\n root.addEventListener('keydown', onKeyDown);\n root.addEventListener('pointerdown', onPointerDown);\n root.addEventListener('focusout', onFocusOut);\n return () => {\n root.removeEventListener('input', onInput);\n root.removeEventListener('focusin', onFocus);\n root.removeEventListener('keydown', onKeyDown);\n root.removeEventListener('pointerdown', onPointerDown);\n root.removeEventListener('focusout', onFocusOut);\n };\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'kerfjs/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/forms/choice-chips/choice-chips.tsx
|
|
4
|
+
var unsafeSwatch = /[;{}<>"'\\]|\p{Cc}/u;
|
|
5
|
+
function swatchStyle(swatch) {
|
|
6
|
+
if (swatch === "transparent") return void 0;
|
|
7
|
+
const color = swatch.trim();
|
|
8
|
+
if (!color || unsafeSwatch.test(color))
|
|
9
|
+
throw new TypeError("ChoiceChips swatch requires one CSS color value.");
|
|
10
|
+
return `--_kui-choice-chips-swatch: ${color}`;
|
|
11
|
+
}
|
|
12
|
+
function ChoiceChips(props) {
|
|
13
|
+
const {
|
|
14
|
+
name,
|
|
15
|
+
choices,
|
|
16
|
+
action,
|
|
17
|
+
size = "default",
|
|
18
|
+
disabled = false,
|
|
19
|
+
form,
|
|
20
|
+
id,
|
|
21
|
+
className = "",
|
|
22
|
+
slot,
|
|
23
|
+
label,
|
|
24
|
+
labelledBy
|
|
25
|
+
} = props;
|
|
26
|
+
if (choices.some((choice) => choice.swatch !== void 0 && choice.icon))
|
|
27
|
+
throw new TypeError("A ChoiceChips choice takes a swatch or an icon.");
|
|
28
|
+
const multiple = props.multiple === true;
|
|
29
|
+
const required = !props.multiple && props.required === true;
|
|
30
|
+
const checked = props.multiple ? props.value ?? [] : props.value === void 0 ? [] : [props.value];
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
id,
|
|
35
|
+
class: `kui-choice-chips ${className}`.trim(),
|
|
36
|
+
"data-component": "choice-chips",
|
|
37
|
+
"data-size": size,
|
|
38
|
+
"data-disabled": disabled ? "" : void 0,
|
|
39
|
+
role: multiple ? "group" : "radiogroup",
|
|
40
|
+
"aria-label": label,
|
|
41
|
+
"aria-labelledby": labelledBy,
|
|
42
|
+
"aria-required": required ? "true" : void 0,
|
|
43
|
+
"aria-disabled": disabled ? "true" : void 0,
|
|
44
|
+
slot,
|
|
45
|
+
children: choices.map((choice) => {
|
|
46
|
+
const unavailable = disabled || choice.disabled === true;
|
|
47
|
+
return /* @__PURE__ */ jsxs(
|
|
48
|
+
"label",
|
|
49
|
+
{
|
|
50
|
+
class: "kui-choice-chips__chip",
|
|
51
|
+
"data-choice-value": choice.value,
|
|
52
|
+
"data-disabled": unavailable ? "" : void 0,
|
|
53
|
+
title: choice.title,
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx(
|
|
56
|
+
"input",
|
|
57
|
+
{
|
|
58
|
+
class: "kui-choice-chips__input",
|
|
59
|
+
type: multiple ? "checkbox" : "radio",
|
|
60
|
+
name,
|
|
61
|
+
value: choice.value,
|
|
62
|
+
checked: checked.includes(choice.value),
|
|
63
|
+
disabled: unavailable,
|
|
64
|
+
required,
|
|
65
|
+
form,
|
|
66
|
+
"data-action": action
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
choice.swatch === void 0 ? null : /* @__PURE__ */ jsx(
|
|
70
|
+
"span",
|
|
71
|
+
{
|
|
72
|
+
class: "kui-choice-chips__swatch",
|
|
73
|
+
"data-swatch": choice.swatch === "transparent" ? "transparent" : "color",
|
|
74
|
+
style: swatchStyle(choice.swatch),
|
|
75
|
+
"aria-hidden": "true"
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
choice.icon === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-choice-chips__icon", "aria-hidden": "true", children: choice.icon }),
|
|
79
|
+
/* @__PURE__ */ jsx("span", { class: "kui-choice-chips__label", children: choice.label })
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { ChoiceChips };
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=chunk-FR76ZJQC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/choice-chips/choice-chips.tsx"],"names":[],"mappings":"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","file":"chunk-FR76ZJQC.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { CssColor } from '../../../shared/styles/css-values.js';\n\nexport type ChoiceChipsSize = 'default' | 'compact';\n\n/**\n * A leading color dot: a {@link CssColor} from `uiColor()`, `colorVar()`, or\n * `fillColor()`, or `'transparent'` for the no-color swatch (an outlined\n * dot struck through by a diagonal line).\n */\nexport type ChoiceChipsSwatch = CssColor | 'transparent';\n\nexport interface ChoiceChipsChoice<Value extends string = string> {\n value: Value;\n /** Visible label; it is also the radio's accessible name. */\n label: string;\n /** Leading color dot. Mutually exclusive with `icon`. */\n swatch?: ChoiceChipsSwatch;\n /** Decorative leading icon, normally an unsized LucideIcon. */\n icon?: SafeHtml;\n /** Supplementary tooltip; never the only place a choice is described. */\n title?: string;\n disabled?: boolean;\n}\n\ninterface ChoiceChipsCommonProps<Value extends string> {\n /**\n * Native input `name`: the form field the selected value (or, with\n * `multiple`, every checked value) submits under.\n */\n name: string;\n choices: readonly ChoiceChipsChoice<Value>[];\n /** Delegated `data-action` on every input; listen for `change`. */\n action?: string;\n size?: ChoiceChipsSize;\n /** Disable the whole group. */\n disabled?: boolean;\n /** Associate the inputs with a form outside their ancestor chain. */\n form?: string;\n id?: string;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** One exclusive value (the default), backed by native radios. */\nexport interface ChoiceChipsSingleProps<Value extends string = string> {\n multiple?: false;\n /** The selected value. Omit (or pass `undefined`) for no selection. */\n value?: NoInfer<Value>;\n /** Require a selection for native form validation. */\n required?: boolean;\n}\n\n/**\n * Any number of values, backed by native checkboxes: each pill is its own Tab\n * stop, Space toggles it, and every checked value submits under `name`.\n */\nexport interface ChoiceChipsMultipleProps<Value extends string = string> {\n multiple: true;\n /** The checked values. Omit (or pass `[]`) for none. */\n value?: readonly NoInfer<Value>[];\n /**\n * Native `required` on a checkbox demands that one box, so a multiple group\n * has no \"at least one\" requirement; validate the checked set in the app.\n */\n required?: never;\n}\n\n/** A group is named either by a string or by a visible heading's id. */\nexport type ChoiceChipsNaming =\n { label: string; labelledBy?: never } | { labelledBy: string; label?: never };\n\nexport type ChoiceChipsProps<Value extends string = string> =\n ChoiceChipsCommonProps<Value> &\n (ChoiceChipsSingleProps<Value> | ChoiceChipsMultipleProps<Value>) &\n ChoiceChipsNaming;\n\nconst unsafeSwatch = /[;{}<>\"'\\\\]|\\p{Cc}/u;\n\nfunction swatchStyle(swatch: ChoiceChipsSwatch): string | undefined {\n if (swatch === 'transparent') return undefined;\n const color = swatch.trim();\n if (!color || unsafeSwatch.test(color))\n throw new TypeError('ChoiceChips swatch requires one CSS color value.');\n return `--_kui-choice-chips-swatch: ${color}`;\n}\n\n/**\n * A wrapping set of pill chips backed by native inputs. By default it is an\n * exclusive radio group: one Tab stop, arrow-key selection, and a real form\n * value. With `multiple` it is a checkbox group: each pill toggles on its own\n * and every checked value submits. Each choice may lead with a color swatch\n * (including a struck-through transparent swatch) or an icon.\n */\nexport function ChoiceChips<Value extends string>(\n props: ChoiceChipsProps<Value>,\n) {\n const {\n name,\n choices,\n action,\n size = 'default',\n disabled = false,\n form,\n id,\n className = '',\n slot,\n label,\n labelledBy,\n } = props;\n if (choices.some((choice) => choice.swatch !== undefined && choice.icon))\n throw new TypeError('A ChoiceChips choice takes a swatch or an icon.');\n const multiple = props.multiple === true;\n const required = !props.multiple && props.required === true;\n const checked: readonly Value[] = props.multiple\n ? (props.value ?? [])\n : props.value === undefined\n ? []\n : [props.value];\n return (\n <div\n id={id}\n class={`kui-choice-chips ${className}`.trim()}\n data-component=\"choice-chips\"\n data-size={size}\n data-disabled={disabled ? '' : undefined}\n role={multiple ? 'group' : 'radiogroup'}\n aria-label={label}\n aria-labelledby={labelledBy}\n aria-required={required ? 'true' : undefined}\n aria-disabled={disabled ? 'true' : undefined}\n slot={slot}\n >\n {choices.map((choice) => {\n const unavailable = disabled || choice.disabled === true;\n return (\n <label\n class=\"kui-choice-chips__chip\"\n data-choice-value={choice.value}\n data-disabled={unavailable ? '' : undefined}\n title={choice.title}\n >\n <input\n class=\"kui-choice-chips__input\"\n type={multiple ? 'checkbox' : 'radio'}\n name={name}\n value={choice.value}\n checked={checked.includes(choice.value)}\n disabled={unavailable}\n required={required}\n form={form}\n data-action={action}\n />\n {choice.swatch === undefined ? null : (\n <span\n class=\"kui-choice-chips__swatch\"\n data-swatch={\n choice.swatch === 'transparent' ? 'transparent' : 'color'\n }\n style={swatchStyle(choice.swatch)}\n aria-hidden=\"true\"\n />\n )}\n {choice.icon === undefined ? null : (\n <span class=\"kui-choice-chips__icon\" aria-hidden=\"true\">\n {choice.icon}\n </span>\n )}\n <span class=\"kui-choice-chips__label\">{choice.label}</span>\n </label>\n );\n })}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx } from 'kerfjs/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/feedback/corner-status/corner-status.tsx
|
|
4
|
+
function CornerStatus({
|
|
5
|
+
id,
|
|
6
|
+
children,
|
|
7
|
+
placement = "bottom-end",
|
|
8
|
+
presentation = "overlay",
|
|
9
|
+
className = "",
|
|
10
|
+
slot
|
|
11
|
+
}) {
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
"div",
|
|
14
|
+
{
|
|
15
|
+
id,
|
|
16
|
+
class: `kui-corner-status ${className}`.trim(),
|
|
17
|
+
"data-component": "corner-status",
|
|
18
|
+
"data-placement": placement,
|
|
19
|
+
"data-presentation": presentation,
|
|
20
|
+
popover: presentation === "overlay" ? "manual" : void 0,
|
|
21
|
+
slot,
|
|
22
|
+
children
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { CornerStatus };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=chunk-G3J7JDP6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/feedback/corner-status/corner-status.tsx"],"names":[],"mappings":";;;AAoCO,SAAS,YAAA,CAAa;AAAA,EAC3B,EAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,YAAA;AAAA,EACZ,YAAA,GAAe,SAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAsB;AACpB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA,EAAO,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC7C,gBAAA,EAAe,eAAA;AAAA,MACf,gBAAA,EAAgB,SAAA;AAAA,MAChB,mBAAA,EAAmB,YAAA;AAAA,MACnB,OAAA,EAAS,YAAA,KAAiB,SAAA,GAAY,QAAA,GAAW,MAAA;AAAA,MACjD,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-G3J7JDP6.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\n\n/** The viewport corner a CornerStatus occupies, in logical (RTL-aware) terms. */\nexport type CornerStatusPlacement =\n 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';\n\n/** Where a CornerStatus appears: the top layer, or in flow. */\nexport type CornerStatusPresentation = 'overlay' | 'embedded';\n\nexport interface CornerStatusProps {\n /** The root id: what a `popovertarget` control or `getElementById` names. */\n id?: string;\n /** One or more `StateBanner`s, typically `urgency=\"status\"`; they stack. */\n children: KerfUiContent;\n /** Viewport corner; defaults to `bottom-end`. */\n placement?: CornerStatusPlacement;\n /**\n * `overlay` (default) is a native `popover=\"manual\"` host in the top layer,\n * opened by `wireCornerStatus`: above fixed and z-indexed page chrome,\n * never focused, and with no close button, light dismiss, or Escape.\n * `embedded` renders the same stack in flow for a catalog or inline use.\n */\n presentation?: CornerStatusPresentation;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A non-dismissible status surface pinned to a viewport corner — \"Loading…\",\n * \"Updating Tickets… 3 of 12\" — for app-level progress that has no better\n * home beside the affected work. The application owns its lifetime: render it\n * while the work runs and remove it when the work ends. It carries no role of\n * its own; the composed `StateBanner` is the polite live region. Use a toast\n * for transient, dismissible confirmation instead.\n */\nexport function CornerStatus({\n id,\n children,\n placement = 'bottom-end',\n presentation = 'overlay',\n className = '',\n slot,\n}: CornerStatusProps) {\n return (\n <div\n id={id}\n class={`kui-corner-status ${className}`.trim()}\n data-component=\"corner-status\"\n data-placement={placement}\n data-presentation={presentation}\n popover={presentation === 'overlay' ? 'manual' : undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { wireResizeHandles } from './chunk-CEJ5FK6G.js';
|
|
2
|
+
|
|
3
|
+
// src/components/layout/resizable-region/wiring/wire-resizable-regions.ts
|
|
4
|
+
function wireResizableRegions(root, options) {
|
|
5
|
+
return wireResizeHandles(
|
|
6
|
+
root,
|
|
7
|
+
options,
|
|
8
|
+
'[data-component="resizable-region"]'
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { wireResizableRegions };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=chunk-GS2QD3N7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/resizable-region/wiring/wire-resizable-regions.ts"],"names":[],"mappings":";;;AASO,SAAS,oBAAA,CACd,MACA,OAAA,EACA;AACA,EAAA,OAAO,iBAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-GS2QD3N7.js","sourcesContent":["import {\n type ResizeCommit,\n type WireResizableRegionsOptions,\n wireResizeHandles,\n} from '../internal/resize-wiring.js';\n\nexport type { ResizeCommit, WireResizableRegionsOptions };\n\n/** Wire pointer and separator-keyboard behavior for every ResizableRegion below root. */\nexport function wireResizableRegions(\n root: HTMLElement,\n options: WireResizableRegionsOptions,\n) {\n return wireResizeHandles(\n root,\n options,\n '[data-component=\"resizable-region\"]',\n );\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Skeleton } from './chunk-CVD5IZGB.js';
|
|
2
|
+
import { em } from './chunk-IQSRHXZR.js';
|
|
3
|
+
import { jsx, jsxs } from 'kerfjs/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function ToolbarText({
|
|
6
|
+
text,
|
|
7
|
+
size = "default",
|
|
8
|
+
tone = "default",
|
|
9
|
+
hideBelow,
|
|
10
|
+
showBelow,
|
|
11
|
+
className = "",
|
|
12
|
+
id,
|
|
13
|
+
headingLevel,
|
|
14
|
+
placeholder = false,
|
|
15
|
+
wrap = false,
|
|
16
|
+
ellipsis = true,
|
|
17
|
+
maxLines = null,
|
|
18
|
+
fill = false,
|
|
19
|
+
slot,
|
|
20
|
+
action,
|
|
21
|
+
description,
|
|
22
|
+
descriptionId
|
|
23
|
+
}) {
|
|
24
|
+
const capped = wrap && maxLines != null && maxLines > 0;
|
|
25
|
+
if (action !== void 0)
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
"button",
|
|
28
|
+
{
|
|
29
|
+
type: "button",
|
|
30
|
+
class: `kui-toolbar-text ${className}`.trim(),
|
|
31
|
+
"data-component": "toolbar-text",
|
|
32
|
+
"data-size": size,
|
|
33
|
+
"data-hide-below": hideBelow,
|
|
34
|
+
"data-show-below": showBelow,
|
|
35
|
+
"data-tone": tone === "default" ? void 0 : tone,
|
|
36
|
+
"data-fill": fill ? "true" : void 0,
|
|
37
|
+
"data-ellipsis": ellipsis ? void 0 : "false",
|
|
38
|
+
"data-action": action,
|
|
39
|
+
id,
|
|
40
|
+
slot,
|
|
41
|
+
children: /* @__PURE__ */ jsx("span", { class: "kui-toolbar-text__text", children: text })
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
const described = description !== void 0 && !placeholder;
|
|
45
|
+
const title = placeholder ? /* @__PURE__ */ jsx(Skeleton, { width: em(8) }) : /* @__PURE__ */ jsx(
|
|
46
|
+
"span",
|
|
47
|
+
{
|
|
48
|
+
class: "kui-toolbar-text__text",
|
|
49
|
+
id: described ? id : void 0,
|
|
50
|
+
role: described && headingLevel ? "heading" : void 0,
|
|
51
|
+
"aria-level": described && headingLevel ? String(headingLevel) : void 0,
|
|
52
|
+
children: text
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
return /* @__PURE__ */ jsxs(
|
|
56
|
+
"span",
|
|
57
|
+
{
|
|
58
|
+
class: `kui-toolbar-text ${className}`.trim(),
|
|
59
|
+
"data-component": "toolbar-text",
|
|
60
|
+
"data-size": size,
|
|
61
|
+
"data-hide-below": hideBelow,
|
|
62
|
+
"data-show-below": showBelow,
|
|
63
|
+
"data-tone": tone === "default" ? void 0 : tone,
|
|
64
|
+
"data-fill": fill ? "true" : void 0,
|
|
65
|
+
"data-wrap": wrap ? "true" : void 0,
|
|
66
|
+
"data-ellipsis": ellipsis ? void 0 : "false",
|
|
67
|
+
"data-max-lines": capped ? String(maxLines) : void 0,
|
|
68
|
+
style: capped ? `--kui-toolbar-text-max-lines:${maxLines}` : void 0,
|
|
69
|
+
"data-placeholder": placeholder ? "true" : void 0,
|
|
70
|
+
"data-has-description": described ? "true" : void 0,
|
|
71
|
+
id: described ? void 0 : id,
|
|
72
|
+
role: headingLevel && !described ? "heading" : void 0,
|
|
73
|
+
"aria-level": headingLevel && !described ? String(headingLevel) : void 0,
|
|
74
|
+
"aria-busy": placeholder ? "true" : void 0,
|
|
75
|
+
slot,
|
|
76
|
+
children: [
|
|
77
|
+
title,
|
|
78
|
+
described ? /* @__PURE__ */ jsx("span", { class: "kui-toolbar-text__description", id: descriptionId, children: description }) : null
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { ToolbarText };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=chunk-HGV7J4T6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/actions/toolbar-text/toolbar-text.tsx"],"names":[],"mappings":"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","file":"chunk-HGV7J4T6.js","sourcesContent":["import { type CssLength, em } from '../../../shared/styles/css-values.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\n\nexport type ToolbarTextSize =\n 'xlarge' | 'xlarge-fixed' | 'large' | 'default' | 'small' | 'xsmall';\n\nexport type ToolbarTextTone = 'default' | 'dark';\n\n/** ARIA heading level for a title exposed as a heading landmark. */\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface ToolbarTextBaseProps {\n text: string;\n size?: ToolbarTextSize;\n /** Use dark-toolbar foregrounds on a dark or photo-backed toolbar. */\n tone?: ToolbarTextTone;\n /** Hide below this Toolbar content width; requires wireToolbarVisibility. */\n hideBelow?: CssLength;\n /** Show only below this Toolbar content width; requires wireToolbarVisibility. */\n showBelow?: CssLength;\n className?: string;\n /** Optional id, e.g. so a dialog can reference the title via aria-labelledby. */\n id?: string;\n /**\n * Show a trailing ellipsis (…) where the text is truncated — on the single line\n * (default), or at the `maxLines` boundary when wrapping. Set false to hard-clip\n * instead. Default true.\n */\n ellipsis?: boolean;\n /**\n * Grow to fill the free space of the flex row it sits in (a Toolbar zone),\n * truncating at the space left by its siblings instead of taking only its\n * text's width. Default false.\n */\n fill?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n /**\n * Cap wrapped text to this many lines, truncating past it. Only takes effect with\n * `wrap`; ignored on a single line. `null`/omitted wraps without a line cap. Default null.\n */\n}\n\ntype ToolbarTextWrappingProps =\n | {\n /** Wrap onto multiple lines; combine with `maxLines` to cap them. */\n wrap: true;\n maxLines?: number | null;\n }\n | { wrap?: false; maxLines?: never };\n\nexport type ToolbarTextProps = ToolbarTextBaseProps &\n (\n | ({\n action?: never;\n /** Expose `role=\"heading\"` and `aria-level` on read-only text. */\n headingLevel?: HeadingLevel;\n /** Render an unanimated loading skeleton instead of the text. */\n placeholder?: boolean;\n /**\n * Quiet, single-line supporting copy under the title (\"Changes save\n * automatically.\"), truncating with an ellipsis. Title and description\n * share the toolbar's control band and the same text start, with or\n * without a leading icon group. With a description, `id` and\n * `headingLevel` apply to the title alone, so a dialog's\n * `aria-labelledby` names only the title.\n */\n description?: string;\n /** Id for the description, for a dialog's `aria-describedby`. */\n descriptionId?: string;\n } & ToolbarTextWrappingProps)\n | {\n /** Render a native button with this delegated action; the app owns editing. */\n action: string;\n headingLevel?: never;\n placeholder?: never;\n wrap?: never;\n maxLines?: never;\n description?: never;\n descriptionId?: never;\n }\n );\n\nexport function ToolbarText({\n text,\n size = 'default',\n tone = 'default',\n hideBelow,\n showBelow,\n className = '',\n id,\n headingLevel,\n placeholder = false,\n wrap = false,\n ellipsis = true,\n maxLines = null,\n fill = false,\n slot,\n action,\n description,\n descriptionId,\n}: ToolbarTextProps) {\n const capped = wrap && maxLines != null && maxLines > 0;\n if (action !== undefined)\n return (\n <button\n type=\"button\"\n class={`kui-toolbar-text ${className}`.trim()}\n data-component=\"toolbar-text\"\n data-size={size}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-tone={tone === 'default' ? undefined : tone}\n data-fill={fill ? 'true' : undefined}\n data-ellipsis={ellipsis ? undefined : 'false'}\n data-action={action}\n id={id}\n slot={slot}\n >\n <span class=\"kui-toolbar-text__text\">{text}</span>\n </button>\n );\n const described = description !== undefined && !placeholder;\n const title = placeholder ? (\n <Skeleton width={em(8)} />\n ) : (\n <span\n class=\"kui-toolbar-text__text\"\n id={described ? id : undefined}\n role={described && headingLevel ? 'heading' : undefined}\n aria-level={described && headingLevel ? String(headingLevel) : undefined}\n >\n {text}\n </span>\n );\n return (\n <span\n class={`kui-toolbar-text ${className}`.trim()}\n data-component=\"toolbar-text\"\n data-size={size}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-tone={tone === 'default' ? undefined : tone}\n data-fill={fill ? 'true' : undefined}\n data-wrap={wrap ? 'true' : undefined}\n data-ellipsis={ellipsis ? undefined : 'false'}\n data-max-lines={capped ? String(maxLines) : undefined}\n style={capped ? `--kui-toolbar-text-max-lines:${maxLines}` : undefined}\n data-placeholder={placeholder ? 'true' : undefined}\n data-has-description={described ? 'true' : undefined}\n id={described ? undefined : id}\n role={headingLevel && !described ? 'heading' : undefined}\n aria-level={headingLevel && !described ? String(headingLevel) : undefined}\n aria-busy={placeholder ? 'true' : undefined}\n slot={slot}\n >\n {title}\n {described ? (\n <span class=\"kui-toolbar-text__description\" id={descriptionId}>\n {description}\n </span>\n ) : null}\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { LucideIcon } from './chunk-LOSRXZAH.js';
|
|
2
|
+
import { LoadingSpinner } from './chunk-WVS6CUCT.js';
|
|
3
|
+
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
4
|
+
import { ChevronDown } from 'lucide';
|
|
5
|
+
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var splitButtonProtected = /* @__PURE__ */ new Set([
|
|
8
|
+
"data-component",
|
|
9
|
+
"data-tone",
|
|
10
|
+
"data-fill",
|
|
11
|
+
"data-busy"
|
|
12
|
+
]);
|
|
13
|
+
function SplitButton({
|
|
14
|
+
label,
|
|
15
|
+
action,
|
|
16
|
+
icon,
|
|
17
|
+
accessibleLabel,
|
|
18
|
+
optionsLabel,
|
|
19
|
+
optionsAction,
|
|
20
|
+
optionsExpanded = false,
|
|
21
|
+
optionsPopup = "menu",
|
|
22
|
+
optionsControls,
|
|
23
|
+
tone = "brand",
|
|
24
|
+
fill = false,
|
|
25
|
+
busy = false,
|
|
26
|
+
disabled = false,
|
|
27
|
+
optionsDisabled = false,
|
|
28
|
+
title,
|
|
29
|
+
className = "",
|
|
30
|
+
rootAttributes = {},
|
|
31
|
+
slot
|
|
32
|
+
}) {
|
|
33
|
+
const leading = busy ? /* @__PURE__ */ jsx(LoadingSpinner, {}) : icon;
|
|
34
|
+
return /* @__PURE__ */ jsxs(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
...filterDataAttributes(rootAttributes, splitButtonProtected),
|
|
38
|
+
class: `kui-split-button ${className}`.trim(),
|
|
39
|
+
"data-component": "split-button",
|
|
40
|
+
"data-tone": tone,
|
|
41
|
+
"data-fill": fill ? "true" : void 0,
|
|
42
|
+
"data-busy": busy ? "true" : void 0,
|
|
43
|
+
role: "group",
|
|
44
|
+
slot,
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsxs(
|
|
47
|
+
"button",
|
|
48
|
+
{
|
|
49
|
+
type: "button",
|
|
50
|
+
class: "kui-split-button__primary",
|
|
51
|
+
"data-action": action,
|
|
52
|
+
"aria-label": accessibleLabel,
|
|
53
|
+
"aria-busy": busy ? "true" : void 0,
|
|
54
|
+
title,
|
|
55
|
+
disabled,
|
|
56
|
+
children: [
|
|
57
|
+
leading && /* @__PURE__ */ jsx("span", { class: "kui-split-button__icon", "aria-hidden": "true", children: leading }),
|
|
58
|
+
/* @__PURE__ */ jsx("span", { class: "kui-split-button__label", children: label })
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
"button",
|
|
64
|
+
{
|
|
65
|
+
type: "button",
|
|
66
|
+
class: "kui-split-button__options",
|
|
67
|
+
"data-action": optionsAction,
|
|
68
|
+
"aria-label": optionsLabel,
|
|
69
|
+
"aria-haspopup": optionsPopup,
|
|
70
|
+
"aria-expanded": optionsExpanded ? "true" : "false",
|
|
71
|
+
"aria-controls": optionsControls,
|
|
72
|
+
title: optionsLabel,
|
|
73
|
+
disabled: optionsDisabled,
|
|
74
|
+
children: /* @__PURE__ */ jsx(LucideIcon, { icon: ChevronDown, name: "chevron-down" })
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { SplitButton };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=chunk-HLDRH23D.js.map
|