@kerfjs/ui 5.0.0-beta.106 → 5.0.0-beta.108
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 +2 -1
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/application-ui-profile.defaults.json +6 -1
- package/ai/component-catalog.json +184 -39
- package/ai/component-composition-rules.json +20 -2
- package/ai/component-composition.d.ts +11 -0
- package/ai/component-composition.json +126 -21
- package/ai/component-composition.schema.json +32 -0
- package/ai/components/README.md +3 -2
- package/ai/components/button.md +9 -6
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +3 -2
- package/ai/components/chip.md +1 -0
- package/ai/components/color-picker.md +10 -7
- package/ai/components/disclosure.md +6 -1
- package/ai/components/foundation.md +1 -1
- package/ai/components/list-detail-dialog.md +1 -1
- package/ai/components/list.md +1 -1
- package/ai/components/message-composer.md +2 -1
- package/ai/components/radio-group.md +4 -3
- package/ai/components/segmented-control.md +1 -0
- package/ai/components/split-button.md +5 -2
- package/ai/components/surface-scaffold.md +3 -1
- package/ai/components/switch.md +1 -1
- package/ai/components/text-field.md +3 -1
- package/ai/components/text.md +2 -0
- package/ai/components/toolbar-control-group.md +1 -0
- package/ai/components/toolbar.md +1 -1
- package/ai/components/wa-checkbox-group.md +5 -5
- package/ai/components/workbench-dialog.md +1 -1
- package/ai/public-api-signatures-v1.md +258 -35
- package/ai/skill.md +82 -65
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/button.d.ts +18 -5
- package/dist/button.js +1 -1
- package/dist/catalog.js +11 -10
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox-group.d.ts +70 -0
- package/dist/checkbox-group.js +7 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/chip.d.ts +20 -2
- package/dist/chip.js +2 -1
- package/dist/{chunk-SQ2Q3OQI.js → chunk-2LM3PYHA.js} +2 -2
- package/dist/{chunk-SQ2Q3OQI.js.map → chunk-2LM3PYHA.js.map} +1 -1
- package/dist/{chunk-HYORKKYP.js → chunk-3VZ6SFD4.js} +1 -1
- package/dist/chunk-3VZ6SFD4.js.map +1 -0
- package/dist/{chunk-EKBMUXFV.js → chunk-3Z7N2NAZ.js} +141 -54
- package/dist/chunk-3Z7N2NAZ.js.map +1 -0
- package/dist/{chunk-23PPPNH6.js → chunk-4OV272LF.js} +2 -2
- package/dist/{chunk-23PPPNH6.js.map → chunk-4OV272LF.js.map} +1 -1
- package/dist/{chunk-2PXZBFEC.js → chunk-5J6Z4BWY.js} +1 -1
- package/dist/{chunk-2PXZBFEC.js.map → chunk-5J6Z4BWY.js.map} +1 -1
- package/dist/{chunk-TAHR457X.js → chunk-6CDILXF4.js} +5 -1
- package/dist/chunk-6CDILXF4.js.map +1 -0
- package/dist/{chunk-DDSCVEO5.js → chunk-CPSGUGAY.js} +6 -6
- package/dist/{chunk-DDSCVEO5.js.map → chunk-CPSGUGAY.js.map} +1 -1
- package/dist/{chunk-C3RLKKFQ.js → chunk-EYDXFOSH.js} +13 -8
- package/dist/chunk-EYDXFOSH.js.map +1 -0
- package/dist/{chunk-PE2KPZDW.js → chunk-HDXUHLTQ.js} +7 -2
- package/dist/chunk-HDXUHLTQ.js.map +1 -0
- package/dist/chunk-HU5IHXCI.js +73 -0
- package/dist/chunk-HU5IHXCI.js.map +1 -0
- package/dist/{chunk-DF2YKGIX.js → chunk-JCCN3U6X.js} +2 -2
- package/dist/{chunk-DF2YKGIX.js.map → chunk-JCCN3U6X.js.map} +1 -1
- package/dist/{chunk-UTCAOOXU.js → chunk-KPINJHIC.js} +8 -2
- package/dist/chunk-KPINJHIC.js.map +1 -0
- package/dist/{chunk-N7MBGONH.js → chunk-LMHN2TJL.js} +22 -2
- package/dist/chunk-LMHN2TJL.js.map +1 -0
- package/dist/{chunk-NS2TBYM4.js → chunk-LZUUUHNH.js} +7 -3
- package/dist/chunk-LZUUUHNH.js.map +1 -0
- package/dist/{chunk-GCAK23PU.js → chunk-MVKHSAKE.js} +2 -2
- package/dist/{chunk-GCAK23PU.js.map → chunk-MVKHSAKE.js.map} +1 -1
- package/dist/{chunk-OY2MXIBB.js → chunk-NB6POCFH.js} +3 -1
- package/dist/chunk-NB6POCFH.js.map +1 -0
- package/dist/{chunk-ECFCAKWE.js → chunk-NR6O74ST.js} +5 -1
- package/dist/chunk-NR6O74ST.js.map +1 -0
- package/dist/{chunk-7W3GKMN4.js → chunk-OQP3PFKQ.js} +7 -4
- package/dist/chunk-OQP3PFKQ.js.map +1 -0
- package/dist/{chunk-FKKJHGN5.js → chunk-P7EJ4CAD.js} +2 -2
- package/dist/{chunk-FKKJHGN5.js.map → chunk-P7EJ4CAD.js.map} +1 -1
- package/dist/{chunk-ZXZAECHZ.js → chunk-SOFPUW3O.js} +4 -4
- package/dist/{chunk-ZXZAECHZ.js.map → chunk-SOFPUW3O.js.map} +1 -1
- package/dist/{chunk-WJKHLOP5.js → chunk-TI2GV36S.js} +8 -2
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-QLA25V2K.js → chunk-WPNIKZMJ.js} +15 -1
- package/dist/chunk-WPNIKZMJ.js.map +1 -0
- package/dist/{chunk-FG6U7KQQ.js → chunk-WSEJ2FDE.js} +4 -4
- package/dist/{chunk-FG6U7KQQ.js.map → chunk-WSEJ2FDE.js.map} +1 -1
- package/dist/{chunk-ACUKTVS3.js → chunk-XWNXGFX3.js} +52 -42
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/{chunk-WU57BYYM.js → chunk-YVZCKXR3.js} +8 -2
- package/dist/chunk-YVZCKXR3.js.map +1 -0
- package/dist/{chunk-CMLPFIC5.js → chunk-ZN7KUMPY.js} +3 -1
- package/dist/chunk-ZN7KUMPY.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/color-picker.d.ts +30 -5
- package/dist/color-picker.js +1 -1
- package/dist/disclosure.d.ts +13 -4
- package/dist/disclosure.js.map +1 -1
- package/dist/help-tags-register.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +24 -23
- package/dist/list-action-row.js +1 -1
- package/dist/list-detail-dialog.d.ts +7 -1
- package/dist/list-detail-dialog.js +7 -5
- package/dist/list-detail-dialog.js.map +1 -1
- package/dist/list-header.d.ts +8 -1
- package/dist/list-header.js +1 -1
- package/dist/list.d.ts +7 -1
- package/dist/list.js +1 -1
- package/dist/message-composer.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/popup-menu-register.js +2 -2
- package/dist/popup-menu.d.ts +15 -5
- package/dist/popup-menu.js +1 -1
- package/dist/segmented-control.d.ts +3 -1
- package/dist/segmented-control.js +1 -1
- package/dist/select-register.js +3 -3
- package/dist/split-button.d.ts +14 -2
- package/dist/split-button.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/styles/anchored-surface.css +3 -0
- package/dist/styles/button.css +57 -2
- package/dist/styles/catalog/components/catalog-example.css +55 -18
- package/dist/styles/checkbox-group.css +63 -0
- package/dist/styles/checkbox.css +7 -6
- package/dist/styles/color-picker.css +69 -34
- package/dist/styles/components/actions/button/button.css +57 -2
- package/dist/styles/components/actions/split-button/split-button.css +51 -5
- package/dist/styles/components/actions/toolbar/toolbar.css +9 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +29 -1
- package/dist/styles/components/collections/framed-list/framed-list.css +6 -0
- package/dist/styles/components/collections/list/list.css +6 -0
- package/dist/styles/components/collections/list-header/list-header.css +7 -0
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +3 -0
- package/dist/styles/components/forms/checkbox/checkbox.css +7 -6
- package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +69 -34
- package/dist/styles/components/forms/radio-group/radio-group.css +7 -5
- package/dist/styles/components/forms/select/select.css +6 -2
- package/dist/styles/components/forms/switch/switch.css +3 -3
- package/dist/styles/components/layout/pane/pane.css +24 -0
- package/dist/styles/components/layout/workbench/workbench.css +4 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +77 -1
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +6 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +17 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +30 -0
- package/dist/styles/components/surfaces/disclosure/disclosure.css +38 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +3 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +8 -0
- package/dist/styles/components/typography/text/text.css +10 -0
- package/dist/styles/content-item.css +30 -0
- package/dist/styles/disclosure.css +38 -0
- package/dist/styles/foundation.css +78 -13
- package/dist/styles/framed-list.css +6 -0
- package/dist/styles/list-header.css +7 -0
- package/dist/styles/list.css +6 -0
- package/dist/styles/nav-stack.css +77 -1
- package/dist/styles/pane.css +24 -0
- package/dist/styles/radio-group.css +7 -5
- package/dist/styles/select.css +6 -2
- package/dist/styles/split-button.css +51 -5
- package/dist/styles/styles.css +1 -0
- package/dist/styles/sunken-panel.css +3 -0
- package/dist/styles/surface-scaffold.css +8 -0
- package/dist/styles/switch.css +3 -3
- package/dist/styles/tab-bar.css +6 -0
- package/dist/styles/tab-navigator.css +17 -0
- package/dist/styles/text.css +10 -0
- package/dist/styles/toolbar-control-group.css +29 -1
- package/dist/styles/toolbar.css +9 -0
- package/dist/styles/webawesome.css +56 -12
- package/dist/styles/workbench.css +4 -0
- package/dist/surface-scaffold.d.ts +15 -1
- package/dist/surface-scaffold.js +1 -1
- package/dist/text-field.d.ts +7 -1
- package/dist/text-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +8 -2
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar.d.ts +6 -1
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-color-fields.js +2 -2
- package/dist/wire-color-pickers.d.ts +4 -3
- package/dist/wire-color-pickers.js +1 -1
- package/dist/wire-comboboxes.js +1 -1
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench-dialog.d.ts +11 -2
- package/dist/workbench-dialog.js +6 -3
- package/dist/workbench-dialog.js.map +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +58 -3
- package/docs/anchored-surface.md +6 -1
- package/docs/catalog.md +26 -1
- package/docs/color-picker.md +39 -8
- package/docs/component-contract.md +47 -3
- package/docs/component-selection.md +58 -21
- package/docs/design/templates/button/full-width-dark.svg +1 -0
- package/docs/design/templates/button/full-width.svg +1 -0
- package/docs/design/templates/button/tones-dark.svg +1 -1
- package/docs/design/templates/button/tones.svg +1 -1
- package/docs/design/templates/button-dark.svg +1 -1
- package/docs/design/templates/button.svg +1 -1
- package/docs/design/templates/checkbox/error-dark.svg +1 -1
- package/docs/design/templates/checkbox/error.svg +1 -1
- package/docs/design/templates/checkbox/states-dark.svg +1 -1
- package/docs/design/templates/checkbox/states.svg +1 -1
- package/docs/design/templates/checkbox-dark.svg +1 -1
- package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical.svg +1 -0
- package/docs/design/templates/checkbox-group-dark.svg +1 -0
- package/docs/design/templates/checkbox-group.svg +1 -0
- package/docs/design/templates/checkbox.svg +1 -1
- package/docs/design/templates/color-picker/gray-dark.svg +1 -1
- package/docs/design/templates/color-picker/gray.svg +1 -1
- package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
- package/docs/design/templates/color-picker/hsb.svg +1 -0
- package/docs/design/templates/color-picker/rgb-dark.svg +1 -1
- package/docs/design/templates/color-picker/rgb.svg +1 -1
- package/docs/design/templates/color-picker-dark.svg +1 -1
- package/docs/design/templates/color-picker.svg +1 -1
- package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
- package/docs/design/templates/disclosure/embedded.svg +1 -0
- package/docs/design/templates/disclosure-dark.svg +1 -1
- package/docs/design/templates/disclosure.svg +1 -1
- package/docs/design/templates/radio-group/horizontal-dark.svg +1 -1
- package/docs/design/templates/radio-group/horizontal.svg +1 -1
- package/docs/design/templates/radio-group/vertical-dark.svg +1 -1
- package/docs/design/templates/radio-group/vertical.svg +1 -1
- package/docs/design/templates/radio-group-dark.svg +1 -1
- package/docs/design/templates/radio-group.svg +1 -1
- package/docs/design/templates/split-button/full-width-dark.svg +1 -0
- package/docs/design/templates/split-button/full-width.svg +1 -0
- package/docs/design/templates/split-button/pill-dark.svg +1 -0
- package/docs/design/templates/split-button/pill.svg +1 -0
- package/docs/design/templates/split-button/states-dark.svg +1 -0
- package/docs/design/templates/split-button/states.svg +1 -0
- package/docs/design/templates/split-button/tones-dark.svg +1 -0
- package/docs/design/templates/split-button/tones.svg +1 -0
- package/docs/design/templates/split-button-dark.svg +1 -0
- package/docs/design/templates/split-button.svg +1 -0
- package/docs/design/templates/switch/states-dark.svg +1 -1
- package/docs/design/templates/switch/states.svg +1 -1
- package/docs/design/templates/switch-dark.svg +1 -1
- package/docs/design/templates/switch.svg +1 -1
- package/docs/design/templates/text-field/number-dark.svg +1 -0
- package/docs/design/templates/text-field/number.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -1
- package/docs/design/templates/text-field.svg +1 -1
- package/docs/design/templates.md +10 -3
- package/docs/disclosure.md +34 -0
- package/docs/layout.md +16 -5
- package/docs/list-detail-dialog.md +4 -0
- package/docs/nav-stack.md +6 -2
- package/docs/surface-scaffold.md +6 -2
- package/docs/ui-doctor.md +16 -4
- package/docs/webawesome-migration.md +3 -1
- package/docs/webawesome-theme.md +56 -18
- package/docs/workbench-dialog.md +4 -1
- package/docs/workbench.md +7 -1
- package/docs/writing.md +3 -3
- package/doctor/copy-capitalization-checks.mjs +10 -7
- package/llms.txt +65 -23
- package/package.json +7 -1
- package/dist/chunk-7W3GKMN4.js.map +0 -1
- package/dist/chunk-ACUKTVS3.js.map +0 -1
- package/dist/chunk-C3RLKKFQ.js.map +0 -1
- package/dist/chunk-CMLPFIC5.js.map +0 -1
- package/dist/chunk-ECFCAKWE.js.map +0 -1
- package/dist/chunk-EKBMUXFV.js.map +0 -1
- package/dist/chunk-HYORKKYP.js.map +0 -1
- package/dist/chunk-N7MBGONH.js.map +0 -1
- package/dist/chunk-NS2TBYM4.js.map +0 -1
- package/dist/chunk-OY2MXIBB.js.map +0 -1
- package/dist/chunk-PE2KPZDW.js.map +0 -1
- package/dist/chunk-QLA25V2K.js.map +0 -1
- package/dist/chunk-TAHR457X.js.map +0 -1
- package/dist/chunk-UTCAOOXU.js.map +0 -1
- package/dist/chunk-WJKHLOP5.js.map +0 -1
- package/dist/chunk-WU57BYYM.js.map +0 -1
package/README.md
CHANGED
|
@@ -280,6 +280,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
|
|
|
280
280
|
| `TextField` | `@kerfjs/ui/text-field` | `@kerfjs/ui/text-field.css` |
|
|
281
281
|
| `wireTextFields` | `@kerfjs/ui/wire-text-fields` | — |
|
|
282
282
|
| `Checkbox` | `@kerfjs/ui/checkbox` | `@kerfjs/ui/checkbox.css` |
|
|
283
|
+
| `CheckboxGroup` | `@kerfjs/ui/checkbox-group` | `@kerfjs/ui/checkbox-group.css` |
|
|
283
284
|
| `wireCheckboxes` | `@kerfjs/ui/wire-checkboxes` | — |
|
|
284
285
|
| `RadioGroup` | `@kerfjs/ui/radio-group` | `@kerfjs/ui/radio-group.css` |
|
|
285
286
|
| `Switch` | `@kerfjs/ui/switch` | `@kerfjs/ui/switch.css` |
|
|
@@ -867,7 +868,7 @@ import "@kerfjs/ui/popup-menu/register";
|
|
|
867
868
|
|
|
868
869
|
`select/register` defines the form-associated `kui-select` root and wires every `Select` in the document; `popup-menu/register` wires every `PopupMenu` (opening, keyboard navigation, submenus, the `kui-menu-select` event, and focus return). That boundary keeps custom-element and document-listener side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it, and also prove that no public entry except `@kerfjs/ui/webawesome.css` pulls in Web Awesome. Either registration also installs help tags: an icon-only Select, PopupMenu, or `aria-label`-named `<button>` in a `ToolbarControlGroup` shows its name in an `aria-hidden` tooltip on hover and keyboard focus. A toolbar with icon-only buttons but neither control imports `@kerfjs/ui/help-tags/register`, which registers only the tooltip.
|
|
869
870
|
|
|
870
|
-
`PopupMenu` items may include `submenu` children, `checked` choices, a leading `icon`, trailing `details`, `disabledReason`, and a `danger` tone. The app owns choice state and dispatches each item's `action`. For a right-click menu, set `context: true`, a `label`, and `anchor={pointSignal.value}`; the app's `contextmenu` handler stores `{ x: event.clientX, y: event.clientY }` in that signal and calls `openPopupMenu(menu)`. The menu renders its own zero-footprint anchor host and keeps the point across re-renders, so it needs no wrapper or CSS (`openPopupMenuAt(menu, x, y)` still opens a menu rendered without `anchor`); `closePopupMenu(menu)` closes it programmatically. See [component selection](docs/component-selection.md#popup-menu-migration) for examples.
|
|
871
|
+
`PopupMenu` items may include `submenu` children, `checked` choices, a leading `icon`, trailing `details`, `disabledReason`, and a `danger` tone. The app owns choice state and dispatches each item's `action`. For a right-click menu, set `context: true`, a `label`, and `anchor={pointSignal.value}`; the app's `contextmenu` handler stores `{ x: event.clientX, y: event.clientY }` in that signal and calls `openPopupMenu(menu)`. The menu renders its own zero-footprint anchor host and keeps the point across re-renders, so it needs no wrapper or CSS (`openPopupMenuAt(menu, x, y, { placement? })` still opens a menu rendered without `anchor`); `closePopupMenu(menu)` closes it programmatically. See [component selection](docs/component-selection.md#popup-menu-migration) for examples.
|
|
871
872
|
Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
|
|
872
873
|
nonempty visible label takes precedence when both are supplied. Kerf names the
|
|
873
874
|
native trigger without adding visible label spacing; this also works with
|
|
@@ -90,9 +90,14 @@
|
|
|
90
90
|
},
|
|
91
91
|
"boolean-option": {
|
|
92
92
|
"preferred": "@kerfjs/ui:checkbox",
|
|
93
|
-
"avoid": ["@kerfjs/ui:wa-checkbox"
|
|
93
|
+
"avoid": ["@kerfjs/ui:wa-checkbox"],
|
|
94
94
|
"rationale": "Render Checkbox, a native checkbox drawn as a Kerf box."
|
|
95
95
|
},
|
|
96
|
+
"multiple-option": {
|
|
97
|
+
"preferred": "@kerfjs/ui:checkbox-group",
|
|
98
|
+
"avoid": ["@kerfjs/ui:wa-checkbox-group"],
|
|
99
|
+
"rationale": "Render CheckboxGroup, a native fieldset of Checkboxes with a choices array, laid out like RadioGroup."
|
|
100
|
+
},
|
|
96
101
|
"exclusive-option": {
|
|
97
102
|
"preferred": "@kerfjs/ui:radio-group",
|
|
98
103
|
"avoid": ["@kerfjs/ui:wa-radio-group", "@kerfjs/ui:wa-radio"],
|
|
@@ -115,7 +115,8 @@
|
|
|
115
115
|
"quiet, solid, or outline appearance",
|
|
116
116
|
"pill or rounded shape",
|
|
117
117
|
"compact or default size",
|
|
118
|
-
"removable, link, action, or plain, enabled or disabled"
|
|
118
|
+
"removable, link, action, or plain, enabled or disabled",
|
|
119
|
+
"rootAttributes: safe data-* identity on the plain, link, or action root"
|
|
119
120
|
],
|
|
120
121
|
"accessibility": [
|
|
121
122
|
"The remove control is a native button and requires an action and a specific removeLabel. A disabled chip disables that button and removes it from keyboard interaction.",
|
|
@@ -416,6 +417,9 @@
|
|
|
416
417
|
"--kui-color-surface-lowered",
|
|
417
418
|
"--kui-sunken-texture",
|
|
418
419
|
"--kui-sunken-surface",
|
|
420
|
+
"--kui-color-surface-current",
|
|
421
|
+
"--kui-color-surface-current-region",
|
|
422
|
+
"--kui-color-surface-current-tint",
|
|
419
423
|
"--kui-chrome-material",
|
|
420
424
|
"--kui-chrome-material-raised",
|
|
421
425
|
"--kui-chrome-material-filter",
|
|
@@ -484,7 +488,8 @@
|
|
|
484
488
|
"--kui-focus-ring",
|
|
485
489
|
"--kui-shadow-s",
|
|
486
490
|
"--kui-shadow-m",
|
|
487
|
-
"--kui-shadow-l"
|
|
491
|
+
"--kui-shadow-l",
|
|
492
|
+
"--kui-color-brand"
|
|
488
493
|
],
|
|
489
494
|
"links": {
|
|
490
495
|
"catalogRoute": "?component=foundation",
|
|
@@ -1788,7 +1793,7 @@
|
|
|
1788
1793
|
],
|
|
1789
1794
|
"variants": [
|
|
1790
1795
|
"no dividers (default)",
|
|
1791
|
-
"scroll dividers when named as wireScrollDividers targets chrome",
|
|
1796
|
+
"scroll dividers when named as wireScrollDividers targets chrome (by its id)",
|
|
1792
1797
|
"top/right/bottom/left divider combinations",
|
|
1793
1798
|
"centered content",
|
|
1794
1799
|
"stacked zones at compact or narrow widths",
|
|
@@ -1967,6 +1972,7 @@
|
|
|
1967
1972
|
"standard, compact, or list-zero dropdown menu inset",
|
|
1968
1973
|
"visible, horizontally scrollable, or whole-action wrapping overflow",
|
|
1969
1974
|
"always visible or compact-only responsive visibility",
|
|
1975
|
+
"yield to an expanded trailing sibling at 480px, or exactly while a trailing-priority Toolbar row is active (yield-to-priority-row)",
|
|
1970
1976
|
"relocate on panel collapse",
|
|
1971
1977
|
"avatar scrim",
|
|
1972
1978
|
"contained avatar background on a single group or selected multi-button highlight",
|
|
@@ -2168,6 +2174,7 @@
|
|
|
2168
2174
|
"small, medium, or large dialog",
|
|
2169
2175
|
"data-* rootAttributes (a data-key) so sibling dialogs morph by identity",
|
|
2170
2176
|
"modal, side-sheet, fullscreen, or bottom-sheet dialog",
|
|
2177
|
+
"alert dialog (alert): role=\"alertdialog\" on the native dialog, described by its message through describedBy",
|
|
2171
2178
|
"bottom sheet attached to the bottom edge: square bottom corners, safe-area and virtual-keyboard clearance behind the panel, slide (or standard) enter and exit motion, and an optional resizable top grabber bounded by minHeight and maxHeight",
|
|
2172
2179
|
"typed modal preferred width, viewport gutter, and maximum height, including viewport cap",
|
|
2173
2180
|
"definite viewport-bounded modal height and a fill body layout for one child",
|
|
@@ -2183,12 +2190,13 @@
|
|
|
2183
2190
|
"core kerfjs/overlay confirm/prompt/form/choice as a bottom sheet styled by @kerfjs/ui/overlay-sheet.css",
|
|
2184
2191
|
"resizable core kerfjs/overlay bottom sheet: the kui-overlay-sheet-resizable class plus wireOverlaySheets adds the resizable DialogSurface sheet grabber",
|
|
2185
2192
|
"header with label text or heading content, headerActions, a close button, and an optional footer; withoutHeader for content that owns its heading and close control",
|
|
2193
|
+
"accessible description by describedBy: the heading ToolbarText descriptionId or app-owned body summary copy",
|
|
2186
2194
|
"light dismiss (a backdrop press closes; otherwise the panel pulses)"
|
|
2187
2195
|
],
|
|
2188
2196
|
"accessibility": [
|
|
2189
2197
|
"DialogSurface is a native <dialog> opened modally (showModal): it is in the top layer, the rest of the page is inert, focus stays inside, and it returns to the opener on close. Focus starts on an autofocus element, otherwise on the panel.",
|
|
2190
2198
|
"Name it with label (also its title text) or labelledBy (the id of a heading, such as a ToolbarText). The close button is named Close (closeLabel) and Escape asks to close; the cancelable kui-request-close event reports source close-button, escape, or backdrop.",
|
|
2191
|
-
"Name a PopoverDialogSurface with label or labelledBy
|
|
2199
|
+
"Name a PopoverDialogSurface with label or labelledBy. Describe either surface with describedBy (rendered as aria-describedby on the dialog root), usually the heading ToolbarText descriptionId or app-owned summary copy in the body; rootAttributes accepts only data-* attributes, so it never sets aria-describedby.",
|
|
2192
2200
|
"A floating header's title uses the normal text color, which keeps WCAG AA over the 80% raised chrome material on any content; the material turns opaque under prefers-reduced-transparency, prefers-contrast: more, forced colors, or without backdrop-filter.",
|
|
2193
2201
|
"A resizable bottom sheet's grabber is a focusable horizontal separator (\"Resize sheet\") with aria-valuemin, aria-valuenow, and aria-valuemax in visible px; the arrow keys, Page Up/Down, Home, and End resize it, and its slide motion is skipped under prefers-reduced-motion.",
|
|
2194
2202
|
"Use popup surfaces only for real dropdown menus with named triggers."
|
|
@@ -2439,7 +2447,7 @@
|
|
|
2439
2447
|
],
|
|
2440
2448
|
"accessibility": [
|
|
2441
2449
|
"It is a native modal <dialog> named by label: the page is inert, focus stays inside, Escape asks to close, and focus returns to the opener on close.",
|
|
2442
|
-
"On roomy devices the detail title is a level-2 heading; every presentation keeps a close control named Close (closeLabel), and the compact back control is named by backLabel."
|
|
2450
|
+
"Pass describedBy, the id of app-owned summary copy, for the dialog's accessible description; the detail description describes the selection and is not wired. On roomy devices the detail title is a level-2 heading; every presentation keeps a close control named Close (closeLabel), and the compact back control is named by backLabel."
|
|
2443
2451
|
],
|
|
2444
2452
|
"geometry": {
|
|
2445
2453
|
"margin": "parent",
|
|
@@ -2572,7 +2580,7 @@
|
|
|
2572
2580
|
],
|
|
2573
2581
|
"accessibility": [
|
|
2574
2582
|
"It is a native modal <dialog> named by label: the page is inert, focus stays inside, Escape asks to close, and focus returns to the opener on close.",
|
|
2575
|
-
"The title is a level-2 heading; the close control is named Close (closeLabel) and stays the outermost trailing control. An open overlay rail takes focus, keeps Tab inside it, and closes on Escape before the dialog does."
|
|
2583
|
+
"The title is a level-2 heading, and its description (id <id>-description) is the dialog's accessible description unless describedBy names other content; the close control is named Close (closeLabel) and stays the outermost trailing control. An open overlay rail takes focus, keeps Tab inside it, and closes on Escape before the dialog does."
|
|
2576
2584
|
],
|
|
2577
2585
|
"geometry": {
|
|
2578
2586
|
"margin": "parent",
|
|
@@ -4148,7 +4156,7 @@
|
|
|
4148
4156
|
"top/right/bottom/left text and control inset combinations",
|
|
4149
4157
|
"fill: the layout root fills a definite-height parent",
|
|
4150
4158
|
"rootAttributes: safe data-*, aria-*, and structural role on the root",
|
|
4151
|
-
"scroll dividers when named as wireScrollDividers targets chrome",
|
|
4159
|
+
"scroll dividers when named as wireScrollDividers targets chrome or scroller (by its id)",
|
|
4152
4160
|
"multi-select grid for rich ContentItem rows",
|
|
4153
4161
|
"contentWidth (compact 440px, medium 640px, wide 864px) and contentAlign for a readable, centered page column"
|
|
4154
4162
|
],
|
|
@@ -5014,7 +5022,7 @@
|
|
|
5014
5022
|
"category": "Structure",
|
|
5015
5023
|
"kind": "component",
|
|
5016
5024
|
"source": "kerf",
|
|
5017
|
-
"description": "Content a person shows and hides under a summary row: a native details element with a DisclosureArrow, a title, and an optional quiet detail, on content-item geometry, with plain, framed, and sunken appearances and native exclusive (accordion) groups.",
|
|
5025
|
+
"description": "Content a person shows and hides under a summary row: a native details element with a DisclosureArrow, a title, and an optional quiet detail, on content-item geometry, with plain, framed, and sunken appearances, an embedded appearance for a compact panel inside a ContentItem, and native exclusive (accordion) groups.",
|
|
5018
5026
|
"uses": [
|
|
5019
5027
|
"disclosure-arrow",
|
|
5020
5028
|
"lucide-icon"
|
|
@@ -5028,7 +5036,8 @@
|
|
|
5028
5036
|
],
|
|
5029
5037
|
"useWhen": [
|
|
5030
5038
|
"Optional or advanced content should stay out of the way until a person asks for it (advanced settings, a build log, release notes).",
|
|
5031
|
-
"A list of questions or sections should open one at a time: give the Disclosures the same name for a native exclusive accordion."
|
|
5039
|
+
"A list of questions or sections should open one at a time: give the Disclosures the same name for a native exclusive accordion.",
|
|
5040
|
+
"A compact details panel belongs inside a ContentItem (a note card's AI feedback): use appearance embedded so the item's own inset frames it once."
|
|
5032
5041
|
],
|
|
5033
5042
|
"avoidWhen": [
|
|
5034
5043
|
"Do not use it to switch between peer views; use a SegmentedControl or TabBar.",
|
|
@@ -5050,6 +5059,7 @@
|
|
|
5050
5059
|
],
|
|
5051
5060
|
"variants": [
|
|
5052
5061
|
"plain, framed, or sunken appearance",
|
|
5062
|
+
"embedded appearance inside a ContentItem or other owner chrome: no margin, border, or padding of its own and a 24px minimum summary row",
|
|
5053
5063
|
"open or closed initially",
|
|
5054
5064
|
"a quiet detail after the title",
|
|
5055
5065
|
"an exclusive accordion group sharing a name"
|
|
@@ -5063,7 +5073,8 @@
|
|
|
5063
5073
|
"border": "self",
|
|
5064
5074
|
"padding": "self",
|
|
5065
5075
|
"notes": [
|
|
5066
|
-
"The root takes the content-item geometry (8px inline margin, a 1px border, 8px padding); the content starts on the title's text column."
|
|
5076
|
+
"The root takes the content-item geometry (8px inline margin, a 1px border, 8px padding); the content starts on the title's text column.",
|
|
5077
|
+
"appearance embedded drops that geometry inside a ContentItem, which already owns it: the arrow sits on the item's content inset, the summary row is at least 24px tall, and the content (a flush Text or other content without an inset) starts on the title's text column 8px below the summary. Do not use embedded outside owner chrome."
|
|
5067
5078
|
]
|
|
5068
5079
|
},
|
|
5069
5080
|
"delivery": {
|
|
@@ -5462,7 +5473,8 @@
|
|
|
5462
5473
|
"pill",
|
|
5463
5474
|
"equal width",
|
|
5464
5475
|
"small",
|
|
5465
|
-
"placeholder (loading)"
|
|
5476
|
+
"placeholder (loading)",
|
|
5477
|
+
"disabled (whole control)"
|
|
5466
5478
|
],
|
|
5467
5479
|
"accessibility": [
|
|
5468
5480
|
"Keep choice labels meaningful and every enabled native button in sequential Tab order."
|
|
@@ -5732,7 +5744,7 @@
|
|
|
5732
5744
|
"category": "Controls",
|
|
5733
5745
|
"kind": "component",
|
|
5734
5746
|
"source": "kerf",
|
|
5735
|
-
"description": "A full inline color picker: a saturation and brightness area, hue and opacity
|
|
5747
|
+
"description": "A full inline color picker: a saturation and brightness area, a slider per channel of the color model (red, green, and blue; hue, saturation, and lightness or brightness; or one gray level) whose tracks paint the colors each channel produces while the others hold (the hue track a fixed full-saturation rainbow), an opacity slider, an RGB/HSL/HSB/Grayscale model menu that switches the sliders and channel fields together, a hex field (8 digits below full opacity) and opacity field, a screen sampler where the EyeDropper API exists, and optional preset and sample swatches.",
|
|
5736
5748
|
"uses": [
|
|
5737
5749
|
"color-swatches",
|
|
5738
5750
|
"lucide-icon"
|
|
@@ -5745,6 +5757,8 @@
|
|
|
5745
5757
|
"ColorPickerSamples",
|
|
5746
5758
|
"ColorPickerRootAttributes",
|
|
5747
5759
|
"colorPickerChannels",
|
|
5760
|
+
"colorPickerSlider",
|
|
5761
|
+
"ColorPickerSliderState",
|
|
5748
5762
|
"colorPickerAreaText",
|
|
5749
5763
|
"colorPickerStyle"
|
|
5750
5764
|
],
|
|
@@ -5771,21 +5785,24 @@
|
|
|
5771
5785
|
],
|
|
5772
5786
|
"variants": [
|
|
5773
5787
|
"with or without opacity",
|
|
5774
|
-
"RGB, HSL, HSB, or Grayscale channel fields",
|
|
5788
|
+
"RGB, HSL, HSB, or Grayscale channel sliders and fields",
|
|
5775
5789
|
"presets and titled sample groups with an add button",
|
|
5776
5790
|
"screen sampler where the EyeDropper API exists",
|
|
5777
5791
|
"disabled"
|
|
5778
5792
|
],
|
|
5779
5793
|
"accessibility": [
|
|
5780
5794
|
"The area is a slider named Saturation and Brightness with a spoken value; the arrow keys move it (Shift for 10% steps), Page Up and Down change brightness, Home and End saturation.",
|
|
5781
|
-
"
|
|
5795
|
+
"Every channel slider and the opacity slider is a native range input named for its channel (Red, Hue, Lightness, Gray Level, Opacity) with a spoken value in the channel's unit (210°, 40%, or a 0–255 byte); every field is named (Red, Hue, Hex Color, Opacity); the picker is a named group.",
|
|
5796
|
+
"The saturation and brightness area and every slider track carry a 1px inner edge halfway to the text color, so an area or track as dark or as light as the surface around it keeps at least 3:1 non-text contrast against it; increased contrast draws the edge in the full text color and forced colors in CanvasText.",
|
|
5797
|
+
"Every thumb draws a two-tone ring, a white border inside a dark outline, so it keeps at least 3:1 non-text contrast against light and dark area and track colors alike.",
|
|
5798
|
+
"Every slider track runs in the writing direction, as the native range does: in right-to-left text its gradient starts at the right, under the thumb at the channel's minimum."
|
|
5782
5799
|
],
|
|
5783
5800
|
"geometry": {
|
|
5784
5801
|
"margin": "none",
|
|
5785
5802
|
"border": "self",
|
|
5786
5803
|
"padding": "self",
|
|
5787
5804
|
"notes": [
|
|
5788
|
-
"The panel takes the shared block-content inset and a 320px maximum width; its rows are 12px apart."
|
|
5805
|
+
"The panel takes the shared block-content inset and a 320px maximum width; its rows are 12px apart and its sliders form one group 8px apart."
|
|
5789
5806
|
]
|
|
5790
5807
|
},
|
|
5791
5808
|
"delivery": {
|
|
@@ -5820,7 +5837,8 @@
|
|
|
5820
5837
|
"kui-color-picker__surface",
|
|
5821
5838
|
"kui-color-picker__area",
|
|
5822
5839
|
"kui-color-picker__area-thumb",
|
|
5823
|
-
"kui-color-
|
|
5840
|
+
"kui-color-picker__sliders",
|
|
5841
|
+
"kui-color-picker__slider",
|
|
5824
5842
|
"kui-color-picker__opacity",
|
|
5825
5843
|
"kui-color-picker__controls",
|
|
5826
5844
|
"kui-color-picker__mode-wrap",
|
|
@@ -6697,7 +6715,7 @@
|
|
|
6697
6715
|
"category": "Controls",
|
|
6698
6716
|
"kind": "component",
|
|
6699
6717
|
"source": "kerf",
|
|
6700
|
-
"description": "A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button,
|
|
6718
|
+
"description": "A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button, character count, and native numeric constraints, at the 44px control height or compact.",
|
|
6701
6719
|
"uses": [
|
|
6702
6720
|
"lucide-icon"
|
|
6703
6721
|
],
|
|
@@ -6709,7 +6727,8 @@
|
|
|
6709
6727
|
"useWhen": [
|
|
6710
6728
|
"A form or dialog collects a line of free text: label names it (or ariaLabel when nearby content already does), hint explains it, and error reports a validation problem.",
|
|
6711
6729
|
"People write a longer note or message: multiline with rows, or rows plus maxRows to grow with the content; maxLength with showCount shows the remaining budget.",
|
|
6712
|
-
"A filter or search field needs a leading icon and a clear button: icon and clearable."
|
|
6730
|
+
"A filter or search field needs a leading icon and a clear button: icon and clearable.",
|
|
6731
|
+
"An exact number needs native range or decimal-step validation: type=number with min, max, and step (including step=any)."
|
|
6713
6732
|
],
|
|
6714
6733
|
"avoidWhen": [
|
|
6715
6734
|
"Do not use when only existing values are allowed; use Select.",
|
|
@@ -6755,7 +6774,8 @@
|
|
|
6755
6774
|
"disabled",
|
|
6756
6775
|
"read-only",
|
|
6757
6776
|
"required",
|
|
6758
|
-
"email, password, search, url, tel, or number type"
|
|
6777
|
+
"email, password, search, url, tel, or number type",
|
|
6778
|
+
"number type with native min, max, and step constraints"
|
|
6759
6779
|
],
|
|
6760
6780
|
"accessibility": [
|
|
6761
6781
|
"The whole field is a <label> around a native <input> or <textarea>, so clicking anywhere on it focuses the field; the input is named by label (aria-label, with the visible label text hidden from assistive technology so the clear button and count stay out of the name) or by ariaLabel. Focus shows the standard focus ring around the box.",
|
|
@@ -6851,6 +6871,11 @@
|
|
|
6851
6871
|
"id": "wa-checkbox",
|
|
6852
6872
|
"relationship": "prefer-over"
|
|
6853
6873
|
},
|
|
6874
|
+
{
|
|
6875
|
+
"id": "checkbox-group",
|
|
6876
|
+
"relationship": "nearest",
|
|
6877
|
+
"when": "Use CheckboxGroup for a labeled set of related options."
|
|
6878
|
+
},
|
|
6854
6879
|
{
|
|
6855
6880
|
"id": "switch",
|
|
6856
6881
|
"relationship": "nearest",
|
|
@@ -6885,7 +6910,7 @@
|
|
|
6885
6910
|
"border": "self",
|
|
6886
6911
|
"padding": "none",
|
|
6887
6912
|
"notes": [
|
|
6888
|
-
"A 20px box (18px compact) 8px (7px) before its label; hint and error
|
|
6913
|
+
"A 20px box (18px compact) 8px (7px) before its label; hint and error sit directly under the label, on its text column, like a grouped choice hint. Stack standalone Checkboxes in a List gap=\"xs\" (8px), the same 28px pitch as RadioGroup choices."
|
|
6889
6914
|
]
|
|
6890
6915
|
},
|
|
6891
6916
|
"delivery": {
|
|
@@ -6935,6 +6960,108 @@
|
|
|
6935
6960
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
6936
6961
|
}
|
|
6937
6962
|
},
|
|
6963
|
+
{
|
|
6964
|
+
"id": "checkbox-group",
|
|
6965
|
+
"name": "CheckboxGroup",
|
|
6966
|
+
"category": "Controls",
|
|
6967
|
+
"kind": "component",
|
|
6968
|
+
"source": "kerf",
|
|
6969
|
+
"description": "A native fieldset of Kerf Checkboxes with the group label above, per-choice hints, and hint and error text below, stacked or wrapping like a RadioGroup.",
|
|
6970
|
+
"uses": [
|
|
6971
|
+
"checkbox"
|
|
6972
|
+
],
|
|
6973
|
+
"purpose": "Choose any number of a few related options that should stay visible under one group label, with native keyboard behavior and form participation.",
|
|
6974
|
+
"publicExports": [
|
|
6975
|
+
"CheckboxGroup"
|
|
6976
|
+
],
|
|
6977
|
+
"useWhen": [
|
|
6978
|
+
"A form asks for any of two to about eight related options under one label, each with a readable label and an optional hint, and every checked value submits under one name."
|
|
6979
|
+
],
|
|
6980
|
+
"avoidWhen": [
|
|
6981
|
+
"Do not use for one choice among several; use RadioGroup.",
|
|
6982
|
+
"Do not use for a single independent option or a parent with a mixed state; use Checkbox.",
|
|
6983
|
+
"Do not use for settings that apply the moment they change; use Switch.",
|
|
6984
|
+
"Do not use for many short tag-like or wrapping pill choices; use ChoiceChips multiple."
|
|
6985
|
+
],
|
|
6986
|
+
"alternatives": [
|
|
6987
|
+
{
|
|
6988
|
+
"id": "wa-checkbox-group",
|
|
6989
|
+
"relationship": "prefer-over"
|
|
6990
|
+
},
|
|
6991
|
+
{
|
|
6992
|
+
"id": "checkbox",
|
|
6993
|
+
"relationship": "nearest",
|
|
6994
|
+
"when": "Use Checkbox for one independent option, or a mixed parent above its children."
|
|
6995
|
+
},
|
|
6996
|
+
{
|
|
6997
|
+
"id": "radio-group",
|
|
6998
|
+
"relationship": "nearest",
|
|
6999
|
+
"when": "Use RadioGroup when exactly one option may be chosen."
|
|
7000
|
+
},
|
|
7001
|
+
{
|
|
7002
|
+
"id": "choice-chips",
|
|
7003
|
+
"relationship": "nearest",
|
|
7004
|
+
"when": "Use ChoiceChips multiple for wrapping pill choices."
|
|
7005
|
+
}
|
|
7006
|
+
],
|
|
7007
|
+
"appOwns": [
|
|
7008
|
+
"checked values",
|
|
7009
|
+
"choices and their copy",
|
|
7010
|
+
"validation and error copy"
|
|
7011
|
+
],
|
|
7012
|
+
"variants": [
|
|
7013
|
+
"vertical or horizontal",
|
|
7014
|
+
"per-choice hint",
|
|
7015
|
+
"disabled choice",
|
|
7016
|
+
"whole group disabled",
|
|
7017
|
+
"hint",
|
|
7018
|
+
"error",
|
|
7019
|
+
"default or compact size"
|
|
7020
|
+
],
|
|
7021
|
+
"accessibility": [
|
|
7022
|
+
"A native <fieldset> (a group) named by its legend (label), ariaLabel, or labelledBy; each choice is a Kerf Checkbox, a native checkbox inside its <label>, invisibly over the drawn box. Every checkbox is its own Tab stop and Space toggles it; each checked value submits under name.",
|
|
7023
|
+
"The group's hint and error form its aria-description; an error sets aria-invalid on the group and the danger border on each box. A choice's hint is that checkbox's aria-description. disabled disables the fieldset, and so every checkbox, natively."
|
|
7024
|
+
],
|
|
7025
|
+
"geometry": {
|
|
7026
|
+
"margin": "none",
|
|
7027
|
+
"border": "none",
|
|
7028
|
+
"padding": "self",
|
|
7029
|
+
"notes": [
|
|
7030
|
+
"Laid out exactly like a RadioGroup: the label and hint sit on the text column (1px + 8px); each choice's 20px box (18px compact) sits on the group's inline-start edge 8px (7px) before its label; choices stack 8px apart (--kui-space-xs), the same 28px pitch as RadioGroup choices, wrap with a 24px column gap when horizontal, and a choice hint sits directly under its label text."
|
|
7031
|
+
]
|
|
7032
|
+
},
|
|
7033
|
+
"delivery": {
|
|
7034
|
+
"browserImport": "@kerfjs/ui/checkbox-group",
|
|
7035
|
+
"manualCssImport": "@kerfjs/ui/checkbox-group.css",
|
|
7036
|
+
"sideEffects": [
|
|
7037
|
+
"browser-condition-css"
|
|
7038
|
+
]
|
|
7039
|
+
},
|
|
7040
|
+
"wiring": [],
|
|
7041
|
+
"publicClasses": [
|
|
7042
|
+
"kui-checkbox-group",
|
|
7043
|
+
"kui-checkbox-group__label",
|
|
7044
|
+
"kui-checkbox-group__choices",
|
|
7045
|
+
"kui-checkbox-group__hint",
|
|
7046
|
+
"kui-checkbox-group__error"
|
|
7047
|
+
],
|
|
7048
|
+
"publicTokens": [
|
|
7049
|
+
"--kui-color-neutral-on-quiet",
|
|
7050
|
+
"--kui-color-text-quiet",
|
|
7051
|
+
"--kui-color-danger-on-quiet",
|
|
7052
|
+
"--kui-font-m",
|
|
7053
|
+
"--kui-font-s",
|
|
7054
|
+
"--kui-font-xs",
|
|
7055
|
+
"--kui-layout-item-padding",
|
|
7056
|
+
"--kui-space-xs"
|
|
7057
|
+
],
|
|
7058
|
+
"rootElement": "fieldset",
|
|
7059
|
+
"links": {
|
|
7060
|
+
"catalogRoute": "?component=checkbox-group",
|
|
7061
|
+
"documentation": "docs/component-selection.md",
|
|
7062
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
7063
|
+
}
|
|
7064
|
+
},
|
|
6938
7065
|
{
|
|
6939
7066
|
"id": "radio-group",
|
|
6940
7067
|
"name": "RadioGroup",
|
|
@@ -6973,6 +7100,11 @@
|
|
|
6973
7100
|
"id": "choice-chips",
|
|
6974
7101
|
"relationship": "nearest",
|
|
6975
7102
|
"when": "Use ChoiceChips for wrapping pill choices."
|
|
7103
|
+
},
|
|
7104
|
+
{
|
|
7105
|
+
"id": "checkbox-group",
|
|
7106
|
+
"relationship": "nearest",
|
|
7107
|
+
"when": "Use CheckboxGroup when people may choose several."
|
|
6976
7108
|
}
|
|
6977
7109
|
],
|
|
6978
7110
|
"appOwns": [
|
|
@@ -6999,7 +7131,7 @@
|
|
|
6999
7131
|
"border": "none",
|
|
7000
7132
|
"padding": "self",
|
|
7001
7133
|
"notes": [
|
|
7002
|
-
"The label and hint sit on the text column (1px + 8px);
|
|
7134
|
+
"The label and hint sit on the text column (1px + 8px); each choice's 20px circle (18px compact) sits on the group's inline-start edge, where a Checkbox draws its box, 8px (7px) before its label; choices stack 8px apart (--kui-space-xs), the same 28px pitch as Checkboxes in a List gap=\"xs\", and a choice hint aligns with its label text."
|
|
7003
7135
|
]
|
|
7004
7136
|
},
|
|
7005
7137
|
"delivery": {
|
|
@@ -7037,7 +7169,8 @@
|
|
|
7037
7169
|
"--kui-font-s",
|
|
7038
7170
|
"--kui-font-xs",
|
|
7039
7171
|
"--kui-color-neutral-on-quiet",
|
|
7040
|
-
"--kui-layout-item-padding"
|
|
7172
|
+
"--kui-layout-item-padding",
|
|
7173
|
+
"--kui-space-xs"
|
|
7041
7174
|
],
|
|
7042
7175
|
"rootElement": "fieldset",
|
|
7043
7176
|
"links": {
|
|
@@ -7099,7 +7232,7 @@
|
|
|
7099
7232
|
"border": "self",
|
|
7100
7233
|
"padding": "none",
|
|
7101
7234
|
"notes": [
|
|
7102
|
-
"A 35×20 track (31.5×18 compact) 8px (7px) before its label; the hint
|
|
7235
|
+
"A 35×20 track (31.5×18 compact) 8px (7px) before its label; the hint sits directly under the label, on its text column, like a Checkbox hint."
|
|
7103
7236
|
]
|
|
7104
7237
|
},
|
|
7105
7238
|
"delivery": {
|
|
@@ -7432,7 +7565,7 @@
|
|
|
7432
7565
|
"category": "Controls",
|
|
7433
7566
|
"kind": "component",
|
|
7434
7567
|
"source": "kerf",
|
|
7435
|
-
"description": "A standalone action button: a native button (or a link with href) in a neutral, brand, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.",
|
|
7568
|
+
"description": "A standalone action button: a native button (or a link with href) in a neutral, brand, success, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.",
|
|
7436
7569
|
"uses": [
|
|
7437
7570
|
"loading-spinner"
|
|
7438
7571
|
],
|
|
@@ -7441,9 +7574,10 @@
|
|
|
7441
7574
|
"Button"
|
|
7442
7575
|
],
|
|
7443
7576
|
"useWhen": [
|
|
7444
|
-
"A dialog footer, a form, or content needs an action button: tone=\"brand\" for the main action, tone=\"danger\" for a destructive one, and emphasis=\"secondary\" or \"plain\" for the quieter actions beside it.",
|
|
7577
|
+
"A dialog footer, a form, or content needs an action button: tone=\"brand\" for the main action, tone=\"success\" for a positive action such as a pricing check, tone=\"danger\" for a destructive one, and emphasis=\"secondary\" or \"plain\" for the quieter actions beside it.",
|
|
7445
7578
|
"A form submits or resets: type=\"submit\" or \"reset\" (the default type never submits), with name, value, and form when needed.",
|
|
7446
|
-
"An action navigates: href renders a link with the same chrome."
|
|
7579
|
+
"An action navigates: href renders a link with the same chrome.",
|
|
7580
|
+
"A single primary action spans its form, sheet, or narrow column: fill makes it span the parent's available inline width, label centered, as SplitButton's fill does."
|
|
7447
7581
|
],
|
|
7448
7582
|
"avoidWhen": [
|
|
7449
7583
|
"Do not use inside a ToolbarControlGroup; give the group plain <button> controls, which it styles.",
|
|
@@ -7467,21 +7601,23 @@
|
|
|
7467
7601
|
"form ownership"
|
|
7468
7602
|
],
|
|
7469
7603
|
"variants": [
|
|
7470
|
-
"neutral, brand, or danger tone",
|
|
7604
|
+
"neutral, brand, success, or danger tone",
|
|
7471
7605
|
"primary, secondary, or plain emphasis",
|
|
7472
7606
|
"default or compact size",
|
|
7473
7607
|
"rounded (default) or pill shape",
|
|
7608
|
+
"content width (default) or fill: spans the parent's available inline width, label centered and ellipsized when it no longer fits",
|
|
7474
7609
|
"leading icon",
|
|
7475
7610
|
"icon-only square (icon and ariaLabel, no label)",
|
|
7476
7611
|
"pressed toggle (aria-pressed) on any tone and emphasis",
|
|
7477
7612
|
"loading",
|
|
7478
7613
|
"disabled",
|
|
7479
7614
|
"link (href)",
|
|
7480
|
-
"badge (a count, short text, or true for a dot) over the corner, named through badgeLabel, with badgeTone"
|
|
7615
|
+
"badge (a count, short text, or true for a dot) over the corner, named through badgeLabel, with badgeTone",
|
|
7616
|
+
"focusRingInset: the focus ring drawn inside the box for an ancestor that clips overflow"
|
|
7481
7617
|
],
|
|
7482
7618
|
"accessibility": [
|
|
7483
|
-
"A native <button> (type=\"button\" unless set) or, with href, an <a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring.",
|
|
7484
|
-
"Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\".",
|
|
7619
|
+
"A native <button> (type=\"button\" unless set) or, with href, an <a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring 1px outside the box; with focusRingInset it is drawn inside the box, two-tone with a surface-colored line inside the ring color, so it keeps 3:1 contrast on a loud fill of its own hue.",
|
|
7620
|
+
"Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\". Disabled success uses a quiet success fill and readable on-fill text instead of fading the label.",
|
|
7485
7621
|
"With pressed, it is a toggle: aria-pressed reports the state, and the pressed look adds a doubled outline (secondary and plain) or a darkened fill with an inset ring (primary), so the state never relies on hue alone; forced-colors mode paints it Highlight. An icon-only Button is named by ariaLabel, and help tags show that name on hover and keyboard focus. A title gives native hover text that says more than the name and replaces the help tag."
|
|
7486
7622
|
],
|
|
7487
7623
|
"geometry": {
|
|
@@ -7514,6 +7650,11 @@
|
|
|
7514
7650
|
"--kui-color-brand-fill-quiet",
|
|
7515
7651
|
"--kui-color-brand-on-quiet",
|
|
7516
7652
|
"--kui-color-brand-border-loud",
|
|
7653
|
+
"--kui-color-success-fill-loud",
|
|
7654
|
+
"--kui-color-success-on-loud",
|
|
7655
|
+
"--kui-color-success-fill-quiet",
|
|
7656
|
+
"--kui-color-success-on-fill",
|
|
7657
|
+
"--kui-color-success-border-loud",
|
|
7517
7658
|
"--kui-color-danger-fill-loud",
|
|
7518
7659
|
"--kui-color-danger-on-loud",
|
|
7519
7660
|
"--kui-color-danger-fill-quiet",
|
|
@@ -7542,7 +7683,7 @@
|
|
|
7542
7683
|
"lucide-icon",
|
|
7543
7684
|
"loading-spinner"
|
|
7544
7685
|
],
|
|
7545
|
-
"purpose": "Render a prominent primary action plus an options trigger (provider, model, target) as one control with a semantic tone, full-width sizing, a busy presentation, and native aria-expanded on the trigger, outside any Toolbar.",
|
|
7686
|
+
"purpose": "Render a prominent primary action plus an options trigger (provider, model, target) as one control with a semantic tone, full-width sizing, a rounded or pill shape, a busy presentation, and native aria-expanded on the trigger, outside any Toolbar.",
|
|
7546
7687
|
"publicExports": [
|
|
7547
7688
|
"SplitButton"
|
|
7548
7689
|
],
|
|
@@ -7574,11 +7715,14 @@
|
|
|
7574
7715
|
"variants": [
|
|
7575
7716
|
"brand, neutral, success, warning, or danger tone",
|
|
7576
7717
|
"content width or fill",
|
|
7718
|
+
"rounded or pill shape",
|
|
7577
7719
|
"busy",
|
|
7578
|
-
"disabled primary or options"
|
|
7720
|
+
"disabled primary or options",
|
|
7721
|
+
"focusRingInset: each half's focus ring drawn inside its box for an ancestor that clips overflow"
|
|
7579
7722
|
],
|
|
7580
7723
|
"accessibility": [
|
|
7581
|
-
"Both halves are native buttons in a group; the options trigger exposes aria-haspopup, aria-expanded, and optional aria-controls, and needs optionsLabel. busy sets aria-busy on the primary."
|
|
7724
|
+
"Both halves are native buttons in a group; the options trigger exposes aria-haspopup, aria-expanded, and optional aria-controls, and needs optionsLabel. busy sets aria-busy on the primary.",
|
|
7725
|
+
"Each half draws the focus ring 1px outside its box; with focusRingInset it is drawn inside, two-tone with a surface-colored line inside the ring color, so it keeps 3:1 contrast on every loud fill."
|
|
7582
7726
|
],
|
|
7583
7727
|
"geometry": {
|
|
7584
7728
|
"margin": "none",
|
|
@@ -7612,6 +7756,7 @@
|
|
|
7612
7756
|
"--kui-color-danger-on-loud",
|
|
7613
7757
|
"--kui-focus-ring",
|
|
7614
7758
|
"--kui-font-weight-semibold",
|
|
7759
|
+
"--kui-layout-pill-radius",
|
|
7615
7760
|
"--kui-layout-rounded-radius",
|
|
7616
7761
|
"--kui-space-s",
|
|
7617
7762
|
"--kui-space-xs"
|
|
@@ -9041,29 +9186,29 @@
|
|
|
9041
9186
|
"category": "Forms",
|
|
9042
9187
|
"kind": "component",
|
|
9043
9188
|
"source": "webawesome",
|
|
9044
|
-
"description": "Ecosystem checkbox group; use Kerf
|
|
9189
|
+
"description": "Ecosystem checkbox group; use Kerf CheckboxGroup or ChoiceChips.",
|
|
9045
9190
|
"uses": [
|
|
9046
9191
|
"wa-checkbox"
|
|
9047
9192
|
],
|
|
9048
|
-
"purpose": "Ecosystem checkbox group; use Kerf
|
|
9193
|
+
"purpose": "Ecosystem checkbox group; use Kerf CheckboxGroup or ChoiceChips.",
|
|
9049
9194
|
"customElement": "wa-checkbox-group",
|
|
9050
9195
|
"useWhen": [
|
|
9051
9196
|
"Labels and validates a related set of checkboxes."
|
|
9052
9197
|
],
|
|
9053
9198
|
"avoidWhen": [
|
|
9054
|
-
"Do not use it in Kerf UI; use
|
|
9199
|
+
"Do not use it in Kerf UI; use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9055
9200
|
],
|
|
9056
9201
|
"recommendation": "avoid",
|
|
9057
9202
|
"alternatives": [
|
|
9058
9203
|
{
|
|
9059
|
-
"id": "checkbox",
|
|
9204
|
+
"id": "checkbox-group",
|
|
9060
9205
|
"relationship": "prefer-kerf",
|
|
9061
|
-
"when": "Use
|
|
9206
|
+
"when": "Use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9062
9207
|
},
|
|
9063
9208
|
{
|
|
9064
9209
|
"id": "choice-chips",
|
|
9065
9210
|
"relationship": "prefer-kerf",
|
|
9066
|
-
"when": "Use
|
|
9211
|
+
"when": "Use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9067
9212
|
}
|
|
9068
9213
|
],
|
|
9069
9214
|
"geometry": {
|
|
@@ -122,6 +122,17 @@
|
|
|
122
122
|
},
|
|
123
123
|
"zones": []
|
|
124
124
|
},
|
|
125
|
+
"@kerfjs/ui:text": {
|
|
126
|
+
"_source": "docs/disclosure.md#embedded-in-a-content-item",
|
|
127
|
+
"insetFreeWhen": [
|
|
128
|
+
{ "prop": "flush", "equals": true },
|
|
129
|
+
{ "prop": "variant", "equals": "span" }
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
"@kerfjs/ui:disclosure": {
|
|
133
|
+
"_source": "docs/disclosure.md#embedded-in-a-content-item",
|
|
134
|
+
"insetFreeChildren": [{ "prop": "appearance", "equals": "embedded" }]
|
|
135
|
+
},
|
|
125
136
|
"@kerfjs/ui:list-header": {
|
|
126
137
|
"_source": "docs/accessibility.md#shared-rules",
|
|
127
138
|
"contexts": ["navigation-list"],
|
|
@@ -263,8 +274,15 @@
|
|
|
263
274
|
"contexts": ["chat-composer", "dialog-floating-footer"],
|
|
264
275
|
"zones": [
|
|
265
276
|
{
|
|
266
|
-
"id": "
|
|
267
|
-
"jsx": { "prop": "
|
|
277
|
+
"id": "leading",
|
|
278
|
+
"jsx": { "prop": "leading" },
|
|
279
|
+
"accepts": ["KerfUiContent"],
|
|
280
|
+
"cardinality": { "min": 0, "max": "unbounded" },
|
|
281
|
+
"exclusiveWith": []
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"id": "trailing",
|
|
285
|
+
"jsx": { "prop": "trailing" },
|
|
268
286
|
"accepts": ["KerfUiContent"],
|
|
269
287
|
"cardinality": { "min": 1, "max": "unbounded" },
|
|
270
288
|
"exclusiveWith": []
|
|
@@ -39,6 +39,11 @@ export type CatalogCssValueProp = {
|
|
|
39
39
|
unsafeHelper?: string;
|
|
40
40
|
examples: string[];
|
|
41
41
|
};
|
|
42
|
+
/** A statically written JSX prop value; a bare boolean prop equals `true`. */
|
|
43
|
+
export type CatalogPropCondition = {
|
|
44
|
+
prop: string;
|
|
45
|
+
equals: string | number | boolean;
|
|
46
|
+
};
|
|
42
47
|
export interface CatalogCompositionEntry {
|
|
43
48
|
key: CatalogQualifiedKey;
|
|
44
49
|
package: string;
|
|
@@ -52,6 +57,12 @@ export interface CatalogCompositionEntry {
|
|
|
52
57
|
/** For a wrapper component: the cataloged roots it renders (any one of
|
|
53
58
|
* them, or nothing). Composition checks treat its elements as each root. */
|
|
54
59
|
rendersAs?: CatalogQualifiedKey[];
|
|
60
|
+
/** Prop values under which direct JSX children must bring no content-item
|
|
61
|
+
* inset; a child owning its margin, border, and padding reports KUI-L204
|
|
62
|
+
* unless one of its `insetFreeWhen` conditions holds. */
|
|
63
|
+
insetFreeChildren?: CatalogPropCondition[];
|
|
64
|
+
/** Prop values that render this inset-bearing entry without its inset. */
|
|
65
|
+
insetFreeWhen?: CatalogPropCondition[];
|
|
55
66
|
/** Additional JSX exports in this selection entry with their own placement. */
|
|
56
67
|
jsxExports?: Record<
|
|
57
68
|
string,
|