@flowstack-ui/agent-tools 0.1.0-bootstrap.0
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/.codex-plugin/plugin.json +37 -0
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/docs/architecture.md +77 -0
- package/docs/releasing.md +26 -0
- package/docs/testing.md +32 -0
- package/package.json +63 -0
- package/public/index.json +2073 -0
- package/public/llms.txt +19 -0
- package/public/packages/atom/0.24.0/components/accordion.txt +131 -0
- package/public/packages/atom/0.24.0/components/alert-dialog.txt +112 -0
- package/public/packages/atom/0.24.0/components/app-bar.txt +96 -0
- package/public/packages/atom/0.24.0/components/aspect-ratio.txt +111 -0
- package/public/packages/atom/0.24.0/components/avatar.txt +119 -0
- package/public/packages/atom/0.24.0/components/badge.txt +123 -0
- package/public/packages/atom/0.24.0/components/bottom-navigation.txt +96 -0
- package/public/packages/atom/0.24.0/components/breadcrumb.txt +96 -0
- package/public/packages/atom/0.24.0/components/button.txt +98 -0
- package/public/packages/atom/0.24.0/components/carousel.txt +128 -0
- package/public/packages/atom/0.24.0/components/checkbox-group.txt +118 -0
- package/public/packages/atom/0.24.0/components/checkbox.txt +100 -0
- package/public/packages/atom/0.24.0/components/clipboard.txt +112 -0
- package/public/packages/atom/0.24.0/components/collapsible.txt +112 -0
- package/public/packages/atom/0.24.0/components/color-picker.txt +117 -0
- package/public/packages/atom/0.24.0/components/combobox.txt +126 -0
- package/public/packages/atom/0.24.0/components/context-menu.txt +114 -0
- package/public/packages/atom/0.24.0/components/data-grid.txt +136 -0
- package/public/packages/atom/0.24.0/components/dialog.txt +116 -0
- package/public/packages/atom/0.24.0/components/direction.txt +132 -0
- package/public/packages/atom/0.24.0/components/divider.txt +94 -0
- package/public/packages/atom/0.24.0/components/drag-drop.txt +141 -0
- package/public/packages/atom/0.24.0/components/drawer.txt +96 -0
- package/public/packages/atom/0.24.0/components/dropdown-menu.txt +112 -0
- package/public/packages/atom/0.24.0/components/feed.txt +132 -0
- package/public/packages/atom/0.24.0/components/field.txt +108 -0
- package/public/packages/atom/0.24.0/components/fieldset.txt +96 -0
- package/public/packages/atom/0.24.0/components/file-upload.txt +120 -0
- package/public/packages/atom/0.24.0/components/form.txt +98 -0
- package/public/packages/atom/0.24.0/components/hover-card.txt +114 -0
- package/public/packages/atom/0.24.0/components/image.txt +94 -0
- package/public/packages/atom/0.24.0/components/input.txt +96 -0
- package/public/packages/atom/0.24.0/components/label.txt +121 -0
- package/public/packages/atom/0.24.0/components/link.txt +100 -0
- package/public/packages/atom/0.24.0/components/list.txt +131 -0
- package/public/packages/atom/0.24.0/components/listbox.txt +120 -0
- package/public/packages/atom/0.24.0/components/menu.txt +126 -0
- package/public/packages/atom/0.24.0/components/menubar.txt +120 -0
- package/public/packages/atom/0.24.0/components/modal.txt +118 -0
- package/public/packages/atom/0.24.0/components/multi-select.txt +120 -0
- package/public/packages/atom/0.24.0/components/nav-list.txt +104 -0
- package/public/packages/atom/0.24.0/components/navigation-menu.txt +104 -0
- package/public/packages/atom/0.24.0/components/number-input.txt +124 -0
- package/public/packages/atom/0.24.0/components/otp-field.txt +122 -0
- package/public/packages/atom/0.24.0/components/pagination.txt +111 -0
- package/public/packages/atom/0.24.0/components/password-toggle-field.txt +116 -0
- package/public/packages/atom/0.24.0/components/popover.txt +122 -0
- package/public/packages/atom/0.24.0/components/pressable.txt +94 -0
- package/public/packages/atom/0.24.0/components/progress.txt +130 -0
- package/public/packages/atom/0.24.0/components/radio-group.txt +118 -0
- package/public/packages/atom/0.24.0/components/rating.txt +122 -0
- package/public/packages/atom/0.24.0/components/reorder.txt +141 -0
- package/public/packages/atom/0.24.0/components/scroll-area.txt +96 -0
- package/public/packages/atom/0.24.0/components/select.txt +126 -0
- package/public/packages/atom/0.24.0/components/sidebar.txt +96 -0
- package/public/packages/atom/0.24.0/components/skip-link.txt +96 -0
- package/public/packages/atom/0.24.0/components/slider.txt +124 -0
- package/public/packages/atom/0.24.0/components/swipeable-item.txt +118 -0
- package/public/packages/atom/0.24.0/components/switch.txt +116 -0
- package/public/packages/atom/0.24.0/components/table.txt +128 -0
- package/public/packages/atom/0.24.0/components/tabs.txt +96 -0
- package/public/packages/atom/0.24.0/components/textarea.txt +96 -0
- package/public/packages/atom/0.24.0/components/toast.txt +124 -0
- package/public/packages/atom/0.24.0/components/toggle-group.txt +118 -0
- package/public/packages/atom/0.24.0/components/toggle.txt +110 -0
- package/public/packages/atom/0.24.0/components/toolbar.txt +98 -0
- package/public/packages/atom/0.24.0/components/tooltip.txt +112 -0
- package/public/packages/atom/0.24.0/components/tree-grid.txt +138 -0
- package/public/packages/atom/0.24.0/components/tree.txt +138 -0
- package/public/packages/atom/0.24.0/components/visually-hidden.txt +119 -0
- package/public/packages/atom/0.24.0/docs/guides/agent-knowledge.txt +55 -0
- package/public/packages/atom/0.24.0/docs/guides/getting-started.txt +65 -0
- package/public/packages/atom/0.24.0/docs/guides/imports.txt +26 -0
- package/public/packages/atom/0.24.0/docs/guides/public-api.txt +100 -0
- package/public/packages/atom/0.24.0/guides/behavior-composition.txt +277 -0
- package/public/packages/atom/0.24.0/guides/layer-selection.txt +807 -0
- package/public/packages/atom/0.24.0/index.txt +89 -0
- package/public/packages/brick/0.1.11/components/accordion.txt +158 -0
- package/public/packages/brick/0.1.11/components/alert-dialog.txt +175 -0
- package/public/packages/brick/0.1.11/components/app-bar.txt +134 -0
- package/public/packages/brick/0.1.11/components/appearance.txt +143 -0
- package/public/packages/brick/0.1.11/components/aspect-ratio.txt +136 -0
- package/public/packages/brick/0.1.11/components/avatar.txt +152 -0
- package/public/packages/brick/0.1.11/components/badge.txt +139 -0
- package/public/packages/brick/0.1.11/components/bleed.txt +104 -0
- package/public/packages/brick/0.1.11/components/bottom-navigation.txt +106 -0
- package/public/packages/brick/0.1.11/components/breadcrumb.txt +96 -0
- package/public/packages/brick/0.1.11/components/button.txt +103 -0
- package/public/packages/brick/0.1.11/components/card.txt +132 -0
- package/public/packages/brick/0.1.11/components/carousel.txt +206 -0
- package/public/packages/brick/0.1.11/components/checkbox-group.txt +175 -0
- package/public/packages/brick/0.1.11/components/checkbox.txt +103 -0
- package/public/packages/brick/0.1.11/components/chip.txt +128 -0
- package/public/packages/brick/0.1.11/components/code-block.txt +134 -0
- package/public/packages/brick/0.1.11/components/code.txt +120 -0
- package/public/packages/brick/0.1.11/components/collapsible.txt +179 -0
- package/public/packages/brick/0.1.11/components/color-picker.txt +135 -0
- package/public/packages/brick/0.1.11/components/color-swatch.txt +98 -0
- package/public/packages/brick/0.1.11/components/combobox.txt +157 -0
- package/public/packages/brick/0.1.11/components/container.txt +112 -0
- package/public/packages/brick/0.1.11/components/context-menu.txt +174 -0
- package/public/packages/brick/0.1.11/components/data-grid.txt +199 -0
- package/public/packages/brick/0.1.11/components/data-list.txt +115 -0
- package/public/packages/brick/0.1.11/components/dialog.txt +176 -0
- package/public/packages/brick/0.1.11/components/divider.txt +104 -0
- package/public/packages/brick/0.1.11/components/drawer.txt +146 -0
- package/public/packages/brick/0.1.11/components/dropdown-menu.txt +179 -0
- package/public/packages/brick/0.1.11/components/feed.txt +143 -0
- package/public/packages/brick/0.1.11/components/field.txt +115 -0
- package/public/packages/brick/0.1.11/components/fieldset.txt +103 -0
- package/public/packages/brick/0.1.11/components/file-upload.txt +154 -0
- package/public/packages/brick/0.1.11/components/form.txt +108 -0
- package/public/packages/brick/0.1.11/components/frame.txt +132 -0
- package/public/packages/brick/0.1.11/components/grid.txt +141 -0
- package/public/packages/brick/0.1.11/components/group.txt +136 -0
- package/public/packages/brick/0.1.11/components/hide.txt +121 -0
- package/public/packages/brick/0.1.11/components/hover-card.txt +156 -0
- package/public/packages/brick/0.1.11/components/icon-button.txt +119 -0
- package/public/packages/brick/0.1.11/components/icon.txt +160 -0
- package/public/packages/brick/0.1.11/components/image.txt +163 -0
- package/public/packages/brick/0.1.11/components/input.txt +101 -0
- package/public/packages/brick/0.1.11/components/link-box.txt +161 -0
- package/public/packages/brick/0.1.11/components/link.txt +133 -0
- package/public/packages/brick/0.1.11/components/list.txt +139 -0
- package/public/packages/brick/0.1.11/components/menubar.txt +174 -0
- package/public/packages/brick/0.1.11/components/multi-select.txt +153 -0
- package/public/packages/brick/0.1.11/components/nav-list.txt +130 -0
- package/public/packages/brick/0.1.11/components/navigation-menu.txt +150 -0
- package/public/packages/brick/0.1.11/components/notification-badge.txt +148 -0
- package/public/packages/brick/0.1.11/components/number-input.txt +150 -0
- package/public/packages/brick/0.1.11/components/otp-field.txt +146 -0
- package/public/packages/brick/0.1.11/components/pagination.txt +124 -0
- package/public/packages/brick/0.1.11/components/password-toggle-field.txt +146 -0
- package/public/packages/brick/0.1.11/components/popover.txt +181 -0
- package/public/packages/brick/0.1.11/components/progress-circle.txt +142 -0
- package/public/packages/brick/0.1.11/components/progress.txt +150 -0
- package/public/packages/brick/0.1.11/components/radio-group.txt +152 -0
- package/public/packages/brick/0.1.11/components/rating.txt +151 -0
- package/public/packages/brick/0.1.11/components/reorderable-list.txt +130 -0
- package/public/packages/brick/0.1.11/components/scroll-area.txt +110 -0
- package/public/packages/brick/0.1.11/components/section.txt +118 -0
- package/public/packages/brick/0.1.11/components/segment-group.txt +116 -0
- package/public/packages/brick/0.1.11/components/select.txt +157 -0
- package/public/packages/brick/0.1.11/components/show.txt +121 -0
- package/public/packages/brick/0.1.11/components/sidebar.txt +126 -0
- package/public/packages/brick/0.1.11/components/skeleton.txt +127 -0
- package/public/packages/brick/0.1.11/components/skip-link.txt +102 -0
- package/public/packages/brick/0.1.11/components/slider.txt +147 -0
- package/public/packages/brick/0.1.11/components/stack.txt +155 -0
- package/public/packages/brick/0.1.11/components/status.txt +110 -0
- package/public/packages/brick/0.1.11/components/surface.txt +194 -0
- package/public/packages/brick/0.1.11/components/swipeable-item.txt +154 -0
- package/public/packages/brick/0.1.11/components/switch.txt +152 -0
- package/public/packages/brick/0.1.11/components/table.txt +183 -0
- package/public/packages/brick/0.1.11/components/tabs.txt +136 -0
- package/public/packages/brick/0.1.11/components/text.txt +148 -0
- package/public/packages/brick/0.1.11/components/textarea.txt +101 -0
- package/public/packages/brick/0.1.11/components/toast.txt +150 -0
- package/public/packages/brick/0.1.11/components/toggle-group.txt +149 -0
- package/public/packages/brick/0.1.11/components/toggle.txt +140 -0
- package/public/packages/brick/0.1.11/components/toolbar.txt +118 -0
- package/public/packages/brick/0.1.11/components/tooltip.txt +156 -0
- package/public/packages/brick/0.1.11/components/tree-grid.txt +160 -0
- package/public/packages/brick/0.1.11/components/tree.txt +156 -0
- package/public/packages/brick/0.1.11/components/visually-hidden.txt +123 -0
- package/public/packages/brick/0.1.11/components/z-stack.txt +143 -0
- package/public/packages/brick/0.1.11/docs/guides/agent-knowledge.txt +67 -0
- package/public/packages/brick/0.1.11/docs/guides/appearance-and-tokens.txt +179 -0
- package/public/packages/brick/0.1.11/docs/guides/browser-support.txt +25 -0
- package/public/packages/brick/0.1.11/docs/guides/control-sizing.txt +59 -0
- package/public/packages/brick/0.1.11/docs/guides/installation.txt +79 -0
- package/public/packages/brick/0.1.11/docs/guides/theme-contract.txt +90 -0
- package/public/packages/brick/0.1.11/guides/interface-composition.txt +665 -0
- package/public/packages/brick/0.1.11/guides/layer-selection.txt +1437 -0
- package/public/packages/brick/0.1.11/index.txt +110 -0
- package/public/packages/colors/0.1.1/docs/agent-knowledge.txt +63 -0
- package/public/packages/colors/0.1.1/docs/architecture.txt +74 -0
- package/public/packages/colors/0.1.1/docs/color-foundations.txt +128 -0
- package/public/packages/colors/0.1.1/docs/compatibility.txt +75 -0
- package/public/packages/colors/0.1.1/docs/dependency-qualification.txt +117 -0
- package/public/packages/colors/0.1.1/docs/installation.txt +48 -0
- package/public/packages/colors/0.1.1/docs/palette-generation.txt +151 -0
- package/public/packages/colors/0.1.1/docs/releasing.txt +34 -0
- package/public/packages/colors/0.1.1/docs/testing.txt +51 -0
- package/public/packages/colors/0.1.1/guides/colors-system.txt +282 -0
- package/public/packages/colors/0.1.1/index.txt +29 -0
- package/public/packages/colors/0.1.1/operations/color-conversion.txt +14 -0
- package/public/packages/colors/0.1.1/operations/color-inspection.txt +23 -0
- package/public/packages/colors/0.1.1/operations/color-measurement.txt +18 -0
- package/public/packages/colors/0.1.1/operations/color-provenance.txt +14 -0
- package/public/packages/colors/0.1.1/operations/named-palette-reference.txt +15 -0
- package/public/packages/colors/0.1.1/operations/palette-candidate.txt +37 -0
- package/public/packages/theme/0.1.1/docs/agent-knowledge.txt +44 -0
- package/public/packages/theme/0.1.1/docs/appearances-and-portals.txt +41 -0
- package/public/packages/theme/0.1.1/docs/architecture.txt +121 -0
- package/public/packages/theme/0.1.1/docs/authoring.txt +141 -0
- package/public/packages/theme/0.1.1/docs/colors-interchange.txt +82 -0
- package/public/packages/theme/0.1.1/docs/fonts.txt +40 -0
- package/public/packages/theme/0.1.1/docs/installation.txt +45 -0
- package/public/packages/theme/0.1.1/docs/migration.txt +40 -0
- package/public/packages/theme/0.1.1/docs/testing.txt +64 -0
- package/public/packages/theme/0.1.1/docs/troubleshooting.txt +53 -0
- package/public/packages/theme/0.1.1/guides/theme-system.txt +340 -0
- package/public/packages/theme/0.1.1/index.txt +31 -0
- package/public/packages/theme/0.1.1/operations/brick-contract-compatibility.txt +35 -0
- package/public/packages/theme/0.1.1/operations/colors-interchange.txt +35 -0
- package/public/packages/theme/0.1.1/operations/theme-artifacts.txt +19 -0
- package/public/packages/theme/0.1.1/operations/theme-cli.txt +10 -0
- package/public/packages/theme/0.1.1/operations/theme-compilation.txt +23 -0
- package/public/packages/theme/0.1.1/operations/theme-definition.txt +36 -0
- package/public/packages/theme/0.1.1/operations/theme-validation.txt +19 -0
- package/public/tasks/data.txt +39 -0
- package/public/tasks/forms.txt +65 -0
- package/public/tasks/layout.txt +37 -0
- package/public/tasks/navigation.txt +51 -0
- package/public/tasks/overlays.txt +39 -0
- package/public/tasks/theming.txt +37 -0
- package/skills/flowstack-ui-builder/SKILL.md +35 -0
- package/skills/flowstack-ui-builder/agents/openai.yaml +4 -0
- package/skills/flowstack-ui-builder/scripts/resolve-agent-knowledge.mjs +399 -0
- package/skills/flowstack-ui-compose/SKILL.md +32 -0
- package/skills/flowstack-ui-compose/agents/openai.yaml +4 -0
- package/skills/flowstack-ui-compose/scripts/resolve-agent-knowledge.mjs +399 -0
- package/skills/flowstack-ui-maintainer/SKILL.md +40 -0
- package/skills/flowstack-ui-maintainer/agents/openai.yaml +4 -0
- package/skills/flowstack-ui-maintainer/scripts/resolve-agent-knowledge.mjs +399 -0
- package/skills/flowstack-ui-review/SKILL.md +29 -0
- package/skills/flowstack-ui-review/agents/openai.yaml +4 -0
- package/skills/flowstack-ui-review/scripts/resolve-agent-knowledge.mjs +399 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Badge
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: badge
|
|
6
|
+
|
|
7
|
+
# Badge agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Wrap a short contextual label, count, or status as normal inline semantic content without adding interaction or automatic announcement behavior.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- A compact count or status word supplements nearby content and can be understood from its visible owning context.
|
|
16
|
+
|
|
17
|
+
## Choose something else when
|
|
18
|
+
|
|
19
|
+
- The element performs an action, communicates task completion, represents identity, or a changing update must be announced automatically. Use Button, Progress, Avatar, or a deliberately chosen live-region pattern.
|
|
20
|
+
|
|
21
|
+
## Required composition
|
|
22
|
+
|
|
23
|
+
- Place concise Badge text beside the content it qualifies. Include a visual count attached to a control in that control's accessible naming or owning context, and add live-region semantics outside Badge only when the update's urgency and frequency justify announcement.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **MUST:** Keep Badge noninteractive; use a real Button or Link when the content activates an action or navigation.
|
|
28
|
+
- **MUST:** Provide enough nearby text or owning-control context for a count or status to be understood without relying on color, shape, or position alone.
|
|
29
|
+
- **MUST:** When Badge is visually attached to a control, ensure the meaningful count or status is included in that control's accessible name or description because a sibling Badge is not incorporated automatically.
|
|
30
|
+
- **MUST:** Do not assume Badge announces changes; add an appropriate live region deliberately only when an update needs announcement and avoid noisy duplicate paths.
|
|
31
|
+
- **MUST:** Do not rely on aria-label to give the default generic span meaning; use understandable text and surrounding semantics.
|
|
32
|
+
|
|
33
|
+
## Common mistakes
|
|
34
|
+
|
|
35
|
+
- **Avoid:** Making Badge clickable or using a color-only dot as an essential status. **Instead:** Use an actual interactive primitive for actions and include concise textual status in an understandable context.
|
|
36
|
+
- **Avoid:** Assuming a notification count beside an icon button is part of the button name or will announce when it changes. **Instead:** Author the control name or description and live behavior explicitly.
|
|
37
|
+
|
|
38
|
+
## Validation checklist
|
|
39
|
+
|
|
40
|
+
- Verify concise count and text-status variants are understandable in reading order and without color, and that no unintended role, Tab stop, or keyboard behavior exists.
|
|
41
|
+
- Inspect controls with attached Badges to confirm their accessible names or descriptions contain the meaningful status independently of visual proximity.
|
|
42
|
+
- For dynamic updates, verify the chosen announcement owner, priority, and frequency and confirm Badge does not create a duplicate live path; verify server-safe subpath and composition behavior.
|
|
43
|
+
|
|
44
|
+
## Related guidance
|
|
45
|
+
|
|
46
|
+
- `button`
|
|
47
|
+
- `progress`
|
|
48
|
+
- `avatar`
|
|
49
|
+
- `toast`
|
|
50
|
+
|
|
51
|
+
## Machine record
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"schema": "flowstack.agent-component.v1",
|
|
56
|
+
"id": "badge",
|
|
57
|
+
"name": "Badge",
|
|
58
|
+
"package": "@flowstack-ui/atom",
|
|
59
|
+
"layer": "atom",
|
|
60
|
+
"kind": "component",
|
|
61
|
+
"purpose": "Wrap a short contextual label, count, or status as normal inline semantic content without adding interaction or automatic announcement behavior.",
|
|
62
|
+
"useWhen": [
|
|
63
|
+
"A compact count or status word supplements nearby content and can be understood from its visible owning context."
|
|
64
|
+
],
|
|
65
|
+
"avoidWhen": [
|
|
66
|
+
{
|
|
67
|
+
"condition": "The element performs an action, communicates task completion, represents identity, or a changing update must be announced automatically.",
|
|
68
|
+
"useInstead": "Button, Progress, Avatar, or a deliberately chosen live-region pattern"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"composition": [
|
|
72
|
+
"Place concise Badge text beside the content it qualifies. Include a visual count attached to a control in that control's accessible naming or owning context, and add live-region semantics outside Badge only when the update's urgency and frequency justify announcement."
|
|
73
|
+
],
|
|
74
|
+
"rules": [
|
|
75
|
+
{
|
|
76
|
+
"id": "badge-passive",
|
|
77
|
+
"level": "must",
|
|
78
|
+
"statement": "Keep Badge noninteractive; use a real Button or Link when the content activates an action or navigation."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "badge-context",
|
|
82
|
+
"level": "must",
|
|
83
|
+
"statement": "Provide enough nearby text or owning-control context for a count or status to be understood without relying on color, shape, or position alone."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "badge-control-name",
|
|
87
|
+
"level": "must",
|
|
88
|
+
"statement": "When Badge is visually attached to a control, ensure the meaningful count or status is included in that control's accessible name or description because a sibling Badge is not incorporated automatically."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "badge-live-boundary",
|
|
92
|
+
"level": "must",
|
|
93
|
+
"statement": "Do not assume Badge announces changes; add an appropriate live region deliberately only when an update needs announcement and avoid noisy duplicate paths."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "badge-generic-span",
|
|
97
|
+
"level": "must",
|
|
98
|
+
"statement": "Do not rely on aria-label to give the default generic span meaning; use understandable text and surrounding semantics."
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"commonMistakes": [
|
|
102
|
+
{
|
|
103
|
+
"mistake": "Making Badge clickable or using a color-only dot as an essential status.",
|
|
104
|
+
"correction": "Use an actual interactive primitive for actions and include concise textual status in an understandable context."
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"mistake": "Assuming a notification count beside an icon button is part of the button name or will announce when it changes.",
|
|
108
|
+
"correction": "Author the control name or description and live behavior explicitly."
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"validation": [
|
|
112
|
+
"Verify concise count and text-status variants are understandable in reading order and without color, and that no unintended role, Tab stop, or keyboard behavior exists.",
|
|
113
|
+
"Inspect controls with attached Badges to confirm their accessible names or descriptions contain the meaningful status independently of visual proximity.",
|
|
114
|
+
"For dynamic updates, verify the chosen announcement owner, priority, and frequency and confirm Badge does not create a duplicate live path; verify server-safe subpath and composition behavior."
|
|
115
|
+
],
|
|
116
|
+
"related": [
|
|
117
|
+
"button",
|
|
118
|
+
"progress",
|
|
119
|
+
"avatar",
|
|
120
|
+
"toast"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# BottomNavigation
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: bottom-navigation
|
|
6
|
+
|
|
7
|
+
# BottomNavigation agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Provide a named navigation landmark with active state for a short, stable set of primary application destinations.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- A compact application has a small stable set of top-level destinations commonly presented at the bottom.
|
|
16
|
+
|
|
17
|
+
## Choose something else when
|
|
18
|
+
|
|
19
|
+
- The items are long, grouped, or switch panels within one page. Use NavList or Tabs.
|
|
20
|
+
|
|
21
|
+
## Required composition
|
|
22
|
+
|
|
23
|
+
- Compose Item parts with unique values inside Root; provide href for real destinations and omit it only for application-controlled view changes.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **MUST:** Use link Items for URL destinations and button Items only for view changes.
|
|
28
|
+
- **MUST:** Keep authored label text available as each Item's accessible name even when the styled layer hides it.
|
|
29
|
+
|
|
30
|
+
## Common mistakes
|
|
31
|
+
|
|
32
|
+
- **Avoid:** Using BottomNavigation for a large menu or hiding labels from assistive technology. **Instead:** Use NavList for larger navigation and preserve every Item name.
|
|
33
|
+
|
|
34
|
+
## Validation checklist
|
|
35
|
+
|
|
36
|
+
- Confirm the landmark name distinguishes it from other navigation.
|
|
37
|
+
- Confirm the active destination exposes aria-current and disabled Items cannot navigate.
|
|
38
|
+
|
|
39
|
+
## Related guidance
|
|
40
|
+
|
|
41
|
+
- `nav-list`
|
|
42
|
+
- `tabs`
|
|
43
|
+
- `link`
|
|
44
|
+
|
|
45
|
+
## Machine record
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schema": "flowstack.agent-component.v1",
|
|
50
|
+
"id": "bottom-navigation",
|
|
51
|
+
"name": "BottomNavigation",
|
|
52
|
+
"package": "@flowstack-ui/atom",
|
|
53
|
+
"layer": "atom",
|
|
54
|
+
"kind": "component",
|
|
55
|
+
"purpose": "Provide a named navigation landmark with active state for a short, stable set of primary application destinations.",
|
|
56
|
+
"useWhen": [
|
|
57
|
+
"A compact application has a small stable set of top-level destinations commonly presented at the bottom."
|
|
58
|
+
],
|
|
59
|
+
"avoidWhen": [
|
|
60
|
+
{
|
|
61
|
+
"condition": "The items are long, grouped, or switch panels within one page.",
|
|
62
|
+
"useInstead": "NavList or Tabs"
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"composition": [
|
|
66
|
+
"Compose Item parts with unique values inside Root; provide href for real destinations and omit it only for application-controlled view changes."
|
|
67
|
+
],
|
|
68
|
+
"rules": [
|
|
69
|
+
{
|
|
70
|
+
"id": "bottom-nav-destination-semantics",
|
|
71
|
+
"level": "must",
|
|
72
|
+
"statement": "Use link Items for URL destinations and button Items only for view changes."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "bottom-nav-label",
|
|
76
|
+
"level": "must",
|
|
77
|
+
"statement": "Keep authored label text available as each Item's accessible name even when the styled layer hides it."
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"commonMistakes": [
|
|
81
|
+
{
|
|
82
|
+
"mistake": "Using BottomNavigation for a large menu or hiding labels from assistive technology.",
|
|
83
|
+
"correction": "Use NavList for larger navigation and preserve every Item name."
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"validation": [
|
|
87
|
+
"Confirm the landmark name distinguishes it from other navigation.",
|
|
88
|
+
"Confirm the active destination exposes aria-current and disabled Items cannot navigate."
|
|
89
|
+
],
|
|
90
|
+
"related": [
|
|
91
|
+
"nav-list",
|
|
92
|
+
"tabs",
|
|
93
|
+
"link"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Breadcrumb
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: breadcrumb
|
|
6
|
+
|
|
7
|
+
# Breadcrumb agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Represent the current page's ancestry as a named navigation landmark and ordered hierarchy.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- The current page belongs to a hierarchy and users may navigate to ancestor pages.
|
|
16
|
+
|
|
17
|
+
## Choose something else when
|
|
18
|
+
|
|
19
|
+
- The choices are result pages or a general destination list. Use Pagination or NavList.
|
|
20
|
+
|
|
21
|
+
## Required composition
|
|
22
|
+
|
|
23
|
+
- Compose Root > List > Item containing ancestor Link or the single current Page, with decorative Separator parts between items.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **MUST:** Render one non-link Page for the current location and use links only for ancestors.
|
|
28
|
+
- **MUST:** When Ellipsis opens hidden pages, compose it with a real named button.
|
|
29
|
+
|
|
30
|
+
## Common mistakes
|
|
31
|
+
|
|
32
|
+
- **Avoid:** Making the current page another link or placing separators outside the ordered list. **Instead:** Use Page once and keep Item and Separator parts inside List.
|
|
33
|
+
|
|
34
|
+
## Validation checklist
|
|
35
|
+
|
|
36
|
+
- Confirm the nav has a useful accessible name and one aria-current page.
|
|
37
|
+
- Confirm separators are absent from the accessibility tree.
|
|
38
|
+
|
|
39
|
+
## Related guidance
|
|
40
|
+
|
|
41
|
+
- `link`
|
|
42
|
+
- `pagination`
|
|
43
|
+
- `nav-list`
|
|
44
|
+
|
|
45
|
+
## Machine record
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schema": "flowstack.agent-component.v1",
|
|
50
|
+
"id": "breadcrumb",
|
|
51
|
+
"name": "Breadcrumb",
|
|
52
|
+
"package": "@flowstack-ui/atom",
|
|
53
|
+
"layer": "atom",
|
|
54
|
+
"kind": "component",
|
|
55
|
+
"purpose": "Represent the current page's ancestry as a named navigation landmark and ordered hierarchy.",
|
|
56
|
+
"useWhen": [
|
|
57
|
+
"The current page belongs to a hierarchy and users may navigate to ancestor pages."
|
|
58
|
+
],
|
|
59
|
+
"avoidWhen": [
|
|
60
|
+
{
|
|
61
|
+
"condition": "The choices are result pages or a general destination list.",
|
|
62
|
+
"useInstead": "Pagination or NavList"
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"composition": [
|
|
66
|
+
"Compose Root > List > Item containing ancestor Link or the single current Page, with decorative Separator parts between items."
|
|
67
|
+
],
|
|
68
|
+
"rules": [
|
|
69
|
+
{
|
|
70
|
+
"id": "breadcrumb-one-current",
|
|
71
|
+
"level": "must",
|
|
72
|
+
"statement": "Render one non-link Page for the current location and use links only for ancestors."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "breadcrumb-interactive-ellipsis",
|
|
76
|
+
"level": "must",
|
|
77
|
+
"statement": "When Ellipsis opens hidden pages, compose it with a real named button."
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"commonMistakes": [
|
|
81
|
+
{
|
|
82
|
+
"mistake": "Making the current page another link or placing separators outside the ordered list.",
|
|
83
|
+
"correction": "Use Page once and keep Item and Separator parts inside List."
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"validation": [
|
|
87
|
+
"Confirm the nav has a useful accessible name and one aria-current page.",
|
|
88
|
+
"Confirm separators are absent from the accessibility tree."
|
|
89
|
+
],
|
|
90
|
+
"related": [
|
|
91
|
+
"link",
|
|
92
|
+
"pagination",
|
|
93
|
+
"nav-list"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: button
|
|
6
|
+
|
|
7
|
+
# Button agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Provide native action behavior or safe emphasized-link behavior while preserving the correct button or link semantics through custom rendering.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- The user triggers an action such as submit, save, open, dismiss, or retry.
|
|
16
|
+
- A destination is intentionally presented as an emphasized action control and Button receives its href.
|
|
17
|
+
|
|
18
|
+
## Choose something else when
|
|
19
|
+
|
|
20
|
+
- A destination should read as ordinary inline or standalone navigation. Use Link.
|
|
21
|
+
|
|
22
|
+
## Required composition
|
|
23
|
+
|
|
24
|
+
- Use Button.Root without href for an action and with href for an emphasized destination; compose through asChild or render only when the replacement preserves the resolved semantics.
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
|
|
28
|
+
- **MUST:** Omit href for actions and provide href for emphasized destinations so Button resolves the correct native semantics.
|
|
29
|
+
- **SHOULD:** Set type explicitly inside a form unless submit is intended.
|
|
30
|
+
|
|
31
|
+
## Common mistakes
|
|
32
|
+
|
|
33
|
+
- **Avoid:** Navigating from onPress without exposing a destination. **Instead:** Provide href for Button link mode, or use Link when the destination should read as ordinary navigation.
|
|
34
|
+
|
|
35
|
+
## Validation checklist
|
|
36
|
+
|
|
37
|
+
- Confirm the rendered element has an accessible name.
|
|
38
|
+
- Confirm keyboard activation and disabled behavior match the intended action.
|
|
39
|
+
|
|
40
|
+
## Related guidance
|
|
41
|
+
|
|
42
|
+
- `link`
|
|
43
|
+
- `pressable`
|
|
44
|
+
- `form`
|
|
45
|
+
|
|
46
|
+
## Machine record
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"schema": "flowstack.agent-component.v1",
|
|
51
|
+
"id": "button",
|
|
52
|
+
"name": "Button",
|
|
53
|
+
"package": "@flowstack-ui/atom",
|
|
54
|
+
"layer": "atom",
|
|
55
|
+
"kind": "component",
|
|
56
|
+
"purpose": "Provide native action behavior or safe emphasized-link behavior while preserving the correct button or link semantics through custom rendering.",
|
|
57
|
+
"useWhen": [
|
|
58
|
+
"The user triggers an action such as submit, save, open, dismiss, or retry.",
|
|
59
|
+
"A destination is intentionally presented as an emphasized action control and Button receives its href."
|
|
60
|
+
],
|
|
61
|
+
"avoidWhen": [
|
|
62
|
+
{
|
|
63
|
+
"condition": "A destination should read as ordinary inline or standalone navigation.",
|
|
64
|
+
"useInstead": "Link"
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"composition": [
|
|
68
|
+
"Use Button.Root without href for an action and with href for an emphasized destination; compose through asChild or render only when the replacement preserves the resolved semantics."
|
|
69
|
+
],
|
|
70
|
+
"rules": [
|
|
71
|
+
{
|
|
72
|
+
"id": "button-resolved-semantics",
|
|
73
|
+
"level": "must",
|
|
74
|
+
"statement": "Omit href for actions and provide href for emphasized destinations so Button resolves the correct native semantics."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "button-explicit-type",
|
|
78
|
+
"level": "should",
|
|
79
|
+
"statement": "Set type explicitly inside a form unless submit is intended."
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"commonMistakes": [
|
|
83
|
+
{
|
|
84
|
+
"mistake": "Navigating from onPress without exposing a destination.",
|
|
85
|
+
"correction": "Provide href for Button link mode, or use Link when the destination should read as ordinary navigation."
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
"validation": [
|
|
89
|
+
"Confirm the rendered element has an accessible name.",
|
|
90
|
+
"Confirm keyboard activation and disabled behavior match the intended action."
|
|
91
|
+
],
|
|
92
|
+
"related": [
|
|
93
|
+
"link",
|
|
94
|
+
"pressable",
|
|
95
|
+
"form"
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Carousel
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: carousel
|
|
6
|
+
|
|
7
|
+
# Carousel agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Coordinate one-active-slide content rotation, optional automatic playback, direct selection, native swipe scrolling, and accessible inactive-slide semantics.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- A small sequence of authored content should occupy one viewport and support previous, next, direct, touch, or optional timed selection.
|
|
16
|
+
|
|
17
|
+
## Choose something else when
|
|
18
|
+
|
|
19
|
+
- All items should remain visible, named document panels are selected, or a row reveals actions. Use ordinary layout or scrolling, Tabs, or SwipeableItem.
|
|
20
|
+
|
|
21
|
+
## Required composition
|
|
22
|
+
|
|
23
|
+
- Compose Root, Viewport, Track, and uniquely valued Slide parts; add Previous, Next, Picker with PickerItem, and RotationControl only when the experience needs those controls.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **MUST:** Provide value or defaultValue matching one Slide and give every Slide a short unique accessible label.
|
|
28
|
+
- **MUST:** When automatic rotation is enabled, include visible RotationControl, Previous, and Next controls; Picker controls remain optional.
|
|
29
|
+
- **SHOULD:** Keep grouped PickerItem controls to a small set because each native picker button is a tab stop.
|
|
30
|
+
- **MUST:** Supply viewport overflow, one-slide track geometry, and scroll snap in the styled layer; do not replace Atom selection, pause, or inactive semantics.
|
|
31
|
+
- **MUST:** Keep styled viewport motion instant until Root exposes data-initialized, then enable the ordinary motion recipe so SSR hydration cannot start a competing native snap animation.
|
|
32
|
+
- **MUST:** Style carousel-loop-boundary spacers and data-loop-position Slides as one-viewport boundary positions so Next and Previous preserve their requested direction; never clone authored slide content.
|
|
33
|
+
- **MUST:** Do not place essential content only in a slide that users cannot reach without waiting for automatic rotation.
|
|
34
|
+
|
|
35
|
+
## Common mistakes
|
|
36
|
+
|
|
37
|
+
- **Avoid:** Using Tabs for decorative dots, enabling autoplay without a stop control, reusing SwipeableItem, or adding custom timers and aria-hidden logic around Carousel. **Instead:** Use Carousel's optional grouped Picker, complete autoplay controls, and Atom-owned state, pause, scrolling, and inactive-slide contract.
|
|
38
|
+
|
|
39
|
+
## Validation checklist
|
|
40
|
+
|
|
41
|
+
- Verify controlled and uncontrolled selection, Previous/Next boundaries, last-to-first forward motion, first-to-last backward motion, picker selection, native touch scrolling, LTR and RTL, and external value changes.
|
|
42
|
+
- Verify autoplay timing, focus stop without automatic restart, temporary hover and document-visibility pause, visible rotation control, live-region mode, inactive inert state, labels, and reduced-motion handling in the styled layer.
|
|
43
|
+
|
|
44
|
+
## Related guidance
|
|
45
|
+
|
|
46
|
+
- `tabs`
|
|
47
|
+
- `swipeable-item`
|
|
48
|
+
- `pagination`
|
|
49
|
+
- `scroll-area`
|
|
50
|
+
|
|
51
|
+
## Machine record
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"schema": "flowstack.agent-component.v1",
|
|
56
|
+
"id": "carousel",
|
|
57
|
+
"name": "Carousel",
|
|
58
|
+
"package": "@flowstack-ui/atom",
|
|
59
|
+
"layer": "atom",
|
|
60
|
+
"kind": "component",
|
|
61
|
+
"purpose": "Coordinate one-active-slide content rotation, optional automatic playback, direct selection, native swipe scrolling, and accessible inactive-slide semantics.",
|
|
62
|
+
"useWhen": [
|
|
63
|
+
"A small sequence of authored content should occupy one viewport and support previous, next, direct, touch, or optional timed selection."
|
|
64
|
+
],
|
|
65
|
+
"avoidWhen": [
|
|
66
|
+
{
|
|
67
|
+
"condition": "All items should remain visible, named document panels are selected, or a row reveals actions.",
|
|
68
|
+
"useInstead": "ordinary layout or scrolling, Tabs, or SwipeableItem"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"composition": [
|
|
72
|
+
"Compose Root, Viewport, Track, and uniquely valued Slide parts; add Previous, Next, Picker with PickerItem, and RotationControl only when the experience needs those controls."
|
|
73
|
+
],
|
|
74
|
+
"rules": [
|
|
75
|
+
{
|
|
76
|
+
"id": "carousel-initial-value",
|
|
77
|
+
"level": "must",
|
|
78
|
+
"statement": "Provide value or defaultValue matching one Slide and give every Slide a short unique accessible label."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "carousel-autoplay-controls",
|
|
82
|
+
"level": "must",
|
|
83
|
+
"statement": "When automatic rotation is enabled, include visible RotationControl, Previous, and Next controls; Picker controls remain optional."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "carousel-small-picker",
|
|
87
|
+
"level": "should",
|
|
88
|
+
"statement": "Keep grouped PickerItem controls to a small set because each native picker button is a tab stop."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "carousel-layout-owner",
|
|
92
|
+
"level": "must",
|
|
93
|
+
"statement": "Supply viewport overflow, one-slide track geometry, and scroll snap in the styled layer; do not replace Atom selection, pause, or inactive semantics."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "carousel-initial-motion-gate",
|
|
97
|
+
"level": "must",
|
|
98
|
+
"statement": "Keep styled viewport motion instant until Root exposes data-initialized, then enable the ordinary motion recipe so SSR hydration cannot start a competing native snap animation."
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "carousel-directional-loop-layout",
|
|
102
|
+
"level": "must",
|
|
103
|
+
"statement": "Style carousel-loop-boundary spacers and data-loop-position Slides as one-viewport boundary positions so Next and Previous preserve their requested direction; never clone authored slide content."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "carousel-content-access",
|
|
107
|
+
"level": "must",
|
|
108
|
+
"statement": "Do not place essential content only in a slide that users cannot reach without waiting for automatic rotation."
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"commonMistakes": [
|
|
112
|
+
{
|
|
113
|
+
"mistake": "Using Tabs for decorative dots, enabling autoplay without a stop control, reusing SwipeableItem, or adding custom timers and aria-hidden logic around Carousel.",
|
|
114
|
+
"correction": "Use Carousel's optional grouped Picker, complete autoplay controls, and Atom-owned state, pause, scrolling, and inactive-slide contract."
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"validation": [
|
|
118
|
+
"Verify controlled and uncontrolled selection, Previous/Next boundaries, last-to-first forward motion, first-to-last backward motion, picker selection, native touch scrolling, LTR and RTL, and external value changes.",
|
|
119
|
+
"Verify autoplay timing, focus stop without automatic restart, temporary hover and document-visibility pause, visible rotation control, live-region mode, inactive inert state, labels, and reduced-motion handling in the styled layer."
|
|
120
|
+
],
|
|
121
|
+
"related": [
|
|
122
|
+
"tabs",
|
|
123
|
+
"swipeable-item",
|
|
124
|
+
"pagination",
|
|
125
|
+
"scroll-area"
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
```
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# CheckboxGroup
|
|
2
|
+
|
|
3
|
+
Source: @flowstack-ui/atom@0.24.0
|
|
4
|
+
Kind: component
|
|
5
|
+
ID: checkbox-group
|
|
6
|
+
|
|
7
|
+
# CheckboxGroup agent guide
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Manage a named set of independent checkbox choices with multi-value state, group validation, form submission, structured item relationships, and deterministic select-all behavior.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- A user may select any number of related form choices and the choices share naming, state, validation, or submission behavior.
|
|
16
|
+
|
|
17
|
+
## Choose something else when
|
|
18
|
+
|
|
19
|
+
- There is one yes-or-no choice, exactly one option must be chosen, or the controls represent pressed commands instead of form choices. Use Checkbox, RadioGroup, or ToggleGroup.
|
|
20
|
+
|
|
21
|
+
## Required composition
|
|
22
|
+
|
|
23
|
+
- Give Root an accessible group name and compose uniquely valued Item parts. Plain Item children may name concise options; use ItemLabel and ItemDescription for structured relationships. Add Parent only with an explicit complete allValues set, and use a native fieldset and legend when a visible legend is required.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **MUST:** Give Root a concise accessible name with native ARIA or an inherited Fieldset Legend; do not use unsupported aria-required on role=group.
|
|
28
|
+
- **MUST:** Give every Item a stable unique value and keep controlled value arrays synchronized through onValueChange; use name and form when the checked values must submit.
|
|
29
|
+
- **MUST:** Render Parent only when Root allValues explicitly names the complete currently selectable set; omit disabled values while disabled and preserve selected values outside that declared set.
|
|
30
|
+
- **MUST:** Use plain children as an Item name or pair one ItemLabel and optional ItemDescription; preserve native aria-label, aria-labelledby, and aria-describedby precedence.
|
|
31
|
+
- **MUST:** Preserve disabled, read-only, invalid, and required behavior, including one-or-more group validity, first-enabled validation focus, form reset, and hidden per-item submission inputs.
|
|
32
|
+
|
|
33
|
+
## Common mistakes
|
|
34
|
+
|
|
35
|
+
- **Avoid:** Treating required as every checkbox being required, computing Parent from only mounted or selected values, or using CheckboxGroup for exclusive or pressed-button choices. **Instead:** Required means at least one selected; declare Parent's full selectable set with allValues and choose RadioGroup or ToggleGroup for different interaction models.
|
|
36
|
+
|
|
37
|
+
## Validation checklist
|
|
38
|
+
|
|
39
|
+
- Verify controlled and uncontrolled arrays, unique values, independent Enter and Space toggling, disabled and read-only items, group and item naming, structured descriptions, orientation metadata, and asChild/render prop and ref merging.
|
|
40
|
+
- Verify named form submission, group-level required validity with and without a name, inline and native validation, first-enabled focus, Fieldset integration, reset, Parent unchecked/mixed/checked transitions, disabled-value exclusion, and preservation of outside values.
|
|
41
|
+
|
|
42
|
+
## Related guidance
|
|
43
|
+
|
|
44
|
+
- `checkbox`
|
|
45
|
+
- `radio-group`
|
|
46
|
+
- `toggle-group`
|
|
47
|
+
- `fieldset`
|
|
48
|
+
- `form`
|
|
49
|
+
|
|
50
|
+
## Machine record
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"schema": "flowstack.agent-component.v1",
|
|
55
|
+
"id": "checkbox-group",
|
|
56
|
+
"name": "CheckboxGroup",
|
|
57
|
+
"package": "@flowstack-ui/atom",
|
|
58
|
+
"layer": "atom",
|
|
59
|
+
"kind": "component",
|
|
60
|
+
"purpose": "Manage a named set of independent checkbox choices with multi-value state, group validation, form submission, structured item relationships, and deterministic select-all behavior.",
|
|
61
|
+
"useWhen": [
|
|
62
|
+
"A user may select any number of related form choices and the choices share naming, state, validation, or submission behavior."
|
|
63
|
+
],
|
|
64
|
+
"avoidWhen": [
|
|
65
|
+
{
|
|
66
|
+
"condition": "There is one yes-or-no choice, exactly one option must be chosen, or the controls represent pressed commands instead of form choices.",
|
|
67
|
+
"useInstead": "Checkbox, RadioGroup, or ToggleGroup"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"composition": [
|
|
71
|
+
"Give Root an accessible group name and compose uniquely valued Item parts. Plain Item children may name concise options; use ItemLabel and ItemDescription for structured relationships. Add Parent only with an explicit complete allValues set, and use a native fieldset and legend when a visible legend is required."
|
|
72
|
+
],
|
|
73
|
+
"rules": [
|
|
74
|
+
{
|
|
75
|
+
"id": "checkbox-group-name",
|
|
76
|
+
"level": "must",
|
|
77
|
+
"statement": "Give Root a concise accessible name with native ARIA or an inherited Fieldset Legend; do not use unsupported aria-required on role=group."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "checkbox-group-values",
|
|
81
|
+
"level": "must",
|
|
82
|
+
"statement": "Give every Item a stable unique value and keep controlled value arrays synchronized through onValueChange; use name and form when the checked values must submit."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "checkbox-group-parent",
|
|
86
|
+
"level": "must",
|
|
87
|
+
"statement": "Render Parent only when Root allValues explicitly names the complete currently selectable set; omit disabled values while disabled and preserve selected values outside that declared set."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "checkbox-group-labeling",
|
|
91
|
+
"level": "must",
|
|
92
|
+
"statement": "Use plain children as an Item name or pair one ItemLabel and optional ItemDescription; preserve native aria-label, aria-labelledby, and aria-describedby precedence."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "checkbox-group-state",
|
|
96
|
+
"level": "must",
|
|
97
|
+
"statement": "Preserve disabled, read-only, invalid, and required behavior, including one-or-more group validity, first-enabled validation focus, form reset, and hidden per-item submission inputs."
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"commonMistakes": [
|
|
101
|
+
{
|
|
102
|
+
"mistake": "Treating required as every checkbox being required, computing Parent from only mounted or selected values, or using CheckboxGroup for exclusive or pressed-button choices.",
|
|
103
|
+
"correction": "Required means at least one selected; declare Parent's full selectable set with allValues and choose RadioGroup or ToggleGroup for different interaction models."
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"validation": [
|
|
107
|
+
"Verify controlled and uncontrolled arrays, unique values, independent Enter and Space toggling, disabled and read-only items, group and item naming, structured descriptions, orientation metadata, and asChild/render prop and ref merging.",
|
|
108
|
+
"Verify named form submission, group-level required validity with and without a name, inline and native validation, first-enabled focus, Fieldset integration, reset, Parent unchecked/mixed/checked transitions, disabled-value exclusion, and preservation of outside values."
|
|
109
|
+
],
|
|
110
|
+
"related": [
|
|
111
|
+
"checkbox",
|
|
112
|
+
"radio-group",
|
|
113
|
+
"toggle-group",
|
|
114
|
+
"fieldset",
|
|
115
|
+
"form"
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
```
|