@kerfjs/ui 5.0.0-beta.3 → 5.0.0-beta.31
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 +320 -107
- package/ai/application-ui-diagnostic-ids-v1.json +100 -0
- package/ai/application-ui-profile-sync.cjs +529 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +102 -0
- package/ai/application-ui-profile.defaults.json +41 -0
- package/ai/application-ui-profile.mjs +626 -0
- package/ai/application-ui-profile.schema.json +130 -0
- package/ai/catalog-authoring.json +25 -0
- package/ai/catalog-authoring.schema.json +61 -0
- package/ai/compile-time-contracts-v1.json +131 -0
- package/ai/compile-time-contracts-v1.schema.json +51 -0
- package/ai/component-catalog-extension-v2.d.ts +7 -0
- package/ai/component-catalog-extension-v2.schema.json +7 -0
- package/ai/component-catalog-extension.schema.json +79 -0
- package/ai/component-catalog-v2-overrides.json +486 -0
- package/ai/component-catalog-v2.d.ts +90 -0
- package/ai/component-catalog-v2.json +5455 -0
- package/ai/component-catalog-v2.schema.json +298 -0
- package/ai/component-catalog.json +2437 -419
- package/ai/component-catalog.schema.json +39 -0
- package/ai/public-api-signatures-v1.md +1442 -124
- package/ai/skill.md +131 -54
- package/ai/webawesome-jsx-signatures-v1.md +2 -1
- package/analyzer/cli.mjs +49 -0
- package/analyzer/index.d.mts +46 -0
- package/analyzer/index.mjs +1086 -0
- package/analyzer/report.schema.json +66 -0
- package/dist/app-tab.d.ts +15 -4
- package/dist/app-tab.js +3 -1
- package/dist/browser/app-tab.js +1 -0
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/list-action-row.js +5 -0
- package/dist/browser/{menu-header.js → list-header.js} +3 -2
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +5 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/segmented-control.js +1 -0
- package/dist/browser/select.js +1 -0
- package/dist/browser/skeleton.js +3 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +3 -0
- package/dist/browser/toolbar-text.js +1 -0
- package/dist/browser/value-table.js +1 -0
- package/dist/catalog-resources.d.ts +35 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +151 -0
- package/dist/catalog.js +379 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chunk-6NDBE2OK.js +32 -0
- package/dist/chunk-6NDBE2OK.js.map +1 -0
- package/dist/chunk-6WTETUZ6.js +21 -0
- package/dist/chunk-6WTETUZ6.js.map +1 -0
- package/dist/chunk-AQFWBG23.js +83 -0
- package/dist/chunk-AQFWBG23.js.map +1 -0
- package/dist/chunk-B6JYRX3P.js +51 -0
- package/dist/chunk-B6JYRX3P.js.map +1 -0
- package/dist/chunk-CAB6NQ2T.js +102 -0
- package/dist/chunk-CAB6NQ2T.js.map +1 -0
- package/dist/chunk-CK6P5AUK.js +136 -0
- package/dist/chunk-CK6P5AUK.js.map +1 -0
- package/dist/chunk-DAO2VFTT.js +129 -0
- package/dist/chunk-DAO2VFTT.js.map +1 -0
- package/dist/chunk-DYBPI5O2.js +25 -0
- package/dist/chunk-DYBPI5O2.js.map +1 -0
- package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
- package/dist/chunk-E34TE2ZI.js.map +1 -0
- package/dist/chunk-I45QO2IZ.js +88 -0
- package/dist/chunk-I45QO2IZ.js.map +1 -0
- package/dist/chunk-I4V3UDSA.js +79 -0
- package/dist/chunk-I4V3UDSA.js.map +1 -0
- package/dist/chunk-KFUUFNTS.js +15 -0
- package/dist/chunk-KFUUFNTS.js.map +1 -0
- package/dist/chunk-MFR2IIFG.js +20 -0
- package/dist/chunk-MFR2IIFG.js.map +1 -0
- package/dist/chunk-OC275HHS.js +128 -0
- package/dist/chunk-OC275HHS.js.map +1 -0
- package/dist/chunk-OL4TC3U2.js +156 -0
- package/dist/chunk-OL4TC3U2.js.map +1 -0
- package/dist/chunk-OMSRSL3B.js +120 -0
- package/dist/chunk-OMSRSL3B.js.map +1 -0
- package/dist/chunk-RL6COPKF.js +44 -0
- package/dist/chunk-RL6COPKF.js.map +1 -0
- package/dist/chunk-SOK5EUF7.js +25 -0
- package/dist/chunk-SOK5EUF7.js.map +1 -0
- package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
- package/dist/chunk-SRSJO5QE.js.map +1 -0
- package/dist/chunk-T7DOWS6T.js +61 -0
- package/dist/chunk-T7DOWS6T.js.map +1 -0
- package/dist/chunk-TIGSG6BX.js +218 -0
- package/dist/chunk-TIGSG6BX.js.map +1 -0
- package/dist/chunk-UDHHKZWO.js +41 -0
- package/dist/chunk-UDHHKZWO.js.map +1 -0
- package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
- package/dist/chunk-UKKSMZYT.js.map +1 -0
- package/dist/chunk-V6GQKOX2.js +39 -0
- package/dist/chunk-V6GQKOX2.js.map +1 -0
- package/dist/chunk-V6HCTCVD.js +46 -0
- package/dist/chunk-V6HCTCVD.js.map +1 -0
- package/dist/chunk-VDUJZF5G.js +515 -0
- package/dist/chunk-VDUJZF5G.js.map +1 -0
- package/dist/chunk-VXFGMDA7.js +31 -0
- package/dist/chunk-VXFGMDA7.js.map +1 -0
- package/dist/chunk-WN52USHV.js +115 -0
- package/dist/chunk-WN52USHV.js.map +1 -0
- package/dist/chunk-WSXUPSID.js +43 -0
- package/dist/chunk-WSXUPSID.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
- package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
- package/dist/chunk-ZPWZIVI6.js +47 -0
- package/dist/chunk-ZPWZIVI6.js.map +1 -0
- package/dist/collapsible-panel.d.ts +77 -0
- package/dist/collapsible-panel.js +84 -0
- package/dist/collapsible-panel.js.map +1 -0
- package/dist/css-values.d.ts +75 -0
- package/dist/css-values.js +3 -0
- package/dist/css-values.js.map +1 -0
- package/dist/device-class.d.ts +62 -0
- package/dist/device-class.js +103 -0
- package/dist/device-class.js.map +1 -0
- package/dist/disclosure-arrow.js +1 -1
- package/dist/divider-sides-267FA7sY.d.ts +4 -0
- package/dist/empty-state.d.ts +3 -2
- package/dist/empty-state.js +1 -1
- package/dist/floating-toolbar.d.ts +29 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/index.d.ts +23 -14
- package/dist/index.js +30 -23
- package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
- package/dist/list-action-row.js +7 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/list-header.d.ts +77 -0
- package/dist/list-header.js +8 -0
- package/dist/list-header.js.map +1 -0
- package/dist/list-inset-control.d.ts +17 -0
- package/dist/list-inset-control.js +3 -0
- package/dist/list-inset-control.js.map +1 -0
- package/dist/list-inset-text.d.ts +26 -0
- package/dist/list-inset-text.js +3 -0
- package/dist/list-inset-text.js.map +1 -0
- package/dist/list-item.d.ts +45 -0
- package/dist/list-item.js +7 -0
- package/dist/list-item.js.map +1 -0
- package/dist/list.d.ts +21 -0
- package/dist/list.js +4 -0
- package/dist/list.js.map +1 -0
- package/dist/loading-spinner.js +1 -1
- package/dist/nav-stack.d.ts +41 -0
- package/dist/nav-stack.js +6 -0
- package/dist/nav-stack.js.map +1 -0
- package/dist/pane.d.ts +50 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/resizable-region.d.ts +21 -3
- package/dist/resizable-region.js +1 -1
- package/dist/segmented-control.d.ts +11 -8
- package/dist/segmented-control.js +3 -1
- package/dist/select-register.d.ts +5 -1
- package/dist/select-register.js +3 -0
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +34 -8
- package/dist/select.js +3 -1
- package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
- package/dist/skeleton.d.ts +25 -0
- package/dist/skeleton.js +4 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/split-view.d.ts +43 -0
- package/dist/split-view.js +82 -0
- package/dist/split-view.js.map +1 -0
- package/dist/state-banner.d.ts +11 -5
- package/dist/state-banner.js +3 -1
- package/dist/styles/app-tab.css +26 -0
- package/dist/styles/catalog.css +582 -0
- package/dist/styles/collapsible-panel.css +212 -0
- package/dist/styles/floating-toolbar.css +38 -0
- package/dist/styles/foundation.css +80 -0
- package/dist/styles/layout.css +2 -20
- package/dist/styles/list-action-row.css +224 -0
- package/dist/styles/list-header.css +198 -0
- package/dist/styles/list-inset-control.css +7 -0
- package/dist/styles/list-inset-text.css +14 -0
- package/dist/styles/list-item.css +171 -0
- package/dist/styles/list.css +43 -0
- package/dist/styles/nav-stack.css +141 -0
- package/dist/styles/pane.css +62 -0
- package/dist/styles/resizable-region.css +158 -0
- package/dist/styles/segmented-control.css +10 -7
- package/dist/styles/select.css +115 -2
- package/dist/styles/skeleton.css +31 -0
- package/dist/styles/split-view.css +35 -0
- package/dist/styles/state-banner.css +49 -10
- package/dist/styles/styles.css +7 -5
- package/dist/styles/sunken-panel.css +22 -0
- package/dist/styles/surface-scaffold.css +51 -0
- package/dist/styles/tab-bar.css +24 -0
- package/dist/styles/tab-scaffold.css +85 -0
- package/dist/styles/token-search-field.css +14 -2
- package/dist/styles/toolbar-control-group.css +224 -6
- package/dist/styles/toolbar-text.css +65 -2
- package/dist/styles/toolbar.css +47 -2
- package/dist/styles/webawesome.css +165 -0
- package/dist/styles/workbench.css +187 -0
- package/dist/sunken-panel.d.ts +20 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold.d.ts +26 -0
- package/dist/surface-scaffold.js +3 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/tab-bar.d.ts +24 -6
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +31 -0
- package/dist/tab-scaffold.js +51 -0
- package/dist/tab-scaffold.js.map +1 -0
- package/dist/token-search-field.d.ts +30 -13
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +33 -7
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +31 -4
- package/dist/toolbar-text.js +3 -1
- package/dist/toolbar.d.ts +10 -7
- package/dist/toolbar.js +1 -1
- package/dist/value-table.d.ts +7 -3
- package/dist/value-table.js +3 -1
- package/dist/webawesome.d.ts +1 -0
- package/dist/wire-catalog.d.ts +57 -0
- package/dist/wire-catalog.js +302 -0
- package/dist/wire-catalog.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +18 -0
- package/dist/wire-nav-stack.js +228 -0
- package/dist/wire-nav-stack.js.map +1 -0
- package/dist/wire-resizable-regions.d.ts +1 -1
- package/dist/wire-resizable-regions.js +1 -1
- package/dist/wire-sidebar.d.ts +48 -0
- package/dist/wire-sidebar.js +147 -0
- package/dist/wire-sidebar.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +19 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-scaffold.d.ts +11 -0
- package/dist/wire-tab-scaffold.js +21 -0
- package/dist/wire-tab-scaffold.js.map +1 -0
- package/dist/wire-token-search-fields.d.ts +104 -4
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +44 -0
- package/dist/workbench.js +106 -0
- package/dist/workbench.js.map +1 -0
- package/docs/accessibility.md +137 -20
- package/docs/app-layouts.md +61 -0
- package/docs/catalog.md +364 -0
- package/docs/collapsible-panel.md +142 -0
- package/docs/component-contract.md +253 -26
- package/docs/component-selection.md +213 -57
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
- package/docs/design/templates/empty-state/filtered.svg +1 -0
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
- package/docs/design/templates/empty-state/with-action.svg +1 -0
- package/docs/design/templates/empty-state-dark.svg +1 -0
- package/docs/design/templates/empty-state.svg +1 -0
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -0
- package/docs/design/templates/list-action-row/default.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
- package/docs/design/templates/list-action-row/selected.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -0
- package/docs/design/templates/list-action-row.svg +1 -0
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -0
- package/docs/design/templates/list-header/action.svg +1 -0
- package/docs/design/templates/list-header/count-dark.svg +1 -0
- package/docs/design/templates/list-header/count.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +1 -0
- package/docs/design/templates/list-header.svg +1 -0
- package/docs/design/templates/list-item/default-dark.svg +1 -0
- package/docs/design/templates/list-item/default.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -0
- package/docs/design/templates/list-item/multiline.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -0
- package/docs/design/templates/list-item/selected.svg +1 -0
- package/docs/design/templates/list-item/trailing-dark.svg +1 -0
- package/docs/design/templates/list-item/trailing.svg +1 -0
- package/docs/design/templates/list-item-dark.svg +1 -0
- package/docs/design/templates/list-item.svg +1 -0
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
- package/docs/design/templates/segmented-control/equal.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small.svg +1 -0
- package/docs/design/templates/segmented-control-dark.svg +1 -0
- package/docs/design/templates/segmented-control.svg +1 -0
- package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
- package/docs/design/templates/skeleton/avatar.svg +1 -0
- package/docs/design/templates/skeleton/block-dark.svg +1 -0
- package/docs/design/templates/skeleton/block.svg +1 -0
- package/docs/design/templates/skeleton/lines-dark.svg +1 -0
- package/docs/design/templates/skeleton/lines.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -0
- package/docs/design/templates/skeleton.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -0
- package/docs/design/templates/state-banner/danger.svg +1 -0
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -0
- package/docs/design/templates/state-banner/info.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -0
- package/docs/design/templates/state-banner/success.svg +1 -0
- package/docs/design/templates/state-banner/warning-dark.svg +1 -0
- package/docs/design/templates/state-banner/warning.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +1 -0
- package/docs/design/templates/state-banner.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
- package/docs/design/templates/tab-bar-dark.svg +1 -0
- package/docs/design/templates/tab-bar.svg +1 -0
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
- package/docs/design/templates/token-search-field/empty.svg +1 -0
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/token-search-field/tokens.svg +1 -0
- package/docs/design/templates/token-search-field-dark.svg +1 -0
- package/docs/design/templates/token-search-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group.svg +1 -0
- package/docs/design/templates/toolbar-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default.svg +1 -0
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/large.svg +1 -0
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/small.svg +1 -0
- package/docs/design/templates/toolbar-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-text.svg +1 -0
- package/docs/design/templates/toolbar.svg +1 -0
- package/docs/design/templates/value-table/details-dark.svg +1 -0
- package/docs/design/templates/value-table/details.svg +1 -0
- package/docs/design/templates/value-table-dark.svg +1 -0
- package/docs/design/templates/value-table.svg +1 -0
- package/docs/design/templates.md +128 -0
- package/docs/design-philosophy.md +33 -11
- package/docs/device-class.md +54 -0
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/command-palette-adapter.tsx +67 -17
- package/docs/examples/component-catalog-extension-v2.json +80 -0
- package/docs/examples/component-catalog-extension.json +45 -0
- package/docs/layout.md +98 -37
- package/docs/nav-stack.md +77 -0
- package/docs/recipes.md +75 -19
- package/docs/split-view.md +55 -0
- package/docs/sunken-panel.md +53 -0
- package/docs/surface-scaffold.md +25 -0
- package/docs/tab-scaffold.md +52 -0
- package/docs/type-contracts.md +127 -0
- package/docs/ui-analyzer.md +118 -0
- package/docs/ui-doctor.md +91 -0
- package/docs/ui-evaluator.md +122 -0
- package/docs/ux-demo.md +24 -13
- package/docs/webawesome-theme.md +82 -8
- package/docs/workbench.md +123 -0
- package/doctor/cli.mjs +115 -0
- package/doctor/config.schema.json +68 -0
- package/doctor/eslint-diagnostics.d.mts +24 -0
- package/doctor/eslint-diagnostics.mjs +24 -0
- package/doctor/index.d.mts +116 -0
- package/doctor/index.mjs +1272 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1138 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +253 -43
- package/package.json +180 -37
- package/traversal-exclusions.mjs +27 -0
- package/ux-demo/recipes/app-shell.tsx +222 -13
- package/ux-demo/recipes/collapsible-sidebar.tsx +229 -0
- package/ux-demo/recipes/compact-toolbar.tsx +115 -12
- package/ux-demo/recipes/composer-form.tsx +119 -18
- package/ux-demo/recipes/list-detail-dialog.tsx +197 -0
- package/ux-demo/recipes/list-workspace-states.tsx +175 -9
- package/ux-demo/recipes/loaders.ts +13 -4
- package/ux-demo/recipes/loading-inspector.tsx +186 -0
- package/ux-demo/recipes/mount-recipe.ts +31 -5
- package/ux-demo/recipes/navigation-sidebar.tsx +122 -11
- package/ux-demo/recipes/navigation-stack.tsx +118 -0
- package/ux-demo/recipes/recipes.css +143 -18
- package/ux-demo/recipes/types.ts +9 -1
- package/ux-demo/recipes/workspace-header.tsx +68 -3
- package/dist/browser/dialog-header.js +0 -5
- package/dist/browser/menu-action-row.js +0 -3
- package/dist/browser/menu-item.js +0 -3
- package/dist/browser/page-header.js +0 -3
- package/dist/chunk-2PES33HS.js +0 -13
- package/dist/chunk-2PES33HS.js.map +0 -1
- package/dist/chunk-55DATV3A.js +0 -10
- package/dist/chunk-55DATV3A.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7LDCTU7D.js +0 -134
- package/dist/chunk-7LDCTU7D.js.map +0 -1
- package/dist/chunk-AQNKJRFH.js +0 -79
- package/dist/chunk-AQNKJRFH.js.map +0 -1
- package/dist/chunk-CTQKI2XL.js +0 -28
- package/dist/chunk-CTQKI2XL.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-EGHL5S4P.js +0 -33
- package/dist/chunk-EGHL5S4P.js.map +0 -1
- package/dist/chunk-GY5WH7TO.js +0 -10
- package/dist/chunk-GY5WH7TO.js.map +0 -1
- package/dist/chunk-H5AGGVU5.js +0 -75
- package/dist/chunk-H5AGGVU5.js.map +0 -1
- package/dist/chunk-K3G72I6D.js +0 -24
- package/dist/chunk-K3G72I6D.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-MBR3TYNL.js +0 -14
- package/dist/chunk-MBR3TYNL.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js +0 -10
- package/dist/chunk-MFKMHK5W.js.map +0 -1
- package/dist/chunk-MQIZAD4A.js.map +0 -1
- package/dist/chunk-NPPD2A6O.js +0 -40
- package/dist/chunk-NPPD2A6O.js.map +0 -1
- package/dist/chunk-R6JHHBKQ.js +0 -19
- package/dist/chunk-R6JHHBKQ.js.map +0 -1
- package/dist/chunk-S3TPM2LP.js +0 -23
- package/dist/chunk-S3TPM2LP.js.map +0 -1
- package/dist/chunk-TRNBHPNW.js.map +0 -1
- package/dist/chunk-VHW5YNIB.js +0 -17
- package/dist/chunk-VHW5YNIB.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-XZXRLY5Q.js +0 -33
- package/dist/chunk-XZXRLY5Q.js.map +0 -1
- package/dist/dialog-header.d.ts +0 -15
- package/dist/dialog-header.js +0 -5
- package/dist/dialog-header.js.map +0 -1
- package/dist/menu-action-row.js +0 -4
- package/dist/menu-action-row.js.map +0 -1
- package/dist/menu-header.d.ts +0 -41
- package/dist/menu-header.js +0 -6
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.d.ts +0 -31
- package/dist/menu-item.js +0 -4
- package/dist/menu-item.js.map +0 -1
- package/dist/page-header.d.ts +0 -9
- package/dist/page-header.js +0 -3
- package/dist/page-header.js.map +0 -1
- package/dist/styles/dialog-header.css +0 -87
- package/dist/styles/menu-action-row.css +0 -154
- package/dist/styles/menu-header.css +0 -143
- package/dist/styles/menu-item.css +0 -118
- package/dist/styles/page-header.css +0 -26
- package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
|
@@ -39,6 +39,11 @@
|
|
|
39
39
|
"accessibility": [
|
|
40
40
|
"Decorative icons are aria-hidden; meaningful icons require a label."
|
|
41
41
|
],
|
|
42
|
+
"geometry": {
|
|
43
|
+
"margin": "none",
|
|
44
|
+
"border": "none",
|
|
45
|
+
"padding": "none"
|
|
46
|
+
},
|
|
42
47
|
"delivery": {
|
|
43
48
|
"browserImport": "@kerfjs/ui/lucide-icon",
|
|
44
49
|
"manualCssImport": "@kerfjs/ui/lucide-icon.css",
|
|
@@ -90,6 +95,11 @@
|
|
|
90
95
|
"accessibility": [
|
|
91
96
|
"The arrow is decorative; expose expanded state through aria-expanded on its owning control and keep that control's accessible name stable."
|
|
92
97
|
],
|
|
98
|
+
"geometry": {
|
|
99
|
+
"margin": "none",
|
|
100
|
+
"border": "none",
|
|
101
|
+
"padding": "none"
|
|
102
|
+
},
|
|
93
103
|
"delivery": {
|
|
94
104
|
"browserImport": "@kerfjs/ui/disclosure-arrow",
|
|
95
105
|
"manualCssImport": "@kerfjs/ui/disclosure-arrow.css",
|
|
@@ -211,6 +221,11 @@
|
|
|
211
221
|
"accessibility": [
|
|
212
222
|
"Preserve Web Awesome semantics and Kerf focus/contrast tokens."
|
|
213
223
|
],
|
|
224
|
+
"geometry": {
|
|
225
|
+
"margin": "child",
|
|
226
|
+
"border": "child",
|
|
227
|
+
"padding": "child"
|
|
228
|
+
},
|
|
214
229
|
"delivery": {
|
|
215
230
|
"manualCssImport": "@kerfjs/ui/webawesome.css",
|
|
216
231
|
"sideEffects": [
|
|
@@ -233,6 +248,174 @@
|
|
|
233
248
|
"recipe": "docs/webawesome-theme.md#component-selection-guidance"
|
|
234
249
|
}
|
|
235
250
|
},
|
|
251
|
+
{
|
|
252
|
+
"id": "foundation",
|
|
253
|
+
"name": "Foundation tokens",
|
|
254
|
+
"category": "Foundation",
|
|
255
|
+
"kind": "composition",
|
|
256
|
+
"source": "kerf",
|
|
257
|
+
"description": "The complete public typography, spacing, breakpoint, geometry, radius, color, focus, and shadow token surface shipped by foundation.css.",
|
|
258
|
+
"uses": [],
|
|
259
|
+
"purpose": "Provide the shared semantic token foundation for application themes and every styled Kerf UI component.",
|
|
260
|
+
"publicExports": [],
|
|
261
|
+
"useWhen": [
|
|
262
|
+
"Theme a Kerf application globally or reuse the shipped semantic typography, spacing, geometry, color, focus, and shadow values in application-owned composition CSS."
|
|
263
|
+
],
|
|
264
|
+
"avoidWhen": [
|
|
265
|
+
"Do not replace a component-specific prop or token with a broad foundation override when only one component instance should change."
|
|
266
|
+
],
|
|
267
|
+
"alternatives": [],
|
|
268
|
+
"appOwns": [
|
|
269
|
+
"application theme overrides",
|
|
270
|
+
"responsive policy at the cataloged device-class breakpoints"
|
|
271
|
+
],
|
|
272
|
+
"variants": [
|
|
273
|
+
"light",
|
|
274
|
+
"dark",
|
|
275
|
+
"increased contrast"
|
|
276
|
+
],
|
|
277
|
+
"accessibility": [
|
|
278
|
+
"Preserve semantic contrast relationships and the visible focus ring when overriding foundation colors."
|
|
279
|
+
],
|
|
280
|
+
"geometry": {
|
|
281
|
+
"margin": "none",
|
|
282
|
+
"border": "none",
|
|
283
|
+
"padding": "none"
|
|
284
|
+
},
|
|
285
|
+
"delivery": {
|
|
286
|
+
"manualCssImport": "@kerfjs/ui/foundation.css",
|
|
287
|
+
"sideEffects": [
|
|
288
|
+
"css"
|
|
289
|
+
]
|
|
290
|
+
},
|
|
291
|
+
"wiring": [],
|
|
292
|
+
"publicClasses": [],
|
|
293
|
+
"publicTokens": [
|
|
294
|
+
"--kui-font-sans",
|
|
295
|
+
"--kui-font-mono",
|
|
296
|
+
"--kui-font-2xs",
|
|
297
|
+
"--kui-font-xs",
|
|
298
|
+
"--kui-font-s",
|
|
299
|
+
"--kui-font-m",
|
|
300
|
+
"--kui-font-l",
|
|
301
|
+
"--kui-font-2xl",
|
|
302
|
+
"--kui-font-weight-semibold",
|
|
303
|
+
"--kui-space-none",
|
|
304
|
+
"--kui-space-2xs",
|
|
305
|
+
"--kui-space-xs",
|
|
306
|
+
"--kui-space-s",
|
|
307
|
+
"--kui-space-m",
|
|
308
|
+
"--kui-space-l",
|
|
309
|
+
"--kui-space-xl",
|
|
310
|
+
"--kui-bp-mobile",
|
|
311
|
+
"--kui-bp-tablet",
|
|
312
|
+
"--kui-bp-desktop",
|
|
313
|
+
"--kui-bp-xl-desktop",
|
|
314
|
+
"--kui-layout-inline-margin",
|
|
315
|
+
"--kui-layout-item-border-width",
|
|
316
|
+
"--kui-layout-item-padding",
|
|
317
|
+
"--kui-layout-item-gap",
|
|
318
|
+
"--kui-layout-content-gap",
|
|
319
|
+
"--kui-layout-control-gap",
|
|
320
|
+
"--kui-layout-metadata-gap",
|
|
321
|
+
"--kui-layout-highlight-inset",
|
|
322
|
+
"--kui-layout-rounded-radius",
|
|
323
|
+
"--kui-layout-pill-radius",
|
|
324
|
+
"--kui-toolbar-group-inner-size",
|
|
325
|
+
"--kui-toolbar-group-size",
|
|
326
|
+
"--kui-toolbar-gap",
|
|
327
|
+
"--kui-radius-s",
|
|
328
|
+
"--kui-radius-m",
|
|
329
|
+
"--kui-radius-l",
|
|
330
|
+
"--kui-radius-circle",
|
|
331
|
+
"--kui-radius-pill",
|
|
332
|
+
"--kui-disclosure-icon-scale",
|
|
333
|
+
"--kui-color-surface",
|
|
334
|
+
"--kui-color-surface-raised",
|
|
335
|
+
"--kui-color-surface-lowered",
|
|
336
|
+
"--kui-color-text",
|
|
337
|
+
"--kui-color-text-quiet",
|
|
338
|
+
"--kui-color-text-link",
|
|
339
|
+
"--kui-color-neutral-fill-quiet",
|
|
340
|
+
"--kui-color-neutral-fill-normal",
|
|
341
|
+
"--kui-color-neutral-fill-loud",
|
|
342
|
+
"--kui-color-neutral-border-quiet",
|
|
343
|
+
"--kui-color-neutral-border-normal",
|
|
344
|
+
"--kui-color-neutral-border-loud",
|
|
345
|
+
"--kui-color-neutral-on-quiet",
|
|
346
|
+
"--kui-color-neutral-on-normal",
|
|
347
|
+
"--kui-color-neutral-on-loud",
|
|
348
|
+
"--kui-color-brand-fill-loud",
|
|
349
|
+
"--kui-color-brand-fill-quiet",
|
|
350
|
+
"--kui-color-brand-fill-normal",
|
|
351
|
+
"--kui-color-brand-border-quiet",
|
|
352
|
+
"--kui-color-brand-border-normal",
|
|
353
|
+
"--kui-color-brand-border-loud",
|
|
354
|
+
"--kui-color-brand-on-quiet",
|
|
355
|
+
"--kui-color-brand-on-normal",
|
|
356
|
+
"--kui-color-brand-on-loud",
|
|
357
|
+
"--kui-color-brand-on-fill",
|
|
358
|
+
"--kui-color-pop-fill-loud",
|
|
359
|
+
"--kui-color-pop-fill-quiet",
|
|
360
|
+
"--kui-color-pop-fill-normal",
|
|
361
|
+
"--kui-color-pop-border-quiet",
|
|
362
|
+
"--kui-color-pop-border-normal",
|
|
363
|
+
"--kui-color-pop-border-loud",
|
|
364
|
+
"--kui-color-pop-on-quiet",
|
|
365
|
+
"--kui-color-pop-on-normal",
|
|
366
|
+
"--kui-color-pop-on-loud",
|
|
367
|
+
"--kui-color-pop-on-fill",
|
|
368
|
+
"--kui-color-success-fill-loud",
|
|
369
|
+
"--kui-color-success-fill-quiet",
|
|
370
|
+
"--kui-color-success-fill-normal",
|
|
371
|
+
"--kui-color-success-border-quiet",
|
|
372
|
+
"--kui-color-success-border-normal",
|
|
373
|
+
"--kui-color-success-border-loud",
|
|
374
|
+
"--kui-color-success-on-quiet",
|
|
375
|
+
"--kui-color-success-on-normal",
|
|
376
|
+
"--kui-color-success-on-loud",
|
|
377
|
+
"--kui-color-success-on-fill",
|
|
378
|
+
"--kui-color-warning-fill-loud",
|
|
379
|
+
"--kui-color-warning-fill-quiet",
|
|
380
|
+
"--kui-color-warning-fill-normal",
|
|
381
|
+
"--kui-color-warning-border-quiet",
|
|
382
|
+
"--kui-color-warning-border-normal",
|
|
383
|
+
"--kui-color-warning-border-loud",
|
|
384
|
+
"--kui-color-warning-on-quiet",
|
|
385
|
+
"--kui-color-warning-on-normal",
|
|
386
|
+
"--kui-color-warning-on-loud",
|
|
387
|
+
"--kui-color-warning-on-fill",
|
|
388
|
+
"--kui-color-danger-fill-loud",
|
|
389
|
+
"--kui-color-danger-fill-quiet",
|
|
390
|
+
"--kui-color-danger-fill-normal",
|
|
391
|
+
"--kui-color-danger-border-quiet",
|
|
392
|
+
"--kui-color-danger-border-normal",
|
|
393
|
+
"--kui-color-danger-border-loud",
|
|
394
|
+
"--kui-color-danger-on-quiet",
|
|
395
|
+
"--kui-color-danger-on-normal",
|
|
396
|
+
"--kui-color-danger-on-loud",
|
|
397
|
+
"--kui-color-border",
|
|
398
|
+
"--kui-color-border-quiet",
|
|
399
|
+
"--kui-color-accent",
|
|
400
|
+
"--kui-color-accent-text",
|
|
401
|
+
"--kui-color-pop",
|
|
402
|
+
"--kui-color-pop-text",
|
|
403
|
+
"--kui-color-success",
|
|
404
|
+
"--kui-color-success-text",
|
|
405
|
+
"--kui-color-warning",
|
|
406
|
+
"--kui-color-warning-text",
|
|
407
|
+
"--kui-color-danger",
|
|
408
|
+
"--kui-color-danger-text",
|
|
409
|
+
"--kui-focus-ring",
|
|
410
|
+
"--kui-shadow-s",
|
|
411
|
+
"--kui-shadow-l"
|
|
412
|
+
],
|
|
413
|
+
"links": {
|
|
414
|
+
"catalogRoute": "?component=foundation",
|
|
415
|
+
"documentation": "docs/component-selection.md",
|
|
416
|
+
"recipe": "docs/component-selection.md#foundation-tokens"
|
|
417
|
+
}
|
|
418
|
+
},
|
|
236
419
|
{
|
|
237
420
|
"id": "layout",
|
|
238
421
|
"name": "Application layout",
|
|
@@ -244,26 +427,37 @@
|
|
|
244
427
|
"purpose": "Provide one reusable pane, toolbar, content stack, and content-item geometry across sidebars, main areas, and dialogs.",
|
|
245
428
|
"publicExports": [],
|
|
246
429
|
"useWhen": [
|
|
247
|
-
"Build sidebars, main areas, or dialogs from an unpadded pane with optional toolbar/footer and one content stack."
|
|
430
|
+
"Build sidebars, main areas, inspectors, or dialogs from an unpadded pane with optional toolbar/footer and one content stack.",
|
|
431
|
+
"Relocate a hidden pane's restore control into the adjacent main toolbar on the same logical edge."
|
|
248
432
|
],
|
|
249
433
|
"avoidWhen": [
|
|
250
|
-
"Do not pad the pane itself or add wrapper insets around children that already own content-item geometry."
|
|
434
|
+
"Do not pad the pane itself or add wrapper insets around children that already own content-item geometry.",
|
|
435
|
+
"Do not leave an empty icon-only rail after collapsing a pane."
|
|
251
436
|
],
|
|
252
437
|
"alternatives": [],
|
|
253
438
|
"appOwns": [
|
|
254
439
|
"layout hierarchy",
|
|
255
440
|
"reading width",
|
|
256
|
-
"responsive relocation"
|
|
441
|
+
"responsive relocation",
|
|
442
|
+
"pane visibility and matching collapse/restore controls"
|
|
257
443
|
],
|
|
258
444
|
"variants": [
|
|
259
445
|
"toolbar + content",
|
|
260
446
|
"toolbar + content + footer",
|
|
261
447
|
"rounded content item",
|
|
262
|
-
"pill content item"
|
|
448
|
+
"pill content item",
|
|
449
|
+
"hidden inline-start pane restored from main-toolbar leading",
|
|
450
|
+
"hidden inline-end pane restored from main-toolbar trailing"
|
|
263
451
|
],
|
|
264
452
|
"accessibility": [
|
|
265
|
-
"Keep reading and focus order coherent when controls wrap or panes relocate, and preserve one scroll owner per pane."
|
|
453
|
+
"Keep reading and focus order coherent when controls wrap or panes relocate, and preserve one scroll owner per pane.",
|
|
454
|
+
"When collapse replaces one control with its counterpart in another toolbar, move focus to the newly rendered restore or collapse control."
|
|
266
455
|
],
|
|
456
|
+
"geometry": {
|
|
457
|
+
"margin": "child",
|
|
458
|
+
"border": "child",
|
|
459
|
+
"padding": "child"
|
|
460
|
+
},
|
|
267
461
|
"delivery": {
|
|
268
462
|
"manualCssImport": "@kerfjs/ui/layout.css",
|
|
269
463
|
"sideEffects": [
|
|
@@ -277,10 +471,6 @@
|
|
|
277
471
|
"kui-content-item--pill",
|
|
278
472
|
"kui-control-cluster",
|
|
279
473
|
"kui-inline-metadata",
|
|
280
|
-
"kui-pane",
|
|
281
|
-
"kui-pane__content",
|
|
282
|
-
"kui-pane__footer",
|
|
283
|
-
"kui-pane__toolbar",
|
|
284
474
|
"kui-scroll-owner"
|
|
285
475
|
],
|
|
286
476
|
"publicTokens": [
|
|
@@ -300,423 +490,1074 @@
|
|
|
300
490
|
}
|
|
301
491
|
},
|
|
302
492
|
{
|
|
303
|
-
"id": "
|
|
304
|
-
"name": "
|
|
493
|
+
"id": "pane",
|
|
494
|
+
"name": "Pane",
|
|
305
495
|
"category": "Structure",
|
|
306
496
|
"kind": "component",
|
|
307
497
|
"source": "kerf",
|
|
308
|
-
"description": "
|
|
309
|
-
"uses": [
|
|
310
|
-
|
|
311
|
-
"toolbar-control-group"
|
|
312
|
-
],
|
|
313
|
-
"purpose": "Leading, centered, and trailing toolbar composition.",
|
|
498
|
+
"description": "An unpadded application column with optional vertical header/footer slots, one scrolling vertical content stack, and independent logical-edge separators.",
|
|
499
|
+
"uses": [],
|
|
500
|
+
"purpose": "Organize a sidebar, main area, inspector, or dialog column into fixed vertical header/footer chrome around one scrolling content owner.",
|
|
314
501
|
"publicExports": [
|
|
315
|
-
"
|
|
502
|
+
"Pane"
|
|
316
503
|
],
|
|
317
504
|
"useWhen": [
|
|
318
|
-
"
|
|
505
|
+
"An application column needs shared header, content, and optional footer organization with exactly one scrolling content owner.",
|
|
506
|
+
"A pane boundary needs an opt-in separator on any combination of logical sides."
|
|
319
507
|
],
|
|
320
508
|
"avoidWhen": [
|
|
321
|
-
"Do not use
|
|
509
|
+
"Do not use Pane as a padded card or add a competing scroll owner around its content slot.",
|
|
510
|
+
"Do not enable separators merely as decoration; use them only where the pane owns a real boundary."
|
|
322
511
|
],
|
|
323
512
|
"alternatives": [
|
|
324
513
|
{
|
|
325
|
-
"id": "
|
|
326
|
-
"relationship": "
|
|
327
|
-
|
|
328
|
-
{
|
|
329
|
-
"id": "dialog-header",
|
|
330
|
-
"relationship": "nearest"
|
|
514
|
+
"id": "layout",
|
|
515
|
+
"relationship": "composes-with",
|
|
516
|
+
"when": "Use the layout content-item and control classes inside Pane when children need shared geometry."
|
|
331
517
|
}
|
|
332
518
|
],
|
|
333
519
|
"appOwns": [
|
|
334
|
-
"
|
|
335
|
-
"
|
|
336
|
-
"
|
|
520
|
+
"root and content semantics",
|
|
521
|
+
"accessible labels",
|
|
522
|
+
"header, content, and footer children",
|
|
523
|
+
"which logical boundaries show separators",
|
|
524
|
+
"responsive placement and visibility"
|
|
337
525
|
],
|
|
338
526
|
"variants": [
|
|
339
|
-
"
|
|
340
|
-
"
|
|
341
|
-
"
|
|
527
|
+
"content only",
|
|
528
|
+
"header + content",
|
|
529
|
+
"header + content + footer",
|
|
530
|
+
"block-start separator",
|
|
531
|
+
"block-end separator",
|
|
532
|
+
"inline-start separator",
|
|
533
|
+
"inline-end separator"
|
|
342
534
|
],
|
|
343
535
|
"accessibility": [
|
|
344
|
-
"
|
|
345
|
-
|
|
536
|
+
"Choose semantic root and content elements that match the region and provide labels for landmark elements.",
|
|
537
|
+
"Keep fixed header/footer chrome outside the single scrolling content slot so reading and focus order remain coherent."
|
|
538
|
+
],
|
|
539
|
+
"geometry": {
|
|
540
|
+
"margin": "child",
|
|
541
|
+
"border": "conditional",
|
|
542
|
+
"padding": "child",
|
|
543
|
+
"notes": [
|
|
544
|
+
"The pane is unpadded; separators are independently opt-in on logical edges and default off."
|
|
545
|
+
]
|
|
546
|
+
},
|
|
346
547
|
"delivery": {
|
|
347
|
-
"browserImport": "@kerfjs/ui/
|
|
348
|
-
"manualCssImport": "@kerfjs/ui/
|
|
548
|
+
"browserImport": "@kerfjs/ui/pane",
|
|
549
|
+
"manualCssImport": "@kerfjs/ui/pane.css",
|
|
349
550
|
"sideEffects": [
|
|
350
551
|
"browser-condition-css"
|
|
351
552
|
]
|
|
352
553
|
},
|
|
353
554
|
"wiring": [],
|
|
354
555
|
"publicClasses": [
|
|
355
|
-
"kui-
|
|
356
|
-
"kui-
|
|
357
|
-
"kui-
|
|
358
|
-
"kui-
|
|
556
|
+
"kui-pane",
|
|
557
|
+
"kui-pane__content",
|
|
558
|
+
"kui-pane__footer",
|
|
559
|
+
"kui-pane__header",
|
|
560
|
+
"kui-pane__toolbar"
|
|
359
561
|
],
|
|
360
562
|
"publicTokens": [
|
|
361
|
-
"--kui-color
|
|
362
|
-
"--kui-
|
|
563
|
+
"--kui-pane-separator-color",
|
|
564
|
+
"--kui-pane-separator-width"
|
|
363
565
|
],
|
|
364
566
|
"links": {
|
|
365
|
-
"catalogRoute": "?component=
|
|
567
|
+
"catalogRoute": "?component=pane",
|
|
366
568
|
"documentation": "docs/component-selection.md",
|
|
367
|
-
"recipe": "docs/
|
|
569
|
+
"recipe": "docs/layout.md#anatomy"
|
|
368
570
|
}
|
|
369
571
|
},
|
|
370
572
|
{
|
|
371
|
-
"id": "
|
|
372
|
-
"name": "
|
|
573
|
+
"id": "nav-stack",
|
|
574
|
+
"name": "NavStack",
|
|
373
575
|
"category": "Structure",
|
|
374
576
|
"kind": "component",
|
|
375
577
|
"source": "kerf",
|
|
376
|
-
"description": "
|
|
578
|
+
"description": "A controlled one-pane navigation stack that keeps prior views mounted, slides content on push and pop, cross-fades per-view chrome, and moves/restores focus.",
|
|
377
579
|
"uses": [
|
|
378
|
-
"
|
|
379
|
-
"segmented-control"
|
|
580
|
+
"toolbar-text"
|
|
380
581
|
],
|
|
381
|
-
"purpose": "
|
|
582
|
+
"purpose": "Present a single linear or drill-down flow while preserving each prior view's state, scroll position, and place in the stack.",
|
|
382
583
|
"publicExports": [
|
|
383
|
-
"
|
|
584
|
+
"NavStackView",
|
|
585
|
+
"NavStackProps",
|
|
586
|
+
"NavStack"
|
|
384
587
|
],
|
|
385
588
|
"useWhen": [
|
|
386
|
-
"
|
|
589
|
+
"A compact surface shows one view at a time and navigation pushes into details or pops back.",
|
|
590
|
+
"A simple single-pane screen needs the same stable app-layout contract without any nested navigation."
|
|
387
591
|
],
|
|
388
592
|
"avoidWhen": [
|
|
389
|
-
"Do not use
|
|
593
|
+
"Do not use NavStack when a list and detail should remain visible together; use SplitView.",
|
|
594
|
+
"Do not use it for co-equal top-level destinations on compact devices; wrap one stack per destination in TabScaffold."
|
|
390
595
|
],
|
|
391
596
|
"alternatives": [
|
|
392
597
|
{
|
|
393
|
-
"id": "
|
|
394
|
-
"relationship": "
|
|
598
|
+
"id": "split-view",
|
|
599
|
+
"relationship": "roomy-alternative",
|
|
600
|
+
"when": "Promote a list-to-detail stack to SplitView once both regions fit together."
|
|
395
601
|
},
|
|
396
602
|
{
|
|
397
|
-
"id": "
|
|
398
|
-
"relationship": "
|
|
603
|
+
"id": "tab-scaffold",
|
|
604
|
+
"relationship": "composes-with",
|
|
605
|
+
"when": "Use one NavStack as each TabScaffold tab's persistent content."
|
|
399
606
|
}
|
|
400
607
|
],
|
|
401
608
|
"appOwns": [
|
|
402
|
-
"
|
|
403
|
-
"
|
|
404
|
-
"
|
|
609
|
+
"ordered view stack and stable keys",
|
|
610
|
+
"view content and titles",
|
|
611
|
+
"push and pop actions",
|
|
612
|
+
"preferred initial focus targets when DOM order is insufficient",
|
|
613
|
+
"per-view bottom toolbar content or a persistent fallback"
|
|
405
614
|
],
|
|
406
615
|
"variants": [
|
|
407
|
-
"
|
|
408
|
-
"
|
|
409
|
-
"
|
|
410
|
-
"
|
|
616
|
+
"single root view",
|
|
617
|
+
"pushed detail view",
|
|
618
|
+
"toolbar hidden",
|
|
619
|
+
"per-view bottom toolbar",
|
|
620
|
+
"persistent bottom-toolbar fallback"
|
|
411
621
|
],
|
|
412
622
|
"accessibility": [
|
|
413
|
-
"
|
|
414
|
-
|
|
623
|
+
"Give the stack region an accessible label and every back control a stable action label.",
|
|
624
|
+
"Use wireNavStack so each controlled push moves focus into the new top view and each pop restores the revealed view's remembered descendant.",
|
|
625
|
+
"Mark a preferred initial heading or control with data-nav-focus when the first enabled focusable descendant is not the right target."
|
|
626
|
+
],
|
|
627
|
+
"geometry": {
|
|
628
|
+
"margin": "none",
|
|
629
|
+
"border": "conditional",
|
|
630
|
+
"padding": "child",
|
|
631
|
+
"notes": [
|
|
632
|
+
"The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content."
|
|
633
|
+
]
|
|
634
|
+
},
|
|
415
635
|
"delivery": {
|
|
416
|
-
"
|
|
417
|
-
"manualCssImport": "@kerfjs/ui/
|
|
636
|
+
"moduleImport": "@kerfjs/ui/nav-stack",
|
|
637
|
+
"manualCssImport": "@kerfjs/ui/nav-stack.css",
|
|
418
638
|
"sideEffects": [
|
|
419
|
-
"
|
|
639
|
+
"manual-css"
|
|
420
640
|
]
|
|
421
641
|
},
|
|
422
|
-
"wiring": [
|
|
642
|
+
"wiring": [
|
|
643
|
+
{
|
|
644
|
+
"export": "wireNavStack",
|
|
645
|
+
"import": "@kerfjs/ui/wire-nav-stack",
|
|
646
|
+
"required": true
|
|
647
|
+
}
|
|
648
|
+
],
|
|
423
649
|
"publicClasses": [
|
|
424
|
-
"kui-
|
|
650
|
+
"kui-nav-stack",
|
|
651
|
+
"kui-nav-stack__chrome",
|
|
652
|
+
"kui-nav-stack__bottom",
|
|
653
|
+
"kui-nav-stack__chrome--entering",
|
|
654
|
+
"kui-nav-stack__chrome-copy",
|
|
655
|
+
"kui-nav-stack__chrome-copy--bottom",
|
|
656
|
+
"kui-nav-stack__chrome-copy--exiting",
|
|
657
|
+
"kui-nav-stack__lead",
|
|
658
|
+
"kui-nav-stack__back",
|
|
659
|
+
"kui-nav-stack__back-icon",
|
|
660
|
+
"kui-nav-stack__title",
|
|
661
|
+
"kui-nav-stack__actions",
|
|
662
|
+
"kui-nav-stack__viewport",
|
|
663
|
+
"kui-nav-stack__view",
|
|
664
|
+
"kui-nav-stack__view--entering",
|
|
665
|
+
"kui-nav-stack__view--exiting"
|
|
425
666
|
],
|
|
426
667
|
"publicTokens": [
|
|
427
|
-
"--kui-
|
|
428
|
-
"--kui-color-neutral-border-loud",
|
|
429
|
-
"--kui-color-neutral-border-normal",
|
|
430
|
-
"--kui-color-neutral-fill-loud",
|
|
431
|
-
"--kui-color-neutral-fill-normal",
|
|
432
|
-
"--kui-color-neutral-on-loud",
|
|
433
|
-
"--kui-color-neutral-on-quiet",
|
|
434
|
-
"--kui-color-surface",
|
|
435
|
-
"--kui-focus-ring",
|
|
436
|
-
"--kui-shadow-s",
|
|
437
|
-
"--kui-toolbar-control-background",
|
|
438
|
-
"--kui-toolbar-control-border",
|
|
439
|
-
"--kui-toolbar-control-color",
|
|
440
|
-
"--kui-toolbar-control-dark-border",
|
|
441
|
-
"--kui-toolbar-control-hover-background",
|
|
442
|
-
"--kui-toolbar-control-pressed-background",
|
|
443
|
-
"--kui-toolbar-control-pressed-border",
|
|
444
|
-
"--kui-toolbar-control-pressed-color",
|
|
445
|
-
"--kui-toolbar-control-selected-background",
|
|
446
|
-
"--kui-toolbar-control-selected-color",
|
|
447
|
-
"--kui-toolbar-control-selected-shadow"
|
|
668
|
+
"--kui-nav-stack-transition-duration"
|
|
448
669
|
],
|
|
449
670
|
"links": {
|
|
450
|
-
"catalogRoute": "?component=
|
|
451
|
-
"documentation": "docs/
|
|
452
|
-
"recipe": "docs/
|
|
671
|
+
"catalogRoute": "?component=nav-stack",
|
|
672
|
+
"documentation": "docs/nav-stack.md",
|
|
673
|
+
"recipe": "docs/app-layouts.md#decision-matrix"
|
|
453
674
|
}
|
|
454
675
|
},
|
|
455
676
|
{
|
|
456
|
-
"id": "
|
|
457
|
-
"name": "
|
|
677
|
+
"id": "split-view",
|
|
678
|
+
"name": "SplitView",
|
|
458
679
|
"category": "Structure",
|
|
459
680
|
"kind": "component",
|
|
460
681
|
"source": "kerf",
|
|
461
|
-
"description": "
|
|
462
|
-
"uses": [
|
|
463
|
-
|
|
682
|
+
"description": "A responsive list-detail layout that shows both panes on roomy device classes and collapses to a navigation stack on compact classes.",
|
|
683
|
+
"uses": [
|
|
684
|
+
"nav-stack",
|
|
685
|
+
"resize"
|
|
686
|
+
],
|
|
687
|
+
"purpose": "Present a selectable list and its detail together when space permits, with a one-pane drill-down replacement on compact devices.",
|
|
464
688
|
"publicExports": [
|
|
465
|
-
"
|
|
689
|
+
"SplitView",
|
|
690
|
+
"SplitViewProps",
|
|
691
|
+
"SplitViewResizable"
|
|
466
692
|
],
|
|
467
693
|
"useWhen": [
|
|
468
|
-
"
|
|
694
|
+
"Selection in a primary list updates a related detail pane and both should remain visible on roomy device classes.",
|
|
695
|
+
"The same list-detail flow must become a navigation stack on a handset or portrait tablet."
|
|
469
696
|
],
|
|
470
697
|
"avoidWhen": [
|
|
471
|
-
"Do not
|
|
698
|
+
"Do not use SplitView for a single linear flow; use NavStack.",
|
|
699
|
+
"Do not use it for a complex desktop tool with multiple peripheral panels; use Workbench."
|
|
472
700
|
],
|
|
473
701
|
"alternatives": [
|
|
474
702
|
{
|
|
475
|
-
"id": "
|
|
476
|
-
"relationship": "
|
|
703
|
+
"id": "recipe-navigation-stack",
|
|
704
|
+
"relationship": "responsive-alternative",
|
|
705
|
+
"when": "SplitView renders the one-pane navigation-stack form on compact device classes."
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"id": "workbench",
|
|
709
|
+
"relationship": "nearest",
|
|
710
|
+
"when": "Use Workbench when a desktop-class tool needs more than the list and detail regions."
|
|
477
711
|
}
|
|
478
712
|
],
|
|
479
713
|
"appOwns": [
|
|
480
|
-
"
|
|
481
|
-
"
|
|
714
|
+
"device-class policy",
|
|
715
|
+
"selected item and detail-active state",
|
|
716
|
+
"list and detail content",
|
|
717
|
+
"optional list width and persistence",
|
|
718
|
+
"back action"
|
|
482
719
|
],
|
|
483
720
|
"variants": [
|
|
484
|
-
"
|
|
485
|
-
"
|
|
486
|
-
"
|
|
721
|
+
"fixed roomy split",
|
|
722
|
+
"resizable roomy split",
|
|
723
|
+
"compact list",
|
|
724
|
+
"compact detail"
|
|
487
725
|
],
|
|
488
|
-
"accessibility": [
|
|
726
|
+
"accessibility": [
|
|
727
|
+
"Give the overall split and both meaningful panes accessible labels.",
|
|
728
|
+
"Wire the compact back action and optional separator keyboard behavior, and restore focus when controlled navigation replaces a view."
|
|
729
|
+
],
|
|
730
|
+
"geometry": {
|
|
731
|
+
"margin": "none",
|
|
732
|
+
"border": "self",
|
|
733
|
+
"padding": "child",
|
|
734
|
+
"notes": [
|
|
735
|
+
"The root owns the two-column split and the list pane owns its separator; list and detail content own their internal padding and scroll behavior."
|
|
736
|
+
]
|
|
737
|
+
},
|
|
489
738
|
"delivery": {
|
|
490
|
-
"
|
|
491
|
-
"manualCssImport": "@kerfjs/ui/
|
|
739
|
+
"moduleImport": "@kerfjs/ui/split-view",
|
|
740
|
+
"manualCssImport": "@kerfjs/ui/split-view.css",
|
|
492
741
|
"sideEffects": [
|
|
493
|
-
"
|
|
742
|
+
"manual-css"
|
|
494
743
|
]
|
|
495
744
|
},
|
|
496
|
-
"wiring": [
|
|
745
|
+
"wiring": [
|
|
746
|
+
{
|
|
747
|
+
"export": "wireResizableRegions",
|
|
748
|
+
"import": "@kerfjs/ui/wire-resizable-regions",
|
|
749
|
+
"required": false
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"export": "wireNavStack",
|
|
753
|
+
"import": "@kerfjs/ui/wire-nav-stack",
|
|
754
|
+
"required": true
|
|
755
|
+
}
|
|
756
|
+
],
|
|
497
757
|
"publicClasses": [
|
|
498
|
-
"kui-
|
|
758
|
+
"kui-split-view",
|
|
759
|
+
"kui-split-view__list",
|
|
760
|
+
"kui-resizable-region",
|
|
761
|
+
"kui-split-view__detail",
|
|
762
|
+
"kui-split-view--compact"
|
|
499
763
|
],
|
|
500
764
|
"publicTokens": [
|
|
501
|
-
"--kui-
|
|
502
|
-
"--kui-font-m",
|
|
503
|
-
"--kui-font-mono",
|
|
504
|
-
"--kui-font-s",
|
|
505
|
-
"--kui-font-xs"
|
|
765
|
+
"--kui-split-view-list-width"
|
|
506
766
|
],
|
|
507
767
|
"links": {
|
|
508
|
-
"catalogRoute": "?component=
|
|
509
|
-
"documentation": "docs/
|
|
510
|
-
"recipe": "docs/
|
|
768
|
+
"catalogRoute": "?component=split-view",
|
|
769
|
+
"documentation": "docs/split-view.md",
|
|
770
|
+
"recipe": "docs/app-layouts.md#decision-matrix"
|
|
511
771
|
}
|
|
512
772
|
},
|
|
513
773
|
{
|
|
514
|
-
"id": "
|
|
515
|
-
"name": "
|
|
774
|
+
"id": "tab-scaffold",
|
|
775
|
+
"name": "TabScaffold",
|
|
516
776
|
"category": "Structure",
|
|
517
|
-
"kind": "
|
|
777
|
+
"kind": "component",
|
|
518
778
|
"source": "kerf",
|
|
519
|
-
"description": "
|
|
520
|
-
"uses": [
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
"
|
|
779
|
+
"description": "A controlled compact-device bottom tab scaffold that keeps every tab scene mounted so its navigation and scroll state survive selection changes.",
|
|
780
|
+
"uses": [],
|
|
781
|
+
"purpose": "Switch among two to five co-equal top-level destinations on compact devices while preserving each destination's independent content state.",
|
|
782
|
+
"publicExports": [
|
|
783
|
+
"TabScaffoldTab",
|
|
784
|
+
"TabScaffoldProps",
|
|
785
|
+
"TabScaffold"
|
|
524
786
|
],
|
|
525
|
-
"purpose": "Page, dialog, and definition-list hierarchy.",
|
|
526
|
-
"publicExports": [],
|
|
527
787
|
"useWhen": [
|
|
528
|
-
"
|
|
788
|
+
"A handset or portrait-tablet app has two to five co-equal top-level destinations.",
|
|
789
|
+
"Each destination must stay mounted so its NavStack and scroll position survive tab switches."
|
|
529
790
|
],
|
|
530
791
|
"avoidWhen": [
|
|
531
|
-
"Do not
|
|
792
|
+
"Do not use TabScaffold for document tabs or reorderable work items; use TabBar.",
|
|
793
|
+
"Do not retain the bottom bar on desktop when the same destinations should be promoted to a Workbench rail or sidebar."
|
|
532
794
|
],
|
|
533
795
|
"alternatives": [
|
|
534
796
|
{
|
|
535
|
-
"id": "
|
|
536
|
-
"relationship": "
|
|
537
|
-
|
|
538
|
-
{
|
|
539
|
-
"id": "page-header",
|
|
540
|
-
"relationship": "nearest"
|
|
797
|
+
"id": "tabs",
|
|
798
|
+
"relationship": "semantic-alternative",
|
|
799
|
+
"when": "Use TabBar and AppTab for document-style tabpanels, overflow, closing, or reordering."
|
|
541
800
|
},
|
|
542
801
|
{
|
|
543
|
-
"id": "
|
|
544
|
-
"relationship": "
|
|
802
|
+
"id": "workbench",
|
|
803
|
+
"relationship": "roomy-alternative",
|
|
804
|
+
"when": "Promote top-level destinations to a rail or sidebar on desktop-class layouts."
|
|
545
805
|
}
|
|
546
806
|
],
|
|
547
807
|
"appOwns": [
|
|
548
|
-
"
|
|
549
|
-
"
|
|
550
|
-
"
|
|
808
|
+
"controlled active tab id",
|
|
809
|
+
"tab labels, icons, and content",
|
|
810
|
+
"routing and persistence",
|
|
811
|
+
"responsive replacement on larger device classes"
|
|
551
812
|
],
|
|
552
813
|
"variants": [
|
|
553
|
-
"
|
|
554
|
-
"
|
|
555
|
-
"
|
|
814
|
+
"text-only tabs",
|
|
815
|
+
"icon and text tabs",
|
|
816
|
+
"one NavStack per tab"
|
|
556
817
|
],
|
|
557
818
|
"accessibility": [
|
|
558
|
-
"
|
|
559
|
-
|
|
819
|
+
"Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
|
|
820
|
+
"Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
|
|
821
|
+
],
|
|
822
|
+
"geometry": {
|
|
823
|
+
"margin": "none",
|
|
824
|
+
"border": "self",
|
|
825
|
+
"padding": "self",
|
|
826
|
+
"notes": [
|
|
827
|
+
"The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry."
|
|
828
|
+
]
|
|
829
|
+
},
|
|
560
830
|
"delivery": {
|
|
831
|
+
"moduleImport": "@kerfjs/ui/tab-scaffold",
|
|
832
|
+
"manualCssImport": "@kerfjs/ui/tab-scaffold.css",
|
|
561
833
|
"sideEffects": [
|
|
562
|
-
"css"
|
|
834
|
+
"manual-css"
|
|
563
835
|
]
|
|
564
836
|
},
|
|
565
|
-
"wiring": [
|
|
566
|
-
|
|
837
|
+
"wiring": [
|
|
838
|
+
{
|
|
839
|
+
"export": "wireTabScaffold",
|
|
840
|
+
"import": "@kerfjs/ui/wire-tab-scaffold",
|
|
841
|
+
"required": true
|
|
842
|
+
}
|
|
843
|
+
],
|
|
844
|
+
"publicClasses": [
|
|
845
|
+
"kui-tab-scaffold",
|
|
846
|
+
"kui-tab-scaffold__scenes",
|
|
847
|
+
"kui-tab-scaffold__scene",
|
|
848
|
+
"kui-tab-scaffold__bar",
|
|
849
|
+
"kui-tab-scaffold__tab",
|
|
850
|
+
"kui-tab-scaffold__tab-icon",
|
|
851
|
+
"kui-tab-scaffold__tab-label"
|
|
852
|
+
],
|
|
567
853
|
"publicTokens": [],
|
|
568
854
|
"links": {
|
|
569
|
-
"catalogRoute": "?component=
|
|
570
|
-
"documentation": "docs/
|
|
571
|
-
"recipe": "docs/
|
|
855
|
+
"catalogRoute": "?component=tab-scaffold",
|
|
856
|
+
"documentation": "docs/tab-scaffold.md",
|
|
857
|
+
"recipe": "docs/app-layouts.md#decision-matrix"
|
|
572
858
|
}
|
|
573
859
|
},
|
|
574
860
|
{
|
|
575
|
-
"id": "
|
|
576
|
-
"name": "
|
|
861
|
+
"id": "workbench",
|
|
862
|
+
"name": "Workbench",
|
|
577
863
|
"category": "Structure",
|
|
578
864
|
"kind": "component",
|
|
579
865
|
"source": "kerf",
|
|
580
|
-
"description": "
|
|
866
|
+
"description": "A desktop-class multi-panel workspace with independently collapsible left and right rails and a bottom drawer around one central work area.",
|
|
581
867
|
"uses": [],
|
|
582
|
-
"purpose": "
|
|
868
|
+
"purpose": "Arrange a complex tool or editor as a stable central work area with optional peripheral rails and a bottom drawer.",
|
|
583
869
|
"publicExports": [
|
|
584
|
-
"
|
|
870
|
+
"Workbench",
|
|
871
|
+
"WorkbenchPanel",
|
|
872
|
+
"WorkbenchProps"
|
|
585
873
|
],
|
|
586
874
|
"useWhen": [
|
|
587
|
-
"
|
|
875
|
+
"A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions."
|
|
588
876
|
],
|
|
589
877
|
"avoidWhen": [
|
|
590
|
-
"Do not
|
|
878
|
+
"Do not shrink the full multi-panel shell onto compact devices; present peripheral content through NavStack or overlay drawers instead.",
|
|
879
|
+
"Do not use Workbench for one standalone collapsible rail or drawer; use CollapsiblePanel."
|
|
591
880
|
],
|
|
592
881
|
"alternatives": [
|
|
593
882
|
{
|
|
594
|
-
"id": "
|
|
595
|
-
"relationship": "
|
|
883
|
+
"id": "pane",
|
|
884
|
+
"relationship": "composes-with",
|
|
885
|
+
"when": "Use Pane inside Workbench regions when fixed header/footer chrome must surround one scroll owner."
|
|
886
|
+
}
|
|
887
|
+
],
|
|
888
|
+
"appOwns": [
|
|
889
|
+
"panel presence and content",
|
|
890
|
+
"collapsed state",
|
|
891
|
+
"panel sizes",
|
|
892
|
+
"responsive replacement below desktop",
|
|
893
|
+
"collapse controls and focus policy"
|
|
894
|
+
],
|
|
895
|
+
"variants": [
|
|
896
|
+
"main only",
|
|
897
|
+
"left rail",
|
|
898
|
+
"right rail",
|
|
899
|
+
"bottom drawer",
|
|
900
|
+
"all panels",
|
|
901
|
+
"independently collapsed panels",
|
|
902
|
+
"hidden separator",
|
|
903
|
+
"slide, fade-slide, or instant content",
|
|
904
|
+
"clipped, scrolling, or popup-visible content",
|
|
905
|
+
"inline, overlay, or hidden responsive presentation",
|
|
906
|
+
"safe-area restore control"
|
|
907
|
+
],
|
|
908
|
+
"accessibility": [
|
|
909
|
+
"Give the Workbench and each meaningful rail or drawer an accessible label.",
|
|
910
|
+
"Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control."
|
|
911
|
+
],
|
|
912
|
+
"geometry": {
|
|
913
|
+
"margin": "none",
|
|
914
|
+
"border": "self",
|
|
915
|
+
"padding": "child",
|
|
916
|
+
"notes": [
|
|
917
|
+
"Workbench owns the rail and drawer separators; each region's content owns its internal padding and scroll behavior."
|
|
918
|
+
]
|
|
919
|
+
},
|
|
920
|
+
"delivery": {
|
|
921
|
+
"moduleImport": "@kerfjs/ui/workbench",
|
|
922
|
+
"manualCssImport": "@kerfjs/ui/workbench.css",
|
|
923
|
+
"sideEffects": [
|
|
924
|
+
"manual-css"
|
|
925
|
+
]
|
|
926
|
+
},
|
|
927
|
+
"wiring": [],
|
|
928
|
+
"publicClasses": [
|
|
929
|
+
"kui-workbench",
|
|
930
|
+
"kui-workbench__rail",
|
|
931
|
+
"kui-workbench__rail--left",
|
|
932
|
+
"kui-workbench__rail--right",
|
|
933
|
+
"kui-workbench__drawer",
|
|
934
|
+
"kui-workbench__center",
|
|
935
|
+
"kui-workbench__main",
|
|
936
|
+
"kui-workbench__panel-content",
|
|
937
|
+
"kui-workbench__restore"
|
|
938
|
+
],
|
|
939
|
+
"publicTokens": [
|
|
940
|
+
"--kui-workbench-rail-width",
|
|
941
|
+
"--kui-workbench-drawer-height",
|
|
942
|
+
"--kui-workbench-popup-z",
|
|
943
|
+
"--kui-workbench-overlay-z",
|
|
944
|
+
"--kui-workbench-overlay-max-width",
|
|
945
|
+
"--kui-workbench-overlay-max-height",
|
|
946
|
+
"--kui-workbench-restore-z",
|
|
947
|
+
"--kui-workbench-restore-inset"
|
|
948
|
+
],
|
|
949
|
+
"links": {
|
|
950
|
+
"catalogRoute": "?component=workbench",
|
|
951
|
+
"documentation": "docs/workbench.md",
|
|
952
|
+
"recipe": "docs/workbench.md#state-lives-in-the-app"
|
|
953
|
+
}
|
|
954
|
+
},
|
|
955
|
+
{
|
|
956
|
+
"id": "collapsible-panel",
|
|
957
|
+
"name": "CollapsiblePanel",
|
|
958
|
+
"category": "Structure",
|
|
959
|
+
"kind": "component",
|
|
960
|
+
"source": "kerf",
|
|
961
|
+
"description": "A standalone controlled left or right rail or bottom drawer with standard collapse icons and optional compact-overlay behavior through wireSidebar.",
|
|
962
|
+
"uses": [
|
|
963
|
+
"lucide-icon"
|
|
964
|
+
],
|
|
965
|
+
"purpose": "Add one independently collapsible peripheral panel without adopting the complete multi-panel Workbench shell.",
|
|
966
|
+
"publicExports": [
|
|
967
|
+
"CollapsiblePanelSide",
|
|
968
|
+
"collapsiblePanelToggleIcon",
|
|
969
|
+
"CollapsiblePanelToggleProps",
|
|
970
|
+
"CollapsiblePanelToggle",
|
|
971
|
+
"CollapsiblePanelProps",
|
|
972
|
+
"CollapsiblePanel"
|
|
973
|
+
],
|
|
974
|
+
"useWhen": [
|
|
975
|
+
"An application needs one collapsible side rail or bottom drawer outside a full Workbench.",
|
|
976
|
+
"The panel should become a dismissable, focus-managed overlay on compact devices."
|
|
977
|
+
],
|
|
978
|
+
"avoidWhen": [
|
|
979
|
+
"Do not use CollapsiblePanel for a complete editor shell with multiple coordinated rails and a drawer; use Workbench.",
|
|
980
|
+
"Do not preserve an empty icon-only rail when collapsed; move the restore control into adjacent visible chrome."
|
|
981
|
+
],
|
|
982
|
+
"alternatives": [
|
|
983
|
+
{
|
|
984
|
+
"id": "workbench",
|
|
985
|
+
"relationship": "larger-composition",
|
|
986
|
+
"when": "Use Workbench when the central work area coordinates multiple peripheral panels."
|
|
596
987
|
},
|
|
597
988
|
{
|
|
598
|
-
"id": "
|
|
599
|
-
"relationship": "
|
|
989
|
+
"id": "recipe-collapsible-sidebar",
|
|
990
|
+
"relationship": "recipe",
|
|
991
|
+
"when": "Use the production recipe for collapse, restore, compact overlay, focus, and persistence ownership."
|
|
600
992
|
}
|
|
601
993
|
],
|
|
602
994
|
"appOwns": [
|
|
603
|
-
"
|
|
604
|
-
"
|
|
605
|
-
"
|
|
995
|
+
"controlled collapsed state",
|
|
996
|
+
"panel content and size",
|
|
997
|
+
"toggle placement",
|
|
998
|
+
"persistence policy",
|
|
999
|
+
"compact-device policy"
|
|
606
1000
|
],
|
|
607
1001
|
"variants": [
|
|
608
|
-
"
|
|
609
|
-
"
|
|
1002
|
+
"left rail",
|
|
1003
|
+
"right rail",
|
|
1004
|
+
"bottom drawer",
|
|
1005
|
+
"collapsed",
|
|
1006
|
+
"compact overlay",
|
|
1007
|
+
"compact responsive replacement",
|
|
1008
|
+
"hidden separator",
|
|
1009
|
+
"slide, fade-slide, or instant content",
|
|
1010
|
+
"clipped, scrolling, or popup-visible content",
|
|
1011
|
+
"safe-area restore control"
|
|
610
1012
|
],
|
|
611
1013
|
"accessibility": [
|
|
612
|
-
"
|
|
1014
|
+
"Give the panel region and every collapse or restore control an accessible label.",
|
|
1015
|
+
"Keep the restore control outside the disappearing panel and use wireSidebar for focus transfer, Escape, backdrop dismissal, and compact focus trapping."
|
|
1016
|
+
],
|
|
1017
|
+
"geometry": {
|
|
1018
|
+
"margin": "none",
|
|
1019
|
+
"border": "self",
|
|
1020
|
+
"padding": "child",
|
|
1021
|
+
"notes": [
|
|
1022
|
+
"The panel owns its dock-edge separator and size track; its child content owns internal padding and scrolling."
|
|
1023
|
+
]
|
|
1024
|
+
},
|
|
1025
|
+
"delivery": {
|
|
1026
|
+
"moduleImport": "@kerfjs/ui/collapsible-panel",
|
|
1027
|
+
"manualCssImport": "@kerfjs/ui/collapsible-panel.css",
|
|
1028
|
+
"sideEffects": [
|
|
1029
|
+
"manual-css"
|
|
1030
|
+
]
|
|
1031
|
+
},
|
|
1032
|
+
"wiring": [
|
|
1033
|
+
{
|
|
1034
|
+
"export": "wireSidebar",
|
|
1035
|
+
"import": "@kerfjs/ui/wire-sidebar",
|
|
1036
|
+
"required": true
|
|
1037
|
+
}
|
|
1038
|
+
],
|
|
1039
|
+
"publicClasses": [
|
|
1040
|
+
"kui-collapsible-panel",
|
|
1041
|
+
"kui-collapsible-panel--left",
|
|
1042
|
+
"kui-collapsible-panel--right",
|
|
1043
|
+
"kui-collapsible-panel--bottom",
|
|
1044
|
+
"kui-collapsible-panel__content",
|
|
1045
|
+
"kui-collapsible-panel__restore",
|
|
1046
|
+
"kui-collapsible-panel__backdrop",
|
|
1047
|
+
"kui-collapsible-panel__toggle"
|
|
1048
|
+
],
|
|
1049
|
+
"publicTokens": [
|
|
1050
|
+
"--kui-collapsible-panel-width",
|
|
1051
|
+
"--kui-collapsible-panel-height",
|
|
1052
|
+
"--kui-collapsible-panel-popup-z",
|
|
1053
|
+
"--kui-collapsible-panel-overlay-z",
|
|
1054
|
+
"--kui-collapsible-panel-restore-z",
|
|
1055
|
+
"--kui-collapsible-panel-restore-inset",
|
|
1056
|
+
"--kui-collapsible-panel-backdrop-z"
|
|
1057
|
+
],
|
|
1058
|
+
"links": {
|
|
1059
|
+
"catalogRoute": "?component=collapsible-panel",
|
|
1060
|
+
"documentation": "docs/collapsible-panel.md",
|
|
1061
|
+
"recipe": "docs/collapsible-panel.md#recipe-and-coverage"
|
|
1062
|
+
}
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
"id": "sunken-panel",
|
|
1066
|
+
"name": "SunkenPanel",
|
|
1067
|
+
"category": "Structure",
|
|
1068
|
+
"kind": "component",
|
|
1069
|
+
"source": "kerf",
|
|
1070
|
+
"description": "A rounded or square-corner lowered application surface with one compact inset and a vertical content stack.",
|
|
1071
|
+
"uses": [],
|
|
1072
|
+
"purpose": "Group a vertical list of application content on a visually lowered surface with one owned 8px inset and an explicit rounded or square-corner shape.",
|
|
1073
|
+
"publicExports": [
|
|
1074
|
+
"SunkenPanel"
|
|
1075
|
+
],
|
|
1076
|
+
"useWhen": [
|
|
1077
|
+
"A main content region or nested work area needs a darker/lowered background and one compact inset around a vertical stack.",
|
|
1078
|
+
"Use the default rounded shape for an inset surface; choose square for a flush or edge-to-edge application area."
|
|
1079
|
+
],
|
|
1080
|
+
"avoidWhen": [
|
|
1081
|
+
"Do not use it merely to add padding, as a substitute for Pane anatomy, or around children that already own the same outer surface."
|
|
1082
|
+
],
|
|
1083
|
+
"alternatives": [
|
|
1084
|
+
{
|
|
1085
|
+
"id": "layout",
|
|
1086
|
+
"relationship": "composes-with",
|
|
1087
|
+
"when": "Use layout roles for pane, toolbar, scroll, and ordinary content-stack ownership."
|
|
1088
|
+
}
|
|
1089
|
+
],
|
|
1090
|
+
"appOwns": [
|
|
1091
|
+
"region semantics and accessible name",
|
|
1092
|
+
"corner shape",
|
|
1093
|
+
"scroll ownership",
|
|
1094
|
+
"child ordering and content"
|
|
1095
|
+
],
|
|
1096
|
+
"variants": [
|
|
1097
|
+
"rounded surface",
|
|
1098
|
+
"square-corner surface",
|
|
1099
|
+
"unnamed surface",
|
|
1100
|
+
"named region"
|
|
613
1101
|
],
|
|
1102
|
+
"accessibility": [
|
|
1103
|
+
"Pass ariaLabel only when the surface is a distinct named region; otherwise it remains a non-landmark grouping."
|
|
1104
|
+
],
|
|
1105
|
+
"geometry": {
|
|
1106
|
+
"margin": "none",
|
|
1107
|
+
"border": "none",
|
|
1108
|
+
"padding": "self",
|
|
1109
|
+
"notes": [
|
|
1110
|
+
"The root owns one 8px inset and vertical gap; children own their borders and internal geometry."
|
|
1111
|
+
]
|
|
1112
|
+
},
|
|
614
1113
|
"delivery": {
|
|
615
|
-
"browserImport": "@kerfjs/ui/
|
|
616
|
-
"manualCssImport": "@kerfjs/ui/
|
|
1114
|
+
"browserImport": "@kerfjs/ui/sunken-panel",
|
|
1115
|
+
"manualCssImport": "@kerfjs/ui/sunken-panel.css",
|
|
617
1116
|
"sideEffects": [
|
|
618
1117
|
"browser-condition-css"
|
|
619
1118
|
]
|
|
620
1119
|
},
|
|
621
1120
|
"wiring": [],
|
|
622
1121
|
"publicClasses": [
|
|
623
|
-
"kui-
|
|
624
|
-
"kui-page-header__action"
|
|
1122
|
+
"kui-sunken-panel"
|
|
625
1123
|
],
|
|
626
1124
|
"publicTokens": [
|
|
627
|
-
"--kui-
|
|
628
|
-
"--kui-
|
|
629
|
-
"--kui-
|
|
630
|
-
"--kui-
|
|
631
|
-
"--kui-
|
|
632
|
-
"--kui-page-header-foreground"
|
|
1125
|
+
"--kui-sunken-panel-background",
|
|
1126
|
+
"--kui-sunken-panel-foreground",
|
|
1127
|
+
"--kui-sunken-panel-gap",
|
|
1128
|
+
"--kui-sunken-panel-padding",
|
|
1129
|
+
"--kui-sunken-panel-radius"
|
|
633
1130
|
],
|
|
634
1131
|
"links": {
|
|
635
|
-
"catalogRoute": "?component=
|
|
1132
|
+
"catalogRoute": "?component=sunken-panel",
|
|
1133
|
+
"documentation": "docs/sunken-panel.md",
|
|
1134
|
+
"recipe": "docs/sunken-panel.md#ownership"
|
|
1135
|
+
}
|
|
1136
|
+
},
|
|
1137
|
+
{
|
|
1138
|
+
"id": "toolbar",
|
|
1139
|
+
"name": "Toolbar",
|
|
1140
|
+
"category": "Structure",
|
|
1141
|
+
"kind": "component",
|
|
1142
|
+
"source": "kerf",
|
|
1143
|
+
"description": "Leading, centered, and trailing toolbar composition.",
|
|
1144
|
+
"uses": [
|
|
1145
|
+
"toolbar-text",
|
|
1146
|
+
"toolbar-control-group"
|
|
1147
|
+
],
|
|
1148
|
+
"purpose": "Leading, centered, and trailing toolbar composition.",
|
|
1149
|
+
"publicExports": [
|
|
1150
|
+
"Toolbar"
|
|
1151
|
+
],
|
|
1152
|
+
"useWhen": [
|
|
1153
|
+
"Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions."
|
|
1154
|
+
],
|
|
1155
|
+
"avoidWhen": [
|
|
1156
|
+
"Do not use it as a generic wrapper when no toolbar or heading relationship exists."
|
|
1157
|
+
],
|
|
1158
|
+
"alternatives": [],
|
|
1159
|
+
"appOwns": [
|
|
1160
|
+
"actions",
|
|
1161
|
+
"command availability",
|
|
1162
|
+
"responsive relocation"
|
|
1163
|
+
],
|
|
1164
|
+
"variants": [
|
|
1165
|
+
"bottom divider (default)",
|
|
1166
|
+
"no dividers",
|
|
1167
|
+
"top/right/bottom/left divider combinations",
|
|
1168
|
+
"centered content"
|
|
1169
|
+
],
|
|
1170
|
+
"accessibility": [
|
|
1171
|
+
"Supply a label when the toolbar needs an accessible name."
|
|
1172
|
+
],
|
|
1173
|
+
"geometry": {
|
|
1174
|
+
"margin": "none",
|
|
1175
|
+
"border": "conditional",
|
|
1176
|
+
"padding": "self",
|
|
1177
|
+
"notes": [
|
|
1178
|
+
"Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges."
|
|
1179
|
+
]
|
|
1180
|
+
},
|
|
1181
|
+
"delivery": {
|
|
1182
|
+
"browserImport": "@kerfjs/ui/toolbar",
|
|
1183
|
+
"manualCssImport": "@kerfjs/ui/toolbar.css",
|
|
1184
|
+
"sideEffects": [
|
|
1185
|
+
"browser-condition-css"
|
|
1186
|
+
]
|
|
1187
|
+
},
|
|
1188
|
+
"wiring": [],
|
|
1189
|
+
"publicClasses": [
|
|
1190
|
+
"kui-toolbar",
|
|
1191
|
+
"kui-toolbar__center",
|
|
1192
|
+
"kui-toolbar__leading",
|
|
1193
|
+
"kui-toolbar__trailing"
|
|
1194
|
+
],
|
|
1195
|
+
"publicTokens": [
|
|
1196
|
+
"--kui-color-border",
|
|
1197
|
+
"--kui-font-sans",
|
|
1198
|
+
"--kui-toolbar-divider-color"
|
|
1199
|
+
],
|
|
1200
|
+
"links": {
|
|
1201
|
+
"catalogRoute": "?component=toolbar",
|
|
636
1202
|
"documentation": "docs/component-selection.md",
|
|
637
1203
|
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
638
1204
|
}
|
|
639
1205
|
},
|
|
640
1206
|
{
|
|
641
|
-
"id": "
|
|
642
|
-
"name": "
|
|
1207
|
+
"id": "toolbar-control-group",
|
|
1208
|
+
"name": "ToolbarControlGroup",
|
|
643
1209
|
"category": "Structure",
|
|
644
1210
|
"kind": "component",
|
|
645
1211
|
"source": "kerf",
|
|
646
|
-
"description": "
|
|
1212
|
+
"description": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
|
|
647
1213
|
"uses": [
|
|
648
1214
|
"lucide-icon",
|
|
649
|
-
"
|
|
650
|
-
"toolbar-control-group"
|
|
1215
|
+
"segmented-control"
|
|
651
1216
|
],
|
|
652
|
-
"purpose": "
|
|
1217
|
+
"purpose": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
|
|
653
1218
|
"publicExports": [
|
|
654
|
-
"
|
|
1219
|
+
"ToolbarControlGroup"
|
|
655
1220
|
],
|
|
656
1221
|
"useWhen": [
|
|
657
|
-
"
|
|
1222
|
+
"Group related controls inside a toolbar with a supported visual treatment.",
|
|
1223
|
+
"Fill it with plain <button> controls (the group styles > button fully); use wa-button only for a Web Awesome feature such as a wa-dropdown popup trigger.",
|
|
1224
|
+
"For an avatar control, set content=avatar and avatarImage instead of inserting an img; one button paints the group and multiple buttons paint only the pressed highlight."
|
|
658
1225
|
],
|
|
659
1226
|
"avoidWhen": [
|
|
660
|
-
"Do not use
|
|
1227
|
+
"Do not use merely to align unrelated buttons or to imitate an exclusive choice.",
|
|
1228
|
+
"Do not reach for wa-button for an ordinary control inside the group — a plain <button> is the default and avoids the Web Awesome dependency."
|
|
661
1229
|
],
|
|
662
1230
|
"alternatives": [
|
|
663
1231
|
{
|
|
664
|
-
"id": "
|
|
1232
|
+
"id": "segmented-control",
|
|
665
1233
|
"relationship": "nearest"
|
|
666
1234
|
},
|
|
667
1235
|
{
|
|
668
|
-
"id": "wa-
|
|
1236
|
+
"id": "wa-button-group",
|
|
669
1237
|
"relationship": "prefer-over"
|
|
670
1238
|
}
|
|
671
1239
|
],
|
|
1240
|
+
"appOwns": [
|
|
1241
|
+
"actions",
|
|
1242
|
+
"pressed state",
|
|
1243
|
+
"expanded state",
|
|
1244
|
+
"avatar image URL"
|
|
1245
|
+
],
|
|
1246
|
+
"variants": [
|
|
1247
|
+
"contained",
|
|
1248
|
+
"borderless",
|
|
1249
|
+
"pressed",
|
|
1250
|
+
"single",
|
|
1251
|
+
"default or compact size",
|
|
1252
|
+
"comfortable or tight density",
|
|
1253
|
+
"icon, text, mixed, or avatar content",
|
|
1254
|
+
"raised, filled, or outline selected chrome",
|
|
1255
|
+
"brand, neutral, or pop selected tone",
|
|
1256
|
+
"nested dropdown trigger",
|
|
1257
|
+
"avatar scrim",
|
|
1258
|
+
"contained avatar background on a single group or selected multi-button highlight"
|
|
1259
|
+
],
|
|
1260
|
+
"accessibility": [
|
|
1261
|
+
"Name the group when its relationship is not evident from context."
|
|
1262
|
+
],
|
|
1263
|
+
"geometry": {
|
|
1264
|
+
"margin": "none",
|
|
1265
|
+
"border": "self",
|
|
1266
|
+
"padding": "self"
|
|
1267
|
+
},
|
|
1268
|
+
"delivery": {
|
|
1269
|
+
"browserImport": "@kerfjs/ui/toolbar-control-group",
|
|
1270
|
+
"manualCssImport": "@kerfjs/ui/toolbar-control-group.css",
|
|
1271
|
+
"sideEffects": [
|
|
1272
|
+
"browser-condition-css"
|
|
1273
|
+
]
|
|
1274
|
+
},
|
|
1275
|
+
"wiring": [],
|
|
1276
|
+
"publicClasses": [
|
|
1277
|
+
"kui-toolbar-control-group"
|
|
1278
|
+
],
|
|
1279
|
+
"publicTokens": [
|
|
1280
|
+
"--kui-color-brand-on-quiet",
|
|
1281
|
+
"--kui-color-pop-border-normal",
|
|
1282
|
+
"--kui-color-pop-fill-normal",
|
|
1283
|
+
"--kui-color-pop-on-normal",
|
|
1284
|
+
"--kui-color-pop-on-quiet",
|
|
1285
|
+
"--kui-color-neutral-border-loud",
|
|
1286
|
+
"--kui-color-neutral-border-normal",
|
|
1287
|
+
"--kui-color-neutral-fill-loud",
|
|
1288
|
+
"--kui-color-neutral-fill-normal",
|
|
1289
|
+
"--kui-color-neutral-on-loud",
|
|
1290
|
+
"--kui-color-neutral-on-quiet",
|
|
1291
|
+
"--kui-color-surface",
|
|
1292
|
+
"--kui-focus-ring",
|
|
1293
|
+
"--kui-shadow-s",
|
|
1294
|
+
"--kui-toolbar-control-background",
|
|
1295
|
+
"--kui-toolbar-control-border",
|
|
1296
|
+
"--kui-toolbar-control-color",
|
|
1297
|
+
"--kui-toolbar-control-dark-border",
|
|
1298
|
+
"--kui-toolbar-control-hover-background",
|
|
1299
|
+
"--kui-toolbar-control-pressed-background",
|
|
1300
|
+
"--kui-toolbar-control-pressed-border",
|
|
1301
|
+
"--kui-toolbar-control-pressed-color",
|
|
1302
|
+
"--kui-toolbar-control-selected-background",
|
|
1303
|
+
"--kui-toolbar-control-selected-color",
|
|
1304
|
+
"--kui-toolbar-control-selected-shadow"
|
|
1305
|
+
],
|
|
1306
|
+
"links": {
|
|
1307
|
+
"catalogRoute": "?component=toolbar-control-group",
|
|
1308
|
+
"documentation": "docs/component-selection.md",
|
|
1309
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1310
|
+
}
|
|
1311
|
+
},
|
|
1312
|
+
{
|
|
1313
|
+
"id": "surface-scaffold",
|
|
1314
|
+
"name": "Surface scaffolds",
|
|
1315
|
+
"category": "Structure",
|
|
1316
|
+
"kind": "component",
|
|
1317
|
+
"source": "kerf",
|
|
1318
|
+
"description": "Typed Web Awesome dialog and popup surface sizing, presentation, and inset composition.",
|
|
1319
|
+
"uses": [
|
|
1320
|
+
"wa-dialog",
|
|
1321
|
+
"wa-dropdown",
|
|
1322
|
+
"wa-dropdown-item"
|
|
1323
|
+
],
|
|
1324
|
+
"purpose": "Configure recurring dialog and popup geometry without consumer ::part() overrides.",
|
|
1325
|
+
"publicExports": [
|
|
1326
|
+
"DialogSurface",
|
|
1327
|
+
"PopupSurface"
|
|
1328
|
+
],
|
|
1329
|
+
"useWhen": [
|
|
1330
|
+
"A Web Awesome dialog or dropdown needs a standard size, presentation, body/footer inset, or list-compatible menu inset.",
|
|
1331
|
+
"A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText."
|
|
1332
|
+
],
|
|
1333
|
+
"avoidWhen": [
|
|
1334
|
+
"Do not use it as a generic layout wrapper or to replace application-owned modal state and focus lifecycle.",
|
|
1335
|
+
"Do not stack a dialog body inset around children that already own List or content-item geometry; use bodyInset none."
|
|
1336
|
+
],
|
|
1337
|
+
"alternatives": [],
|
|
672
1338
|
"appOwns": [
|
|
673
1339
|
"open state",
|
|
674
1340
|
"focus lifecycle",
|
|
675
|
-
"dismissal",
|
|
676
|
-
"
|
|
677
|
-
"
|
|
1341
|
+
"dismissal policy",
|
|
1342
|
+
"content",
|
|
1343
|
+
"outer placement"
|
|
678
1344
|
],
|
|
679
1345
|
"variants": [
|
|
680
|
-
"
|
|
681
|
-
"
|
|
682
|
-
"
|
|
683
|
-
"
|
|
684
|
-
"actionsLabel"
|
|
1346
|
+
"small, medium, or large dialog",
|
|
1347
|
+
"modal, side-sheet, or fullscreen dialog",
|
|
1348
|
+
"none, compact, or comfortable body and footer inset",
|
|
1349
|
+
"standard, compact, or zero-inset popup menu"
|
|
685
1350
|
],
|
|
686
1351
|
"accessibility": [
|
|
687
|
-
"
|
|
688
|
-
"
|
|
1352
|
+
"Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
|
|
1353
|
+
"Use popup surfaces only for real dropdown menus with named triggers."
|
|
689
1354
|
],
|
|
1355
|
+
"geometry": {
|
|
1356
|
+
"margin": "parent",
|
|
1357
|
+
"border": "child",
|
|
1358
|
+
"padding": "self"
|
|
1359
|
+
},
|
|
690
1360
|
"delivery": {
|
|
691
|
-
"browserImport": "@kerfjs/ui/
|
|
692
|
-
"manualCssImport": "@kerfjs/ui/
|
|
1361
|
+
"browserImport": "@kerfjs/ui/surface-scaffold",
|
|
1362
|
+
"manualCssImport": "@kerfjs/ui/surface-scaffold.css",
|
|
693
1363
|
"sideEffects": [
|
|
694
1364
|
"browser-condition-css"
|
|
695
1365
|
]
|
|
696
1366
|
},
|
|
697
1367
|
"wiring": [],
|
|
698
1368
|
"publicClasses": [
|
|
699
|
-
"kui-dialog-
|
|
700
|
-
"kui-
|
|
701
|
-
"kui-dialog-header__copy",
|
|
702
|
-
"kui-dialog-header__icon",
|
|
703
|
-
"kui-dialog-header__identity",
|
|
704
|
-
"kui-dialog-header__summary",
|
|
705
|
-
"kui-dialog-header__toolbar"
|
|
1369
|
+
"kui-dialog-surface",
|
|
1370
|
+
"kui-popup-surface"
|
|
706
1371
|
],
|
|
707
1372
|
"publicTokens": [
|
|
708
|
-
"--kui-
|
|
709
|
-
"--kui-
|
|
710
|
-
"--kui-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
"
|
|
714
|
-
"
|
|
715
|
-
"
|
|
716
|
-
|
|
1373
|
+
"--kui-radius-l",
|
|
1374
|
+
"--kui-wa-container-inset",
|
|
1375
|
+
"--kui-wa-surface-inset"
|
|
1376
|
+
],
|
|
1377
|
+
"links": {
|
|
1378
|
+
"catalogRoute": "?component=surface-scaffold",
|
|
1379
|
+
"documentation": "docs/surface-scaffold.md",
|
|
1380
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1381
|
+
}
|
|
1382
|
+
},
|
|
1383
|
+
{
|
|
1384
|
+
"id": "floating-toolbar",
|
|
1385
|
+
"name": "FloatingToolbar",
|
|
1386
|
+
"category": "Structure",
|
|
1387
|
+
"kind": "component",
|
|
1388
|
+
"source": "kerf",
|
|
1389
|
+
"description": "A transparent, forced-dark toolbar that floats over its container's content.",
|
|
1390
|
+
"uses": [],
|
|
1391
|
+
"purpose": "A transparent, forced-dark toolbar that floats over its container's content.",
|
|
1392
|
+
"publicExports": [
|
|
1393
|
+
"FloatingToolbar"
|
|
1394
|
+
],
|
|
1395
|
+
"useWhen": [
|
|
1396
|
+
"Float a small cluster of controls (e.g. a drawer restore) over scrolling content without covering dialogs."
|
|
1397
|
+
],
|
|
1398
|
+
"avoidWhen": [
|
|
1399
|
+
"Do not use for a primary page or panel toolbar, or for anything that must sit above overlays (it is not top-layer)."
|
|
1400
|
+
],
|
|
1401
|
+
"alternatives": [
|
|
1402
|
+
{
|
|
1403
|
+
"id": "toolbar",
|
|
1404
|
+
"relationship": "nearest"
|
|
1405
|
+
}
|
|
1406
|
+
],
|
|
1407
|
+
"appOwns": [
|
|
1408
|
+
"controls",
|
|
1409
|
+
"position",
|
|
1410
|
+
"visibility"
|
|
1411
|
+
],
|
|
1412
|
+
"variants": [
|
|
1413
|
+
"bottom-end",
|
|
1414
|
+
"bottom-start",
|
|
1415
|
+
"bottom",
|
|
1416
|
+
"top-end",
|
|
1417
|
+
"top-start",
|
|
1418
|
+
"top"
|
|
1419
|
+
],
|
|
1420
|
+
"accessibility": [
|
|
1421
|
+
"Give the toolbar an accessible name (label is required — it exposes role=\"toolbar\")."
|
|
1422
|
+
],
|
|
1423
|
+
"geometry": {
|
|
1424
|
+
"margin": "none",
|
|
1425
|
+
"border": "child",
|
|
1426
|
+
"padding": "child"
|
|
1427
|
+
},
|
|
1428
|
+
"delivery": {
|
|
1429
|
+
"browserImport": "@kerfjs/ui/floating-toolbar",
|
|
1430
|
+
"manualCssImport": "@kerfjs/ui/floating-toolbar.css",
|
|
1431
|
+
"sideEffects": [
|
|
1432
|
+
"browser-condition-css"
|
|
1433
|
+
]
|
|
1434
|
+
},
|
|
1435
|
+
"wiring": [],
|
|
1436
|
+
"publicClasses": [
|
|
1437
|
+
"kui-floating-toolbar"
|
|
1438
|
+
],
|
|
1439
|
+
"publicTokens": [
|
|
1440
|
+
"--kui-floating-toolbar-inset",
|
|
1441
|
+
"--kui-space-m",
|
|
1442
|
+
"--kui-space-xs"
|
|
1443
|
+
],
|
|
1444
|
+
"links": {
|
|
1445
|
+
"catalogRoute": "?component=floating-toolbar",
|
|
1446
|
+
"documentation": "docs/component-selection.md",
|
|
1447
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1448
|
+
}
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
"id": "toolbar-text",
|
|
1452
|
+
"name": "ToolbarText",
|
|
1453
|
+
"category": "Structure",
|
|
1454
|
+
"kind": "component",
|
|
1455
|
+
"source": "kerf",
|
|
1456
|
+
"description": "Large, default, and compact toolbar identity text.",
|
|
1457
|
+
"uses": [],
|
|
1458
|
+
"purpose": "Large, default, and compact toolbar identity text.",
|
|
1459
|
+
"publicExports": [
|
|
1460
|
+
"ToolbarText"
|
|
1461
|
+
],
|
|
1462
|
+
"useWhen": [
|
|
1463
|
+
"Render toolbar identity or heading text at a supported hierarchy size; pass headingLevel for heading semantics."
|
|
1464
|
+
],
|
|
1465
|
+
"avoidWhen": [
|
|
1466
|
+
"Do not omit headingLevel when the text is the page or section heading."
|
|
1467
|
+
],
|
|
1468
|
+
"alternatives": [],
|
|
1469
|
+
"appOwns": [
|
|
1470
|
+
"text",
|
|
1471
|
+
"responsive priority"
|
|
1472
|
+
],
|
|
1473
|
+
"variants": [
|
|
1474
|
+
"large",
|
|
1475
|
+
"default",
|
|
1476
|
+
"small",
|
|
1477
|
+
"placeholder (loading)"
|
|
1478
|
+
],
|
|
1479
|
+
"accessibility": [
|
|
1480
|
+
"Plain text is not a heading; pass headingLevel to expose role=heading + aria-level for a page/section title."
|
|
1481
|
+
],
|
|
1482
|
+
"geometry": {
|
|
1483
|
+
"margin": "none",
|
|
1484
|
+
"border": "none",
|
|
1485
|
+
"padding": "none"
|
|
1486
|
+
},
|
|
1487
|
+
"delivery": {
|
|
1488
|
+
"browserImport": "@kerfjs/ui/toolbar-text",
|
|
1489
|
+
"manualCssImport": "@kerfjs/ui/toolbar-text.css",
|
|
1490
|
+
"sideEffects": [
|
|
1491
|
+
"browser-condition-css"
|
|
1492
|
+
]
|
|
1493
|
+
},
|
|
1494
|
+
"wiring": [],
|
|
1495
|
+
"publicClasses": [
|
|
1496
|
+
"kui-toolbar-text"
|
|
1497
|
+
],
|
|
1498
|
+
"publicTokens": [
|
|
1499
|
+
"--kui-color-neutral-on-quiet",
|
|
1500
|
+
"--kui-font-m",
|
|
1501
|
+
"--kui-font-mono",
|
|
1502
|
+
"--kui-font-s",
|
|
1503
|
+
"--kui-font-xs"
|
|
1504
|
+
],
|
|
1505
|
+
"links": {
|
|
1506
|
+
"catalogRoute": "?component=toolbar-text",
|
|
1507
|
+
"documentation": "docs/component-selection.md",
|
|
1508
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"id": "headers",
|
|
1513
|
+
"name": "Header composition",
|
|
1514
|
+
"category": "Structure",
|
|
1515
|
+
"kind": "composition",
|
|
1516
|
+
"source": "kerf",
|
|
1517
|
+
"description": "Page, dialog, and definition-list hierarchy.",
|
|
1518
|
+
"uses": [
|
|
1519
|
+
"toolbar",
|
|
1520
|
+
"toolbar-control-group",
|
|
1521
|
+
"toolbar-text",
|
|
1522
|
+
"value-table"
|
|
1523
|
+
],
|
|
1524
|
+
"purpose": "Page, dialog, and definition-list hierarchy.",
|
|
1525
|
+
"publicExports": [],
|
|
1526
|
+
"useWhen": [
|
|
1527
|
+
"Compose page, dialog, and definition-list hierarchy from their distinct primitives."
|
|
1528
|
+
],
|
|
1529
|
+
"avoidWhen": [
|
|
1530
|
+
"Do not reuse one header primitive only because its typography looks similar."
|
|
1531
|
+
],
|
|
1532
|
+
"alternatives": [],
|
|
1533
|
+
"appOwns": [
|
|
1534
|
+
"scope hierarchy",
|
|
1535
|
+
"copy",
|
|
1536
|
+
"actions"
|
|
1537
|
+
],
|
|
1538
|
+
"variants": [
|
|
1539
|
+
"page",
|
|
1540
|
+
"dialog",
|
|
1541
|
+
"key/value"
|
|
1542
|
+
],
|
|
1543
|
+
"accessibility": [
|
|
1544
|
+
"Preserve heading and description relationships for the containing surface."
|
|
717
1545
|
],
|
|
1546
|
+
"geometry": {
|
|
1547
|
+
"margin": "child",
|
|
1548
|
+
"border": "child",
|
|
1549
|
+
"padding": "child"
|
|
1550
|
+
},
|
|
1551
|
+
"delivery": {
|
|
1552
|
+
"sideEffects": [
|
|
1553
|
+
"css"
|
|
1554
|
+
]
|
|
1555
|
+
},
|
|
1556
|
+
"wiring": [],
|
|
1557
|
+
"publicClasses": [],
|
|
1558
|
+
"publicTokens": [],
|
|
718
1559
|
"links": {
|
|
719
|
-
"catalogRoute": "?component=
|
|
1560
|
+
"catalogRoute": "?component=headers",
|
|
720
1561
|
"documentation": "docs/component-selection.md",
|
|
721
1562
|
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
722
1563
|
}
|
|
@@ -750,11 +1591,17 @@
|
|
|
750
1591
|
],
|
|
751
1592
|
"variants": [
|
|
752
1593
|
"icon rows",
|
|
753
|
-
"iconless rows"
|
|
1594
|
+
"iconless rows",
|
|
1595
|
+
"placeholder (loading)"
|
|
754
1596
|
],
|
|
755
1597
|
"accessibility": [
|
|
756
1598
|
"Name ValueTable with its label; ValueTableRow supplies dt/dd semantics, and row icons stay decorative unless meaning requires an accessible label."
|
|
757
1599
|
],
|
|
1600
|
+
"geometry": {
|
|
1601
|
+
"margin": "self",
|
|
1602
|
+
"border": "self",
|
|
1603
|
+
"padding": "self"
|
|
1604
|
+
},
|
|
758
1605
|
"delivery": {
|
|
759
1606
|
"browserImport": "@kerfjs/ui/value-table",
|
|
760
1607
|
"manualCssImport": "@kerfjs/ui/value-table.css",
|
|
@@ -790,81 +1637,128 @@
|
|
|
790
1637
|
}
|
|
791
1638
|
},
|
|
792
1639
|
{
|
|
793
|
-
"id": "
|
|
794
|
-
"name": "
|
|
1640
|
+
"id": "list",
|
|
1641
|
+
"name": "List",
|
|
795
1642
|
"category": "Navigation",
|
|
796
|
-
"kind": "
|
|
1643
|
+
"kind": "component",
|
|
797
1644
|
"source": "kerf",
|
|
798
|
-
"description": "
|
|
1645
|
+
"description": "A stretch-aligned vertical stack with optional typed token/length gap, flex growth, vertical scrolling, and independently selectable divider edges.",
|
|
799
1646
|
"uses": [
|
|
800
|
-
"
|
|
801
|
-
"
|
|
802
|
-
"
|
|
1647
|
+
"list-header",
|
|
1648
|
+
"list-action-row",
|
|
1649
|
+
"list-item"
|
|
1650
|
+
],
|
|
1651
|
+
"purpose": "Standardize vertical component layout and its scroll/divider ownership instead of repeating ad-hoc flex-column wrappers.",
|
|
1652
|
+
"publicExports": [
|
|
1653
|
+
"List",
|
|
1654
|
+
"px",
|
|
1655
|
+
"rem",
|
|
1656
|
+
"em",
|
|
1657
|
+
"pct",
|
|
1658
|
+
"space",
|
|
1659
|
+
"lengthVar",
|
|
1660
|
+
"plus",
|
|
1661
|
+
"calc",
|
|
1662
|
+
"flex"
|
|
1663
|
+
],
|
|
1664
|
+
"cssValueProps": [
|
|
1665
|
+
{
|
|
1666
|
+
"path": "gap",
|
|
1667
|
+
"grammar": "length",
|
|
1668
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
1669
|
+
"nonStandaloneHelpers": ["plus"],
|
|
1670
|
+
"shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
|
|
1671
|
+
"canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
|
|
1672
|
+
"exceptionalShorthands": ["s", "xl"],
|
|
1673
|
+
"rawPolicy": "forbid",
|
|
1674
|
+
"examples": ["gap=\"xs\"", "gap={rem(0.25)}", "gap={calc(plus(rem(0.25), pct(10)))}"]
|
|
1675
|
+
},
|
|
1676
|
+
{
|
|
1677
|
+
"path": "flex",
|
|
1678
|
+
"grammar": "flex",
|
|
1679
|
+
"helpers": ["flex"],
|
|
1680
|
+
"shorthands": ["none", "auto", "initial"],
|
|
1681
|
+
"canonicalShorthands": ["none", "auto", "initial"],
|
|
1682
|
+
"exceptionalShorthands": [],
|
|
1683
|
+
"rawPolicy": "forbid",
|
|
1684
|
+
"examples": ["flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
|
|
1685
|
+
}
|
|
803
1686
|
],
|
|
804
|
-
"purpose": "Compose navigation with the same pane, content stack, item, and toolbar geometry used throughout the application, including a controlled MenuHeader disclosure only when it reveals real content.",
|
|
805
|
-
"publicExports": [],
|
|
806
1687
|
"useWhen": [
|
|
807
|
-
"
|
|
1688
|
+
"Arrange component rows or sections in a vertical stretch-aligned stack.",
|
|
1689
|
+
"Let one bounded list own vertical scrolling, flex growth, or one or more physical-edge dividers.",
|
|
1690
|
+
"Choose a finite gap shorthand such as xs or m, or compose a typed length with @kerfjs/ui/css-values when the spacing scale is insufficient.",
|
|
1691
|
+
"Use a finite flex keyword or the flex() builder when List participates in flexible layout."
|
|
808
1692
|
],
|
|
809
1693
|
"avoidWhen": [
|
|
810
|
-
"Do not
|
|
811
|
-
"Do not
|
|
1694
|
+
"Do not use List as semantic list markup; use ul/ol when list semantics are required and apply layout deliberately.",
|
|
1695
|
+
"Do not create nested scroll owners or use divider sides as a substitute for meaningful grouping.",
|
|
1696
|
+
"Do not pass raw CSS strings to gap or flex, mix their distinct grammars, or use the off-rhythm s/xl spacing steps without a deliberate exception."
|
|
812
1697
|
],
|
|
813
1698
|
"alternatives": [],
|
|
814
1699
|
"appOwns": [
|
|
815
|
-
"
|
|
816
|
-
"
|
|
817
|
-
"
|
|
1700
|
+
"child semantics and content",
|
|
1701
|
+
"the bounded height needed for scrolling",
|
|
1702
|
+
"typed gap, flex, and divider choices"
|
|
818
1703
|
],
|
|
819
1704
|
"variants": [
|
|
820
|
-
"
|
|
821
|
-
"
|
|
822
|
-
"
|
|
823
|
-
"
|
|
824
|
-
"
|
|
1705
|
+
"no gap",
|
|
1706
|
+
"standard boolean gap",
|
|
1707
|
+
"named none/2xs/xs/s/m/l/xl token gap",
|
|
1708
|
+
"typed CssLength gap",
|
|
1709
|
+
"boolean, finite-keyword, or typed CssFlex flex",
|
|
1710
|
+
"scrollable",
|
|
1711
|
+
"top/right/bottom/left divider combinations"
|
|
825
1712
|
],
|
|
826
1713
|
"accessibility": [
|
|
827
|
-
"
|
|
828
|
-
"
|
|
829
|
-
],
|
|
1714
|
+
"List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
|
|
1715
|
+
"Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
|
|
1716
|
+
],
|
|
1717
|
+
"geometry": {
|
|
1718
|
+
"margin": "none",
|
|
1719
|
+
"border": "conditional",
|
|
1720
|
+
"padding": "none",
|
|
1721
|
+
"notes": [
|
|
1722
|
+
"List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
|
|
1723
|
+
]
|
|
1724
|
+
},
|
|
830
1725
|
"delivery": {
|
|
831
|
-
"
|
|
1726
|
+
"browserImport": "@kerfjs/ui/list",
|
|
1727
|
+
"manualCssImport": "@kerfjs/ui/list.css",
|
|
832
1728
|
"sideEffects": [
|
|
833
|
-
"css"
|
|
1729
|
+
"browser-condition-css"
|
|
834
1730
|
]
|
|
835
1731
|
},
|
|
836
1732
|
"wiring": [],
|
|
837
1733
|
"publicClasses": [
|
|
838
|
-
"kui-
|
|
839
|
-
"kui-content-item",
|
|
840
|
-
"kui-pane"
|
|
1734
|
+
"kui-list"
|
|
841
1735
|
],
|
|
842
1736
|
"publicTokens": [
|
|
843
|
-
"--kui-
|
|
844
|
-
"--kui-layout-
|
|
845
|
-
"--kui-
|
|
846
|
-
"--kui-
|
|
1737
|
+
"--kui-color-border",
|
|
1738
|
+
"--kui-layout-item-gap",
|
|
1739
|
+
"--kui-list-divider-color",
|
|
1740
|
+
"--kui-list-gap"
|
|
847
1741
|
],
|
|
848
1742
|
"links": {
|
|
849
|
-
"catalogRoute": "?component=
|
|
1743
|
+
"catalogRoute": "?component=list",
|
|
850
1744
|
"documentation": "docs/component-selection.md",
|
|
851
1745
|
"recipe": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap"
|
|
852
1746
|
}
|
|
853
1747
|
},
|
|
854
1748
|
{
|
|
855
|
-
"id": "
|
|
856
|
-
"name": "
|
|
1749
|
+
"id": "list-header",
|
|
1750
|
+
"name": "ListHeader",
|
|
857
1751
|
"category": "Navigation",
|
|
858
1752
|
"kind": "component",
|
|
859
1753
|
"source": "kerf",
|
|
860
|
-
"description": "
|
|
1754
|
+
"description": "Configurable section headings with semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
|
|
861
1755
|
"uses": [
|
|
862
1756
|
"lucide-icon",
|
|
863
1757
|
"disclosure-arrow"
|
|
864
1758
|
],
|
|
865
1759
|
"purpose": "Fill the available section width while splitting a dormant title and mutually exclusive semantic count or legacy badge from an optional logical-end 44px action with an 18px visual, or render that title cluster as a disclosure button with a default production DisclosureArrow.",
|
|
866
1760
|
"publicExports": [
|
|
867
|
-
"
|
|
1761
|
+
"ListHeader"
|
|
868
1762
|
],
|
|
869
1763
|
"useWhen": [
|
|
870
1764
|
"Label a navigation section with an optional semantic count, non-count badge, action, or disclosure state; toggle mode supplies an 18px DisclosureArrow unless actionIcon replaces it."
|
|
@@ -875,11 +1769,7 @@
|
|
|
875
1769
|
],
|
|
876
1770
|
"alternatives": [
|
|
877
1771
|
{
|
|
878
|
-
"id": "
|
|
879
|
-
"relationship": "nearest"
|
|
880
|
-
},
|
|
881
|
-
{
|
|
882
|
-
"id": "dialog-header",
|
|
1772
|
+
"id": "toolbar",
|
|
883
1773
|
"relationship": "nearest"
|
|
884
1774
|
}
|
|
885
1775
|
],
|
|
@@ -897,29 +1787,38 @@
|
|
|
897
1787
|
"count",
|
|
898
1788
|
"badge",
|
|
899
1789
|
"action",
|
|
900
|
-
"toggle"
|
|
1790
|
+
"toggle",
|
|
1791
|
+
"placeholder (loading)",
|
|
1792
|
+
"compact density",
|
|
1793
|
+
"neutral, accent, pop, or danger indicator tone",
|
|
1794
|
+
"before, after, or paired group divider"
|
|
901
1795
|
],
|
|
902
1796
|
"accessibility": [
|
|
903
1797
|
"A valid count is hidden as duplicate visual text and its required localized countLabel joins the owned heading or disclosure-button accessible name; zero remains visible.",
|
|
904
1798
|
"The application controls and updates disclosure state and the revealed content; the default DisclosureArrow mirrors expanded while the button name stays stable. triggerAttributes can describe the controlled relationship but cannot replace the owned accessible name or expanded state."
|
|
905
1799
|
],
|
|
1800
|
+
"geometry": {
|
|
1801
|
+
"margin": "self",
|
|
1802
|
+
"border": "self",
|
|
1803
|
+
"padding": "self"
|
|
1804
|
+
},
|
|
906
1805
|
"delivery": {
|
|
907
|
-
"browserImport": "@kerfjs/ui/
|
|
908
|
-
"manualCssImport": "@kerfjs/ui/
|
|
1806
|
+
"browserImport": "@kerfjs/ui/list-header",
|
|
1807
|
+
"manualCssImport": "@kerfjs/ui/list-header.css",
|
|
909
1808
|
"sideEffects": [
|
|
910
1809
|
"browser-condition-css"
|
|
911
1810
|
]
|
|
912
1811
|
},
|
|
913
1812
|
"wiring": [],
|
|
914
1813
|
"publicClasses": [
|
|
915
|
-
"kui-
|
|
916
|
-
"kui-
|
|
917
|
-
"kui-
|
|
918
|
-
"kui-
|
|
919
|
-
"kui-
|
|
920
|
-
"kui-
|
|
921
|
-
"kui-
|
|
922
|
-
"kui-
|
|
1814
|
+
"kui-list-header",
|
|
1815
|
+
"kui-list-header__action",
|
|
1816
|
+
"kui-list-header__action-layer",
|
|
1817
|
+
"kui-list-header__badge",
|
|
1818
|
+
"kui-list-header__count",
|
|
1819
|
+
"kui-list-header__label",
|
|
1820
|
+
"kui-list-header__title",
|
|
1821
|
+
"kui-list-header__toggle"
|
|
923
1822
|
],
|
|
924
1823
|
"publicTokens": [
|
|
925
1824
|
"--kui-color-neutral-border-quiet",
|
|
@@ -927,44 +1826,64 @@
|
|
|
927
1826
|
"--kui-color-neutral-on-quiet",
|
|
928
1827
|
"--kui-focus-ring",
|
|
929
1828
|
"--kui-font-xs",
|
|
930
|
-
"--kui-
|
|
931
|
-
"--kui-
|
|
1829
|
+
"--kui-list-header-action-icon-size",
|
|
1830
|
+
"--kui-list-header-color",
|
|
932
1831
|
"--kui-layout-inline-margin",
|
|
933
1832
|
"--kui-layout-item-gap",
|
|
934
1833
|
"--kui-layout-item-padding",
|
|
935
1834
|
"--kui-layout-pill-radius",
|
|
936
|
-
"--kui-
|
|
937
|
-
"--kui-
|
|
1835
|
+
"--kui-list-header-count-font-size",
|
|
1836
|
+
"--kui-list-header-hover-background",
|
|
1837
|
+
"--kui-list-group-divider-color",
|
|
1838
|
+
"--kui-color-brand-on-normal",
|
|
1839
|
+
"--kui-color-pop-fill-normal",
|
|
1840
|
+
"--kui-color-pop-on-normal",
|
|
1841
|
+
"--kui-color-danger-fill-normal",
|
|
1842
|
+
"--kui-color-danger-on-normal"
|
|
938
1843
|
],
|
|
939
1844
|
"links": {
|
|
940
|
-
"catalogRoute": "?component=
|
|
1845
|
+
"catalogRoute": "?component=list-header",
|
|
941
1846
|
"documentation": "docs/component-selection.md",
|
|
942
1847
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
943
1848
|
}
|
|
944
1849
|
},
|
|
945
1850
|
{
|
|
946
|
-
"id": "
|
|
947
|
-
"name": "
|
|
1851
|
+
"id": "list-action-row",
|
|
1852
|
+
"name": "ListActionRow",
|
|
948
1853
|
"category": "Navigation",
|
|
949
1854
|
"kind": "component",
|
|
950
1855
|
"source": "kerf",
|
|
951
|
-
"description": "
|
|
1856
|
+
"description": "Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and sibling primary/trailing native-button actions.",
|
|
952
1857
|
"uses": [
|
|
953
|
-
"lucide-icon"
|
|
1858
|
+
"lucide-icon",
|
|
1859
|
+
"loading-spinner"
|
|
954
1860
|
],
|
|
955
1861
|
"purpose": "Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.",
|
|
956
1862
|
"publicExports": [
|
|
957
|
-
"
|
|
1863
|
+
"ListActionRow"
|
|
1864
|
+
],
|
|
1865
|
+
"cssValueProps": [
|
|
1866
|
+
{
|
|
1867
|
+
"path": "style",
|
|
1868
|
+
"grammar": "declarations",
|
|
1869
|
+
"helpers": [],
|
|
1870
|
+
"shorthands": [],
|
|
1871
|
+
"canonicalShorthands": [],
|
|
1872
|
+
"exceptionalShorthands": [],
|
|
1873
|
+
"rawPolicy": "forbid",
|
|
1874
|
+
"examples": ["className=\"app-row\""]
|
|
1875
|
+
}
|
|
958
1876
|
],
|
|
959
1877
|
"useWhen": [
|
|
960
1878
|
"A navigation or item row needs both a primary selectable action and an independently focusable trailing action."
|
|
961
1879
|
],
|
|
962
1880
|
"avoidWhen": [
|
|
963
|
-
"Use
|
|
1881
|
+
"Use ListItem when trailing content is dormant metadata; use AppTab only for tablist semantics and ToolbarControlGroup only for toolbar controls.",
|
|
1882
|
+
"Do not inject declaration strings; use className, public tokens, and cataloged component props for application styling."
|
|
964
1883
|
],
|
|
965
1884
|
"alternatives": [
|
|
966
1885
|
{
|
|
967
|
-
"id": "
|
|
1886
|
+
"id": "list-item",
|
|
968
1887
|
"relationship": "nearest",
|
|
969
1888
|
"when": "Trailing content is noninteractive."
|
|
970
1889
|
},
|
|
@@ -986,80 +1905,111 @@
|
|
|
986
1905
|
"pressed",
|
|
987
1906
|
"disabled primary",
|
|
988
1907
|
"disabled trailing action",
|
|
989
|
-
"multiline"
|
|
1908
|
+
"multiline",
|
|
1909
|
+
"placeholder (loading)",
|
|
1910
|
+
"compact density",
|
|
1911
|
+
"description and status",
|
|
1912
|
+
"busy while retaining content",
|
|
1913
|
+
"interaction-revealed trailing action",
|
|
1914
|
+
"before, after, or paired group divider"
|
|
990
1915
|
],
|
|
991
1916
|
"accessibility": [
|
|
992
1917
|
"The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.",
|
|
993
|
-
"Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in
|
|
1918
|
+
"Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in ListItem.trailing."
|
|
994
1919
|
],
|
|
1920
|
+
"geometry": {
|
|
1921
|
+
"margin": "self",
|
|
1922
|
+
"border": "self",
|
|
1923
|
+
"padding": "self"
|
|
1924
|
+
},
|
|
995
1925
|
"delivery": {
|
|
996
|
-
"browserImport": "@kerfjs/ui/
|
|
997
|
-
"manualCssImport": "@kerfjs/ui/
|
|
1926
|
+
"browserImport": "@kerfjs/ui/list-action-row",
|
|
1927
|
+
"manualCssImport": "@kerfjs/ui/list-action-row.css",
|
|
998
1928
|
"sideEffects": [
|
|
999
1929
|
"browser-condition-css"
|
|
1000
1930
|
]
|
|
1001
1931
|
},
|
|
1002
1932
|
"wiring": [],
|
|
1003
1933
|
"publicClasses": [
|
|
1004
|
-
"kui-
|
|
1005
|
-
"kui-
|
|
1006
|
-
"kui-
|
|
1007
|
-
"kui-
|
|
1008
|
-
"kui-
|
|
1934
|
+
"kui-list-action-row",
|
|
1935
|
+
"kui-list-action-row__icon",
|
|
1936
|
+
"kui-list-action-row__label",
|
|
1937
|
+
"kui-list-action-row__primary-label",
|
|
1938
|
+
"kui-list-action-row__description",
|
|
1939
|
+
"kui-list-action-row__status",
|
|
1940
|
+
"kui-list-action-row__primary",
|
|
1941
|
+
"kui-list-action-row__trailing-action"
|
|
1009
1942
|
],
|
|
1010
1943
|
"publicTokens": [
|
|
1011
1944
|
"--kui-color-brand-border-quiet",
|
|
1012
1945
|
"--kui-color-brand-fill-normal",
|
|
1013
|
-
"--kui-color-brand-on-quiet",
|
|
1014
1946
|
"--kui-color-neutral-border-normal",
|
|
1015
1947
|
"--kui-color-neutral-fill-normal",
|
|
1016
1948
|
"--kui-color-neutral-fill-quiet",
|
|
1017
1949
|
"--kui-color-neutral-on-normal",
|
|
1950
|
+
"--kui-color-neutral-on-quiet",
|
|
1951
|
+
"--kui-color-neutral-border-quiet",
|
|
1018
1952
|
"--kui-focus-ring",
|
|
1019
1953
|
"--kui-layout-inline-margin",
|
|
1020
1954
|
"--kui-layout-item-gap",
|
|
1021
1955
|
"--kui-layout-item-padding",
|
|
1022
1956
|
"--kui-layout-rounded-radius",
|
|
1023
1957
|
"--kui-radius-pill",
|
|
1024
|
-
"--kui-
|
|
1025
|
-
"--kui-
|
|
1026
|
-
"--kui-
|
|
1027
|
-
"--kui-
|
|
1028
|
-
"--kui-
|
|
1029
|
-
"--kui-
|
|
1030
|
-
"--kui-
|
|
1031
|
-
"--kui-
|
|
1032
|
-
"--kui-
|
|
1958
|
+
"--kui-list-action-row-background",
|
|
1959
|
+
"--kui-list-action-row-border",
|
|
1960
|
+
"--kui-list-action-row-color",
|
|
1961
|
+
"--kui-list-action-row-hover-background",
|
|
1962
|
+
"--kui-list-action-row-hover-border",
|
|
1963
|
+
"--kui-list-action-row-selected-background",
|
|
1964
|
+
"--kui-list-action-row-selected-border",
|
|
1965
|
+
"--kui-list-action-row-selected-color",
|
|
1966
|
+
"--kui-list-action-row-trailing-hover-background",
|
|
1967
|
+
"--kui-list-group-divider-color",
|
|
1968
|
+
"--kui-font-xs"
|
|
1033
1969
|
],
|
|
1034
1970
|
"links": {
|
|
1035
|
-
"catalogRoute": "?component=
|
|
1971
|
+
"catalogRoute": "?component=list-action-row",
|
|
1036
1972
|
"documentation": "docs/component-selection.md",
|
|
1037
1973
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1038
1974
|
}
|
|
1039
1975
|
},
|
|
1040
1976
|
{
|
|
1041
|
-
"id": "
|
|
1042
|
-
"name": "
|
|
1977
|
+
"id": "list-item",
|
|
1978
|
+
"name": "ListItem",
|
|
1043
1979
|
"category": "Navigation",
|
|
1044
1980
|
"kind": "component",
|
|
1045
1981
|
"source": "kerf",
|
|
1046
|
-
"description": "
|
|
1982
|
+
"description": "Configurable native-button navigation rows with structured labels, status/busy metadata, density, group dividers, protected domain metadata hooks, and rounded-boundary overflow clipping.",
|
|
1047
1983
|
"uses": [
|
|
1048
|
-
"lucide-icon"
|
|
1984
|
+
"lucide-icon",
|
|
1985
|
+
"loading-spinner"
|
|
1049
1986
|
],
|
|
1050
1987
|
"purpose": "Selectable, disabled, trailing, and multiline navigation rows.",
|
|
1051
1988
|
"publicExports": [
|
|
1052
|
-
"
|
|
1989
|
+
"ListItem"
|
|
1990
|
+
],
|
|
1991
|
+
"cssValueProps": [
|
|
1992
|
+
{
|
|
1993
|
+
"path": "style",
|
|
1994
|
+
"grammar": "declarations",
|
|
1995
|
+
"helpers": [],
|
|
1996
|
+
"shorthands": [],
|
|
1997
|
+
"canonicalShorthands": [],
|
|
1998
|
+
"exceptionalShorthands": [],
|
|
1999
|
+
"rawPolicy": "forbid",
|
|
2000
|
+
"examples": ["className=\"app-row\""]
|
|
2001
|
+
}
|
|
1053
2002
|
],
|
|
1054
2003
|
"useWhen": [
|
|
1055
|
-
"Render a selectable, disabled, trailing, or multiline sidebar/navigation action row."
|
|
2004
|
+
"Render a selectable, disabled, trailing, or multiline sidebar/navigation action row whose descendants must remain clipped to the rounded row boundary."
|
|
1056
2005
|
],
|
|
1057
2006
|
"avoidWhen": [
|
|
1058
|
-
"Do not use for an ordinary inline link, form button, isolated ARIA menuitem, or an interactive trailing action; use
|
|
2007
|
+
"Do not use for an ordinary inline link, form button, isolated ARIA menuitem, or an interactive trailing action; use ListActionRow for sibling row actions.",
|
|
2008
|
+
"Do not inject declaration strings; use className, public tokens, and cataloged component props for application styling."
|
|
1059
2009
|
],
|
|
1060
2010
|
"alternatives": [
|
|
1061
2011
|
{
|
|
1062
|
-
"id": "
|
|
2012
|
+
"id": "list-action-row",
|
|
1063
2013
|
"relationship": "nearest",
|
|
1064
2014
|
"when": "The trailing region must be independently interactive."
|
|
1065
2015
|
}
|
|
@@ -1076,58 +2026,237 @@
|
|
|
1076
2026
|
"pressed",
|
|
1077
2027
|
"disabled",
|
|
1078
2028
|
"trailing",
|
|
1079
|
-
"multiline"
|
|
2029
|
+
"multiline",
|
|
2030
|
+
"placeholder (loading)",
|
|
2031
|
+
"compact density",
|
|
2032
|
+
"description and status",
|
|
2033
|
+
"busy while retaining content",
|
|
2034
|
+
"before, after, or paired group divider"
|
|
1080
2035
|
],
|
|
1081
2036
|
"accessibility": [
|
|
1082
2037
|
"Uses native button activation; selected maps to aria-current and pressed to aria-pressed; rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls."
|
|
1083
2038
|
],
|
|
2039
|
+
"geometry": {
|
|
2040
|
+
"margin": "self",
|
|
2041
|
+
"border": "self",
|
|
2042
|
+
"padding": "self"
|
|
2043
|
+
},
|
|
1084
2044
|
"delivery": {
|
|
1085
|
-
"browserImport": "@kerfjs/ui/
|
|
1086
|
-
"manualCssImport": "@kerfjs/ui/
|
|
2045
|
+
"browserImport": "@kerfjs/ui/list-item",
|
|
2046
|
+
"manualCssImport": "@kerfjs/ui/list-item.css",
|
|
1087
2047
|
"sideEffects": [
|
|
1088
2048
|
"browser-condition-css"
|
|
1089
2049
|
]
|
|
1090
2050
|
},
|
|
1091
2051
|
"wiring": [],
|
|
1092
2052
|
"publicClasses": [
|
|
1093
|
-
"kui-
|
|
1094
|
-
"kui-
|
|
1095
|
-
"kui-
|
|
1096
|
-
"kui-
|
|
2053
|
+
"kui-list-item",
|
|
2054
|
+
"kui-list-item__icon",
|
|
2055
|
+
"kui-list-item__label",
|
|
2056
|
+
"kui-list-item__primary-label",
|
|
2057
|
+
"kui-list-item__description",
|
|
2058
|
+
"kui-list-item__status",
|
|
2059
|
+
"kui-list-item__trailing"
|
|
1097
2060
|
],
|
|
1098
2061
|
"publicTokens": [
|
|
1099
2062
|
"--kui-color-brand-fill-normal",
|
|
1100
|
-
"--kui-color-brand-on-quiet",
|
|
1101
2063
|
"--kui-color-neutral-fill-quiet",
|
|
1102
2064
|
"--kui-color-neutral-on-normal",
|
|
1103
2065
|
"--kui-color-neutral-on-quiet",
|
|
2066
|
+
"--kui-color-neutral-border-quiet",
|
|
1104
2067
|
"--kui-focus-ring",
|
|
1105
|
-
"--kui-
|
|
1106
|
-
"--kui-
|
|
1107
|
-
"--kui-
|
|
1108
|
-
"--kui-
|
|
2068
|
+
"--kui-list-item-color",
|
|
2069
|
+
"--kui-list-item-hover-background",
|
|
2070
|
+
"--kui-list-item-selected-background",
|
|
2071
|
+
"--kui-list-item-selected-color",
|
|
2072
|
+
"--kui-list-group-divider-color",
|
|
2073
|
+
"--kui-font-xs",
|
|
1109
2074
|
"--kui-layout-inline-margin",
|
|
1110
2075
|
"--kui-layout-item-gap",
|
|
1111
2076
|
"--kui-layout-item-padding",
|
|
1112
2077
|
"--kui-layout-rounded-radius"
|
|
1113
2078
|
],
|
|
1114
2079
|
"links": {
|
|
1115
|
-
"catalogRoute": "?component=
|
|
2080
|
+
"catalogRoute": "?component=list-item",
|
|
2081
|
+
"documentation": "docs/component-selection.md",
|
|
2082
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
2083
|
+
}
|
|
2084
|
+
},
|
|
2085
|
+
{
|
|
2086
|
+
"id": "list-inset-control",
|
|
2087
|
+
"name": "ListInsetControl",
|
|
2088
|
+
"category": "Structure",
|
|
2089
|
+
"kind": "component",
|
|
2090
|
+
"source": "kerf",
|
|
2091
|
+
"description": "Insets a self-bordered control into a pane/list content region.",
|
|
2092
|
+
"uses": [],
|
|
2093
|
+
"purpose": "Insets a self-bordered control into a pane/list content region.",
|
|
2094
|
+
"publicExports": [
|
|
2095
|
+
"ListInsetControl"
|
|
2096
|
+
],
|
|
2097
|
+
"useWhen": [
|
|
2098
|
+
"Place a control that carries its own border and padding (an input, a wa-* control) in a pane/list content region so its edges align with .kui-content items."
|
|
2099
|
+
],
|
|
2100
|
+
"avoidWhen": [
|
|
2101
|
+
"Do not wrap a component that already owns its content-item margin (ListItem, StateBanner, …) — that double-insets it. Use ListInsetText for bare text."
|
|
2102
|
+
],
|
|
2103
|
+
"alternatives": [
|
|
2104
|
+
{
|
|
2105
|
+
"id": "list-inset-text",
|
|
2106
|
+
"relationship": "nearest"
|
|
2107
|
+
}
|
|
2108
|
+
],
|
|
2109
|
+
"appOwns": [
|
|
2110
|
+
"the wrapped control and its behavior"
|
|
2111
|
+
],
|
|
2112
|
+
"accessibility": [
|
|
2113
|
+
"A layout wrapper only; it adds no role or name — the wrapped control keeps its own."
|
|
2114
|
+
],
|
|
2115
|
+
"geometry": {
|
|
2116
|
+
"margin": "self",
|
|
2117
|
+
"border": "child",
|
|
2118
|
+
"padding": "child"
|
|
2119
|
+
},
|
|
2120
|
+
"delivery": {
|
|
2121
|
+
"browserImport": "@kerfjs/ui/list-inset-control",
|
|
2122
|
+
"manualCssImport": "@kerfjs/ui/list-inset-control.css",
|
|
2123
|
+
"sideEffects": [
|
|
2124
|
+
"browser-condition-css"
|
|
2125
|
+
]
|
|
2126
|
+
},
|
|
2127
|
+
"wiring": [],
|
|
2128
|
+
"publicClasses": [
|
|
2129
|
+
"kui-list-inset-control"
|
|
2130
|
+
],
|
|
2131
|
+
"publicTokens": [
|
|
2132
|
+
"--kui-layout-inline-margin"
|
|
2133
|
+
],
|
|
2134
|
+
"links": {
|
|
2135
|
+
"catalogRoute": "?component=list-inset-control",
|
|
2136
|
+
"documentation": "docs/component-selection.md",
|
|
2137
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
2138
|
+
}
|
|
2139
|
+
},
|
|
2140
|
+
{
|
|
2141
|
+
"id": "list-inset-text",
|
|
2142
|
+
"name": "ListInsetText",
|
|
2143
|
+
"category": "Structure",
|
|
2144
|
+
"kind": "component",
|
|
2145
|
+
"source": "kerf",
|
|
2146
|
+
"description": "Gives bare text the content-item geometry so it lines up with bordered items.",
|
|
2147
|
+
"uses": [],
|
|
2148
|
+
"purpose": "Gives bare text the content-item geometry so it lines up with bordered items.",
|
|
2149
|
+
"publicExports": [
|
|
2150
|
+
"ListInsetText"
|
|
2151
|
+
],
|
|
2152
|
+
"useWhen": [
|
|
2153
|
+
"Line a plain text element up with bordered .kui-content items — it adds the 8px margin, 1px transparent border, and 8px padding the text lacks."
|
|
2154
|
+
],
|
|
2155
|
+
"avoidWhen": [
|
|
2156
|
+
"Do not use it to wrap an interactive control (use ListInsetControl), or a component that already owns its content-item geometry."
|
|
2157
|
+
],
|
|
2158
|
+
"alternatives": [
|
|
2159
|
+
{
|
|
2160
|
+
"id": "list-inset-control",
|
|
2161
|
+
"relationship": "nearest"
|
|
2162
|
+
}
|
|
2163
|
+
],
|
|
2164
|
+
"appOwns": [
|
|
2165
|
+
"the text content"
|
|
2166
|
+
],
|
|
2167
|
+
"accessibility": [
|
|
2168
|
+
"A layout wrapper only; it adds no role or name."
|
|
2169
|
+
],
|
|
2170
|
+
"geometry": {
|
|
2171
|
+
"margin": "self",
|
|
2172
|
+
"border": "self",
|
|
2173
|
+
"padding": "self"
|
|
2174
|
+
},
|
|
2175
|
+
"delivery": {
|
|
2176
|
+
"browserImport": "@kerfjs/ui/list-inset-text",
|
|
2177
|
+
"manualCssImport": "@kerfjs/ui/list-inset-text.css",
|
|
2178
|
+
"sideEffects": [
|
|
2179
|
+
"browser-condition-css"
|
|
2180
|
+
]
|
|
2181
|
+
},
|
|
2182
|
+
"wiring": [],
|
|
2183
|
+
"publicClasses": [
|
|
2184
|
+
"kui-list-inset-text",
|
|
2185
|
+
"kui-list-inset-text--horizontal"
|
|
2186
|
+
],
|
|
2187
|
+
"publicTokens": [],
|
|
2188
|
+
"links": {
|
|
2189
|
+
"catalogRoute": "?component=list-inset-text",
|
|
1116
2190
|
"documentation": "docs/component-selection.md",
|
|
1117
2191
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1118
2192
|
}
|
|
1119
2193
|
},
|
|
2194
|
+
{
|
|
2195
|
+
"id": "application-tabs",
|
|
2196
|
+
"name": "Application tabs composition",
|
|
2197
|
+
"category": "Navigation",
|
|
2198
|
+
"kind": "composition",
|
|
2199
|
+
"source": "kerf",
|
|
2200
|
+
"description": "Controlled document tabs with application-owned state and panels.",
|
|
2201
|
+
"uses": [
|
|
2202
|
+
"tabs",
|
|
2203
|
+
"tab-bar",
|
|
2204
|
+
"toolbar-control-group"
|
|
2205
|
+
],
|
|
2206
|
+
"purpose": "Show AppTab and TabBar in a complete controlled composition.",
|
|
2207
|
+
"publicExports": [],
|
|
2208
|
+
"useWhen": [
|
|
2209
|
+
"Compose application state, panels, actions, overflow, and reordering around TabBar and AppTab."
|
|
2210
|
+
],
|
|
2211
|
+
"avoidWhen": [
|
|
2212
|
+
"Use SegmentedControl instead for a compact local choice."
|
|
2213
|
+
],
|
|
2214
|
+
"alternatives": [],
|
|
2215
|
+
"appOwns": [
|
|
2216
|
+
"ordered tabs",
|
|
2217
|
+
"selected tab",
|
|
2218
|
+
"tabpanels",
|
|
2219
|
+
"add and close policy",
|
|
2220
|
+
"routing and persistence"
|
|
2221
|
+
],
|
|
2222
|
+
"variants": [
|
|
2223
|
+
"overflow",
|
|
2224
|
+
"keyboard and pointer reordering",
|
|
2225
|
+
"adding and closing documents"
|
|
2226
|
+
],
|
|
2227
|
+
"accessibility": [
|
|
2228
|
+
"Keep one selected tab synchronized with one named tabpanel and retain the wireTabBars disposer."
|
|
2229
|
+
],
|
|
2230
|
+
"geometry": {
|
|
2231
|
+
"margin": "child",
|
|
2232
|
+
"border": "child",
|
|
2233
|
+
"padding": "child"
|
|
2234
|
+
},
|
|
2235
|
+
"delivery": {
|
|
2236
|
+
"sideEffects": [
|
|
2237
|
+
"css"
|
|
2238
|
+
]
|
|
2239
|
+
},
|
|
2240
|
+
"wiring": [],
|
|
2241
|
+
"publicClasses": [],
|
|
2242
|
+
"publicTokens": [],
|
|
2243
|
+
"links": {
|
|
2244
|
+
"catalogRoute": "?component=application-tabs",
|
|
2245
|
+
"documentation": "docs/accessibility.md",
|
|
2246
|
+
"recipe": "docs/accessibility.md#tabs"
|
|
2247
|
+
}
|
|
2248
|
+
},
|
|
1120
2249
|
{
|
|
1121
2250
|
"id": "tabs",
|
|
1122
2251
|
"name": "AppTab",
|
|
1123
2252
|
"category": "Navigation",
|
|
1124
2253
|
"kind": "component",
|
|
1125
2254
|
"source": "kerf",
|
|
1126
|
-
"description": "Roving-tabindex-ready tabs with
|
|
2255
|
+
"description": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
|
|
1127
2256
|
"uses": [
|
|
1128
2257
|
"lucide-icon"
|
|
1129
2258
|
],
|
|
1130
|
-
"purpose": "Roving-tabindex-ready tabs with
|
|
2259
|
+
"purpose": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
|
|
1131
2260
|
"publicExports": [
|
|
1132
2261
|
"AppTab"
|
|
1133
2262
|
],
|
|
@@ -1148,7 +2277,8 @@
|
|
|
1148
2277
|
"selection",
|
|
1149
2278
|
"close policy",
|
|
1150
2279
|
"content",
|
|
1151
|
-
"application data attribute values"
|
|
2280
|
+
"application data attribute values",
|
|
2281
|
+
"outer placement"
|
|
1152
2282
|
],
|
|
1153
2283
|
"variants": [
|
|
1154
2284
|
"selected",
|
|
@@ -1157,13 +2287,22 @@
|
|
|
1157
2287
|
"leading",
|
|
1158
2288
|
"trailing",
|
|
1159
2289
|
"custom close icon",
|
|
1160
|
-
"root metadata"
|
|
2290
|
+
"root metadata",
|
|
2291
|
+
"compact size",
|
|
2292
|
+
"segmented presentation",
|
|
2293
|
+
"icon-only accessible presentation",
|
|
2294
|
+
"label maximum width and truncation"
|
|
1161
2295
|
],
|
|
1162
2296
|
"accessibility": [
|
|
1163
2297
|
"Compose in a tablist and pair with an application-owned tabpanel.",
|
|
1164
2298
|
"Keep closeIcon decorative and free of interactive descendants; the owning close button supplies its accessible name and interaction.",
|
|
1165
2299
|
"Use rootAttributes only for application data-* metadata; component-owned identity, state, action, and role semantics are protected at runtime."
|
|
1166
2300
|
],
|
|
2301
|
+
"geometry": {
|
|
2302
|
+
"margin": "none",
|
|
2303
|
+
"border": "self",
|
|
2304
|
+
"padding": "self"
|
|
2305
|
+
},
|
|
1167
2306
|
"delivery": {
|
|
1168
2307
|
"browserImport": "@kerfjs/ui/app-tab",
|
|
1169
2308
|
"manualCssImport": "@kerfjs/ui/app-tab.css",
|
|
@@ -1212,12 +2351,12 @@
|
|
|
1212
2351
|
"category": "Navigation",
|
|
1213
2352
|
"kind": "component",
|
|
1214
2353
|
"source": "kerf",
|
|
1215
|
-
"description": "Controlled
|
|
2354
|
+
"description": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
|
|
1216
2355
|
"uses": [
|
|
1217
2356
|
"tabs",
|
|
1218
2357
|
"toolbar-control-group"
|
|
1219
2358
|
],
|
|
1220
|
-
"purpose": "Controlled
|
|
2359
|
+
"purpose": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
|
|
1221
2360
|
"publicExports": [
|
|
1222
2361
|
"TabBar",
|
|
1223
2362
|
"wireTabBars",
|
|
@@ -1248,17 +2387,26 @@
|
|
|
1248
2387
|
"selection",
|
|
1249
2388
|
"panels",
|
|
1250
2389
|
"routing",
|
|
1251
|
-
"persistence"
|
|
2390
|
+
"persistence",
|
|
2391
|
+
"outer placement"
|
|
1252
2392
|
],
|
|
1253
2393
|
"variants": [
|
|
1254
2394
|
"leading",
|
|
1255
2395
|
"trailing",
|
|
1256
2396
|
"overflow",
|
|
1257
|
-
"reorderable"
|
|
2397
|
+
"reorderable",
|
|
2398
|
+
"rail, segmented, and inspector presentation",
|
|
2399
|
+
"intrinsic or fill allocation",
|
|
2400
|
+
"separate or adjacent trailing action"
|
|
1258
2401
|
],
|
|
1259
2402
|
"accessibility": [
|
|
1260
2403
|
"Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
|
|
1261
2404
|
],
|
|
2405
|
+
"geometry": {
|
|
2406
|
+
"margin": "none",
|
|
2407
|
+
"border": "self",
|
|
2408
|
+
"padding": "self"
|
|
2409
|
+
},
|
|
1262
2410
|
"delivery": {
|
|
1263
2411
|
"browserImport": "@kerfjs/ui/tab-bar",
|
|
1264
2412
|
"manualCssImport": "@kerfjs/ui/tab-bar.css",
|
|
@@ -1341,11 +2489,17 @@
|
|
|
1341
2489
|
"rounded",
|
|
1342
2490
|
"pill",
|
|
1343
2491
|
"equal width",
|
|
1344
|
-
"small"
|
|
2492
|
+
"small",
|
|
2493
|
+
"placeholder (loading)"
|
|
1345
2494
|
],
|
|
1346
2495
|
"accessibility": [
|
|
1347
2496
|
"Keep choice labels meaningful and every enabled native button in sequential Tab order."
|
|
1348
2497
|
],
|
|
2498
|
+
"geometry": {
|
|
2499
|
+
"margin": "none",
|
|
2500
|
+
"border": "self",
|
|
2501
|
+
"padding": "self"
|
|
2502
|
+
},
|
|
1349
2503
|
"delivery": {
|
|
1350
2504
|
"browserImport": "@kerfjs/ui/segmented-control",
|
|
1351
2505
|
"manualCssImport": "@kerfjs/ui/segmented-control.css",
|
|
@@ -1427,7 +2581,7 @@
|
|
|
1427
2581
|
"tokens",
|
|
1428
2582
|
"query execution",
|
|
1429
2583
|
"results",
|
|
1430
|
-
"
|
|
2584
|
+
"optional override of the collapsible expand/collapse/focus, which wireTokenSearchFields manages by default (adopt an app expanded signal, opt out per behavior, or drive it via the returned handle)"
|
|
1431
2585
|
],
|
|
1432
2586
|
"variants": [
|
|
1433
2587
|
"tokens",
|
|
@@ -1437,10 +2591,15 @@
|
|
|
1437
2591
|
],
|
|
1438
2592
|
"accessibility": [
|
|
1439
2593
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
1440
|
-
"Keep leading and trailing controls aligned to the first text line while content wraps.",
|
|
1441
|
-
"Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion;
|
|
1442
|
-
"In collapsible mode,
|
|
1443
|
-
],
|
|
2594
|
+
"Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.",
|
|
2595
|
+
"Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
|
|
2596
|
+
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out."
|
|
2597
|
+
],
|
|
2598
|
+
"geometry": {
|
|
2599
|
+
"margin": "none",
|
|
2600
|
+
"border": "self",
|
|
2601
|
+
"padding": "self"
|
|
2602
|
+
},
|
|
1444
2603
|
"delivery": {
|
|
1445
2604
|
"browserImport": "@kerfjs/ui/token-search-field",
|
|
1446
2605
|
"manualCssImport": "@kerfjs/ui/token-search-field.css",
|
|
@@ -1546,12 +2705,25 @@
|
|
|
1546
2705
|
"start edge",
|
|
1547
2706
|
"end edge",
|
|
1548
2707
|
"collapsed",
|
|
1549
|
-
"custom handle icon"
|
|
2708
|
+
"custom handle icon",
|
|
2709
|
+
"hidden separator",
|
|
2710
|
+
"slide, fade-slide, or instant content",
|
|
2711
|
+
"clipped, scrolling, or popup-visible content",
|
|
2712
|
+
"inline, overlay, or hidden responsive presentation",
|
|
2713
|
+
"safe-area restore control"
|
|
1550
2714
|
],
|
|
1551
2715
|
"accessibility": [
|
|
1552
2716
|
"Preserve separator naming, value ARIA, and keyboard behavior.",
|
|
1553
2717
|
"Keep handleIcon decorative and free of interactive descendants; the separator owns focus, naming, and pointer/keyboard interaction."
|
|
1554
2718
|
],
|
|
2719
|
+
"geometry": {
|
|
2720
|
+
"margin": "none",
|
|
2721
|
+
"border": "conditional",
|
|
2722
|
+
"padding": "conditional",
|
|
2723
|
+
"notes": [
|
|
2724
|
+
"The region delegates visible separator geometry and hit-area padding to its orientation-specific handle."
|
|
2725
|
+
]
|
|
2726
|
+
},
|
|
1555
2727
|
"delivery": {
|
|
1556
2728
|
"browserImport": "@kerfjs/ui/resizable-region",
|
|
1557
2729
|
"manualCssImport": "@kerfjs/ui/resizable-region.css",
|
|
@@ -1580,7 +2752,8 @@
|
|
|
1580
2752
|
"kui-resizable-region",
|
|
1581
2753
|
"kui-resizable-region__content",
|
|
1582
2754
|
"kui-resizable-region__handle",
|
|
1583
|
-
"kui-resizable-region__handle-icon"
|
|
2755
|
+
"kui-resizable-region__handle-icon",
|
|
2756
|
+
"kui-resizable-region__restore"
|
|
1584
2757
|
],
|
|
1585
2758
|
"publicTokens": [
|
|
1586
2759
|
"--kui-color-border",
|
|
@@ -1590,6 +2763,10 @@
|
|
|
1590
2763
|
"--kui-radius-s",
|
|
1591
2764
|
"--kui-resizable-region-handle-active-color",
|
|
1592
2765
|
"--kui-resizable-region-handle-color",
|
|
2766
|
+
"--kui-resizable-region-overlay-z",
|
|
2767
|
+
"--kui-resizable-region-popup-z",
|
|
2768
|
+
"--kui-resizable-region-restore-inset",
|
|
2769
|
+
"--kui-resizable-region-restore-z",
|
|
1593
2770
|
"--kui-resizable-region-separator-color",
|
|
1594
2771
|
"--kui-resizable-region-size"
|
|
1595
2772
|
],
|
|
@@ -1605,18 +2782,33 @@
|
|
|
1605
2782
|
"category": "Controls",
|
|
1606
2783
|
"kind": "component",
|
|
1607
2784
|
"source": "kerf",
|
|
1608
|
-
"description": "Controlled Web Awesome select with
|
|
2785
|
+
"description": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
|
|
1609
2786
|
"uses": [
|
|
1610
2787
|
"lucide-icon",
|
|
1611
2788
|
"wa-select",
|
|
1612
2789
|
"wa-option"
|
|
1613
2790
|
],
|
|
1614
|
-
"purpose": "Controlled Web Awesome select with
|
|
2791
|
+
"purpose": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
|
|
1615
2792
|
"publicExports": [
|
|
1616
|
-
"Select"
|
|
2793
|
+
"Select",
|
|
2794
|
+
"uiColor",
|
|
2795
|
+
"colorVar"
|
|
2796
|
+
],
|
|
2797
|
+
"cssValueProps": [
|
|
2798
|
+
{
|
|
2799
|
+
"path": "choices[].color",
|
|
2800
|
+
"grammar": "color",
|
|
2801
|
+
"helpers": ["uiColor", "colorVar"],
|
|
2802
|
+
"shorthands": [],
|
|
2803
|
+
"canonicalShorthands": [],
|
|
2804
|
+
"exceptionalShorthands": [],
|
|
2805
|
+
"rawPolicy": "forbid",
|
|
2806
|
+
"examples": ["color: uiColor(\"success\")", "color: colorVar(\"--app-choice-color\")"]
|
|
2807
|
+
}
|
|
1617
2808
|
],
|
|
1618
2809
|
"useWhen": [
|
|
1619
|
-
"Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices."
|
|
2810
|
+
"Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.",
|
|
2811
|
+
"Color an optional choice icon with uiColor() or colorVar(); the CssColor contract intentionally rejects lengths and raw color strings."
|
|
1620
2812
|
],
|
|
1621
2813
|
"avoidWhen": [
|
|
1622
2814
|
"Do not use for commands or a small choice set that should stay visible."
|
|
@@ -1639,18 +2831,34 @@
|
|
|
1639
2831
|
"value",
|
|
1640
2832
|
"validation",
|
|
1641
2833
|
"choices",
|
|
1642
|
-
"
|
|
2834
|
+
"hint copy",
|
|
2835
|
+
"domain mapping",
|
|
2836
|
+
"outer placement"
|
|
1643
2837
|
],
|
|
1644
2838
|
"variants": [
|
|
1645
2839
|
"placeholder",
|
|
1646
2840
|
"disabled",
|
|
1647
2841
|
"fit menu",
|
|
1648
2842
|
"grouped",
|
|
1649
|
-
"custom selected content"
|
|
2843
|
+
"custom selected content",
|
|
2844
|
+
"hint text",
|
|
2845
|
+
"placeholder (loading)",
|
|
2846
|
+
"form, toolbar-borderless, or navigation presentation",
|
|
2847
|
+
"default or compact size",
|
|
2848
|
+
"label or icon-only selected presentation",
|
|
2849
|
+
"select- or group-owned focus ring",
|
|
2850
|
+
"label maximum width and truncation"
|
|
1650
2851
|
],
|
|
1651
2852
|
"accessibility": [
|
|
1652
|
-
"Verify the live value, standard events, focus, and rendered output."
|
|
1653
|
-
|
|
2853
|
+
"Verify the live value, standard events, focus, and rendered output.",
|
|
2854
|
+
"A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
|
|
2855
|
+
"Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control."
|
|
2856
|
+
],
|
|
2857
|
+
"geometry": {
|
|
2858
|
+
"margin": "none",
|
|
2859
|
+
"border": "self",
|
|
2860
|
+
"padding": "self"
|
|
2861
|
+
},
|
|
1654
2862
|
"delivery": {
|
|
1655
2863
|
"browserImport": "@kerfjs/ui/select",
|
|
1656
2864
|
"manualCssImport": "@kerfjs/ui/select.css",
|
|
@@ -1664,6 +2872,7 @@
|
|
|
1664
2872
|
"kui-select",
|
|
1665
2873
|
"kui-select--custom-selected",
|
|
1666
2874
|
"kui-select--fit-menu",
|
|
2875
|
+
"kui-select--label-hidden",
|
|
1667
2876
|
"kui-select__custom-selected",
|
|
1668
2877
|
"kui-select__group",
|
|
1669
2878
|
"kui-select__group--separated",
|
|
@@ -1672,7 +2881,7 @@
|
|
|
1672
2881
|
],
|
|
1673
2882
|
"publicTokens": [
|
|
1674
2883
|
"--kui-color-brand-fill-normal",
|
|
1675
|
-
"--kui-color-brand-on-
|
|
2884
|
+
"--kui-color-brand-on-fill",
|
|
1676
2885
|
"--kui-color-neutral-border-quiet",
|
|
1677
2886
|
"--kui-color-neutral-on-quiet",
|
|
1678
2887
|
"--kui-disclosure-icon-scale",
|
|
@@ -1736,6 +2945,11 @@
|
|
|
1736
2945
|
"accessibility": [
|
|
1737
2946
|
"Choose polite status versus assertive alert deliberately."
|
|
1738
2947
|
],
|
|
2948
|
+
"geometry": {
|
|
2949
|
+
"margin": "child",
|
|
2950
|
+
"border": "child",
|
|
2951
|
+
"padding": "child"
|
|
2952
|
+
},
|
|
1739
2953
|
"delivery": {
|
|
1740
2954
|
"sideEffects": [
|
|
1741
2955
|
"css"
|
|
@@ -1756,11 +2970,11 @@
|
|
|
1756
2970
|
"category": "Feedback",
|
|
1757
2971
|
"kind": "component",
|
|
1758
2972
|
"source": "kerf",
|
|
1759
|
-
"description": "Polite status and assertive alert feedback with semantic tones.",
|
|
2973
|
+
"description": "Polite status and assertive alert feedback with semantic tones, plus non-status pop emphasis for featured or novel content.",
|
|
1760
2974
|
"uses": [
|
|
1761
2975
|
"lucide-icon"
|
|
1762
2976
|
],
|
|
1763
|
-
"purpose": "
|
|
2977
|
+
"purpose": "Present persistent inline feedback or attractive non-status emphasis with a named semantic tone.",
|
|
1764
2978
|
"publicExports": [
|
|
1765
2979
|
"StateBanner"
|
|
1766
2980
|
],
|
|
@@ -1768,7 +2982,8 @@
|
|
|
1768
2982
|
"Place persistent inline semantic status beside affected work."
|
|
1769
2983
|
],
|
|
1770
2984
|
"avoidWhen": [
|
|
1771
|
-
"Do not use for an absent-content screen or transient confirmation."
|
|
2985
|
+
"Do not use for an absent-content screen or transient confirmation.",
|
|
2986
|
+
"Do not use pop as a substitute for success, warning, or danger."
|
|
1772
2987
|
],
|
|
1773
2988
|
"alternatives": [
|
|
1774
2989
|
{
|
|
@@ -1785,6 +3000,7 @@
|
|
|
1785
3000
|
}
|
|
1786
3001
|
],
|
|
1787
3002
|
"appOwns": [
|
|
3003
|
+
"badge content",
|
|
1788
3004
|
"state mapping",
|
|
1789
3005
|
"message lifetime",
|
|
1790
3006
|
"retry behavior",
|
|
@@ -1793,15 +3009,24 @@
|
|
|
1793
3009
|
"variants": [
|
|
1794
3010
|
"neutral",
|
|
1795
3011
|
"info",
|
|
3012
|
+
"pop",
|
|
1796
3013
|
"success",
|
|
1797
3014
|
"warning",
|
|
1798
3015
|
"danger",
|
|
1799
3016
|
"status",
|
|
1800
|
-
"alert"
|
|
3017
|
+
"alert",
|
|
3018
|
+
"badge",
|
|
3019
|
+
"placeholder (loading)"
|
|
1801
3020
|
],
|
|
1802
3021
|
"accessibility": [
|
|
1803
|
-
"Use alert urgency only for an attention-requiring failure."
|
|
3022
|
+
"Use alert urgency only for an attention-requiring failure.",
|
|
3023
|
+
"Keep optional badge content terse and do not rely on its tone alone for meaning."
|
|
1804
3024
|
],
|
|
3025
|
+
"geometry": {
|
|
3026
|
+
"margin": "self",
|
|
3027
|
+
"border": "self",
|
|
3028
|
+
"padding": "self"
|
|
3029
|
+
},
|
|
1805
3030
|
"delivery": {
|
|
1806
3031
|
"browserImport": "@kerfjs/ui/state-banner",
|
|
1807
3032
|
"manualCssImport": "@kerfjs/ui/state-banner.css",
|
|
@@ -1813,13 +3038,18 @@
|
|
|
1813
3038
|
"publicClasses": [
|
|
1814
3039
|
"kui-state-banner",
|
|
1815
3040
|
"kui-state-banner__action",
|
|
3041
|
+
"kui-state-banner__badge",
|
|
1816
3042
|
"kui-state-banner__copy",
|
|
3043
|
+
"kui-state-banner__detail",
|
|
1817
3044
|
"kui-state-banner__icon"
|
|
1818
3045
|
],
|
|
1819
3046
|
"publicTokens": [
|
|
1820
3047
|
"--kui-color-brand-border-quiet",
|
|
1821
3048
|
"--kui-color-brand-fill-quiet",
|
|
1822
|
-
"--kui-color-brand-on-
|
|
3049
|
+
"--kui-color-brand-on-fill",
|
|
3050
|
+
"--kui-color-pop-border-normal",
|
|
3051
|
+
"--kui-color-pop-fill-quiet",
|
|
3052
|
+
"--kui-color-pop-on-fill",
|
|
1823
3053
|
"--kui-color-danger-border-quiet",
|
|
1824
3054
|
"--kui-color-danger-fill-quiet",
|
|
1825
3055
|
"--kui-color-danger-on-quiet",
|
|
@@ -1828,18 +3058,20 @@
|
|
|
1828
3058
|
"--kui-color-neutral-on-normal",
|
|
1829
3059
|
"--kui-color-success-border-normal",
|
|
1830
3060
|
"--kui-color-success-fill-quiet",
|
|
1831
|
-
"--kui-color-success-on-
|
|
3061
|
+
"--kui-color-success-on-fill",
|
|
1832
3062
|
"--kui-color-surface",
|
|
1833
3063
|
"--kui-color-text-link",
|
|
1834
3064
|
"--kui-color-warning-border-normal",
|
|
1835
3065
|
"--kui-color-warning-fill-quiet",
|
|
1836
|
-
"--kui-color-warning-on-
|
|
3066
|
+
"--kui-color-warning-on-fill",
|
|
1837
3067
|
"--kui-font-2xs",
|
|
1838
3068
|
"--kui-font-xs",
|
|
1839
3069
|
"--kui-radius-pill",
|
|
1840
3070
|
"--kui-state-banner-action-background",
|
|
1841
3071
|
"--kui-state-banner-action-hover-background",
|
|
1842
3072
|
"--kui-state-banner-background",
|
|
3073
|
+
"--kui-state-banner-badge-background",
|
|
3074
|
+
"--kui-state-banner-badge-foreground",
|
|
1843
3075
|
"--kui-state-banner-border",
|
|
1844
3076
|
"--kui-state-banner-danger-background",
|
|
1845
3077
|
"--kui-state-banner-danger-border",
|
|
@@ -1849,6 +3081,9 @@
|
|
|
1849
3081
|
"--kui-state-banner-info-background",
|
|
1850
3082
|
"--kui-state-banner-info-border",
|
|
1851
3083
|
"--kui-state-banner-info-foreground",
|
|
3084
|
+
"--kui-state-banner-pop-background",
|
|
3085
|
+
"--kui-state-banner-pop-border",
|
|
3086
|
+
"--kui-state-banner-pop-foreground",
|
|
1852
3087
|
"--kui-state-banner-neutral-background",
|
|
1853
3088
|
"--kui-state-banner-neutral-border",
|
|
1854
3089
|
"--kui-state-banner-neutral-foreground",
|
|
@@ -1909,6 +3144,11 @@
|
|
|
1909
3144
|
"accessibility": [
|
|
1910
3145
|
"Busy state uses aria-busy; the illustration never supplies the only label."
|
|
1911
3146
|
],
|
|
3147
|
+
"geometry": {
|
|
3148
|
+
"margin": "self",
|
|
3149
|
+
"border": "self",
|
|
3150
|
+
"padding": "self"
|
|
3151
|
+
},
|
|
1912
3152
|
"delivery": {
|
|
1913
3153
|
"browserImport": "@kerfjs/ui/empty-state",
|
|
1914
3154
|
"manualCssImport": "@kerfjs/ui/empty-state.css",
|
|
@@ -1981,6 +3221,11 @@
|
|
|
1981
3221
|
"accessibility": [
|
|
1982
3222
|
"Labeled spinners use role img; decorative spinners are hidden and stop for reduced motion."
|
|
1983
3223
|
],
|
|
3224
|
+
"geometry": {
|
|
3225
|
+
"margin": "none",
|
|
3226
|
+
"border": "none",
|
|
3227
|
+
"padding": "none"
|
|
3228
|
+
},
|
|
1984
3229
|
"delivery": {
|
|
1985
3230
|
"browserImport": "@kerfjs/ui/loading-spinner",
|
|
1986
3231
|
"manualCssImport": "@kerfjs/ui/loading-spinner.css",
|
|
@@ -1999,6 +3244,109 @@
|
|
|
1999
3244
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
2000
3245
|
}
|
|
2001
3246
|
},
|
|
3247
|
+
{
|
|
3248
|
+
"id": "skeleton",
|
|
3249
|
+
"name": "Skeleton",
|
|
3250
|
+
"category": "Feedback",
|
|
3251
|
+
"kind": "component",
|
|
3252
|
+
"source": "kerf",
|
|
3253
|
+
"description": "A subtle, unanimated loading placeholder block for a not-yet-known value slot.",
|
|
3254
|
+
"uses": [],
|
|
3255
|
+
"purpose": "A subtle, unanimated loading placeholder block for a not-yet-known value slot.",
|
|
3256
|
+
"publicExports": [
|
|
3257
|
+
"Skeleton"
|
|
3258
|
+
],
|
|
3259
|
+
"cssValueProps": [
|
|
3260
|
+
{
|
|
3261
|
+
"path": "width",
|
|
3262
|
+
"grammar": "size",
|
|
3263
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
3264
|
+
"nonStandaloneHelpers": ["plus"],
|
|
3265
|
+
"shorthands": ["auto", "min-content", "max-content", "fit-content"],
|
|
3266
|
+
"canonicalShorthands": ["auto", "min-content", "max-content", "fit-content"],
|
|
3267
|
+
"exceptionalShorthands": [],
|
|
3268
|
+
"rawPolicy": "forbid",
|
|
3269
|
+
"examples": ["width={em(12)}", "width=\"fit-content\""]
|
|
3270
|
+
},
|
|
3271
|
+
{
|
|
3272
|
+
"path": "height",
|
|
3273
|
+
"grammar": "size",
|
|
3274
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
3275
|
+
"nonStandaloneHelpers": ["plus"],
|
|
3276
|
+
"shorthands": ["auto", "min-content", "max-content", "fit-content"],
|
|
3277
|
+
"canonicalShorthands": ["auto", "min-content", "max-content", "fit-content"],
|
|
3278
|
+
"exceptionalShorthands": [],
|
|
3279
|
+
"rawPolicy": "forbid",
|
|
3280
|
+
"examples": ["height={em(1.5)}"]
|
|
3281
|
+
},
|
|
3282
|
+
{
|
|
3283
|
+
"path": "radius",
|
|
3284
|
+
"grammar": "length",
|
|
3285
|
+
"helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
|
|
3286
|
+
"nonStandaloneHelpers": ["plus"],
|
|
3287
|
+
"shorthands": [],
|
|
3288
|
+
"canonicalShorthands": [],
|
|
3289
|
+
"exceptionalShorthands": [],
|
|
3290
|
+
"rawPolicy": "forbid",
|
|
3291
|
+
"examples": ["radius={px(999)}"]
|
|
3292
|
+
}
|
|
3293
|
+
],
|
|
3294
|
+
"useWhen": [
|
|
3295
|
+
"Stand in for a value that is still loading, on its own or via a component's placeholder prop, keeping the surrounding layout stable.",
|
|
3296
|
+
"Placeholder a custom or free-text slot with the same visual the components' placeholder mode uses.",
|
|
3297
|
+
"Set width and height with typed length builders or finite intrinsic-size keywords; set radius with a typed length."
|
|
3298
|
+
],
|
|
3299
|
+
"avoidWhen": [
|
|
3300
|
+
"Do not use for known progress or a busy spinner; use LoadingSpinner.",
|
|
3301
|
+
"Do not animate it or use it as decorative filler.",
|
|
3302
|
+
"Do not pass raw CSS strings or cross property grammars into width, height, or radius."
|
|
3303
|
+
],
|
|
3304
|
+
"alternatives": [
|
|
3305
|
+
{
|
|
3306
|
+
"id": "wa-skeleton",
|
|
3307
|
+
"relationship": "prefer-over"
|
|
3308
|
+
}
|
|
3309
|
+
],
|
|
3310
|
+
"appOwns": [
|
|
3311
|
+
"loading lifecycle",
|
|
3312
|
+
"which slots are unknown",
|
|
3313
|
+
"announcing the loading region"
|
|
3314
|
+
],
|
|
3315
|
+
"variants": [
|
|
3316
|
+
"block",
|
|
3317
|
+
"lines",
|
|
3318
|
+
"labeled",
|
|
3319
|
+
"typed width, height, and radius"
|
|
3320
|
+
],
|
|
3321
|
+
"accessibility": [
|
|
3322
|
+
"Decorative by default (aria-hidden); pass label to announce it as an image. A component in placeholder mode marks itself aria-busy and disables its own controls."
|
|
3323
|
+
],
|
|
3324
|
+
"geometry": {
|
|
3325
|
+
"margin": "none",
|
|
3326
|
+
"border": "none",
|
|
3327
|
+
"padding": "none"
|
|
3328
|
+
},
|
|
3329
|
+
"delivery": {
|
|
3330
|
+
"browserImport": "@kerfjs/ui/skeleton",
|
|
3331
|
+
"manualCssImport": "@kerfjs/ui/skeleton.css",
|
|
3332
|
+
"sideEffects": [
|
|
3333
|
+
"browser-condition-css"
|
|
3334
|
+
]
|
|
3335
|
+
},
|
|
3336
|
+
"wiring": [],
|
|
3337
|
+
"publicClasses": [
|
|
3338
|
+
"kui-skeleton",
|
|
3339
|
+
"kui-skeleton-lines"
|
|
3340
|
+
],
|
|
3341
|
+
"publicTokens": [
|
|
3342
|
+
"--kui-skeleton-radius"
|
|
3343
|
+
],
|
|
3344
|
+
"links": {
|
|
3345
|
+
"catalogRoute": "?component=skeleton",
|
|
3346
|
+
"documentation": "docs/component-selection.md",
|
|
3347
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
3348
|
+
}
|
|
3349
|
+
},
|
|
2002
3350
|
{
|
|
2003
3351
|
"id": "wa-button",
|
|
2004
3352
|
"name": "Button",
|
|
@@ -2020,6 +3368,11 @@
|
|
|
2020
3368
|
],
|
|
2021
3369
|
"recommendation": "supported",
|
|
2022
3370
|
"alternatives": [],
|
|
3371
|
+
"geometry": {
|
|
3372
|
+
"margin": "none",
|
|
3373
|
+
"border": "self",
|
|
3374
|
+
"padding": "self"
|
|
3375
|
+
},
|
|
2023
3376
|
"delivery": {
|
|
2024
3377
|
"registrationImport": "@awesome.me/webawesome/dist/components/button/button.js",
|
|
2025
3378
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2058,6 +3411,11 @@
|
|
|
2058
3411
|
"relationship": "prefer-kerf"
|
|
2059
3412
|
}
|
|
2060
3413
|
],
|
|
3414
|
+
"geometry": {
|
|
3415
|
+
"margin": "none",
|
|
3416
|
+
"border": "child",
|
|
3417
|
+
"padding": "child"
|
|
3418
|
+
},
|
|
2061
3419
|
"delivery": {
|
|
2062
3420
|
"registrationImport": "@awesome.me/webawesome/dist/components/button-group/button-group.js",
|
|
2063
3421
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2092,6 +3450,11 @@
|
|
|
2092
3450
|
],
|
|
2093
3451
|
"recommendation": "supported",
|
|
2094
3452
|
"alternatives": [],
|
|
3453
|
+
"geometry": {
|
|
3454
|
+
"margin": "none",
|
|
3455
|
+
"border": "self",
|
|
3456
|
+
"padding": "self"
|
|
3457
|
+
},
|
|
2095
3458
|
"delivery": {
|
|
2096
3459
|
"registrationImport": "@awesome.me/webawesome/dist/components/copy-button/copy-button.js",
|
|
2097
3460
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2131,6 +3494,11 @@
|
|
|
2131
3494
|
"relationship": "prefer-kerf"
|
|
2132
3495
|
}
|
|
2133
3496
|
],
|
|
3497
|
+
"geometry": {
|
|
3498
|
+
"margin": "none",
|
|
3499
|
+
"border": "child",
|
|
3500
|
+
"padding": "child"
|
|
3501
|
+
},
|
|
2134
3502
|
"delivery": {
|
|
2135
3503
|
"registrationImport": "@awesome.me/webawesome/dist/components/dropdown/dropdown.js",
|
|
2136
3504
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2169,6 +3537,11 @@
|
|
|
2169
3537
|
"relationship": "prefer-kerf"
|
|
2170
3538
|
}
|
|
2171
3539
|
],
|
|
3540
|
+
"geometry": {
|
|
3541
|
+
"margin": "none",
|
|
3542
|
+
"border": "self",
|
|
3543
|
+
"padding": "self"
|
|
3544
|
+
},
|
|
2172
3545
|
"delivery": {
|
|
2173
3546
|
"registrationImport": "@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js",
|
|
2174
3547
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2202,6 +3575,11 @@
|
|
|
2202
3575
|
],
|
|
2203
3576
|
"recommendation": "supported",
|
|
2204
3577
|
"alternatives": [],
|
|
3578
|
+
"geometry": {
|
|
3579
|
+
"margin": "none",
|
|
3580
|
+
"border": "self",
|
|
3581
|
+
"padding": "self"
|
|
3582
|
+
},
|
|
2205
3583
|
"delivery": {
|
|
2206
3584
|
"registrationImport": "@awesome.me/webawesome/dist/components/checkbox/checkbox.js",
|
|
2207
3585
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2235,6 +3613,11 @@
|
|
|
2235
3613
|
],
|
|
2236
3614
|
"recommendation": "supported",
|
|
2237
3615
|
"alternatives": [],
|
|
3616
|
+
"geometry": {
|
|
3617
|
+
"margin": "self",
|
|
3618
|
+
"border": "child",
|
|
3619
|
+
"padding": "child"
|
|
3620
|
+
},
|
|
2238
3621
|
"delivery": {
|
|
2239
3622
|
"registrationImport": "@awesome.me/webawesome/dist/components/checkbox-group/checkbox-group.js",
|
|
2240
3623
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2271,6 +3654,11 @@
|
|
|
2271
3654
|
],
|
|
2272
3655
|
"recommendation": "supported",
|
|
2273
3656
|
"alternatives": [],
|
|
3657
|
+
"geometry": {
|
|
3658
|
+
"margin": "none",
|
|
3659
|
+
"border": "self",
|
|
3660
|
+
"padding": "self"
|
|
3661
|
+
},
|
|
2274
3662
|
"delivery": {
|
|
2275
3663
|
"registrationImport": "@awesome.me/webawesome/dist/components/color-picker/color-picker.js",
|
|
2276
3664
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2309,6 +3697,11 @@
|
|
|
2309
3697
|
"relationship": "prefer-kerf"
|
|
2310
3698
|
}
|
|
2311
3699
|
],
|
|
3700
|
+
"geometry": {
|
|
3701
|
+
"margin": "none",
|
|
3702
|
+
"border": "self",
|
|
3703
|
+
"padding": "self"
|
|
3704
|
+
},
|
|
2312
3705
|
"delivery": {
|
|
2313
3706
|
"registrationImport": "@awesome.me/webawesome/dist/components/input/input.js",
|
|
2314
3707
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2340,6 +3733,11 @@
|
|
|
2340
3733
|
],
|
|
2341
3734
|
"recommendation": "supported",
|
|
2342
3735
|
"alternatives": [],
|
|
3736
|
+
"geometry": {
|
|
3737
|
+
"margin": "none",
|
|
3738
|
+
"border": "self",
|
|
3739
|
+
"padding": "self"
|
|
3740
|
+
},
|
|
2343
3741
|
"delivery": {
|
|
2344
3742
|
"registrationImport": "@awesome.me/webawesome/dist/components/known-date/known-date.js",
|
|
2345
3743
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2373,6 +3771,11 @@
|
|
|
2373
3771
|
],
|
|
2374
3772
|
"recommendation": "supported",
|
|
2375
3773
|
"alternatives": [],
|
|
3774
|
+
"geometry": {
|
|
3775
|
+
"margin": "none",
|
|
3776
|
+
"border": "self",
|
|
3777
|
+
"padding": "self"
|
|
3778
|
+
},
|
|
2376
3779
|
"delivery": {
|
|
2377
3780
|
"registrationImport": "@awesome.me/webawesome/dist/components/number-input/number-input.js",
|
|
2378
3781
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2411,6 +3814,11 @@
|
|
|
2411
3814
|
"relationship": "prefer-kerf"
|
|
2412
3815
|
}
|
|
2413
3816
|
],
|
|
3817
|
+
"geometry": {
|
|
3818
|
+
"margin": "none",
|
|
3819
|
+
"border": "self",
|
|
3820
|
+
"padding": "self"
|
|
3821
|
+
},
|
|
2414
3822
|
"delivery": {
|
|
2415
3823
|
"registrationImport": "@awesome.me/webawesome/dist/components/option/option.js",
|
|
2416
3824
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2442,6 +3850,11 @@
|
|
|
2442
3850
|
],
|
|
2443
3851
|
"recommendation": "supported",
|
|
2444
3852
|
"alternatives": [],
|
|
3853
|
+
"geometry": {
|
|
3854
|
+
"margin": "none",
|
|
3855
|
+
"border": "self",
|
|
3856
|
+
"padding": "self"
|
|
3857
|
+
},
|
|
2445
3858
|
"delivery": {
|
|
2446
3859
|
"registrationImport": "@awesome.me/webawesome/dist/components/otp-input/otp-input.js",
|
|
2447
3860
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2475,6 +3888,11 @@
|
|
|
2475
3888
|
],
|
|
2476
3889
|
"recommendation": "supported",
|
|
2477
3890
|
"alternatives": [],
|
|
3891
|
+
"geometry": {
|
|
3892
|
+
"margin": "none",
|
|
3893
|
+
"border": "self",
|
|
3894
|
+
"padding": "self"
|
|
3895
|
+
},
|
|
2478
3896
|
"delivery": {
|
|
2479
3897
|
"registrationImport": "@awesome.me/webawesome/dist/components/radio/radio.js",
|
|
2480
3898
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2508,6 +3926,11 @@
|
|
|
2508
3926
|
],
|
|
2509
3927
|
"recommendation": "supported",
|
|
2510
3928
|
"alternatives": [],
|
|
3929
|
+
"geometry": {
|
|
3930
|
+
"margin": "self",
|
|
3931
|
+
"border": "child",
|
|
3932
|
+
"padding": "child"
|
|
3933
|
+
},
|
|
2511
3934
|
"delivery": {
|
|
2512
3935
|
"registrationImport": "@awesome.me/webawesome/dist/components/radio-group/radio-group.js",
|
|
2513
3936
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2541,6 +3964,11 @@
|
|
|
2541
3964
|
],
|
|
2542
3965
|
"recommendation": "supported",
|
|
2543
3966
|
"alternatives": [],
|
|
3967
|
+
"geometry": {
|
|
3968
|
+
"margin": "none",
|
|
3969
|
+
"border": "none",
|
|
3970
|
+
"padding": "none"
|
|
3971
|
+
},
|
|
2544
3972
|
"delivery": {
|
|
2545
3973
|
"registrationImport": "@awesome.me/webawesome/dist/components/rating/rating.js",
|
|
2546
3974
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2582,6 +4010,11 @@
|
|
|
2582
4010
|
"relationship": "prefer-kerf"
|
|
2583
4011
|
}
|
|
2584
4012
|
],
|
|
4013
|
+
"geometry": {
|
|
4014
|
+
"margin": "none",
|
|
4015
|
+
"border": "self",
|
|
4016
|
+
"padding": "self"
|
|
4017
|
+
},
|
|
2585
4018
|
"delivery": {
|
|
2586
4019
|
"registrationImport": "@awesome.me/webawesome/dist/components/select/select.js",
|
|
2587
4020
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2615,6 +4048,11 @@
|
|
|
2615
4048
|
],
|
|
2616
4049
|
"recommendation": "supported",
|
|
2617
4050
|
"alternatives": [],
|
|
4051
|
+
"geometry": {
|
|
4052
|
+
"margin": "self",
|
|
4053
|
+
"border": "none",
|
|
4054
|
+
"padding": "child"
|
|
4055
|
+
},
|
|
2618
4056
|
"delivery": {
|
|
2619
4057
|
"registrationImport": "@awesome.me/webawesome/dist/components/slider/slider.js",
|
|
2620
4058
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2646,6 +4084,11 @@
|
|
|
2646
4084
|
],
|
|
2647
4085
|
"recommendation": "supported",
|
|
2648
4086
|
"alternatives": [],
|
|
4087
|
+
"geometry": {
|
|
4088
|
+
"margin": "none",
|
|
4089
|
+
"border": "self",
|
|
4090
|
+
"padding": "self"
|
|
4091
|
+
},
|
|
2649
4092
|
"delivery": {
|
|
2650
4093
|
"registrationImport": "@awesome.me/webawesome/dist/components/switch/switch.js",
|
|
2651
4094
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2677,6 +4120,11 @@
|
|
|
2677
4120
|
],
|
|
2678
4121
|
"recommendation": "supported",
|
|
2679
4122
|
"alternatives": [],
|
|
4123
|
+
"geometry": {
|
|
4124
|
+
"margin": "none",
|
|
4125
|
+
"border": "self",
|
|
4126
|
+
"padding": "self"
|
|
4127
|
+
},
|
|
2680
4128
|
"delivery": {
|
|
2681
4129
|
"registrationImport": "@awesome.me/webawesome/dist/components/textarea/textarea.js",
|
|
2682
4130
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2711,6 +4159,11 @@
|
|
|
2711
4159
|
],
|
|
2712
4160
|
"recommendation": "supported",
|
|
2713
4161
|
"alternatives": [],
|
|
4162
|
+
"geometry": {
|
|
4163
|
+
"margin": "none",
|
|
4164
|
+
"border": "self",
|
|
4165
|
+
"padding": "self"
|
|
4166
|
+
},
|
|
2714
4167
|
"delivery": {
|
|
2715
4168
|
"registrationImport": "@awesome.me/webawesome/dist/components/time-input/time-input.js",
|
|
2716
4169
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2744,6 +4197,11 @@
|
|
|
2744
4197
|
],
|
|
2745
4198
|
"recommendation": "supported",
|
|
2746
4199
|
"alternatives": [],
|
|
4200
|
+
"geometry": {
|
|
4201
|
+
"margin": "self",
|
|
4202
|
+
"border": "self",
|
|
4203
|
+
"padding": "self"
|
|
4204
|
+
},
|
|
2747
4205
|
"delivery": {
|
|
2748
4206
|
"registrationImport": "@awesome.me/webawesome/dist/components/accordion/accordion.js",
|
|
2749
4207
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2777,6 +4235,11 @@
|
|
|
2777
4235
|
],
|
|
2778
4236
|
"recommendation": "supported",
|
|
2779
4237
|
"alternatives": [],
|
|
4238
|
+
"geometry": {
|
|
4239
|
+
"margin": "none",
|
|
4240
|
+
"border": "self",
|
|
4241
|
+
"padding": "self"
|
|
4242
|
+
},
|
|
2780
4243
|
"delivery": {
|
|
2781
4244
|
"registrationImport": "@awesome.me/webawesome/dist/components/accordion-item/accordion-item.js",
|
|
2782
4245
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2808,6 +4271,11 @@
|
|
|
2808
4271
|
],
|
|
2809
4272
|
"recommendation": "supported",
|
|
2810
4273
|
"alternatives": [],
|
|
4274
|
+
"geometry": {
|
|
4275
|
+
"margin": "self",
|
|
4276
|
+
"border": "self",
|
|
4277
|
+
"padding": "self"
|
|
4278
|
+
},
|
|
2811
4279
|
"delivery": {
|
|
2812
4280
|
"registrationImport": "@awesome.me/webawesome/dist/components/card/card.js",
|
|
2813
4281
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2841,6 +4309,11 @@
|
|
|
2841
4309
|
],
|
|
2842
4310
|
"recommendation": "supported",
|
|
2843
4311
|
"alternatives": [],
|
|
4312
|
+
"geometry": {
|
|
4313
|
+
"margin": "self",
|
|
4314
|
+
"border": "self",
|
|
4315
|
+
"padding": "self"
|
|
4316
|
+
},
|
|
2844
4317
|
"delivery": {
|
|
2845
4318
|
"registrationImport": "@awesome.me/webawesome/dist/components/details/details.js",
|
|
2846
4319
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2874,6 +4347,14 @@
|
|
|
2874
4347
|
],
|
|
2875
4348
|
"recommendation": "supported",
|
|
2876
4349
|
"alternatives": [],
|
|
4350
|
+
"publicClasses": [
|
|
4351
|
+
"hide-actions"
|
|
4352
|
+
],
|
|
4353
|
+
"geometry": {
|
|
4354
|
+
"margin": "none",
|
|
4355
|
+
"border": "child",
|
|
4356
|
+
"padding": "child"
|
|
4357
|
+
},
|
|
2877
4358
|
"delivery": {
|
|
2878
4359
|
"registrationImport": "@awesome.me/webawesome/dist/components/dialog/dialog.js",
|
|
2879
4360
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2905,6 +4386,11 @@
|
|
|
2905
4386
|
],
|
|
2906
4387
|
"recommendation": "supported",
|
|
2907
4388
|
"alternatives": [],
|
|
4389
|
+
"geometry": {
|
|
4390
|
+
"margin": "parent",
|
|
4391
|
+
"border": "self",
|
|
4392
|
+
"padding": "none"
|
|
4393
|
+
},
|
|
2908
4394
|
"delivery": {
|
|
2909
4395
|
"registrationImport": "@awesome.me/webawesome/dist/components/divider/divider.js",
|
|
2910
4396
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2938,6 +4424,11 @@
|
|
|
2938
4424
|
],
|
|
2939
4425
|
"recommendation": "supported",
|
|
2940
4426
|
"alternatives": [],
|
|
4427
|
+
"geometry": {
|
|
4428
|
+
"margin": "none",
|
|
4429
|
+
"border": "child",
|
|
4430
|
+
"padding": "child"
|
|
4431
|
+
},
|
|
2941
4432
|
"delivery": {
|
|
2942
4433
|
"registrationImport": "@awesome.me/webawesome/dist/components/drawer/drawer.js",
|
|
2943
4434
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -2969,6 +4460,11 @@
|
|
|
2969
4460
|
],
|
|
2970
4461
|
"recommendation": "supported",
|
|
2971
4462
|
"alternatives": [],
|
|
4463
|
+
"geometry": {
|
|
4464
|
+
"margin": "none",
|
|
4465
|
+
"border": "child",
|
|
4466
|
+
"padding": "child"
|
|
4467
|
+
},
|
|
2972
4468
|
"delivery": {
|
|
2973
4469
|
"registrationImport": "@awesome.me/webawesome/dist/components/page/page.js",
|
|
2974
4470
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3000,6 +4496,11 @@
|
|
|
3000
4496
|
],
|
|
3001
4497
|
"recommendation": "supported",
|
|
3002
4498
|
"alternatives": [],
|
|
4499
|
+
"geometry": {
|
|
4500
|
+
"margin": "none",
|
|
4501
|
+
"border": "child",
|
|
4502
|
+
"padding": "child"
|
|
4503
|
+
},
|
|
3003
4504
|
"delivery": {
|
|
3004
4505
|
"registrationImport": "@awesome.me/webawesome/dist/components/scroller/scroller.js",
|
|
3005
4506
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3036,6 +4537,11 @@
|
|
|
3036
4537
|
"relationship": "prefer-kerf"
|
|
3037
4538
|
}
|
|
3038
4539
|
],
|
|
4540
|
+
"geometry": {
|
|
4541
|
+
"margin": "none",
|
|
4542
|
+
"border": "child",
|
|
4543
|
+
"padding": "child"
|
|
4544
|
+
},
|
|
3039
4545
|
"delivery": {
|
|
3040
4546
|
"registrationImport": "@awesome.me/webawesome/dist/components/split-panel/split-panel.js",
|
|
3041
4547
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3070,6 +4576,11 @@
|
|
|
3070
4576
|
],
|
|
3071
4577
|
"recommendation": "supported",
|
|
3072
4578
|
"alternatives": [],
|
|
4579
|
+
"geometry": {
|
|
4580
|
+
"margin": "none",
|
|
4581
|
+
"border": "child",
|
|
4582
|
+
"padding": "child"
|
|
4583
|
+
},
|
|
3073
4584
|
"delivery": {
|
|
3074
4585
|
"registrationImport": "@awesome.me/webawesome/dist/components/breadcrumb/breadcrumb.js",
|
|
3075
4586
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3101,6 +4612,11 @@
|
|
|
3101
4612
|
],
|
|
3102
4613
|
"recommendation": "supported",
|
|
3103
4614
|
"alternatives": [],
|
|
4615
|
+
"geometry": {
|
|
4616
|
+
"margin": "none",
|
|
4617
|
+
"border": "none",
|
|
4618
|
+
"padding": "none"
|
|
4619
|
+
},
|
|
3104
4620
|
"delivery": {
|
|
3105
4621
|
"registrationImport": "@awesome.me/webawesome/dist/components/breadcrumb-item/breadcrumb-item.js",
|
|
3106
4622
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3134,6 +4650,11 @@
|
|
|
3134
4650
|
],
|
|
3135
4651
|
"recommendation": "supported",
|
|
3136
4652
|
"alternatives": [],
|
|
4653
|
+
"geometry": {
|
|
4654
|
+
"margin": "none",
|
|
4655
|
+
"border": "child",
|
|
4656
|
+
"padding": "child"
|
|
4657
|
+
},
|
|
3137
4658
|
"delivery": {
|
|
3138
4659
|
"registrationImport": "@awesome.me/webawesome/dist/components/pagination/pagination.js",
|
|
3139
4660
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3174,6 +4695,11 @@
|
|
|
3174
4695
|
"relationship": "prefer-kerf"
|
|
3175
4696
|
}
|
|
3176
4697
|
],
|
|
4698
|
+
"geometry": {
|
|
4699
|
+
"margin": "none",
|
|
4700
|
+
"border": "self",
|
|
4701
|
+
"padding": "self"
|
|
4702
|
+
},
|
|
3177
4703
|
"delivery": {
|
|
3178
4704
|
"registrationImport": "@awesome.me/webawesome/dist/components/tab/tab.js",
|
|
3179
4705
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3218,6 +4744,11 @@
|
|
|
3218
4744
|
"relationship": "prefer-kerf"
|
|
3219
4745
|
}
|
|
3220
4746
|
],
|
|
4747
|
+
"geometry": {
|
|
4748
|
+
"margin": "none",
|
|
4749
|
+
"border": "child",
|
|
4750
|
+
"padding": "child"
|
|
4751
|
+
},
|
|
3221
4752
|
"delivery": {
|
|
3222
4753
|
"registrationImport": "@awesome.me/webawesome/dist/components/tab-group/tab-group.js",
|
|
3223
4754
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3254,6 +4785,14 @@
|
|
|
3254
4785
|
"relationship": "prefer-kerf"
|
|
3255
4786
|
}
|
|
3256
4787
|
],
|
|
4788
|
+
"geometry": {
|
|
4789
|
+
"margin": "none",
|
|
4790
|
+
"border": "none",
|
|
4791
|
+
"padding": "conditional",
|
|
4792
|
+
"notes": [
|
|
4793
|
+
"Container-mode tab panels own the themed container inset; uncontained panels do not."
|
|
4794
|
+
]
|
|
4795
|
+
},
|
|
3257
4796
|
"delivery": {
|
|
3258
4797
|
"registrationImport": "@awesome.me/webawesome/dist/components/tab-panel/tab-panel.js",
|
|
3259
4798
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3287,6 +4826,11 @@
|
|
|
3287
4826
|
],
|
|
3288
4827
|
"recommendation": "exceptional",
|
|
3289
4828
|
"alternatives": [],
|
|
4829
|
+
"geometry": {
|
|
4830
|
+
"margin": "none",
|
|
4831
|
+
"border": "child",
|
|
4832
|
+
"padding": "child"
|
|
4833
|
+
},
|
|
3290
4834
|
"delivery": {
|
|
3291
4835
|
"registrationImport": "@awesome.me/webawesome/dist/components/tree/tree.js",
|
|
3292
4836
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3322,6 +4866,11 @@
|
|
|
3322
4866
|
],
|
|
3323
4867
|
"recommendation": "exceptional",
|
|
3324
4868
|
"alternatives": [],
|
|
4869
|
+
"geometry": {
|
|
4870
|
+
"margin": "none",
|
|
4871
|
+
"border": "self",
|
|
4872
|
+
"padding": "self"
|
|
4873
|
+
},
|
|
3325
4874
|
"delivery": {
|
|
3326
4875
|
"registrationImport": "@awesome.me/webawesome/dist/components/tree-item/tree-item.js",
|
|
3327
4876
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3353,6 +4902,11 @@
|
|
|
3353
4902
|
],
|
|
3354
4903
|
"recommendation": "supported",
|
|
3355
4904
|
"alternatives": [],
|
|
4905
|
+
"geometry": {
|
|
4906
|
+
"margin": "none",
|
|
4907
|
+
"border": "self",
|
|
4908
|
+
"padding": "self"
|
|
4909
|
+
},
|
|
3356
4910
|
"delivery": {
|
|
3357
4911
|
"registrationImport": "@awesome.me/webawesome/dist/components/badge/badge.js",
|
|
3358
4912
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3389,6 +4943,11 @@
|
|
|
3389
4943
|
"relationship": "prefer-kerf"
|
|
3390
4944
|
}
|
|
3391
4945
|
],
|
|
4946
|
+
"geometry": {
|
|
4947
|
+
"margin": "self",
|
|
4948
|
+
"border": "self",
|
|
4949
|
+
"padding": "self"
|
|
4950
|
+
},
|
|
3392
4951
|
"delivery": {
|
|
3393
4952
|
"registrationImport": "@awesome.me/webawesome/dist/components/callout/callout.js",
|
|
3394
4953
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3420,6 +4979,11 @@
|
|
|
3420
4979
|
],
|
|
3421
4980
|
"recommendation": "supported",
|
|
3422
4981
|
"alternatives": [],
|
|
4982
|
+
"geometry": {
|
|
4983
|
+
"margin": "none",
|
|
4984
|
+
"border": "self",
|
|
4985
|
+
"padding": "self"
|
|
4986
|
+
},
|
|
3423
4987
|
"delivery": {
|
|
3424
4988
|
"registrationImport": "@awesome.me/webawesome/dist/components/progress-bar/progress-bar.js",
|
|
3425
4989
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3451,6 +5015,11 @@
|
|
|
3451
5015
|
],
|
|
3452
5016
|
"recommendation": "supported",
|
|
3453
5017
|
"alternatives": [],
|
|
5018
|
+
"geometry": {
|
|
5019
|
+
"margin": "none",
|
|
5020
|
+
"border": "self",
|
|
5021
|
+
"padding": "self"
|
|
5022
|
+
},
|
|
3454
5023
|
"delivery": {
|
|
3455
5024
|
"registrationImport": "@awesome.me/webawesome/dist/components/progress-ring/progress-ring.js",
|
|
3456
5025
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3482,6 +5051,11 @@
|
|
|
3482
5051
|
],
|
|
3483
5052
|
"recommendation": "supported",
|
|
3484
5053
|
"alternatives": [],
|
|
5054
|
+
"geometry": {
|
|
5055
|
+
"margin": "none",
|
|
5056
|
+
"border": "none",
|
|
5057
|
+
"padding": "none"
|
|
5058
|
+
},
|
|
3485
5059
|
"delivery": {
|
|
3486
5060
|
"registrationImport": "@awesome.me/webawesome/dist/components/skeleton/skeleton.js",
|
|
3487
5061
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3518,6 +5092,11 @@
|
|
|
3518
5092
|
"relationship": "prefer-kerf"
|
|
3519
5093
|
}
|
|
3520
5094
|
],
|
|
5095
|
+
"geometry": {
|
|
5096
|
+
"margin": "none",
|
|
5097
|
+
"border": "none",
|
|
5098
|
+
"padding": "none"
|
|
5099
|
+
},
|
|
3521
5100
|
"delivery": {
|
|
3522
5101
|
"registrationImport": "@awesome.me/webawesome/dist/components/spinner/spinner.js",
|
|
3523
5102
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3556,6 +5135,11 @@
|
|
|
3556
5135
|
"relationship": "prefer-kerf"
|
|
3557
5136
|
}
|
|
3558
5137
|
],
|
|
5138
|
+
"geometry": {
|
|
5139
|
+
"margin": "none",
|
|
5140
|
+
"border": "self",
|
|
5141
|
+
"padding": "self"
|
|
5142
|
+
},
|
|
3559
5143
|
"delivery": {
|
|
3560
5144
|
"registrationImport": "@awesome.me/webawesome/dist/components/tag/tag.js",
|
|
3561
5145
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3598,6 +5182,11 @@
|
|
|
3598
5182
|
"relationship": "prefer-kerf"
|
|
3599
5183
|
}
|
|
3600
5184
|
],
|
|
5185
|
+
"geometry": {
|
|
5186
|
+
"margin": "none",
|
|
5187
|
+
"border": "child",
|
|
5188
|
+
"padding": "child"
|
|
5189
|
+
},
|
|
3601
5190
|
"delivery": {
|
|
3602
5191
|
"registrationImport": "@awesome.me/webawesome/dist/components/toast/toast.js",
|
|
3603
5192
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3641,6 +5230,11 @@
|
|
|
3641
5230
|
"relationship": "prefer-kerf"
|
|
3642
5231
|
}
|
|
3643
5232
|
],
|
|
5233
|
+
"geometry": {
|
|
5234
|
+
"margin": "none",
|
|
5235
|
+
"border": "self",
|
|
5236
|
+
"padding": "self"
|
|
5237
|
+
},
|
|
3644
5238
|
"delivery": {
|
|
3645
5239
|
"registrationImport": "@awesome.me/webawesome/dist/components/toast-item/toast-item.js",
|
|
3646
5240
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3674,6 +5268,11 @@
|
|
|
3674
5268
|
],
|
|
3675
5269
|
"recommendation": "supported",
|
|
3676
5270
|
"alternatives": [],
|
|
5271
|
+
"geometry": {
|
|
5272
|
+
"margin": "none",
|
|
5273
|
+
"border": "self",
|
|
5274
|
+
"padding": "self"
|
|
5275
|
+
},
|
|
3677
5276
|
"delivery": {
|
|
3678
5277
|
"registrationImport": "@awesome.me/webawesome/dist/components/tooltip/tooltip.js",
|
|
3679
5278
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3707,6 +5306,11 @@
|
|
|
3707
5306
|
],
|
|
3708
5307
|
"recommendation": "exceptional",
|
|
3709
5308
|
"alternatives": [],
|
|
5309
|
+
"geometry": {
|
|
5310
|
+
"margin": "none",
|
|
5311
|
+
"border": "self",
|
|
5312
|
+
"padding": "none"
|
|
5313
|
+
},
|
|
3710
5314
|
"delivery": {
|
|
3711
5315
|
"registrationImport": "@awesome.me/webawesome/dist/components/animated-image/animated-image.js",
|
|
3712
5316
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3740,6 +5344,11 @@
|
|
|
3740
5344
|
],
|
|
3741
5345
|
"recommendation": "supported",
|
|
3742
5346
|
"alternatives": [],
|
|
5347
|
+
"geometry": {
|
|
5348
|
+
"margin": "none",
|
|
5349
|
+
"border": "self",
|
|
5350
|
+
"padding": "none"
|
|
5351
|
+
},
|
|
3743
5352
|
"delivery": {
|
|
3744
5353
|
"registrationImport": "@awesome.me/webawesome/dist/components/avatar/avatar.js",
|
|
3745
5354
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3774,6 +5383,11 @@
|
|
|
3774
5383
|
],
|
|
3775
5384
|
"recommendation": "supported",
|
|
3776
5385
|
"alternatives": [],
|
|
5386
|
+
"geometry": {
|
|
5387
|
+
"margin": "none",
|
|
5388
|
+
"border": "self",
|
|
5389
|
+
"padding": "child"
|
|
5390
|
+
},
|
|
3777
5391
|
"delivery": {
|
|
3778
5392
|
"registrationImport": "@awesome.me/webawesome/dist/components/carousel/carousel.js",
|
|
3779
5393
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3805,6 +5419,11 @@
|
|
|
3805
5419
|
],
|
|
3806
5420
|
"recommendation": "supported",
|
|
3807
5421
|
"alternatives": [],
|
|
5422
|
+
"geometry": {
|
|
5423
|
+
"margin": "none",
|
|
5424
|
+
"border": "none",
|
|
5425
|
+
"padding": "none"
|
|
5426
|
+
},
|
|
3808
5427
|
"delivery": {
|
|
3809
5428
|
"registrationImport": "@awesome.me/webawesome/dist/components/carousel-item/carousel-item.js",
|
|
3810
5429
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3838,6 +5457,11 @@
|
|
|
3838
5457
|
],
|
|
3839
5458
|
"recommendation": "exceptional",
|
|
3840
5459
|
"alternatives": [],
|
|
5460
|
+
"geometry": {
|
|
5461
|
+
"margin": "none",
|
|
5462
|
+
"border": "self",
|
|
5463
|
+
"padding": "child"
|
|
5464
|
+
},
|
|
3841
5465
|
"delivery": {
|
|
3842
5466
|
"registrationImport": "@awesome.me/webawesome/dist/components/comparison/comparison.js",
|
|
3843
5467
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3874,6 +5498,11 @@
|
|
|
3874
5498
|
"relationship": "prefer-kerf"
|
|
3875
5499
|
}
|
|
3876
5500
|
],
|
|
5501
|
+
"geometry": {
|
|
5502
|
+
"margin": "none",
|
|
5503
|
+
"border": "none",
|
|
5504
|
+
"padding": "none"
|
|
5505
|
+
},
|
|
3877
5506
|
"delivery": {
|
|
3878
5507
|
"registrationImport": "@awesome.me/webawesome/dist/components/icon/icon.js",
|
|
3879
5508
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3905,6 +5534,11 @@
|
|
|
3905
5534
|
],
|
|
3906
5535
|
"recommendation": "supported",
|
|
3907
5536
|
"alternatives": [],
|
|
5537
|
+
"geometry": {
|
|
5538
|
+
"margin": "none",
|
|
5539
|
+
"border": "child",
|
|
5540
|
+
"padding": "child"
|
|
5541
|
+
},
|
|
3908
5542
|
"delivery": {
|
|
3909
5543
|
"registrationImport": "@awesome.me/webawesome/dist/components/markdown/markdown.js",
|
|
3910
5544
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3936,6 +5570,11 @@
|
|
|
3936
5570
|
],
|
|
3937
5571
|
"recommendation": "supported",
|
|
3938
5572
|
"alternatives": [],
|
|
5573
|
+
"geometry": {
|
|
5574
|
+
"margin": "none",
|
|
5575
|
+
"border": "self",
|
|
5576
|
+
"padding": "self"
|
|
5577
|
+
},
|
|
3939
5578
|
"delivery": {
|
|
3940
5579
|
"registrationImport": "@awesome.me/webawesome/dist/components/qr-code/qr-code.js",
|
|
3941
5580
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -3969,6 +5608,11 @@
|
|
|
3969
5608
|
],
|
|
3970
5609
|
"recommendation": "avoid",
|
|
3971
5610
|
"alternatives": [],
|
|
5611
|
+
"geometry": {
|
|
5612
|
+
"margin": "none",
|
|
5613
|
+
"border": "self",
|
|
5614
|
+
"padding": "child"
|
|
5615
|
+
},
|
|
3972
5616
|
"delivery": {
|
|
3973
5617
|
"registrationImport": "@awesome.me/webawesome/dist/components/zoomable-frame/zoomable-frame.js",
|
|
3974
5618
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4002,6 +5646,11 @@
|
|
|
4002
5646
|
],
|
|
4003
5647
|
"recommendation": "supported",
|
|
4004
5648
|
"alternatives": [],
|
|
5649
|
+
"geometry": {
|
|
5650
|
+
"margin": "none",
|
|
5651
|
+
"border": "child",
|
|
5652
|
+
"padding": "child"
|
|
5653
|
+
},
|
|
4005
5654
|
"delivery": {
|
|
4006
5655
|
"registrationImport": "@awesome.me/webawesome/dist/components/animation/animation.js",
|
|
4007
5656
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4033,6 +5682,11 @@
|
|
|
4033
5682
|
],
|
|
4034
5683
|
"recommendation": "supported",
|
|
4035
5684
|
"alternatives": [],
|
|
5685
|
+
"geometry": {
|
|
5686
|
+
"margin": "none",
|
|
5687
|
+
"border": "none",
|
|
5688
|
+
"padding": "none"
|
|
5689
|
+
},
|
|
4036
5690
|
"delivery": {
|
|
4037
5691
|
"registrationImport": "@awesome.me/webawesome/dist/components/format-bytes/format-bytes.js",
|
|
4038
5692
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4064,6 +5718,11 @@
|
|
|
4064
5718
|
],
|
|
4065
5719
|
"recommendation": "supported",
|
|
4066
5720
|
"alternatives": [],
|
|
5721
|
+
"geometry": {
|
|
5722
|
+
"margin": "none",
|
|
5723
|
+
"border": "none",
|
|
5724
|
+
"padding": "none"
|
|
5725
|
+
},
|
|
4067
5726
|
"delivery": {
|
|
4068
5727
|
"registrationImport": "@awesome.me/webawesome/dist/components/format-date/format-date.js",
|
|
4069
5728
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4095,6 +5754,11 @@
|
|
|
4095
5754
|
],
|
|
4096
5755
|
"recommendation": "supported",
|
|
4097
5756
|
"alternatives": [],
|
|
5757
|
+
"geometry": {
|
|
5758
|
+
"margin": "none",
|
|
5759
|
+
"border": "none",
|
|
5760
|
+
"padding": "none"
|
|
5761
|
+
},
|
|
4098
5762
|
"delivery": {
|
|
4099
5763
|
"registrationImport": "@awesome.me/webawesome/dist/components/format-number/format-number.js",
|
|
4100
5764
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4126,6 +5790,11 @@
|
|
|
4126
5790
|
],
|
|
4127
5791
|
"recommendation": "supported",
|
|
4128
5792
|
"alternatives": [],
|
|
5793
|
+
"geometry": {
|
|
5794
|
+
"margin": "self",
|
|
5795
|
+
"border": "self",
|
|
5796
|
+
"padding": "self"
|
|
5797
|
+
},
|
|
4129
5798
|
"delivery": {
|
|
4130
5799
|
"registrationImport": "@awesome.me/webawesome/dist/components/include/include.js",
|
|
4131
5800
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4157,6 +5826,11 @@
|
|
|
4157
5826
|
],
|
|
4158
5827
|
"recommendation": "supported",
|
|
4159
5828
|
"alternatives": [],
|
|
5829
|
+
"geometry": {
|
|
5830
|
+
"margin": "none",
|
|
5831
|
+
"border": "none",
|
|
5832
|
+
"padding": "none"
|
|
5833
|
+
},
|
|
4160
5834
|
"delivery": {
|
|
4161
5835
|
"registrationImport": "@awesome.me/webawesome/dist/components/intersection-observer/intersection-observer.js",
|
|
4162
5836
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4188,6 +5862,11 @@
|
|
|
4188
5862
|
],
|
|
4189
5863
|
"recommendation": "supported",
|
|
4190
5864
|
"alternatives": [],
|
|
5865
|
+
"geometry": {
|
|
5866
|
+
"margin": "none",
|
|
5867
|
+
"border": "none",
|
|
5868
|
+
"padding": "none"
|
|
5869
|
+
},
|
|
4191
5870
|
"delivery": {
|
|
4192
5871
|
"registrationImport": "@awesome.me/webawesome/dist/components/mutation-observer/mutation-observer.js",
|
|
4193
5872
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4221,6 +5900,11 @@
|
|
|
4221
5900
|
],
|
|
4222
5901
|
"recommendation": "supported",
|
|
4223
5902
|
"alternatives": [],
|
|
5903
|
+
"geometry": {
|
|
5904
|
+
"margin": "none",
|
|
5905
|
+
"border": "self",
|
|
5906
|
+
"padding": "self"
|
|
5907
|
+
},
|
|
4224
5908
|
"delivery": {
|
|
4225
5909
|
"registrationImport": "@awesome.me/webawesome/dist/components/popover/popover.js",
|
|
4226
5910
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4252,6 +5936,11 @@
|
|
|
4252
5936
|
],
|
|
4253
5937
|
"recommendation": "conditional",
|
|
4254
5938
|
"alternatives": [],
|
|
5939
|
+
"geometry": {
|
|
5940
|
+
"margin": "none",
|
|
5941
|
+
"border": "child",
|
|
5942
|
+
"padding": "child"
|
|
5943
|
+
},
|
|
4255
5944
|
"delivery": {
|
|
4256
5945
|
"registrationImport": "@awesome.me/webawesome/dist/components/popup/popup.js",
|
|
4257
5946
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4283,6 +5972,11 @@
|
|
|
4283
5972
|
],
|
|
4284
5973
|
"recommendation": "supported",
|
|
4285
5974
|
"alternatives": [],
|
|
5975
|
+
"geometry": {
|
|
5976
|
+
"margin": "none",
|
|
5977
|
+
"border": "child",
|
|
5978
|
+
"padding": "child"
|
|
5979
|
+
},
|
|
4286
5980
|
"delivery": {
|
|
4287
5981
|
"registrationImport": "@awesome.me/webawesome/dist/components/random-content/random-content.js",
|
|
4288
5982
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4314,6 +6008,11 @@
|
|
|
4314
6008
|
],
|
|
4315
6009
|
"recommendation": "supported",
|
|
4316
6010
|
"alternatives": [],
|
|
6011
|
+
"geometry": {
|
|
6012
|
+
"margin": "none",
|
|
6013
|
+
"border": "none",
|
|
6014
|
+
"padding": "none"
|
|
6015
|
+
},
|
|
4317
6016
|
"delivery": {
|
|
4318
6017
|
"registrationImport": "@awesome.me/webawesome/dist/components/relative-time/relative-time.js",
|
|
4319
6018
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4345,6 +6044,11 @@
|
|
|
4345
6044
|
],
|
|
4346
6045
|
"recommendation": "supported",
|
|
4347
6046
|
"alternatives": [],
|
|
6047
|
+
"geometry": {
|
|
6048
|
+
"margin": "none",
|
|
6049
|
+
"border": "none",
|
|
6050
|
+
"padding": "none"
|
|
6051
|
+
},
|
|
4348
6052
|
"delivery": {
|
|
4349
6053
|
"registrationImport": "@awesome.me/webawesome/dist/components/resize-observer/resize-observer.js",
|
|
4350
6054
|
"themeCssImport": "@kerfjs/ui/webawesome.css",
|
|
@@ -4365,13 +6069,41 @@
|
|
|
4365
6069
|
"kind": "recipe",
|
|
4366
6070
|
"source": "kerf",
|
|
4367
6071
|
"purpose": "Toolbar, navigation, content, and inspector shell with controlled resizing and explicit pane scroll owners.",
|
|
4368
|
-
"uses": [
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
6072
|
+
"uses": [
|
|
6073
|
+
"toolbar",
|
|
6074
|
+
"toolbar-text",
|
|
6075
|
+
"toolbar-control-group",
|
|
6076
|
+
"list-header",
|
|
6077
|
+
"list-item",
|
|
6078
|
+
"resize",
|
|
6079
|
+
"value-table",
|
|
6080
|
+
"layout"
|
|
6081
|
+
],
|
|
6082
|
+
"useWhen": [
|
|
6083
|
+
"A desktop workspace needs persistent chrome and user-adjustable navigation or inspector panes."
|
|
6084
|
+
],
|
|
6085
|
+
"avoidWhen": [
|
|
6086
|
+
"Use ordinary CSS grid when panes are static or the product does not need a user-operable separator."
|
|
6087
|
+
],
|
|
6088
|
+
"appOwns": [
|
|
6089
|
+
"routing",
|
|
6090
|
+
"pane visibility",
|
|
6091
|
+
"pane sizes and persistence",
|
|
6092
|
+
"workspace data"
|
|
6093
|
+
],
|
|
6094
|
+
"accessibility": [
|
|
6095
|
+
"Each pane has one scroll owner and each resize handle keeps its separator keyboard contract."
|
|
6096
|
+
],
|
|
6097
|
+
"delivery": {
|
|
6098
|
+
"sideEffects": [
|
|
6099
|
+
"lazy-recipe-css"
|
|
6100
|
+
]
|
|
6101
|
+
},
|
|
6102
|
+
"links": {
|
|
6103
|
+
"catalogRoute": "?component=recipe-app-shell",
|
|
6104
|
+
"documentation": "docs/recipes.md#desktop-application-shell",
|
|
6105
|
+
"recipe": "docs/recipes.md#desktop-application-shell"
|
|
6106
|
+
}
|
|
4375
6107
|
},
|
|
4376
6108
|
{
|
|
4377
6109
|
"id": "recipe-navigation-sidebar",
|
|
@@ -4380,13 +6112,37 @@
|
|
|
4380
6112
|
"kind": "recipe",
|
|
4381
6113
|
"source": "kerf",
|
|
4382
6114
|
"purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
|
|
4383
|
-
"uses": [
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
"
|
|
6115
|
+
"uses": [
|
|
6116
|
+
"list-header",
|
|
6117
|
+
"list-item",
|
|
6118
|
+
"toolbar",
|
|
6119
|
+
"toolbar-control-group"
|
|
6120
|
+
],
|
|
6121
|
+
"useWhen": [
|
|
6122
|
+
"A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets."
|
|
6123
|
+
],
|
|
6124
|
+
"avoidWhen": [
|
|
6125
|
+
"Use ordinary links when menu selection, section, and sidebar anatomy do not apply."
|
|
6126
|
+
],
|
|
6127
|
+
"appOwns": [
|
|
6128
|
+
"information architecture",
|
|
6129
|
+
"routing",
|
|
6130
|
+
"permissions",
|
|
6131
|
+
"disclosure state"
|
|
6132
|
+
],
|
|
6133
|
+
"accessibility": [
|
|
6134
|
+
"Native buttons retain names, current state, sequential focus, and disclosure state; rows and standalone footer actions remain at least 44px tall."
|
|
6135
|
+
],
|
|
6136
|
+
"delivery": {
|
|
6137
|
+
"sideEffects": [
|
|
6138
|
+
"lazy-recipe-css"
|
|
6139
|
+
]
|
|
6140
|
+
},
|
|
6141
|
+
"links": {
|
|
6142
|
+
"catalogRoute": "?component=recipe-navigation-sidebar",
|
|
6143
|
+
"documentation": "docs/recipes.md#navigation-sidebar",
|
|
6144
|
+
"recipe": "docs/recipes.md#navigation-sidebar"
|
|
6145
|
+
}
|
|
4390
6146
|
},
|
|
4391
6147
|
{
|
|
4392
6148
|
"id": "recipe-workspace-header",
|
|
@@ -4395,28 +6151,82 @@
|
|
|
4395
6151
|
"kind": "recipe",
|
|
4396
6152
|
"source": "kerf",
|
|
4397
6153
|
"purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
|
|
4398
|
-
"uses": [
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
|
|
6154
|
+
"uses": [
|
|
6155
|
+
"toolbar",
|
|
6156
|
+
"toolbar-control-group",
|
|
6157
|
+
"toolbar-text",
|
|
6158
|
+
"state-banner",
|
|
6159
|
+
"layout"
|
|
6160
|
+
],
|
|
6161
|
+
"useWhen": [
|
|
6162
|
+
"A workspace page needs one primary heading and a small prioritized action set."
|
|
6163
|
+
],
|
|
6164
|
+
"avoidWhen": [
|
|
6165
|
+
"Use a smaller local heading when the page does not need actions or persistent identity."
|
|
6166
|
+
],
|
|
6167
|
+
"appOwns": [
|
|
6168
|
+
"authorization",
|
|
6169
|
+
"command behavior",
|
|
6170
|
+
"breadcrumbs",
|
|
6171
|
+
"product copy"
|
|
6172
|
+
],
|
|
6173
|
+
"accessibility": [
|
|
6174
|
+
"Heading order and action focus order remain stable when controls wrap."
|
|
6175
|
+
],
|
|
6176
|
+
"delivery": {
|
|
6177
|
+
"sideEffects": [
|
|
6178
|
+
"lazy-recipe-css"
|
|
6179
|
+
]
|
|
6180
|
+
},
|
|
6181
|
+
"links": {
|
|
6182
|
+
"catalogRoute": "?component=recipe-workspace-header",
|
|
6183
|
+
"documentation": "docs/recipes.md#workspace-header",
|
|
6184
|
+
"recipe": "docs/recipes.md#workspace-header"
|
|
6185
|
+
}
|
|
4405
6186
|
},
|
|
4406
6187
|
{
|
|
4407
|
-
"id": "recipe-
|
|
4408
|
-
"name": "
|
|
6188
|
+
"id": "recipe-list-detail-dialog",
|
|
6189
|
+
"name": "List-detail dialog",
|
|
4409
6190
|
"category": "Recipes",
|
|
4410
6191
|
"kind": "recipe",
|
|
4411
6192
|
"source": "kerf",
|
|
4412
|
-
"purpose": "Production modal containing a
|
|
4413
|
-
"uses": [
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
6193
|
+
"purpose": "Production modal containing a Toolbar heading, navigable record master list, and ValueTable detail.",
|
|
6194
|
+
"uses": [
|
|
6195
|
+
"toolbar",
|
|
6196
|
+
"toolbar-control-group",
|
|
6197
|
+
"toolbar-text",
|
|
6198
|
+
"list-header",
|
|
6199
|
+
"list-item",
|
|
6200
|
+
"value-table",
|
|
6201
|
+
"wa-dialog",
|
|
6202
|
+
"wa-button"
|
|
6203
|
+
],
|
|
6204
|
+
"useWhen": [
|
|
6205
|
+
"A focused task compares several records without leaving the current workspace."
|
|
6206
|
+
],
|
|
6207
|
+
"avoidWhen": [
|
|
6208
|
+
"Use a page when the task needs a durable route or substantially more working space."
|
|
6209
|
+
],
|
|
6210
|
+
"appOwns": [
|
|
6211
|
+
"open state",
|
|
6212
|
+
"selected record",
|
|
6213
|
+
"dismiss policy",
|
|
6214
|
+
"record actions"
|
|
6215
|
+
],
|
|
6216
|
+
"accessibility": [
|
|
6217
|
+
"Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and Toolbar plus ToolbarText supply the visible hierarchy."
|
|
6218
|
+
],
|
|
6219
|
+
"delivery": {
|
|
6220
|
+
"sideEffects": [
|
|
6221
|
+
"lazy-recipe-css",
|
|
6222
|
+
"individual-custom-element-registration"
|
|
6223
|
+
]
|
|
6224
|
+
},
|
|
6225
|
+
"links": {
|
|
6226
|
+
"catalogRoute": "?component=recipe-list-detail-dialog",
|
|
6227
|
+
"documentation": "docs/recipes.md#list-detail-dialog",
|
|
6228
|
+
"recipe": "docs/recipes.md#list-detail-dialog"
|
|
6229
|
+
}
|
|
4420
6230
|
},
|
|
4421
6231
|
{
|
|
4422
6232
|
"id": "recipe-composer-form",
|
|
@@ -4424,14 +6234,44 @@
|
|
|
4424
6234
|
"category": "Recipes",
|
|
4425
6235
|
"kind": "recipe",
|
|
4426
6236
|
"source": "kerf",
|
|
4427
|
-
"purpose": "One visible publishing-form surface with
|
|
4428
|
-
"uses": [
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
6237
|
+
"purpose": "One visible publishing-form surface with Toolbar heading hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.",
|
|
6238
|
+
"uses": [
|
|
6239
|
+
"toolbar",
|
|
6240
|
+
"toolbar-control-group",
|
|
6241
|
+
"toolbar-text",
|
|
6242
|
+
"select",
|
|
6243
|
+
"state-banner",
|
|
6244
|
+
"wa-input",
|
|
6245
|
+
"wa-textarea",
|
|
6246
|
+
"wa-button",
|
|
6247
|
+
"layout"
|
|
6248
|
+
],
|
|
6249
|
+
"useWhen": [
|
|
6250
|
+
"A short form needs one coherent surface, consistent field/action rhythm, and persistent validation feedback."
|
|
6251
|
+
],
|
|
6252
|
+
"avoidWhen": [
|
|
6253
|
+
"Do not turn each form section into another visible card or use the recipe as a generic form engine or transport abstraction."
|
|
6254
|
+
],
|
|
6255
|
+
"appOwns": [
|
|
6256
|
+
"validation rules",
|
|
6257
|
+
"draft persistence",
|
|
6258
|
+
"permissions",
|
|
6259
|
+
"transport"
|
|
6260
|
+
],
|
|
6261
|
+
"accessibility": [
|
|
6262
|
+
"The form references its ToolbarText title and supporting-summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner."
|
|
6263
|
+
],
|
|
6264
|
+
"delivery": {
|
|
6265
|
+
"sideEffects": [
|
|
6266
|
+
"lazy-recipe-css",
|
|
6267
|
+
"individual-custom-element-registration"
|
|
6268
|
+
]
|
|
6269
|
+
},
|
|
6270
|
+
"links": {
|
|
6271
|
+
"catalogRoute": "?component=recipe-composer-form",
|
|
6272
|
+
"documentation": "docs/recipes.md#composer-form",
|
|
6273
|
+
"recipe": "docs/recipes.md#composer-form"
|
|
6274
|
+
}
|
|
4435
6275
|
},
|
|
4436
6276
|
{
|
|
4437
6277
|
"id": "recipe-list-workspace-states",
|
|
@@ -4440,13 +6280,40 @@
|
|
|
4440
6280
|
"kind": "recipe",
|
|
4441
6281
|
"source": "kerf",
|
|
4442
6282
|
"purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
|
|
4443
|
-
"uses": [
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
6283
|
+
"uses": [
|
|
6284
|
+
"toolbar",
|
|
6285
|
+
"toolbar-control-group",
|
|
6286
|
+
"toolbar-text",
|
|
6287
|
+
"state-banner",
|
|
6288
|
+
"empty-state",
|
|
6289
|
+
"loading-spinner",
|
|
6290
|
+
"layout"
|
|
6291
|
+
],
|
|
6292
|
+
"useWhen": [
|
|
6293
|
+
"A list surface must communicate initial load, absence, background refresh, failure, and recovery."
|
|
6294
|
+
],
|
|
6295
|
+
"avoidWhen": [
|
|
6296
|
+
"Do not replace domain rows with a generic component or use transient toasts as the only error record."
|
|
6297
|
+
],
|
|
6298
|
+
"appOwns": [
|
|
6299
|
+
"fetching",
|
|
6300
|
+
"cache age",
|
|
6301
|
+
"retry policy",
|
|
6302
|
+
"domain rows"
|
|
6303
|
+
],
|
|
6304
|
+
"accessibility": [
|
|
6305
|
+
"Busy, polite, and assertive states use the appropriate production feedback semantics."
|
|
6306
|
+
],
|
|
6307
|
+
"delivery": {
|
|
6308
|
+
"sideEffects": [
|
|
6309
|
+
"lazy-recipe-css"
|
|
6310
|
+
]
|
|
6311
|
+
},
|
|
6312
|
+
"links": {
|
|
6313
|
+
"catalogRoute": "?component=recipe-list-workspace-states",
|
|
6314
|
+
"documentation": "docs/recipes.md#list-workspace-states",
|
|
6315
|
+
"recipe": "docs/recipes.md#list-workspace-states"
|
|
6316
|
+
}
|
|
4450
6317
|
},
|
|
4451
6318
|
{
|
|
4452
6319
|
"id": "recipe-compact-toolbar",
|
|
@@ -4455,13 +6322,164 @@
|
|
|
4455
6322
|
"kind": "recipe",
|
|
4456
6323
|
"source": "kerf",
|
|
4457
6324
|
"purpose": "A compact toolbar that distinguishes grouped commands, a visible exclusive choice, a longer Select, and one ordinary action.",
|
|
4458
|
-
"uses": [
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
6325
|
+
"uses": [
|
|
6326
|
+
"toolbar",
|
|
6327
|
+
"toolbar-text",
|
|
6328
|
+
"toolbar-control-group",
|
|
6329
|
+
"segmented-control",
|
|
6330
|
+
"select",
|
|
6331
|
+
"lucide-icon"
|
|
6332
|
+
],
|
|
6333
|
+
"useWhen": [
|
|
6334
|
+
"A dense workspace toolbar mixes a few distinct control semantics."
|
|
6335
|
+
],
|
|
6336
|
+
"avoidWhen": [
|
|
6337
|
+
"Do not group unrelated actions or use buttons to imitate selection controls."
|
|
6338
|
+
],
|
|
6339
|
+
"appOwns": [
|
|
6340
|
+
"controlled values",
|
|
6341
|
+
"actions",
|
|
6342
|
+
"persistence",
|
|
6343
|
+
"responsive priority"
|
|
6344
|
+
],
|
|
6345
|
+
"accessibility": [
|
|
6346
|
+
"Each control retains its own native name, pressed/value state, and keyboard contract."
|
|
6347
|
+
],
|
|
6348
|
+
"delivery": {
|
|
6349
|
+
"sideEffects": [
|
|
6350
|
+
"lazy-recipe-css",
|
|
6351
|
+
"individual-custom-element-registration"
|
|
6352
|
+
]
|
|
6353
|
+
},
|
|
6354
|
+
"links": {
|
|
6355
|
+
"catalogRoute": "?component=recipe-compact-toolbar",
|
|
6356
|
+
"documentation": "docs/recipes.md#compact-toolbar-choices-and-actions",
|
|
6357
|
+
"recipe": "docs/recipes.md#compact-toolbar-choices-and-actions"
|
|
6358
|
+
}
|
|
6359
|
+
},
|
|
6360
|
+
{
|
|
6361
|
+
"id": "recipe-navigation-stack",
|
|
6362
|
+
"name": "Navigation stack",
|
|
6363
|
+
"category": "Recipes",
|
|
6364
|
+
"kind": "recipe",
|
|
6365
|
+
"source": "kerf",
|
|
6366
|
+
"purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
|
|
6367
|
+
"uses": [
|
|
6368
|
+
"list-header",
|
|
6369
|
+
"list-item",
|
|
6370
|
+
"lucide-icon",
|
|
6371
|
+
"layout"
|
|
6372
|
+
],
|
|
6373
|
+
"useWhen": [
|
|
6374
|
+
"A flow drills from a list into detail and back on one pane, at any device size or inside a dialog."
|
|
6375
|
+
],
|
|
6376
|
+
"avoidWhen": [
|
|
6377
|
+
"Use SplitView when a list and its detail should show together on roomy classes."
|
|
6378
|
+
],
|
|
6379
|
+
"appOwns": [
|
|
6380
|
+
"the stack (a signal of views)",
|
|
6381
|
+
"selection",
|
|
6382
|
+
"routing",
|
|
6383
|
+
"data"
|
|
6384
|
+
],
|
|
6385
|
+
"accessibility": [
|
|
6386
|
+
"The back control is a real button; reduced motion collapses the slide to instant."
|
|
6387
|
+
],
|
|
6388
|
+
"delivery": {
|
|
6389
|
+
"sideEffects": [
|
|
6390
|
+
"lazy-recipe-css"
|
|
6391
|
+
]
|
|
6392
|
+
},
|
|
6393
|
+
"links": {
|
|
6394
|
+
"catalogRoute": "?component=recipe-navigation-stack",
|
|
6395
|
+
"documentation": "docs/recipes.md#navigation-stack",
|
|
6396
|
+
"recipe": "docs/recipes.md#navigation-stack"
|
|
6397
|
+
}
|
|
6398
|
+
},
|
|
6399
|
+
{
|
|
6400
|
+
"id": "recipe-loading-inspector",
|
|
6401
|
+
"name": "Loading inspector",
|
|
6402
|
+
"category": "Recipes",
|
|
6403
|
+
"kind": "recipe",
|
|
6404
|
+
"source": "kerf",
|
|
6405
|
+
"purpose": "A record inspector whose per-record values load asynchronously — every value-bearing component takes a shared placeholder flag, so the same chrome renders a faithful loading state and then the populated record.",
|
|
6406
|
+
"uses": [
|
|
6407
|
+
"toolbar",
|
|
6408
|
+
"toolbar-control-group",
|
|
6409
|
+
"toolbar-text",
|
|
6410
|
+
"value-table",
|
|
6411
|
+
"select",
|
|
6412
|
+
"segmented-control",
|
|
6413
|
+
"list-item",
|
|
6414
|
+
"state-banner",
|
|
6415
|
+
"skeleton",
|
|
6416
|
+
"lucide-icon"
|
|
6417
|
+
],
|
|
6418
|
+
"useWhen": [
|
|
6419
|
+
"A detail or inspector view must render its real chrome while its per-record values are still loading, then swap to the populated record without duplicating markup."
|
|
6420
|
+
],
|
|
6421
|
+
"avoidWhen": [
|
|
6422
|
+
"Do not hand-build a separate empty-state layout, and do not use it for known progress — use LoadingSpinner for that."
|
|
6423
|
+
],
|
|
6424
|
+
"appOwns": [
|
|
6425
|
+
"loading lifecycle",
|
|
6426
|
+
"which values are unknown",
|
|
6427
|
+
"fetching, transport, and domain data"
|
|
6428
|
+
],
|
|
6429
|
+
"accessibility": [
|
|
6430
|
+
"Each component marks itself aria-busy and disables its own controls while loading; the composition keeps labels and structure stable across the transition."
|
|
6431
|
+
],
|
|
6432
|
+
"delivery": {
|
|
6433
|
+
"sideEffects": [
|
|
6434
|
+
"lazy-recipe-css",
|
|
6435
|
+
"individual-custom-element-registration"
|
|
6436
|
+
]
|
|
6437
|
+
},
|
|
6438
|
+
"links": {
|
|
6439
|
+
"catalogRoute": "?component=recipe-loading-inspector",
|
|
6440
|
+
"documentation": "docs/recipes.md#loading-inspector",
|
|
6441
|
+
"recipe": "docs/recipes.md#loading-inspector"
|
|
6442
|
+
}
|
|
6443
|
+
},
|
|
6444
|
+
{
|
|
6445
|
+
"id": "recipe-collapsible-sidebar",
|
|
6446
|
+
"name": "Collapsible sidebar",
|
|
6447
|
+
"category": "Recipes",
|
|
6448
|
+
"kind": "recipe",
|
|
6449
|
+
"source": "kerf",
|
|
6450
|
+
"purpose": "A mini app frame whose left navigation rail and bottom activity drawer are standalone CollapsiblePanels driven by wireSidebar: per-side collapse/expand toggles, focus move-in and restore, a dismissable compact overlay, and per-panel persistence.",
|
|
6451
|
+
"uses": [
|
|
6452
|
+
"list-header",
|
|
6453
|
+
"list-item",
|
|
6454
|
+
"toolbar",
|
|
6455
|
+
"toolbar-control-group",
|
|
6456
|
+
"toolbar-text"
|
|
6457
|
+
],
|
|
6458
|
+
"useWhen": [
|
|
6459
|
+
"A rail or drawer must collapse and expand outside a full Workbench shell, keeping the app's collapsed signals, sizes, and content while the wire owns toggle, focus, the compact overlay, and persistence."
|
|
6460
|
+
],
|
|
6461
|
+
"avoidWhen": [
|
|
6462
|
+
"Use the Workbench layout when the whole screen is a three-pane shell; use an ordinary always-visible sidebar when it never collapses."
|
|
6463
|
+
],
|
|
6464
|
+
"appOwns": [
|
|
6465
|
+
"each panel's collapsed signal",
|
|
6466
|
+
"panel sizes",
|
|
6467
|
+
"routing and selection",
|
|
6468
|
+
"content"
|
|
6469
|
+
],
|
|
6470
|
+
"accessibility": [
|
|
6471
|
+
"Each panel is a labeled aside that is aria-hidden while collapsed; toggles carry aria-expanded and the standard per-side glyph; while compact an open panel is an overlay with a backdrop, Escape and backdrop-click dismiss, and a trapped Tab ring."
|
|
6472
|
+
],
|
|
6473
|
+
"delivery": {
|
|
6474
|
+
"sideEffects": [
|
|
6475
|
+
"lazy-recipe-css"
|
|
6476
|
+
]
|
|
6477
|
+
},
|
|
6478
|
+
"links": {
|
|
6479
|
+
"catalogRoute": "?component=recipe-collapsible-sidebar",
|
|
6480
|
+
"documentation": "docs/recipes.md#collapsible-sidebar",
|
|
6481
|
+
"recipe": "docs/recipes.md#collapsible-sidebar"
|
|
6482
|
+
}
|
|
4465
6483
|
}
|
|
4466
6484
|
]
|
|
4467
6485
|
}
|