@kerfjs/ui 5.0.0-beta.97 → 5.0.0-beta.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -1
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/component-catalog.json +487 -66
- package/ai/component-catalog.schema.json +1 -1
- package/ai/component-composition-rules.json +22 -2
- package/ai/component-composition.json +360 -33
- package/ai/component-composition.schema.json +1 -1
- package/ai/components/README.md +18 -17
- package/ai/components/anchored-surface.md +13 -0
- package/ai/components/application-tabs.md +1 -1
- package/ai/components/chip.md +9 -5
- package/ai/components/choice-chips.md +15 -8
- package/ai/components/collapsible-panel.md +3 -2
- package/ai/components/composer.md +83 -0
- package/ai/components/content-item.md +2 -2
- package/ai/components/corner-status.md +1 -1
- package/ai/components/document-baseline.md +3 -3
- package/ai/components/foundation.md +2 -2
- package/ai/components/layout.md +1 -1
- package/ai/components/list-action-row.md +5 -1
- package/ai/components/list-item.md +5 -1
- package/ai/components/list.md +19 -3
- package/ai/components/nav-stack.md +11 -2
- package/ai/components/pane.md +13 -4
- package/ai/components/popup-menu.md +4 -4
- package/ai/components/recipe-app-shell.md +3 -3
- package/ai/components/recipe-collapsible-sidebar.md +3 -3
- package/ai/components/recipe-compact-toolbar.md +1 -1
- package/ai/components/recipe-composer-form.md +3 -3
- package/ai/components/recipe-list-detail-dialog.md +2 -2
- package/ai/components/recipe-list-workspace-states.md +3 -3
- package/ai/components/recipe-loading-inspector.md +1 -1
- package/ai/components/recipe-navigation-sidebar.md +3 -3
- package/ai/components/recipe-navigation-stack.md +3 -3
- package/ai/components/recipe-workspace-header.md +3 -3
- package/ai/components/resize.md +2 -2
- package/ai/components/split-view.md +4 -2
- package/ai/components/sunken-panel.md +2 -2
- package/ai/components/surface-scaffold.md +15 -3
- package/ai/components/tab-bar.md +1 -0
- package/ai/components/tab-navigator.md +4 -0
- package/ai/components/toolbar-control-group.md +2 -0
- package/ai/components/toolbar-text.md +1 -0
- package/ai/components/toolbar.md +1 -0
- package/ai/components/workbench.md +1 -0
- package/ai/public-api-signatures-v1.md +504 -80
- package/ai/skill.md +41 -14
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/component-ownership.mjs +1 -1
- package/analyzer/index.mjs +41 -14
- package/dist/anchored-surface.d.ts +30 -2
- package/dist/anchored-surface.js +1 -1
- package/dist/app-tab.js +1 -1
- package/dist/browser/composer.js +4 -0
- package/dist/catalog-resources.d.ts +3 -2
- package/dist/catalog-resources.js +4 -4
- package/dist/catalog-resources.js.map +1 -1
- package/dist/catalog.d.ts +39 -8
- package/dist/catalog.js +55 -32
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +41 -9
- package/dist/chip.js +1 -1
- package/dist/choice-chips.d.ts +40 -16
- package/dist/choice-chips.js +1 -1
- package/dist/chunk-34U4ANDJ.js +119 -0
- package/dist/chunk-34U4ANDJ.js.map +1 -0
- package/dist/{chunk-36TL6BCR.js → chunk-3GLYIIFR.js} +34 -6
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/{chunk-HWY4BSLS.js → chunk-3VXDSIBJ.js} +2 -2
- package/dist/{chunk-HWY4BSLS.js.map → chunk-3VXDSIBJ.js.map} +1 -1
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-AV7CPAPT.js +82 -0
- package/dist/chunk-AV7CPAPT.js.map +1 -0
- package/dist/{chunk-XK4E225T.js → chunk-B53PS2LE.js} +2 -2
- package/dist/{chunk-XK4E225T.js.map → chunk-B53PS2LE.js.map} +1 -1
- package/dist/{chunk-R42D2BAO.js → chunk-CA7LNX3J.js} +2 -2
- package/dist/{chunk-R42D2BAO.js.map → chunk-CA7LNX3J.js.map} +1 -1
- package/dist/{chunk-AYHC62OZ.js → chunk-CMETHPKR.js} +26 -29
- package/dist/chunk-CMETHPKR.js.map +1 -0
- package/dist/{chunk-Y43B6DS3.js → chunk-CVD5IZGB.js} +2 -2
- package/dist/{chunk-Y43B6DS3.js.map → chunk-CVD5IZGB.js.map} +1 -1
- package/dist/{chunk-6STQXRT4.js → chunk-CXZXHZTR.js} +121 -12
- package/dist/chunk-CXZXHZTR.js.map +1 -0
- package/dist/{chunk-GZE2XVKC.js → chunk-DZJ4GBSP.js} +3 -3
- package/dist/{chunk-GZE2XVKC.js.map → chunk-DZJ4GBSP.js.map} +1 -1
- package/dist/chunk-ELCMSQNJ.js +49 -0
- package/dist/chunk-ELCMSQNJ.js.map +1 -0
- package/dist/{chunk-P74VXMB6.js → chunk-EOO6PYGF.js} +7 -14
- package/dist/chunk-EOO6PYGF.js.map +1 -0
- package/dist/{chunk-PRG4CL3Q.js → chunk-FR76ZJQC.js} +21 -19
- package/dist/chunk-FR76ZJQC.js.map +1 -0
- package/dist/{chunk-QQ3TTWFH.js → chunk-G3J7JDP6.js} +1 -1
- package/dist/{chunk-QQ3TTWFH.js.map → chunk-G3J7JDP6.js.map} +1 -1
- package/dist/{chunk-IGTWXPTN.js → chunk-HGV7J4T6.js} +3 -3
- package/dist/{chunk-IGTWXPTN.js.map → chunk-HGV7J4T6.js.map} +1 -1
- package/dist/{chunk-YWQGSUF2.js → chunk-HLDRH23D.js} +3 -3
- package/dist/{chunk-YWQGSUF2.js.map → chunk-HLDRH23D.js.map} +1 -1
- package/dist/{chunk-PBT3CPPY.js → chunk-HQZYKJ56.js} +24 -4
- package/dist/chunk-HQZYKJ56.js.map +1 -0
- package/dist/{chunk-V6W56V3N.js → chunk-HZPHCSCS.js} +16 -3
- package/dist/chunk-HZPHCSCS.js.map +1 -0
- package/dist/{chunk-GJYQ27C2.js → chunk-INI4WDWC.js} +8 -1
- package/dist/chunk-INI4WDWC.js.map +1 -0
- package/dist/{chunk-U657IHFB.js → chunk-IQSRHXZR.js} +10 -4
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/{chunk-KQDU7Z7P.js → chunk-K4AT3V3J.js} +2 -1
- package/dist/chunk-K4AT3V3J.js.map +1 -0
- package/dist/{chunk-QIAPOWHH.js → chunk-KCS6NJ3O.js} +2 -2
- package/dist/{chunk-QIAPOWHH.js.map → chunk-KCS6NJ3O.js.map} +1 -1
- package/dist/{chunk-UKKRPP56.js → chunk-LOSRXZAH.js} +2 -2
- package/dist/{chunk-UKKRPP56.js.map → chunk-LOSRXZAH.js.map} +1 -1
- package/dist/{chunk-ROZLJULF.js → chunk-MF6ZUUJZ.js} +8 -3
- package/dist/chunk-MF6ZUUJZ.js.map +1 -0
- package/dist/{chunk-6IVNMC6R.js → chunk-MHMWQ7RB.js} +2 -2
- package/dist/{chunk-6IVNMC6R.js.map → chunk-MHMWQ7RB.js.map} +1 -1
- package/dist/{chunk-JYD7G4RG.js → chunk-PIVY32AE.js} +15 -5
- package/dist/chunk-PIVY32AE.js.map +1 -0
- package/dist/{chunk-BU23Z5HZ.js → chunk-PYBBYSZ3.js} +13 -18
- package/dist/chunk-PYBBYSZ3.js.map +1 -0
- package/dist/chunk-QDSZTQXL.js +28 -0
- package/dist/chunk-QDSZTQXL.js.map +1 -0
- package/dist/{chunk-YXOMI7ES.js → chunk-QIG4IGUP.js} +2 -2
- package/dist/{chunk-YXOMI7ES.js.map → chunk-QIG4IGUP.js.map} +1 -1
- package/dist/{chunk-6BRRUPJY.js → chunk-QROYYGWU.js} +3 -3
- package/dist/chunk-QROYYGWU.js.map +1 -0
- package/dist/{chunk-FOQK4F3L.js → chunk-RHD7RKGI.js} +28 -7
- package/dist/chunk-RHD7RKGI.js.map +1 -0
- package/dist/{chunk-BBU2SPRE.js → chunk-T4WJ5VGP.js} +4 -4
- package/dist/{chunk-BBU2SPRE.js.map → chunk-T4WJ5VGP.js.map} +1 -1
- package/dist/{chunk-6NOLL5KG.js → chunk-TGLUDQP2.js} +3 -3
- package/dist/{chunk-6NOLL5KG.js.map → chunk-TGLUDQP2.js.map} +1 -1
- package/dist/{chunk-HO6FU3G7.js → chunk-TLMMFQWM.js} +4 -4
- package/dist/{chunk-HO6FU3G7.js.map → chunk-TLMMFQWM.js.map} +1 -1
- package/dist/chunk-UMKV7YVQ.js +20 -0
- package/dist/chunk-UMKV7YVQ.js.map +1 -0
- package/dist/{chunk-M2NRCFRO.js → chunk-VFYO3UGZ.js} +2 -2
- package/dist/{chunk-M2NRCFRO.js.map → chunk-VFYO3UGZ.js.map} +1 -1
- package/dist/{chunk-YOKEL75M.js → chunk-WVS6CUCT.js} +2 -2
- package/dist/{chunk-YOKEL75M.js.map → chunk-WVS6CUCT.js.map} +1 -1
- package/dist/{chunk-MN3POJFN.js → chunk-YMUIQRWK.js} +2 -2
- package/dist/{chunk-MN3POJFN.js.map → chunk-YMUIQRWK.js.map} +1 -1
- package/dist/{chunk-Y3LC7JQO.js → chunk-YOA5W5ZH.js} +2 -2
- package/dist/{chunk-Y3LC7JQO.js.map → chunk-YOA5W5ZH.js.map} +1 -1
- package/dist/{chunk-44A6LP54.js → chunk-YQ2AC4E2.js} +2 -2
- package/dist/{chunk-44A6LP54.js.map → chunk-YQ2AC4E2.js.map} +1 -1
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/collapsible-panel.d.ts +3 -2
- package/dist/collapsible-panel.js +4 -3
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/composer.d.ts +62 -0
- package/dist/composer.js +5 -0
- package/dist/composer.js.map +1 -0
- package/dist/corner-status.d.ts +1 -1
- package/dist/corner-status.js +1 -1
- package/dist/css-values.d.ts +9 -1
- package/dist/css-values.js +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/empty-state.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/icon-button.js +1 -1
- package/dist/icon-toggle-button.js +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +40 -37
- package/dist/list-action-row.d.ts +10 -2
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
- package/dist/list-item.d.ts +10 -3
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +36 -4
- package/dist/list.js +1 -1
- package/dist/loading-spinner.js +1 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/{nav-stack-BvSKY448.d.ts → nav-stack-VXTumzKa.d.ts} +53 -4
- package/dist/nav-stack.d.ts +3 -2
- package/dist/nav-stack.js +2 -1
- package/dist/pane.d.ts +40 -3
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-CL9tYOkh.d.ts → panel-toolbar-vg6Ir5Dy.d.ts} +6 -1
- package/dist/popup-menu-register.d.ts +2 -1
- package/dist/popup-menu-register.js +97 -22
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.js +1 -1
- package/dist/row.js +1 -1
- package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
- package/dist/select-register.js +11 -0
- package/dist/select-register.js.map +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-button.js +1 -1
- package/dist/split-view.d.ts +7 -5
- package/dist/split-view.js +6 -3
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +6 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/anchored-surface.css +27 -1
- package/dist/styles/catalog/components/catalog-example-stack.css +5 -0
- package/dist/styles/catalog/components/catalog-example.css +33 -0
- package/dist/styles/catalog/components/catalog-stage.css +7 -0
- package/dist/styles/chip.css +70 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +21 -4
- package/dist/styles/components/actions/toolbar/toolbar.css +19 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +75 -1
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +75 -0
- package/dist/styles/components/collections/list/list.css +77 -7
- package/dist/styles/components/collections/list-action-row/list-action-row.css +177 -22
- package/dist/styles/components/collections/list-item/list-item.css +158 -11
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +27 -1
- package/dist/styles/components/feedback/chip/chip.css +70 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +24 -13
- package/dist/styles/components/forms/composer/composer.css +100 -0
- package/dist/styles/components/forms/select/select.css +1 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +13 -2
- package/dist/styles/components/layout/pane/pane.css +81 -2
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +84 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +15 -4
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +79 -4
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +195 -0
- package/dist/styles/composer.css +100 -0
- package/dist/styles/foundation.css +66 -0
- package/dist/styles/list-action-row.css +177 -22
- package/dist/styles/list-item.css +158 -11
- package/dist/styles/list.css +77 -7
- package/dist/styles/nav-stack.css +84 -0
- package/dist/styles/pane.css +81 -2
- package/dist/styles/popup-menu.css +21 -4
- package/dist/styles/select.css +1 -0
- package/dist/styles/state-banner.css +24 -13
- package/dist/styles/styles.css +1 -0
- package/dist/styles/surface-scaffold.css +195 -0
- package/dist/styles/tab-bar.css +15 -4
- package/dist/styles/tab-navigator.css +79 -4
- package/dist/styles/token-search-field.css +13 -2
- package/dist/styles/toolbar-control-group.css +75 -1
- package/dist/styles/toolbar-text.css +75 -0
- package/dist/styles/toolbar.css +19 -0
- package/dist/styles/webawesome.css +18 -0
- package/dist/surface-scaffold-register.d.ts +6 -1
- package/dist/surface-scaffold-register.js +89 -3
- package/dist/surface-scaffold-register.js.map +1 -1
- package/dist/surface-scaffold.d.ts +66 -7
- package/dist/surface-scaffold.js +1 -1
- package/dist/tab-navigator.d.ts +23 -2
- package/dist/tab-navigator.js +2 -0
- package/dist/tab-navigator.js.map +1 -1
- package/dist/token-search-field.d.ts +1 -1
- package/dist/token-search-field.js +1 -1
- package/dist/{token-search-model-DTcTXWMS.d.ts → token-search-model-aYR0YAei.d.ts} +32 -2
- package/dist/token-search-model.d.ts +1 -1
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +1 -0
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +3 -2
- package/dist/wire-catalog.js +2 -2
- package/dist/wire-composers.d.ts +16 -0
- package/dist/wire-composers.js +3 -0
- package/dist/wire-composers.js.map +1 -0
- package/dist/wire-list-focus-scroll.d.ts +16 -0
- package/dist/wire-list-focus-scroll.js +3 -0
- package/dist/wire-list-focus-scroll.js.map +1 -0
- package/dist/wire-nav-stack.js +135 -0
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-scroll-dividers.d.ts +9 -0
- package/dist/wire-scroll-dividers.js +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +3 -1
- package/dist/wire-tab-navigator.js +133 -1
- package/dist/wire-tab-navigator.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +8 -3
- package/dist/workbench.js +2 -1
- package/docs/accessibility.md +132 -3
- package/docs/anchored-surface.md +46 -4
- package/docs/app-layouts.md +23 -2
- package/docs/apple-hig.md +1 -0
- package/docs/catalog.md +61 -9
- package/docs/collapsible-panel.md +9 -6
- package/docs/component-contract.md +46 -13
- package/docs/component-selection.md +147 -20
- package/docs/composer.md +143 -0
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
- package/docs/design/templates/choice-chips/multiple.svg +1 -0
- package/docs/design/templates/choice-chips-dark.svg +1 -1
- package/docs/design/templates/choice-chips.svg +1 -1
- package/docs/design/templates/composer/chat-dark.svg +1 -0
- package/docs/design/templates/composer/chat.svg +1 -0
- package/docs/design/templates/composer/prompt-dark.svg +1 -0
- package/docs/design/templates/composer/prompt.svg +1 -0
- package/docs/design/templates/composer-dark.svg +1 -0
- package/docs/design/templates/composer.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/compact-dark.svg +1 -1
- package/docs/design/templates/list/compact.svg +1 -1
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -1
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -1
- package/docs/design/templates/list-action-row-dark.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l.svg +1 -1
- package/docs/design/templates/list-header/size-m-dark.svg +1 -1
- package/docs/design/templates/list-header/size-m.svg +1 -1
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xl.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-item/icon-tile.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/skeleton-dark.svg +1 -1
- package/docs/design/templates/skeleton.svg +1 -1
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/strip-dark.svg +1 -1
- package/docs/design/templates/state-banner/strip.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-text.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design-philosophy.md +9 -1
- package/docs/examples/command-palette-adapter.tsx +3 -3
- package/docs/layout.md +147 -14
- package/docs/nav-stack.md +132 -8
- package/docs/recipes.md +9 -9
- package/docs/split-view.md +3 -3
- package/docs/sunken-panel.md +2 -2
- package/docs/surface-scaffold.md +138 -7
- package/docs/tab-navigator.md +38 -1
- package/docs/type-contracts.md +16 -16
- package/docs/ui-analyzer.md +3 -1
- package/docs/ui-doctor.md +71 -0
- package/docs/ux-demo.md +6 -6
- package/docs/webawesome-theme.md +7 -0
- package/docs/workbench.md +10 -6
- package/docs/writing.md +152 -0
- package/doctor/copy-capitalization-checks.mjs +591 -0
- package/doctor/index.mjs +17 -8
- package/llms.txt +105 -11
- package/package.json +15 -1
- package/ux-demo/recipes/app-shell.tsx +11 -11
- package/ux-demo/recipes/collapsible-sidebar.tsx +12 -11
- package/ux-demo/recipes/compact-toolbar.tsx +10 -10
- package/ux-demo/recipes/composer-form.tsx +8 -8
- package/ux-demo/recipes/list-detail-dialog.tsx +13 -13
- package/ux-demo/recipes/list-workspace-states.tsx +13 -13
- package/ux-demo/recipes/loading-inspector.tsx +10 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +7 -7
- package/ux-demo/recipes/navigation-stack.tsx +5 -5
- package/ux-demo/recipes/workspace-header.tsx +5 -5
- package/dist/chunk-36TL6BCR.js.map +0 -1
- package/dist/chunk-4LOK4634.js +0 -21
- package/dist/chunk-4LOK4634.js.map +0 -1
- package/dist/chunk-6BRRUPJY.js.map +0 -1
- package/dist/chunk-6STQXRT4.js.map +0 -1
- package/dist/chunk-76PWEN5Y.js +0 -64
- package/dist/chunk-76PWEN5Y.js.map +0 -1
- package/dist/chunk-AYHC62OZ.js.map +0 -1
- package/dist/chunk-BU23Z5HZ.js.map +0 -1
- package/dist/chunk-DQDTZE4W.js +0 -70
- package/dist/chunk-DQDTZE4W.js.map +0 -1
- package/dist/chunk-FOQK4F3L.js.map +0 -1
- package/dist/chunk-GJYQ27C2.js.map +0 -1
- package/dist/chunk-JYD7G4RG.js.map +0 -1
- package/dist/chunk-KQDU7Z7P.js.map +0 -1
- package/dist/chunk-P74VXMB6.js.map +0 -1
- package/dist/chunk-PBT3CPPY.js.map +0 -1
- package/dist/chunk-PRG4CL3Q.js.map +0 -1
- package/dist/chunk-ROZLJULF.js.map +0 -1
- package/dist/chunk-U657IHFB.js.map +0 -1
- package/dist/chunk-V6W56V3N.js.map +0 -1
|
@@ -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
|
|
@@ -48,10 +48,21 @@
|
|
|
48
48
|
.kui-tab-bar__tabs[data-snap-tabs="true"] {
|
|
49
49
|
scroll-snap-type: x mandatory;
|
|
50
50
|
scroll-padding-inline-start: var(--kui-tab-bar-snap-inset, 0px);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
}
|
|
52
|
+
/* The snap end room is scrollable content after the last tab, not padding on
|
|
53
|
+
the strip: padding is part of the strip's box, which a flex item cannot
|
|
54
|
+
shrink below, so a room measured at one width would hold the strip open
|
|
55
|
+
past its allocation when it narrows and push the trailing and end zones out
|
|
56
|
+
of the bar. As content it lengthens only the scroll range, and the strip
|
|
57
|
+
still shrinks to its allocation. The start margin gives back the strip gap,
|
|
58
|
+
so an empty room adds no width. */
|
|
59
|
+
.kui-tab-bar__tabs[data-snap-tabs="true"]::after {
|
|
60
|
+
content: "";
|
|
61
|
+
inline-size: var(--kui-tab-bar-snap-end-extra, 0px);
|
|
62
|
+
margin-inline-start: calc(-1 * var(--kui-tab-bar-strip-gap, 0px));
|
|
63
|
+
pointer-events: none;
|
|
64
|
+
align-self: stretch;
|
|
65
|
+
flex: none;
|
|
55
66
|
}
|
|
56
67
|
.kui-tab-bar[data-icon-only-at] .kui-tab-bar__tabs {
|
|
57
68
|
container: kui-tab-bar-tabs / inline-size;
|
|
@@ -69,10 +69,12 @@
|
|
|
69
69
|
):only-child
|
|
70
70
|
)
|
|
71
71
|
) {
|
|
72
|
-
padding-block
|
|
72
|
+
padding-block: var(--kui-edge-inset-block-start)
|
|
73
|
+
var(--kui-edge-inset-block-end);
|
|
73
74
|
padding-inline: var(--kui-edge-inset-inline-start)
|
|
74
75
|
var(--kui-edge-inset-inline-end);
|
|
75
|
-
scroll-padding-block
|
|
76
|
+
scroll-padding-block: var(--kui-edge-inset-block-start)
|
|
77
|
+
var(--kui-edge-inset-block-end);
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
/* A plain scene adds one outer gutter; a sole Pane or layout keeps ownership
|
|
@@ -91,13 +93,15 @@
|
|
|
91
93
|
padding-block-start: calc(
|
|
92
94
|
var(--kui-edge-inset-block-start) + var(--kui-space-xs)
|
|
93
95
|
);
|
|
94
|
-
padding-block-end:
|
|
96
|
+
padding-block-end: calc(
|
|
97
|
+
var(--kui-edge-inset-block-end) + var(--kui-space-xs)
|
|
98
|
+
);
|
|
95
99
|
padding-inline: calc(var(--kui-edge-inset-inline-start) + var(--kui-space-xs))
|
|
96
100
|
calc(var(--kui-edge-inset-inline-end) + var(--kui-space-xs));
|
|
97
101
|
scroll-padding-block: calc(
|
|
98
102
|
var(--kui-edge-inset-block-start) + var(--kui-space-xs)
|
|
99
103
|
)
|
|
100
|
-
var(--kui-space-xs);
|
|
104
|
+
calc(var(--kui-edge-inset-block-end) + var(--kui-space-xs));
|
|
101
105
|
}
|
|
102
106
|
|
|
103
107
|
.kui-tab-scaffold__scene
|
|
@@ -164,6 +168,51 @@
|
|
|
164
168
|
--_kui-tab-scaffold-bar-divider: var(--kui-color-neutral-border-normal);
|
|
165
169
|
}
|
|
166
170
|
|
|
171
|
+
/* `barPresentation="overlay"`: the bar paints the translucent chrome
|
|
172
|
+
material. Once `wireTabNavigator` has measured the live bar
|
|
173
|
+
(`data-bar-overlay="measured"`, with its border-box block size, bottom safe
|
|
174
|
+
area and 1px top edge included, published on this root), the bar lies over
|
|
175
|
+
the scenes' bottom edge and the scenes hand that size to their content as
|
|
176
|
+
the block-end edge context (outranking the docked 0px above): a plain scene
|
|
177
|
+
pads and scroll-pads by it, and a sole Pane or layout (a NavStack, whose own
|
|
178
|
+
bottom toolbar then sits just above the bar) clears it itself. Content
|
|
179
|
+
scrolls visibly beneath the bar while its last item rests clear of it.
|
|
180
|
+
Unwired, the bar stays docked. */
|
|
181
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"] > .kui-tab-scaffold__bar {
|
|
182
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
183
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
184
|
+
background: var(--kui-chrome-material);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"] {
|
|
188
|
+
position: relative;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"]
|
|
192
|
+
> .kui-tab-scaffold__bar {
|
|
193
|
+
position: absolute;
|
|
194
|
+
z-index: 2;
|
|
195
|
+
inset-block-end: 0;
|
|
196
|
+
/* Like the NavStack overlay bars, it ends where a classic scrollbar's
|
|
197
|
+
track begins, so the thumb and buttons stay visible and usable. */
|
|
198
|
+
inset-inline: 0 var(--_kui-tab-scaffold-bar-scrollbar-inline-size, 0px);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"][data-bar-overlay="measured"]
|
|
202
|
+
> .kui-tab-scaffold__scenes {
|
|
203
|
+
--kui-edge-inset-block-end: var(--_kui-tab-scaffold-bar-block-size, 0px);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@media (forced-colors: active) {
|
|
207
|
+
/* Its always-present 1px top border becomes the visible edge. */
|
|
208
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"] > .kui-tab-scaffold__bar {
|
|
209
|
+
-webkit-backdrop-filter: none;
|
|
210
|
+
backdrop-filter: none;
|
|
211
|
+
background: Canvas;
|
|
212
|
+
border-block-start-color: CanvasText;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
167
216
|
.kui-tab-scaffold__tab {
|
|
168
217
|
display: flex;
|
|
169
218
|
flex: 1 1 0;
|
|
@@ -185,6 +234,32 @@
|
|
|
185
234
|
color: var(--kui-color-brand-on-quiet);
|
|
186
235
|
}
|
|
187
236
|
|
|
237
|
+
/* Over the material, content of any color passes beneath the bar. Both label
|
|
238
|
+
colors fall below AA over the worst case (the material over black in light,
|
|
239
|
+
white in dark): the quiet unselected color, and in light the brand selected
|
|
240
|
+
color (about 3.2:1). An unselected tab lifts halfway toward the normal text
|
|
241
|
+
color, as an overlaid ToolbarText description does, and the selected tab
|
|
242
|
+
mixes 40% of it into the brand color, staying plainly the brand hue. */
|
|
243
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"]
|
|
244
|
+
> .kui-tab-scaffold__bar
|
|
245
|
+
> .kui-tab-scaffold__tab:not([aria-selected="true"]) {
|
|
246
|
+
color: color-mix(
|
|
247
|
+
in srgb,
|
|
248
|
+
var(--kui-color-text-quiet),
|
|
249
|
+
var(--kui-color-text) 50%
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.kui-tab-scaffold[data-bar-presentation="overlay"]
|
|
254
|
+
> .kui-tab-scaffold__bar
|
|
255
|
+
> .kui-tab-scaffold__tab[aria-selected="true"] {
|
|
256
|
+
color: color-mix(
|
|
257
|
+
in srgb,
|
|
258
|
+
var(--kui-color-brand-on-quiet),
|
|
259
|
+
var(--kui-color-text) 40%
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
188
263
|
.kui-tab-scaffold__tab:focus-visible {
|
|
189
264
|
outline: var(--kui-focus-ring);
|
|
190
265
|
outline-offset: -2px;
|
|
@@ -96,6 +96,185 @@
|
|
|
96
96
|
.kui-dialog-surface[data-footer-inset="comfortable"] > wa-dialog::part(footer) {
|
|
97
97
|
padding: var(--kui-wa-container-inset, 1rem);
|
|
98
98
|
}
|
|
99
|
+
/* Fixed rows above one filling row: the leading children keep their natural
|
|
100
|
+
height and the last unslotted child (the light-DOM children are the body
|
|
101
|
+
slot's flex items) takes the rest and owns its scrolling. */
|
|
102
|
+
.kui-dialog-surface[data-body-layout="fill-last"] > wa-dialog::part(body) {
|
|
103
|
+
display: flex;
|
|
104
|
+
flex-direction: column;
|
|
105
|
+
overflow: hidden;
|
|
106
|
+
}
|
|
107
|
+
.kui-dialog-surface[data-body-layout="fill-last"] > wa-dialog > :not([slot]) {
|
|
108
|
+
flex: none;
|
|
109
|
+
}
|
|
110
|
+
.kui-dialog-surface[data-body-layout="fill-last"]
|
|
111
|
+
> wa-dialog
|
|
112
|
+
> :nth-last-child(1 of :not([slot])) {
|
|
113
|
+
flex: 1 1 0;
|
|
114
|
+
min-block-size: 0;
|
|
115
|
+
}
|
|
116
|
+
/* A floating footer lies over the body's block end, inset from the panel's
|
|
117
|
+
inline and block-end edges; the top-layer panel is its positioning
|
|
118
|
+
context. The register publishes the footer's measured block size on the
|
|
119
|
+
panel, and the body reserves it (plus the offset) after its own inset, so
|
|
120
|
+
flowing content scrolls beneath the footer and a filling child's scrollport
|
|
121
|
+
ends above it: the last content is never hidden. */
|
|
122
|
+
.kui-dialog-surface[data-footer-presentation="floating"] > wa-dialog {
|
|
123
|
+
--_kui-dialog-surface-footer-resolved-offset: max(
|
|
124
|
+
0px,
|
|
125
|
+
var(
|
|
126
|
+
--_kui-dialog-surface-footer-offset,
|
|
127
|
+
var(--kui-wa-container-inset, 1rem)
|
|
128
|
+
)
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
.kui-dialog-surface[data-footer-presentation="floating"]
|
|
132
|
+
> wa-dialog::part(footer) {
|
|
133
|
+
position: absolute;
|
|
134
|
+
inset-inline: var(--_kui-dialog-surface-footer-resolved-offset);
|
|
135
|
+
inset-block-end: var(--_kui-dialog-surface-footer-resolved-offset);
|
|
136
|
+
z-index: 1;
|
|
137
|
+
background: transparent;
|
|
138
|
+
}
|
|
139
|
+
.kui-dialog-surface[data-footer-presentation="floating"]
|
|
140
|
+
> wa-dialog::part(body) {
|
|
141
|
+
--_kui-dialog-surface-footer-clearance: calc(
|
|
142
|
+
var(--_kui-dialog-surface-footer-block-size, 0px) +
|
|
143
|
+
var(--_kui-dialog-surface-footer-resolved-offset)
|
|
144
|
+
);
|
|
145
|
+
scroll-padding-block-end: var(--_kui-dialog-surface-footer-clearance);
|
|
146
|
+
}
|
|
147
|
+
.kui-dialog-surface[data-footer-presentation="floating"][data-body-inset="none"]
|
|
148
|
+
> wa-dialog::part(body) {
|
|
149
|
+
padding-block-end: var(--_kui-dialog-surface-footer-clearance);
|
|
150
|
+
}
|
|
151
|
+
.kui-dialog-surface[data-footer-presentation="floating"][data-body-inset="compact"]
|
|
152
|
+
> wa-dialog::part(body) {
|
|
153
|
+
padding-block-end: calc(
|
|
154
|
+
var(--kui-wa-surface-inset, 0.5rem) +
|
|
155
|
+
var(--_kui-dialog-surface-footer-clearance)
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
.kui-dialog-surface[data-footer-presentation="floating"][data-body-inset="comfortable"]
|
|
159
|
+
> wa-dialog::part(body) {
|
|
160
|
+
padding-block-end: calc(
|
|
161
|
+
var(--kui-wa-container-inset, 1rem) +
|
|
162
|
+
var(--_kui-dialog-surface-footer-clearance)
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
/* Scroll clearance. A dialog body starts a new scroll context, so it clears
|
|
166
|
+
any `--kui-scroll-clearance-*` a page region published around the dialog.
|
|
167
|
+
With a floating footer over a filling child that opts into block-end
|
|
168
|
+
`scrollClearance` (a transcript List or Pane), the body stops reserving the
|
|
169
|
+
footer below that child: the child reaches the panel's block end, the body
|
|
170
|
+
publishes the footer's clearance for it, and the child adds it inside its
|
|
171
|
+
own scroll area, so content scrolls visibly beneath the transparent footer
|
|
172
|
+
while its last item still comes to rest above it. */
|
|
173
|
+
.kui-dialog-surface > wa-dialog::part(body) {
|
|
174
|
+
--kui-scroll-clearance-block-start: 0px;
|
|
175
|
+
--kui-scroll-clearance-block-end: 0px;
|
|
176
|
+
}
|
|
177
|
+
.kui-dialog-surface[data-footer-presentation="floating"]:is(
|
|
178
|
+
[data-body-layout="fill"],
|
|
179
|
+
[data-body-layout="fill-last"]
|
|
180
|
+
)
|
|
181
|
+
> wa-dialog:has(
|
|
182
|
+
> :nth-last-child(1 of :not([slot])):is(
|
|
183
|
+
[data-scroll-clearance="block-end"],
|
|
184
|
+
[data-scroll-clearance="both"]
|
|
185
|
+
)
|
|
186
|
+
)::part(body) {
|
|
187
|
+
--kui-scroll-clearance-block-end: var(--_kui-dialog-surface-footer-clearance);
|
|
188
|
+
padding-block-end: 0;
|
|
189
|
+
}
|
|
190
|
+
/* A floating header lies over the body's block-start edge on the
|
|
191
|
+
translucent chrome material (opaque under reduced transparency, increased
|
|
192
|
+
contrast, or without backdrop-filter; a system surface in forced colors).
|
|
193
|
+
The register publishes the header's measured block size on the panel; the
|
|
194
|
+
header gives that height back as a negative block-end margin, so the body
|
|
195
|
+
starts at the panel's block-start edge beneath it, and the body reserves it
|
|
196
|
+
again before its own inset (with a matching scroll-padding): flowing
|
|
197
|
+
content rests below the title bar and scrolls beneath it. Unmeasured, the
|
|
198
|
+
size resolves to 0px and the header stays docked. */
|
|
199
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
200
|
+
> wa-dialog::part(header) {
|
|
201
|
+
position: relative;
|
|
202
|
+
z-index: 1;
|
|
203
|
+
margin-block-end: calc(
|
|
204
|
+
-1 * var(--_kui-dialog-surface-header-block-size, 0px)
|
|
205
|
+
);
|
|
206
|
+
-webkit-backdrop-filter: var(--kui-chrome-material-filter);
|
|
207
|
+
backdrop-filter: var(--kui-chrome-material-filter);
|
|
208
|
+
background: var(--kui-chrome-material-raised);
|
|
209
|
+
box-shadow: inset 0 -1px
|
|
210
|
+
var(--_kui-dialog-surface-header-divider, transparent);
|
|
211
|
+
}
|
|
212
|
+
/* The floating header's divider is scroll state, as on a Pane's overlay
|
|
213
|
+
header: the register publishes `--_kui-dialog-surface-header-divider` on
|
|
214
|
+
the panel (as this color) only while the body, or a filling child that
|
|
215
|
+
reaches beneath the header, is scrolled away from its top. The line is an
|
|
216
|
+
inset shadow, so showing it never moves the header or the content. */
|
|
217
|
+
.kui-dialog-surface[data-header-presentation="floating"] > wa-dialog {
|
|
218
|
+
--_kui-dialog-surface-header-divider-color: var(
|
|
219
|
+
--kui-color-neutral-border-normal
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
223
|
+
> wa-dialog::part(body) {
|
|
224
|
+
--_kui-dialog-surface-header-clearance: var(
|
|
225
|
+
--_kui-dialog-surface-header-block-size,
|
|
226
|
+
0px
|
|
227
|
+
);
|
|
228
|
+
scroll-padding-block-start: var(--_kui-dialog-surface-header-clearance);
|
|
229
|
+
}
|
|
230
|
+
.kui-dialog-surface[data-header-presentation="floating"][data-body-inset="none"]
|
|
231
|
+
> wa-dialog::part(body) {
|
|
232
|
+
padding-block-start: var(--_kui-dialog-surface-header-clearance);
|
|
233
|
+
}
|
|
234
|
+
.kui-dialog-surface[data-header-presentation="floating"][data-body-inset="compact"]
|
|
235
|
+
> wa-dialog::part(body) {
|
|
236
|
+
padding-block-start: calc(
|
|
237
|
+
var(--kui-wa-surface-inset, 0.5rem) +
|
|
238
|
+
var(--_kui-dialog-surface-header-clearance)
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
.kui-dialog-surface[data-header-presentation="floating"][data-body-inset="comfortable"]
|
|
242
|
+
> wa-dialog::part(body) {
|
|
243
|
+
padding-block-start: calc(
|
|
244
|
+
var(--kui-wa-container-inset, 1rem) +
|
|
245
|
+
var(--_kui-dialog-surface-header-clearance)
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
/* A filling child that is the body's only child and opts into block-start
|
|
249
|
+
`scrollClearance` reaches the panel's block-start edge beneath the floating
|
|
250
|
+
header: the body publishes the header's clearance for it, and the child
|
|
251
|
+
adds it inside its own scroll area, so content scrolls visibly beneath the
|
|
252
|
+
title bar while its first item still rests below it. Leading children of
|
|
253
|
+
`fill-last` keep the body's reservation instead. */
|
|
254
|
+
.kui-dialog-surface[data-header-presentation="floating"]:is(
|
|
255
|
+
[data-body-layout="fill"],
|
|
256
|
+
[data-body-layout="fill-last"]
|
|
257
|
+
)
|
|
258
|
+
> wa-dialog:has(
|
|
259
|
+
> :nth-child(1 of :not([slot])):nth-last-child(1 of :not([slot])):is(
|
|
260
|
+
[data-scroll-clearance="block-start"],
|
|
261
|
+
[data-scroll-clearance="both"]
|
|
262
|
+
)
|
|
263
|
+
)::part(body) {
|
|
264
|
+
--kui-scroll-clearance-block-start: var(
|
|
265
|
+
--_kui-dialog-surface-header-clearance
|
|
266
|
+
);
|
|
267
|
+
padding-block-start: 0;
|
|
268
|
+
}
|
|
269
|
+
@media (forced-colors: active) {
|
|
270
|
+
.kui-dialog-surface[data-header-presentation="floating"]
|
|
271
|
+
> wa-dialog::part(header) {
|
|
272
|
+
-webkit-backdrop-filter: none;
|
|
273
|
+
backdrop-filter: none;
|
|
274
|
+
background: Canvas;
|
|
275
|
+
border-block-end: 1px solid CanvasText;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
99
278
|
.kui-dialog-surface[data-presentation="side-sheet"] > wa-dialog::part(dialog) {
|
|
100
279
|
width: min(30rem, 100vw);
|
|
101
280
|
max-width: 100vw;
|
|
@@ -199,6 +378,22 @@
|
|
|
199
378
|
overflow: hidden;
|
|
200
379
|
grid-template-rows: minmax(0, 1fr);
|
|
201
380
|
}
|
|
381
|
+
/* Fixed rows above one filling last child, which owns its scrolling. */
|
|
382
|
+
.kui-popover-dialog-surface[data-body-layout="fill-last"]:is(
|
|
383
|
+
:popover-open,
|
|
384
|
+
[data-presentation="embedded"]
|
|
385
|
+
) {
|
|
386
|
+
display: flex;
|
|
387
|
+
flex-direction: column;
|
|
388
|
+
overflow: hidden;
|
|
389
|
+
}
|
|
390
|
+
.kui-popover-dialog-surface[data-body-layout="fill-last"] > * {
|
|
391
|
+
flex: none;
|
|
392
|
+
}
|
|
393
|
+
.kui-popover-dialog-surface[data-body-layout="fill-last"] > :last-child {
|
|
394
|
+
flex: 1 1 0;
|
|
395
|
+
min-block-size: 0;
|
|
396
|
+
}
|
|
202
397
|
/* In flow for a catalog or inline use: the same surface without the top
|
|
203
398
|
layer, never wider than its container. */
|
|
204
399
|
.kui-popover-dialog-surface[data-presentation="embedded"] {
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* A chat or prompt composer: a raised frame (surface-raised, the standard
|
|
2
|
+
neutral border, large radius, shadow-l) whose border turns brand while
|
|
3
|
+
focus is within. It holds a borderless message field that sizes to its
|
|
4
|
+
content between the min and max row counts, above an action row with a
|
|
5
|
+
quiet hint and trailing actions. The 8px padding puts the field's text on
|
|
6
|
+
the 17px text column when the composer sits 8px from a container edge. */
|
|
7
|
+
|
|
8
|
+
.kui-composer {
|
|
9
|
+
--_kui-composer-min-rows: 1;
|
|
10
|
+
--_kui-composer-max-rows: 8;
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: var(--kui-layout-control-gap, 0.5rem);
|
|
14
|
+
/* Fill the container's inline size: a content-sized field would otherwise
|
|
15
|
+
shrink the frame to its text. */
|
|
16
|
+
width: 100%;
|
|
17
|
+
min-width: 0;
|
|
18
|
+
box-sizing: border-box;
|
|
19
|
+
padding: var(--kui-layout-item-padding, 0.5rem);
|
|
20
|
+
border: 1px solid var(--kui-color-neutral-border-normal);
|
|
21
|
+
border-radius: var(--kui-radius-l);
|
|
22
|
+
color: var(--kui-color-neutral-on-normal);
|
|
23
|
+
background: var(--kui-color-surface-raised);
|
|
24
|
+
box-shadow: var(--kui-shadow-l);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* The frame is the field's boundary, so it carries the focus state. */
|
|
28
|
+
.kui-composer:focus-within {
|
|
29
|
+
border-color: var(--kui-color-brand-border-loud);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.kui-composer__field {
|
|
33
|
+
display: block;
|
|
34
|
+
width: 100%;
|
|
35
|
+
min-width: 0;
|
|
36
|
+
box-sizing: border-box;
|
|
37
|
+
margin: 0;
|
|
38
|
+
padding: 0.25rem 0;
|
|
39
|
+
border: 0;
|
|
40
|
+
outline: none;
|
|
41
|
+
color: inherit;
|
|
42
|
+
background: transparent;
|
|
43
|
+
font: inherit;
|
|
44
|
+
font-size: var(--kui-font-m, inherit);
|
|
45
|
+
line-height: var(--wa-line-height-normal, 1.6);
|
|
46
|
+
resize: none;
|
|
47
|
+
field-sizing: content;
|
|
48
|
+
min-height: calc(var(--_kui-composer-min-rows) * 1lh + 0.5rem);
|
|
49
|
+
max-height: calc(var(--_kui-composer-max-rows) * 1lh + 0.5rem);
|
|
50
|
+
overflow-y: auto;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Engines without content sizing keep a three-line field, clamped to the
|
|
54
|
+
row bounds, that scrolls once the message is longer. */
|
|
55
|
+
@supports not (field-sizing: content) {
|
|
56
|
+
.kui-composer__field {
|
|
57
|
+
height: calc(
|
|
58
|
+
clamp(var(--_kui-composer-min-rows), 3, var(--_kui-composer-max-rows)) *
|
|
59
|
+
1lh + 0.5rem
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.kui-composer__field::placeholder {
|
|
65
|
+
color: var(--kui-color-neutral-on-quiet);
|
|
66
|
+
opacity: 1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.kui-composer__field:disabled {
|
|
70
|
+
color: var(--kui-color-neutral-on-quiet);
|
|
71
|
+
cursor: not-allowed;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.kui-composer__actions {
|
|
75
|
+
display: flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: var(--kui-layout-control-gap, 0.5rem);
|
|
78
|
+
min-width: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.kui-composer__hint {
|
|
82
|
+
flex: 1 1 auto;
|
|
83
|
+
min-width: 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.kui-composer__trailing {
|
|
87
|
+
display: flex;
|
|
88
|
+
flex: none;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: var(--kui-layout-control-gap, 0.5rem);
|
|
91
|
+
margin-inline-start: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@media (forced-colors: active) {
|
|
95
|
+
.kui-composer:focus-within {
|
|
96
|
+
border-color: Highlight;
|
|
97
|
+
outline: 2px solid Highlight;
|
|
98
|
+
outline-offset: 1px;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -104,6 +104,32 @@
|
|
|
104
104
|
--_kui-popup-row-current-color: var(--kui-color-brand-on-fill);
|
|
105
105
|
--_kui-popup-group-title-padding: 0.2rem 0.75rem 0.3rem;
|
|
106
106
|
--_kui-popup-group-title-font-weight: 750;
|
|
107
|
+
/* A capped, scrolling popup shows that it scrolls: a soft shadow along an
|
|
108
|
+
edge while more choices lie beyond it. Covers painted in the surface
|
|
109
|
+
color scroll with the content (`local`) and hide each shadow (`scroll`,
|
|
110
|
+
fixed to the box) only while the list rests at that edge, so a popup
|
|
111
|
+
whose choices all fit, or one scrolled to its end, draws no cue there.
|
|
112
|
+
CSS alone, so it works in every engine with no listeners, and it leaves
|
|
113
|
+
the popup's own border, radius, and drop shadow untouched. */
|
|
114
|
+
--_kui-popup-scroll-cue-color: light-dark(rgb(0 0 0 / 0.2), rgb(0 0 0 / 0.9));
|
|
115
|
+
--_kui-popup-scroll-cue:
|
|
116
|
+
linear-gradient(var(--kui-color-surface-raised) 30%, transparent) center
|
|
117
|
+
top / 100% 1.5rem no-repeat local,
|
|
118
|
+
linear-gradient(transparent, var(--kui-color-surface-raised) 70%) center
|
|
119
|
+
bottom / 100% 1.5rem no-repeat local,
|
|
120
|
+
radial-gradient(
|
|
121
|
+
farthest-side at 50% 0,
|
|
122
|
+
var(--_kui-popup-scroll-cue-color),
|
|
123
|
+
transparent
|
|
124
|
+
)
|
|
125
|
+
center top / 100% 0.75rem no-repeat scroll,
|
|
126
|
+
radial-gradient(
|
|
127
|
+
farthest-side at 50% 100%,
|
|
128
|
+
var(--_kui-popup-scroll-cue-color),
|
|
129
|
+
transparent
|
|
130
|
+
)
|
|
131
|
+
center bottom / 100% 0.75rem no-repeat scroll,
|
|
132
|
+
var(--kui-color-surface-raised);
|
|
107
133
|
--_kui-popup-caret-open-rotation: -180deg;
|
|
108
134
|
--_kui-popup-caret-transition: rotate var(--wa-transition-slow, 0.3s)
|
|
109
135
|
var(--wa-transition-easing, ease);
|
|
@@ -139,6 +165,28 @@
|
|
|
139
165
|
--kui-sunken-surface:
|
|
140
166
|
var(--kui-sunken-texture) 0 0 / 100px 100px repeat,
|
|
141
167
|
var(--kui-color-surface-lowered);
|
|
168
|
+
/* Translucent chrome material: a bar laid over scrolling content (a Pane's
|
|
169
|
+
overlay header) lets the content show through, blurred, beneath it.
|
|
170
|
+
80% of the surface keeps --kui-color-text at AA over any content
|
|
171
|
+
(about 10:1 light and 8:1 dark against a black or white backdrop). It
|
|
172
|
+
resolves to the opaque surface under prefers-reduced-transparency or
|
|
173
|
+
prefers-contrast: more, and where backdrop-filter is unsupported
|
|
174
|
+
(below). */
|
|
175
|
+
--kui-chrome-material: color-mix(
|
|
176
|
+
in srgb,
|
|
177
|
+
var(--kui-color-surface) 80%,
|
|
178
|
+
transparent
|
|
179
|
+
);
|
|
180
|
+
/* The same material over a raised surface (a dialog panel's floating
|
|
181
|
+
header): 80% of surface-raised keeps --kui-color-text at AA over any
|
|
182
|
+
content (about 10:1 light and 6.7:1 dark against a black or white
|
|
183
|
+
backdrop), with the same opaque fallbacks. */
|
|
184
|
+
--kui-chrome-material-raised: color-mix(
|
|
185
|
+
in srgb,
|
|
186
|
+
var(--kui-color-surface-raised) 80%,
|
|
187
|
+
transparent
|
|
188
|
+
);
|
|
189
|
+
--kui-chrome-material-filter: blur(20px) saturate(180%);
|
|
142
190
|
--kui-color-text: var(--wa-color-text-normal, light-dark(#1d1d1f, #f5f5f7));
|
|
143
191
|
--kui-color-text-quiet: var(
|
|
144
192
|
--wa-color-text-quiet,
|
|
@@ -479,6 +527,24 @@
|
|
|
479
527
|
--kui-safe-area-inline-end: env(safe-area-inset-left, 0px);
|
|
480
528
|
}
|
|
481
529
|
|
|
530
|
+
@supports not (
|
|
531
|
+
(backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))
|
|
532
|
+
) {
|
|
533
|
+
:root {
|
|
534
|
+
--kui-chrome-material: var(--kui-color-surface);
|
|
535
|
+
--kui-chrome-material-raised: var(--kui-color-surface-raised);
|
|
536
|
+
--kui-chrome-material-filter: none;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
@media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
|
|
541
|
+
:root {
|
|
542
|
+
--kui-chrome-material: var(--kui-color-surface);
|
|
543
|
+
--kui-chrome-material-raised: var(--kui-color-surface-raised);
|
|
544
|
+
--kui-chrome-material-filter: none;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
482
548
|
@media (prefers-contrast: more) {
|
|
483
549
|
:root {
|
|
484
550
|
--kui-color-pop-fill-quiet: Canvas;
|