@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
|
@@ -83,6 +83,11 @@
|
|
|
83
83
|
"owner": "application",
|
|
84
84
|
"required": false
|
|
85
85
|
},
|
|
86
|
+
{
|
|
87
|
+
"id": "link destination and download file name",
|
|
88
|
+
"owner": "application",
|
|
89
|
+
"required": false
|
|
90
|
+
},
|
|
86
91
|
{ "id": "disabled policy", "owner": "application", "required": false }
|
|
87
92
|
],
|
|
88
93
|
"wiring": {
|
|
@@ -99,6 +104,8 @@
|
|
|
99
104
|
"accessibility": {
|
|
100
105
|
"obligations": [
|
|
101
106
|
"The remove control is a native button and requires an action and a specific removeLabel. A disabled chip disables that button and removes it from keyboard interaction.",
|
|
107
|
+
"A link chip is a native anchor named by its visible label; external adds a safe rel, a new tab, and an \"(opens in new tab)\" name suffix, and a disabled link chip drops its destination and leaves the tab order.",
|
|
108
|
+
"The inherit tone paints no fill, so its label keeps the surrounding text contrast, and its focus ring follows the surrounding foreground.",
|
|
102
109
|
"Keep meaningful tag text visible because tone is supplementary."
|
|
103
110
|
]
|
|
104
111
|
},
|
|
@@ -241,7 +248,7 @@
|
|
|
241
248
|
"key": "@kerfjs/ui:foundation",
|
|
242
249
|
"package": "@kerfjs/ui",
|
|
243
250
|
"id": "foundation",
|
|
244
|
-
"name": "Foundation
|
|
251
|
+
"name": "Foundation Tokens",
|
|
245
252
|
"kind": "composition",
|
|
246
253
|
"source": "kerf",
|
|
247
254
|
"parents": { "mode": "any", "entries": [] },
|
|
@@ -330,6 +337,9 @@
|
|
|
330
337
|
"--kui-color-surface-lowered",
|
|
331
338
|
"--kui-sunken-texture",
|
|
332
339
|
"--kui-sunken-surface",
|
|
340
|
+
"--kui-chrome-material",
|
|
341
|
+
"--kui-chrome-material-raised",
|
|
342
|
+
"--kui-chrome-material-filter",
|
|
333
343
|
"--kui-color-text",
|
|
334
344
|
"--kui-color-text-quiet",
|
|
335
345
|
"--kui-color-text-link",
|
|
@@ -407,7 +417,7 @@
|
|
|
407
417
|
"key": "@kerfjs/ui:document-baseline",
|
|
408
418
|
"package": "@kerfjs/ui",
|
|
409
419
|
"id": "document-baseline",
|
|
410
|
-
"name": "Document
|
|
420
|
+
"name": "Document Baseline",
|
|
411
421
|
"kind": "composition",
|
|
412
422
|
"source": "kerf",
|
|
413
423
|
"parents": { "mode": "any", "entries": [] },
|
|
@@ -467,7 +477,7 @@
|
|
|
467
477
|
"key": "@kerfjs/ui:layout",
|
|
468
478
|
"package": "@kerfjs/ui",
|
|
469
479
|
"id": "layout",
|
|
470
|
-
"name": "Application
|
|
480
|
+
"name": "Application Layout",
|
|
471
481
|
"kind": "composition",
|
|
472
482
|
"source": "kerf",
|
|
473
483
|
"parents": { "mode": "any", "entries": [] },
|
|
@@ -626,6 +636,16 @@
|
|
|
626
636
|
"id": "optional keyboard or programmatic focus (tabIndex) and persistent focus outline (outlined)",
|
|
627
637
|
"owner": "application",
|
|
628
638
|
"required": false
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"id": "whether the scrolling content clears overlaying chrome on its block edges (scrollClearance, also in PaneConfig, so a Workbench mainPane or panel pane, a CollapsiblePanel pane, or a NavStack view pane forwards it)",
|
|
642
|
+
"owner": "application",
|
|
643
|
+
"required": false
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
"id": "whether the header is docked in its own row or laid over the scrolling content on the translucent chrome material (headerPresentation, also in PaneConfig)",
|
|
647
|
+
"owner": "application",
|
|
648
|
+
"required": false
|
|
629
649
|
}
|
|
630
650
|
],
|
|
631
651
|
"wiring": {
|
|
@@ -644,6 +664,12 @@
|
|
|
644
664
|
"on": "kui-pane__header and kui-pane__footer",
|
|
645
665
|
"helper": "wireScrollDividers",
|
|
646
666
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"name": "data-header-overlay",
|
|
670
|
+
"on": "kui-pane",
|
|
671
|
+
"helper": "wireScrollDividers",
|
|
672
|
+
"meaning": "measured once the wiring has measured an overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root (and a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered); the header then lies over the content, which clears it. Both are re-applied if a re-render drops them."
|
|
647
673
|
}
|
|
648
674
|
]
|
|
649
675
|
},
|
|
@@ -659,14 +685,17 @@
|
|
|
659
685
|
"Safe areas: the root and separators paint through unsafe areas while header, content, and footer pad the sides the pane still reaches (routed by --kui-edge-inset-*); content block insets are scroll padding.",
|
|
660
686
|
"The scrolling content exposes its resolved logical inline padding to descendants as --kui-pane-content-inset-inline-start/end, including safe areas and deepInset.",
|
|
661
687
|
"deepInset adds --kui-space-xs to every side of the scrolling content and its block scroll padding; header/footer chrome still owns safe-area padding at its edge.",
|
|
662
|
-
"For opaque edge-to-edge children, --kui-pane-scrollbar-gutter: stable reserves a vertical scrollbar gutter outside the published content insets; the default is auto."
|
|
688
|
+
"For opaque edge-to-edge children, --kui-pane-scrollbar-gutter: stable reserves a vertical scrollbar gutter outside the published content insets; the default is auto.",
|
|
689
|
+
"scrollClearance adds the inherited --kui-scroll-clearance-block-start/end context, published by overlaying chrome, to the scrolling content block padding and scroll padding alongside safe areas and deepInset.",
|
|
690
|
+
"headerPresentation overlay: once wireScrollDividers measures the header, the header shares the content cell above the scroller, its border-box height is published as --kui-scroll-clearance-block-start on the Pane root, and the content clears it automatically; unwired or with chromePlacement auto, the header stays docked."
|
|
663
691
|
]
|
|
664
692
|
}
|
|
665
693
|
},
|
|
666
694
|
"accessibility": {
|
|
667
695
|
"obligations": [
|
|
668
696
|
"Choose semantic root and content elements that match the region and provide labels for landmark elements.",
|
|
669
|
-
"Keep fixed header/footer chrome outside the single scrolling content slot so reading and focus order remain coherent."
|
|
697
|
+
"Keep fixed header/footer chrome outside the single scrolling content slot so reading and focus order remain coherent.",
|
|
698
|
+
"An overlay header's text uses the normal text color, which keeps WCAG AA over the 80% chrome material on any content; the material turns opaque under prefers-reduced-transparency, prefers-contrast: more, forced colors, or without backdrop-filter."
|
|
670
699
|
]
|
|
671
700
|
},
|
|
672
701
|
"cssValueProps": [],
|
|
@@ -690,7 +719,10 @@
|
|
|
690
719
|
"--kui-pane-content-inset-inline-start",
|
|
691
720
|
"--kui-pane-content-inset-inline-end",
|
|
692
721
|
"--kui-pane-scrollbar-gutter",
|
|
693
|
-
"--kui-sunken-panel-background"
|
|
722
|
+
"--kui-sunken-panel-background",
|
|
723
|
+
"--kui-chrome-material",
|
|
724
|
+
"--kui-chrome-material-filter",
|
|
725
|
+
"--kui-scroll-clearance-block-start"
|
|
694
726
|
]
|
|
695
727
|
},
|
|
696
728
|
"diagnostics": [],
|
|
@@ -755,6 +787,16 @@
|
|
|
755
787
|
"id": "whether the chrome and bottom-toolbar dividers follow the scroll, always show, or never show (chromeDividers)",
|
|
756
788
|
"owner": "application",
|
|
757
789
|
"required": false
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
"id": "whether the top chrome docks above the active view or lies over it on the translucent chrome material (chromePresentation)",
|
|
793
|
+
"owner": "application",
|
|
794
|
+
"required": false
|
|
795
|
+
},
|
|
796
|
+
{
|
|
797
|
+
"id": "whether the bottom toolbar docks below the active view or lies over it on the translucent chrome material (bottomToolbarPresentation)",
|
|
798
|
+
"owner": "application",
|
|
799
|
+
"required": false
|
|
758
800
|
}
|
|
759
801
|
],
|
|
760
802
|
"wiring": {
|
|
@@ -786,6 +828,18 @@
|
|
|
786
828
|
"helper": "wireNavStack",
|
|
787
829
|
"meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
|
|
788
830
|
},
|
|
831
|
+
{
|
|
832
|
+
"name": "data-chrome-overlay",
|
|
833
|
+
"on": "kui-nav-stack",
|
|
834
|
+
"helper": "wireNavStack",
|
|
835
|
+
"meaning": "measured once the helper has measured an overlay chrome (chromePresentation: overlay) and published its border-box height on the stack root; the chrome then lies over the active view, which clears it through the block-start edge context. Both are re-applied if a re-render drops them."
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"name": "data-bottom-toolbar-overlay",
|
|
839
|
+
"on": "kui-nav-stack",
|
|
840
|
+
"helper": "wireNavStack",
|
|
841
|
+
"meaning": "measured once the helper has measured an overlay bottom toolbar (bottomToolbarPresentation: overlay) and published its border-box height on the stack root; the toolbar then lies over the active view, which clears it through the block-end edge context. Both are re-applied if a re-render drops them."
|
|
842
|
+
},
|
|
789
843
|
{
|
|
790
844
|
"name": "data-scroll-overflow",
|
|
791
845
|
"on": "the active kui-nav-stack__view, or the kui-pane__content of a sole Pane in it",
|
|
@@ -797,6 +851,12 @@
|
|
|
797
851
|
"on": "kui-nav-stack__chrome and kui-nav-stack__bottom",
|
|
798
852
|
"helper": "wireScrollDividers",
|
|
799
853
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
"name": "data-header-overlay",
|
|
857
|
+
"on": "kui-pane",
|
|
858
|
+
"helper": "wireScrollDividers",
|
|
859
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
800
860
|
}
|
|
801
861
|
]
|
|
802
862
|
},
|
|
@@ -809,7 +869,9 @@
|
|
|
809
869
|
"padding": "child",
|
|
810
870
|
"notes": [
|
|
811
871
|
"The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content.",
|
|
812
|
-
"The top chrome's bottom line and the bottom toolbar's top line are scroll state (wireScrollDividers), drawn as an overlaid 1px pseudo-element on the chrome and the bottom toolbar's always-present 1px top border, so neither moves the chrome or the content."
|
|
872
|
+
"The top chrome's bottom line and the bottom toolbar's top line are scroll state (wireScrollDividers), drawn as an overlaid 1px pseudo-element on the chrome and the bottom toolbar's always-present 1px top border, so neither moves the chrome or the content.",
|
|
873
|
+
"chromePresentation overlay: once wireNavStack measures the live chrome (never a cross-fading copy), the chrome lies over the viewport's top edge and its border-box height, top safe area included, becomes the viewport's block-start --kui-edge-inset-* context, so a plain view, a sole Pane, or a nested layout pads and scroll-pads by it automatically; the chrome ends where a classic scrollbar in the active view begins, so its track stays uncovered; unwired, or with hideToolbar, the chrome stays docked.",
|
|
874
|
+
"bottomToolbarPresentation overlay: once wireNavStack measures the live bottom toolbar (never a cross-fading copy), the toolbar lies over the viewport's bottom edge and its border-box height, bottom safe area and divider border included, becomes the viewport's block-end --kui-edge-inset-* context, so a plain view, a sole Pane (its content, or its footer), or a nested layout pads and scroll-pads by it automatically and the last item rests just above the toolbar; it ends where a classic scrollbar in the active view begins; unwired, or while no bottom toolbar is shown, it stays docked. It is independent of chromePresentation, which governs only the top chrome."
|
|
813
875
|
]
|
|
814
876
|
}
|
|
815
877
|
},
|
|
@@ -818,7 +880,9 @@
|
|
|
818
880
|
"Give the stack region an accessible label and every back control a stable action label; visible backText names the control itself.",
|
|
819
881
|
"Set toolbarConfig.headingLevel when the view title is the page's or section's heading landmark.",
|
|
820
882
|
"Use wireNavStack so each controlled push moves focus into the new top view and each pop restores the revealed view's remembered descendant.",
|
|
821
|
-
"Mark a preferred initial heading or control with data-nav-focus when the first enabled focusable descendant is not the right target."
|
|
883
|
+
"Mark a preferred initial heading or control with data-nav-focus when the first enabled focusable descendant is not the right target.",
|
|
884
|
+
"Overlay chrome (chromePresentation overlay) keeps WCAG AA over content passing beneath the translucent material: an untoned ToolbarText there takes the normal text color for its title and lifts its description halfway toward it; keep other quiet copy in the view. The material turns opaque under reduced transparency, increased contrast, forced colors, or without backdrop-filter.",
|
|
885
|
+
"An overlay bottom toolbar (bottomToolbarPresentation overlay) keeps the same AA rule: an untoned ToolbarText there lifts its title and description, and a default-tone ToolbarControlGroup in either overlaid bar takes the normal text color for its controls. Its 1px top edge stays visible in forced colors."
|
|
822
886
|
]
|
|
823
887
|
},
|
|
824
888
|
"cssValueProps": [],
|
|
@@ -944,6 +1008,18 @@
|
|
|
944
1008
|
"on": "kui-nav-stack__view",
|
|
945
1009
|
"helper": "wireNavStack",
|
|
946
1010
|
"meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
"name": "data-chrome-overlay",
|
|
1014
|
+
"on": "kui-nav-stack",
|
|
1015
|
+
"helper": "wireNavStack",
|
|
1016
|
+
"meaning": "measured once the helper has measured the compact stack's overlay chrome (compactStack.chromePresentation: overlay) and published its border-box height on the stack root. Re-applied if a re-render drops it."
|
|
1017
|
+
},
|
|
1018
|
+
{
|
|
1019
|
+
"name": "data-bottom-toolbar-overlay",
|
|
1020
|
+
"on": "kui-nav-stack",
|
|
1021
|
+
"helper": "wireNavStack",
|
|
1022
|
+
"meaning": "measured once the helper has measured the compact stack's overlay bottom toolbar (compactStack.bottomToolbarPresentation: overlay) and published its border-box height on the stack root. Re-applied if a re-render drops it."
|
|
947
1023
|
}
|
|
948
1024
|
]
|
|
949
1025
|
},
|
|
@@ -1051,6 +1127,12 @@
|
|
|
1051
1127
|
"on": "kui-tab-scaffold__bar",
|
|
1052
1128
|
"helper": "wireScrollDividers",
|
|
1053
1129
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
"name": "data-header-overlay",
|
|
1133
|
+
"on": "kui-pane",
|
|
1134
|
+
"helper": "wireScrollDividers",
|
|
1135
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
1054
1136
|
}
|
|
1055
1137
|
]
|
|
1056
1138
|
},
|
|
@@ -1063,7 +1145,8 @@
|
|
|
1063
1145
|
"padding": "self",
|
|
1064
1146
|
"notes": [
|
|
1065
1147
|
"The navigator owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry.",
|
|
1066
|
-
"The bar's reserved 1px top edge separates a sunken active scene or nested Pane by default; on flat surfaces it follows scroll state (wireScrollDividers). separator=hidden suppresses it."
|
|
1148
|
+
"The bar's reserved 1px top edge separates a sunken active scene or nested Pane by default; on flat surfaces it follows scroll state (wireScrollDividers). separator=hidden suppresses it.",
|
|
1149
|
+
"barPresentation=overlay: once wireTabNavigator has measured the live bar (data-bar-overlay=measured), the bar is absolutely positioned over the scenes on --kui-chrome-material and the scenes route its border-box height (bottom safe area included) as the block-end --kui-edge-inset-* context, so a plain scene pads and scroll-pads by it and a sole Pane or NavStack clears it; unwired it stays docked."
|
|
1067
1150
|
]
|
|
1068
1151
|
}
|
|
1069
1152
|
},
|
|
@@ -1072,7 +1155,8 @@
|
|
|
1072
1155
|
"Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
|
|
1073
1156
|
"Wire selection through the controlled active id while leaving inactive scenes mounted and hidden.",
|
|
1074
1157
|
"A focusable scene is a tabpanel named by its tab label; optional scene tabIndex applies only while active.",
|
|
1075
|
-
"A tab badge is aria-hidden; supply badgeLabel so the tab's accessible name becomes \"<label>, <badgeLabel>\" (it defaults to the badge text). The dot form, badge: true, has no text, so its badgeLabel is required."
|
|
1158
|
+
"A tab badge is aria-hidden; supply badgeLabel so the tab's accessible name becomes \"<label>, <badgeLabel>\" (it defaults to the badge text). The dot form, badge: true, has no text, so its badgeLabel is required.",
|
|
1159
|
+
"Over the overlay bar's translucent material, unselected labels lift halfway toward --kui-color-text and the selected label mixes 40% of it into the brand color, so both keep 4.5:1 over worst-case content; the material turns opaque under reduced transparency or increased contrast and paints Canvas with a CanvasText edge in forced colors."
|
|
1076
1160
|
]
|
|
1077
1161
|
},
|
|
1078
1162
|
"cssValueProps": [],
|
|
@@ -1207,6 +1291,12 @@
|
|
|
1207
1291
|
"on": "kui-pane__header and kui-pane__footer of each panel and work-area Pane",
|
|
1208
1292
|
"helper": "wireScrollDividers",
|
|
1209
1293
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
1294
|
+
},
|
|
1295
|
+
{
|
|
1296
|
+
"name": "data-header-overlay",
|
|
1297
|
+
"on": "kui-pane",
|
|
1298
|
+
"helper": "wireScrollDividers",
|
|
1299
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
1210
1300
|
}
|
|
1211
1301
|
]
|
|
1212
1302
|
},
|
|
@@ -1335,6 +1425,12 @@
|
|
|
1335
1425
|
"on": "kui-pane__header and kui-pane__footer of each panel and work-area Pane",
|
|
1336
1426
|
"helper": "wireScrollDividers",
|
|
1337
1427
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
1428
|
+
},
|
|
1429
|
+
{
|
|
1430
|
+
"name": "data-header-overlay",
|
|
1431
|
+
"on": "kui-pane",
|
|
1432
|
+
"helper": "wireScrollDividers",
|
|
1433
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
1338
1434
|
}
|
|
1339
1435
|
]
|
|
1340
1436
|
},
|
|
@@ -1529,6 +1625,12 @@
|
|
|
1529
1625
|
"helper": "wireScrollDividers",
|
|
1530
1626
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
1531
1627
|
},
|
|
1628
|
+
{
|
|
1629
|
+
"name": "data-header-overlay",
|
|
1630
|
+
"on": "kui-pane",
|
|
1631
|
+
"helper": "wireScrollDividers",
|
|
1632
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
1633
|
+
},
|
|
1532
1634
|
{
|
|
1533
1635
|
"name": "data-toolbar-width-hidden",
|
|
1534
1636
|
"on": "ToolbarText, ToolbarControlGroup and its paired busy status",
|
|
@@ -1683,7 +1785,9 @@
|
|
|
1683
1785
|
"obligations": [
|
|
1684
1786
|
"Name the group when its relationship is not evident from context.",
|
|
1685
1787
|
"A disabled native button (disabled, or aria-disabled=\"true\" when it must stay focusable) dims to half opacity with the not-allowed cursor and no hover surface; a disabled raw wa-button paints no hover surface either. Do not add disabled styling yourself.",
|
|
1686
|
-
"Name an icon-only button or link with aria-label, not title. Once any help-tag installer is imported (select/register, popup-menu/register, or help-tags/register), it shows an aria-hidden Web Awesome help tag repeating that name after a 500ms hover and at once on keyboard focus, hidden on a press and on Escape, and never joins aria-labelledby. A native title keeps the browser tooltip and gets no second tag."
|
|
1788
|
+
"Name an icon-only button or link with aria-label, not title. Once any help-tag installer is imported (select/register, popup-menu/register, or help-tags/register), it shows an aria-hidden Web Awesome help tag repeating that name after a 500ms hover and at once on keyboard focus, hidden on a press and on Escape, and never joins aria-labelledby. A native title keeps the browser tooltip and gets no second tag.",
|
|
1789
|
+
"In an overlay Pane header (headerPresentation=\"overlay\"), overlay NavStack chrome (chromePresentation=\"overlay\") or bottom toolbar (bottomToolbarPresentation=\"overlay\"), or a DialogSurface floating header's header-actions (headerPresentation=\"floating\"), a default-tone group (not dark-toned, not an avatar scrim) takes --kui-color-text for its controls, so they keep WCAG AA over content passing beneath the translucent chrome material.",
|
|
1790
|
+
"A dark-toned group's hover paints a 14% surface wash over its loud fill, on one control of a group or across a lone control's whole group, so the on-loud icon keeps at least 3:1 over a light page and well above it in dark."
|
|
1687
1791
|
]
|
|
1688
1792
|
},
|
|
1689
1793
|
"cssValueProps": [
|
|
@@ -1775,7 +1879,7 @@
|
|
|
1775
1879
|
"key": "@kerfjs/ui:surface-scaffold",
|
|
1776
1880
|
"package": "@kerfjs/ui",
|
|
1777
1881
|
"id": "surface-scaffold",
|
|
1778
|
-
"name": "Surface
|
|
1882
|
+
"name": "Surface Scaffolds",
|
|
1779
1883
|
"kind": "component",
|
|
1780
1884
|
"source": "kerf",
|
|
1781
1885
|
"parents": { "mode": "any", "entries": [] },
|
|
@@ -1803,6 +1907,8 @@
|
|
|
1803
1907
|
"accessibility": {
|
|
1804
1908
|
"obligations": [
|
|
1805
1909
|
"Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
|
|
1910
|
+
"Name a PopoverDialogSurface with label or labelledBy, and describe it with describedBy (rendered as aria-describedby), usually a title ToolbarText descriptionId.",
|
|
1911
|
+
"A floating header's title uses the normal text color, which keeps WCAG AA over the 80% raised chrome material on any content; the material turns opaque under prefers-reduced-transparency, prefers-contrast: more, forced colors, or without backdrop-filter.",
|
|
1806
1912
|
"Use popup surfaces only for real dropdown menus with named triggers."
|
|
1807
1913
|
]
|
|
1808
1914
|
},
|
|
@@ -1847,6 +1953,26 @@
|
|
|
1847
1953
|
"rawPolicy": "forbid",
|
|
1848
1954
|
"examples": ["viewportGutter={remify(8)}"]
|
|
1849
1955
|
},
|
|
1956
|
+
{
|
|
1957
|
+
"path": "footerOffset",
|
|
1958
|
+
"grammar": "length",
|
|
1959
|
+
"helpers": [
|
|
1960
|
+
"px",
|
|
1961
|
+
"rem",
|
|
1962
|
+
"remify",
|
|
1963
|
+
"em",
|
|
1964
|
+
"pct",
|
|
1965
|
+
"space",
|
|
1966
|
+
"lengthVar",
|
|
1967
|
+
"calc"
|
|
1968
|
+
],
|
|
1969
|
+
"nonStandaloneHelpers": ["plus"],
|
|
1970
|
+
"shorthands": [],
|
|
1971
|
+
"canonicalShorthands": [],
|
|
1972
|
+
"exceptionalShorthands": [],
|
|
1973
|
+
"rawPolicy": "forbid",
|
|
1974
|
+
"examples": ["footerOffset={remify(8)}"]
|
|
1975
|
+
},
|
|
1850
1976
|
{
|
|
1851
1977
|
"path": "maxHeight",
|
|
1852
1978
|
"grammar": "length",
|
|
@@ -1878,7 +2004,11 @@
|
|
|
1878
2004
|
"publicTokens": [
|
|
1879
2005
|
"--kui-radius-l",
|
|
1880
2006
|
"--kui-wa-container-inset",
|
|
1881
|
-
"--kui-wa-surface-inset"
|
|
2007
|
+
"--kui-wa-surface-inset",
|
|
2008
|
+
"--kui-chrome-material-raised",
|
|
2009
|
+
"--kui-chrome-material-filter",
|
|
2010
|
+
"--kui-scroll-clearance-block-start",
|
|
2011
|
+
"--kui-scroll-clearance-block-end"
|
|
1882
2012
|
]
|
|
1883
2013
|
},
|
|
1884
2014
|
"diagnostics": [],
|
|
@@ -2014,7 +2144,8 @@
|
|
|
2014
2144
|
"accessibility": {
|
|
2015
2145
|
"obligations": [
|
|
2016
2146
|
"Plain text is not a heading; pass headingLevel to expose role=heading + aria-level for a page/section title.",
|
|
2017
|
-
"Actionable text is a native button with its full text as its accessible name; action cannot be combined with headingLevel, placeholder, or wrap."
|
|
2147
|
+
"Actionable text is a native button with its full text as its accessible name; action cannot be combined with headingLevel, placeholder, or wrap.",
|
|
2148
|
+
"In a Pane header with headerPresentation=\"overlay\" or NavStack chrome with chromePresentation=\"overlay\" (or its bottom toolbar with bottomToolbarPresentation=\"overlay\"), or slotted as the label (or into header-actions) of a DialogSurface header with headerPresentation=\"floating\", untoned text keeps WCAG AA over the translucent chrome material: the title takes --kui-color-text at every size and the description mixes --kui-color-text-quiet halfway toward it."
|
|
2018
2149
|
]
|
|
2019
2150
|
},
|
|
2020
2151
|
"cssValueProps": [
|
|
@@ -2853,11 +2984,21 @@
|
|
|
2853
2984
|
"id": "the accessible label and selection state of a multi-select grid",
|
|
2854
2985
|
"owner": "application",
|
|
2855
2986
|
"required": false
|
|
2987
|
+
},
|
|
2988
|
+
{
|
|
2989
|
+
"id": "which one scroller opts into scroll clearance (the one reaching the covered edge)",
|
|
2990
|
+
"owner": "application",
|
|
2991
|
+
"required": false
|
|
2992
|
+
},
|
|
2993
|
+
{
|
|
2994
|
+
"id": "the result picker bounds (maxHeight/minHeight) and its rows",
|
|
2995
|
+
"owner": "application",
|
|
2996
|
+
"required": false
|
|
2856
2997
|
}
|
|
2857
2998
|
],
|
|
2858
2999
|
"wiring": {
|
|
2859
3000
|
"required": false,
|
|
2860
|
-
"helpers": ["wireScrollDividers"],
|
|
3001
|
+
"helpers": ["wireScrollDividers", "wireListFocusScroll"],
|
|
2861
3002
|
"obligations": [],
|
|
2862
3003
|
"stateAttributes": [
|
|
2863
3004
|
{
|
|
@@ -2871,6 +3012,12 @@
|
|
|
2871
3012
|
"on": "a List named as targets chrome",
|
|
2872
3013
|
"helper": "wireScrollDividers",
|
|
2873
3014
|
"meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
|
|
3015
|
+
},
|
|
3016
|
+
{
|
|
3017
|
+
"name": "data-header-overlay",
|
|
3018
|
+
"on": "kui-pane",
|
|
3019
|
+
"helper": "wireScrollDividers",
|
|
3020
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
2874
3021
|
}
|
|
2875
3022
|
]
|
|
2876
3023
|
},
|
|
@@ -2882,7 +3029,11 @@
|
|
|
2882
3029
|
"border": "conditional",
|
|
2883
3030
|
"padding": "conditional",
|
|
2884
3031
|
"notes": [
|
|
2885
|
-
"List adds no margin. dividerSides draws selected physical edges without changing geometry; textInsets adds the full 17px content inset and controlInsets adds 8px on selected sides, with text winning on overlap."
|
|
3032
|
+
"List adds no margin. dividerSides draws selected physical edges without changing geometry; textInsets adds the full 17px content inset and controlInsets adds 8px on selected sides, with text winning on overlap.",
|
|
3033
|
+
"scrollClearance adds the inherited --kui-scroll-clearance-block-start/end context, published by overlaying chrome, to the List block padding and scroll-padding on the opted-in edges; without it the context is ignored.",
|
|
3034
|
+
"frame draws a 1px --kui-color-neutral-border-normal border with --kui-radius-m and a 4px --kui-space-2xs inset on every side (replacing inset/textInsets/controlInsets), exactly the focus-ring reach, so the first and last rows' rings stay inside the clip at the scroll extremes; maxHeight/minHeight bound the List directly.",
|
|
3035
|
+
"Every scrollable List's block scroll padding is the focus-ring reach plus 2px of slack (6px, no change at rest), so any row focused or scrolled into view stops with its ring inside the clip; an unframed List's first and last rows still meet the clip at the scroll extremes, so use frame when they must show a whole ring.",
|
|
3036
|
+
"As a direct child of a Pane's scrolling content, a List that does not scroll itself never shrinks below its rows (flex-shrink 0), so the content's block-end padding (a bottom safe area, an overlay NavStack bottom toolbar's clearance) follows its last row."
|
|
2886
3037
|
]
|
|
2887
3038
|
}
|
|
2888
3039
|
},
|
|
@@ -2890,7 +3041,8 @@
|
|
|
2890
3041
|
"obligations": [
|
|
2891
3042
|
"List adds layout only and no list role by default; selectionMode=\"multiple\" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.",
|
|
2892
3043
|
"Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll.",
|
|
2893
|
-
"A focused scrollable List (a keyboard-focusable scroller) draws the theme focus ring inset and rounded inside its own box, so a rounded or clipping parent never cuts it off; do not restyle its focus."
|
|
3044
|
+
"A focused scrollable List (a keyboard-focusable scroller) draws the theme focus ring inset and rounded inside its own box, so a rounded or clipping parent never cuts it off; do not restyle its focus.",
|
|
3045
|
+
"With wireListFocusScroll, a keyboard-focused (:focus-visible) element in a scrollable List whose focus ring crosses the clip is scrolled into view (block and inline nearest, honoring the ring-room scroll padding) in every engine; pointer focus never scrolls, so a click cannot move its row from under the pointer."
|
|
2894
3046
|
]
|
|
2895
3047
|
},
|
|
2896
3048
|
"cssValueProps": [
|
|
@@ -2919,6 +3071,28 @@
|
|
|
2919
3071
|
"exceptionalShorthands": [],
|
|
2920
3072
|
"rawPolicy": "forbid",
|
|
2921
3073
|
"examples": ["flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
|
|
3074
|
+
},
|
|
3075
|
+
{
|
|
3076
|
+
"path": "maxHeight",
|
|
3077
|
+
"grammar": "length",
|
|
3078
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
3079
|
+
"nonStandaloneHelpers": ["plus"],
|
|
3080
|
+
"shorthands": [],
|
|
3081
|
+
"canonicalShorthands": [],
|
|
3082
|
+
"exceptionalShorthands": [],
|
|
3083
|
+
"rawPolicy": "forbid",
|
|
3084
|
+
"examples": ["maxHeight={rem(14)}"]
|
|
3085
|
+
},
|
|
3086
|
+
{
|
|
3087
|
+
"path": "minHeight",
|
|
3088
|
+
"grammar": "length",
|
|
3089
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
3090
|
+
"nonStandaloneHelpers": ["plus"],
|
|
3091
|
+
"shorthands": [],
|
|
3092
|
+
"canonicalShorthands": [],
|
|
3093
|
+
"exceptionalShorthands": [],
|
|
3094
|
+
"rawPolicy": "forbid",
|
|
3095
|
+
"examples": ["minHeight={rem(4.25)}"]
|
|
2922
3096
|
}
|
|
2923
3097
|
],
|
|
2924
3098
|
"boundaries": {
|
|
@@ -3080,6 +3254,34 @@
|
|
|
3080
3254
|
"exceptionalShorthands": [],
|
|
3081
3255
|
"rawPolicy": "forbid",
|
|
3082
3256
|
"examples": ["className=\"app-row\""]
|
|
3257
|
+
},
|
|
3258
|
+
{
|
|
3259
|
+
"path": "iconTile.color",
|
|
3260
|
+
"grammar": "color",
|
|
3261
|
+
"helpers": ["fillColor", "uiColor", "colorVar"],
|
|
3262
|
+
"shorthands": [],
|
|
3263
|
+
"canonicalShorthands": [],
|
|
3264
|
+
"exceptionalShorthands": [],
|
|
3265
|
+
"rawPolicy": "forbid",
|
|
3266
|
+
"examples": [
|
|
3267
|
+
"iconTile={{ color: fillColor(\"#e5484d\") }}",
|
|
3268
|
+
"iconTile={{ color: uiColor(\"brand-fill-loud\") }}",
|
|
3269
|
+
"iconTile={{ color: colorVar(\"--app-category-color\") }}"
|
|
3270
|
+
]
|
|
3271
|
+
},
|
|
3272
|
+
{
|
|
3273
|
+
"path": "iconTile.foreground",
|
|
3274
|
+
"grammar": "color",
|
|
3275
|
+
"helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
|
|
3276
|
+
"shorthands": [],
|
|
3277
|
+
"canonicalShorthands": [],
|
|
3278
|
+
"exceptionalShorthands": [],
|
|
3279
|
+
"rawPolicy": "forbid",
|
|
3280
|
+
"examples": [
|
|
3281
|
+
"iconTile={{ color: fillColor(\"#e5484d\"), foreground: foregroundColor(\"white\") }}",
|
|
3282
|
+
"iconTile={{ color: uiColor(\"brand-fill-loud\"), foreground: uiColor(\"brand-on-loud\") }}",
|
|
3283
|
+
"iconTile={{ color: colorVar(\"--app-tile\"), foreground: foregroundColorVar(\"--app-tile-ink\") }}"
|
|
3284
|
+
]
|
|
3083
3285
|
}
|
|
3084
3286
|
],
|
|
3085
3287
|
"boundaries": {
|
|
@@ -3123,7 +3325,21 @@
|
|
|
3123
3325
|
"--kui-list-action-row-selected-color",
|
|
3124
3326
|
"--kui-list-action-row-trailing-hover-background",
|
|
3125
3327
|
"--kui-list-group-divider-color",
|
|
3126
|
-
"--kui-
|
|
3328
|
+
"--kui-list-row-padding-inline",
|
|
3329
|
+
"--kui-list-row-icon-size",
|
|
3330
|
+
"--kui-font-xs",
|
|
3331
|
+
"--kui-radius-m",
|
|
3332
|
+
"--kui-color-brand-fill-quiet",
|
|
3333
|
+
"--kui-color-brand-on-quiet",
|
|
3334
|
+
"--kui-color-success-fill-quiet",
|
|
3335
|
+
"--kui-color-success-border-quiet",
|
|
3336
|
+
"--kui-color-success-on-quiet",
|
|
3337
|
+
"--kui-color-warning-fill-quiet",
|
|
3338
|
+
"--kui-color-warning-border-quiet",
|
|
3339
|
+
"--kui-color-warning-on-quiet",
|
|
3340
|
+
"--kui-color-danger-fill-quiet",
|
|
3341
|
+
"--kui-color-danger-border-quiet",
|
|
3342
|
+
"--kui-color-danger-on-quiet"
|
|
3127
3343
|
]
|
|
3128
3344
|
},
|
|
3129
3345
|
"diagnostics": [],
|
|
@@ -3206,6 +3422,34 @@
|
|
|
3206
3422
|
"exceptionalShorthands": [],
|
|
3207
3423
|
"rawPolicy": "forbid",
|
|
3208
3424
|
"examples": ["className=\"app-row\""]
|
|
3425
|
+
},
|
|
3426
|
+
{
|
|
3427
|
+
"path": "iconTile.color",
|
|
3428
|
+
"grammar": "color",
|
|
3429
|
+
"helpers": ["fillColor", "uiColor", "colorVar"],
|
|
3430
|
+
"shorthands": [],
|
|
3431
|
+
"canonicalShorthands": [],
|
|
3432
|
+
"exceptionalShorthands": [],
|
|
3433
|
+
"rawPolicy": "forbid",
|
|
3434
|
+
"examples": [
|
|
3435
|
+
"iconTile={{ color: fillColor(\"#e5484d\") }}",
|
|
3436
|
+
"iconTile={{ color: uiColor(\"brand-fill-loud\") }}",
|
|
3437
|
+
"iconTile={{ color: colorVar(\"--app-category-color\") }}"
|
|
3438
|
+
]
|
|
3439
|
+
},
|
|
3440
|
+
{
|
|
3441
|
+
"path": "iconTile.foreground",
|
|
3442
|
+
"grammar": "color",
|
|
3443
|
+
"helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
|
|
3444
|
+
"shorthands": [],
|
|
3445
|
+
"canonicalShorthands": [],
|
|
3446
|
+
"exceptionalShorthands": [],
|
|
3447
|
+
"rawPolicy": "forbid",
|
|
3448
|
+
"examples": [
|
|
3449
|
+
"iconTile={{ color: fillColor(\"#e5484d\"), foreground: foregroundColor(\"white\") }}",
|
|
3450
|
+
"iconTile={{ color: uiColor(\"brand-fill-loud\"), foreground: uiColor(\"brand-on-loud\") }}",
|
|
3451
|
+
"iconTile={{ color: colorVar(\"--app-tile\"), foreground: foregroundColorVar(\"--app-tile-ink\") }}"
|
|
3452
|
+
]
|
|
3209
3453
|
}
|
|
3210
3454
|
],
|
|
3211
3455
|
"boundaries": {
|
|
@@ -3260,11 +3504,24 @@
|
|
|
3260
3504
|
"--kui-list-item-selected-color",
|
|
3261
3505
|
"--kui-list-item-trailing-color",
|
|
3262
3506
|
"--kui-list-group-divider-color",
|
|
3507
|
+
"--kui-list-row-padding-inline",
|
|
3508
|
+
"--kui-list-row-icon-size",
|
|
3263
3509
|
"--kui-font-xs",
|
|
3264
3510
|
"--kui-layout-inline-margin",
|
|
3265
3511
|
"--kui-layout-item-gap",
|
|
3266
3512
|
"--kui-layout-item-padding",
|
|
3267
|
-
"--kui-layout-rounded-radius"
|
|
3513
|
+
"--kui-layout-rounded-radius",
|
|
3514
|
+
"--kui-radius-m",
|
|
3515
|
+
"--kui-color-brand-on-quiet",
|
|
3516
|
+
"--kui-color-success-fill-quiet",
|
|
3517
|
+
"--kui-color-success-border-quiet",
|
|
3518
|
+
"--kui-color-success-on-quiet",
|
|
3519
|
+
"--kui-color-warning-fill-quiet",
|
|
3520
|
+
"--kui-color-warning-border-quiet",
|
|
3521
|
+
"--kui-color-warning-on-quiet",
|
|
3522
|
+
"--kui-color-danger-fill-quiet",
|
|
3523
|
+
"--kui-color-danger-border-quiet",
|
|
3524
|
+
"--kui-color-danger-on-quiet"
|
|
3268
3525
|
]
|
|
3269
3526
|
},
|
|
3270
3527
|
"diagnostics": [],
|
|
@@ -3460,7 +3717,7 @@
|
|
|
3460
3717
|
"key": "@kerfjs/ui:application-tabs",
|
|
3461
3718
|
"package": "@kerfjs/ui",
|
|
3462
3719
|
"id": "application-tabs",
|
|
3463
|
-
"name": "Application
|
|
3720
|
+
"name": "Application Tabs",
|
|
3464
3721
|
"kind": "composition",
|
|
3465
3722
|
"source": "kerf",
|
|
3466
3723
|
"parents": { "mode": "any", "entries": [] },
|
|
@@ -3706,6 +3963,12 @@
|
|
|
3706
3963
|
"on": "chrome named in wireScrollDividers targets (a TabBar strip has none)",
|
|
3707
3964
|
"helper": "wireScrollDividers",
|
|
3708
3965
|
"meaning": "The sides, in t/r/b/l order, on which that chrome currently draws its scroll divider. Re-applied if a re-render drops it."
|
|
3966
|
+
},
|
|
3967
|
+
{
|
|
3968
|
+
"name": "data-header-overlay",
|
|
3969
|
+
"on": "kui-pane",
|
|
3970
|
+
"helper": "wireScrollDividers",
|
|
3971
|
+
"meaning": "measured once the wiring has measured a Pane's overlay header (headerPresentation: overlay) and published its border-box height as --kui-scroll-clearance-block-start on the Pane root, plus a classic content scrollbar's inline size as --kui-pane-scrollbar-inline-size, which the header leaves uncovered. Re-applied if a re-render drops it."
|
|
3709
3972
|
}
|
|
3710
3973
|
]
|
|
3711
3974
|
},
|
|
@@ -3845,7 +4108,7 @@
|
|
|
3845
4108
|
"kind": "component",
|
|
3846
4109
|
"source": "kerf",
|
|
3847
4110
|
"parents": { "mode": "any", "entries": [] },
|
|
3848
|
-
"contexts": ["wrapping-exclusive-choice"],
|
|
4111
|
+
"contexts": ["wrapping-exclusive-choice", "wrapping-multiple-choice"],
|
|
3849
4112
|
"zones": [],
|
|
3850
4113
|
"children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
|
|
3851
4114
|
"state": [{ "id": "value", "owner": "controlled", "required": false }],
|
|
@@ -3862,11 +4125,26 @@
|
|
|
3862
4125
|
},
|
|
3863
4126
|
"accessibility": {
|
|
3864
4127
|
"obligations": [
|
|
3865
|
-
"Name the radio group with label or with labelledBy pointing at a visible heading.",
|
|
4128
|
+
"Name the radio group (or, with multiple, the checkbox group) with label or with labelledBy pointing at a visible heading.",
|
|
3866
4129
|
"Every choice keeps a visible text label; a swatch or icon is decorative."
|
|
3867
4130
|
]
|
|
3868
4131
|
},
|
|
3869
|
-
"cssValueProps": [
|
|
4132
|
+
"cssValueProps": [
|
|
4133
|
+
{
|
|
4134
|
+
"path": "choices[].swatch",
|
|
4135
|
+
"grammar": "color",
|
|
4136
|
+
"helpers": ["fillColor", "uiColor", "colorVar"],
|
|
4137
|
+
"shorthands": ["transparent"],
|
|
4138
|
+
"canonicalShorthands": ["transparent"],
|
|
4139
|
+
"exceptionalShorthands": [],
|
|
4140
|
+
"rawPolicy": "forbid",
|
|
4141
|
+
"examples": [
|
|
4142
|
+
"swatch: fillColor(\"#3b82f6\")",
|
|
4143
|
+
"swatch: uiColor(\"brand-fill-loud\")",
|
|
4144
|
+
"swatch: colorVar(\"--app-label-color\")"
|
|
4145
|
+
]
|
|
4146
|
+
}
|
|
4147
|
+
],
|
|
3870
4148
|
"boundaries": {
|
|
3871
4149
|
"rootClass": "kui-choice-chips",
|
|
3872
4150
|
"publicClasses": ["kui-choice-chips"],
|
|
@@ -3878,6 +4156,55 @@
|
|
|
3878
4156
|
"composition": "docs/accessibility.md#choicechips"
|
|
3879
4157
|
}
|
|
3880
4158
|
},
|
|
4159
|
+
{
|
|
4160
|
+
"key": "@kerfjs/ui:composer",
|
|
4161
|
+
"package": "@kerfjs/ui",
|
|
4162
|
+
"id": "composer",
|
|
4163
|
+
"name": "Composer",
|
|
4164
|
+
"kind": "component",
|
|
4165
|
+
"source": "kerf",
|
|
4166
|
+
"parents": { "mode": "any", "entries": [] },
|
|
4167
|
+
"contexts": ["chat-composer", "dialog-floating-footer"],
|
|
4168
|
+
"zones": [
|
|
4169
|
+
{
|
|
4170
|
+
"id": "actions",
|
|
4171
|
+
"jsx": { "prop": "actions" },
|
|
4172
|
+
"accepts": ["KerfUiContent"],
|
|
4173
|
+
"cardinality": { "min": 1, "max": "unbounded" },
|
|
4174
|
+
"exclusiveWith": []
|
|
4175
|
+
}
|
|
4176
|
+
],
|
|
4177
|
+
"children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
|
|
4178
|
+
"state": [{ "id": "value", "owner": "controlled", "required": false }],
|
|
4179
|
+
"wiring": {
|
|
4180
|
+
"required": false,
|
|
4181
|
+
"helpers": ["wireComposers"],
|
|
4182
|
+
"obligations": [],
|
|
4183
|
+
"stateAttributes": []
|
|
4184
|
+
},
|
|
4185
|
+
"responsive": { "owner": "not-applicable", "behaviors": [] },
|
|
4186
|
+
"layout": {
|
|
4187
|
+
"roles": ["controls"],
|
|
4188
|
+
"geometry": { "margin": "none", "border": "self", "padding": "self" }
|
|
4189
|
+
},
|
|
4190
|
+
"accessibility": {
|
|
4191
|
+
"obligations": [
|
|
4192
|
+
"Name the message field with label in title style; give it an id so a hint becomes its accessible description.",
|
|
4193
|
+
"Give every trailing action a visible or accessible name, such as a Send button."
|
|
4194
|
+
]
|
|
4195
|
+
},
|
|
4196
|
+
"cssValueProps": [],
|
|
4197
|
+
"boundaries": {
|
|
4198
|
+
"rootClass": "kui-composer",
|
|
4199
|
+
"publicClasses": ["kui-composer"],
|
|
4200
|
+
"publicTokens": []
|
|
4201
|
+
},
|
|
4202
|
+
"diagnostics": [],
|
|
4203
|
+
"provenance": {
|
|
4204
|
+
"selection": "ai/component-catalog.json",
|
|
4205
|
+
"composition": "docs/accessibility.md#composer"
|
|
4206
|
+
}
|
|
4207
|
+
},
|
|
3881
4208
|
{
|
|
3882
4209
|
"key": "@kerfjs/ui:token-search-field",
|
|
3883
4210
|
"package": "@kerfjs/ui",
|
|
@@ -4396,7 +4723,7 @@
|
|
|
4396
4723
|
},
|
|
4397
4724
|
"accessibility": {
|
|
4398
4725
|
"obligations": [
|
|
4399
|
-
"An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. The context anchor stays out of the accessibility tree. Web Awesome provides menu roles, nested arrow-key navigation, typeahead, and Escape.",
|
|
4726
|
+
"An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. The context anchor stays out of the accessibility tree. The open menu takes the trigger's name (the context or icon-only label, or the visible text), and each submenu takes its parent item's label, so a screen reader announces a named menu and getByRole('menu', { name }) finds it. Web Awesome provides menu roles, nested arrow-key navigation, typeahead, and Escape.",
|
|
4400
4727
|
"Once registered, an icon-only trigger shows its label as an aria-hidden Web Awesome help tag after a 500ms hover and at once on keyboard focus; it hides while the menu is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
|
|
4401
4728
|
]
|
|
4402
4729
|
},
|
|
@@ -7864,7 +8191,7 @@
|
|
|
7864
8191
|
"key": "@kerfjs/ui:recipe-app-shell",
|
|
7865
8192
|
"package": "@kerfjs/ui",
|
|
7866
8193
|
"id": "recipe-app-shell",
|
|
7867
|
-
"name": "Desktop
|
|
8194
|
+
"name": "Desktop Application Shell",
|
|
7868
8195
|
"kind": "recipe",
|
|
7869
8196
|
"source": "kerf",
|
|
7870
8197
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -7917,7 +8244,7 @@
|
|
|
7917
8244
|
"key": "@kerfjs/ui:recipe-navigation-sidebar",
|
|
7918
8245
|
"package": "@kerfjs/ui",
|
|
7919
8246
|
"id": "recipe-navigation-sidebar",
|
|
7920
|
-
"name": "Navigation
|
|
8247
|
+
"name": "Navigation Sidebar",
|
|
7921
8248
|
"kind": "recipe",
|
|
7922
8249
|
"source": "kerf",
|
|
7923
8250
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -7970,7 +8297,7 @@
|
|
|
7970
8297
|
"key": "@kerfjs/ui:recipe-workspace-header",
|
|
7971
8298
|
"package": "@kerfjs/ui",
|
|
7972
8299
|
"id": "recipe-workspace-header",
|
|
7973
|
-
"name": "Workspace
|
|
8300
|
+
"name": "Workspace Header",
|
|
7974
8301
|
"kind": "recipe",
|
|
7975
8302
|
"source": "kerf",
|
|
7976
8303
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8073,7 +8400,7 @@
|
|
|
8073
8400
|
"key": "@kerfjs/ui:recipe-composer-form",
|
|
8074
8401
|
"package": "@kerfjs/ui",
|
|
8075
8402
|
"id": "recipe-composer-form",
|
|
8076
|
-
"name": "Composer
|
|
8403
|
+
"name": "Composer Form",
|
|
8077
8404
|
"kind": "recipe",
|
|
8078
8405
|
"source": "kerf",
|
|
8079
8406
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8126,7 +8453,7 @@
|
|
|
8126
8453
|
"key": "@kerfjs/ui:recipe-list-workspace-states",
|
|
8127
8454
|
"package": "@kerfjs/ui",
|
|
8128
8455
|
"id": "recipe-list-workspace-states",
|
|
8129
|
-
"name": "List
|
|
8456
|
+
"name": "List Workspace States",
|
|
8130
8457
|
"kind": "recipe",
|
|
8131
8458
|
"source": "kerf",
|
|
8132
8459
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8175,7 +8502,7 @@
|
|
|
8175
8502
|
"key": "@kerfjs/ui:recipe-compact-toolbar",
|
|
8176
8503
|
"package": "@kerfjs/ui",
|
|
8177
8504
|
"id": "recipe-compact-toolbar",
|
|
8178
|
-
"name": "Compact
|
|
8505
|
+
"name": "Compact Toolbar Choices and Actions",
|
|
8179
8506
|
"kind": "recipe",
|
|
8180
8507
|
"source": "kerf",
|
|
8181
8508
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8232,7 +8559,7 @@
|
|
|
8232
8559
|
"key": "@kerfjs/ui:recipe-navigation-stack",
|
|
8233
8560
|
"package": "@kerfjs/ui",
|
|
8234
8561
|
"id": "recipe-navigation-stack",
|
|
8235
|
-
"name": "Navigation
|
|
8562
|
+
"name": "Navigation Stack",
|
|
8236
8563
|
"kind": "recipe",
|
|
8237
8564
|
"source": "kerf",
|
|
8238
8565
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8285,7 +8612,7 @@
|
|
|
8285
8612
|
"key": "@kerfjs/ui:recipe-loading-inspector",
|
|
8286
8613
|
"package": "@kerfjs/ui",
|
|
8287
8614
|
"id": "recipe-loading-inspector",
|
|
8288
|
-
"name": "Loading
|
|
8615
|
+
"name": "Loading Inspector",
|
|
8289
8616
|
"kind": "recipe",
|
|
8290
8617
|
"source": "kerf",
|
|
8291
8618
|
"parents": { "mode": "root", "entries": [] },
|
|
@@ -8345,7 +8672,7 @@
|
|
|
8345
8672
|
"key": "@kerfjs/ui:recipe-collapsible-sidebar",
|
|
8346
8673
|
"package": "@kerfjs/ui",
|
|
8347
8674
|
"id": "recipe-collapsible-sidebar",
|
|
8348
|
-
"name": "Collapsible
|
|
8675
|
+
"name": "Collapsible Sidebar",
|
|
8349
8676
|
"kind": "recipe",
|
|
8350
8677
|
"source": "kerf",
|
|
8351
8678
|
"parents": { "mode": "root", "entries": [] },
|