@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
|
@@ -2,7 +2,7 @@ import * as kerfjs from 'kerfjs';
|
|
|
2
2
|
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
3
3
|
import { ListConfig } from './list.js';
|
|
4
4
|
import { PaneConfig } from './pane.js';
|
|
5
|
-
import { c as PanelBottomToolbar } from './panel-toolbar-
|
|
5
|
+
import { c as PanelBottomToolbar } from './panel-toolbar-vg6Ir5Dy.js';
|
|
6
6
|
import { ToolbarConfig } from './toolbar.js';
|
|
7
7
|
import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
|
|
8
8
|
|
|
@@ -43,11 +43,28 @@ type NavStackViewBottomToolbar = PanelBottomToolbar;
|
|
|
43
43
|
interface NavStackToolbarConfig extends ToolbarConfig {
|
|
44
44
|
/** Accessible name of the top toolbar (default: none). */
|
|
45
45
|
label?: string;
|
|
46
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Size of the view title's `ToolbarText`. Default `xlarge` at the root,
|
|
48
|
+
* where the title is the page heading, and `large` once a back control
|
|
49
|
+
* shares the bar.
|
|
50
|
+
*/
|
|
47
51
|
titleSize?: ToolbarTextSize;
|
|
48
52
|
/** Expose the view title as a heading at this level (default: a plain span). */
|
|
49
53
|
headingLevel?: HeadingLevel;
|
|
50
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* How a {@link NavStack}'s top chrome relates to the active view: `docked`
|
|
57
|
+
* above it, or `overlay` laid over its top edge on the translucent chrome
|
|
58
|
+
* material, so the view's content scrolls visibly beneath it.
|
|
59
|
+
*/
|
|
60
|
+
type NavStackChromePresentation = 'docked' | 'overlay';
|
|
61
|
+
/**
|
|
62
|
+
* How a {@link NavStack}'s bottom toolbar relates to the active view:
|
|
63
|
+
* `docked` below it, or `overlay` laid over its bottom edge on the
|
|
64
|
+
* translucent chrome material, so the view's content scrolls visibly beneath
|
|
65
|
+
* it.
|
|
66
|
+
*/
|
|
67
|
+
type NavStackBottomToolbarPresentation = 'docked' | 'overlay';
|
|
51
68
|
interface NavStackProps {
|
|
52
69
|
id: string;
|
|
53
70
|
/** Accessible name for the stack region. */
|
|
@@ -92,6 +109,38 @@ interface NavStackProps {
|
|
|
92
109
|
* own and is unaffected.
|
|
93
110
|
*/
|
|
94
111
|
chromeDividers?: 'scroll' | 'always' | 'none';
|
|
112
|
+
/**
|
|
113
|
+
* `docked` (default) gives the top chrome its own band above the active
|
|
114
|
+
* view. `overlay` lays the chrome over the view's top edge on the
|
|
115
|
+
* translucent chrome material (`--kui-chrome-material`, opaque under
|
|
116
|
+
* `prefers-reduced-transparency`, `prefers-contrast: more`, forced colors,
|
|
117
|
+
* or without `backdrop-filter`), so content scrolls visibly beneath it, as
|
|
118
|
+
* an iOS navigation bar does. `wireNavStack` measures the live chrome and
|
|
119
|
+
* hands its height (top safe area included) to the viewport as the
|
|
120
|
+
* block-start `--kui-edge-inset-*` context, so every view clears it with no
|
|
121
|
+
* prop: a plain view, a sole `Pane`'s content (or header), and a nested
|
|
122
|
+
* layout all pad and `scroll-padding` by it, so the first item, and anything
|
|
123
|
+
* focused or scrolled into view, rests clear of the bar. Until then, and
|
|
124
|
+
* with `hideToolbar`, the chrome stays docked. An untoned `ToolbarText` in
|
|
125
|
+
* the chrome lifts its title and description to AA over the content passing
|
|
126
|
+
* beneath it; keep any other quiet copy in the view.
|
|
127
|
+
*/
|
|
128
|
+
chromePresentation?: NavStackChromePresentation;
|
|
129
|
+
/**
|
|
130
|
+
* `docked` (default) gives the bottom toolbar its own band below the
|
|
131
|
+
* active view. `overlay` lays it over the view's bottom edge on the
|
|
132
|
+
* translucent chrome material (opaque under the same preferences as
|
|
133
|
+
* `chromePresentation`), so content scrolls visibly beneath it, as under
|
|
134
|
+
* an iOS toolbar. `wireNavStack` measures the live bottom toolbar (never a
|
|
135
|
+
* cross-fading copy) and hands its height (bottom safe area included) to
|
|
136
|
+
* the viewport as the block-end `--kui-edge-inset-*` context, so a plain
|
|
137
|
+
* view, a sole `Pane`'s content (or footer), and a nested layout rest their
|
|
138
|
+
* last item, and anything focused or scrolled into view, clear of it. Until
|
|
139
|
+
* then, and while no bottom toolbar is shown, it stays docked. Independent
|
|
140
|
+
* of `chromePresentation`, which governs only the top chrome. An untoned
|
|
141
|
+
* `ToolbarText` in the toolbar lifts to AA over the content beneath it.
|
|
142
|
+
*/
|
|
143
|
+
bottomToolbarPresentation?: NavStackBottomToolbarPresentation;
|
|
95
144
|
className?: string;
|
|
96
145
|
/** Native named-slot assignment when composed inside a web component. */
|
|
97
146
|
slot?: string;
|
|
@@ -104,6 +153,6 @@ interface NavStackProps {
|
|
|
104
153
|
* and `toolbarConfig` supplies defaults. A single-pane
|
|
105
154
|
* layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.
|
|
106
155
|
*/
|
|
107
|
-
declare function NavStack({ id, label, views, backLabel, backIcon, backText, toolbarConfig, panelToggle, hideToolbar, bottomToolbar, separator, chromeDividers, className, slot, }: NavStackProps): kerfjs.SafeHtml;
|
|
156
|
+
declare function NavStack({ id, label, views, backLabel, backIcon, backText, toolbarConfig, panelToggle, hideToolbar, bottomToolbar, separator, chromeDividers, chromePresentation, bottomToolbarPresentation, className, slot, }: NavStackProps): kerfjs.SafeHtml;
|
|
108
157
|
|
|
109
|
-
export { type NavStackProps as N, type NavStackView as a, type NavPane as b, NavStack as c, type
|
|
158
|
+
export { type NavStackProps as N, type NavStackView as a, type NavPane as b, NavStack as c, type NavStackBottomToolbarPresentation as d, type NavStackChromePresentation as e, type NavStackToolbarConfig as f, type NavStackViewBottomToolbar as g, type NavStackViewToolbar as h };
|
package/dist/nav-stack.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
export { c as NavStack, N as NavStackProps,
|
|
1
|
+
export { c as NavStack, d as NavStackBottomToolbarPresentation, e as NavStackChromePresentation, N as NavStackProps, f as NavStackToolbarConfig, a as NavStackView, g as NavStackViewBottomToolbar, h as NavStackViewToolbar } from './nav-stack-VXTumzKa.js';
|
|
2
2
|
import 'kerfjs';
|
|
3
3
|
import './semantic-content-BbzjvSu9.js';
|
|
4
4
|
import './list.js';
|
|
5
5
|
import './extension-attributes-mu8MFUl0.js';
|
|
6
6
|
import './flex-alignment-4ms8ZbV8.js';
|
|
7
|
+
import './scroll-clearance-BikHljTc.js';
|
|
7
8
|
import './sides-BPSWde0A.js';
|
|
8
9
|
import './css-values.js';
|
|
9
10
|
import './pane.js';
|
|
10
|
-
import './panel-toolbar-
|
|
11
|
+
import './panel-toolbar-vg6Ir5Dy.js';
|
|
11
12
|
import './toolbar.js';
|
|
12
13
|
import './lucide-icon.js';
|
|
13
14
|
import 'lucide';
|
package/dist/nav-stack.js
CHANGED
package/dist/pane.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as kerfjs from 'kerfjs';
|
|
2
2
|
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
3
|
+
import { S as ScrollClearance } from './scroll-clearance-BikHljTc.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Logical pane sides: where a {@link Pane} can show a separator and where it can
|
|
@@ -25,6 +26,9 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
|
|
|
25
26
|
'data-appearance'?: never;
|
|
26
27
|
'data-deep-inset'?: never;
|
|
27
28
|
'data-outlined'?: never;
|
|
29
|
+
'data-scroll-clearance'?: never;
|
|
30
|
+
'data-header-presentation'?: never;
|
|
31
|
+
'data-header-overlay'?: never;
|
|
28
32
|
}>;
|
|
29
33
|
/** How a Pane's header and footer relate to its scrolling content. */
|
|
30
34
|
type PaneChromePlacement = 'fixed' | 'auto';
|
|
@@ -34,6 +38,12 @@ type PaneChromePlacement = 'fixed' | 'auto';
|
|
|
34
38
|
* chrome, as `wireScrollDividers` reports; `always`; or `none`.
|
|
35
39
|
*/
|
|
36
40
|
type PaneChromeDividers = 'scroll' | 'always' | 'none';
|
|
41
|
+
/**
|
|
42
|
+
* How a Pane's header relates to its scrolling content: `docked` in its own
|
|
43
|
+
* row above the content, or `overlay` laid over the content's top edge on the
|
|
44
|
+
* translucent chrome material, so content scrolls visibly beneath it.
|
|
45
|
+
*/
|
|
46
|
+
type PaneHeaderPresentation = 'docked' | 'overlay';
|
|
37
47
|
/** Background treatment of the Pane's scrolling work surface. */
|
|
38
48
|
type PaneAppearance = 'default' | 'sunken';
|
|
39
49
|
interface PaneProps {
|
|
@@ -62,8 +72,35 @@ interface PaneProps {
|
|
|
62
72
|
* The line is drawn inside the chrome, so no state moves the content.
|
|
63
73
|
*/
|
|
64
74
|
chromeDividers?: PaneChromeDividers;
|
|
75
|
+
/**
|
|
76
|
+
* `docked` (default) gives the header its own row above the scrolling
|
|
77
|
+
* content. `overlay` lays the header over the content's top edge on the
|
|
78
|
+
* translucent chrome material (`--kui-chrome-material`, opaque under
|
|
79
|
+
* `prefers-reduced-transparency`, forced colors, or without
|
|
80
|
+
* `backdrop-filter`), so content scrolls visibly beneath it. Once
|
|
81
|
+
* `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is wired above
|
|
82
|
+
* the pane it measures the header and publishes its height as the
|
|
83
|
+
* `--kui-scroll-clearance-block-start` context, which the content adds to
|
|
84
|
+
* its block-start padding and `scroll-padding` without any
|
|
85
|
+
* `scrollClearance` prop, so the first item, and anything focused or
|
|
86
|
+
* scrolled into view, rests clear of the header. Until then, and with
|
|
87
|
+
* `chromePlacement="auto"`, the header stays docked. Keep overlay header
|
|
88
|
+
* text in the normal text color: quiet text can fall below AA over the
|
|
89
|
+
* content passing beneath it.
|
|
90
|
+
*/
|
|
91
|
+
headerPresentation?: PaneHeaderPresentation;
|
|
65
92
|
/** Paint the scrolling work surface with the shared lowered-surface color. */
|
|
66
93
|
appearance?: PaneAppearance;
|
|
94
|
+
/**
|
|
95
|
+
* Clear chrome that lies over the scrolling content's block-start and/or
|
|
96
|
+
* block-end edge, such as a `DialogSurface` floating footer over a filling
|
|
97
|
+
* Pane. The content scroller adds the inherited
|
|
98
|
+
* `--kui-scroll-clearance-block-*` context that chrome publishes to its block
|
|
99
|
+
* padding and `scroll-padding`, so content scrolls visibly beneath the chrome
|
|
100
|
+
* while its first and last items (and anything focused or scrolled into
|
|
101
|
+
* view) can still rest clear of it. Defaults to none.
|
|
102
|
+
*/
|
|
103
|
+
scrollClearance?: ScrollClearance;
|
|
67
104
|
/** Add 8px to every side of scrolling content (default: false). */
|
|
68
105
|
deepInset?: boolean;
|
|
69
106
|
/** Opt into keyboard (`0`) or programmatic (`-1`) focus on the Pane root. */
|
|
@@ -104,13 +141,13 @@ interface PaneProps {
|
|
|
104
141
|
* or a CollapsiblePanel) forwards, so the app configures that pane instead of
|
|
105
142
|
* styling it. An omitted or `undefined` field keeps the composite's default.
|
|
106
143
|
*/
|
|
107
|
-
type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance' | 'deepInset' | 'tabIndex' | 'outlined'>;
|
|
144
|
+
type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'headerPresentation' | 'appearance' | 'deepInset' | 'scrollClearance' | 'tabIndex' | 'outlined'>;
|
|
108
145
|
/**
|
|
109
146
|
* An unpadded application column with optional fixed header/footer slots and one
|
|
110
147
|
* scrolling vertical content owner. Separator lines are independently opt-in on
|
|
111
148
|
* each logical edge, so the same component works as a sidebar, main area,
|
|
112
149
|
* inspector, or dialog column.
|
|
113
150
|
*/
|
|
114
|
-
declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, deepInset, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
|
|
151
|
+
declare function Pane({ header, children, footer, chromePlacement, chromeDividers, headerPresentation, appearance, deepInset, scrollClearance, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
|
|
115
152
|
|
|
116
|
-
export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
|
|
153
|
+
export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance };
|
package/dist/pane.js
CHANGED
|
@@ -22,7 +22,12 @@ declare function collapsiblePanelToggleIcon(side: PanelSide, collapsed: boolean)
|
|
|
22
22
|
interface PanelToggle {
|
|
23
23
|
/** The `data-action` the toggle button carries. */
|
|
24
24
|
action: string;
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* The panel's short title-style name ("Navigator", "Build Output"). It is
|
|
27
|
+
* the toggle group's accessible name and completes the default "Show …" /
|
|
28
|
+
* "Hide …" label ("Show Navigator"), so it follows the title-style rule in
|
|
29
|
+
* `docs/writing.md`; it is never recapitalized.
|
|
30
|
+
*/
|
|
26
31
|
name: string;
|
|
27
32
|
/** Accessible label while the panel is collapsed. Defaults to `Show {name}`. */
|
|
28
33
|
showLabel?: string;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Marker export for tests and tooling; importing this module registers the
|
|
3
3
|
* Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,
|
|
4
4
|
* `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard
|
|
5
|
-
* choice through the item's click so delegated `data-action`s run.
|
|
5
|
+
* choice through the item's click so delegated `data-action`s run. It also
|
|
6
|
+
* names each open menu panel from its trigger and each submenu from its item.
|
|
6
7
|
*/
|
|
7
8
|
declare const popupMenuElementsRegistered = true;
|
|
8
9
|
|
|
@@ -5,6 +5,27 @@ import WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item
|
|
|
5
5
|
import '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';
|
|
6
6
|
import WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';
|
|
7
7
|
|
|
8
|
+
// src/components/actions/popup-menu/internal/reveal-in-scroller.ts
|
|
9
|
+
function composedParent(node) {
|
|
10
|
+
return node.assignedSlot ?? node.parentElement ?? (node.parentNode instanceof ShadowRoot ? node.parentNode.host : null);
|
|
11
|
+
}
|
|
12
|
+
function scrollerOf(node) {
|
|
13
|
+
for (let current = composedParent(node); current; current = composedParent(current)) {
|
|
14
|
+
if (current instanceof HTMLElement && current.scrollHeight > current.clientHeight && /auto|scroll/.test(globalThis.getComputedStyle(current).overflowY))
|
|
15
|
+
return current;
|
|
16
|
+
}
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
function revealInScroller(item) {
|
|
20
|
+
const scroller = scrollerOf(item);
|
|
21
|
+
if (!scroller) return;
|
|
22
|
+
const box = item.getBoundingClientRect();
|
|
23
|
+
const top = scroller.getBoundingClientRect().top + scroller.clientTop;
|
|
24
|
+
const bottom = top + scroller.clientHeight;
|
|
25
|
+
if (box.top < top) scroller.scrollTop -= top - box.top;
|
|
26
|
+
else if (box.bottom > bottom) scroller.scrollTop += box.bottom - bottom;
|
|
27
|
+
}
|
|
28
|
+
|
|
8
29
|
// src/components/actions/popup-menu/internal/install-dropdown-show-focus.ts
|
|
9
30
|
var installed = /* @__PURE__ */ new WeakSet();
|
|
10
31
|
var showEpoch = /* @__PURE__ */ new WeakMap();
|
|
@@ -40,15 +61,55 @@ function installDropdownShowFocus(prototype) {
|
|
|
40
61
|
item.active = item === navigatedItem;
|
|
41
62
|
});
|
|
42
63
|
navigatedItem.focus({ preventScroll: true });
|
|
64
|
+
revealInScroller(navigatedItem);
|
|
43
65
|
};
|
|
44
66
|
}
|
|
45
67
|
|
|
46
|
-
// src/components/actions/popup-menu/internal/install-popup-menu-
|
|
68
|
+
// src/components/actions/popup-menu/internal/install-popup-menu-accessible-name.ts
|
|
69
|
+
var POPUP_MENU_LABEL_ATTRIBUTE = "data-menu-label";
|
|
47
70
|
var installed2 = /* @__PURE__ */ new WeakSet();
|
|
48
|
-
function
|
|
71
|
+
function syncMenuName(dropdown) {
|
|
72
|
+
const menu = dropdown.menu;
|
|
73
|
+
if (!menu || !dropdown.classList.contains("kui-popup-menu")) return;
|
|
74
|
+
const name = dropdown.getAttribute(POPUP_MENU_LABEL_ATTRIBUTE)?.trim();
|
|
75
|
+
if (name) menu.setAttribute("aria-label", name);
|
|
76
|
+
else menu.removeAttribute("aria-label");
|
|
77
|
+
}
|
|
78
|
+
function installPopupMenuAccessibleName(prototype) {
|
|
49
79
|
if (installed2.has(prototype)) return;
|
|
50
80
|
installed2.add(prototype);
|
|
51
81
|
const target = prototype;
|
|
82
|
+
const firstUpdated = target.firstUpdated;
|
|
83
|
+
const showMenu = target.showMenu;
|
|
84
|
+
target.firstUpdated = function(changed) {
|
|
85
|
+
firstUpdated.call(this, changed);
|
|
86
|
+
syncMenuName(this);
|
|
87
|
+
};
|
|
88
|
+
target.showMenu = function() {
|
|
89
|
+
syncMenuName(this);
|
|
90
|
+
return showMenu.call(this);
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
var installedItems = /* @__PURE__ */ new WeakSet();
|
|
94
|
+
function installPopupMenuSubmenuName(prototype) {
|
|
95
|
+
if (installedItems.has(prototype)) return;
|
|
96
|
+
installedItems.add(prototype);
|
|
97
|
+
const target = prototype;
|
|
98
|
+
const openSubmenu = target.openSubmenu;
|
|
99
|
+
target.openSubmenu = function() {
|
|
100
|
+
const submenu = this.submenuElement;
|
|
101
|
+
if (submenu && this.closest(".kui-popup-menu"))
|
|
102
|
+
submenu.setAttribute("aria-labelledby", "label");
|
|
103
|
+
return openSubmenu.call(this);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/components/actions/popup-menu/internal/install-popup-menu-keyboard.ts
|
|
108
|
+
var installed3 = /* @__PURE__ */ new WeakSet();
|
|
109
|
+
function installPopupMenuKeyboard(prototype) {
|
|
110
|
+
if (installed3.has(prototype)) return;
|
|
111
|
+
installed3.add(prototype);
|
|
112
|
+
const target = prototype;
|
|
52
113
|
const makeSelection = target.makeSelection;
|
|
53
114
|
target.makeSelection = function(item, event) {
|
|
54
115
|
if (event instanceof KeyboardEvent && this.classList.contains("kui-popup-menu") && !item.disabled) {
|
|
@@ -60,10 +121,10 @@ function installPopupMenuKeyboard(prototype) {
|
|
|
60
121
|
}
|
|
61
122
|
|
|
62
123
|
// src/components/actions/popup-menu/internal/install-popup-menu-lifecycle.ts
|
|
63
|
-
var
|
|
124
|
+
var installed4 = /* @__PURE__ */ new WeakSet();
|
|
64
125
|
function installPopupMenuLifecycle(prototype) {
|
|
65
|
-
if (
|
|
66
|
-
|
|
126
|
+
if (installed4.has(prototype)) return;
|
|
127
|
+
installed4.add(prototype);
|
|
67
128
|
const target = prototype;
|
|
68
129
|
const showMenu = target.showMenu;
|
|
69
130
|
const hideMenu = target.hideMenu;
|
|
@@ -90,10 +151,11 @@ function installPopupMenuLifecycle(prototype) {
|
|
|
90
151
|
}
|
|
91
152
|
|
|
92
153
|
// src/components/actions/popup-menu/internal/install-popup-menu-submenu-focus.ts
|
|
93
|
-
var
|
|
154
|
+
var installed5 = /* @__PURE__ */ new WeakSet();
|
|
155
|
+
var inputEvents = ["keydown", "pointerdown"];
|
|
94
156
|
function installPopupMenuSubmenuFocus(prototype) {
|
|
95
|
-
if (
|
|
96
|
-
|
|
157
|
+
if (installed5.has(prototype)) return;
|
|
158
|
+
installed5.add(prototype);
|
|
97
159
|
const target = prototype;
|
|
98
160
|
const openSubmenu = target.openSubmenu;
|
|
99
161
|
const closeSubmenu = target.closeSubmenu;
|
|
@@ -124,32 +186,43 @@ function installPopupMenuSubmenuFocus(prototype) {
|
|
|
124
186
|
submenu.classList.remove("show");
|
|
125
187
|
}
|
|
126
188
|
let desired;
|
|
189
|
+
let input;
|
|
190
|
+
const trackInput = (event) => {
|
|
191
|
+
input = event;
|
|
192
|
+
};
|
|
127
193
|
const trackFocus = (event) => {
|
|
128
194
|
const item = event.composedPath().find(
|
|
129
195
|
(node) => node instanceof HTMLElement && node.localName === "wa-dropdown-item" && node.getAttribute("slot") === "submenu"
|
|
130
196
|
);
|
|
131
|
-
|
|
197
|
+
const items = this.getSubmenuItems();
|
|
198
|
+
if (!item || !items.includes(item)) return;
|
|
199
|
+
const fromInput = input !== void 0 && input.eventPhase !== Event.NONE;
|
|
200
|
+
if (item !== items[0] || fromInput) desired = item;
|
|
132
201
|
};
|
|
202
|
+
for (const type of inputEvents)
|
|
203
|
+
document.addEventListener(type, trackInput, true);
|
|
133
204
|
submenu.addEventListener("focusin", trackFocus);
|
|
134
205
|
try {
|
|
135
206
|
await openSubmenu.call(this);
|
|
136
207
|
} finally {
|
|
137
|
-
|
|
208
|
+
window.setTimeout(() => {
|
|
209
|
+
for (const type of inputEvents)
|
|
210
|
+
document.removeEventListener(type, trackInput, true);
|
|
211
|
+
submenu.removeEventListener("focusin", trackFocus);
|
|
212
|
+
const items = this.getSubmenuItems();
|
|
213
|
+
const selected = desired;
|
|
214
|
+
if (!selected || selected === items[0] || !this.isConnected || !this.submenuOpen || submenu.hidden || document.activeElement !== items[0])
|
|
215
|
+
return;
|
|
216
|
+
items.forEach((item) => item.active = item === selected);
|
|
217
|
+
selected.focus({ preventScroll: true });
|
|
218
|
+
revealInScroller(selected);
|
|
219
|
+
}, 0);
|
|
138
220
|
}
|
|
139
|
-
const items = this.getSubmenuItems();
|
|
140
|
-
if (!desired || desired === items[0]) return;
|
|
141
|
-
const selected = desired;
|
|
142
|
-
window.setTimeout(() => {
|
|
143
|
-
if (!this.isConnected || !this.submenuOpen || submenu.hidden || document.activeElement !== items[0])
|
|
144
|
-
return;
|
|
145
|
-
items.forEach((item) => item.active = item === selected);
|
|
146
|
-
selected.focus({ preventScroll: true });
|
|
147
|
-
}, 0);
|
|
148
221
|
};
|
|
149
222
|
}
|
|
150
223
|
|
|
151
224
|
// src/components/actions/popup-menu/internal/install-popup-menu-submenu-placement.ts
|
|
152
|
-
var
|
|
225
|
+
var installed6 = /* @__PURE__ */ new WeakSet();
|
|
153
226
|
var phoneWidth = "(max-width: 480px)";
|
|
154
227
|
var viewportInset = 8;
|
|
155
228
|
var menuGap = 4;
|
|
@@ -203,8 +276,8 @@ function remeasureSafeTriangle(dropdown, item) {
|
|
|
203
276
|
});
|
|
204
277
|
}
|
|
205
278
|
function installPopupMenuSubmenuPlacement(prototype) {
|
|
206
|
-
if (
|
|
207
|
-
|
|
279
|
+
if (installed6.has(prototype)) return;
|
|
280
|
+
installed6.add(prototype);
|
|
208
281
|
const target = prototype;
|
|
209
282
|
const positionSubmenu = target.positionSubmenu;
|
|
210
283
|
target.positionSubmenu = function(item) {
|
|
@@ -253,6 +326,8 @@ installPopupMenuLifecycle(WaDropdown.prototype);
|
|
|
253
326
|
installDropdownShowFocus(WaDropdown.prototype);
|
|
254
327
|
installPopupMenuSubmenuFocus(WaDropdownItem.prototype);
|
|
255
328
|
installPopupMenuSubmenuPlacement(WaDropdown.prototype);
|
|
329
|
+
installPopupMenuAccessibleName(WaDropdown.prototype);
|
|
330
|
+
installPopupMenuSubmenuName(WaDropdownItem.prototype);
|
|
256
331
|
installHelpTags();
|
|
257
332
|
var popupMenuElementsRegistered = true;
|
|
258
333
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/popup-menu/internal/install-dropdown-show-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-keyboard.ts","../src/components/actions/popup-menu/internal/install-popup-menu-lifecycle.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-placement.ts","../src/components/actions/popup-menu/register/popup-menu-register.ts"],"names":["installed"],"mappings":"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","file":"popup-menu-register.js","sourcesContent":["interface FocusableDropdownItem extends HTMLElement {\n active: boolean;\n}\n\ninterface FocusableDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n menu?: HTMLElement;\n getItems(): FocusableDropdownItem[];\n showMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\nconst showEpoch = new WeakMap<FocusableDropdown, number>();\n\n/** Preserve item navigation that Web Awesome receives during its show animation. */\nexport function installDropdownShowFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as FocusableDropdown;\n const showMenu = target.showMenu;\n target.showMenu = async function (this: FocusableDropdown): Promise<void> {\n const scoped =\n this.classList.contains('kui-popup-menu') ||\n this.closest('.kui-popup-surface') !== null;\n if (!scoped) return showMenu.call(this);\n\n const epoch = (showEpoch.get(this) ?? 0) + 1;\n showEpoch.set(this, epoch);\n let navigatedItem: FocusableDropdownItem | undefined;\n const rememberFocus = (event: FocusEvent) => {\n const item = event.target;\n if (\n this.menu?.classList.contains('show') &&\n item instanceof HTMLElement &&\n item.localName === 'wa-dropdown-item' &&\n this.contains(item)\n ) {\n navigatedItem = item as FocusableDropdownItem;\n }\n };\n this.addEventListener('focusin', rememberFocus);\n try {\n await showMenu.call(this);\n } finally {\n this.removeEventListener('focusin', rememberFocus);\n }\n if (\n showEpoch.get(this) !== epoch ||\n !this.open ||\n !this.popup?.active ||\n !navigatedItem?.isConnected ||\n !this.contains(navigatedItem)\n )\n return;\n\n const siblings =\n navigatedItem.slot === 'submenu'\n ? Array.from(navigatedItem.parentElement?.children ?? []).filter(\n (item): item is FocusableDropdownItem =>\n item.localName === 'wa-dropdown-item',\n )\n : this.getItems();\n siblings.forEach((item) => {\n item.active = item === navigatedItem;\n });\n navigatedItem.focus({ preventScroll: true });\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n makeSelection(\n item: HTMLElement & { disabled?: boolean },\n event?: Event,\n ): void;\n}\n\nconst installed = new WeakSet<object>();\n\n/**\n * Route a keyboard choice in a `PopupMenu` through the item's click. Web Awesome\n * selects a pointer choice from the item's click event but a keyboard choice\n * (Enter or Space) directly, so delegated `data-action` click handlers would\n * never run for keyboard users. Clicking the item makes Web Awesome select it\n * exactly as it does for a pointer — one `wa-select`, then close and focus\n * return — while the click reaches the application's delegation. Raw\n * `wa-dropdown`s outside `PopupMenu` are unaffected.\n */\nexport function installPopupMenuKeyboard(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const makeSelection = target.makeSelection;\n target.makeSelection = function (this: PopupMenuDropdown, item, event): void {\n if (\n event instanceof KeyboardEvent &&\n this.classList.contains('kui-popup-menu') &&\n !item.disabled\n ) {\n item.click();\n return;\n }\n makeSelection.call(this, item, event);\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n showMenu(): Promise<void>;\n hideMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Restore Web Awesome dismissal listeners after a rapid close/reopen. */\nexport function installPopupMenuLifecycle(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const showMenu = target.showMenu;\n const hideMenu = target.hideMenu;\n const hiding = new WeakMap<PopupMenuDropdown, { reopened: boolean }>();\n target.showMenu = function (this: PopupMenuDropdown): Promise<void> {\n const transition = hiding.get(this);\n if (\n transition &&\n this.open &&\n this.popup?.active &&\n this.classList.contains('kui-popup-menu')\n ) {\n // Native showMenu would return early while the old popup is active,\n // leaving its document pointer listener absent during the hide.\n this.popup.active = false;\n transition.reopened = true;\n }\n return showMenu.call(this);\n };\n target.hideMenu = async function (this: PopupMenuDropdown): Promise<void> {\n const scoped = this.classList.contains('kui-popup-menu');\n const transition = { reopened: false };\n if (scoped) hiding.set(this, transition);\n await hideMenu.call(this);\n // WA removes its document listeners before awaiting the hide animation.\n // If Lit coalesces the intervening open request, restore the listeners\n // after hide; an explicit showMenu above has already done so immediately.\n if (\n scoped &&\n hiding.get(this) === transition &&\n this.open &&\n this.isConnected &&\n this.popup?.active &&\n !transition.reopened\n ) {\n this.popup.active = false;\n void this.showMenu();\n }\n if (hiding.get(this) === transition) hiding.delete(this);\n };\n}\n","interface SubmenuItem extends HTMLElement {\n active: boolean;\n}\n\ninterface PopupMenuParentItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n getSubmenuItems(): SubmenuItem[];\n openSubmenu(): Promise<void>;\n closeSubmenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Preserve a rapid keyboard move past Web Awesome's late first-item focus. */\nexport function installPopupMenuSubmenuFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuParentItem;\n const openSubmenu = target.openSubmenu;\n const closeSubmenu = target.closeSubmenu;\n const submenuOpen = Object.getOwnPropertyDescriptor(prototype, 'submenuOpen');\n if (submenuOpen?.set) {\n Object.defineProperty(prototype, 'submenuOpen', {\n ...submenuOpen,\n set(this: PopupMenuParentItem, value: boolean) {\n const wasOpen = this.submenuOpen;\n submenuOpen.set!.call(this, value);\n // Web Awesome's pointer, click, and ArrowRight paths assign true. A\n // repeated assignment does not schedule updated(), so repair a stale\n // open flag over a hidden submenu at the point of that user action.\n if (\n value &&\n wasOpen &&\n this.submenuElement?.hidden &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n },\n });\n }\n target.closeSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n await closeSubmenu.call(this);\n // A new open can start while Web Awesome awaits its hide animation. Its\n // late completion must not leave submenuOpen=true over a hidden submenu.\n if (\n this.submenuOpen &&\n submenu?.hidden &&\n this.isConnected &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n };\n target.openSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n if (!this.closest('wa-dropdown.kui-popup-menu') || !submenu)\n return openSubmenu.call(this);\n\n // WA's animation helper never resolves if asked to add an animation class\n // already on the element. A second open while showing needs no new show;\n // a stale hidden popup needs the old show canceled before reopening.\n if (submenu.classList.contains('show')) {\n if (!submenu.hidden) return;\n submenu.classList.remove('show');\n }\n\n let desired: SubmenuItem | undefined;\n const trackFocus = (event: FocusEvent) => {\n const item = event\n .composedPath()\n .find(\n (node): node is SubmenuItem =>\n node instanceof HTMLElement &&\n node.localName === 'wa-dropdown-item' &&\n node.getAttribute('slot') === 'submenu',\n );\n if (item && this.getSubmenuItems().includes(item)) desired = item;\n };\n submenu.addEventListener('focusin', trackFocus);\n try {\n await openSubmenu.call(this);\n } finally {\n submenu.removeEventListener('focusin', trackFocus);\n }\n\n const items = this.getSubmenuItems();\n if (!desired || desired === items[0]) return;\n const selected = desired;\n // Web Awesome queues its first-item focus after the show animation. This\n // timer follows that one, restoring a user's later arrow choice only if\n // the queued focus actually reset it. Pointer/blur/close paths are left alone.\n window.setTimeout(() => {\n if (\n !this.isConnected ||\n !this.submenuOpen ||\n submenu.hidden ||\n document.activeElement !== items[0]\n )\n return;\n items.forEach((item) => (item.active = item === selected));\n selected.focus({ preventScroll: true });\n }, 0);\n };\n}\n","interface SubmenuItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n}\n\ninterface PopupMenuDropdown extends HTMLElement {\n menu?: HTMLElement;\n positionSubmenu(item: SubmenuItem): void;\n updateSafeTriangleCoordinates?(item: SubmenuItem): void;\n}\n\nconst installed = new WeakSet<object>();\nconst phoneWidth = '(max-width: 480px)';\nconst viewportInset = 8;\nconst menuGap = 4;\n\n/** Place a phone-width submenu beside its parent menu in the vertical axis. */\nexport function phoneSubmenuPosition(\n parent: DOMRect,\n submenu: DOMRect,\n viewport: { width: number; height: number },\n rtl: boolean,\n) {\n const width = Math.min(submenu.width, viewport.width - 2 * viewportInset);\n const height = submenu.height;\n const below = Math.max(\n 0,\n viewport.height - parent.bottom - menuGap - viewportInset,\n );\n const above = Math.max(0, parent.top - menuGap - viewportInset);\n const useBelow = height <= below || (height > above && below >= above);\n const availableHeight = useBelow ? below : above;\n const left = rtl ? parent.right - width : parent.left;\n return {\n left: Math.max(\n viewportInset,\n Math.min(left, viewport.width - viewportInset - width),\n ),\n top: useBelow\n ? parent.bottom + menuGap\n : parent.top - menuGap - Math.min(height, availableHeight),\n maxHeight: availableHeight,\n maxWidth: viewport.width - 2 * viewportInset,\n };\n}\n\nfunction clearPhoneStyles(submenu: HTMLElement) {\n for (const property of [\n 'position',\n 'left',\n 'top',\n 'max-width',\n 'max-height',\n 'box-sizing',\n 'overflow-y',\n ])\n submenu.style.removeProperty(property);\n}\n\n/**\n * Web Awesome measures the submenu for its pointer \"safe triangle\" right after\n * starting placement, but its placement resolves asynchronously, so the\n * triangle kept the submenu's pre-placement edge (often 0,0). The fixed,\n * viewport-sized hit region then fanned away from the submenu, over the\n * parent menu's rows, intercepting their hover and clicks while the diagonal\n * path to the submenu stayed uncovered. Re-measure once the placement lands\n * and again once the submenu's show animation settles.\n */\nfunction remeasureSafeTriangle(dropdown: PopupMenuDropdown, item: SubmenuItem) {\n if (typeof dropdown.updateSafeTriangleCoordinates !== 'function') return;\n const update = () => {\n if (dropdown.isConnected && item.submenuOpen)\n dropdown.updateSafeTriangleCoordinates!(item);\n };\n window.requestAnimationFrame(() => {\n update();\n // The show animation scales the submenu, so measure its settled box too.\n const animations = item.submenuElement?.getAnimations?.() ?? [];\n if (animations.length > 0)\n void Promise.all(animations.map((animation) => animation.finished)).then(\n update,\n () => undefined,\n );\n });\n}\n\n/**\n * Web Awesome's horizontal flip can place a submenu over the parent menu on a\n * phone. Its own auto-update loop calls this method on scroll and resize, so\n * override only PopupMenu's narrow placement and leave native menu navigation\n * and selection intact.\n */\nexport function installPopupMenuSubmenuPlacement(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const positionSubmenu = target.positionSubmenu;\n target.positionSubmenu = function (this: PopupMenuDropdown, item): void {\n if (!this.classList.contains('kui-popup-menu')) {\n positionSubmenu.call(this, item);\n return;\n }\n const submenu = item.submenuElement;\n if (submenu) remeasureSafeTriangle(this, item);\n if (!window.matchMedia(phoneWidth).matches || !submenu || !this.menu) {\n if (submenu) clearPhoneStyles(submenu);\n positionSubmenu.call(this, item);\n return;\n }\n\n // The opening event starts positioning before Web Awesome unhides the\n // submenu. Measure in the next microtask, after showPopover has run.\n window.queueMicrotask(() => {\n if (\n !this.isConnected ||\n !item.submenuOpen ||\n !window.matchMedia(phoneWidth).matches ||\n !this.menu ||\n !submenu.isConnected\n )\n return;\n const parentItem =\n item.parentElement?.localName === 'wa-dropdown-item'\n ? (item.parentElement as SubmenuItem)\n : undefined;\n const parentMenu = parentItem?.submenuElement ?? this.menu;\n submenu.style.position = 'fixed';\n submenu.style.maxWidth = `calc(100vw - ${2 * viewportInset}px)`;\n submenu.style.maxHeight = 'none';\n submenu.style.boxSizing = 'border-box';\n submenu.style.overflowY = 'auto';\n const placement = phoneSubmenuPosition(\n parentMenu.getBoundingClientRect(),\n submenu.getBoundingClientRect(),\n { width: window.innerWidth, height: window.innerHeight },\n window.getComputedStyle(this).direction === 'rtl',\n );\n submenu.style.left = `${placement.left}px`;\n submenu.style.top = `${placement.top}px`;\n submenu.style.maxHeight = `${placement.maxHeight}px`;\n submenu.style.maxWidth = `${placement.maxWidth}px`;\n submenu.setAttribute(\n 'data-placement',\n placement.top >= parentMenu.getBoundingClientRect().bottom\n ? 'bottom-start'\n : 'top-start',\n );\n });\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\n\nimport { installHelpTags } from '../../../../integrations/webawesome/help-tags/install-help-tag.js';\nimport { installDropdownShowFocus } from '../internal/install-dropdown-show-focus.js';\nimport { installPopupMenuKeyboard } from '../internal/install-popup-menu-keyboard.js';\nimport { installPopupMenuLifecycle } from '../internal/install-popup-menu-lifecycle.js';\nimport { installPopupMenuSubmenuFocus } from '../internal/install-popup-menu-submenu-focus.js';\nimport { installPopupMenuSubmenuPlacement } from '../internal/install-popup-menu-submenu-placement.js';\n\ninstallPopupMenuKeyboard(WaDropdown.prototype);\ninstallPopupMenuLifecycle(WaDropdown.prototype);\ninstallDropdownShowFocus(WaDropdown.prototype);\ninstallPopupMenuSubmenuFocus(WaDropdownItem.prototype);\ninstallPopupMenuSubmenuPlacement(WaDropdown.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module registers the\n * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,\n * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard\n * choice through the item's click so delegated `data-action`s run.\n */\nexport const popupMenuElementsRegistered = true;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/actions/popup-menu/internal/reveal-in-scroller.ts","../src/components/actions/popup-menu/internal/install-dropdown-show-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-accessible-name.ts","../src/components/actions/popup-menu/internal/install-popup-menu-keyboard.ts","../src/components/actions/popup-menu/internal/install-popup-menu-lifecycle.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-placement.ts","../src/components/actions/popup-menu/register/popup-menu-register.ts"],"names":["installed"],"mappings":"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","file":"popup-menu-register.js","sourcesContent":["/** The flat-tree parent: the assigned slot, the parent, or a shadow host. */\nfunction composedParent(node: Element): Element | null {\n return (\n node.assignedSlot ??\n node.parentElement ??\n (node.parentNode instanceof ShadowRoot ? node.parentNode.host : null)\n );\n}\n\n/**\n * The nearest scrolling ancestor of `node` across shadow boundaries,\n * following slot assignment, so a slotted menu item reaches the shadow\n * `[part~=\"submenu\"]` or menu panel that scrolls it.\n */\nfunction scrollerOf(node: Element): HTMLElement | undefined {\n for (\n let current = composedParent(node);\n current;\n current = composedParent(current)\n ) {\n if (\n current instanceof HTMLElement &&\n current.scrollHeight > current.clientHeight &&\n /auto|scroll/.test(globalThis.getComputedStyle(current).overflowY)\n )\n return current;\n }\n return undefined;\n}\n\n/**\n * Scroll `item`'s own scroll container by the least amount that brings the\n * item fully into its clip, leaving the page and every other ancestor alone.\n * Pairs with `focus({ preventScroll: true })` when a restore refocuses an\n * item whose container a later focus scrolled away from it.\n */\nexport function revealInScroller(item: HTMLElement): void {\n const scroller = scrollerOf(item);\n if (!scroller) return;\n const box = item.getBoundingClientRect();\n const top = scroller.getBoundingClientRect().top + scroller.clientTop;\n const bottom = top + scroller.clientHeight;\n if (box.top < top) scroller.scrollTop -= top - box.top;\n else if (box.bottom > bottom) scroller.scrollTop += box.bottom - bottom;\n}\n","import { revealInScroller } from './reveal-in-scroller.js';\n\ninterface FocusableDropdownItem extends HTMLElement {\n active: boolean;\n}\n\ninterface FocusableDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n menu?: HTMLElement;\n getItems(): FocusableDropdownItem[];\n showMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\nconst showEpoch = new WeakMap<FocusableDropdown, number>();\n\n/** Preserve item navigation that Web Awesome receives during its show animation. */\nexport function installDropdownShowFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as FocusableDropdown;\n const showMenu = target.showMenu;\n target.showMenu = async function (this: FocusableDropdown): Promise<void> {\n const scoped =\n this.classList.contains('kui-popup-menu') ||\n this.closest('.kui-popup-surface') !== null;\n if (!scoped) return showMenu.call(this);\n\n const epoch = (showEpoch.get(this) ?? 0) + 1;\n showEpoch.set(this, epoch);\n let navigatedItem: FocusableDropdownItem | undefined;\n const rememberFocus = (event: FocusEvent) => {\n const item = event.target;\n if (\n this.menu?.classList.contains('show') &&\n item instanceof HTMLElement &&\n item.localName === 'wa-dropdown-item' &&\n this.contains(item)\n ) {\n navigatedItem = item as FocusableDropdownItem;\n }\n };\n this.addEventListener('focusin', rememberFocus);\n try {\n await showMenu.call(this);\n } finally {\n this.removeEventListener('focusin', rememberFocus);\n }\n if (\n showEpoch.get(this) !== epoch ||\n !this.open ||\n !this.popup?.active ||\n !navigatedItem?.isConnected ||\n !this.contains(navigatedItem)\n )\n return;\n\n const siblings =\n navigatedItem.slot === 'submenu'\n ? Array.from(navigatedItem.parentElement?.children ?? []).filter(\n (item): item is FocusableDropdownItem =>\n item.localName === 'wa-dropdown-item',\n )\n : this.getItems();\n siblings.forEach((item) => {\n item.active = item === navigatedItem;\n });\n // Web Awesome's show focus may have scrolled a long menu back to its\n // first item; reveal the restored item within the menu only.\n navigatedItem.focus({ preventScroll: true });\n revealInScroller(navigatedItem);\n };\n}\n","interface NamedDropdown extends HTMLElement {\n menu?: HTMLElement | null;\n firstUpdated(changed: unknown): void;\n showMenu(): Promise<void>;\n}\n\ninterface NamedDropdownItem extends HTMLElement {\n submenuElement?: HTMLElement | null;\n openSubmenu(): Promise<void>;\n}\n\n/** The host attribute `PopupMenu` renders its menu's accessible name into. */\nexport const POPUP_MENU_LABEL_ATTRIBUTE = 'data-menu-label';\n\nconst installed = new WeakSet<object>();\n\n/** Copy the host's rendered name onto Web Awesome's shadow `role=\"menu\"` panel. */\nfunction syncMenuName(dropdown: NamedDropdown): void {\n const menu = dropdown.menu;\n if (!menu || !dropdown.classList.contains('kui-popup-menu')) return;\n const name = dropdown.getAttribute(POPUP_MENU_LABEL_ATTRIBUTE)?.trim();\n if (name) menu.setAttribute('aria-label', name);\n else menu.removeAttribute('aria-label');\n}\n\n/**\n * Name a `PopupMenu`'s open menu from its trigger. Web Awesome renders the\n * `role=\"menu\"` panel in the dropdown's shadow root, and the trigger's name\n * lives either on an `aria-hidden` context anchor or inside `wa-button`'s own\n * shadow root, so no ID reference can reach across. `PopupMenu` renders the\n * name it already knows as `data-menu-label`; this copies it to the panel as\n * `aria-label` on first render and on every open, so a re-rendered label is\n * current whenever the menu is shown. Lit only owns the attributes it binds,\n * so the imperative name persists.\n */\nexport function installPopupMenuAccessibleName(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as NamedDropdown;\n const firstUpdated = target.firstUpdated;\n const showMenu = target.showMenu;\n target.firstUpdated = function (this: NamedDropdown, changed): void {\n firstUpdated.call(this, changed);\n syncMenuName(this);\n };\n target.showMenu = function (this: NamedDropdown): Promise<void> {\n syncMenuName(this);\n return showMenu.call(this);\n };\n}\n\nconst installedItems = new WeakSet<object>();\n\n/**\n * Name each `PopupMenu` submenu from its parent item. The item's `#submenu`\n * (`role=\"menu\"`) and `#label` share one shadow root, so a real\n * `aria-labelledby` reference follows the item's text.\n */\nexport function installPopupMenuSubmenuName(prototype: object): void {\n if (installedItems.has(prototype)) return;\n installedItems.add(prototype);\n const target = prototype as NamedDropdownItem;\n const openSubmenu = target.openSubmenu;\n target.openSubmenu = function (this: NamedDropdownItem): Promise<void> {\n const submenu = this.submenuElement;\n if (submenu && this.closest('.kui-popup-menu'))\n submenu.setAttribute('aria-labelledby', 'label');\n return openSubmenu.call(this);\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n makeSelection(\n item: HTMLElement & { disabled?: boolean },\n event?: Event,\n ): void;\n}\n\nconst installed = new WeakSet<object>();\n\n/**\n * Route a keyboard choice in a `PopupMenu` through the item's click. Web Awesome\n * selects a pointer choice from the item's click event but a keyboard choice\n * (Enter or Space) directly, so delegated `data-action` click handlers would\n * never run for keyboard users. Clicking the item makes Web Awesome select it\n * exactly as it does for a pointer — one `wa-select`, then close and focus\n * return — while the click reaches the application's delegation. Raw\n * `wa-dropdown`s outside `PopupMenu` are unaffected.\n */\nexport function installPopupMenuKeyboard(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const makeSelection = target.makeSelection;\n target.makeSelection = function (this: PopupMenuDropdown, item, event): void {\n if (\n event instanceof KeyboardEvent &&\n this.classList.contains('kui-popup-menu') &&\n !item.disabled\n ) {\n item.click();\n return;\n }\n makeSelection.call(this, item, event);\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n showMenu(): Promise<void>;\n hideMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Restore Web Awesome dismissal listeners after a rapid close/reopen. */\nexport function installPopupMenuLifecycle(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const showMenu = target.showMenu;\n const hideMenu = target.hideMenu;\n const hiding = new WeakMap<PopupMenuDropdown, { reopened: boolean }>();\n target.showMenu = function (this: PopupMenuDropdown): Promise<void> {\n const transition = hiding.get(this);\n if (\n transition &&\n this.open &&\n this.popup?.active &&\n this.classList.contains('kui-popup-menu')\n ) {\n // Native showMenu would return early while the old popup is active,\n // leaving its document pointer listener absent during the hide.\n this.popup.active = false;\n transition.reopened = true;\n }\n return showMenu.call(this);\n };\n target.hideMenu = async function (this: PopupMenuDropdown): Promise<void> {\n const scoped = this.classList.contains('kui-popup-menu');\n const transition = { reopened: false };\n if (scoped) hiding.set(this, transition);\n await hideMenu.call(this);\n // WA removes its document listeners before awaiting the hide animation.\n // If Lit coalesces the intervening open request, restore the listeners\n // after hide; an explicit showMenu above has already done so immediately.\n if (\n scoped &&\n hiding.get(this) === transition &&\n this.open &&\n this.isConnected &&\n this.popup?.active &&\n !transition.reopened\n ) {\n this.popup.active = false;\n void this.showMenu();\n }\n if (hiding.get(this) === transition) hiding.delete(this);\n };\n}\n","import { revealInScroller } from './reveal-in-scroller.js';\n\ninterface SubmenuItem extends HTMLElement {\n active: boolean;\n}\n\ninterface PopupMenuParentItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n getSubmenuItems(): SubmenuItem[];\n openSubmenu(): Promise<void>;\n closeSubmenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\nconst inputEvents = ['keydown', 'pointerdown'] as const;\n\n/** Preserve a rapid keyboard move past Web Awesome's late first-item focus. */\nexport function installPopupMenuSubmenuFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuParentItem;\n const openSubmenu = target.openSubmenu;\n const closeSubmenu = target.closeSubmenu;\n const submenuOpen = Object.getOwnPropertyDescriptor(prototype, 'submenuOpen');\n if (submenuOpen?.set) {\n Object.defineProperty(prototype, 'submenuOpen', {\n ...submenuOpen,\n set(this: PopupMenuParentItem, value: boolean) {\n const wasOpen = this.submenuOpen;\n submenuOpen.set!.call(this, value);\n // Web Awesome's pointer, click, and ArrowRight paths assign true. A\n // repeated assignment does not schedule updated(), so repair a stale\n // open flag over a hidden submenu at the point of that user action.\n if (\n value &&\n wasOpen &&\n this.submenuElement?.hidden &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n },\n });\n }\n target.closeSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n await closeSubmenu.call(this);\n // A new open can start while Web Awesome awaits its hide animation. Its\n // late completion must not leave submenuOpen=true over a hidden submenu.\n if (\n this.submenuOpen &&\n submenu?.hidden &&\n this.isConnected &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n };\n target.openSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n if (!this.closest('wa-dropdown.kui-popup-menu') || !submenu)\n return openSubmenu.call(this);\n\n // WA's animation helper never resolves if asked to add an animation class\n // already on the element. A second open while showing needs no new show;\n // a stale hidden popup needs the old show canceled before reopening.\n if (submenu.classList.contains('show')) {\n if (!submenu.hidden) return;\n submenu.classList.remove('show');\n }\n\n // Web Awesome hands focus to the first submenu item from a timer it queues\n // once the show animation settles. Browsers may dispatch a keypress\n // between that timer being queued and running, so the handoff can land\n // after the user's own choice. Track the choice until a timer queued\n // behind Web Awesome's runs; a first-item focus outside any key or pointer\n // dispatch is that handoff, not a choice.\n let desired: SubmenuItem | undefined;\n let input: Event | undefined;\n const trackInput = (event: Event) => {\n input = event;\n };\n const trackFocus = (event: FocusEvent) => {\n const item = event\n .composedPath()\n .find(\n (node): node is SubmenuItem =>\n node instanceof HTMLElement &&\n node.localName === 'wa-dropdown-item' &&\n node.getAttribute('slot') === 'submenu',\n );\n const items = this.getSubmenuItems();\n if (!item || !items.includes(item)) return;\n const fromInput = input !== undefined && input.eventPhase !== Event.NONE;\n if (item !== items[0] || fromInput) desired = item;\n };\n for (const type of inputEvents)\n document.addEventListener(type, trackInput, true);\n submenu.addEventListener('focusin', trackFocus);\n try {\n await openSubmenu.call(this);\n } finally {\n // This timer follows Web Awesome's queued first-item focus, restoring a\n // user's later choice only if that queued focus actually reset it.\n // Pointer/blur/close paths are left alone.\n window.setTimeout(() => {\n for (const type of inputEvents)\n document.removeEventListener(type, trackInput, true);\n submenu.removeEventListener('focusin', trackFocus);\n const items = this.getSubmenuItems();\n const selected = desired;\n if (\n !selected ||\n selected === items[0] ||\n !this.isConnected ||\n !this.submenuOpen ||\n submenu.hidden ||\n document.activeElement !== items[0]\n )\n return;\n items.forEach((item) => (item.active = item === selected));\n // The handoff's focus scrolled the submenu to its first item; bring\n // the restored choice back into view within the submenu only.\n selected.focus({ preventScroll: true });\n revealInScroller(selected);\n }, 0);\n }\n };\n}\n","interface SubmenuItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n}\n\ninterface PopupMenuDropdown extends HTMLElement {\n menu?: HTMLElement;\n positionSubmenu(item: SubmenuItem): void;\n updateSafeTriangleCoordinates?(item: SubmenuItem): void;\n}\n\nconst installed = new WeakSet<object>();\nconst phoneWidth = '(max-width: 480px)';\nconst viewportInset = 8;\nconst menuGap = 4;\n\n/** Place a phone-width submenu beside its parent menu in the vertical axis. */\nexport function phoneSubmenuPosition(\n parent: DOMRect,\n submenu: DOMRect,\n viewport: { width: number; height: number },\n rtl: boolean,\n) {\n const width = Math.min(submenu.width, viewport.width - 2 * viewportInset);\n const height = submenu.height;\n const below = Math.max(\n 0,\n viewport.height - parent.bottom - menuGap - viewportInset,\n );\n const above = Math.max(0, parent.top - menuGap - viewportInset);\n const useBelow = height <= below || (height > above && below >= above);\n const availableHeight = useBelow ? below : above;\n const left = rtl ? parent.right - width : parent.left;\n return {\n left: Math.max(\n viewportInset,\n Math.min(left, viewport.width - viewportInset - width),\n ),\n top: useBelow\n ? parent.bottom + menuGap\n : parent.top - menuGap - Math.min(height, availableHeight),\n maxHeight: availableHeight,\n maxWidth: viewport.width - 2 * viewportInset,\n };\n}\n\nfunction clearPhoneStyles(submenu: HTMLElement) {\n for (const property of [\n 'position',\n 'left',\n 'top',\n 'max-width',\n 'max-height',\n 'box-sizing',\n 'overflow-y',\n ])\n submenu.style.removeProperty(property);\n}\n\n/**\n * Web Awesome measures the submenu for its pointer \"safe triangle\" right after\n * starting placement, but its placement resolves asynchronously, so the\n * triangle kept the submenu's pre-placement edge (often 0,0). The fixed,\n * viewport-sized hit region then fanned away from the submenu, over the\n * parent menu's rows, intercepting their hover and clicks while the diagonal\n * path to the submenu stayed uncovered. Re-measure once the placement lands\n * and again once the submenu's show animation settles.\n */\nfunction remeasureSafeTriangle(dropdown: PopupMenuDropdown, item: SubmenuItem) {\n if (typeof dropdown.updateSafeTriangleCoordinates !== 'function') return;\n const update = () => {\n if (dropdown.isConnected && item.submenuOpen)\n dropdown.updateSafeTriangleCoordinates!(item);\n };\n window.requestAnimationFrame(() => {\n update();\n // The show animation scales the submenu, so measure its settled box too.\n const animations = item.submenuElement?.getAnimations?.() ?? [];\n if (animations.length > 0)\n void Promise.all(animations.map((animation) => animation.finished)).then(\n update,\n () => undefined,\n );\n });\n}\n\n/**\n * Web Awesome's horizontal flip can place a submenu over the parent menu on a\n * phone. Its own auto-update loop calls this method on scroll and resize, so\n * override only PopupMenu's narrow placement and leave native menu navigation\n * and selection intact.\n */\nexport function installPopupMenuSubmenuPlacement(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const positionSubmenu = target.positionSubmenu;\n target.positionSubmenu = function (this: PopupMenuDropdown, item): void {\n if (!this.classList.contains('kui-popup-menu')) {\n positionSubmenu.call(this, item);\n return;\n }\n const submenu = item.submenuElement;\n if (submenu) remeasureSafeTriangle(this, item);\n if (!window.matchMedia(phoneWidth).matches || !submenu || !this.menu) {\n if (submenu) clearPhoneStyles(submenu);\n positionSubmenu.call(this, item);\n return;\n }\n\n // The opening event starts positioning before Web Awesome unhides the\n // submenu. Measure in the next microtask, after showPopover has run.\n window.queueMicrotask(() => {\n if (\n !this.isConnected ||\n !item.submenuOpen ||\n !window.matchMedia(phoneWidth).matches ||\n !this.menu ||\n !submenu.isConnected\n )\n return;\n const parentItem =\n item.parentElement?.localName === 'wa-dropdown-item'\n ? (item.parentElement as SubmenuItem)\n : undefined;\n const parentMenu = parentItem?.submenuElement ?? this.menu;\n submenu.style.position = 'fixed';\n submenu.style.maxWidth = `calc(100vw - ${2 * viewportInset}px)`;\n submenu.style.maxHeight = 'none';\n submenu.style.boxSizing = 'border-box';\n submenu.style.overflowY = 'auto';\n const placement = phoneSubmenuPosition(\n parentMenu.getBoundingClientRect(),\n submenu.getBoundingClientRect(),\n { width: window.innerWidth, height: window.innerHeight },\n window.getComputedStyle(this).direction === 'rtl',\n );\n submenu.style.left = `${placement.left}px`;\n submenu.style.top = `${placement.top}px`;\n submenu.style.maxHeight = `${placement.maxHeight}px`;\n submenu.style.maxWidth = `${placement.maxWidth}px`;\n submenu.setAttribute(\n 'data-placement',\n placement.top >= parentMenu.getBoundingClientRect().bottom\n ? 'bottom-start'\n : 'top-start',\n );\n });\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\n\nimport { installHelpTags } from '../../../../integrations/webawesome/help-tags/install-help-tag.js';\nimport { installDropdownShowFocus } from '../internal/install-dropdown-show-focus.js';\nimport {\n installPopupMenuAccessibleName,\n installPopupMenuSubmenuName,\n} from '../internal/install-popup-menu-accessible-name.js';\nimport { installPopupMenuKeyboard } from '../internal/install-popup-menu-keyboard.js';\nimport { installPopupMenuLifecycle } from '../internal/install-popup-menu-lifecycle.js';\nimport { installPopupMenuSubmenuFocus } from '../internal/install-popup-menu-submenu-focus.js';\nimport { installPopupMenuSubmenuPlacement } from '../internal/install-popup-menu-submenu-placement.js';\n\ninstallPopupMenuKeyboard(WaDropdown.prototype);\ninstallPopupMenuLifecycle(WaDropdown.prototype);\ninstallDropdownShowFocus(WaDropdown.prototype);\ninstallPopupMenuSubmenuFocus(WaDropdownItem.prototype);\ninstallPopupMenuSubmenuPlacement(WaDropdown.prototype);\ninstallPopupMenuAccessibleName(WaDropdown.prototype);\ninstallPopupMenuSubmenuName(WaDropdownItem.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module registers the\n * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,\n * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard\n * choice through the item's click so delegated `data-action`s run. It also\n * names each open menu panel from its trigger and each submenu from its item.\n */\nexport const popupMenuElementsRegistered = true;\n"]}
|
package/dist/popup-menu.js
CHANGED
package/dist/row.js
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The block edges at which a scroll owner clears chrome that lies over it.
|
|
3
|
+
*
|
|
4
|
+
* Overlaying chrome publishes how far it covers a region's edge through the
|
|
5
|
+
* inherited `--kui-scroll-clearance-block-start` / `--kui-scroll-clearance-block-end`
|
|
6
|
+
* context (a `DialogSurface` floating footer publishes `block-end`). A scroll
|
|
7
|
+
* owner that opts in adds that clearance to its own block padding and
|
|
8
|
+
* `scroll-padding`, so its content scrolls visibly beneath the chrome while its
|
|
9
|
+
* first and last items, and anything focused or scrolled into view, can still
|
|
10
|
+
* come to rest clear of it.
|
|
11
|
+
*/
|
|
12
|
+
type ScrollClearance = 'block-start' | 'block-end' | 'both';
|
|
13
|
+
|
|
14
|
+
export type { ScrollClearance as S };
|
package/dist/select-register.js
CHANGED
|
@@ -81,6 +81,14 @@ function animateSelectPopup(popup, phase, signal) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
// src/components/forms/select/internal/install-select-lifecycle.ts
|
|
84
|
+
function releaseClosedPopupOverflow(popup) {
|
|
85
|
+
const display = popup.style.getPropertyValue("display");
|
|
86
|
+
const priority = popup.style.getPropertyPriority("display");
|
|
87
|
+
popup.style.setProperty("display", "block");
|
|
88
|
+
void popup.offsetHeight;
|
|
89
|
+
if (display) popup.style.setProperty("display", display, priority);
|
|
90
|
+
else popup.style.removeProperty("display");
|
|
91
|
+
}
|
|
84
92
|
function installSelectLifecycle(prototype) {
|
|
85
93
|
const installed = /* @__PURE__ */ Symbol.for("@kerfjs/ui/select-lifecycle");
|
|
86
94
|
if (Object.prototype.hasOwnProperty.call(prototype, installed)) return;
|
|
@@ -169,6 +177,9 @@ function installSelectLifecycle(prototype) {
|
|
|
169
177
|
} else {
|
|
170
178
|
host.listbox.hidden = true;
|
|
171
179
|
host.popup.active = false;
|
|
180
|
+
void host.popup.updateComplete.then(() => {
|
|
181
|
+
if (!host.open) releaseClosedPopupOverflow(host.popup);
|
|
182
|
+
});
|
|
172
183
|
host.dispatchEvent(new WaAfterHideEvent());
|
|
173
184
|
}
|
|
174
185
|
} finally {
|