@kerfjs/ui 5.0.0-beta.98 → 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 +487 -77
- package/ai/skill.md +40 -13
- 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 +22 -5
- package/dist/catalog.js +50 -31
- 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-AZWE2FB5.js → chunk-CMETHPKR.js} +12 -15
- 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-527IAEWG.js → chunk-PYBBYSZ3.js} +10 -17
- 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-Cp3Y8kJ9.d.ts → nav-stack-VXTumzKa.d.ts} +48 -3
- 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.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.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 +14 -4
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +75 -1
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +66 -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/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 +40 -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 +14 -4
- 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 +66 -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 +54 -8
- package/docs/collapsible-panel.md +9 -6
- package/docs/component-contract.md +41 -12
- package/docs/component-selection.md +143 -19
- 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 +112 -2
- 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/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-527IAEWG.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-AZWE2FB5.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
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
.kui-list-item {
|
|
2
|
+
/* The leading icon size. An inherited `--kui-list-row-icon-size` on the
|
|
3
|
+
containing List sizes ListItem and ListActionRow icons together, so a
|
|
4
|
+
mixed list keeps its labels on one edge; `--kui-list-item-icon-size`
|
|
5
|
+
still wins for ListItem rows that set it. */
|
|
6
|
+
--_kui-list-item-icon-size: var(
|
|
7
|
+
--kui-list-item-icon-size,
|
|
8
|
+
var(--kui-list-row-icon-size, 1.125rem)
|
|
9
|
+
);
|
|
2
10
|
display: grid;
|
|
3
11
|
width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
|
|
4
12
|
min-height: var(--kui-list-item-min-height, 2.75rem);
|
|
@@ -10,7 +18,10 @@
|
|
|
10
18
|
);
|
|
11
19
|
padding-inline: var(
|
|
12
20
|
--kui-list-item-padding-inline,
|
|
13
|
-
var(
|
|
21
|
+
var(
|
|
22
|
+
--kui-list-row-padding-inline,
|
|
23
|
+
var(--kui-layout-item-padding, 0.5rem)
|
|
24
|
+
)
|
|
14
25
|
);
|
|
15
26
|
box-sizing: border-box;
|
|
16
27
|
border: var(--kui-list-item-border-width, 1px) solid
|
|
@@ -85,7 +96,7 @@
|
|
|
85
96
|
.kui-list-item[data-has-icon="true"] {
|
|
86
97
|
grid-template-columns: var(
|
|
87
98
|
--kui-list-item-columns,
|
|
88
|
-
var(--
|
|
99
|
+
var(--_kui-list-item-icon-size) minmax(0, 1fr) auto
|
|
89
100
|
);
|
|
90
101
|
}
|
|
91
102
|
|
|
@@ -109,7 +120,12 @@
|
|
|
109
120
|
grid-column: 2;
|
|
110
121
|
}
|
|
111
122
|
|
|
112
|
-
.
|
|
123
|
+
/* A selected or current row keeps its selected tint while hovered. */
|
|
124
|
+
.kui-list-item:hover:not(
|
|
125
|
+
[data-placeholder="true"],
|
|
126
|
+
[aria-current="page"],
|
|
127
|
+
[aria-pressed="true"]
|
|
128
|
+
) {
|
|
113
129
|
border-color: var(
|
|
114
130
|
--kui-list-item-hover-border,
|
|
115
131
|
var(--kui-color-neutral-border-normal)
|
|
@@ -160,16 +176,16 @@
|
|
|
160
176
|
|
|
161
177
|
.kui-list-item__icon {
|
|
162
178
|
display: grid;
|
|
163
|
-
width: var(--
|
|
164
|
-
height: var(--
|
|
179
|
+
width: var(--_kui-list-item-icon-size);
|
|
180
|
+
height: var(--_kui-list-item-icon-size);
|
|
165
181
|
color: var(--kui-list-item-icon-color, currentColor);
|
|
166
182
|
place-items: center;
|
|
167
183
|
}
|
|
168
184
|
|
|
169
185
|
.kui-list-item__icon svg {
|
|
170
186
|
display: block;
|
|
171
|
-
width: var(--
|
|
172
|
-
height: var(--
|
|
187
|
+
width: var(--_kui-list-item-icon-size);
|
|
188
|
+
height: var(--_kui-list-item-icon-size);
|
|
173
189
|
}
|
|
174
190
|
|
|
175
191
|
.kui-list-item__label {
|
|
@@ -225,9 +241,7 @@
|
|
|
225
241
|
|
|
226
242
|
.kui-list-item[data-multiline="true"] .kui-list-item__icon {
|
|
227
243
|
align-self: start;
|
|
228
|
-
margin-block-start: calc(
|
|
229
|
-
(1lh - var(--kui-list-item-icon-size, 1.125rem)) / 2
|
|
230
|
-
);
|
|
244
|
+
margin-block-start: calc((1lh - var(--_kui-list-item-icon-size)) / 2);
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
.kui-list-item[data-multiline="true"][data-icon-align="center"]
|
|
@@ -275,7 +289,10 @@
|
|
|
275
289
|
z-index: 1;
|
|
276
290
|
inset-inline: var(
|
|
277
291
|
--kui-list-item-padding-inline,
|
|
278
|
-
var(
|
|
292
|
+
var(
|
|
293
|
+
--kui-list-row-padding-inline,
|
|
294
|
+
var(--kui-layout-item-padding, 0.5rem)
|
|
295
|
+
)
|
|
279
296
|
);
|
|
280
297
|
height: var(--kui-list-item-drop-indicator-width, 2px);
|
|
281
298
|
border-radius: var(--kui-radius-pill);
|
|
@@ -312,3 +329,133 @@
|
|
|
312
329
|
width: 1rem;
|
|
313
330
|
height: 1rem;
|
|
314
331
|
}
|
|
332
|
+
|
|
333
|
+
/* A filled icon tile (`iconTile`): the leading icon sits in a 32px rounded
|
|
334
|
+
tile with an 18px glyph. The tile overhangs the content box by up to 3px
|
|
335
|
+
into the block padding, so a single-line row keeps its density height
|
|
336
|
+
(44px standard, 52px spacious) and a compact row grows only to 42px; the
|
|
337
|
+
tile then sits 6px (5px compact) clear of the row edges, like a
|
|
338
|
+
ListActionRow tile, and rows with descriptions keep their height. The 6px
|
|
339
|
+
radius is concentric with the row's 12px corner at that clearance. */
|
|
340
|
+
.kui-list-item[data-icon-tile] {
|
|
341
|
+
--_kui-list-item-icon-tile-size: 2rem;
|
|
342
|
+
--_kui-list-item-icon-tile-overhang: 0.1875rem;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.kui-list-item[data-icon-tile][data-density="compact"] {
|
|
346
|
+
--_kui-list-item-icon-tile-overhang: 0px;
|
|
347
|
+
/* Native buttons take a form-control height, so a compact tile row
|
|
348
|
+
declares its tile-sized minimum rather than relying on content height. */
|
|
349
|
+
min-height: var(--kui-list-item-min-height, 2.625rem);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.kui-list-item[data-has-icon="true"][data-icon-tile] {
|
|
353
|
+
grid-template-columns: var(
|
|
354
|
+
--kui-list-item-columns,
|
|
355
|
+
var(--_kui-list-item-icon-tile-size) minmax(0, 1fr) auto
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.kui-list-item[data-icon-tile] .kui-list-item__icon {
|
|
360
|
+
width: var(--_kui-list-item-icon-tile-size);
|
|
361
|
+
height: var(--_kui-list-item-icon-tile-size);
|
|
362
|
+
margin-block: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
|
|
363
|
+
border-radius: var(--kui-radius-m, 0.375rem);
|
|
364
|
+
color: var(--_kui-list-item-icon-tile-foreground, currentColor);
|
|
365
|
+
background: var(--_kui-list-item-icon-tile-fill, transparent);
|
|
366
|
+
box-shadow: inset 0 0 0 1px
|
|
367
|
+
var(--_kui-list-item-icon-tile-border, transparent);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.kui-list-item[data-icon-tile] .kui-list-item__icon svg {
|
|
371
|
+
width: 1.125rem;
|
|
372
|
+
height: 1.125rem;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* An application fill defaults its glyph to black or white, whichever
|
|
376
|
+
contrasts with the fill's lightness. */
|
|
377
|
+
.kui-list-item[data-icon-tile="color"] .kui-list-item__icon {
|
|
378
|
+
color: var(--_kui-list-item-icon-tile-foreground, #fff);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
@supports (color: oklch(from red l c h)) {
|
|
382
|
+
.kui-list-item[data-icon-tile="color"] .kui-list-item__icon {
|
|
383
|
+
color: var(
|
|
384
|
+
--_kui-list-item-icon-tile-foreground,
|
|
385
|
+
oklch(
|
|
386
|
+
from var(--_kui-list-item-icon-tile-fill) clamp(0, (0.68 - l) * 1000, 1)
|
|
387
|
+
0 0
|
|
388
|
+
)
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.kui-list-item[data-icon-tile-tone="neutral"] .kui-list-item__icon {
|
|
394
|
+
--_kui-list-item-icon-tile-fill: var(--kui-color-neutral-fill-quiet);
|
|
395
|
+
--_kui-list-item-icon-tile-border: var(--kui-color-neutral-border-quiet);
|
|
396
|
+
--_kui-list-item-icon-tile-foreground: var(--kui-color-neutral-on-quiet);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.kui-list-item[data-icon-tile-tone="brand"] .kui-list-item__icon {
|
|
400
|
+
--_kui-list-item-icon-tile-fill: var(--kui-color-brand-fill-quiet);
|
|
401
|
+
--_kui-list-item-icon-tile-border: var(--kui-color-brand-border-quiet);
|
|
402
|
+
--_kui-list-item-icon-tile-foreground: var(--kui-color-brand-on-quiet);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.kui-list-item[data-icon-tile-tone="success"] .kui-list-item__icon {
|
|
406
|
+
--_kui-list-item-icon-tile-fill: var(--kui-color-success-fill-quiet);
|
|
407
|
+
--_kui-list-item-icon-tile-border: var(--kui-color-success-border-quiet);
|
|
408
|
+
--_kui-list-item-icon-tile-foreground: var(--kui-color-success-on-quiet);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.kui-list-item[data-icon-tile-tone="warning"] .kui-list-item__icon {
|
|
412
|
+
--_kui-list-item-icon-tile-fill: var(--kui-color-warning-fill-quiet);
|
|
413
|
+
--_kui-list-item-icon-tile-border: var(--kui-color-warning-border-quiet);
|
|
414
|
+
--_kui-list-item-icon-tile-foreground: var(--kui-color-warning-on-quiet);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.kui-list-item[data-icon-tile-tone="danger"] .kui-list-item__icon {
|
|
418
|
+
--_kui-list-item-icon-tile-fill: var(--kui-color-danger-fill-quiet);
|
|
419
|
+
--_kui-list-item-icon-tile-border: var(--kui-color-danger-border-quiet);
|
|
420
|
+
--_kui-list-item-icon-tile-foreground: var(--kui-color-danger-on-quiet);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* A loading row shows a tile-sized skeleton in place of the fill. */
|
|
424
|
+
.kui-list-item[data-icon-tile][data-placeholder="true"] .kui-list-item__icon {
|
|
425
|
+
background: transparent;
|
|
426
|
+
box-shadow: none;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.kui-list-item[data-icon-tile][data-multiline="true"][data-icon-align="center"]
|
|
430
|
+
.kui-list-item__icon {
|
|
431
|
+
margin-block: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* A wrapped label keeps its first line centered on the tile: the tile sits
|
|
435
|
+
at the top of the content box (less its overhang) and the label starts
|
|
436
|
+
the rest of the way down, instead of the tile overhanging the row edge. */
|
|
437
|
+
.kui-list-item[data-icon-tile][data-multiline="true"]:not(
|
|
438
|
+
[data-icon-align="center"]
|
|
439
|
+
)
|
|
440
|
+
.kui-list-item__icon {
|
|
441
|
+
margin-block-start: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.kui-list-item[data-icon-tile][data-multiline="true"]:not(
|
|
445
|
+
[data-icon-align="center"]
|
|
446
|
+
)
|
|
447
|
+
.kui-list-item__label {
|
|
448
|
+
align-self: start;
|
|
449
|
+
padding-block-start: max(
|
|
450
|
+
0px,
|
|
451
|
+
(var(--_kui-list-item-icon-tile-size) - 1lh) / 2 -
|
|
452
|
+
var(--_kui-list-item-icon-tile-overhang)
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
@media (forced-colors: active) {
|
|
457
|
+
.kui-list-item[data-icon-tile] .kui-list-item__icon {
|
|
458
|
+
outline: 1px solid CanvasText;
|
|
459
|
+
outline-offset: -1px;
|
|
460
|
+
}
|
|
461
|
+
}
|
package/dist/styles/list.css
CHANGED
|
@@ -8,10 +8,15 @@
|
|
|
8
8
|
--_kui-list-column-gap: var(--_kui-list-gap);
|
|
9
9
|
--_kui-list-row-gap: var(--_kui-list-gap);
|
|
10
10
|
--_kui-list-flex: 0 1 auto;
|
|
11
|
-
--_kui-list-inset-top:
|
|
12
|
-
--_kui-list-inset-right:
|
|
13
|
-
--_kui-list-inset-bottom:
|
|
14
|
-
--_kui-list-inset-left:
|
|
11
|
+
--_kui-list-inset-top: 0px;
|
|
12
|
+
--_kui-list-inset-right: 0px;
|
|
13
|
+
--_kui-list-inset-bottom: 0px;
|
|
14
|
+
--_kui-list-inset-left: 0px;
|
|
15
|
+
--_kui-list-clearance-start: 0px;
|
|
16
|
+
--_kui-list-clearance-end: 0px;
|
|
17
|
+
--_kui-list-ring-room: 0px;
|
|
18
|
+
--_kui-list-max-height: none;
|
|
19
|
+
--_kui-list-min-height: 0px;
|
|
15
20
|
--_kui-list-divider-top: transparent;
|
|
16
21
|
--_kui-list-divider-right: transparent;
|
|
17
22
|
--_kui-list-divider-bottom: transparent;
|
|
@@ -19,10 +24,15 @@
|
|
|
19
24
|
|
|
20
25
|
display: flex;
|
|
21
26
|
min-width: 0;
|
|
22
|
-
min-height:
|
|
27
|
+
min-height: var(--_kui-list-min-height);
|
|
28
|
+
max-height: var(--_kui-list-max-height);
|
|
23
29
|
box-sizing: border-box;
|
|
24
|
-
padding:
|
|
25
|
-
|
|
30
|
+
padding: calc(
|
|
31
|
+
var(--_kui-list-inset-top, 0px) + var(--_kui-list-clearance-start)
|
|
32
|
+
)
|
|
33
|
+
var(--_kui-list-inset-right, 0)
|
|
34
|
+
calc(var(--_kui-list-inset-bottom, 0px) + var(--_kui-list-clearance-end))
|
|
35
|
+
var(--_kui-list-inset-left, 0);
|
|
26
36
|
flex: var(--_kui-list-flex, initial);
|
|
27
37
|
flex-direction: column;
|
|
28
38
|
align-items: stretch;
|
|
@@ -97,6 +107,21 @@
|
|
|
97
107
|
}
|
|
98
108
|
}
|
|
99
109
|
|
|
110
|
+
/* `frame`: a bordered, rounded stack (a result picker). Its 4px inset on
|
|
111
|
+
every side replaces any side-selected or document inset, and is exactly
|
|
112
|
+
the reach of a row's focus ring (3px ring, 1px offset), so the first and
|
|
113
|
+
last rows' rings stay inside a scrolling frame's clip at the scroll
|
|
114
|
+
extremes. (The ring-room scroll padding every scrollable List carries
|
|
115
|
+
handles a row stopped mid-scroll.) */
|
|
116
|
+
.kui-list[data-frame="true"] {
|
|
117
|
+
--_kui-list-inset-top: var(--kui-space-2xs);
|
|
118
|
+
--_kui-list-inset-right: var(--kui-space-2xs);
|
|
119
|
+
--_kui-list-inset-bottom: var(--kui-space-2xs);
|
|
120
|
+
--_kui-list-inset-left: var(--kui-space-2xs);
|
|
121
|
+
border: 1px solid var(--kui-color-neutral-border-normal);
|
|
122
|
+
border-radius: var(--kui-radius-m);
|
|
123
|
+
}
|
|
124
|
+
|
|
100
125
|
.kui-list[data-h-align="left"] {
|
|
101
126
|
align-items: flex-start;
|
|
102
127
|
align-content: flex-start;
|
|
@@ -124,11 +149,56 @@
|
|
|
124
149
|
justify-content: space-between;
|
|
125
150
|
}
|
|
126
151
|
|
|
152
|
+
/* A scrollable List's scroll padding is a row's focus-ring reach (3px ring,
|
|
153
|
+
1px offset) plus 2px of slack, so a row focused or scrolled into view stops
|
|
154
|
+
with its ring inside the clip rather than flush against it: Chromium's
|
|
155
|
+
focus scroll stops 1px short of the padded target, and a row's fractional
|
|
156
|
+
position can cost another 0.3px. Scroll padding moves nothing at rest; at
|
|
157
|
+
the scroll extremes an unframed List's first and last rows still meet the
|
|
158
|
+
clip, which is what `frame`'s 4px inset is for. */
|
|
127
159
|
.kui-list[data-scrollable="true"] {
|
|
160
|
+
--_kui-list-ring-room: calc(var(--kui-space-2xs) + 2px);
|
|
128
161
|
overflow-y: auto;
|
|
129
162
|
overscroll-behavior-y: contain;
|
|
130
163
|
}
|
|
131
164
|
|
|
165
|
+
/* `scrollClearance`: chrome lying over the List's block edge (a dialog's
|
|
166
|
+
floating footer) publishes how far it covers that edge through the
|
|
167
|
+
inherited `--kui-scroll-clearance-block-*` context. The List adds it to its
|
|
168
|
+
own block padding and scroll padding, so rows scroll visibly beneath the
|
|
169
|
+
chrome while the first and last rows, and anything focused or scrolled into
|
|
170
|
+
view, still come to rest clear of it. */
|
|
171
|
+
.kui-list:is(
|
|
172
|
+
[data-scroll-clearance="block-start"],
|
|
173
|
+
[data-scroll-clearance="both"]
|
|
174
|
+
) {
|
|
175
|
+
--_kui-list-clearance-start: var(--kui-scroll-clearance-block-start, 0px);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.kui-list:is(
|
|
179
|
+
[data-scroll-clearance="block-end"],
|
|
180
|
+
[data-scroll-clearance="both"]
|
|
181
|
+
) {
|
|
182
|
+
--_kui-list-clearance-end: var(--kui-scroll-clearance-block-end, 0px);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.kui-list:is([data-scroll-clearance], [data-scrollable="true"]) {
|
|
186
|
+
scroll-padding-block: calc(
|
|
187
|
+
var(--_kui-list-clearance-start) + var(--_kui-list-ring-room)
|
|
188
|
+
)
|
|
189
|
+
calc(var(--_kui-list-clearance-end) + var(--_kui-list-ring-room));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* In a Pane's scrolling content, a List that does not scroll itself keeps
|
|
193
|
+
its full height rather than shrinking to the content box. A shrunken List
|
|
194
|
+
lets its rows overflow its own box, and the scroller's block-end padding
|
|
195
|
+
(a bottom safe area, an overlay NavStack bottom toolbar's clearance)
|
|
196
|
+
follows the List's box, not those rows, so the last row could never
|
|
197
|
+
scroll clear of the edge. A `flex` basis still grows the List to fill. */
|
|
198
|
+
.kui-pane > .kui-pane__content > .kui-list:not([data-scrollable="true"]) {
|
|
199
|
+
flex-shrink: 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
132
202
|
/* A scrollable List owns the overflow, so its rows keep their natural height
|
|
133
203
|
and scroll rather than shrink. Items that clip their own overflow (a
|
|
134
204
|
ListItem) have a zero automatic minimum height, so the default
|
|
@@ -188,6 +188,90 @@
|
|
|
188
188
|
position: relative;
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
/* `chromePresentation="overlay"`: the top chrome (and any copy cross-fading
|
|
192
|
+
out of it) paints the translucent chrome material (opaque under reduced
|
|
193
|
+
transparency or increased contrast, without `backdrop-filter`, or in
|
|
194
|
+
forced colors). Once `wireNavStack` has measured the live chrome
|
|
195
|
+
(`data-chrome-overlay="measured"`, with its border-box block size, top
|
|
196
|
+
safe area included, published on this root), the chrome lies over the
|
|
197
|
+
viewport's top edge and the viewport hands that size to its views as the
|
|
198
|
+
block-start edge context, so a plain view, a sole Pane, or a nested layout
|
|
199
|
+
pads and scroll-pads by it: content scrolls beneath the chrome yet rests
|
|
200
|
+
clear of it. Unwired, the chrome stays docked in its own band, so it never
|
|
201
|
+
covers content it has not measured. */
|
|
202
|
+
.kui-nav-stack[data-chrome-presentation="overlay"] > .kui-nav-stack__chrome {
|
|
203
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
204
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
205
|
+
background: var(--kui-chrome-material);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.kui-nav-stack[data-chrome-presentation="overlay"][data-chrome-overlay="measured"]
|
|
209
|
+
> .kui-nav-stack__chrome:not(.kui-nav-stack__chrome-copy) {
|
|
210
|
+
position: absolute;
|
|
211
|
+
z-index: 2;
|
|
212
|
+
inset-block-start: 0;
|
|
213
|
+
/* A classic (space-taking) vertical scrollbar in the active view stays
|
|
214
|
+
uncovered: `wireNavStack` publishes its inline size, so the chrome ends
|
|
215
|
+
where the track begins and its thumb and arrows stay usable. An overlay
|
|
216
|
+
scrollbar takes no space and passes beneath the material like the
|
|
217
|
+
content. */
|
|
218
|
+
inset-inline: 0 var(--_kui-nav-stack-scrollbar-inline-size, 0px);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.kui-nav-stack[data-chrome-presentation="overlay"][data-chrome-overlay="measured"]
|
|
222
|
+
> .kui-nav-stack__viewport {
|
|
223
|
+
--kui-edge-inset-block-start: var(--_kui-nav-stack-chrome-block-size, 0px);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* `bottomToolbarPresentation="overlay"`: the bottom toolbar (and any copy
|
|
227
|
+
cross-fading out of it) paints the same material. Once `wireNavStack` has
|
|
228
|
+
measured the live toolbar (`data-bottom-toolbar-overlay="measured"`, with
|
|
229
|
+
its border-box block size, bottom safe area and scroll-divider border
|
|
230
|
+
included, published on this root), the toolbar lies over the viewport's
|
|
231
|
+
bottom edge and the viewport hands that size to its views as the
|
|
232
|
+
block-end edge context (outranking the docked rule above that zeroes it),
|
|
233
|
+
so a plain view, a sole Pane's content or footer, or a nested layout pads
|
|
234
|
+
and scroll-pads by it: content scrolls beneath the toolbar yet its last
|
|
235
|
+
item rests clear of it. Unwired, the toolbar stays docked. */
|
|
236
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
|
|
237
|
+
> .kui-nav-stack__bottom {
|
|
238
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
239
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
240
|
+
background: var(--kui-chrome-material);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"][data-bottom-toolbar-overlay="measured"]
|
|
244
|
+
> .kui-nav-stack__bottom:not(.kui-nav-stack__chrome-copy) {
|
|
245
|
+
position: absolute;
|
|
246
|
+
z-index: 2;
|
|
247
|
+
inset-block-end: 0;
|
|
248
|
+
/* Like the top chrome, it ends where a classic scrollbar's track begins. */
|
|
249
|
+
inset-inline: 0 var(--_kui-nav-stack-bottom-scrollbar-inline-size, 0px);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"][data-bottom-toolbar-overlay="measured"]
|
|
253
|
+
> .kui-nav-stack__viewport {
|
|
254
|
+
--kui-edge-inset-block-end: var(--_kui-nav-stack-bottom-block-size, 0px);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
@media (forced-colors: active) {
|
|
258
|
+
.kui-nav-stack[data-chrome-presentation="overlay"] > .kui-nav-stack__chrome {
|
|
259
|
+
-webkit-backdrop-filter: none;
|
|
260
|
+
backdrop-filter: none;
|
|
261
|
+
background: Canvas;
|
|
262
|
+
border-block-end: 1px solid CanvasText;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* Its always-present 1px top border becomes the visible edge. */
|
|
266
|
+
.kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
|
|
267
|
+
> .kui-nav-stack__bottom {
|
|
268
|
+
-webkit-backdrop-filter: none;
|
|
269
|
+
backdrop-filter: none;
|
|
270
|
+
background: Canvas;
|
|
271
|
+
border-block-start-color: CanvasText;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
191
275
|
/* Chrome dividers: with `chromeDividers="scroll"` (the default, no
|
|
192
276
|
attribute) the top chrome draws a line along its bottom edge while the
|
|
193
277
|
active view's content is scrolled beneath it, and the bottom toolbar
|
package/dist/styles/pane.css
CHANGED
|
@@ -159,14 +159,17 @@
|
|
|
159
159
|
--kui-pane-content-inset-inline-start: var(--_kui-pane-safe-inline-start);
|
|
160
160
|
--kui-pane-content-inset-inline-end: var(--_kui-pane-safe-inline-end);
|
|
161
161
|
--_kui-pane-deep-block-inset: 0px;
|
|
162
|
+
--_kui-pane-clearance-block-start: 0px;
|
|
163
|
+
--_kui-pane-clearance-block-end: 0px;
|
|
162
164
|
--_kui-pane-content-safe-block-start: var(--_kui-pane-safe-block-start);
|
|
163
165
|
--_kui-pane-content-safe-block-end: var(--_kui-pane-safe-block-end);
|
|
164
166
|
--_kui-pane-content-block-start: calc(
|
|
165
167
|
var(--_kui-pane-content-safe-block-start) +
|
|
166
|
-
var(--_kui-pane-deep-block-inset)
|
|
168
|
+
var(--_kui-pane-deep-block-inset) + var(--_kui-pane-clearance-block-start)
|
|
167
169
|
);
|
|
168
170
|
--_kui-pane-content-block-end: calc(
|
|
169
|
-
var(--_kui-pane-content-safe-block-end) +
|
|
171
|
+
var(--_kui-pane-content-safe-block-end) +
|
|
172
|
+
var(--_kui-pane-deep-block-inset) + var(--_kui-pane-clearance-block-end)
|
|
170
173
|
);
|
|
171
174
|
min-width: 0;
|
|
172
175
|
min-height: 0;
|
|
@@ -184,6 +187,82 @@
|
|
|
184
187
|
var(--_kui-pane-content-block-end);
|
|
185
188
|
}
|
|
186
189
|
|
|
190
|
+
/* `scrollClearance`: chrome lying over the content's block edge (a dialog's
|
|
191
|
+
floating footer) publishes how far it covers that edge through the
|
|
192
|
+
inherited `--kui-scroll-clearance-block-*` context. The content scroller
|
|
193
|
+
adds it to the block padding and scroll padding above, so content scrolls
|
|
194
|
+
visibly beneath that chrome yet its first and last items can always rest
|
|
195
|
+
clear of it. */
|
|
196
|
+
.kui-pane:is(
|
|
197
|
+
[data-scroll-clearance="block-start"],
|
|
198
|
+
[data-scroll-clearance="both"]
|
|
199
|
+
)
|
|
200
|
+
> .kui-pane__content {
|
|
201
|
+
--_kui-pane-clearance-block-start: var(
|
|
202
|
+
--kui-scroll-clearance-block-start,
|
|
203
|
+
0px
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.kui-pane:is(
|
|
208
|
+
[data-scroll-clearance="block-end"],
|
|
209
|
+
[data-scroll-clearance="both"]
|
|
210
|
+
)
|
|
211
|
+
> .kui-pane__content {
|
|
212
|
+
--_kui-pane-clearance-block-end: var(--kui-scroll-clearance-block-end, 0px);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* `headerPresentation="overlay"`: the header paints the translucent chrome
|
|
216
|
+
material (opaque under reduced transparency, without `backdrop-filter`, or
|
|
217
|
+
in forced colors). Once `wireScrollDividers` has measured it
|
|
218
|
+
(`data-header-overlay="measured"`, with its border-box height published as
|
|
219
|
+
`--kui-scroll-clearance-block-start` on this root), the header moves into
|
|
220
|
+
the content cell above the scroller, and the scroller clears it through
|
|
221
|
+
the same block padding and scroll padding `scrollClearance` uses, and the
|
|
222
|
+
header leaves a classic scrollbar uncovered. Unwired,
|
|
223
|
+
or with `chromePlacement="auto"`, the header stays docked in its own row,
|
|
224
|
+
so it never covers content it has not measured. */
|
|
225
|
+
.kui-pane[data-header-presentation="overlay"] > .kui-pane__header {
|
|
226
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
227
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
228
|
+
background: var(--kui-chrome-material);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.kui-pane[data-header-presentation="overlay"][data-header-overlay="measured"]:not(
|
|
232
|
+
[data-chrome-placement="auto"]
|
|
233
|
+
)
|
|
234
|
+
> .kui-pane__header {
|
|
235
|
+
position: relative;
|
|
236
|
+
z-index: 1;
|
|
237
|
+
align-self: start;
|
|
238
|
+
grid-area: content;
|
|
239
|
+
/* A classic (space-taking) vertical scrollbar stays uncovered: the wiring
|
|
240
|
+
publishes its inline size, so the header ends where the scrollbar's
|
|
241
|
+
track begins and its thumb and arrow buttons stay visible and usable.
|
|
242
|
+
An overlay scrollbar takes no space and leaves this unset, so it passes
|
|
243
|
+
beneath the material like the content. */
|
|
244
|
+
margin-inline-end: var(--kui-pane-scrollbar-inline-size, 0px);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.kui-pane[data-header-presentation="overlay"][data-header-overlay="measured"]:not(
|
|
248
|
+
[data-chrome-placement="auto"]
|
|
249
|
+
)
|
|
250
|
+
> .kui-pane__content {
|
|
251
|
+
--_kui-pane-clearance-block-start: var(
|
|
252
|
+
--kui-scroll-clearance-block-start,
|
|
253
|
+
0px
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
@media (forced-colors: active) {
|
|
258
|
+
.kui-pane[data-header-presentation="overlay"] > .kui-pane__header {
|
|
259
|
+
-webkit-backdrop-filter: none;
|
|
260
|
+
backdrop-filter: none;
|
|
261
|
+
background: Canvas;
|
|
262
|
+
border-block-end: 1px solid CanvasText;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
187
266
|
/* Add one outer gutter without changing the inherited item-margin token.
|
|
188
267
|
Nested Row, List, and Grid therefore keep their own default 8px insets. */
|
|
189
268
|
.kui-pane[data-deep-inset="true"] > .kui-pane__content {
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
/* PopupMenu shares the Select's caret motion, surface inset, row rhythm,
|
|
15
15
|
current-row fill, and group titles from the popup-choice contract in
|
|
16
|
-
foundation.css.
|
|
16
|
+
foundation.css. Checkbox items reserve a check column, and so do the
|
|
17
|
+
plain items in any level that holds one; a level without a choice keeps the
|
|
18
|
+
compact start. */
|
|
17
19
|
|
|
18
20
|
/* The trigger caret turns to face the open menu, like the Select's. */
|
|
19
21
|
.kui-popup-menu > wa-button::part(caret) {
|
|
@@ -56,13 +58,21 @@
|
|
|
56
58
|
);
|
|
57
59
|
}
|
|
58
60
|
/* Web Awesome's nested submenu owns its item host padding. Move its exposed
|
|
59
|
-
checkmark inside the panel
|
|
61
|
+
checkmark inside the panel: in flow, the checkmark and its gap advance the
|
|
62
|
+
row's content by the same check column as at the top level. */
|
|
60
63
|
.kui-popup-menu
|
|
61
64
|
wa-dropdown-item[slot="submenu"][type="checkbox"]::part(checkmark) {
|
|
62
65
|
margin-inline-start: 0;
|
|
63
66
|
}
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
/* A plain item beside checkbox choices holds their check column with an empty
|
|
68
|
+
icon-slot spacer, at either level. Web Awesome sizes a slotted icon in its
|
|
69
|
+
smaller font and spaces it 0.75em (!important) from the next item; with
|
|
70
|
+
that gap, 1em of width equals the 1.25em checkmark plus its 0.5em gap. */
|
|
71
|
+
.kui-popup-menu__check-space {
|
|
72
|
+
display: block;
|
|
73
|
+
width: 1em;
|
|
74
|
+
height: 1px;
|
|
75
|
+
flex: none;
|
|
66
76
|
}
|
|
67
77
|
.kui-popup-menu wa-dropdown-item::part(label) {
|
|
68
78
|
padding-block: var(--_kui-popup-row-label-padding-block);
|
|
@@ -29,7 +29,16 @@
|
|
|
29
29
|
--kui-state-banner-action-hover-background,
|
|
30
30
|
var(--kui-color-surface)
|
|
31
31
|
);
|
|
32
|
-
|
|
32
|
+
/* A wrapping flex row, not a three-track grid: a trailing action stays
|
|
33
|
+
beside the copy only while the copy keeps its minimum readable width,
|
|
34
|
+
then wraps onto its own trailing row. The decision follows the banner's
|
|
35
|
+
own width and content, so it holds on a phone, in a narrow rail on a wide
|
|
36
|
+
screen, and in an intrinsically sized host such as CornerStatus, where a
|
|
37
|
+
container query's size containment would collapse the banner. A grid
|
|
38
|
+
gave the action an `auto` track at its full width and squeezed the copy
|
|
39
|
+
until its words ran under the action. */
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-wrap: wrap;
|
|
33
42
|
min-height: 2.75rem;
|
|
34
43
|
margin-inline: var(--kui-layout-inline-margin, 0.5rem);
|
|
35
44
|
padding: var(--kui-layout-item-padding, 0.5rem);
|
|
@@ -37,7 +46,6 @@
|
|
|
37
46
|
border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
|
|
38
47
|
color: var(--_kui-state-banner-foreground);
|
|
39
48
|
background: var(--_kui-state-banner-background);
|
|
40
|
-
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
41
49
|
align-items: center;
|
|
42
50
|
gap: var(--kui-layout-item-gap, 0.5rem);
|
|
43
51
|
}
|
|
@@ -175,6 +183,7 @@
|
|
|
175
183
|
}
|
|
176
184
|
.kui-state-banner__icon {
|
|
177
185
|
display: grid;
|
|
186
|
+
flex: none;
|
|
178
187
|
place-items: center;
|
|
179
188
|
}
|
|
180
189
|
.kui-state-banner__icon svg {
|
|
@@ -190,6 +199,9 @@
|
|
|
190
199
|
gap, so no margin lands at the start of a wrapped line. */
|
|
191
200
|
.kui-state-banner__copy {
|
|
192
201
|
min-width: 0;
|
|
202
|
+
/* The copy's minimum readable width before a trailing action wraps below
|
|
203
|
+
it; the copy grows to fill whatever its line leaves. */
|
|
204
|
+
flex: 1 1 12rem;
|
|
193
205
|
/* The title's size, so a wrapped title's lines keep the title's own line
|
|
194
206
|
height instead of the larger inherited strut. */
|
|
195
207
|
font-size: var(--kui-font-xs);
|
|
@@ -219,17 +231,11 @@
|
|
|
219
231
|
overflow: visible;
|
|
220
232
|
text-overflow: clip;
|
|
221
233
|
}
|
|
222
|
-
|
|
223
|
-
grid-template-columns: auto minmax(0, 1fr);
|
|
224
|
-
}
|
|
225
|
-
.kui-state-banner[data-action-placement="below"]:not(
|
|
226
|
-
:has(> .kui-state-banner__icon)
|
|
227
|
-
)
|
|
228
|
-
> .kui-state-banner__copy {
|
|
229
|
-
grid-column: 1 / -1;
|
|
230
|
-
}
|
|
234
|
+
/* `below` always gives the action its own end-aligned trailing row. */
|
|
231
235
|
.kui-state-banner[data-action-placement="below"] > .kui-state-banner__action {
|
|
232
|
-
|
|
236
|
+
display: flex;
|
|
237
|
+
flex-basis: 100%;
|
|
238
|
+
justify-content: flex-end;
|
|
233
239
|
}
|
|
234
240
|
.kui-state-banner__copy strong {
|
|
235
241
|
margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
|
|
@@ -254,8 +260,13 @@
|
|
|
254
260
|
overflow: clip;
|
|
255
261
|
text-overflow: ellipsis;
|
|
256
262
|
}
|
|
263
|
+
/* Content-sized and end-aligned on whichever line it lands; on its own line
|
|
264
|
+
it may shrink to the line so a wrapping action group (a `Row wrap`) wraps
|
|
265
|
+
its controls instead of overflowing the banner. */
|
|
257
266
|
.kui-state-banner__action {
|
|
258
|
-
|
|
267
|
+
max-width: 100%;
|
|
268
|
+
margin-inline-start: auto;
|
|
269
|
+
flex: 0 1 auto;
|
|
259
270
|
}
|
|
260
271
|
.kui-state-banner__action button {
|
|
261
272
|
min-height: 1.8rem;
|
package/dist/styles/styles.css
CHANGED