@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
package/dist/split-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/split-view/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { pct, remify } from '../../../shared/styles/css-values.js';\nimport {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from '../../navigation/nav-stack/nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from '../resizable-region/resizable-region.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, and chrome dividers forward to the\n * stack, and `list` / `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\n/**\n * The fixed list column's width: a size in CSS pixels, or that size capped\n * at a fraction of the SplitView's own width so a narrow container (a\n * dialog, a small window) always leaves the detail in view.\n */\nexport type SplitViewListWidth =\n | number\n | {\n /** Preferred width in CSS pixels. */\n size: number;\n /** Largest share of the SplitView's width, greater than 0 and at most 1. */\n maxFraction?: number;\n };\n\n/** The list-width custom property value for a fixed split. */\nfunction listWidthValue(listWidth: SplitViewListWidth): string {\n const { size, maxFraction } =\n typeof listWidth === 'number'\n ? { size: listWidth, maxFraction: undefined }\n : listWidth;\n if (!Number.isFinite(size) || size <= 0)\n throw new RangeError(\n 'SplitView listWidth size must be a positive number of pixels',\n );\n if (\n maxFraction !== undefined &&\n (!Number.isFinite(maxFraction) || maxFraction <= 0 || maxFraction > 1)\n )\n throw new RangeError(\n 'SplitView listWidth maxFraction must be greater than 0 and at most 1',\n );\n const preferred = remify(size);\n return maxFraction === undefined\n ? preferred\n : `min(${preferred}, ${pct(maxFraction * 100)})`;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n /**\n * The fixed split's list column width (default 320px). A number is CSS\n * pixels; `{ size, maxFraction }` caps it at that share of the SplitView's\n * width. A resizable split sizes its list with `resizable` instead.\n */\n listWidth?: SplitViewListWidth;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n compactStack = {},\n resizable,\n listWidth,\n className = '',\n slot,\n}: SplitViewProps) {\n if (listWidth !== undefined && resizable)\n throw new RangeError(\n 'SplitView listWidth applies to a fixed split; size a resizable list with resizable.size, min, and max',\n );\n const listWidthStyle =\n listWidth === undefined\n ? undefined\n : `--kui-split-view-list-width:${listWidthValue(listWidth)}`;\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n toolbar: { ...compactStack.list?.toolbar, title: listTitle },\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n toolbar: { ...compactStack.detail?.toolbar, title: detailTitle },\n content: detail,\n },\n ]\n : [listView];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n style={listWidthStyle}\n slot={slot}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/split-view/split-view.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA+EA,SAAS,eAAe,SAAA,EAAuC;AAC7D,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GACxB,OAAO,SAAA,KAAc,QAAA,GACjB,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,MAAA,EAAU,GAC1C,SAAA;AACN,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,KAAK,IAAA,IAAQ,CAAA;AACpC,IAAA,MAAM,IAAI,UAAA;AAAA,MACR;AAAA,KACF;AACF,EAAA,IACE,WAAA,KAAgB,WACf,CAAC,MAAA,CAAO,SAAS,WAAW,CAAA,IAAK,WAAA,IAAe,CAAA,IAAK,WAAA,GAAc,CAAA,CAAA;AAEpE,IAAA,MAAM,IAAI,UAAA;AAAA,MACR;AAAA,KACF;AACF,EAAA,MAAM,SAAA,GAAY,OAAO,IAAI,CAAA;AAC7B,EAAA,OAAO,WAAA,KAAgB,SACnB,SAAA,GACA,CAAA,IAAA,EAAO,SAAS,CAAA,EAAA,EAAK,GAAA,CAAI,WAAA,GAAc,GAAG,CAAC,CAAA,CAAA,CAAA;AACjD;AA6CO,SAAS,SAAA,CAAU;AAAA,EACxB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,EAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EACZ,eAAe,EAAC;AAAA,EAChB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAmB;AACjB,EAAA,IAAI,cAAc,MAAA,IAAa,SAAA;AAC7B,IAAA,MAAM,IAAI,UAAA;AAAA,MACR;AAAA,KACF;AACF,EAAA,MAAM,iBACJ,SAAA,KAAc,MAAA,GACV,SACA,CAAA,4BAAA,EAA+B,cAAA,CAAe,SAAS,CAAC,CAAA,CAAA;AAC9D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,GAAG,YAAA,CAAa,IAAA;AAAA,MAChB,GAAA,EAAK,MAAA;AAAA,MACL,SAAS,EAAE,GAAG,aAAa,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAAA,MAC3D,OAAA,EAAS;AAAA,KACX;AACA,IAAA,MAAM,QAAwB,YAAA,GAC1B;AAAA,MACE,QAAA;AAAA,MACA;AAAA,QACE,GAAG,YAAA,CAAa,MAAA;AAAA,QAChB,GAAA,EAAK,QAAA;AAAA,QACL,SAAS,EAAE,GAAG,aAAa,MAAA,EAAQ,OAAA,EAAS,OAAO,WAAA,EAAY;AAAA,QAC/D,OAAA,EAAS;AAAA;AACX,KACF,GACA,CAAC,QAAQ,CAAA;AACb,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAClE,EAAA;AAAA,QACA,gBAAA,EAAe,YAAA;AAAA,QACf,iBAAA,EAAgB,SAAA;AAAA,QAChB,IAAA;AAAA,QAEA,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAA;AAAA,YACA,UAAU,YAAA,CAAa,QAAA;AAAA,YACvB,UAAU,YAAA,CAAa,QAAA;AAAA,YACvB,eAAe,YAAA,CAAa,aAAA;AAAA,YAC5B,aAAa,YAAA,CAAa,WAAA;AAAA,YAC1B,eAAe,YAAA,CAAa,aAAA;AAAA,YAC5B,gBAAgB,YAAA,CAAa,cAAA;AAAA,YAC7B,oBAAoB,YAAA,CAAa,kBAAA;AAAA,YACjC,2BAA2B,YAAA,CAAa;AAAA;AAAA;AAC1C;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,MAAM,WAAW,SAAA,mBACf,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAG,EAAE,CAAA,KAAA,CAAA;AAAA,MACT,OAAO,SAAA,IAAa,MAAA;AAAA,MACpB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAC3B,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,eAAe,SAAA,CAAU,aAAA;AAAA,MACzB,gBAAgB,SAAA,CAAU,cAAA;AAAA,MAC1B,gBAAgB,SAAA,CAAU,cAAA;AAAA,MAC1B,iBAAiB,SAAA,CAAU,eAAA;AAAA,MAE3B,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,+BAAA;AAAA,UACN,iBAAA,EAAe,IAAA;AAAA,UACf,gBAAA,EAAe,MAAA;AAAA,UAEd,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,GACF,mBAEA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,+BAAA;AAAA,MACN,iBAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAe,OAAA;AAAA,MAEd,QAAA,EAAA;AAAA;AAAA,GACH;AAEF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC1C,EAAA;AAAA,MACA,gBAAA,EAAe,YAAA;AAAA,MACf,iBAAA,EAAgB,OAAA;AAAA,MAChB,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,cAAA;AAAA,MACP,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iCAAA;AAAA,YACN,mBAAA,EAAiB,IAAA;AAAA,YACjB,cAAY,WAAA,IAAe,MAAA;AAAA,YAE1B,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ","file":"split-view.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { pct, remify } from '../../../shared/styles/css-values.js';\nimport {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from '../../navigation/nav-stack/nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from '../resizable-region/resizable-region.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, chrome dividers, and chrome and\n * bottom-toolbar presentations forward to the stack, and `list` / `detail`\n * give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n | 'chromePresentation'\n | 'bottomToolbarPresentation'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\n/**\n * The fixed list column's width: a size in CSS pixels, or that size capped\n * at a fraction of the SplitView's own width so a narrow container (a\n * dialog, a small window) always leaves the detail in view.\n */\nexport type SplitViewListWidth =\n | number\n | {\n /** Preferred width in CSS pixels. */\n size: number;\n /** Largest share of the SplitView's width, greater than 0 and at most 1. */\n maxFraction?: number;\n };\n\n/** The list-width custom property value for a fixed split. */\nfunction listWidthValue(listWidth: SplitViewListWidth): string {\n const { size, maxFraction } =\n typeof listWidth === 'number'\n ? { size: listWidth, maxFraction: undefined }\n : listWidth;\n if (!Number.isFinite(size) || size <= 0)\n throw new RangeError(\n 'SplitView listWidth size must be a positive number of pixels',\n );\n if (\n maxFraction !== undefined &&\n (!Number.isFinite(maxFraction) || maxFraction <= 0 || maxFraction > 1)\n )\n throw new RangeError(\n 'SplitView listWidth maxFraction must be greater than 0 and at most 1',\n );\n const preferred = remify(size);\n return maxFraction === undefined\n ? preferred\n : `min(${preferred}, ${pct(maxFraction * 100)})`;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n /**\n * The fixed split's list column width (default 320px). A number is CSS\n * pixels; `{ size, maxFraction }` caps it at that share of the SplitView's\n * width. A resizable split sizes its list with `resizable` instead.\n */\n listWidth?: SplitViewListWidth;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n compactStack = {},\n resizable,\n listWidth,\n className = '',\n slot,\n}: SplitViewProps) {\n if (listWidth !== undefined && resizable)\n throw new RangeError(\n 'SplitView listWidth applies to a fixed split; size a resizable list with resizable.size, min, and max',\n );\n const listWidthStyle =\n listWidth === undefined\n ? undefined\n : `--kui-split-view-list-width:${listWidthValue(listWidth)}`;\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n toolbar: { ...compactStack.list?.toolbar, title: listTitle },\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n toolbar: { ...compactStack.detail?.toolbar, title: detailTitle },\n content: detail,\n },\n ]\n : [listView];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\n chromePresentation={compactStack.chromePresentation}\n bottomToolbarPresentation={compactStack.bottomToolbarPresentation}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n style={listWidthStyle}\n slot={slot}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
|
package/dist/state-banner.d.ts
CHANGED
|
@@ -20,7 +20,12 @@ interface StateBannerProps {
|
|
|
20
20
|
urgency?: StateBannerUrgency;
|
|
21
21
|
/** Keep the detail beside the title, or give it its own line. */
|
|
22
22
|
copyLayout?: StateBannerCopyLayout;
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* `trailing` (the default) puts the action beside the copy while the copy
|
|
25
|
+
* keeps its minimum readable width, and otherwise wraps it onto its own
|
|
26
|
+
* end-aligned trailing row, at any viewport or container width. `below`
|
|
27
|
+
* always gives the action that separate trailing row.
|
|
28
|
+
*/
|
|
24
29
|
actionPlacement?: StateBannerActionPlacement;
|
|
25
30
|
/**
|
|
26
31
|
* `card` (the default) is an inset, rounded, fully bordered banner beside
|
package/dist/state-banner.js
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
.kui-anchored-surface {
|
|
2
|
+
/* The room beside the anchor on the side the surface opened, which
|
|
3
|
+
kerfjs/overlay publishes and refreshes on every reposition. Read-only for
|
|
4
|
+
content that sizes an inner scroller to it. */
|
|
5
|
+
--kui-anchored-surface-available-height: var(
|
|
6
|
+
--kerf-anchor-available-height,
|
|
7
|
+
calc(100dvh - 2 * var(--kui-space-xs, 8px))
|
|
8
|
+
);
|
|
9
|
+
|
|
2
10
|
box-sizing: border-box;
|
|
3
11
|
inset: auto;
|
|
4
12
|
width: max-content;
|
|
5
13
|
max-width: calc(100vw - 2 * var(--kui-space-xs, 8px));
|
|
6
|
-
max-height:
|
|
14
|
+
max-height: min(
|
|
15
|
+
calc(100dvh - 2 * var(--kui-space-xs, 8px)),
|
|
16
|
+
var(--kui-anchored-surface-available-height)
|
|
17
|
+
);
|
|
7
18
|
overflow: auto;
|
|
8
19
|
padding: var(--kui-anchored-surface-inset, var(--kui-space-xs, 8px));
|
|
9
20
|
border: 1px solid var(--kui-color-neutral-border-normal);
|
|
@@ -13,3 +24,18 @@
|
|
|
13
24
|
box-shadow: var(--kui-shadow-l);
|
|
14
25
|
font: inherit;
|
|
15
26
|
}
|
|
27
|
+
|
|
28
|
+
/* Dark tone for a popup anchored to dark media chrome: the loud, inverse tone
|
|
29
|
+
of a dark ToolbarControlGroup, so the surface takes the opposite of its
|
|
30
|
+
anchor's color scheme (the script picks the class when it opens). It flips
|
|
31
|
+
only the color scheme: every semantic token is a light-dark() pair, so the
|
|
32
|
+
surface fill, border, shadow, and the content's text, borders, and focus
|
|
33
|
+
rings all resolve to the other side by inheritance. No child is styled from
|
|
34
|
+
here. */
|
|
35
|
+
.kui-anchored-surface--scheme-dark {
|
|
36
|
+
color-scheme: dark;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.kui-anchored-surface--scheme-light {
|
|
40
|
+
color-scheme: light;
|
|
41
|
+
}
|
|
@@ -36,6 +36,11 @@
|
|
|
36
36
|
width: 100%;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/* A production sidebar rail's width, for sidebar-pane specimens. */
|
|
40
|
+
.kui-catalog-example__viewport[data-width="sidebar"] {
|
|
41
|
+
width: min(100%, 17rem);
|
|
42
|
+
}
|
|
43
|
+
|
|
39
44
|
.kui-catalog-example__viewport[data-width="compact"] {
|
|
40
45
|
width: min(100%, 27.5rem);
|
|
41
46
|
}
|
|
@@ -95,6 +100,34 @@
|
|
|
95
100
|
min-height: 20rem;
|
|
96
101
|
}
|
|
97
102
|
|
|
103
|
+
.kui-catalog-example__viewport[data-min-height="app"] {
|
|
104
|
+
min-height: 37rem;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* A content column: each in-flow child fills a capped measure, at the start
|
|
108
|
+
or centered. Top-layer `[popover]` specimens keep their own geometry (they
|
|
109
|
+
position against the viewport or a named anchor, not this column). */
|
|
110
|
+
.kui-catalog-example__viewport[data-content-width] > :not([popover]) {
|
|
111
|
+
width: min(100%, var(--_kui-catalog-example-content-width));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.kui-catalog-example__viewport[data-content-width="compact"] {
|
|
115
|
+
--_kui-catalog-example-content-width: 27.5rem;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.kui-catalog-example__viewport[data-content-width="medium"] {
|
|
119
|
+
--_kui-catalog-example-content-width: 40rem;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.kui-catalog-example__viewport[data-content-width="wide"] {
|
|
123
|
+
--_kui-catalog-example-content-width: 54rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.kui-catalog-example__viewport[data-content-width][data-content-align="center"]
|
|
127
|
+
> :not([popover]) {
|
|
128
|
+
margin-inline: auto;
|
|
129
|
+
}
|
|
130
|
+
|
|
98
131
|
.kui-catalog-example__viewport[data-frame] {
|
|
99
132
|
border: 1px solid var(--kui-color-neutral-border-normal);
|
|
100
133
|
}
|
|
@@ -52,3 +52,10 @@
|
|
|
52
52
|
box-sizing: border-box;
|
|
53
53
|
place-items: start;
|
|
54
54
|
}
|
|
55
|
+
|
|
56
|
+
/* An application-width example stack spans the whole stage, so the canvas
|
|
57
|
+
lifts its own width cap for it. The stack is matched by its public
|
|
58
|
+
`data-catalog-example-stack` marker: the canvas styles only itself. */
|
|
59
|
+
.kui-catalog__canvas:has(> [data-catalog-example-stack][data-width="full"]) {
|
|
60
|
+
width: 100%;
|
|
61
|
+
}
|
package/dist/styles/chip.css
CHANGED
|
@@ -73,6 +73,26 @@
|
|
|
73
73
|
background: transparent;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/* Follows the surrounding foreground, such as the on-loud text of a
|
|
77
|
+
brand-loud ContentItem bubble. It paints no fill: any currentColor wash
|
|
78
|
+
over a loud surface lowers the contrast the surface's own text was tuned
|
|
79
|
+
to, so the chip draws its shape with a currentColor border instead (soft
|
|
80
|
+
for quiet, full strength for outline and solid). */
|
|
81
|
+
.kui-chip[data-tone="inherit"] {
|
|
82
|
+
--_kui-chip-border: color-mix(in srgb, currentColor 40%, transparent);
|
|
83
|
+
|
|
84
|
+
border-color: var(--_kui-chip-border);
|
|
85
|
+
color: inherit;
|
|
86
|
+
background: transparent;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.kui-chip[data-tone="inherit"]:is(
|
|
90
|
+
[data-appearance="outline"],
|
|
91
|
+
[data-appearance="solid"]
|
|
92
|
+
) {
|
|
93
|
+
--_kui-chip-border: currentColor;
|
|
94
|
+
}
|
|
95
|
+
|
|
76
96
|
.kui-chip[data-shape="rounded"] {
|
|
77
97
|
border-radius: var(--kui-radius-s);
|
|
78
98
|
}
|
|
@@ -93,6 +113,56 @@
|
|
|
93
113
|
overflow: hidden;
|
|
94
114
|
}
|
|
95
115
|
|
|
116
|
+
/* Link chip: a native anchor with the same geometry. Hover and press layer a
|
|
117
|
+
currentColor wash over whichever fill the appearance paints; an inherit
|
|
118
|
+
chip instead strengthens its border and underlines its label, so the
|
|
119
|
+
surrounding text contrast holds in every state. */
|
|
120
|
+
.kui-chip[data-link] {
|
|
121
|
+
--_kui-chip-wash: transparent;
|
|
122
|
+
|
|
123
|
+
background-image: linear-gradient(
|
|
124
|
+
var(--_kui-chip-wash),
|
|
125
|
+
var(--_kui-chip-wash)
|
|
126
|
+
);
|
|
127
|
+
text-decoration: none;
|
|
128
|
+
cursor: pointer;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.kui-chip[data-link]:hover {
|
|
132
|
+
--_kui-chip-wash: color-mix(in srgb, currentColor 10%, transparent);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.kui-chip[data-link]:active {
|
|
136
|
+
--_kui-chip-wash: color-mix(in srgb, currentColor 18%, transparent);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.kui-chip[data-link][data-tone="inherit"]:is(:hover, :active) {
|
|
140
|
+
--_kui-chip-wash: transparent;
|
|
141
|
+
--_kui-chip-border: currentColor;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* The label clips for its ellipsis; a little block room keeps the hover
|
|
145
|
+
underline inside that clip without changing the chip's height. */
|
|
146
|
+
.kui-chip[data-link] .kui-chip__label {
|
|
147
|
+
padding-block: 0.2em;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.kui-chip[data-link][data-tone="inherit"]:is(:hover, :active) .kui-chip__label {
|
|
151
|
+
text-decoration: underline;
|
|
152
|
+
text-underline-offset: 0.12em;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.kui-chip[data-link]:focus-visible {
|
|
156
|
+
outline: var(--kui-focus-ring);
|
|
157
|
+
outline-offset: 2px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* The brand focus color can match a brand-loud surface; an inherit chip's
|
|
161
|
+
ring follows the surrounding foreground instead. */
|
|
162
|
+
.kui-chip[data-link][data-tone="inherit"]:focus-visible {
|
|
163
|
+
outline: 3px solid currentColor;
|
|
164
|
+
}
|
|
165
|
+
|
|
96
166
|
.kui-chip__icon {
|
|
97
167
|
display: inline-grid;
|
|
98
168
|
width: 1em;
|
|
@@ -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);
|
|
@@ -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
|
|
|
@@ -138,6 +138,72 @@ button.kui-toolbar-text:focus-visible {
|
|
|
138
138
|
color: var(--kui-color-text);
|
|
139
139
|
}
|
|
140
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
|
+
|
|
141
207
|
.kui-toolbar-text[data-tone="dark"] {
|
|
142
208
|
color: var(--kui-color-neutral-on-loud);
|
|
143
209
|
}
|
|
@@ -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
|