@kerfjs/ui 5.0.0-beta.105 → 5.0.0-beta.107
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 +160 -27
- package/ai/component-composition-rules.json +20 -2
- package/ai/component-composition.d.ts +11 -0
- package/ai/component-composition.json +118 -19
- package/ai/component-composition.schema.json +32 -0
- package/ai/components/README.md +3 -2
- package/ai/components/button.md +4 -1
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +3 -2
- 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/message-composer.md +2 -1
- package/ai/components/radio-group.md +4 -3
- package/ai/components/split-button.md +5 -2
- package/ai/components/surface-scaffold.md +2 -1
- package/ai/components/switch.md +1 -1
- package/ai/components/text.md +2 -0
- package/ai/components/wa-checkbox-group.md +5 -5
- package/ai/components/workbench-dialog.md +1 -1
- package/ai/public-api-signatures-v1.md +198 -26
- package/ai/skill.md +73 -62
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/button.d.ts +15 -2
- package/dist/button.js +1 -1
- package/dist/catalog.js +9 -8
- 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/{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-FKKJHGN5.js → chunk-AZ3WT77F.js} +2 -2
- package/dist/{chunk-FKKJHGN5.js.map → chunk-AZ3WT77F.js.map} +1 -1
- package/dist/{chunk-FG6U7KQQ.js → chunk-DNWWF6UN.js} +2 -2
- package/dist/{chunk-FG6U7KQQ.js.map → chunk-DNWWF6UN.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-TAHR457X.js → chunk-G4DRH4A5.js} +3 -1
- package/dist/chunk-G4DRH4A5.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-GCAK23PU.js → chunk-MVKHSAKE.js} +2 -2
- package/dist/{chunk-GCAK23PU.js.map → chunk-MVKHSAKE.js.map} +1 -1
- package/dist/{chunk-DDSCVEO5.js → chunk-NLMEDZRM.js} +5 -5
- package/dist/{chunk-DDSCVEO5.js.map → chunk-NLMEDZRM.js.map} +1 -1
- 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-WJKHLOP5.js → chunk-TI2GV36S.js} +8 -2
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-UTCAOOXU.js → chunk-TXRKCGT3.js} +8 -2
- package/dist/chunk-TXRKCGT3.js.map +1 -0
- package/dist/{chunk-ACUKTVS3.js → chunk-XWNXGFX3.js} +52 -42
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/{chunk-ZXZAECHZ.js → chunk-Z4DS77U2.js} +2 -2
- package/dist/{chunk-ZXZAECHZ.js.map → chunk-Z4DS77U2.js.map} +1 -1
- 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 +1 -1
- 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 +20 -19
- package/dist/list-action-row.js +1 -1
- package/dist/list-detail-dialog.d.ts +7 -1
- package/dist/list-detail-dialog.js +6 -4
- 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/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/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 +29 -0
- 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 +29 -0
- package/dist/styles/components/actions/split-button/split-button.css +51 -5
- package/dist/styles/components/collections/framed-list/framed-list.css +4 -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 +9 -0
- package/dist/styles/components/layout/workbench/workbench.css +4 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +64 -1
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +1 -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 +6 -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 +21 -0
- package/dist/styles/framed-list.css +4 -0
- package/dist/styles/list-header.css +7 -0
- package/dist/styles/list.css +6 -0
- package/dist/styles/nav-stack.css +64 -1
- package/dist/styles/pane.css +9 -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 +6 -0
- package/dist/styles/switch.css +3 -3
- package/dist/styles/tab-navigator.css +1 -0
- package/dist/styles/text.css +10 -0
- package/dist/styles/webawesome.css +45 -9
- package/dist/styles/workbench.css +4 -0
- package/dist/surface-scaffold.d.ts +7 -1
- package/dist/surface-scaffold.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/workbench-dialog.d.ts +11 -2
- package/dist/workbench-dialog.js +5 -2
- package/dist/workbench-dialog.js.map +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +40 -1
- 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 +33 -2
- package/docs/component-selection.md +20 -9
- 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-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.md +10 -3
- package/docs/disclosure.md +34 -0
- 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 +1 -1
- package/docs/webawesome-theme.md +48 -16
- package/docs/workbench-dialog.md +4 -1
- package/docs/writing.md +3 -3
- package/doctor/copy-capitalization-checks.mjs +10 -7
- package/llms.txt +50 -20
- 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-ECFCAKWE.js.map +0 -1
- package/dist/chunk-EKBMUXFV.js.map +0 -1
- package/dist/chunk-HYORKKYP.js.map +0 -1
- package/dist/chunk-PE2KPZDW.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/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"],
|
|
@@ -416,6 +416,9 @@
|
|
|
416
416
|
"--kui-color-surface-lowered",
|
|
417
417
|
"--kui-sunken-texture",
|
|
418
418
|
"--kui-sunken-surface",
|
|
419
|
+
"--kui-color-surface-current",
|
|
420
|
+
"--kui-color-surface-current-region",
|
|
421
|
+
"--kui-color-surface-current-tint",
|
|
419
422
|
"--kui-chrome-material",
|
|
420
423
|
"--kui-chrome-material-raised",
|
|
421
424
|
"--kui-chrome-material-filter",
|
|
@@ -2183,12 +2186,13 @@
|
|
|
2183
2186
|
"core kerfjs/overlay confirm/prompt/form/choice as a bottom sheet styled by @kerfjs/ui/overlay-sheet.css",
|
|
2184
2187
|
"resizable core kerfjs/overlay bottom sheet: the kui-overlay-sheet-resizable class plus wireOverlaySheets adds the resizable DialogSurface sheet grabber",
|
|
2185
2188
|
"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",
|
|
2189
|
+
"accessible description by describedBy: the heading ToolbarText descriptionId or app-owned body summary copy",
|
|
2186
2190
|
"light dismiss (a backdrop press closes; otherwise the panel pulses)"
|
|
2187
2191
|
],
|
|
2188
2192
|
"accessibility": [
|
|
2189
2193
|
"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
2194
|
"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
|
|
2195
|
+
"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
2196
|
"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
2197
|
"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
2198
|
"Use popup surfaces only for real dropdown menus with named triggers."
|
|
@@ -2439,7 +2443,7 @@
|
|
|
2439
2443
|
],
|
|
2440
2444
|
"accessibility": [
|
|
2441
2445
|
"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."
|
|
2446
|
+
"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
2447
|
],
|
|
2444
2448
|
"geometry": {
|
|
2445
2449
|
"margin": "parent",
|
|
@@ -2572,7 +2576,7 @@
|
|
|
2572
2576
|
],
|
|
2573
2577
|
"accessibility": [
|
|
2574
2578
|
"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."
|
|
2579
|
+
"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
2580
|
],
|
|
2577
2581
|
"geometry": {
|
|
2578
2582
|
"margin": "parent",
|
|
@@ -5014,7 +5018,7 @@
|
|
|
5014
5018
|
"category": "Structure",
|
|
5015
5019
|
"kind": "component",
|
|
5016
5020
|
"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.",
|
|
5021
|
+
"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
5022
|
"uses": [
|
|
5019
5023
|
"disclosure-arrow",
|
|
5020
5024
|
"lucide-icon"
|
|
@@ -5028,7 +5032,8 @@
|
|
|
5028
5032
|
],
|
|
5029
5033
|
"useWhen": [
|
|
5030
5034
|
"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."
|
|
5035
|
+
"A list of questions or sections should open one at a time: give the Disclosures the same name for a native exclusive accordion.",
|
|
5036
|
+
"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
5037
|
],
|
|
5033
5038
|
"avoidWhen": [
|
|
5034
5039
|
"Do not use it to switch between peer views; use a SegmentedControl or TabBar.",
|
|
@@ -5050,6 +5055,7 @@
|
|
|
5050
5055
|
],
|
|
5051
5056
|
"variants": [
|
|
5052
5057
|
"plain, framed, or sunken appearance",
|
|
5058
|
+
"embedded appearance inside a ContentItem or other owner chrome: no margin, border, or padding of its own and a 24px minimum summary row",
|
|
5053
5059
|
"open or closed initially",
|
|
5054
5060
|
"a quiet detail after the title",
|
|
5055
5061
|
"an exclusive accordion group sharing a name"
|
|
@@ -5063,7 +5069,8 @@
|
|
|
5063
5069
|
"border": "self",
|
|
5064
5070
|
"padding": "self",
|
|
5065
5071
|
"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."
|
|
5072
|
+
"The root takes the content-item geometry (8px inline margin, a 1px border, 8px padding); the content starts on the title's text column.",
|
|
5073
|
+
"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
5074
|
]
|
|
5068
5075
|
},
|
|
5069
5076
|
"delivery": {
|
|
@@ -5732,7 +5739,7 @@
|
|
|
5732
5739
|
"category": "Controls",
|
|
5733
5740
|
"kind": "component",
|
|
5734
5741
|
"source": "kerf",
|
|
5735
|
-
"description": "A full inline color picker: a saturation and brightness area, hue and opacity
|
|
5742
|
+
"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
5743
|
"uses": [
|
|
5737
5744
|
"color-swatches",
|
|
5738
5745
|
"lucide-icon"
|
|
@@ -5745,6 +5752,8 @@
|
|
|
5745
5752
|
"ColorPickerSamples",
|
|
5746
5753
|
"ColorPickerRootAttributes",
|
|
5747
5754
|
"colorPickerChannels",
|
|
5755
|
+
"colorPickerSlider",
|
|
5756
|
+
"ColorPickerSliderState",
|
|
5748
5757
|
"colorPickerAreaText",
|
|
5749
5758
|
"colorPickerStyle"
|
|
5750
5759
|
],
|
|
@@ -5771,21 +5780,24 @@
|
|
|
5771
5780
|
],
|
|
5772
5781
|
"variants": [
|
|
5773
5782
|
"with or without opacity",
|
|
5774
|
-
"RGB, HSL, HSB, or Grayscale channel fields",
|
|
5783
|
+
"RGB, HSL, HSB, or Grayscale channel sliders and fields",
|
|
5775
5784
|
"presets and titled sample groups with an add button",
|
|
5776
5785
|
"screen sampler where the EyeDropper API exists",
|
|
5777
5786
|
"disabled"
|
|
5778
5787
|
],
|
|
5779
5788
|
"accessibility": [
|
|
5780
5789
|
"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
|
-
"
|
|
5790
|
+
"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.",
|
|
5791
|
+
"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.",
|
|
5792
|
+
"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.",
|
|
5793
|
+
"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
5794
|
],
|
|
5783
5795
|
"geometry": {
|
|
5784
5796
|
"margin": "none",
|
|
5785
5797
|
"border": "self",
|
|
5786
5798
|
"padding": "self",
|
|
5787
5799
|
"notes": [
|
|
5788
|
-
"The panel takes the shared block-content inset and a 320px maximum width; its rows are 12px apart."
|
|
5800
|
+
"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
5801
|
]
|
|
5790
5802
|
},
|
|
5791
5803
|
"delivery": {
|
|
@@ -5820,7 +5832,8 @@
|
|
|
5820
5832
|
"kui-color-picker__surface",
|
|
5821
5833
|
"kui-color-picker__area",
|
|
5822
5834
|
"kui-color-picker__area-thumb",
|
|
5823
|
-
"kui-color-
|
|
5835
|
+
"kui-color-picker__sliders",
|
|
5836
|
+
"kui-color-picker__slider",
|
|
5824
5837
|
"kui-color-picker__opacity",
|
|
5825
5838
|
"kui-color-picker__controls",
|
|
5826
5839
|
"kui-color-picker__mode-wrap",
|
|
@@ -6851,6 +6864,11 @@
|
|
|
6851
6864
|
"id": "wa-checkbox",
|
|
6852
6865
|
"relationship": "prefer-over"
|
|
6853
6866
|
},
|
|
6867
|
+
{
|
|
6868
|
+
"id": "checkbox-group",
|
|
6869
|
+
"relationship": "nearest",
|
|
6870
|
+
"when": "Use CheckboxGroup for a labeled set of related options."
|
|
6871
|
+
},
|
|
6854
6872
|
{
|
|
6855
6873
|
"id": "switch",
|
|
6856
6874
|
"relationship": "nearest",
|
|
@@ -6885,7 +6903,7 @@
|
|
|
6885
6903
|
"border": "self",
|
|
6886
6904
|
"padding": "none",
|
|
6887
6905
|
"notes": [
|
|
6888
|
-
"A 20px box (18px compact) 8px (7px) before its label; hint and error
|
|
6906
|
+
"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
6907
|
]
|
|
6890
6908
|
},
|
|
6891
6909
|
"delivery": {
|
|
@@ -6935,6 +6953,108 @@
|
|
|
6935
6953
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
6936
6954
|
}
|
|
6937
6955
|
},
|
|
6956
|
+
{
|
|
6957
|
+
"id": "checkbox-group",
|
|
6958
|
+
"name": "CheckboxGroup",
|
|
6959
|
+
"category": "Controls",
|
|
6960
|
+
"kind": "component",
|
|
6961
|
+
"source": "kerf",
|
|
6962
|
+
"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.",
|
|
6963
|
+
"uses": [
|
|
6964
|
+
"checkbox"
|
|
6965
|
+
],
|
|
6966
|
+
"purpose": "Choose any number of a few related options that should stay visible under one group label, with native keyboard behavior and form participation.",
|
|
6967
|
+
"publicExports": [
|
|
6968
|
+
"CheckboxGroup"
|
|
6969
|
+
],
|
|
6970
|
+
"useWhen": [
|
|
6971
|
+
"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."
|
|
6972
|
+
],
|
|
6973
|
+
"avoidWhen": [
|
|
6974
|
+
"Do not use for one choice among several; use RadioGroup.",
|
|
6975
|
+
"Do not use for a single independent option or a parent with a mixed state; use Checkbox.",
|
|
6976
|
+
"Do not use for settings that apply the moment they change; use Switch.",
|
|
6977
|
+
"Do not use for many short tag-like or wrapping pill choices; use ChoiceChips multiple."
|
|
6978
|
+
],
|
|
6979
|
+
"alternatives": [
|
|
6980
|
+
{
|
|
6981
|
+
"id": "wa-checkbox-group",
|
|
6982
|
+
"relationship": "prefer-over"
|
|
6983
|
+
},
|
|
6984
|
+
{
|
|
6985
|
+
"id": "checkbox",
|
|
6986
|
+
"relationship": "nearest",
|
|
6987
|
+
"when": "Use Checkbox for one independent option, or a mixed parent above its children."
|
|
6988
|
+
},
|
|
6989
|
+
{
|
|
6990
|
+
"id": "radio-group",
|
|
6991
|
+
"relationship": "nearest",
|
|
6992
|
+
"when": "Use RadioGroup when exactly one option may be chosen."
|
|
6993
|
+
},
|
|
6994
|
+
{
|
|
6995
|
+
"id": "choice-chips",
|
|
6996
|
+
"relationship": "nearest",
|
|
6997
|
+
"when": "Use ChoiceChips multiple for wrapping pill choices."
|
|
6998
|
+
}
|
|
6999
|
+
],
|
|
7000
|
+
"appOwns": [
|
|
7001
|
+
"checked values",
|
|
7002
|
+
"choices and their copy",
|
|
7003
|
+
"validation and error copy"
|
|
7004
|
+
],
|
|
7005
|
+
"variants": [
|
|
7006
|
+
"vertical or horizontal",
|
|
7007
|
+
"per-choice hint",
|
|
7008
|
+
"disabled choice",
|
|
7009
|
+
"whole group disabled",
|
|
7010
|
+
"hint",
|
|
7011
|
+
"error",
|
|
7012
|
+
"default or compact size"
|
|
7013
|
+
],
|
|
7014
|
+
"accessibility": [
|
|
7015
|
+
"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.",
|
|
7016
|
+
"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."
|
|
7017
|
+
],
|
|
7018
|
+
"geometry": {
|
|
7019
|
+
"margin": "none",
|
|
7020
|
+
"border": "none",
|
|
7021
|
+
"padding": "self",
|
|
7022
|
+
"notes": [
|
|
7023
|
+
"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."
|
|
7024
|
+
]
|
|
7025
|
+
},
|
|
7026
|
+
"delivery": {
|
|
7027
|
+
"browserImport": "@kerfjs/ui/checkbox-group",
|
|
7028
|
+
"manualCssImport": "@kerfjs/ui/checkbox-group.css",
|
|
7029
|
+
"sideEffects": [
|
|
7030
|
+
"browser-condition-css"
|
|
7031
|
+
]
|
|
7032
|
+
},
|
|
7033
|
+
"wiring": [],
|
|
7034
|
+
"publicClasses": [
|
|
7035
|
+
"kui-checkbox-group",
|
|
7036
|
+
"kui-checkbox-group__label",
|
|
7037
|
+
"kui-checkbox-group__choices",
|
|
7038
|
+
"kui-checkbox-group__hint",
|
|
7039
|
+
"kui-checkbox-group__error"
|
|
7040
|
+
],
|
|
7041
|
+
"publicTokens": [
|
|
7042
|
+
"--kui-color-neutral-on-quiet",
|
|
7043
|
+
"--kui-color-text-quiet",
|
|
7044
|
+
"--kui-color-danger-on-quiet",
|
|
7045
|
+
"--kui-font-m",
|
|
7046
|
+
"--kui-font-s",
|
|
7047
|
+
"--kui-font-xs",
|
|
7048
|
+
"--kui-layout-item-padding",
|
|
7049
|
+
"--kui-space-xs"
|
|
7050
|
+
],
|
|
7051
|
+
"rootElement": "fieldset",
|
|
7052
|
+
"links": {
|
|
7053
|
+
"catalogRoute": "?component=checkbox-group",
|
|
7054
|
+
"documentation": "docs/component-selection.md",
|
|
7055
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
7056
|
+
}
|
|
7057
|
+
},
|
|
6938
7058
|
{
|
|
6939
7059
|
"id": "radio-group",
|
|
6940
7060
|
"name": "RadioGroup",
|
|
@@ -6973,6 +7093,11 @@
|
|
|
6973
7093
|
"id": "choice-chips",
|
|
6974
7094
|
"relationship": "nearest",
|
|
6975
7095
|
"when": "Use ChoiceChips for wrapping pill choices."
|
|
7096
|
+
},
|
|
7097
|
+
{
|
|
7098
|
+
"id": "checkbox-group",
|
|
7099
|
+
"relationship": "nearest",
|
|
7100
|
+
"when": "Use CheckboxGroup when people may choose several."
|
|
6976
7101
|
}
|
|
6977
7102
|
],
|
|
6978
7103
|
"appOwns": [
|
|
@@ -6999,7 +7124,7 @@
|
|
|
6999
7124
|
"border": "none",
|
|
7000
7125
|
"padding": "self",
|
|
7001
7126
|
"notes": [
|
|
7002
|
-
"The label and hint sit on the text column (1px + 8px);
|
|
7127
|
+
"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
7128
|
]
|
|
7004
7129
|
},
|
|
7005
7130
|
"delivery": {
|
|
@@ -7037,7 +7162,8 @@
|
|
|
7037
7162
|
"--kui-font-s",
|
|
7038
7163
|
"--kui-font-xs",
|
|
7039
7164
|
"--kui-color-neutral-on-quiet",
|
|
7040
|
-
"--kui-layout-item-padding"
|
|
7165
|
+
"--kui-layout-item-padding",
|
|
7166
|
+
"--kui-space-xs"
|
|
7041
7167
|
],
|
|
7042
7168
|
"rootElement": "fieldset",
|
|
7043
7169
|
"links": {
|
|
@@ -7099,7 +7225,7 @@
|
|
|
7099
7225
|
"border": "self",
|
|
7100
7226
|
"padding": "none",
|
|
7101
7227
|
"notes": [
|
|
7102
|
-
"A 35×20 track (31.5×18 compact) 8px (7px) before its label; the hint
|
|
7228
|
+
"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
7229
|
]
|
|
7104
7230
|
},
|
|
7105
7231
|
"delivery": {
|
|
@@ -7443,7 +7569,8 @@
|
|
|
7443
7569
|
"useWhen": [
|
|
7444
7570
|
"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.",
|
|
7445
7571
|
"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."
|
|
7572
|
+
"An action navigates: href renders a link with the same chrome.",
|
|
7573
|
+
"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
7574
|
],
|
|
7448
7575
|
"avoidWhen": [
|
|
7449
7576
|
"Do not use inside a ToolbarControlGroup; give the group plain <button> controls, which it styles.",
|
|
@@ -7471,16 +7598,18 @@
|
|
|
7471
7598
|
"primary, secondary, or plain emphasis",
|
|
7472
7599
|
"default or compact size",
|
|
7473
7600
|
"rounded (default) or pill shape",
|
|
7601
|
+
"content width (default) or fill: spans the parent's available inline width, label centered and ellipsized when it no longer fits",
|
|
7474
7602
|
"leading icon",
|
|
7475
7603
|
"icon-only square (icon and ariaLabel, no label)",
|
|
7476
7604
|
"pressed toggle (aria-pressed) on any tone and emphasis",
|
|
7477
7605
|
"loading",
|
|
7478
7606
|
"disabled",
|
|
7479
7607
|
"link (href)",
|
|
7480
|
-
"badge (a count, short text, or true for a dot) over the corner, named through badgeLabel, with badgeTone"
|
|
7608
|
+
"badge (a count, short text, or true for a dot) over the corner, named through badgeLabel, with badgeTone",
|
|
7609
|
+
"focusRingInset: the focus ring drawn inside the box for an ancestor that clips overflow"
|
|
7481
7610
|
],
|
|
7482
7611
|
"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.",
|
|
7612
|
+
"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.",
|
|
7484
7613
|
"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\".",
|
|
7485
7614
|
"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
7615
|
],
|
|
@@ -7542,7 +7671,7 @@
|
|
|
7542
7671
|
"lucide-icon",
|
|
7543
7672
|
"loading-spinner"
|
|
7544
7673
|
],
|
|
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.",
|
|
7674
|
+
"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
7675
|
"publicExports": [
|
|
7547
7676
|
"SplitButton"
|
|
7548
7677
|
],
|
|
@@ -7574,11 +7703,14 @@
|
|
|
7574
7703
|
"variants": [
|
|
7575
7704
|
"brand, neutral, success, warning, or danger tone",
|
|
7576
7705
|
"content width or fill",
|
|
7706
|
+
"rounded or pill shape",
|
|
7577
7707
|
"busy",
|
|
7578
|
-
"disabled primary or options"
|
|
7708
|
+
"disabled primary or options",
|
|
7709
|
+
"focusRingInset: each half's focus ring drawn inside its box for an ancestor that clips overflow"
|
|
7579
7710
|
],
|
|
7580
7711
|
"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."
|
|
7712
|
+
"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.",
|
|
7713
|
+
"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
7714
|
],
|
|
7583
7715
|
"geometry": {
|
|
7584
7716
|
"margin": "none",
|
|
@@ -7612,6 +7744,7 @@
|
|
|
7612
7744
|
"--kui-color-danger-on-loud",
|
|
7613
7745
|
"--kui-focus-ring",
|
|
7614
7746
|
"--kui-font-weight-semibold",
|
|
7747
|
+
"--kui-layout-pill-radius",
|
|
7615
7748
|
"--kui-layout-rounded-radius",
|
|
7616
7749
|
"--kui-space-s",
|
|
7617
7750
|
"--kui-space-xs"
|
|
@@ -9041,29 +9174,29 @@
|
|
|
9041
9174
|
"category": "Forms",
|
|
9042
9175
|
"kind": "component",
|
|
9043
9176
|
"source": "webawesome",
|
|
9044
|
-
"description": "Ecosystem checkbox group; use Kerf
|
|
9177
|
+
"description": "Ecosystem checkbox group; use Kerf CheckboxGroup or ChoiceChips.",
|
|
9045
9178
|
"uses": [
|
|
9046
9179
|
"wa-checkbox"
|
|
9047
9180
|
],
|
|
9048
|
-
"purpose": "Ecosystem checkbox group; use Kerf
|
|
9181
|
+
"purpose": "Ecosystem checkbox group; use Kerf CheckboxGroup or ChoiceChips.",
|
|
9049
9182
|
"customElement": "wa-checkbox-group",
|
|
9050
9183
|
"useWhen": [
|
|
9051
9184
|
"Labels and validates a related set of checkboxes."
|
|
9052
9185
|
],
|
|
9053
9186
|
"avoidWhen": [
|
|
9054
|
-
"Do not use it in Kerf UI; use
|
|
9187
|
+
"Do not use it in Kerf UI; use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9055
9188
|
],
|
|
9056
9189
|
"recommendation": "avoid",
|
|
9057
9190
|
"alternatives": [
|
|
9058
9191
|
{
|
|
9059
|
-
"id": "checkbox",
|
|
9192
|
+
"id": "checkbox-group",
|
|
9060
9193
|
"relationship": "prefer-kerf",
|
|
9061
|
-
"when": "Use
|
|
9194
|
+
"when": "Use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9062
9195
|
},
|
|
9063
9196
|
{
|
|
9064
9197
|
"id": "choice-chips",
|
|
9065
9198
|
"relationship": "prefer-kerf",
|
|
9066
|
-
"when": "Use
|
|
9199
|
+
"when": "Use CheckboxGroup for a labeled set of options, or ChoiceChips multiple for wrapping pills."
|
|
9067
9200
|
}
|
|
9068
9201
|
],
|
|
9069
9202
|
"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,
|