@kerfjs/ui 5.0.0-beta.97 → 5.0.0-beta.99
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 +42 -1
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/component-catalog.json +487 -66
- package/ai/component-catalog.schema.json +1 -1
- package/ai/component-composition-rules.json +22 -2
- package/ai/component-composition.json +360 -33
- package/ai/component-composition.schema.json +1 -1
- package/ai/components/README.md +18 -17
- package/ai/components/anchored-surface.md +13 -0
- package/ai/components/application-tabs.md +1 -1
- package/ai/components/chip.md +9 -5
- package/ai/components/choice-chips.md +15 -8
- package/ai/components/collapsible-panel.md +3 -2
- package/ai/components/composer.md +83 -0
- package/ai/components/content-item.md +2 -2
- package/ai/components/corner-status.md +1 -1
- package/ai/components/document-baseline.md +3 -3
- package/ai/components/foundation.md +2 -2
- package/ai/components/layout.md +1 -1
- package/ai/components/list-action-row.md +5 -1
- package/ai/components/list-item.md +5 -1
- package/ai/components/list.md +19 -3
- package/ai/components/nav-stack.md +11 -2
- package/ai/components/pane.md +13 -4
- package/ai/components/popup-menu.md +4 -4
- package/ai/components/recipe-app-shell.md +3 -3
- package/ai/components/recipe-collapsible-sidebar.md +3 -3
- package/ai/components/recipe-compact-toolbar.md +1 -1
- package/ai/components/recipe-composer-form.md +3 -3
- package/ai/components/recipe-list-detail-dialog.md +2 -2
- package/ai/components/recipe-list-workspace-states.md +3 -3
- package/ai/components/recipe-loading-inspector.md +1 -1
- package/ai/components/recipe-navigation-sidebar.md +3 -3
- package/ai/components/recipe-navigation-stack.md +3 -3
- package/ai/components/recipe-workspace-header.md +3 -3
- package/ai/components/resize.md +2 -2
- package/ai/components/split-view.md +4 -2
- package/ai/components/sunken-panel.md +2 -2
- package/ai/components/surface-scaffold.md +15 -3
- package/ai/components/tab-bar.md +1 -0
- package/ai/components/tab-navigator.md +4 -0
- package/ai/components/toolbar-control-group.md +2 -0
- package/ai/components/toolbar-text.md +1 -0
- package/ai/components/toolbar.md +1 -0
- package/ai/components/workbench.md +1 -0
- package/ai/public-api-signatures-v1.md +504 -80
- package/ai/skill.md +41 -14
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/component-ownership.mjs +1 -1
- package/analyzer/index.mjs +41 -14
- package/dist/anchored-surface.d.ts +30 -2
- package/dist/anchored-surface.js +1 -1
- package/dist/app-tab.js +1 -1
- package/dist/browser/composer.js +4 -0
- package/dist/catalog-resources.d.ts +3 -2
- package/dist/catalog-resources.js +4 -4
- package/dist/catalog-resources.js.map +1 -1
- package/dist/catalog.d.ts +39 -8
- package/dist/catalog.js +55 -32
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +41 -9
- package/dist/chip.js +1 -1
- package/dist/choice-chips.d.ts +40 -16
- package/dist/choice-chips.js +1 -1
- package/dist/chunk-34U4ANDJ.js +119 -0
- package/dist/chunk-34U4ANDJ.js.map +1 -0
- package/dist/{chunk-36TL6BCR.js → chunk-3GLYIIFR.js} +34 -6
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/{chunk-HWY4BSLS.js → chunk-3VXDSIBJ.js} +2 -2
- package/dist/{chunk-HWY4BSLS.js.map → chunk-3VXDSIBJ.js.map} +1 -1
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-AV7CPAPT.js +82 -0
- package/dist/chunk-AV7CPAPT.js.map +1 -0
- package/dist/{chunk-XK4E225T.js → chunk-B53PS2LE.js} +2 -2
- package/dist/{chunk-XK4E225T.js.map → chunk-B53PS2LE.js.map} +1 -1
- package/dist/{chunk-R42D2BAO.js → chunk-CA7LNX3J.js} +2 -2
- package/dist/{chunk-R42D2BAO.js.map → chunk-CA7LNX3J.js.map} +1 -1
- package/dist/{chunk-AYHC62OZ.js → chunk-CMETHPKR.js} +26 -29
- package/dist/chunk-CMETHPKR.js.map +1 -0
- package/dist/{chunk-Y43B6DS3.js → chunk-CVD5IZGB.js} +2 -2
- package/dist/{chunk-Y43B6DS3.js.map → chunk-CVD5IZGB.js.map} +1 -1
- package/dist/{chunk-6STQXRT4.js → chunk-CXZXHZTR.js} +121 -12
- package/dist/chunk-CXZXHZTR.js.map +1 -0
- package/dist/{chunk-GZE2XVKC.js → chunk-DZJ4GBSP.js} +3 -3
- package/dist/{chunk-GZE2XVKC.js.map → chunk-DZJ4GBSP.js.map} +1 -1
- package/dist/chunk-ELCMSQNJ.js +49 -0
- package/dist/chunk-ELCMSQNJ.js.map +1 -0
- package/dist/{chunk-P74VXMB6.js → chunk-EOO6PYGF.js} +7 -14
- package/dist/chunk-EOO6PYGF.js.map +1 -0
- package/dist/{chunk-PRG4CL3Q.js → chunk-FR76ZJQC.js} +21 -19
- package/dist/chunk-FR76ZJQC.js.map +1 -0
- package/dist/{chunk-QQ3TTWFH.js → chunk-G3J7JDP6.js} +1 -1
- package/dist/{chunk-QQ3TTWFH.js.map → chunk-G3J7JDP6.js.map} +1 -1
- package/dist/{chunk-IGTWXPTN.js → chunk-HGV7J4T6.js} +3 -3
- package/dist/{chunk-IGTWXPTN.js.map → chunk-HGV7J4T6.js.map} +1 -1
- package/dist/{chunk-YWQGSUF2.js → chunk-HLDRH23D.js} +3 -3
- package/dist/{chunk-YWQGSUF2.js.map → chunk-HLDRH23D.js.map} +1 -1
- package/dist/{chunk-PBT3CPPY.js → chunk-HQZYKJ56.js} +24 -4
- package/dist/chunk-HQZYKJ56.js.map +1 -0
- package/dist/{chunk-V6W56V3N.js → chunk-HZPHCSCS.js} +16 -3
- package/dist/chunk-HZPHCSCS.js.map +1 -0
- package/dist/{chunk-GJYQ27C2.js → chunk-INI4WDWC.js} +8 -1
- package/dist/chunk-INI4WDWC.js.map +1 -0
- package/dist/{chunk-U657IHFB.js → chunk-IQSRHXZR.js} +10 -4
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/{chunk-KQDU7Z7P.js → chunk-K4AT3V3J.js} +2 -1
- package/dist/chunk-K4AT3V3J.js.map +1 -0
- package/dist/{chunk-QIAPOWHH.js → chunk-KCS6NJ3O.js} +2 -2
- package/dist/{chunk-QIAPOWHH.js.map → chunk-KCS6NJ3O.js.map} +1 -1
- package/dist/{chunk-UKKRPP56.js → chunk-LOSRXZAH.js} +2 -2
- package/dist/{chunk-UKKRPP56.js.map → chunk-LOSRXZAH.js.map} +1 -1
- package/dist/{chunk-ROZLJULF.js → chunk-MF6ZUUJZ.js} +8 -3
- package/dist/chunk-MF6ZUUJZ.js.map +1 -0
- package/dist/{chunk-6IVNMC6R.js → chunk-MHMWQ7RB.js} +2 -2
- package/dist/{chunk-6IVNMC6R.js.map → chunk-MHMWQ7RB.js.map} +1 -1
- package/dist/{chunk-JYD7G4RG.js → chunk-PIVY32AE.js} +15 -5
- package/dist/chunk-PIVY32AE.js.map +1 -0
- package/dist/{chunk-BU23Z5HZ.js → chunk-PYBBYSZ3.js} +13 -18
- 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-YXOMI7ES.js → chunk-QIG4IGUP.js} +2 -2
- package/dist/{chunk-YXOMI7ES.js.map → chunk-QIG4IGUP.js.map} +1 -1
- package/dist/{chunk-6BRRUPJY.js → chunk-QROYYGWU.js} +3 -3
- package/dist/chunk-QROYYGWU.js.map +1 -0
- package/dist/{chunk-FOQK4F3L.js → chunk-RHD7RKGI.js} +28 -7
- package/dist/chunk-RHD7RKGI.js.map +1 -0
- package/dist/{chunk-BBU2SPRE.js → chunk-T4WJ5VGP.js} +4 -4
- package/dist/{chunk-BBU2SPRE.js.map → chunk-T4WJ5VGP.js.map} +1 -1
- package/dist/{chunk-6NOLL5KG.js → chunk-TGLUDQP2.js} +3 -3
- package/dist/{chunk-6NOLL5KG.js.map → chunk-TGLUDQP2.js.map} +1 -1
- package/dist/{chunk-HO6FU3G7.js → chunk-TLMMFQWM.js} +4 -4
- package/dist/{chunk-HO6FU3G7.js.map → chunk-TLMMFQWM.js.map} +1 -1
- package/dist/chunk-UMKV7YVQ.js +20 -0
- package/dist/chunk-UMKV7YVQ.js.map +1 -0
- package/dist/{chunk-M2NRCFRO.js → chunk-VFYO3UGZ.js} +2 -2
- package/dist/{chunk-M2NRCFRO.js.map → chunk-VFYO3UGZ.js.map} +1 -1
- package/dist/{chunk-YOKEL75M.js → chunk-WVS6CUCT.js} +2 -2
- package/dist/{chunk-YOKEL75M.js.map → chunk-WVS6CUCT.js.map} +1 -1
- package/dist/{chunk-MN3POJFN.js → chunk-YMUIQRWK.js} +2 -2
- package/dist/{chunk-MN3POJFN.js.map → chunk-YMUIQRWK.js.map} +1 -1
- package/dist/{chunk-Y3LC7JQO.js → chunk-YOA5W5ZH.js} +2 -2
- package/dist/{chunk-Y3LC7JQO.js.map → chunk-YOA5W5ZH.js.map} +1 -1
- package/dist/{chunk-44A6LP54.js → chunk-YQ2AC4E2.js} +2 -2
- package/dist/{chunk-44A6LP54.js.map → chunk-YQ2AC4E2.js.map} +1 -1
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/collapsible-panel.d.ts +3 -2
- package/dist/collapsible-panel.js +4 -3
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/composer.d.ts +62 -0
- package/dist/composer.js +5 -0
- package/dist/composer.js.map +1 -0
- package/dist/corner-status.d.ts +1 -1
- package/dist/corner-status.js +1 -1
- package/dist/css-values.d.ts +9 -1
- package/dist/css-values.js +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/empty-state.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/icon-button.js +1 -1
- package/dist/icon-toggle-button.js +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +40 -37
- package/dist/list-action-row.d.ts +10 -2
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
- package/dist/list-item.d.ts +10 -3
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +36 -4
- package/dist/list.js +1 -1
- package/dist/loading-spinner.js +1 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/{nav-stack-BvSKY448.d.ts → nav-stack-VXTumzKa.d.ts} +53 -4
- package/dist/nav-stack.d.ts +3 -2
- package/dist/nav-stack.js +2 -1
- package/dist/pane.d.ts +40 -3
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-CL9tYOkh.d.ts → panel-toolbar-vg6Ir5Dy.d.ts} +6 -1
- package/dist/popup-menu-register.d.ts +2 -1
- package/dist/popup-menu-register.js +97 -22
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.js +1 -1
- package/dist/row.js +1 -1
- package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
- package/dist/select-register.js +11 -0
- package/dist/select-register.js.map +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-button.js +1 -1
- package/dist/split-view.d.ts +7 -5
- package/dist/split-view.js +6 -3
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +6 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/anchored-surface.css +27 -1
- package/dist/styles/catalog/components/catalog-example-stack.css +5 -0
- package/dist/styles/catalog/components/catalog-example.css +33 -0
- package/dist/styles/catalog/components/catalog-stage.css +7 -0
- package/dist/styles/chip.css +70 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +21 -4
- package/dist/styles/components/actions/toolbar/toolbar.css +19 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +75 -1
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +75 -0
- package/dist/styles/components/collections/list/list.css +77 -7
- package/dist/styles/components/collections/list-action-row/list-action-row.css +177 -22
- package/dist/styles/components/collections/list-item/list-item.css +158 -11
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +27 -1
- package/dist/styles/components/feedback/chip/chip.css +70 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +24 -13
- package/dist/styles/components/forms/composer/composer.css +100 -0
- package/dist/styles/components/forms/select/select.css +1 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +13 -2
- package/dist/styles/components/layout/pane/pane.css +81 -2
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +84 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +15 -4
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +79 -4
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +195 -0
- package/dist/styles/composer.css +100 -0
- package/dist/styles/foundation.css +66 -0
- package/dist/styles/list-action-row.css +177 -22
- package/dist/styles/list-item.css +158 -11
- package/dist/styles/list.css +77 -7
- package/dist/styles/nav-stack.css +84 -0
- package/dist/styles/pane.css +81 -2
- package/dist/styles/popup-menu.css +21 -4
- package/dist/styles/select.css +1 -0
- package/dist/styles/state-banner.css +24 -13
- package/dist/styles/styles.css +1 -0
- package/dist/styles/surface-scaffold.css +195 -0
- package/dist/styles/tab-bar.css +15 -4
- package/dist/styles/tab-navigator.css +79 -4
- package/dist/styles/token-search-field.css +13 -2
- package/dist/styles/toolbar-control-group.css +75 -1
- package/dist/styles/toolbar-text.css +75 -0
- package/dist/styles/toolbar.css +19 -0
- package/dist/styles/webawesome.css +18 -0
- package/dist/surface-scaffold-register.d.ts +6 -1
- package/dist/surface-scaffold-register.js +89 -3
- package/dist/surface-scaffold-register.js.map +1 -1
- package/dist/surface-scaffold.d.ts +66 -7
- package/dist/surface-scaffold.js +1 -1
- package/dist/tab-navigator.d.ts +23 -2
- package/dist/tab-navigator.js +2 -0
- package/dist/tab-navigator.js.map +1 -1
- package/dist/token-search-field.d.ts +1 -1
- package/dist/token-search-field.js +1 -1
- package/dist/{token-search-model-DTcTXWMS.d.ts → token-search-model-aYR0YAei.d.ts} +32 -2
- package/dist/token-search-model.d.ts +1 -1
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +1 -0
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +3 -2
- package/dist/wire-catalog.js +2 -2
- 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-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-nav-stack.js +135 -0
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-scroll-dividers.d.ts +9 -0
- package/dist/wire-scroll-dividers.js +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +3 -1
- package/dist/wire-tab-navigator.js +133 -1
- package/dist/wire-tab-navigator.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +8 -3
- package/dist/workbench.js +2 -1
- package/docs/accessibility.md +132 -3
- package/docs/anchored-surface.md +46 -4
- package/docs/app-layouts.md +23 -2
- package/docs/apple-hig.md +1 -0
- package/docs/catalog.md +61 -9
- package/docs/collapsible-panel.md +9 -6
- package/docs/component-contract.md +46 -13
- package/docs/component-selection.md +147 -20
- package/docs/composer.md +143 -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 -1
- package/docs/design/templates/choice-chips.svg +1 -1
- package/docs/design/templates/composer/chat-dark.svg +1 -0
- package/docs/design/templates/composer/chat.svg +1 -0
- package/docs/design/templates/composer/prompt-dark.svg +1 -0
- package/docs/design/templates/composer/prompt.svg +1 -0
- package/docs/design/templates/composer-dark.svg +1 -0
- package/docs/design/templates/composer.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/compact-dark.svg +1 -1
- package/docs/design/templates/list/compact.svg +1 -1
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -1
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -1
- package/docs/design/templates/list-action-row-dark.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l.svg +1 -1
- package/docs/design/templates/list-header/size-m-dark.svg +1 -1
- package/docs/design/templates/list-header/size-m.svg +1 -1
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xl.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-item/icon-tile.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/skeleton-dark.svg +1 -1
- package/docs/design/templates/skeleton.svg +1 -1
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/strip-dark.svg +1 -1
- package/docs/design/templates/state-banner/strip.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-text.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design-philosophy.md +9 -1
- package/docs/examples/command-palette-adapter.tsx +3 -3
- package/docs/layout.md +147 -14
- package/docs/nav-stack.md +132 -8
- package/docs/recipes.md +9 -9
- package/docs/split-view.md +3 -3
- package/docs/sunken-panel.md +2 -2
- package/docs/surface-scaffold.md +138 -7
- package/docs/tab-navigator.md +38 -1
- package/docs/type-contracts.md +16 -16
- package/docs/ui-analyzer.md +3 -1
- package/docs/ui-doctor.md +71 -0
- package/docs/ux-demo.md +6 -6
- package/docs/webawesome-theme.md +7 -0
- package/docs/workbench.md +10 -6
- package/docs/writing.md +152 -0
- package/doctor/copy-capitalization-checks.mjs +591 -0
- package/doctor/index.mjs +17 -8
- package/llms.txt +105 -11
- package/package.json +15 -1
- package/ux-demo/recipes/app-shell.tsx +11 -11
- package/ux-demo/recipes/collapsible-sidebar.tsx +12 -11
- package/ux-demo/recipes/compact-toolbar.tsx +10 -10
- package/ux-demo/recipes/composer-form.tsx +8 -8
- package/ux-demo/recipes/list-detail-dialog.tsx +13 -13
- package/ux-demo/recipes/list-workspace-states.tsx +13 -13
- package/ux-demo/recipes/loading-inspector.tsx +10 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +7 -7
- package/ux-demo/recipes/navigation-stack.tsx +5 -5
- package/ux-demo/recipes/workspace-header.tsx +5 -5
- package/dist/chunk-36TL6BCR.js.map +0 -1
- package/dist/chunk-4LOK4634.js +0 -21
- package/dist/chunk-4LOK4634.js.map +0 -1
- package/dist/chunk-6BRRUPJY.js.map +0 -1
- package/dist/chunk-6STQXRT4.js.map +0 -1
- package/dist/chunk-76PWEN5Y.js +0 -64
- package/dist/chunk-76PWEN5Y.js.map +0 -1
- package/dist/chunk-AYHC62OZ.js.map +0 -1
- package/dist/chunk-BU23Z5HZ.js.map +0 -1
- package/dist/chunk-DQDTZE4W.js +0 -70
- package/dist/chunk-DQDTZE4W.js.map +0 -1
- package/dist/chunk-FOQK4F3L.js.map +0 -1
- package/dist/chunk-GJYQ27C2.js.map +0 -1
- package/dist/chunk-JYD7G4RG.js.map +0 -1
- package/dist/chunk-KQDU7Z7P.js.map +0 -1
- package/dist/chunk-P74VXMB6.js.map +0 -1
- package/dist/chunk-PBT3CPPY.js.map +0 -1
- package/dist/chunk-PRG4CL3Q.js.map +0 -1
- package/dist/chunk-ROZLJULF.js.map +0 -1
- package/dist/chunk-U657IHFB.js.map +0 -1
- package/dist/chunk-V6W56V3N.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wiring/wire-scroll-dividers.ts"],"names":["view","scroller"],"mappings":"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","file":"chunk-CXZXHZTR.js","sourcesContent":["/**\n * An app-owned scroll arrangement outside a `Pane`: the `id` of the element\n * that scrolls and the `id`s of the pinned chrome on each physical side of it.\n * Each named chrome element shows its divider on the side facing the scroller\n * while content is scrolled away beyond that side. Ids are resolved below the\n * wired root on every refresh, so a re-render that replaces an element keeps\n * the pairing.\n */\nexport interface ScrollDividerTarget {\n /** The `id` of the scrolling element. */\n scroller: string;\n /** Chrome above the scroller: shows its bottom divider once scrolled down. */\n top?: string;\n /**\n * Chrome right of the scroller: shows its left divider while content is\n * hidden beyond the scroller's right edge (never when nothing overflows).\n */\n right?: string;\n /**\n * Chrome below the scroller: shows its top divider while content is hidden\n * beyond the scroller's bottom edge (never when nothing overflows).\n */\n bottom?: string;\n /** Chrome left of the scroller: shows its right divider once scrolled right. */\n left?: string;\n}\n\nexport interface WireScrollDividersOptions {\n /**\n * App-owned scroll arrangements to pair beyond the ones found by structure\n * (every `Pane`'s header and footer around its content, every `NavStack`'s\n * and `TabNavigator`'s chrome around its active region, and every `TabBar`\n * strip).\n */\n targets?: readonly ScrollDividerTarget[];\n}\n\ntype Edge = 't' | 'r' | 'b' | 'l';\n\nconst EDGES: readonly Edge[] = ['t', 'r', 'b', 'l'];\n\n/** The side of a chrome element that faces a scroller it sits on `edge` of. */\nconst FACING: Record<Edge, Edge> = { t: 'b', r: 'l', b: 't', l: 'r' };\n\nconst TARGET_EDGES: Record<Edge, 'top' | 'right' | 'bottom' | 'left'> = {\n t: 'top',\n r: 'right',\n b: 'bottom',\n l: 'left',\n};\n\n/** On a scroller: the edges beyond which content is currently hidden. */\nconst SCROLL_OVERFLOW = 'data-scroll-overflow';\n/** On a chrome element: its sides that currently show a scroll divider. */\nconst SCROLL_DIVIDER = 'data-scroll-divider';\n\n/** On a Pane with an overlay header: the wiring has measured that header. */\nconst HEADER_OVERLAY = 'data-header-overlay';\n/** The inherited clearance context a measured overlay header publishes. */\nconst CLEARANCE_BLOCK_START = '--kui-scroll-clearance-block-start';\n/**\n * On a Pane with a measured overlay header: the inline size of its content's\n * classic vertical scrollbar, which the header leaves uncovered. Unset for an\n * overlay scrollbar, which takes no space.\n */\nconst SCROLLBAR_INLINE_SIZE = '--kui-pane-scrollbar-inline-size';\n/** A Pane whose header is laid over its content (fixed chrome only). */\nconst OVERLAY_PANE =\n '.kui-pane[data-header-presentation=\"overlay\"]:not([data-chrome-placement=\"auto\"])';\n\n/**\n * Scroll distance, in px, that must be exceeded to count as \"away from an\n * edge\": `scrollWidth`/`scrollHeight` are rounded to whole pixels while the\n * scroll position is fractional, so a scroller at its end can report up to a\n * pixel still to go.\n */\nconst THRESHOLD = 1;\n\ninterface Pairing {\n scroller: HTMLElement;\n chrome: Partial<Record<Edge, HTMLElement>>;\n}\n\n/** A double-quoted CSS attribute-selector value. */\nconst quoted = (value: string) =>\n `\"${value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')}\"`;\n\n/** Elements matching `selector` at and below root. */\nfunction within<T extends Element>(\n root: HTMLElement | Document,\n selector: string,\n): T[] {\n const found = [...root.querySelectorAll<T>(selector)];\n if (root.nodeType === 1 && (root as HTMLElement).matches(selector))\n found.unshift(root as unknown as T);\n return found;\n}\n\nconst directChild = (parent: Element, selector: string) =>\n [...parent.children].find((child): child is HTMLElement =>\n child.matches(selector),\n );\n\nconst PANE_CHROME = {\n t: '.kui-pane__header, .kui-pane__toolbar',\n b: '.kui-pane__footer',\n} as const;\n\n/** A NavStack's live (not cross-fading copy) chrome on `edge`. */\nconst NAV_STACK_CHROME = {\n t: '.kui-nav-stack__chrome:not([data-nav-chrome-copy])',\n b: '.kui-nav-stack__bottom:not([data-nav-chrome-copy])',\n} as const;\n\n/** A NavStack's active view: the top entry, never one sliding out. */\nfunction activeView(stack: Element): HTMLElement | undefined {\n const viewport = directChild(stack, '.kui-nav-stack__viewport');\n if (!viewport) return undefined;\n return [...viewport.children]\n .filter((child): child is HTMLElement =>\n child.matches(\n '.kui-nav-stack__view[data-nav-active=\"true\"]:not([data-nav-exiting=\"true\"])',\n ),\n )\n .at(-1);\n}\n\n/** A TabNavigator's shown scene. */\nfunction activeScene(scaffold: Element): HTMLElement | undefined {\n const scenes = directChild(scaffold, '.kui-tab-scaffold__scenes');\n return scenes\n ? directChild(scenes, '.kui-tab-scaffold__scene[data-active=\"true\"]')\n : undefined;\n}\n\n/**\n * The elements that may scroll against a layout region's `edge` (the top or\n * bottom of a NavStack view or a TabNavigator scene): the region itself, then,\n * through a sole child that puts no chrome of its own on that edge, a Pane's\n * content slot or a nested NavStack's or TabNavigator's active region. Every\n * candidate is paired with the layout's chrome; one that does not overflow\n * reports nothing, so the chrome keys on whichever element actually scrolls.\n * A sole child with chrome on that edge (a Pane header, a nested NavStack's\n * top chrome, a TabNavigator's bar) stops the walk: that chrome draws its own\n * divider against its own content.\n */\nfunction regionScrollers(region: HTMLElement, edge: 't' | 'b'): HTMLElement[] {\n const found: HTMLElement[] = [];\n let current: HTMLElement | undefined = region;\n while (current) {\n found.push(current);\n if (current.children.length !== 1) break;\n const child: Element = current.children[0]!;\n if (child.matches('.kui-pane')) {\n current = directChild(child, PANE_CHROME[edge])\n ? undefined\n : directChild(child, '.kui-pane__content');\n if (current) found.push(current);\n break;\n }\n if (child.matches('.kui-nav-stack'))\n current = directChild(child, NAV_STACK_CHROME[edge])\n ? undefined\n : activeView(child);\n else if (child.matches('.kui-tab-scaffold') && edge === 't')\n current = activeScene(child);\n else current = undefined;\n }\n return found;\n}\n\n/** Canonical top/right/bottom/left string of the given edges. */\nconst sides = (edges: ReadonlySet<Edge>) =>\n EDGES.filter((edge) => edges.has(edge)).join('');\n\n/**\n * Which edges of `scroller` currently have content hidden beyond them. Nothing\n * overflows when the content fits, so the far edges report no divider then.\n * Horizontal edges are physical, so a right-to-left scroller (whose\n * `scrollLeft` runs from the negative maximum to 0) reports the same sides.\n */\nfunction measure(scroller: HTMLElement): string {\n const edges = new Set<Edge>();\n const maxY = scroller.scrollHeight - scroller.clientHeight;\n if (maxY > THRESHOLD) {\n if (scroller.scrollTop > THRESHOLD) edges.add('t');\n if (maxY - scroller.scrollTop > THRESHOLD) edges.add('b');\n }\n const maxX = scroller.scrollWidth - scroller.clientWidth;\n if (maxX > THRESHOLD) {\n const view = scroller.ownerDocument.defaultView;\n const rtl = view?.getComputedStyle(scroller).direction === 'rtl';\n const left = rtl ? maxX + scroller.scrollLeft : scroller.scrollLeft;\n if (left > THRESHOLD) edges.add('l');\n if (maxX - left > THRESHOLD) edges.add('r');\n }\n return sides(edges);\n}\n\ntype StateAttribute = typeof SCROLL_OVERFLOW | typeof SCROLL_DIVIDER;\ntype Root = HTMLElement | Document;\n\ninterface Registration {\n root: Root;\n targets: readonly ScrollDividerTarget[];\n}\n\n// A document has one attribute writer even when registrations overlap. The\n// WeakMap ties this coordination cache to the document's lifetime.\nconst CONTROLLERS = new WeakMap<\n Document,\n (registration: Registration) => () => void\n>();\n\n/** Set (or, for an empty value, remove) one of this wiring's attributes. */\nfunction write(element: Element, name: StateAttribute, value: string) {\n if (element.getAttribute(name) === (value || null)) return;\n if (name === SCROLL_OVERFLOW) {\n if (value) element.setAttribute(SCROLL_OVERFLOW, value);\n else element.removeAttribute(SCROLL_OVERFLOW);\n } else if (value) element.setAttribute(SCROLL_DIVIDER, value);\n else element.removeAttribute(SCROLL_DIVIDER);\n}\n\n/**\n * Wire scroll dividers below `root`: a divider between pinned chrome and the\n * content that scrolls beside it shows only while content is scrolled away\n * from that edge. Near edges (top, left) hide at the scroll start; far edges\n * (bottom, right) hide at the scroll end and whenever nothing overflows.\n *\n * The wiring only reports scroll state; each component draws its own divider\n * from it. It writes `data-scroll-overflow` (the edges with hidden content, in\n * canonical `t`/`r`/`b`/`l` order) on each scroller, and `data-scroll-divider`\n * (the sides to draw) on each paired chrome element:\n *\n * - every `Pane` with a header or footer: its header shows a bottom divider and\n * its footer a top divider (drawn by the Pane, per its `chromeDividers`);\n * - every `NavStack`'s top chrome and bottom toolbar around its active view,\n * and every `TabNavigator`'s bar under its active scene: the chrome shows a\n * bottom (top chrome) or top (bottom toolbar, bar) divider. The scroller is\n * whichever element actually scrolls there: the view or scene itself, or,\n * through a sole child with no chrome of its own on that edge, a `Pane`'s\n * content or a nested `NavStack` / `TabNavigator` region (a Pane's own header\n * or footer draws that boundary instead);\n * - every `TabBar` strip: the bar draws a divider on each side of the strip\n * whose tabs are scrolled out of view;\n * - each app-owned `targets` pairing: a `Toolbar` or `List` named as chrome\n * draws the divider on its facing side.\n *\n * It also measures every `Pane` header laid over its content\n * (`headerPresentation=\"overlay\"`, with fixed chrome placement): it publishes\n * the header's border-box block size on the Pane root as the inherited\n * `--kui-scroll-clearance-block-start` context, and marks the root\n * `data-header-overlay=\"measured\"`, which moves the header over the content\n * and has the content clear it. The measurement follows the header as it\n * wraps, zooms, or changes content, and both are restored before paint if a\n * re-render drops them.\n *\n * Structure is re-read after every DOM change below root that can change a\n * pairing — a structural element or target id added, removed, or re-classed;\n * mutations inside scrolled content (a row's class, a list's rows) do not\n * re-read it. Either way the scrollers are re-measured once the next frame\n * has laid out, before it paints, so a large render never forces a layout\n * (where `ResizeObserver` is missing, structure is measured at once and\n * content in the next animation frame) — and a re-render that drops the\n * attributes gets them back before paint.\n * Scroll is tracked with one capturing listener per registered root, and size\n * changes of each scroller and its children with a `ResizeObserver`. Overlapping registrations\n * share one attribute writer; each disposer removes its registration, and the\n * final disposer removes the wiring-owned attributes. See\n * `docs/23-app-layouts.md` §3.7.\n */\nexport function wireScrollDividers(\n root: Root,\n { targets = [] }: WireScrollDividersOptions = {},\n): () => void {\n const ownerDocument = (\n root.nodeType === 9 ? (root as Document) : root.ownerDocument\n )!;\n let register = CONTROLLERS.get(ownerDocument);\n if (!register) {\n register = createController(ownerDocument);\n CONTROLLERS.set(ownerDocument, register);\n }\n return register({ root, targets });\n}\n\n/**\n * Every class `collect()` and `regionScrollers()` select by. An element that\n * carries none of them (and no target id) can never become or stop being part\n * of a pairing.\n */\nconst STRUCTURAL_CLASSES = [\n 'kui-pane',\n 'kui-pane__content',\n 'kui-pane__header',\n 'kui-pane__toolbar',\n 'kui-pane__footer',\n 'kui-nav-stack',\n 'kui-nav-stack__viewport',\n 'kui-nav-stack__view',\n 'kui-nav-stack__chrome',\n 'kui-nav-stack__bottom',\n 'kui-tab-scaffold',\n 'kui-tab-scaffold__scenes',\n 'kui-tab-scaffold__scene',\n 'kui-tab-scaffold__bar',\n] as const;\n\nconst STRUCTURAL_SELECTOR = [\n ...STRUCTURAL_CLASSES.map((name) => `.${name}`),\n '[data-kui-tab-list]',\n].join(', ');\n\n/** Whether a class attribute value names a structural class. */\nconst hasStructuralClass = (value: string | null) =>\n !!value &&\n value\n .split(/\\s+/)\n .some((token) => (STRUCTURAL_CLASSES as readonly string[]).includes(token));\n\nfunction createController(\n ownerDocument: Document,\n): (registration: Registration) => () => void {\n const view = ownerDocument.defaultView;\n let disposed = false;\n const registrations = new Set<Registration>();\n const listenedRoots = new Set<Root>();\n let pairings: Pairing[] = [];\n const overflow = new Map<HTMLElement, string>();\n /** Every element this wiring has written, with what it wrote. */\n const written = new Map<Element, Map<StateAttribute, string>>();\n /** Each overlay Pane header, with its Pane. */\n let overlays = new Map<HTMLElement, HTMLElement>();\n /** Each overlay header's last measured border-box block size, in px. */\n const headerSizes = new Map<HTMLElement, number>();\n /** Each overlay header's Pane content scrollbar inline size, in px. */\n const scrollbarSizes = new Map<HTMLElement, number>();\n /** Each Pane this wiring has published a header clearance on. */\n const published = new Set<HTMLElement>();\n\n const byId = (root: Root, id: string | undefined) => {\n if (!id) return undefined;\n const [match] = within<HTMLElement>(root, `[id=${quoted(id)}]`);\n return match;\n };\n\n const collect = (): Pairing[] => {\n const found: Pairing[] = [];\n for (const { root, targets } of registrations) {\n for (const pane of within<HTMLElement>(root, '.kui-pane')) {\n const scroller = directChild(pane, '.kui-pane__content');\n const header = directChild(pane, PANE_CHROME.t);\n const footer = directChild(pane, PANE_CHROME.b);\n if (scroller && (header || footer))\n found.push({ scroller, chrome: { t: header, b: footer } });\n }\n const pairRegion = (\n region: HTMLElement | undefined,\n edge: 't' | 'b',\n chrome: HTMLElement | undefined,\n ) => {\n if (!region || !chrome) return;\n for (const scroller of regionScrollers(region, edge))\n found.push({ scroller, chrome: { [edge]: chrome } });\n };\n for (const stack of within<HTMLElement>(root, '.kui-nav-stack')) {\n const view = activeView(stack);\n for (const edge of ['t', 'b'] as const)\n pairRegion(view, edge, directChild(stack, NAV_STACK_CHROME[edge]));\n }\n for (const scaffold of within<HTMLElement>(root, '.kui-tab-scaffold'))\n pairRegion(\n activeScene(scaffold),\n 'b',\n directChild(scaffold, '.kui-tab-scaffold__bar'),\n );\n for (const strip of within<HTMLElement>(root, '[data-kui-tab-list]'))\n found.push({ scroller: strip, chrome: {} });\n for (const target of targets) {\n const scroller = byId(root, target.scroller);\n if (!scroller) continue;\n const chrome: Pairing['chrome'] = {};\n for (const edge of EDGES)\n chrome[edge] = byId(root, target[TARGET_EDGES[edge]]);\n found.push({ scroller, chrome });\n }\n }\n return found;\n };\n\n const collectOverlays = () => {\n const found = new Map<HTMLElement, HTMLElement>();\n for (const { root } of registrations)\n for (const pane of within<HTMLElement>(root, OVERLAY_PANE)) {\n const header = directChild(pane, PANE_CHROME.t);\n if (header) found.set(header, pane);\n }\n return found;\n };\n\n /**\n * Re-read the classic vertical scrollbar of each overlay Pane's content (its\n * `offsetWidth` beyond `clientWidth` and the borders; 0 for an overlay\n * scrollbar). Returns whether any changed.\n */\n const measureScrollbars = () => {\n let changed = false;\n for (const [header, pane] of overlays) {\n const scroller = directChild(pane, '.kui-pane__content');\n let size = 0;\n if (scroller) {\n const style =\n scroller.ownerDocument.defaultView!.getComputedStyle(scroller);\n size = Math.max(\n 0,\n scroller.offsetWidth -\n scroller.clientWidth -\n (Number.parseFloat(style.borderLeftWidth) || 0) -\n (Number.parseFloat(style.borderRightWidth) || 0),\n );\n }\n if (scrollbarSizes.get(header) === size) continue;\n scrollbarSizes.set(header, size);\n changed = true;\n }\n return changed;\n };\n\n /**\n * Watches only the Panes this wiring published on, so a re-render that\n * strips the published clearance or gate gets them back before paint.\n */\n const overlayObserver = view?.MutationObserver\n ? new view.MutationObserver(() => {\n if (!disposed) publish();\n })\n : undefined;\n\n /**\n * Publish each measured overlay header's clearance on its Pane, with the\n * inline size of a classic scrollbar the header must leave uncovered.\n */\n const publish = () => {\n const current = new Map<HTMLElement, [string, string]>();\n for (const [header, pane] of overlays) {\n const size = headerSizes.get(header);\n const scrollbar = scrollbarSizes.get(header);\n if (size !== undefined)\n current.set(pane, [`${size}px`, scrollbar ? `${scrollbar}px` : '']);\n }\n // Disconnect first, so this wiring's own writes are not reported back.\n overlayObserver?.disconnect();\n for (const pane of published)\n if (!current.has(pane)) {\n pane.style.removeProperty(CLEARANCE_BLOCK_START);\n pane.style.removeProperty(SCROLLBAR_INLINE_SIZE);\n if (!pane.getAttribute('style')) pane.removeAttribute('style');\n pane.removeAttribute(HEADER_OVERLAY);\n }\n published.clear();\n for (const [pane, [value, scrollbar]] of current) {\n if (pane.style.getPropertyValue(CLEARANCE_BLOCK_START) !== value)\n pane.style.setProperty(CLEARANCE_BLOCK_START, value);\n if (pane.style.getPropertyValue(SCROLLBAR_INLINE_SIZE) !== scrollbar) {\n if (scrollbar) pane.style.setProperty(SCROLLBAR_INLINE_SIZE, scrollbar);\n else pane.style.removeProperty(SCROLLBAR_INLINE_SIZE);\n }\n if (pane.getAttribute(HEADER_OVERLAY) !== 'measured')\n pane.setAttribute(HEADER_OVERLAY, 'measured');\n published.add(pane);\n overlayObserver?.observe(pane, {\n attributes: true,\n attributeFilter: ['style', HEADER_OVERLAY],\n });\n }\n };\n\n /** Write every paired element's attributes from the measured overflow. */\n const apply = () => {\n const current = new Map<Element, Map<StateAttribute, string>>();\n const dividers = new Map<HTMLElement, Set<Edge>>();\n for (const { scroller, chrome } of pairings) {\n const edges = overflow.get(scroller)!;\n (\n current.get(scroller) ?? current.set(scroller, new Map()).get(scroller)!\n ).set(SCROLL_OVERFLOW, edges);\n for (const edge of EDGES) {\n const element = chrome[edge];\n if (!element) continue;\n const shown = dividers.get(element) ?? new Set<Edge>();\n dividers.set(element, shown);\n if (edges.includes(edge)) shown.add(FACING[edge]);\n }\n }\n for (const [element, shown] of dividers)\n (\n current.get(element) ?? current.set(element, new Map()).get(element)!\n ).set(SCROLL_DIVIDER, sides(shown));\n // Anything written before that is no longer paired gets its attributes back.\n for (const [element, values] of written)\n for (const name of values.keys())\n if (!current.get(element)?.has(name)) write(element, name, '');\n written.clear();\n for (const [element, values] of current) {\n written.set(element, values);\n for (const [name, value] of values) write(element, name, value);\n }\n };\n\n /** Each observed element, keyed to whether it is observed by border box. */\n const observed = new Map<Element, boolean>();\n /**\n * A post-layout hook for the content re-measure: an inert zero-height box\n * outside the app tree whose width a content mutation toggles. The\n * ResizeObserver reports it after the frame's layout, so the re-measure\n * reads scroll extents from a clean layout instead of forcing one on the\n * freshly rendered tree.\n */\n let probe: HTMLElement | undefined;\n /** Whether a toggled probe has yet to be reported. */\n let probePending = false;\n const resizeObserver = view?.ResizeObserver\n ? new view.ResizeObserver((entries) => {\n if (disposed) return;\n const scrollers = new Set(pairings.map(({ scroller }) => scroller));\n let headerResized = false;\n // A scroller resized (a classic scrollbar appeared or went away) or\n // the post-layout probe reported: the scrollbars may have changed.\n let scrollersResized = false;\n for (const entry of entries) {\n const { target } = entry;\n if (overlays.has(target as HTMLElement)) {\n headerSizes.set(\n target as HTMLElement,\n entry.borderBoxSize?.[0]?.blockSize ??\n target.getBoundingClientRect().height,\n );\n headerResized = true;\n continue;\n }\n scrollersResized = true;\n if (target === probe) {\n probePending = false;\n for (const scroller of overflow.keys())\n overflow.set(scroller, measure(scroller));\n continue;\n }\n const scroller = scrollers.has(target as HTMLElement)\n ? (target as HTMLElement)\n : target.parentElement;\n if (scroller && scrollers.has(scroller))\n overflow.set(scroller, measure(scroller));\n }\n if (scrollersResized && measureScrollbars()) headerResized = true;\n apply();\n if (headerResized) publish();\n })\n : undefined;\n\n const observeSizes = () => {\n if (!resizeObserver) return;\n const wanted = new Map<Element, boolean>();\n for (const { scroller } of pairings) {\n wanted.set(scroller, false);\n for (const child of scroller.children) wanted.set(child, false);\n }\n // An overlay header's clearance is its border box, so a border alone (the\n // forced-colors edge) must report a resize too.\n for (const header of overlays.keys()) wanted.set(header, true);\n for (const element of observed.keys())\n if (!wanted.has(element)) {\n resizeObserver.unobserve(element);\n observed.delete(element);\n }\n for (const [element, borderBox] of wanted)\n if (observed.get(element) !== borderBox) {\n resizeObserver.observe(\n element,\n borderBox ? { box: 'border-box' } : undefined,\n );\n observed.set(element, borderBox);\n }\n };\n\n /**\n * Re-read every pairing. A registration measures at once; a mutation\n * (`afterLayout`) keeps each still-paired scroller's last measurement and\n * re-measures through the probe once the frame has laid out, before it\n * paints, so a structural re-render does not force a layout either.\n */\n const refresh = (afterLayout = false) => {\n const deferred = afterLayout && resizeObserver !== undefined;\n const previous = deferred ? new Map(overflow) : undefined;\n pairings = collect();\n overflow.clear();\n for (const { scroller } of pairings)\n overflow.set(\n scroller,\n previous ? (previous.get(scroller) ?? '') : measure(scroller),\n );\n overlays = collectOverlays();\n for (const sizes of [headerSizes, scrollbarSizes])\n for (const header of sizes.keys())\n if (!overlays.has(header)) sizes.delete(header);\n // A new overlay header is measured at once unless the ResizeObserver\n // will report it after this frame's layout.\n if (!deferred)\n for (const header of overlays.keys())\n if (!headerSizes.has(header))\n headerSizes.set(header, header.getBoundingClientRect().height);\n if (!deferred) measureScrollbars();\n observeSizes();\n apply();\n publish();\n if (deferred) scheduleRemeasure();\n };\n\n /** Re-measure every scroller (pairings unchanged); write what changed. */\n const remeasure = () => {\n let changed = false;\n for (const scroller of overflow.keys()) {\n const edges = measure(scroller);\n if (edges === overflow.get(scroller)) continue;\n overflow.set(scroller, edges);\n changed = true;\n }\n if (changed) apply();\n if (measureScrollbars()) publish();\n };\n\n let remeasureFrame: number | undefined;\n const scheduleRemeasure = () => {\n if (resizeObserver) {\n // Toggle once per report: a second toggle before the frame would undo\n // the size change and the report with it.\n if (probePending) return;\n probePending = true;\n if (!probe) {\n probe = ownerDocument.createElement('div');\n probe.setAttribute('aria-hidden', 'true');\n probe.style.cssText =\n 'position:fixed;top:0;left:0;width:0;height:0;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict';\n resizeObserver.observe(probe);\n }\n // Outside body, so an app that renders into body never removes it; an\n // app that removed it anyway gets it back.\n if (!probe.isConnected) ownerDocument.documentElement.append(probe);\n probe.style.width = probe.style.width === '1px' ? '0px' : '1px';\n return;\n }\n if (remeasureFrame !== undefined || !view?.requestAnimationFrame) return;\n // The final disposer cancels a pending frame.\n remeasureFrame = view.requestAnimationFrame(() => {\n remeasureFrame = undefined;\n remeasure();\n });\n };\n\n const onScroll = (event: Event) => {\n const scroller = event.target as HTMLElement;\n if (!overflow.has(scroller)) return;\n const edges = measure(scroller);\n if (edges === overflow.get(scroller)) return;\n overflow.set(scroller, edges);\n apply();\n };\n\n const mutationObserver = view?.MutationObserver\n ? new view.MutationObserver((records) => {\n if (disposed) return;\n // Structure changes re-read every pairing. A re-render that only\n // dropped or changed attributes this wiring owns gets them back\n // without re-measuring.\n // Everything else (a row's selection class, a list morph's rows)\n // cannot change a pairing. It is re-measured after the next frame's\n // layout instead (through the probe, else in the next animation\n // frame), which catches what the scrollers' own observations cannot:\n // an extent change that resizes no direct child (an absolutely\n // positioned popup, a `display: contents` child), without forcing a\n // layout of the freshly rendered tree.\n const ids = targetIds();\n const selector = [\n STRUCTURAL_SELECTOR,\n ...[...ids].map((id) => `[id=${quoted(id)}]`),\n ].join(', ');\n if (records.some((record) => changesPairings(record, ids, selector)))\n refresh(true);\n else {\n if (\n records.some(\n ({ attributeName }) =>\n attributeName === SCROLL_OVERFLOW ||\n attributeName === SCROLL_DIVIDER,\n )\n )\n apply();\n if (\n records.some(\n ({ attributeName }) =>\n attributeName !== SCROLL_OVERFLOW &&\n attributeName !== SCROLL_DIVIDER,\n )\n )\n scheduleRemeasure();\n }\n })\n : undefined;\n\n /** Every target id any registration resolves. */\n const targetIds = () => {\n const ids = new Set<string>();\n for (const { targets } of registrations)\n for (const target of targets) {\n ids.add(target.scroller);\n for (const edge of EDGES) {\n const id = target[TARGET_EDGES[edge]];\n if (id) ids.add(id);\n }\n }\n return ids;\n };\n\n /** Whether `node` is or contains an element matching `selector`. */\n const holds = (node: Node, selector: string) =>\n node.nodeType === 1 &&\n ((node as Element).matches(selector) ||\n !!(node as Element).querySelector(selector));\n\n /**\n * Whether a mutation record can change what `collect()` finds: a structural\n * element or target-id element (or, through its old class or id, a former\n * one) changed, or one was added or removed. Every scroller is itself\n * structural or a target id, so a child-list change of a scroller (whose\n * child count `regionScrollers` reads, and whose children the\n * ResizeObserver watches) always counts.\n */\n const changesPairings = (\n {\n type,\n target,\n attributeName,\n oldValue,\n addedNodes,\n removedNodes,\n }: MutationRecord,\n ids: ReadonlySet<string>,\n selector: string,\n ) => {\n if (\n type === 'attributes' &&\n (attributeName === SCROLL_OVERFLOW || attributeName === SCROLL_DIVIDER)\n )\n return false;\n if (target.nodeType === 1 && (target as Element).matches(selector))\n return true;\n if (type === 'attributes')\n return attributeName === 'class'\n ? hasStructuralClass(oldValue)\n : attributeName === 'id' && oldValue !== null && ids.has(oldValue);\n for (const node of [...addedNodes, ...removedNodes])\n if (holds(node, selector)) return true;\n return false;\n };\n\n const syncRoots = () => {\n const roots = new Set([...registrations].map(({ root }) => root));\n for (const root of listenedRoots)\n if (!roots.has(root)) {\n root.removeEventListener('scroll', onScroll, { capture: true });\n listenedRoots.delete(root);\n }\n for (const root of roots)\n if (!listenedRoots.has(root)) {\n root.addEventListener('scroll', onScroll, {\n capture: true,\n passive: true,\n });\n listenedRoots.add(root);\n }\n mutationObserver?.disconnect();\n for (const root of roots)\n mutationObserver?.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n // Old values tell a class or id that stopped being structural.\n attributeOldValue: true,\n // The shown NavStack view and TabNavigator scene change by attribute,\n // and a Pane's header presentation by its attributes.\n attributeFilter: [\n 'data-header-presentation',\n 'data-chrome-placement',\n SCROLL_OVERFLOW,\n SCROLL_DIVIDER,\n 'id',\n 'class',\n 'data-nav-active',\n 'data-nav-exiting',\n 'data-active',\n ],\n });\n };\n\n return (registration) => {\n registrations.add(registration);\n syncRoots();\n refresh();\n return () => {\n if (!registrations.delete(registration)) return;\n syncRoots();\n if (registrations.size) refresh();\n else {\n disposed = true;\n if (remeasureFrame !== undefined)\n view?.cancelAnimationFrame(remeasureFrame);\n remeasureFrame = undefined;\n resizeObserver?.disconnect();\n probe?.remove();\n probe = undefined;\n probePending = false;\n for (const [element, values] of written)\n for (const name of values.keys()) write(element, name, '');\n written.clear();\n overlays.clear();\n headerSizes.clear();\n scrollbarSizes.clear();\n publish();\n overlayObserver?.disconnect();\n overflow.clear();\n observed.clear();\n pairings = [];\n CONTROLLERS.delete(ownerDocument);\n }\n };\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Skeleton } from './chunk-
|
|
2
|
-
import { em } from './chunk-
|
|
1
|
+
import { Skeleton } from './chunk-CVD5IZGB.js';
|
|
2
|
+
import { em } from './chunk-IQSRHXZR.js';
|
|
3
3
|
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
4
4
|
|
|
5
5
|
function ValueTableRow({
|
|
@@ -56,4 +56,4 @@ function ValueTable({
|
|
|
56
56
|
|
|
57
57
|
export { ValueTable, ValueTableRow };
|
|
58
58
|
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
59
|
+
//# sourceMappingURL=chunk-DZJ4GBSP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/value-table/internal/value-table-row.tsx","../src/components/data-display/value-table/value-table.tsx"],"names":["jsx"],"mappings":";;;;AAgBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAChD,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MACnC,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,uBAAA,EAAyB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BACnD,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EAC9C,CAAA;AAAA,wBACA,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,GAAK,KAAA,EAAM;AAAA;AAAA;AAAA,GACzD;AAEJ;ACFO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,UAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,aAAA;AAAA,MACf,cAAA,EAAc,OAAA;AAAA,MACd,mBAAA,EAAmB,YAAA;AAAA,MACnB,kBAAA,EAAkB,UAAA;AAAA,MAClB,kBAAA,EAAkB,UAAA,KAAe,MAAA,GAAY,MAAA,GAAY,EAAA;AAAA,MACzD,KAAA,EACE,UAAA,KAAe,MAAA,GACX,MAAA,GACA,gCAAgC,UAAU,CAAA,CAAA;AAAA,MAEhD,YAAA,EAAY,KAAA;AAAA,MACZ,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/value-table/internal/value-table-row.tsx","../src/components/data-display/value-table/value-table.tsx"],"names":["jsx"],"mappings":";;;;AAgBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAChD,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MACnC,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,uBAAA,EAAyB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BACnD,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EAC9C,CAAA;AAAA,wBACA,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,GAAK,KAAA,EAAM;AAAA;AAAA;AAAA,GACzD;AAEJ;ACFO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,UAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,aAAA;AAAA,MACf,cAAA,EAAc,OAAA;AAAA,MACd,mBAAA,EAAmB,YAAA;AAAA,MACnB,kBAAA,EAAkB,UAAA;AAAA,MAClB,kBAAA,EAAkB,UAAA,KAAe,MAAA,GAAY,MAAA,GAAY,EAAA;AAAA,MACzD,KAAA,EACE,UAAA,KAAe,MAAA,GACX,MAAA,GACA,gCAAgC,UAAU,CAAA,CAAA;AAAA,MAEhD,YAAA,EAAY,KAAA;AAAA,MACZ,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-DZJ4GBSP.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { em } from '../../../../shared/styles/css-values.js';\nimport { Skeleton } from '../../../feedback/skeleton/skeleton.js';\n\nexport interface ValueTableRowProps {\n label: string | SafeHtml;\n value: string | SafeHtml;\n icon?: SafeHtml;\n className?: string;\n /** Render the value as an unanimated loading skeleton, keeping the field label. */\n placeholder?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function ValueTableRow({\n label,\n value,\n icon,\n className = '',\n placeholder = false,\n slot,\n}: ValueTableRowProps) {\n return (\n <div\n class={`kui-value-table__row ${className}`.trim()}\n data-has-icon={String(Boolean(icon))}\n data-placeholder={placeholder ? 'true' : undefined}\n slot={slot}\n >\n <dt>\n {icon && <span class=\"kui-value-table__icon\">{icon}</span>}\n <span class=\"kui-value-table__label\">{label}</span>\n </dt>\n <dd>{placeholder ? <Skeleton width={em(10)} /> : value}</dd>\n </div>\n );\n}\n","import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\n\nexport {\n ValueTableRow,\n type ValueTableRowProps,\n} from './internal/value-table-row.js';\n\n/** `columns` keeps label and value side by side; `stacked` puts each value under its label. */\nexport type ValueTablePresentation = 'columns' | 'stacked';\n/** Table width below which columns stack: `compact` is 512px, `narrow` 576px. */\nexport type ValueTableStackBelow = 'compact' | 'narrow';\n\nexport interface ValueTableProps {\n label: string;\n /** Compact row spacing for metadata-dense surfaces. */\n density?: 'default' | 'compact';\n /**\n * Minimum width of the label column (for example `px(160)`); the value then\n * takes the rest of the row. Omitted, label and value share the row by\n * content.\n */\n labelWidth?: CssLength;\n /** Side-by-side columns (default) or values stacked under their labels. */\n presentation?: ValueTablePresentation;\n /**\n * Stack the rows only while the table itself is narrower than the preset,\n * so one table reads as columns in a wide dialog and stacks on a phone.\n */\n stackBelow?: ValueTableStackBelow;\n className?: string;\n children: KerfUiContent;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function ValueTable({\n label,\n density = 'default',\n labelWidth,\n presentation = 'columns',\n stackBelow,\n className = '',\n children,\n slot,\n}: ValueTableProps) {\n return (\n <dl\n class={`kui-value-table ${className}`.trim()}\n data-component=\"value-table\"\n data-density={density}\n data-presentation={presentation}\n data-stack-below={stackBelow}\n data-label-width={labelWidth === undefined ? undefined : ''}\n style={\n labelWidth === undefined\n ? undefined\n : `--_kui-value-table-label-min:${labelWidth}`\n }\n aria-label={label}\n slot={slot}\n >\n {children}\n </dl>\n );\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// src/components/forms/composer/wiring/wire-composers.ts
|
|
2
|
+
var COMPOSER = '[data-component="composer"]';
|
|
3
|
+
var ACTION = "wa-button, button, [data-action]";
|
|
4
|
+
var IME_KEY_CODE = 229;
|
|
5
|
+
function composerFieldOf(target) {
|
|
6
|
+
if (!(target instanceof HTMLTextAreaElement) || !target.classList.contains("kui-composer__field"))
|
|
7
|
+
return null;
|
|
8
|
+
const composer = target.closest(COMPOSER);
|
|
9
|
+
return composer?.dataset.submitOnEnter === "true" ? target : null;
|
|
10
|
+
}
|
|
11
|
+
function isUnavailable(action) {
|
|
12
|
+
return action.hasAttribute("disabled") || action.hasAttribute("loading") || action.getAttribute("aria-disabled") === "true" || action.disabled === true;
|
|
13
|
+
}
|
|
14
|
+
function wireComposers(root) {
|
|
15
|
+
const composing = /* @__PURE__ */ new WeakSet();
|
|
16
|
+
const onCompositionStart = (event) => {
|
|
17
|
+
const field = composerFieldOf(event.target);
|
|
18
|
+
if (field) composing.add(field);
|
|
19
|
+
};
|
|
20
|
+
const onCompositionEnd = (event) => {
|
|
21
|
+
const field = composerFieldOf(event.target);
|
|
22
|
+
if (field) composing.delete(field);
|
|
23
|
+
};
|
|
24
|
+
const onKeyDown = (event) => {
|
|
25
|
+
const key = event;
|
|
26
|
+
if (key.key !== "Enter" || key.shiftKey || key.altKey) return;
|
|
27
|
+
const field = composerFieldOf(key.target);
|
|
28
|
+
if (!field || field.disabled) return;
|
|
29
|
+
if (key.isComposing || key.keyCode === IME_KEY_CODE || composing.has(field))
|
|
30
|
+
return;
|
|
31
|
+
key.preventDefault();
|
|
32
|
+
if (key.repeat || field.value.trim() === "") return;
|
|
33
|
+
const action = field.closest(COMPOSER).querySelector(".kui-composer__trailing")?.querySelector(ACTION);
|
|
34
|
+
if (!action || isUnavailable(action)) return;
|
|
35
|
+
action.click();
|
|
36
|
+
};
|
|
37
|
+
root.addEventListener("compositionstart", onCompositionStart);
|
|
38
|
+
root.addEventListener("compositionend", onCompositionEnd);
|
|
39
|
+
root.addEventListener("keydown", onKeyDown);
|
|
40
|
+
return () => {
|
|
41
|
+
root.removeEventListener("compositionstart", onCompositionStart);
|
|
42
|
+
root.removeEventListener("compositionend", onCompositionEnd);
|
|
43
|
+
root.removeEventListener("keydown", onKeyDown);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { wireComposers };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=chunk-ELCMSQNJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/composer/wiring/wire-composers.ts"],"names":[],"mappings":";AAEA,IAAM,QAAA,GAAW,6BAAA;AACjB,IAAM,MAAA,GAAS,kCAAA;AAGf,IAAM,YAAA,GAAe,GAAA;AAErB,SAAS,gBACP,MAAA,EAC4B;AAC5B,EAAA,IACE,EAAE,MAAA,YAAkB,mBAAA,CAAA,IACpB,CAAC,MAAA,CAAO,SAAA,CAAU,SAAS,qBAAqB,CAAA;AAEhD,IAAA,OAAO,IAAA;AACT,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAqB,QAAQ,CAAA;AACrD,EAAA,OAAO,QAAA,EAAU,OAAA,CAAQ,aAAA,KAAkB,MAAA,GAAS,MAAA,GAAS,IAAA;AAC/D;AAEA,SAAS,cAAc,MAAA,EAA0B;AAC/C,EAAA,OACE,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,IAC9B,OAAO,YAAA,CAAa,SAAS,CAAA,IAC7B,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA,IACxC,OAA4C,QAAA,KAAa,IAAA;AAE9D;AAcO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,MAAM,SAAA,uBAAgB,OAAA,EAA6B;AACnD,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAiB;AAC3C,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAC1C,IAAA,IAAI,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAAA,EAChC,CAAA;AACA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAiB;AACzC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAC1C,IAAA,IAAI,KAAA,EAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAiB;AAClC,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,CAAI,QAAA,IAAY,IAAI,MAAA,EAAQ;AACvD,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,QAAA,EAAU;AAC9B,IAAA,IAAI,IAAI,WAAA,IAAe,GAAA,CAAI,YAAY,YAAA,IAAgB,SAAA,CAAU,IAAI,KAAK,CAAA;AACxE,MAAA;AACF,IAAA,GAAA,CAAI,cAAA,EAAe;AACnB,IAAA,IAAI,IAAI,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAE7C,IAAA,MAAM,MAAA,GAAS,MACZ,OAAA,CAAQ,QAAQ,EAChB,aAAA,CAAc,yBAAyB,CAAA,EACtC,aAAA,CAA2B,MAAM,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,IAAU,aAAA,CAAc,MAAM,CAAA,EAAG;AACtC,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAA;AACA,EAAA,IAAA,CAAK,gBAAA,CAAiB,oBAAoB,kBAAkB,CAAA;AAC5D,EAAA,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,gBAAgB,CAAA;AACxD,EAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC1C,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,mBAAA,CAAoB,oBAAoB,kBAAkB,CAAA;AAC/D,IAAA,IAAA,CAAK,mBAAA,CAAoB,kBAAkB,gBAAgB,CAAA;AAC3D,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,EAC/C,CAAA;AACF","file":"chunk-ELCMSQNJ.js","sourcesContent":["type Root = HTMLElement | Document;\n\nconst COMPOSER = '[data-component=\"composer\"]';\nconst ACTION = 'wa-button, button, [data-action]';\n\n/** IME keydowns report keyCode 229 (WebKit sends it after compositionend). */\nconst IME_KEY_CODE = 229;\n\nfunction composerFieldOf(\n target: EventTarget | null,\n): HTMLTextAreaElement | null {\n if (\n !(target instanceof HTMLTextAreaElement) ||\n !target.classList.contains('kui-composer__field')\n )\n return null;\n const composer = target.closest<HTMLElement>(COMPOSER);\n return composer?.dataset.submitOnEnter === 'true' ? target : null;\n}\n\nfunction isUnavailable(action: Element): boolean {\n return (\n action.hasAttribute('disabled') ||\n action.hasAttribute('loading') ||\n action.getAttribute('aria-disabled') === 'true' ||\n (action as Element & { disabled?: unknown }).disabled === true\n );\n}\n\n/**\n * Enter-to-send for every `Composer` rendered with `submitOnEnter` below\n * root. In its field, Enter (alone or with Cmd or Ctrl) activates the\n * composer's first trailing action, so a keyboard send runs the same\n * delegated handler as a click. Shift+Enter and Alt+Enter insert a newline.\n * Nothing is sent, and no newline is inserted, when the message is empty or\n * whitespace-only, the key is auto-repeating, or the first action is\n * disabled, loading, or `aria-disabled`. An Enter that commits an IME\n * composition (`isComposing`, keyCode 229, or between `compositionstart` and\n * `compositionend`) is left to the input method. Dispose with the owning\n * application.\n */\nexport function wireComposers(root: Root): () => void {\n const composing = new WeakSet<HTMLTextAreaElement>();\n const onCompositionStart = (event: Event) => {\n const field = composerFieldOf(event.target);\n if (field) composing.add(field);\n };\n const onCompositionEnd = (event: Event) => {\n const field = composerFieldOf(event.target);\n if (field) composing.delete(field);\n };\n const onKeyDown = (event: Event) => {\n const key = event as KeyboardEvent;\n if (key.key !== 'Enter' || key.shiftKey || key.altKey) return;\n const field = composerFieldOf(key.target);\n if (!field || field.disabled) return;\n if (key.isComposing || key.keyCode === IME_KEY_CODE || composing.has(field))\n return;\n key.preventDefault();\n if (key.repeat || field.value.trim() === '') return;\n // composerFieldOf found the field inside a composer.\n const action = field\n .closest(COMPOSER)!\n .querySelector('.kui-composer__trailing')\n ?.querySelector<HTMLElement>(ACTION);\n if (!action || isUnavailable(action)) return;\n action.click();\n };\n root.addEventListener('compositionstart', onCompositionStart);\n root.addEventListener('compositionend', onCompositionEnd);\n root.addEventListener('keydown', onKeyDown);\n return () => {\n root.removeEventListener('compositionstart', onCompositionStart);\n root.removeEventListener('compositionend', onCompositionEnd);\n root.removeEventListener('keydown', onKeyDown);\n };\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { paneConfigProps } from './chunk-UMKV7YVQ.js';
|
|
2
|
+
import { ToolbarControlGroup, isRelocatableGroup } from './chunk-QIG4IGUP.js';
|
|
2
3
|
import { Toolbar } from './chunk-CMLPFIC5.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { LucideIcon } from './chunk-
|
|
4
|
+
import { List } from './chunk-HZPHCSCS.js';
|
|
5
|
+
import { Pane } from './chunk-INI4WDWC.js';
|
|
6
|
+
import { LucideIcon } from './chunk-LOSRXZAH.js';
|
|
6
7
|
import { PanelLeftOpen, PanelLeftClose, PanelRightOpen, PanelRightClose, PanelBottomOpen, PanelBottomClose } from 'lucide';
|
|
7
8
|
import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
|
|
8
9
|
|
|
@@ -128,15 +129,7 @@ function composedPanelBody({
|
|
|
128
129
|
header: scrollHeader ? void 0 : panelHeader,
|
|
129
130
|
footer: scrollFooter ? void 0 : panelFooter,
|
|
130
131
|
chromePlacement: headerPlacement === "auto" || footerPlacement === "auto" ? "auto" : "fixed",
|
|
131
|
-
|
|
132
|
-
contentLabel: pane?.contentLabel,
|
|
133
|
-
separators: pane?.separators,
|
|
134
|
-
safeAreaEdges: pane?.safeAreaEdges,
|
|
135
|
-
chromeDividers: pane?.chromeDividers,
|
|
136
|
-
appearance: pane?.appearance,
|
|
137
|
-
deepInset: pane?.deepInset,
|
|
138
|
-
tabIndex: pane?.tabIndex,
|
|
139
|
-
outlined: pane?.outlined,
|
|
132
|
+
...paneConfigProps(pane),
|
|
140
133
|
children: [
|
|
141
134
|
scrollHeader ? panelHeader : null,
|
|
142
135
|
content,
|
|
@@ -166,4 +159,4 @@ function relocatedPanelGroups(toolbar, side, collapsed, attributes, size = "defa
|
|
|
166
159
|
|
|
167
160
|
export { collapsiblePanelToggleIcon, composedPanelBody, groupSizeFor, panelToggleGroup, relocatedPanelGroups };
|
|
168
161
|
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-EOO6PYGF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/panels/panel-toolbar.tsx"],"names":[],"mappings":"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","file":"chunk-EOO6PYGF.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport {\n PanelBottomClose,\n PanelBottomOpen,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n} from 'lucide';\n\nimport {\n Toolbar,\n type ToolbarConfig,\n} from '../../components/actions/toolbar/toolbar.js';\nimport {\n ToolbarControlGroup,\n type ToolbarControlGroupSize,\n} from '../../components/actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n List,\n type ListConfig,\n} from '../../components/collections/list/list.js';\nimport { paneConfigProps } from '../../components/layout/pane/internal/pane-config-props.js';\nimport { Pane, type PaneConfig } from '../../components/layout/pane/pane.js';\nimport { LucideIcon } from '../../components/media/lucide-icon/lucide-icon.js';\nimport type { KerfUiContent } from '../content/semantic-content.js';\nimport { isRelocatableGroup } from './panel-toolbar-group.js';\n\n/** Which edge a collapsible panel docks to. */\nexport type PanelSide = 'left' | 'right' | 'bottom';\n\n/**\n * The standard collapse/expand icon for a panel `side` and `collapsed` state,\n * so every app's sidebars and drawers use one recognizable convention:\n * `PanelLeft*` for a left rail, `PanelRight*` for a right rail, `PanelBottom*`\n * for a bottom drawer — the `Close` glyph while open, the `Open` glyph while\n * collapsed. Exposed so an app can render its own toggle affordance.\n */\nexport function collapsiblePanelToggleIcon(\n side: PanelSide,\n collapsed: boolean,\n): { icon: Parameters<typeof LucideIcon>[0]['icon']; name: string } {\n if (side === 'left')\n return collapsed\n ? { icon: PanelLeftOpen, name: 'panel-left-open' }\n : { icon: PanelLeftClose, name: 'panel-left-close' };\n if (side === 'right')\n return collapsed\n ? { icon: PanelRightOpen, name: 'panel-right-open' }\n : { icon: PanelRightClose, name: 'panel-right-close' };\n return collapsed\n ? { icon: PanelBottomOpen, name: 'panel-bottom-open' }\n : { icon: PanelBottomClose, name: 'panel-bottom-close' };\n}\n\n/**\n * The standard collapse toggle a panel toolbar renders. The app handles the\n * button's `data-action` and flips its own `collapsed` flag.\n */\nexport interface PanelToggle {\n /** The `data-action` the toggle button carries. */\n action: string;\n /**\n * The panel's short title-style name (\"Navigator\", \"Build Output\"). It is\n * the toggle group's accessible name and completes the default \"Show …\" /\n * \"Hide …\" label (\"Show Navigator\"), so it follows the title-style rule in\n * `docs/writing.md`; it is never recapitalized.\n */\n name: string;\n /** Accessible label while the panel is collapsed. Defaults to `Show {name}`. */\n showLabel?: string;\n /** Accessible label while the panel is open. Defaults to `Hide {name}`. */\n hideLabel?: string;\n}\n\n/**\n * A collapsible panel's top toolbar, composed so its groups follow the\n * panel's open state.\n *\n * - `title` precedes the `leading` zone. Groups may appear in any of the\n * `leading`, `center`, and `trailing` zones while the panel is open.\n * - Groups marked `relocateOnCollapse` move to the work area's toolbar while\n * the panel is collapsed, preserving their order across the three zones.\n * - `toggle` is always the last group: in the panel's toolbar while it is\n * open, and right after the relocated groups in the work area's toolbar\n * while it is collapsed.\n *\n * Relocated content renders in both places while the panel is collapsed (the\n * panel's copy is inert), so give it no `id`s. Pass groups directly or in\n * arrays so their render-time annotation remains available to the panel.\n *\n * The toolbar's configuration (`dividerSides`, `centerAlign`, `responsive`,\n * `responsiveAt`, `safeAreaEdges`) forwards to its `Toolbar`. It draws no\n * divider of its own: the panel's `Pane` draws the line under it while the\n * content is scrolled (its `chromeDividers`, wired by `wireScrollDividers`).\n */\nexport interface PanelToolbar extends ToolbarConfig {\n /** Accessible name of the panel's toolbar. */\n label: string;\n title?: KerfUiContent;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n toggle?: PanelToggle;\n}\n\n/** A panel's fixed bottom toolbar, below its optional footer content. */\nexport interface PanelBottomToolbar extends ToolbarConfig {\n label: string;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n}\n\n/** Whether panel chrome stays fixed, scrolls, or follows Pane's auto rule. */\nexport type PanelChromePlacement = 'fixed' | 'scroll' | 'auto';\n\nfunction panelChromeList(content: KerfUiContent, config?: ListConfig) {\n return (\n <List\n dividerSides={config?.dividerSides}\n gap={config?.gap}\n hAlign={config?.hAlign}\n vAlign={config?.vAlign}\n textInsets={config?.textInsets}\n controlInsets={config?.controlInsets}\n >\n {content}\n </List>\n );\n}\n\n/** Owner-specific attributes a toggle button carries (its wiring hooks). */\nexport type PanelToggleAttributes = Readonly<Record<string, string>>;\n\n/** The group size that fits a toolbar of this density. */\nexport function groupSizeFor(\n density: ToolbarConfig['density'],\n): ToolbarControlGroupSize {\n return density === 'compact' ? 'compact' : 'default';\n}\n\n/** The standard toggle, alone in a borderless group. */\nexport function panelToggleGroup(\n side: PanelSide,\n toggle: PanelToggle,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n size: ToolbarControlGroupSize = 'default',\n): SafeHtml {\n const glyph = collapsiblePanelToggleIcon(side, collapsed);\n return (\n <ToolbarControlGroup\n label={toggle.name}\n appearance=\"borderless\"\n size={size}\n single\n >\n <button\n type=\"button\"\n {...attributes}\n data-action={toggle.action}\n aria-expanded={String(!collapsed)}\n aria-label={\n collapsed\n ? (toggle.showLabel ?? `Show ${toggle.name}`)\n : (toggle.hideLabel ?? `Hide ${toggle.name}`)\n }\n >\n <LucideIcon icon={glyph.icon} name={glyph.name} />\n </button>\n </ToolbarControlGroup>\n );\n}\n\n/**\n * The panel's own toolbar: content keeps its chosen zones and the toggle trails.\n */\nexport function composedPanelToolbar(\n toolbar: PanelToolbar,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): SafeHtml {\n return (\n <Toolbar\n label={toolbar.label}\n density={toolbar.density}\n dividerSides={toolbar.dividerSides}\n centerAlign={toolbar.centerAlign}\n responsive={toolbar.responsive}\n responsiveAt={toolbar.responsiveAt}\n safeAreaEdges={toolbar.safeAreaEdges}\n center={toolbar.center}\n leading={\n <>\n {toolbar.title}\n {toolbar.leading}\n </>\n }\n trailing={\n <>\n {toolbar.trailing}\n {toolbar.toggle\n ? panelToggleGroup(\n side,\n toolbar.toggle,\n collapsed,\n attributes,\n groupSizeFor(toolbar.density),\n )\n : null}\n </>\n }\n />\n );\n}\n\n/**\n * A toolbar panel's body: its content in a `Pane` under its composed toolbar,\n * with its optional `footer` below. The panel's `pane` configuration forwards\n * to that `Pane`; an omitted or `undefined` field keeps the `Pane` default.\n */\nexport function composedPanelBody({\n toolbar,\n side,\n collapsed,\n attributes,\n pane,\n header,\n headerList,\n headerPlacement = 'fixed',\n footer,\n footerList,\n bottomToolbar,\n footerPlacement = 'fixed',\n content,\n}: {\n toolbar: PanelToolbar;\n side: PanelSide;\n collapsed: boolean;\n attributes: PanelToggleAttributes;\n pane: PaneConfig | undefined;\n header?: KerfUiContent;\n headerList?: ListConfig;\n headerPlacement?: PanelChromePlacement;\n footer?: KerfUiContent;\n footerList?: ListConfig;\n bottomToolbar?: PanelBottomToolbar;\n footerPlacement?: PanelChromePlacement;\n content: KerfUiContent;\n}): SafeHtml {\n const panelHeader = (\n <>\n {composedPanelToolbar(toolbar, side, collapsed, attributes)}\n {header ? panelChromeList(header, headerList) : null}\n </>\n );\n const panelFooter =\n footer || bottomToolbar ? (\n <>\n {footer ? panelChromeList(footer, footerList) : null}\n {bottomToolbar ? (\n <Toolbar\n position=\"footer\"\n label={bottomToolbar.label}\n density={bottomToolbar.density}\n dividerSides={bottomToolbar.dividerSides}\n centerAlign={bottomToolbar.centerAlign}\n responsive={bottomToolbar.responsive}\n responsiveAt={bottomToolbar.responsiveAt}\n safeAreaEdges={bottomToolbar.safeAreaEdges}\n leading={bottomToolbar.leading}\n center={bottomToolbar.center}\n trailing={bottomToolbar.trailing}\n />\n ) : null}\n </>\n ) : undefined;\n const scrollHeader = headerPlacement === 'scroll';\n const scrollFooter = footerPlacement === 'scroll';\n return (\n <Pane\n header={scrollHeader ? undefined : panelHeader}\n footer={scrollFooter ? undefined : panelFooter}\n chromePlacement={\n headerPlacement === 'auto' || footerPlacement === 'auto'\n ? 'auto'\n : 'fixed'\n }\n {...paneConfigProps(pane)}\n >\n {scrollHeader ? panelHeader : null}\n {content}\n {scrollFooter ? panelFooter : null}\n </Pane>\n );\n}\n\n/**\n * The groups a collapsed panel hands to the work area, in zone order, then its\n * toggle. Empty while the panel is open or has no toolbar.\n */\nexport function relocatedPanelGroups(\n toolbar: PanelToolbar | undefined,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n size: ToolbarControlGroupSize = 'default',\n): KerfUiContent[] {\n if (!collapsed || !toolbar) return [];\n const groups: KerfUiContent[] = [];\n const collect = (content: KerfUiContent): void => {\n if (Array.isArray(content)) {\n for (const item of content) collect(item);\n } else if (isRelocatableGroup(content)) {\n groups.push(content);\n }\n };\n collect(toolbar.leading);\n collect(toolbar.center);\n collect(toolbar.trailing);\n return [\n ...groups,\n toolbar.toggle\n ? panelToggleGroup(side, toolbar.toggle, true, attributes, size)\n : null,\n ].filter((group) => group !== undefined && group !== null && group !== false);\n}\n"]}
|
|
@@ -9,23 +9,25 @@ function swatchStyle(swatch) {
|
|
|
9
9
|
throw new TypeError("ChoiceChips swatch requires one CSS color value.");
|
|
10
10
|
return `--_kui-choice-chips-swatch: ${color}`;
|
|
11
11
|
}
|
|
12
|
-
function ChoiceChips({
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}) {
|
|
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;
|
|
27
26
|
if (choices.some((choice) => choice.swatch !== void 0 && choice.icon))
|
|
28
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];
|
|
29
31
|
return /* @__PURE__ */ jsx(
|
|
30
32
|
"div",
|
|
31
33
|
{
|
|
@@ -34,7 +36,7 @@ function ChoiceChips({
|
|
|
34
36
|
"data-component": "choice-chips",
|
|
35
37
|
"data-size": size,
|
|
36
38
|
"data-disabled": disabled ? "" : void 0,
|
|
37
|
-
role: "radiogroup",
|
|
39
|
+
role: multiple ? "group" : "radiogroup",
|
|
38
40
|
"aria-label": label,
|
|
39
41
|
"aria-labelledby": labelledBy,
|
|
40
42
|
"aria-required": required ? "true" : void 0,
|
|
@@ -54,10 +56,10 @@ function ChoiceChips({
|
|
|
54
56
|
"input",
|
|
55
57
|
{
|
|
56
58
|
class: "kui-choice-chips__input",
|
|
57
|
-
type: "radio",
|
|
59
|
+
type: multiple ? "checkbox" : "radio",
|
|
58
60
|
name,
|
|
59
61
|
value: choice.value,
|
|
60
|
-
checked: choice.value
|
|
62
|
+
checked: checked.includes(choice.value),
|
|
61
63
|
disabled: unavailable,
|
|
62
64
|
required,
|
|
63
65
|
form,
|
|
@@ -85,4 +87,4 @@ function ChoiceChips({
|
|
|
85
87
|
|
|
86
88
|
export { ChoiceChips };
|
|
87
89
|
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-FR76ZJQC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/choice-chips/choice-chips.tsx"],"names":[],"mappings":";;;AA+EA,IAAM,YAAA,GAAe,qBAAA;AAErB,SAAS,YAAY,MAAA,EAA+C;AAClE,EAAA,IAAI,MAAA,KAAW,eAAe,OAAO,MAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,KAAA,IAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,MAAM,IAAI,UAAU,kDAAkD,CAAA;AACxE,EAAA,OAAO,+BAA+B,KAAK,CAAA,CAAA;AAC7C;AASO,SAAS,YACd,KAAA,EACA;AACA,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,GAAO,SAAA;AAAA,IACP,QAAA,GAAW,KAAA;AAAA,IACX,IAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,KAAK,CAAC,MAAA,KAAW,OAAO,MAAA,KAAW,MAAA,IAAa,OAAO,IAAI,CAAA;AACrE,IAAA,MAAM,IAAI,UAAU,iDAAiD,CAAA;AACvE,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,KAAa,IAAA;AACpC,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,CAAM,QAAA,IAAY,MAAM,QAAA,KAAa,IAAA;AACvD,EAAA,MAAM,OAAA,GAA4B,KAAA,CAAM,QAAA,GACnC,KAAA,CAAM,SAAS,EAAC,GACjB,KAAA,CAAM,KAAA,KAAU,MAAA,GACd,EAAC,GACD,CAAC,MAAM,KAAK,CAAA;AAClB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,eAAA,EAAe,WAAW,EAAA,GAAK,MAAA;AAAA,MAC/B,IAAA,EAAM,WAAW,OAAA,GAAU,YAAA;AAAA,MAC3B,YAAA,EAAY,KAAA;AAAA,MACZ,iBAAA,EAAiB,UAAA;AAAA,MACjB,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,IAAA;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,QAAA,MAAM,WAAA,GAAc,QAAA,IAAY,MAAA,CAAO,QAAA,KAAa,IAAA;AACpD,QAAA,uBACE,IAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,wBAAA;AAAA,YACN,qBAAmB,MAAA,CAAO,KAAA;AAAA,YAC1B,eAAA,EAAe,cAAc,EAAA,GAAK,MAAA;AAAA,YAClC,OAAO,MAAA,CAAO,KAAA;AAAA,YAEd,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,yBAAA;AAAA,kBACN,IAAA,EAAM,WAAW,UAAA,GAAa,OAAA;AAAA,kBAC9B,IAAA;AAAA,kBACA,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,OAAA,EAAS,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,kBACtC,QAAA,EAAU,WAAA;AAAA,kBACV,QAAA;AAAA,kBACA,IAAA;AAAA,kBACA,aAAA,EAAa;AAAA;AAAA,eACf;AAAA,cACC,MAAA,CAAO,MAAA,KAAW,MAAA,GAAY,IAAA,mBAC7B,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,0BAAA;AAAA,kBACN,aAAA,EACE,MAAA,CAAO,MAAA,KAAW,aAAA,GAAgB,aAAA,GAAgB,OAAA;AAAA,kBAEpD,KAAA,EAAO,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,kBAChC,aAAA,EAAY;AAAA;AAAA,eACd;AAAA,cAED,MAAA,CAAO,IAAA,KAAS,MAAA,GAAY,IAAA,mBAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAAyB,aAAA,EAAY,MAAA,EAC9C,QAAA,EAAA,MAAA,CAAO,IAAA,EACV,CAAA;AAAA,8BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA2B,iBAAO,KAAA,EAAM;AAAA;AAAA;AAAA,SACtD;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","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"]}
|
|
@@ -1 +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-
|
|
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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Skeleton } from './chunk-
|
|
2
|
-
import { em } from './chunk-
|
|
1
|
+
import { Skeleton } from './chunk-CVD5IZGB.js';
|
|
2
|
+
import { em } from './chunk-IQSRHXZR.js';
|
|
3
3
|
import { jsx, jsxs } from 'kerfjs/jsx-runtime';
|
|
4
4
|
|
|
5
5
|
function ToolbarText({
|
|
@@ -83,4 +83,4 @@ function ToolbarText({
|
|
|
83
83
|
|
|
84
84
|
export { ToolbarText };
|
|
85
85
|
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-HGV7J4T6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/toolbar-text/toolbar-text.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { LucideIcon } from './chunk-LOSRXZAH.js';
|
|
2
|
+
import { LoadingSpinner } from './chunk-WVS6CUCT.js';
|
|
3
3
|
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
4
4
|
import { ChevronDown } from 'lucide';
|
|
5
5
|
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
@@ -81,4 +81,4 @@ function SplitButton({
|
|
|
81
81
|
|
|
82
82
|
export { SplitButton };
|
|
83
83
|
|
|
84
|
-
//# sourceMappingURL=chunk-
|
|
84
|
+
//# sourceMappingURL=chunk-HLDRH23D.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/split-button/split-button.tsx"],"names":[],"mappings":";;;;;;AAWA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAwDM,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,YAAA,GAAe,MAAA;AAAA,EACf,eAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,eAAA,GAAkB,KAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,mBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,GAAK,IAAA;AAC5C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,oBAAoB,CAAA;AAAA,MAC7D,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,IAAA,EAAK,OAAA;AAAA,MACL,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,MAAA;AAAA,YACb,YAAA,EAAY,eAAA;AAAA,YACZ,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,YAC3B,KAAA;AAAA,YACA,QAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,OAAA,wBACE,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAAyB,aAAA,EAAY,QAC9C,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,8BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA2B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,SAC/C;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,aAAA;AAAA,YACb,YAAA,EAAY,YAAA;AAAA,YACZ,eAAA,EAAe,YAAA;AAAA,YACf,eAAA,EAAe,kBAAkB,MAAA,GAAS,OAAA;AAAA,YAC1C,eAAA,EAAe,eAAA;AAAA,YACf,KAAA,EAAO,YAAA;AAAA,YACP,QAAA,EAAU,eAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAK,cAAA,EAAe;AAAA;AAAA;AACrD;AAAA;AAAA,GACF;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/actions/split-button/split-button.tsx"],"names":[],"mappings":";;;;;;AAWA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAwDM,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,YAAA,GAAe,MAAA;AAAA,EACf,eAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,eAAA,GAAkB,KAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,mBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,GAAK,IAAA;AAC5C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,oBAAoB,CAAA;AAAA,MAC7D,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,IAAA,EAAK,OAAA;AAAA,MACL,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,MAAA;AAAA,YACb,YAAA,EAAY,eAAA;AAAA,YACZ,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,YAC3B,KAAA;AAAA,YACA,QAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,OAAA,wBACE,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAAyB,aAAA,EAAY,QAC9C,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,8BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA2B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,SAC/C;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,aAAA;AAAA,YACb,YAAA,EAAY,YAAA;AAAA,YACZ,eAAA,EAAe,YAAA;AAAA,YACf,eAAA,EAAe,kBAAkB,MAAA,GAAS,OAAA;AAAA,YAC1C,eAAA,EAAe,eAAA;AAAA,YACf,KAAA,EAAO,YAAA;AAAA,YACP,QAAA,EAAU,eAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAK,cAAA,EAAe;AAAA;AAAA;AACrD;AAAA;AAAA,GACF;AAEJ","file":"chunk-HLDRH23D.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport { ChevronDown } from 'lucide';\n\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\n\n/** The loud fill the whole split button paints. */\nexport type SplitButtonTone =\n 'brand' | 'neutral' | 'success' | 'warning' | 'danger';\n\nconst splitButtonProtected = new Set([\n 'data-component',\n 'data-tone',\n 'data-fill',\n 'data-busy',\n]);\n\ntype SplitButtonRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-tone'?: never;\n 'data-fill'?: never;\n 'data-busy'?: never;\n }\n>;\n\nexport interface SplitButtonProps {\n /** Visible primary label. */\n label: string;\n /** Delegated `data-action` of the primary half. */\n action: string;\n /** Optional decorative leading icon of the primary half. */\n icon?: SafeHtml;\n /** Primary accessible name when it should say more than `label`. */\n accessibleLabel?: string;\n /** Accessible name (and tooltip) of the options trigger. */\n optionsLabel: string;\n /** Delegated `data-action` of the options trigger, which opens the app's menu. */\n optionsAction: string;\n /** Whether the options menu is open, exposed as `aria-expanded`. */\n optionsExpanded?: boolean;\n /** What the options trigger opens, exposed as `aria-haspopup`; defaults to `menu`. */\n optionsPopup?: 'menu' | 'dialog' | 'listbox';\n /** Element id the options trigger controls, exposed as `aria-controls`. */\n optionsControls?: string;\n /** The loud fill; defaults to `brand`. Switch it (for example to `neutral`) while running. */\n tone?: SplitButtonTone;\n /** Span the full width of the parent instead of sizing to the label. */\n fill?: boolean;\n /** Show work in progress: a spinner replaces the icon and the primary is `aria-busy`. */\n busy?: boolean;\n /** Disable the primary half. */\n disabled?: boolean;\n /** Disable the options trigger. */\n optionsDisabled?: boolean;\n /** Native tooltip of the primary half, for example why it is disabled. */\n title?: string;\n className?: string;\n /** Safe `data-*` metadata; SplitButton-owned markers stay protected. */\n rootAttributes?: SplitButtonRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A primary action with an attached options trigger on one loud, semantic\n * fill (a \"Drive\" button with a provider menu). Both halves are native\n * buttons, so `aria-expanded` and the accessible names reach assistive\n * technology directly; the application opens its own menu from the options\n * action and owns the running state.\n */\nexport function SplitButton({\n label,\n action,\n icon,\n accessibleLabel,\n optionsLabel,\n optionsAction,\n optionsExpanded = false,\n optionsPopup = 'menu',\n optionsControls,\n tone = 'brand',\n fill = false,\n busy = false,\n disabled = false,\n optionsDisabled = false,\n title,\n className = '',\n rootAttributes = {},\n slot,\n}: SplitButtonProps) {\n const leading = busy ? <LoadingSpinner /> : icon;\n return (\n <div\n {...filterDataAttributes(rootAttributes, splitButtonProtected)}\n class={`kui-split-button ${className}`.trim()}\n data-component=\"split-button\"\n data-tone={tone}\n data-fill={fill ? 'true' : undefined}\n data-busy={busy ? 'true' : undefined}\n role=\"group\"\n slot={slot}\n >\n <button\n type=\"button\"\n class=\"kui-split-button__primary\"\n data-action={action}\n aria-label={accessibleLabel}\n aria-busy={busy ? 'true' : undefined}\n title={title}\n disabled={disabled}\n >\n {leading && (\n <span class=\"kui-split-button__icon\" aria-hidden=\"true\">\n {leading}\n </span>\n )}\n <span class=\"kui-split-button__label\">{label}</span>\n </button>\n <button\n type=\"button\"\n class=\"kui-split-button__options\"\n data-action={optionsAction}\n aria-label={optionsLabel}\n aria-haspopup={optionsPopup}\n aria-expanded={optionsExpanded ? 'true' : 'false'}\n aria-controls={optionsControls}\n title={optionsLabel}\n disabled={optionsDisabled}\n >\n <LucideIcon icon={ChevronDown} name=\"chevron-down\" />\n </button>\n </div>\n );\n}\n"]}
|