@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
|
@@ -69,10 +69,12 @@
|
|
|
69
69
|
):only-child
|
|
70
70
|
)
|
|
71
71
|
) {
|
|
72
|
-
padding-block
|
|
72
|
+
padding-block: var(--kui-edge-inset-block-start)
|
|
73
|
+
var(--kui-edge-inset-block-end);
|
|
73
74
|
padding-inline: var(--kui-edge-inset-inline-start)
|
|
74
75
|
var(--kui-edge-inset-inline-end);
|
|
75
|
-
scroll-padding-block
|
|
76
|
+
scroll-padding-block: var(--kui-edge-inset-block-start)
|
|
77
|
+
var(--kui-edge-inset-block-end);
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
/* A plain scene adds one outer gutter; a sole Pane or layout keeps ownership
|
|
@@ -91,13 +93,15 @@
|
|
|
91
93
|
padding-block-start: calc(
|
|
92
94
|
var(--kui-edge-inset-block-start) + var(--kui-space-xs)
|
|
93
95
|
);
|
|
94
|
-
padding-block-end:
|
|
96
|
+
padding-block-end: calc(
|
|
97
|
+
var(--kui-edge-inset-block-end) + var(--kui-space-xs)
|
|
98
|
+
);
|
|
95
99
|
padding-inline: calc(var(--kui-edge-inset-inline-start) + var(--kui-space-xs))
|
|
96
100
|
calc(var(--kui-edge-inset-inline-end) + var(--kui-space-xs));
|
|
97
101
|
scroll-padding-block: calc(
|
|
98
102
|
var(--kui-edge-inset-block-start) + var(--kui-space-xs)
|
|
99
103
|
)
|
|
100
|
-
var(--kui-space-xs);
|
|
104
|
+
calc(var(--kui-edge-inset-block-end) + var(--kui-space-xs));
|
|
101
105
|
}
|
|
102
106
|
|
|
103
107
|
.kui-tab-scaffold__scene
|
|
@@ -164,6 +168,51 @@
|
|
|
164
168
|
--_kui-tab-scaffold-bar-divider: var(--kui-color-neutral-border-normal);
|
|
165
169
|
}
|
|
166
170
|
|
|
171
|
+
/* `barPresentation="overlay"`: the bar paints the translucent chrome
|
|
172
|
+
material. Once `wireTabNavigator` has measured the live bar
|
|
173
|
+
(`data-bar-overlay="measured"`, with its border-box block size, bottom safe
|
|
174
|
+
area and 1px top edge included, published on this root), the bar lies over
|
|
175
|
+
the scenes' bottom edge and the scenes hand that size to their content as
|
|
176
|
+
the block-end edge context (outranking the docked 0px above): a plain scene
|
|
177
|
+
pads and scroll-pads by it, and a sole Pane or layout (a NavStack, whose own
|
|
178
|
+
bottom toolbar then sits just above the bar) clears it itself. Content
|
|
179
|
+
scrolls visibly beneath the bar while its last item rests clear of it.
|
|
180
|
+
Unwired, the bar stays docked. */
|
|
181
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"] > .kui-tab-scaffold__bar {
|
|
182
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
183
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
184
|
+
background: var(--kui-chrome-material);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"] {
|
|
188
|
+
position: relative;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"]
|
|
192
|
+
> .kui-tab-scaffold__bar {
|
|
193
|
+
position: absolute;
|
|
194
|
+
z-index: 2;
|
|
195
|
+
inset-block-end: 0;
|
|
196
|
+
/* Like the NavStack overlay bars, it ends where a classic scrollbar's
|
|
197
|
+
track begins, so the thumb and buttons stay visible and usable. */
|
|
198
|
+
inset-inline: 0 var(--_kui-tab-scaffold-bar-scrollbar-inline-size, 0px);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"]
|
|
202
|
+
> .kui-tab-scaffold__scenes {
|
|
203
|
+
--kui-edge-inset-block-end: var(--_kui-tab-scaffold-bar-block-size, 0px);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@media (forced-colors: active) {
|
|
207
|
+
/* Its always-present 1px top border becomes the visible edge. */
|
|
208
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"] > .kui-tab-scaffold__bar {
|
|
209
|
+
-webkit-backdrop-filter: none;
|
|
210
|
+
backdrop-filter: none;
|
|
211
|
+
background: Canvas;
|
|
212
|
+
border-block-start-color: CanvasText;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
167
216
|
.kui-tab-scaffold__tab {
|
|
168
217
|
display: flex;
|
|
169
218
|
flex: 1 1 0;
|
|
@@ -185,6 +234,32 @@
|
|
|
185
234
|
color: var(--kui-color-brand-on-quiet);
|
|
186
235
|
}
|
|
187
236
|
|
|
237
|
+
/* Over the material, content of any color passes beneath the bar. Both label
|
|
238
|
+
colors fall below AA over the worst case (the material over black in light,
|
|
239
|
+
white in dark): the quiet unselected color, and in light the brand selected
|
|
240
|
+
color (about 3.2:1). An unselected tab lifts halfway toward the normal text
|
|
241
|
+
color, as an overlaid ToolbarText description does, and the selected tab
|
|
242
|
+
mixes 40% of it into the brand color, staying plainly the brand hue. */
|
|
243
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"]
|
|
244
|
+
> .kui-tab-scaffold__bar
|
|
245
|
+
> .kui-tab-scaffold__tab:not([aria-selected="true"]) {
|
|
246
|
+
color: color-mix(
|
|
247
|
+
in srgb,
|
|
248
|
+
var(--kui-color-text-quiet),
|
|
249
|
+
var(--kui-color-text) 50%
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"]
|
|
254
|
+
> .kui-tab-scaffold__bar
|
|
255
|
+
> .kui-tab-scaffold__tab[aria-selected="true"] {
|
|
256
|
+
color: color-mix(
|
|
257
|
+
in srgb,
|
|
258
|
+
var(--kui-color-brand-on-quiet),
|
|
259
|
+
var(--kui-color-text) 40%
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
188
263
|
.kui-tab-scaffold__tab:focus-visible {
|
|
189
264
|
outline: var(--kui-focus-ring);
|
|
190
265
|
outline-offset: -2px;
|
|
@@ -172,10 +172,19 @@
|
|
|
172
172
|
.kui-token-search__clear:hover,
|
|
173
173
|
.kui-token-search__clear:focus-visible,
|
|
174
174
|
.kui-token-search__trailing-action:hover,
|
|
175
|
-
.kui-token-search__trailing-action:focus-visible
|
|
175
|
+
.kui-token-search__trailing-action:focus-visible,
|
|
176
|
+
.kui-token-search__trailing-action[aria-expanded="true"],
|
|
177
|
+
.kui-token-search__trailing-action[aria-pressed="true"] {
|
|
176
178
|
background: color-mix(in srgb, currentColor 12%, transparent);
|
|
177
179
|
}
|
|
178
180
|
|
|
181
|
+
/* An open disclosure or an on toggle keeps the hover fill and reads at full
|
|
182
|
+
text strength, so its state stays visible after the pointer leaves. */
|
|
183
|
+
.kui-token-search__trailing-action[aria-expanded="true"],
|
|
184
|
+
.kui-token-search__trailing-action[aria-pressed="true"] {
|
|
185
|
+
color: var(--kui-color-text);
|
|
186
|
+
}
|
|
187
|
+
|
|
179
188
|
.kui-token-search__token button:focus-visible,
|
|
180
189
|
.kui-token-search__clear:focus-visible,
|
|
181
190
|
.kui-token-search__trailing-action:focus-visible {
|
|
@@ -386,7 +395,9 @@
|
|
|
386
395
|
box-shadow: none;
|
|
387
396
|
}
|
|
388
397
|
|
|
389
|
-
.kui-token-search[data-presentation="toolbar-group"] .kui-token-search__clear
|
|
398
|
+
.kui-token-search[data-presentation="toolbar-group"] .kui-token-search__clear,
|
|
399
|
+
.kui-token-search[data-presentation="toolbar-group"]
|
|
400
|
+
.kui-token-search__trailing-action {
|
|
390
401
|
border-radius: var(--kui-control-highlight-radius);
|
|
391
402
|
}
|
|
392
403
|
|
|
@@ -139,9 +139,12 @@
|
|
|
139
139
|
);
|
|
140
140
|
--kui-toolbar-control-border: var(--kui-toolbar-control-dark-border, #353536);
|
|
141
141
|
--kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
|
|
142
|
+
/* A 14% surface wash over the loud fill: visible hover feedback that keeps
|
|
143
|
+
the on-loud icon above 3:1 over a light page (about 3.4:1; a 28% wash
|
|
144
|
+
measured 2.7:1) and well above it in dark (about 5.8:1). */
|
|
142
145
|
--kui-toolbar-control-hover-background: color-mix(
|
|
143
146
|
in srgb,
|
|
144
|
-
var(--kui-color-surface)
|
|
147
|
+
var(--kui-color-surface) 14%,
|
|
145
148
|
transparent
|
|
146
149
|
);
|
|
147
150
|
}
|
|
@@ -384,6 +387,39 @@
|
|
|
384
387
|
background: transparent;
|
|
385
388
|
}
|
|
386
389
|
|
|
390
|
+
/* In overlay NavStack chrome (`chromePresentation="overlay"`), an overlay
|
|
391
|
+
NavStack bottom toolbar (`bottomToolbarPresentation="overlay"`), cross-fading
|
|
392
|
+
copies included, an overlay Pane header (`headerPresentation="overlay"`), or
|
|
393
|
+
a DialogSurface floating header's actions (`headerPresentation="floating"`),
|
|
394
|
+
the group sits on the translucent chrome material with arbitrary content
|
|
395
|
+
scrolling beneath it. Its quiet control color over its own translucent fill
|
|
396
|
+
falls below AA there over the worst-case backdrop (about 3.0:1 in light
|
|
397
|
+
over black, 3.5:1 in dark over white), so an untoned group's controls take
|
|
398
|
+
the normal text color (well above 4.5:1 in both), as an untoned
|
|
399
|
+
ToolbarText's title does. A dark-toned group (or an avatar scrim) keeps its
|
|
400
|
+
own loud colors. */
|
|
401
|
+
.kui-pane[data-header-presentation="overlay"]
|
|
402
|
+
> .kui-pane__header
|
|
403
|
+
.kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
|
|
404
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
405
|
+
> wa-dialog
|
|
406
|
+
> .kui-toolbar-control-group[slot="header-actions"]:not(
|
|
407
|
+
[data-tone="dark"],
|
|
408
|
+
[data-scrim="true"]
|
|
409
|
+
),
|
|
410
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
411
|
+
> wa-dialog
|
|
412
|
+
> [slot="header-actions"]
|
|
413
|
+
.kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
|
|
414
|
+
.kui-nav-stack[data-chrome-presentation="overlay"]
|
|
415
|
+
> .kui-nav-stack__chrome
|
|
416
|
+
.kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
|
|
417
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
|
|
418
|
+
> .kui-nav-stack__bottom
|
|
419
|
+
.kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]) {
|
|
420
|
+
--kui-toolbar-control-color: var(--kui-color-text);
|
|
421
|
+
}
|
|
422
|
+
|
|
387
423
|
/* `selectedChrome="none"`: a pressed control paints like its unpressed
|
|
388
424
|
neighbors, for an icon-state toggle whose glyph already shows the state.
|
|
389
425
|
One button opts out alone with `data-selected-chrome="none"`. After the
|
|
@@ -732,6 +768,44 @@
|
|
|
732
768
|
background: transparent;
|
|
733
769
|
}
|
|
734
770
|
|
|
771
|
+
/* A lone control's hover replaces the whole group's fill (above). A dark
|
|
772
|
+
group's hover tint is a translucent surface wash meant to lie OVER its loud
|
|
773
|
+
fill, as it does on one control of a dark group; replacing the fill with it
|
|
774
|
+
left a near-white circle behind the dark tone's white icon on a light page
|
|
775
|
+
(about 1.3:1). So a dark lone group keeps its fill and paints the tint over
|
|
776
|
+
it as an image layer. Avatar groups paint their image as the background and
|
|
777
|
+
keep the plain rule. */
|
|
778
|
+
.kui-toolbar-control-group[data-tone="dark"][data-single="true"]:not(
|
|
779
|
+
[data-content="avatar"]
|
|
780
|
+
):has(
|
|
781
|
+
> :is(
|
|
782
|
+
button:not(:disabled, [aria-disabled="true"]),
|
|
783
|
+
wa-button:not([disabled]),
|
|
784
|
+
.kui-popup-menu,
|
|
785
|
+
wa-dropdown:not(.kui-popup-menu),
|
|
786
|
+
.kui-select,
|
|
787
|
+
.kui-toolbar-action-link
|
|
788
|
+
)
|
|
789
|
+
):hover,
|
|
790
|
+
.kui-toolbar-control-group[data-tone="dark"]:not(
|
|
791
|
+
[data-single="true"],
|
|
792
|
+
[data-content="avatar"]
|
|
793
|
+
):has(
|
|
794
|
+
> :is(
|
|
795
|
+
button:not(:disabled, [aria-disabled="true"]),
|
|
796
|
+
wa-button:not([disabled]),
|
|
797
|
+
.kui-select,
|
|
798
|
+
.kui-toolbar-action-link
|
|
799
|
+
):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
|
|
800
|
+
:nth-last-child(1 of :not([data-toolbar-visibility-state]))
|
|
801
|
+
)
|
|
802
|
+
):hover {
|
|
803
|
+
background-color: var(--kui-toolbar-control-background);
|
|
804
|
+
background-image: linear-gradient(
|
|
805
|
+
var(--kui-toolbar-control-hover-background) 0 0
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
|
|
735
809
|
/* A toolbar Select beside other controls highlights its own pill on hover
|
|
736
810
|
(select.css); a lone Select instead lifts the whole group (above). */
|
|
737
811
|
|
|
@@ -129,6 +129,81 @@ button.kui-toolbar-text:focus-visible {
|
|
|
129
129
|
font-size: var(--kui-font-2xs);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
/* A lone title in a balanced center is a navigation bar's title (a NavStack
|
|
133
|
+
view beside its back control): it keeps the page-title color it had leading
|
|
134
|
+
at the root, at whatever size, so the title does not dim as it centers. */
|
|
135
|
+
.kui-toolbar[data-center-align="balanced"]
|
|
136
|
+
> .kui-toolbar__center
|
|
137
|
+
> .kui-toolbar-text:only-child:not([data-tone]) {
|
|
138
|
+
color: var(--kui-color-text);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* In an overlay Pane header (`headerPresentation="overlay"`), overlay
|
|
142
|
+
NavStack chrome (`chromePresentation="overlay"`), or an overlay NavStack
|
|
143
|
+
bottom toolbar (`bottomToolbarPresentation="overlay"`), cross-fading
|
|
144
|
+
copies included, the title sits on the translucent chrome material with
|
|
145
|
+
arbitrary content scrolling beneath it. Quiet colors fall below AA there
|
|
146
|
+
over the worst-case backdrop (the material over black in light, white in
|
|
147
|
+
dark): the default title color
|
|
148
|
+
measures about 3.8:1 (light) and the description about 3.2:1 (light) and
|
|
149
|
+
4.1:1 (dark). The title takes the normal text color (about 10.5:1 and
|
|
150
|
+
8.3:1), and the description lifts halfway toward it (about 5.9:1 in both
|
|
151
|
+
themes), so it still reads as secondary but keeps AA. A ToolbarText in a
|
|
152
|
+
DialogSurface floating header (`headerPresentation="floating"`), slotted
|
|
153
|
+
as the dialog's label or into its header actions, sits on the raised chrome
|
|
154
|
+
material and takes the same lift. See docs/accessibility.md "Chrome
|
|
155
|
+
material". */
|
|
156
|
+
.kui-pane[data-header-presentation="overlay"]
|
|
157
|
+
> .kui-pane__header
|
|
158
|
+
.kui-toolbar-text:not([data-tone]),
|
|
159
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
160
|
+
> wa-dialog
|
|
161
|
+
> .kui-toolbar-text:is([slot="label"], [slot="header-actions"]):not(
|
|
162
|
+
[data-tone]
|
|
163
|
+
),
|
|
164
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
165
|
+
> wa-dialog
|
|
166
|
+
> :is([slot="label"], [slot="header-actions"])
|
|
167
|
+
.kui-toolbar-text:not([data-tone]),
|
|
168
|
+
.kui-nav-stack[data-chrome-presentation="overlay"]
|
|
169
|
+
> .kui-nav-stack__chrome
|
|
170
|
+
.kui-toolbar-text:not([data-tone]),
|
|
171
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
|
|
172
|
+
> .kui-nav-stack__bottom
|
|
173
|
+
.kui-toolbar-text:not([data-tone]) {
|
|
174
|
+
color: var(--kui-color-text);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.kui-pane[data-header-presentation="overlay"]
|
|
178
|
+
> .kui-pane__header
|
|
179
|
+
.kui-toolbar-text:not([data-tone])
|
|
180
|
+
.kui-toolbar-text__description,
|
|
181
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
182
|
+
> wa-dialog
|
|
183
|
+
> .kui-toolbar-text:is([slot="label"], [slot="header-actions"]):not(
|
|
184
|
+
[data-tone]
|
|
185
|
+
)
|
|
186
|
+
.kui-toolbar-text__description,
|
|
187
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
188
|
+
> wa-dialog
|
|
189
|
+
> :is([slot="label"], [slot="header-actions"])
|
|
190
|
+
.kui-toolbar-text:not([data-tone])
|
|
191
|
+
.kui-toolbar-text__description,
|
|
192
|
+
.kui-nav-stack[data-chrome-presentation="overlay"]
|
|
193
|
+
> .kui-nav-stack__chrome
|
|
194
|
+
.kui-toolbar-text:not([data-tone])
|
|
195
|
+
.kui-toolbar-text__description,
|
|
196
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
|
|
197
|
+
> .kui-nav-stack__bottom
|
|
198
|
+
.kui-toolbar-text:not([data-tone])
|
|
199
|
+
.kui-toolbar-text__description {
|
|
200
|
+
color: color-mix(
|
|
201
|
+
in srgb,
|
|
202
|
+
var(--kui-color-text-quiet),
|
|
203
|
+
var(--kui-color-text) 50%
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
132
207
|
.kui-toolbar-text[data-tone="dark"] {
|
|
133
208
|
color: var(--kui-color-neutral-on-loud);
|
|
134
209
|
}
|
package/dist/styles/toolbar.css
CHANGED
|
@@ -97,6 +97,25 @@
|
|
|
97
97
|
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
/* A lone title in a balanced center (a navigation bar's title beside a back
|
|
101
|
+
control) centers on the toolbar while the side zones leave room, moves away
|
|
102
|
+
from a wider side when they do not, and truncates before it reaches a side
|
|
103
|
+
control: the side tracks keep their content width and the title's track
|
|
104
|
+
may shrink to nothing, so the title, unlike center controls, gives way
|
|
105
|
+
first. */
|
|
106
|
+
.kui-toolbar[data-center-align="balanced"][data-has-center="true"]:has(
|
|
107
|
+
> .kui-toolbar__center > .kui-toolbar-text:only-child
|
|
108
|
+
) {
|
|
109
|
+
grid-template-columns:
|
|
110
|
+
minmax(max-content, 1fr) minmax(0, max-content)
|
|
111
|
+
minmax(max-content, 1fr);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.kui-toolbar[data-center-align="balanced"]
|
|
115
|
+
> .kui-toolbar__center:has(> .kui-toolbar-text:only-child) {
|
|
116
|
+
min-width: 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
100
119
|
.kui-toolbar[data-responsive="trailing-priority"][data-has-center="false"]:has(
|
|
101
120
|
> .kui-toolbar__trailing [data-expanded="true"]
|
|
102
121
|
) {
|
|
@@ -484,6 +484,24 @@
|
|
|
484
484
|
gap: var(--kui-layout-item-gap, 0.5rem);
|
|
485
485
|
}
|
|
486
486
|
|
|
487
|
+
/* The built-in close control matches a borderless single
|
|
488
|
+
ToolbarControlGroup button (the close in a toolbar-composed dialog): a
|
|
489
|
+
40px circle, no border, and the toolbar's neutral hover fill, in place of
|
|
490
|
+
Web Awesome's 35px rounded square. */
|
|
491
|
+
:is(wa-dialog, wa-drawer)::part(close-button__base) {
|
|
492
|
+
width: 2.5rem;
|
|
493
|
+
min-width: 2.5rem;
|
|
494
|
+
height: 2.5rem;
|
|
495
|
+
padding: 0;
|
|
496
|
+
border-color: transparent;
|
|
497
|
+
border-radius: var(--kui-radius-circle);
|
|
498
|
+
justify-content: center;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
:is(wa-dialog, wa-drawer)::part(close-button__base):hover {
|
|
502
|
+
background-color: var(--kui-color-neutral-fill-normal);
|
|
503
|
+
}
|
|
504
|
+
|
|
487
505
|
/* Dialogs that provide their own dismissal affordance can opt out of Web
|
|
488
506
|
Awesome's header action region without reaching through the shadow root.
|
|
489
507
|
`header-actions` is a directly exported part, so it must be targeted from
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Importing this module registers wa-dialog, repairs wrapped native names, and
|
|
3
|
+
* measures each DialogSurface header and footer for a floating header's or
|
|
4
|
+
* footer's body clearance, and shows a floating header's divider while
|
|
5
|
+
* content is scrolled beneath it.
|
|
6
|
+
*/
|
|
2
7
|
declare const surfaceScaffoldElementsRegistered = true;
|
|
3
8
|
|
|
4
9
|
export { surfaceScaffoldElementsRegistered };
|
|
@@ -2,13 +2,56 @@ import WaDialog from '@awesome.me/webawesome/dist/components/dialog/dialog.js';
|
|
|
2
2
|
|
|
3
3
|
// src/components/surfaces/surface-scaffold/register/surface-scaffold-register.ts
|
|
4
4
|
|
|
5
|
-
// src/components/surfaces/surface-scaffold/internal/install-
|
|
5
|
+
// src/components/surfaces/surface-scaffold/internal/install-chrome-block-size.ts
|
|
6
|
+
var HEADER_BLOCK_SIZE_PROPERTY = "--_kui-dialog-surface-header-block-size";
|
|
7
|
+
var FOOTER_BLOCK_SIZE_PROPERTY = "--_kui-dialog-surface-footer-block-size";
|
|
8
|
+
var CHROME_PARTS = [
|
|
9
|
+
["header", HEADER_BLOCK_SIZE_PROPERTY],
|
|
10
|
+
["footer", FOOTER_BLOCK_SIZE_PROPERTY]
|
|
11
|
+
];
|
|
6
12
|
var installed = /* @__PURE__ */ new WeakSet();
|
|
13
|
+
var observedParts = /* @__PURE__ */ new WeakSet();
|
|
14
|
+
function installChromeBlockSize(prototype) {
|
|
15
|
+
if (installed.has(prototype)) return;
|
|
16
|
+
installed.add(prototype);
|
|
17
|
+
const target = prototype;
|
|
18
|
+
const update = target.update;
|
|
19
|
+
target.update = function(changed) {
|
|
20
|
+
update.call(this, changed);
|
|
21
|
+
if (!this.parentElement?.classList.contains("kui-dialog-surface")) return;
|
|
22
|
+
const panel = this.dialog;
|
|
23
|
+
if (!panel) return;
|
|
24
|
+
for (const [part, property] of CHROME_PARTS) {
|
|
25
|
+
const element = this.shadowRoot?.querySelector(`[part~="${part}"]`);
|
|
26
|
+
if (element) observePart(panel, element, property);
|
|
27
|
+
else panel.style.removeProperty(property);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function observePart(panel, element, property) {
|
|
32
|
+
if (observedParts.has(element)) return;
|
|
33
|
+
observedParts.add(element);
|
|
34
|
+
const publish = (blockSize) => {
|
|
35
|
+
const value = `${blockSize}px`;
|
|
36
|
+
if (panel.style.getPropertyValue(property) !== value)
|
|
37
|
+
panel.style.setProperty(property, value);
|
|
38
|
+
};
|
|
39
|
+
publish(element.getBoundingClientRect().height);
|
|
40
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
41
|
+
new ResizeObserver((entries) => {
|
|
42
|
+
if (!element.isConnected) return;
|
|
43
|
+
const box = entries[entries.length - 1]?.borderBoxSize?.[0];
|
|
44
|
+
publish(box ? box.blockSize : element.getBoundingClientRect().height);
|
|
45
|
+
}).observe(element);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/components/surfaces/surface-scaffold/internal/install-dialog-label.ts
|
|
49
|
+
var installed2 = /* @__PURE__ */ new WeakSet();
|
|
7
50
|
var observed = /* @__PURE__ */ new WeakSet();
|
|
8
51
|
var ownedNames = /* @__PURE__ */ new WeakMap();
|
|
9
52
|
function installDialogLabel(prototype) {
|
|
10
|
-
if (
|
|
11
|
-
|
|
53
|
+
if (installed2.has(prototype)) return;
|
|
54
|
+
installed2.add(prototype);
|
|
12
55
|
const target = prototype;
|
|
13
56
|
const update = target.update;
|
|
14
57
|
target.update = function(changed) {
|
|
@@ -56,8 +99,51 @@ function syncDialogLabel(host) {
|
|
|
56
99
|
ownedNames.set(panel, { attribute, value });
|
|
57
100
|
}
|
|
58
101
|
|
|
102
|
+
// src/components/surfaces/surface-scaffold/internal/install-header-scroll-divider.ts
|
|
103
|
+
var HEADER_DIVIDER_PROPERTY = "--_kui-dialog-surface-header-divider";
|
|
104
|
+
var SHOWN = "var(--_kui-dialog-surface-header-divider-color)";
|
|
105
|
+
var THRESHOLD = 1;
|
|
106
|
+
var installed3 = /* @__PURE__ */ new WeakSet();
|
|
107
|
+
var wiredPanels = /* @__PURE__ */ new WeakSet();
|
|
108
|
+
function installHeaderScrollDivider(prototype) {
|
|
109
|
+
if (installed3.has(prototype)) return;
|
|
110
|
+
installed3.add(prototype);
|
|
111
|
+
const target = prototype;
|
|
112
|
+
const update = target.update;
|
|
113
|
+
target.update = function(changed) {
|
|
114
|
+
update.call(this, changed);
|
|
115
|
+
if (!this.parentElement?.classList.contains("kui-dialog-surface")) return;
|
|
116
|
+
const panel = this.dialog;
|
|
117
|
+
if (panel && !wiredPanels.has(panel)) wire(this, panel);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function wire(host, panel) {
|
|
121
|
+
wiredPanels.add(panel);
|
|
122
|
+
const scrolled = /* @__PURE__ */ new Set();
|
|
123
|
+
const onScroll = (event) => {
|
|
124
|
+
const scroller = event.target;
|
|
125
|
+
if (!(scroller instanceof Element)) return;
|
|
126
|
+
const header = host.shadowRoot?.querySelector('[part~="header"]');
|
|
127
|
+
const floating = host.parentElement?.getAttribute("data-header-presentation") === "floating";
|
|
128
|
+
if (floating && header && scroller.scrollTop > THRESHOLD && // Only a scroller that reaches beneath the header.
|
|
129
|
+
scroller.getBoundingClientRect().top <= header.getBoundingClientRect().bottom)
|
|
130
|
+
scrolled.add(scroller);
|
|
131
|
+
else scrolled.delete(scroller);
|
|
132
|
+
for (const element of scrolled)
|
|
133
|
+
if (!element.isConnected) scrolled.delete(element);
|
|
134
|
+
const value = scrolled.size > 0 ? SHOWN : "";
|
|
135
|
+
if (panel.style.getPropertyValue(HEADER_DIVIDER_PROPERTY) === value) return;
|
|
136
|
+
if (value) panel.style.setProperty(HEADER_DIVIDER_PROPERTY, value);
|
|
137
|
+
else panel.style.removeProperty(HEADER_DIVIDER_PROPERTY);
|
|
138
|
+
};
|
|
139
|
+
for (const root of [panel, host])
|
|
140
|
+
root.addEventListener("scroll", onScroll, { capture: true, passive: true });
|
|
141
|
+
}
|
|
142
|
+
|
|
59
143
|
// src/components/surfaces/surface-scaffold/register/surface-scaffold-register.ts
|
|
60
144
|
installDialogLabel(WaDialog.prototype);
|
|
145
|
+
installChromeBlockSize(WaDialog.prototype);
|
|
146
|
+
installHeaderScrollDivider(WaDialog.prototype);
|
|
61
147
|
var surfaceScaffoldElementsRegistered = true;
|
|
62
148
|
|
|
63
149
|
export { surfaceScaffoldElementsRegistered };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/surfaces/surface-scaffold/internal/install-dialog-label.ts","../src/components/surfaces/surface-scaffold/register/surface-scaffold-register.ts"],"names":["attribute","value"],"mappings":"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","file":"surface-scaffold-register.js","sourcesContent":["interface NamedDialog extends HTMLElement {\n dialog?: HTMLDialogElement;\n label: string;\n withoutHeader: boolean;\n update(changed: unknown): void;\n}\n\nconst installed = new WeakSet<object>();\nconst observed = new WeakSet<HTMLElement>();\nconst ownedNames = new WeakMap<\n HTMLElement,\n { attribute: string; value: string }\n>();\n\n/** Repair Web Awesome's missing native dialog name before its first modal open. */\nexport function installDialogLabel(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as NamedDialog;\n const update = target.update;\n target.update = function (this: NamedDialog, changed: unknown): void {\n update.call(this, changed);\n if (!this.parentElement?.classList.contains('kui-dialog-surface')) return;\n if (!observed.has(this)) {\n observed.add(this);\n new MutationObserver(() => syncDialogLabel(this)).observe(this, {\n attributes: true,\n attributeFilter: ['aria-label', 'role'],\n });\n }\n syncDialogLabel(this);\n };\n}\n\nfunction syncDialogLabel(host: NamedDialog): void {\n if (!host.parentElement?.classList.contains('kui-dialog-surface')) return;\n const panel = host.dialog;\n if (!panel) return;\n const previous = ownedNames.get(panel);\n // A host that is itself the named dialog (an explicit role=\"dialog\" plus\n // its own name) owns that name; naming the panel too would expose two\n // dialogs with one name.\n if (/^(alert)?dialog$/.test(host.getAttribute('role')?.trim() ?? '')) {\n if (previous && panel.getAttribute(previous.attribute) === previous.value)\n panel.removeAttribute(previous.attribute);\n ownedNames.delete(panel);\n return;\n }\n const externalName = ['aria-label', 'aria-labelledby'].some((attribute) => {\n const value = panel.getAttribute(attribute);\n return (\n value !== null &&\n !(previous?.attribute === attribute && previous.value === value)\n );\n });\n if (externalName) {\n if (previous && panel.getAttribute(previous.attribute) === previous.value)\n panel.removeAttribute(previous.attribute);\n ownedNames.delete(panel);\n return;\n }\n const explicit = host.getAttribute('aria-label')?.trim();\n const title = host.shadowRoot?.getElementById('title');\n const attribute =\n !explicit && !host.withoutHeader && title\n ? 'aria-labelledby'\n : 'aria-label';\n const value =\n attribute === 'aria-labelledby' ? 'title' : explicit || host.label;\n if (previous && previous.attribute !== attribute)\n panel.removeAttribute(previous.attribute);\n if (panel.getAttribute(attribute) !== value)\n panel.setAttribute(attribute, value);\n ownedNames.set(panel, { attribute, value });\n}\n","import WaDialog from '@awesome.me/webawesome/dist/components/dialog/dialog.js';\n\nimport { installDialogLabel } from '../internal/install-dialog-label.js';\n\ninstallDialogLabel(WaDialog.prototype);\n\n/** Importing this module registers wa-dialog and repairs wrapped native names. */\nexport const surfaceScaffoldElementsRegistered = true;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/surfaces/surface-scaffold/internal/install-chrome-block-size.ts","../src/components/surfaces/surface-scaffold/internal/install-dialog-label.ts","../src/components/surfaces/surface-scaffold/internal/install-header-scroll-divider.ts","../src/components/surfaces/surface-scaffold/register/surface-scaffold-register.ts"],"names":["installed","attribute","value"],"mappings":"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","file":"surface-scaffold-register.js","sourcesContent":["interface ChromeDialog extends HTMLElement {\n dialog?: HTMLDialogElement;\n update(changed: unknown): void;\n}\n\n/** The panel variable a floating header's body clearance reads. */\nexport const HEADER_BLOCK_SIZE_PROPERTY =\n '--_kui-dialog-surface-header-block-size';\n\n/** The panel variable a floating footer's body clearance reads. */\nexport const FOOTER_BLOCK_SIZE_PROPERTY =\n '--_kui-dialog-surface-footer-block-size';\n\n/** Each measured dialog part, with the panel variable it publishes. */\nconst CHROME_PARTS = [\n ['header', HEADER_BLOCK_SIZE_PROPERTY],\n ['footer', FOOTER_BLOCK_SIZE_PROPERTY],\n] as const;\n\nconst installed = new WeakSet<object>();\nconst observedParts = new WeakSet<Element>();\n\n/**\n * Publish a DialogSurface's header and footer block sizes on its shadow\n * panel, where Kerf rerenders never reach, so a floating header's or footer's\n * body clearance follows that chrome as its content grows, wraps, or hides.\n */\nexport function installChromeBlockSize(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as ChromeDialog;\n const update = target.update;\n target.update = function (this: ChromeDialog, changed: unknown): void {\n update.call(this, changed);\n if (!this.parentElement?.classList.contains('kui-dialog-surface')) return;\n const panel = this.dialog;\n if (!panel) return;\n for (const [part, property] of CHROME_PARTS) {\n const element = this.shadowRoot?.querySelector(`[part~=\"${part}\"]`);\n // Web Awesome drops the header part under `without-header`; with no\n // part to clear, the floating clearance falls back to zero.\n if (element) observePart(panel, element, property);\n else panel.style.removeProperty(property);\n }\n };\n}\n\nfunction observePart(\n panel: HTMLElement,\n element: Element,\n property: string,\n): void {\n if (observedParts.has(element)) return;\n observedParts.add(element);\n const publish = (blockSize: number): void => {\n const value = `${blockSize}px`;\n if (panel.style.getPropertyValue(property) !== value)\n panel.style.setProperty(property, value);\n };\n publish(element.getBoundingClientRect().height);\n if (typeof ResizeObserver === 'undefined') return;\n new ResizeObserver((entries) => {\n // A part Web Awesome has since removed no longer owns the variable.\n if (!element.isConnected) return;\n const box = entries[entries.length - 1]?.borderBoxSize?.[0];\n publish(box ? box.blockSize : element.getBoundingClientRect().height);\n }).observe(element);\n}\n","interface NamedDialog extends HTMLElement {\n dialog?: HTMLDialogElement;\n label: string;\n withoutHeader: boolean;\n update(changed: unknown): void;\n}\n\nconst installed = new WeakSet<object>();\nconst observed = new WeakSet<HTMLElement>();\nconst ownedNames = new WeakMap<\n HTMLElement,\n { attribute: string; value: string }\n>();\n\n/** Repair Web Awesome's missing native dialog name before its first modal open. */\nexport function installDialogLabel(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as NamedDialog;\n const update = target.update;\n target.update = function (this: NamedDialog, changed: unknown): void {\n update.call(this, changed);\n if (!this.parentElement?.classList.contains('kui-dialog-surface')) return;\n if (!observed.has(this)) {\n observed.add(this);\n new MutationObserver(() => syncDialogLabel(this)).observe(this, {\n attributes: true,\n attributeFilter: ['aria-label', 'role'],\n });\n }\n syncDialogLabel(this);\n };\n}\n\nfunction syncDialogLabel(host: NamedDialog): void {\n if (!host.parentElement?.classList.contains('kui-dialog-surface')) return;\n const panel = host.dialog;\n if (!panel) return;\n const previous = ownedNames.get(panel);\n // A host that is itself the named dialog (an explicit role=\"dialog\" plus\n // its own name) owns that name; naming the panel too would expose two\n // dialogs with one name.\n if (/^(alert)?dialog$/.test(host.getAttribute('role')?.trim() ?? '')) {\n if (previous && panel.getAttribute(previous.attribute) === previous.value)\n panel.removeAttribute(previous.attribute);\n ownedNames.delete(panel);\n return;\n }\n const externalName = ['aria-label', 'aria-labelledby'].some((attribute) => {\n const value = panel.getAttribute(attribute);\n return (\n value !== null &&\n !(previous?.attribute === attribute && previous.value === value)\n );\n });\n if (externalName) {\n if (previous && panel.getAttribute(previous.attribute) === previous.value)\n panel.removeAttribute(previous.attribute);\n ownedNames.delete(panel);\n return;\n }\n const explicit = host.getAttribute('aria-label')?.trim();\n const title = host.shadowRoot?.getElementById('title');\n const attribute =\n !explicit && !host.withoutHeader && title\n ? 'aria-labelledby'\n : 'aria-label';\n const value =\n attribute === 'aria-labelledby' ? 'title' : explicit || host.label;\n if (previous && previous.attribute !== attribute)\n panel.removeAttribute(previous.attribute);\n if (panel.getAttribute(attribute) !== value)\n panel.setAttribute(attribute, value);\n ownedNames.set(panel, { attribute, value });\n}\n","interface ChromeDialog extends HTMLElement {\n dialog?: HTMLDialogElement;\n update(changed: unknown): void;\n}\n\n/**\n * The panel variable a floating header's divider reads: set while content\n * is scrolled away beneath the header, unset (no divider) otherwise.\n */\nexport const HEADER_DIVIDER_PROPERTY = '--_kui-dialog-surface-header-divider';\n\n/** The value published while the divider shows: the color the CSS owns. */\nconst SHOWN = 'var(--_kui-dialog-surface-header-divider-color)';\n\n/**\n * Scroll distance, in px, that counts as \"away from the top\": a scroller at\n * rest can report a fractional offset.\n */\nconst THRESHOLD = 1;\n\nconst installed = new WeakSet<object>();\nconst wiredPanels = new WeakSet<Element>();\n\n/**\n * Draw a floating DialogSurface header's divider while content is scrolled\n * beneath it, the way a Pane's overlay header does. Capture-phase `scroll`\n * listeners on the shadow panel and the host see both the body part (flowing\n * content) and a slotted filling child that reaches beneath the header (a\n * transcript `List` or `Pane` with block-start `scrollClearance`); a nested\n * scroller that starts below the header never counts. The state is published\n * on the panel, where Kerf rerenders never reach.\n */\nexport function installHeaderScrollDivider(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as ChromeDialog;\n const update = target.update;\n target.update = function (this: ChromeDialog, changed: unknown): void {\n update.call(this, changed);\n if (!this.parentElement?.classList.contains('kui-dialog-surface')) return;\n const panel = this.dialog;\n if (panel && !wiredPanels.has(panel)) wire(this, panel);\n };\n}\n\nfunction wire(host: ChromeDialog, panel: HTMLElement): void {\n wiredPanels.add(panel);\n const scrolled = new Set<Element>();\n const onScroll = (event: Event): void => {\n const scroller = event.target;\n if (!(scroller instanceof Element)) return;\n const header = host.shadowRoot?.querySelector('[part~=\"header\"]');\n const floating =\n host.parentElement?.getAttribute('data-header-presentation') ===\n 'floating';\n if (\n floating &&\n header &&\n scroller.scrollTop > THRESHOLD &&\n // Only a scroller that reaches beneath the header.\n scroller.getBoundingClientRect().top <=\n header.getBoundingClientRect().bottom\n )\n scrolled.add(scroller);\n else scrolled.delete(scroller);\n for (const element of scrolled)\n if (!element.isConnected) scrolled.delete(element);\n const value = scrolled.size > 0 ? SHOWN : '';\n if (panel.style.getPropertyValue(HEADER_DIVIDER_PROPERTY) === value) return;\n if (value) panel.style.setProperty(HEADER_DIVIDER_PROPERTY, value);\n else panel.style.removeProperty(HEADER_DIVIDER_PROPERTY);\n };\n // `scroll` does not bubble or leave a shadow root: the panel's capture\n // listener sees the body part, the host's sees slotted scrollers.\n for (const root of [panel, host])\n root.addEventListener('scroll', onScroll, { capture: true, passive: true });\n}\n","import WaDialog from '@awesome.me/webawesome/dist/components/dialog/dialog.js';\n\nimport { installChromeBlockSize } from '../internal/install-chrome-block-size.js';\nimport { installDialogLabel } from '../internal/install-dialog-label.js';\nimport { installHeaderScrollDivider } from '../internal/install-header-scroll-divider.js';\n\ninstallDialogLabel(WaDialog.prototype);\ninstallChromeBlockSize(WaDialog.prototype);\ninstallHeaderScrollDivider(WaDialog.prototype);\n\n/**\n * Importing this module registers wa-dialog, repairs wrapped native names, and\n * measures each DialogSurface header and footer for a floating header's or\n * footer's body clearance, and shows a floating header's divider while\n * content is scrolled beneath it.\n */\nexport const surfaceScaffoldElementsRegistered = true;\n"]}
|