@arbor-education/design-system.components 0.13.0 → 0.14.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.
Files changed (232) hide show
  1. package/.agent-memory/blanche-designspert/MEMORY.md +189 -0
  2. package/.agent-memory/dorothy-fact-checker/MEMORY.md +228 -0
  3. package/.agent-memory/dorothy-fact-checker/numberinput_component.md +53 -0
  4. package/.agent-memory/dorothy-fact-checker/progress_component.md +36 -0
  5. package/.agent-memory/rose-storybookspert/MEMORY.md +105 -0
  6. package/.agent-memory/sophia-componentspert/MEMORY.md +34 -0
  7. package/{.claude/agent-memory → .agent-memory}/sophia-componentspert/components.md +170 -17
  8. package/{.claude → .gather}/agents/blanche-designspert.md +7 -2
  9. package/{.claude → .gather}/agents/dorothy-fact-checker.md +7 -2
  10. package/{.claude → .gather}/agents/rose-storybookspert.md +80 -11
  11. package/{.claude → .gather}/agents/sophia-componentspert.md +9 -4
  12. package/.gather/gather.yaml +9 -0
  13. package/{CLAUDE.md → .gather/instructions/project-overview.md} +42 -9
  14. package/{.claude → .gather}/skills/analyze-design/README.md +5 -0
  15. package/{.claude → .gather}/skills/analyze-design/SKILL.md +1 -1
  16. package/.gather/skills/analyze-design/meta.md +4 -0
  17. package/{.claude → .gather}/skills/create-page/README.md +5 -0
  18. package/{.claude → .gather}/skills/create-page/design-analysis-template.md +5 -0
  19. package/.gather/skills/create-page/meta.md +4 -0
  20. package/{.claude → .gather}/skills/create-page/page-template.scss +5 -0
  21. package/{.claude → .gather}/skills/create-page/page-template.tsx +5 -0
  22. package/{.claude → .gather}/skills/map-legacy/README.md +5 -0
  23. package/.gather/skills/map-legacy/meta.md +4 -0
  24. package/{.claude → .gather}/skills/migrate-page/README.md +5 -0
  25. package/.gather/skills/migrate-page/meta.md +4 -0
  26. package/.gather/skills/write-stories/README.md +157 -0
  27. package/.gather/skills/write-stories/SKILL.md +841 -0
  28. package/.gather/skills/write-stories/meta.md +4 -0
  29. package/.ralph/storybook-upgrade/knowledge.md +308 -0
  30. package/.ralph/storybook-upgrade/prd.json +777 -0
  31. package/.ralph/storybook-upgrade/progress.md +342 -0
  32. package/.storybook/DocsTemplate.tsx +122 -0
  33. package/.storybook/preview.ts +40 -0
  34. package/.stylelintignore +2 -0
  35. package/CHANGELOG.md +14 -0
  36. package/{.claude/component-library.md → component-library.md} +27 -10
  37. package/dist/components/articleCard/ArticleCard.d.ts +30 -0
  38. package/dist/components/articleCard/ArticleCard.d.ts.map +1 -0
  39. package/dist/components/articleCard/ArticleCard.js +24 -0
  40. package/dist/components/articleCard/ArticleCard.js.map +1 -0
  41. package/dist/components/articleCard/ArticleCard.stories.d.ts +18 -0
  42. package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -0
  43. package/dist/components/articleCard/ArticleCard.stories.js +112 -0
  44. package/dist/components/articleCard/ArticleCard.stories.js.map +1 -0
  45. package/dist/components/articleCard/ArticleCard.test.d.ts +2 -0
  46. package/dist/components/articleCard/ArticleCard.test.d.ts.map +1 -0
  47. package/dist/components/articleCard/ArticleCard.test.js +49 -0
  48. package/dist/components/articleCard/ArticleCard.test.js.map +1 -0
  49. package/dist/components/badge/Badge.stories.d.ts +85 -6
  50. package/dist/components/badge/Badge.stories.d.ts.map +1 -1
  51. package/dist/components/badge/Badge.stories.js +626 -27
  52. package/dist/components/badge/Badge.stories.js.map +1 -1
  53. package/dist/components/banner/Banner.stories.d.ts +129 -63
  54. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  55. package/dist/components/banner/Banner.stories.js +855 -39
  56. package/dist/components/banner/Banner.stories.js.map +1 -1
  57. package/dist/components/button/Button.stories.d.ts +148 -8
  58. package/dist/components/button/Button.stories.d.ts.map +1 -1
  59. package/dist/components/button/Button.stories.js +1089 -80
  60. package/dist/components/button/Button.stories.js.map +1 -1
  61. package/dist/components/card/Card.d.ts +41 -12
  62. package/dist/components/card/Card.d.ts.map +1 -1
  63. package/dist/components/card/Card.js +46 -17
  64. package/dist/components/card/Card.js.map +1 -1
  65. package/dist/components/card/Card.stories.d.ts +9 -84
  66. package/dist/components/card/Card.stories.d.ts.map +1 -1
  67. package/dist/components/card/Card.stories.js +15 -73
  68. package/dist/components/card/Card.stories.js.map +1 -1
  69. package/dist/components/card/Card.test.js +50 -152
  70. package/dist/components/card/Card.test.js.map +1 -1
  71. package/dist/components/dot/Dot.stories.d.ts +46 -11
  72. package/dist/components/dot/Dot.stories.d.ts.map +1 -1
  73. package/dist/components/dot/Dot.stories.js +504 -15
  74. package/dist/components/dot/Dot.stories.js.map +1 -1
  75. package/dist/components/dropdown/Dropdown.stories.d.ts +89 -14
  76. package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
  77. package/dist/components/dropdown/Dropdown.stories.js +769 -17
  78. package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
  79. package/dist/components/formField/FormField.stories.d.ts +95 -35
  80. package/dist/components/formField/FormField.stories.d.ts.map +1 -1
  81. package/dist/components/formField/FormField.stories.js +1174 -69
  82. package/dist/components/formField/FormField.stories.js.map +1 -1
  83. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts +96 -9
  84. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts.map +1 -1
  85. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js +717 -10
  86. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js.map +1 -1
  87. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts +149 -11
  88. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts.map +1 -1
  89. package/dist/components/formField/inputs/number/NumberInput.stories.js +624 -10
  90. package/dist/components/formField/inputs/number/NumberInput.stories.js.map +1 -1
  91. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts +74 -1
  92. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  93. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +673 -44
  94. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  95. package/dist/components/formField/inputs/text/TextInput.stories.d.ts +119 -1
  96. package/dist/components/formField/inputs/text/TextInput.stories.d.ts.map +1 -1
  97. package/dist/components/formField/inputs/text/TextInput.stories.js +549 -10
  98. package/dist/components/formField/inputs/text/TextInput.stories.js.map +1 -1
  99. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts +129 -4
  100. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
  101. package/dist/components/formField/inputs/textArea/TextArea.stories.js +577 -3
  102. package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
  103. package/dist/components/formField/inputs/time/TimeInput.d.ts +1 -1
  104. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +1 -1
  105. package/dist/components/heading/Heading.stories.d.ts +449 -50
  106. package/dist/components/heading/Heading.stories.d.ts.map +1 -1
  107. package/dist/components/heading/Heading.stories.js +536 -60
  108. package/dist/components/heading/Heading.stories.js.map +1 -1
  109. package/dist/components/icoText/IcoText.d.ts +37 -0
  110. package/dist/components/icoText/IcoText.d.ts.map +1 -0
  111. package/dist/components/icoText/IcoText.js +29 -0
  112. package/dist/components/icoText/IcoText.js.map +1 -0
  113. package/dist/components/icoText/IcoText.stories.d.ts +34 -0
  114. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -0
  115. package/dist/components/icoText/IcoText.stories.js +24 -0
  116. package/dist/components/icoText/IcoText.stories.js.map +1 -0
  117. package/dist/components/icoText/IcoText.test.d.ts +2 -0
  118. package/dist/components/icoText/IcoText.test.d.ts.map +1 -0
  119. package/dist/components/icoText/IcoText.test.js +27 -0
  120. package/dist/components/icoText/IcoText.test.js.map +1 -0
  121. package/dist/components/icon/Icon.stories.d.ts +81 -10
  122. package/dist/components/icon/Icon.stories.d.ts.map +1 -1
  123. package/dist/components/icon/Icon.stories.js +979 -8
  124. package/dist/components/icon/Icon.stories.js.map +1 -1
  125. package/dist/components/kpiCard/KPICard.d.ts +13 -0
  126. package/dist/components/kpiCard/KPICard.d.ts.map +1 -0
  127. package/dist/components/kpiCard/KPICard.js +8 -0
  128. package/dist/components/kpiCard/KPICard.js.map +1 -0
  129. package/dist/components/kpiCard/KPICard.stories.d.ts +9 -0
  130. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -0
  131. package/dist/components/kpiCard/KPICard.stories.js +18 -0
  132. package/dist/components/kpiCard/KPICard.stories.js.map +1 -0
  133. package/dist/components/kpiCard/KPICard.test.d.ts +2 -0
  134. package/dist/components/kpiCard/KPICard.test.d.ts.map +1 -0
  135. package/dist/components/kpiCard/KPICard.test.js +37 -0
  136. package/dist/components/kpiCard/KPICard.test.js.map +1 -0
  137. package/dist/components/kvpList/KVPList.d.ts +34 -0
  138. package/dist/components/kvpList/KVPList.d.ts.map +1 -0
  139. package/dist/components/kvpList/KVPList.js +20 -0
  140. package/dist/components/kvpList/KVPList.js.map +1 -0
  141. package/dist/components/kvpList/KVPList.stories.d.ts +27 -0
  142. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -0
  143. package/dist/components/kvpList/KVPList.stories.js +18 -0
  144. package/dist/components/kvpList/KVPList.stories.js.map +1 -0
  145. package/dist/components/kvpList/KVPList.test.d.ts +2 -0
  146. package/dist/components/kvpList/KVPList.test.d.ts.map +1 -0
  147. package/dist/components/kvpList/KVPList.test.js +29 -0
  148. package/dist/components/kvpList/KVPList.test.js.map +1 -0
  149. package/dist/components/pill/Pill.stories.d.ts +71 -19
  150. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  151. package/dist/components/pill/Pill.stories.js +573 -14
  152. package/dist/components/pill/Pill.stories.js.map +1 -1
  153. package/dist/components/progress/Progress.stories.d.ts +75 -298
  154. package/dist/components/progress/Progress.stories.d.ts.map +1 -1
  155. package/dist/components/progress/Progress.stories.js +449 -52
  156. package/dist/components/progress/Progress.stories.js.map +1 -1
  157. package/dist/components/separator/Separator.stories.d.ts +58 -5
  158. package/dist/components/separator/Separator.stories.d.ts.map +1 -1
  159. package/dist/components/separator/Separator.stories.js +443 -4
  160. package/dist/components/separator/Separator.stories.js.map +1 -1
  161. package/dist/components/singleUser/SingleUser.d.ts +1 -1
  162. package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
  163. package/dist/components/tag/Tag.stories.d.ts +116 -5
  164. package/dist/components/tag/Tag.stories.d.ts.map +1 -1
  165. package/dist/components/tag/Tag.stories.js +581 -28
  166. package/dist/components/tag/Tag.stories.js.map +1 -1
  167. package/dist/index.css +194 -23
  168. package/dist/index.css.map +1 -1
  169. package/dist/index.d.ts +13 -4
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +12 -3
  172. package/dist/index.js.map +1 -1
  173. package/eslint.config.mts +5 -1
  174. package/package.json +3 -3
  175. package/src/components/articleCard/ArticleCard.stories.tsx +132 -0
  176. package/src/components/articleCard/ArticleCard.test.tsx +121 -0
  177. package/src/components/articleCard/ArticleCard.tsx +100 -0
  178. package/src/components/articleCard/articleCard.scss +39 -0
  179. package/src/components/badge/Badge.stories.tsx +869 -42
  180. package/src/components/banner/Banner.stories.tsx +1081 -63
  181. package/src/components/button/Button.stories.tsx +1394 -99
  182. package/src/components/card/Card.stories.tsx +35 -79
  183. package/src/components/card/Card.test.tsx +72 -190
  184. package/src/components/card/Card.tsx +117 -58
  185. package/src/components/card/card.scss +18 -31
  186. package/src/components/dot/Dot.stories.tsx +723 -32
  187. package/src/components/dropdown/Dropdown.stories.tsx +1174 -35
  188. package/src/components/formField/FormField.stories.tsx +1522 -105
  189. package/src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx +1020 -15
  190. package/src/components/formField/inputs/number/NumberInput.stories.tsx +908 -15
  191. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +932 -51
  192. package/src/components/formField/inputs/text/TextInput.stories.tsx +773 -13
  193. package/src/components/formField/inputs/textArea/TextArea.stories.tsx +756 -8
  194. package/src/components/heading/Heading.stories.tsx +752 -120
  195. package/src/components/icoText/IcoText.stories.tsx +47 -0
  196. package/src/components/icoText/IcoText.test.tsx +41 -0
  197. package/src/components/icoText/IcoText.tsx +93 -0
  198. package/src/components/icoText/icoText.scss +34 -0
  199. package/src/components/icon/Icon.stories.tsx +1446 -12
  200. package/src/components/kpiCard/KPICard.stories.tsx +47 -0
  201. package/src/components/kpiCard/KPICard.test.tsx +60 -0
  202. package/src/components/kpiCard/KPICard.tsx +45 -0
  203. package/src/components/kpiCard/kpiCard.scss +35 -0
  204. package/src/components/kvpList/KVPList.stories.tsx +51 -0
  205. package/src/components/kvpList/KVPList.test.tsx +66 -0
  206. package/src/components/kvpList/KVPList.tsx +109 -0
  207. package/src/components/kvpList/kvpList.scss +64 -0
  208. package/src/components/pill/Pill.stories.tsx +867 -21
  209. package/src/components/progress/Progress.stories.tsx +625 -58
  210. package/src/components/separator/Separator.stories.tsx +730 -8
  211. package/src/components/separator/separator.scss +12 -3
  212. package/src/components/tag/Tag.stories.tsx +755 -53
  213. package/src/index.scss +4 -0
  214. package/src/index.ts +13 -4
  215. package/src/tokens.scss +6 -0
  216. package/tokens/json/Arbor.json +30 -0
  217. package/.claude/agent-memory/blanche-designspert/MEMORY.md +0 -64
  218. package/.claude/agent-memory/dorothy-fact-checker/MEMORY.md +0 -129
  219. package/.claude/agent-memory/rose-storybookspert/MEMORY.md +0 -29
  220. package/.claude/agent-memory/sophia-componentspert/MEMORY.md +0 -14
  221. package/.claude/design-assessment-daily-attendance-2026-04-10.md +0 -566
  222. package/.claude/figma-assessment-7154-58899.md +0 -404
  223. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-11086-97537.md +0 -392
  224. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-41974.md +0 -474
  225. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-43094.md +0 -462
  226. package/.claude/figma-assessment-fcFK4CGzkz2fVyY3koX8ZE-7154-59061.md +0 -440
  227. package/.claude/migration-report-custom-report-writer-2026-02-19.md +0 -591
  228. /package/{.claude/agent-memory → .agent-memory}/blanche-designspert/token-review-patterns.md +0 -0
  229. /package/{.claude/agent-memory → .agent-memory}/rose-storybookspert/patterns.md +0 -0
  230. /package/{.claude → .gather}/skills/create-page/SKILL.md +0 -0
  231. /package/{.claude → .gather}/skills/map-legacy/SKILL.md +0 -0
  232. /package/{.claude → .gather}/skills/migrate-page/SKILL.md +0 -0
@@ -1,28 +1,587 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Controls, Heading as DocHeading, Markdown, Primary as DocPrimary, Stories, Subtitle, Title, } from '@storybook/addon-docs/blocks';
3
+ import { useState } from 'react';
4
+ import { fn } from 'storybook/test';
1
5
  import { Pill } from './Pill';
6
+ // ---------------------------------------------------------------------------
7
+ // Docs page content
8
+ // ---------------------------------------------------------------------------
9
+ const DESCRIPTION_INTRO = [
10
+ 'Pill is an **interactive filter control** that lets users narrow or refine a data set without',
11
+ 'submitting a form. Think of it as a toggle you can tap to say "show me only this" — it changes',
12
+ 'state immediately, no Apply button required.',
13
+ '',
14
+ 'It has two modes. **Toggle mode** (the default) is for single-select filter rows where only one',
15
+ 'option should be active at a time. **Checkbox mode** (`checkbox={true}`) embeds a real',
16
+ '`CheckboxInput` and is for multi-select rows where several options can be active simultaneously.',
17
+ '',
18
+ 'The key distinction from `Tag` is interactivity: `Pill` is always a control that changes state;',
19
+ '`Tag` is always a non-interactive label. Never use `Pill` as a static label.',
20
+ ].join('\n');
21
+ const USAGE_GUIDANCE = [
22
+ '### When to use',
23
+ '',
24
+ '- **Filter by year group, status, or subject** — auto-apply, no form submit',
25
+ '- **Single-select toggle rows** — only one pill active at a time (toggle mode)',
26
+ '- **Multi-select rows** — several pills active simultaneously (checkbox mode)',
27
+ '- **"All" reset patterns** — an "All" pill at the start of the row that clears other filters',
28
+ '',
29
+ '---',
30
+ '',
31
+ '### When NOT to use',
32
+ '',
33
+ '| Scenario | Use instead |',
34
+ '|---|---|',
35
+ '| Non-interactive metadata label | [`Tag`](?path=/docs/components-tag--docs) |',
36
+ '| Primary or destructive action | [`Button`](?path=/docs/components-button--docs) |',
37
+ '| Switching between views or routes | [`Tabs`](?path=/docs/components-tabs--docs) |',
38
+ '| Selecting from many options (10+) | Combobox or a dropdown select |',
39
+ '',
40
+ '```tsx',
41
+ '// BAD — Pill is a filter control, not an action trigger',
42
+ '<Pill text="Save student" onclick={handleSave} />',
43
+ '',
44
+ '// GOOD — Pill used as an auto-apply filter',
45
+ '<Pill text="Year 7" onclick={checked => onFilterChange("year7", checked)} />',
46
+ '```',
47
+ '',
48
+ '---',
49
+ '',
50
+ '### Design guidance',
51
+ '',
52
+ '- **Max 3 words per label** (Confluence design spec). Short labels scan faster and keep filter',
53
+ ' rows compact. If you need more words, use a dropdown or combobox instead.',
54
+ '- **Filter groups must wrap** — always apply `flexWrap: "wrap"` to any row of Pills so they',
55
+ ' reflow on constrained viewports. Confluence explicitly prohibits horizontal scroll.',
56
+ '- **Gap conventions** — `var(--spacing-small)` between adjacent Pills;',
57
+ ' `var(--spacing-large)` between the label and the pill row.',
58
+ '- **Auto-apply** — filters take effect immediately on click. Never pair Pill groups with a',
59
+ ' dedicated "Apply filters" submit button.',
60
+ ].join('\n');
61
+ const DEVELOPER_NOTES = [
62
+ '### Quirks to know before shipping',
63
+ '',
64
+ '**`onclick` fires on mount, not only on user interaction.** The implementation uses',
65
+ '`useEffect(() => { if (onclick) onclick(checked); }, [checked, onclick])`, which means React',
66
+ 'runs it after the first render. Your handler will receive the initial `initialValue` (default',
67
+ '`false`) the moment the component mounts — before the user has clicked anything.',
68
+ '',
69
+ 'To suppress the mount-time call, guard with a ref:',
70
+ '',
71
+ '```tsx',
72
+ 'const hasMounted = useRef(false);',
73
+ '',
74
+ '<Pill',
75
+ ' text="Autumn term"',
76
+ ' onclick={(checked) => {',
77
+ ' if (!hasMounted.current) { hasMounted.current = true; return; }',
78
+ ' handleFilter(checked);',
79
+ ' }}',
80
+ '/>',
81
+ '```',
82
+ '',
83
+ '**Pill is uncontrolled — there is no `value` prop.** Once mounted, its state is private.',
84
+ 'To reset a pill from outside (e.g. a "Clear all filters" button), change its `key` prop to',
85
+ 'force React to remount it. Note that remounting also triggers the mount-time `onclick` firing.',
86
+ '',
87
+ '```tsx',
88
+ 'const [resetKey, setResetKey] = useState(0);',
89
+ '',
90
+ '<Pill key={resetKey} text="Autumn term" onclick={handleToggle} />',
91
+ '<Button type="button" onClick={() => setResetKey(k => k + 1)}>Clear filters</Button>',
92
+ '```',
93
+ '',
94
+ '---',
95
+ '',
96
+ '### Accessibility',
97
+ '',
98
+ '**Known limitation:** `Pill` renders as a `<span>` with an `onClick` handler. It is not natively',
99
+ 'keyboard-accessible — Tab will not reach it and Space/Enter will not activate it.',
100
+ '',
101
+ 'Checkbox mode (`checkbox={true}`) IS accessible: the embedded `CheckboxInput` provides a real',
102
+ '`<input type="checkbox">` that Tab reaches and Space toggles.',
103
+ '',
104
+ 'For toggle mode on pages where keyboard accessibility is required, apply a wrapper:',
105
+ '',
106
+ '```tsx',
107
+ '// Temporary keyboard workaround for toggle-mode pills',
108
+ '<span',
109
+ ' tabIndex={0}',
110
+ ' role="radio"',
111
+ ' aria-checked={checked}',
112
+ ' onKeyDown={e => {',
113
+ " if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handleToggle(); }",
114
+ ' }}',
115
+ '>',
116
+ ' <Pill text="Year 7" onclick={handleToggle} />',
117
+ '</span>',
118
+ '```',
119
+ ].join('\n');
120
+ const RELATED_COMPONENTS = [
121
+ '## Related components',
122
+ '',
123
+ '[Tag](?path=/docs/components-tag--docs) · [Badge](?path=/docs/components-badge--docs) · [Button](?path=/docs/components-button--docs) · [Tabs](?path=/docs/components-tabs--docs)',
124
+ ].join('\n');
125
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
126
+ function PillDocsPage() {
127
+ return (_jsxs(_Fragment, { children: [_jsx(Title, {}), _jsx(Subtitle, {}), _jsx(Markdown, { children: DESCRIPTION_INTRO }), _jsx(DocHeading, { children: "Interactive example" }), _jsx(Markdown, { children: PROPS_INTRO }), _jsx(DocPrimary, {}), _jsx(Controls, {}), _jsx(DocHeading, { children: "Usage guidance" }), _jsx(Markdown, { children: USAGE_GUIDANCE }), _jsx(DocHeading, { children: "Developer notes" }), _jsx(Markdown, { children: DEVELOPER_NOTES }), _jsx(DocHeading, { children: "Examples" }), _jsx(Stories, { title: "" }), _jsx(Markdown, { children: RELATED_COMPONENTS })] }));
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Meta
131
+ // ---------------------------------------------------------------------------
2
132
  const meta = {
3
133
  title: 'Components/Pill',
4
134
  component: Pill,
135
+ tags: ['autodocs'],
136
+ parameters: {
137
+ docs: {
138
+ page: PillDocsPage,
139
+ },
140
+ },
141
+ argTypes: {
142
+ text: {
143
+ control: 'text',
144
+ description: [
145
+ 'The label rendered inside the pill. Keep to **3 words or fewer** (Confluence spec) —',
146
+ 'short labels scan faster in filter rows.',
147
+ 'Good examples: `"Year 7"`, `"Active"`, `"All"`, `"Pupil Premium"`, `"Flagged"`.',
148
+ ].join(' '),
149
+ table: {
150
+ type: { summary: 'string' },
151
+ },
152
+ },
153
+ checkbox: {
154
+ control: 'boolean',
155
+ description: [
156
+ 'Switches the pill to **checkbox mode** — embeds a real `CheckboxInput` before the label',
157
+ 'and applies the `--pill-checkbox-*` token family.',
158
+ 'Use `checkbox` for **multi-select** rows where several pills can be active at once.',
159
+ 'Omit (default `false`) for **toggle mode** — single-select, `--pill-single-filter-*` tokens.',
160
+ ].join(' '),
161
+ table: {
162
+ type: { summary: 'boolean' },
163
+ defaultValue: { summary: 'false' },
164
+ },
165
+ },
166
+ initialValue: {
167
+ control: 'boolean',
168
+ description: [
169
+ 'Sets the initial checked/active state on first mount. Defaults to `false` (inactive).',
170
+ 'Use `initialValue={true}` to pre-select a pill — for example, pre-activating an "All"',
171
+ 'pill when a filter row first loads.',
172
+ '**Note:** when `initialValue={true}`, the `onclick` callback fires on mount with `true`.',
173
+ ].join(' '),
174
+ table: {
175
+ type: { summary: 'boolean' },
176
+ defaultValue: { summary: 'false' },
177
+ },
178
+ },
179
+ onclick: {
180
+ control: false,
181
+ description: [
182
+ 'Callback fired each time the pill\'s checked state changes.',
183
+ 'Receives `true` when the pill becomes active/checked, `false` when it becomes inactive.',
184
+ 'Example: `onclick={checked => onFilterChange("year7", checked)}`.',
185
+ '**Quirk:** also fires on mount with the current `initialValue`. Guard with a `useRef`',
186
+ 'if you need to suppress the mount-time call. See the component description for the pattern.',
187
+ ].join(' '),
188
+ table: {
189
+ type: { summary: '(checked: boolean) => void' },
190
+ defaultValue: { summary: 'undefined' },
191
+ },
192
+ },
193
+ },
5
194
  };
6
- export const Default = {
7
- args: {
8
- text: 'Default',
9
- onclick: () => { console.log('Pill clicked'); },
195
+ export default meta;
196
+ // ---------------------------------------------------------------------------
197
+ // Helper: attach a per-story description to docs
198
+ // ---------------------------------------------------------------------------
199
+ const withDescription = (story, description) => ({
200
+ ...story,
201
+ parameters: {
202
+ ...story.parameters,
203
+ docs: {
204
+ ...story.parameters?.docs,
205
+ description: {
206
+ story: description,
207
+ },
208
+ },
10
209
  },
210
+ });
211
+ // ---------------------------------------------------------------------------
212
+ // Template components for stateful / composition stories
213
+ // ---------------------------------------------------------------------------
214
+ const FilterGroupTemplate = () => {
215
+ const [active, setActive] = useState(null);
216
+ const yearGroups = ['Year 7', 'Year 8', 'Year 9', 'Year 10', 'Year 11'];
217
+ return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by year group" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: yearGroups.map(year => (_jsx(Pill, { text: year, initialValue: active === year, onclick: checked => setActive(checked ? year : null) }, year))) })] }));
11
218
  };
12
- export const withCheckbox = {
219
+ const MultiSelectFilterGroupTemplate = () => {
220
+ const [selected, setSelected] = useState(new Set());
221
+ const statuses = ['Active', 'Archived', 'Flagged', 'On track', 'At risk'];
222
+ const toggle = (label, checked) => {
223
+ setSelected((prev) => {
224
+ const next = new Set(prev);
225
+ if (checked) {
226
+ next.add(label);
227
+ }
228
+ else {
229
+ next.delete(label);
230
+ }
231
+ return next;
232
+ });
233
+ };
234
+ return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by status" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: statuses.map(status => (_jsx(Pill, { text: status, checkbox: true, onclick: checked => toggle(status, checked) }, status))) }), selected.size > 0 && (_jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: ["Selected:", ' ', Array.from(selected).join(', ')] }))] }));
235
+ };
236
+ const WithAllOptionTemplate = () => {
237
+ const [activeFilters, setActiveFilters] = useState(new Set());
238
+ const [allActive, setAllActive] = useState(true);
239
+ const subjects = ['Maths', 'English', 'Science', 'History', 'Art'];
240
+ const handleAllClick = (checked) => {
241
+ setAllActive(checked);
242
+ if (checked) {
243
+ setActiveFilters(new Set());
244
+ }
245
+ };
246
+ const handleSubjectClick = (subject, checked) => {
247
+ setActiveFilters((prev) => {
248
+ const next = new Set(prev);
249
+ if (checked) {
250
+ next.add(subject);
251
+ setAllActive(false);
252
+ }
253
+ else {
254
+ next.delete(subject);
255
+ if (next.size === 0) {
256
+ setAllActive(true);
257
+ }
258
+ }
259
+ return next;
260
+ });
261
+ };
262
+ return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by subject" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "All", initialValue: allActive, onclick: handleAllClick }), subjects.map(subject => (_jsx(Pill, { text: subject, initialValue: activeFilters.has(subject), onclick: checked => handleSubjectClick(subject, checked) }, subject)))] })] }));
263
+ };
264
+ const AllVariantsTemplate = () => (_jsxs("div", { style: {
265
+ padding: 'var(--spacing-xlarge)',
266
+ display: 'flex',
267
+ flexDirection: 'column',
268
+ gap: 'var(--spacing-xxlarge)',
269
+ }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Toggle mode (default)" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Inactive" }), _jsx("span", { className: "ds-text", style: { fontSize: 'var(--font-size-1-11)', color: 'var(--color-grey-600)' }, children: "ds-pill__inactive" })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Active", initialValue: true }), _jsx("span", { className: "ds-text", style: { fontSize: 'var(--font-size-1-11)', color: 'var(--color-grey-600)' }, children: "ds-pill__active" })] })] })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Checkbox mode (checkbox=true)" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Unchecked", checkbox: true }), _jsx("span", { className: "ds-text", style: { fontSize: 'var(--font-size-1-11)', color: 'var(--color-grey-600)' }, children: "ds-pill__unchecked" })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Checked", checkbox: true, initialValue: true }), _jsx("span", { className: "ds-text", style: { fontSize: 'var(--font-size-1-11)', color: 'var(--color-grey-600)' }, children: "ds-pill__checked" })] })] })] })] }));
270
+ const ContentGuidelinesTemplate = () => (_jsxs("div", { style: {
271
+ padding: 'var(--spacing-xlarge)',
272
+ display: 'flex',
273
+ flexDirection: 'column',
274
+ gap: 'var(--spacing-large)',
275
+ }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Good (3 words or fewer)" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)', alignItems: 'center' }, children: [_jsx(Pill, { text: "All" }), _jsx(Pill, { text: "Year 7" }), _jsx(Pill, { text: "Active" }), _jsx(Pill, { text: "Flagged" }), _jsx(Pill, { text: "Pupil Premium" })] })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Too long (4 or more words) \u2014 use a dropdown instead" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)', alignItems: 'center' }, children: [_jsx(Pill, { text: "Currently being assessed" }), _jsx(Pill, { text: "Due for review soon" }), _jsx(Pill, { text: "Needs additional support" })] })] })] }));
276
+ const AccessibilityNoteTemplate = () => (_jsxs("div", { style: {
277
+ padding: 'var(--spacing-xlarge)',
278
+ display: 'flex',
279
+ flexDirection: 'column',
280
+ gap: 'var(--spacing-large)',
281
+ maxWidth: '48rem',
282
+ }, children: [_jsxs("div", { style: {
283
+ padding: 'var(--spacing-large)',
284
+ borderRadius: 'var(--border-radius-small)',
285
+ border: 'var(--border-weight) solid var(--color-semantic-warning-500)',
286
+ background: 'var(--color-semantic-warning-050)',
287
+ display: 'flex',
288
+ flexDirection: 'column',
289
+ gap: 'var(--spacing-small)',
290
+ }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)', fontWeight: 'var(--font-weight-semi-bold)' }, children: "Known limitation: keyboard accessibility" }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["Toggle-mode", ' ', _jsx("code", { children: "Pill" }), ' ', "renders as a", ' ', _jsx("code", { children: "<span onClick>" }), ' ', "\u2014 it is not reachable via Tab and cannot be activated with Space or Enter. Keyboard-only users and screen reader users cannot interact with it in this mode."] }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["Checkbox mode (", _jsx("code", { children: "checkbox={true}" }), ") is accessible: the embedded", ' ', _jsx("code", { children: "CheckboxInput" }), ' ', "provides a real", ' ', _jsx("code", { children: "<input type=\"checkbox\">" }), ' ', "that Tab reaches and Space toggles."] }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["For toggle mode where keyboard accessibility is required, wrap each pill and supply the missing semantics manually. See the component description above for the wrapper pattern. Toggle mode pills should carry", ' ', _jsx("code", { children: "role=\"radio\"" }), ' ', "inside a", ' ', _jsx("code", { children: "role=\"radiogroup\"" }), "."] })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Accessible example \u2014 checkbox mode (Year 8 cohort filter)" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Year 7", checkbox: true }), _jsx(Pill, { text: "Year 8", checkbox: true, initialValue: true }), _jsx(Pill, { text: "Year 9", checkbox: true })] }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: "Tab into any of the pills above \u2014 the embedded checkbox is focusable and Space toggles it." })] })] }));
291
+ // ---------------------------------------------------------------------------
292
+ // Stories
293
+ // ---------------------------------------------------------------------------
294
+ export const Default = withDescription({
13
295
  args: {
14
- text: 'Checkbox',
15
- checkbox: true,
16
- onclick: () => { console.log('Pill with checkbox clicked'); },
296
+ text: 'Year 7',
297
+ checkbox: false,
298
+ initialValue: false,
299
+ onclick: fn(),
17
300
  },
18
- };
19
- export const preChecked = {
301
+ render: args => _jsx(Pill, { ...args }),
302
+ }, 'The interactive canvas. Every prop is wired to the Controls panel below — toggle `checkbox` to switch between single-select and multi-select modes, toggle `initialValue` to start in the active/checked state. The `onclick` callback fires into the Actions panel on every state change.');
303
+ export const ToggleActive = withDescription({
20
304
  args: {
21
- text: 'Checkbox',
305
+ text: 'Active',
22
306
  initialValue: true,
307
+ },
308
+ parameters: {
309
+ docs: {
310
+ source: {
311
+ language: 'tsx',
312
+ code: `
313
+ import { Pill } from '@arbor-education/design-system.components';
314
+
315
+ function ToggleActiveExample() {
316
+ return <Pill text="Active" initialValue={true} />;
317
+ }
318
+ export default ToggleActiveExample;
319
+ `.trim(),
320
+ },
321
+ },
322
+ },
323
+ }, 'Toggle mode pill in its active state (`ds-pill__active`). This is what a pill looks like when the user has selected it — background from `--pill-single-filter-active-color-background`, border from `--pill-single-filter-active-color-border`. Click to toggle back to inactive.');
324
+ export const CheckboxMode = withDescription({
325
+ args: {
326
+ text: 'Flagged',
23
327
  checkbox: true,
24
- onclick: () => { console.log('Pill with checkbox clicked'); },
25
328
  },
26
- };
27
- export default meta;
329
+ parameters: {
330
+ docs: {
331
+ source: {
332
+ language: 'tsx',
333
+ code: `
334
+ import { Pill } from '@arbor-education/design-system.components';
335
+
336
+ function CheckboxModeExample() {
337
+ return <Pill text="Flagged" checkbox={true} />;
338
+ }
339
+ export default CheckboxModeExample;
340
+ `.trim(),
341
+ },
342
+ },
343
+ },
344
+ }, 'Checkbox mode (`checkbox={true}`) in its default unchecked state. A real `CheckboxInput` is embedded before the label — Tab reaches it, Space toggles it. This is the **accessible mode** of Pill. Use it for multi-select filter rows where more than one option can be active at once. Tokens: `--pill-checkbox-default-color-*`.');
345
+ export const CheckboxModeSelected = withDescription({
346
+ args: {
347
+ text: 'Flagged',
348
+ checkbox: true,
349
+ initialValue: true,
350
+ },
351
+ parameters: {
352
+ docs: {
353
+ source: {
354
+ language: 'tsx',
355
+ code: `
356
+ import { Pill } from '@arbor-education/design-system.components';
357
+
358
+ function CheckboxModeSelectedExample() {
359
+ return <Pill text="Flagged" checkbox={true} initialValue={true} />;
360
+ }
361
+ export default CheckboxModeSelectedExample;
362
+ `.trim(),
363
+ },
364
+ },
365
+ },
366
+ }, 'Checkbox mode starting in the checked state (`ds-pill__checked`) via `initialValue={true}`. Background: `--pill-checkbox-selected-color-background` (a brand-050 wash). Border: `--pill-checkbox-selected-color-border` (brand-600). The embedded checkbox also renders checked. Click to uncheck.');
367
+ export const AllVariants = withDescription({
368
+ render: AllVariantsTemplate,
369
+ parameters: {
370
+ docs: {
371
+ source: {
372
+ language: 'tsx',
373
+ code: `
374
+ import { Pill } from '@arbor-education/design-system.components';
375
+
376
+ function AllVariantsExample() {
377
+ return (
378
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)', padding: 'var(--spacing-xlarge)' }}>
379
+ <div style={{ display: 'flex', gap: 'var(--spacing-small)' }}>
380
+ {/* Toggle mode — single-select, --pill-single-filter-* tokens */}
381
+ <Pill text="Inactive" />
382
+ <Pill text="Active" initialValue />
383
+ </div>
384
+ <div style={{ display: 'flex', gap: 'var(--spacing-small)' }}>
385
+ {/* Checkbox mode — multi-select, --pill-checkbox-* tokens */}
386
+ <Pill text="Unchecked" checkbox />
387
+ <Pill text="Checked" checkbox initialValue />
388
+ </div>
389
+ </div>
390
+ );
391
+ }
392
+ export default AllVariantsExample;
393
+ `.trim(),
394
+ },
395
+ },
396
+ },
397
+ }, 'All four visual states side by side: toggle inactive, toggle active, checkbox unchecked, checkbox checked. Each cell shows the CSS class name applied. A quick visual reference for both token families — `--pill-single-filter-*` for toggle mode and `--pill-checkbox-*` for checkbox mode.');
398
+ export const FilterGroup = withDescription({
399
+ render: FilterGroupTemplate,
400
+ parameters: {
401
+ docs: {
402
+ source: {
403
+ language: 'tsx',
404
+ code: `
405
+ import { useState } from 'react';
406
+ import { Pill } from '@arbor-education/design-system.components';
407
+
408
+ function YearGroupFilter() {
409
+ const [active, setActive] = useState<string | null>(null);
410
+ const yearGroups = ['Year 7', 'Year 8', 'Year 9', 'Year 10', 'Year 11'];
411
+
412
+ return (
413
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
414
+ {yearGroups.map(year => (
415
+ <Pill
416
+ key={year}
417
+ text={year}
418
+ initialValue={active === year}
419
+ onclick={checked => setActive(checked ? year : null)}
420
+ />
421
+ ))}
422
+ </div>
423
+ );
424
+ }
425
+ export default YearGroupFilter;
426
+ `.trim(),
427
+ },
428
+ },
429
+ },
430
+ }, 'A realistic single-select filter row: five year-group pills in toggle mode. Only one pill can be active at a time — clicking a new pill deactivates the previous selection. Layout: `display: flex`, `flexWrap: wrap`, `gap: var(--spacing-small)`. The wrapping means pills reflow gracefully on narrower viewports.');
431
+ export const MultiSelectFilterGroup = withDescription({
432
+ render: MultiSelectFilterGroupTemplate,
433
+ parameters: {
434
+ docs: {
435
+ source: {
436
+ language: 'tsx',
437
+ code: `
438
+ import { useState } from 'react';
439
+ import { Pill } from '@arbor-education/design-system.components';
440
+
441
+ function StatusFilter() {
442
+ const [selected, setSelected] = useState<Set<string>>(new Set());
443
+ const statuses = ['Active', 'Archived', 'Flagged', 'On track', 'At risk'];
444
+
445
+ const toggle = (label: string, checked: boolean) => {
446
+ setSelected((prev) => {
447
+ const next = new Set(prev);
448
+ if (checked) next.add(label);
449
+ else next.delete(label);
450
+ return next;
451
+ });
452
+ };
453
+
454
+ return (
455
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
456
+ {statuses.map(status => (
457
+ <Pill
458
+ key={status}
459
+ text={status}
460
+ checkbox
461
+ onclick={checked => toggle(status, checked)}
462
+ />
463
+ ))}
464
+ </div>
465
+ );
466
+ }
467
+ export default StatusFilter;
468
+ `.trim(),
469
+ },
470
+ },
471
+ },
472
+ }, 'A multi-select filter row with `checkbox={true}`. Any number of pills can be active simultaneously — great for "filter by status" where a user might want to see both Flagged and At risk students at the same time. The selected labels echo below the row as you toggle pills.');
473
+ export const WithAllOption = withDescription({
474
+ render: WithAllOptionTemplate,
475
+ parameters: {
476
+ docs: {
477
+ source: {
478
+ language: 'tsx',
479
+ code: `
480
+ import { useState } from 'react';
481
+ import { Pill } from '@arbor-education/design-system.components';
482
+
483
+ function SubjectFilter() {
484
+ const [activeFilters, setActiveFilters] = useState<Set<string>>(new Set());
485
+ const [allActive, setAllActive] = useState(true);
486
+ const subjects = ['Maths', 'English', 'Science', 'History', 'Art'];
487
+
488
+ const handleAllClick = (checked: boolean) => {
489
+ setAllActive(checked);
490
+ if (checked) setActiveFilters(new Set());
491
+ };
492
+
493
+ const handleSubjectClick = (subject: string, checked: boolean) => {
494
+ setActiveFilters((prev) => {
495
+ const next = new Set(prev);
496
+ if (checked) {
497
+ next.add(subject);
498
+ setAllActive(false);
499
+ } else {
500
+ next.delete(subject);
501
+ if (next.size === 0) setAllActive(true);
502
+ }
503
+ return next;
504
+ });
505
+ };
506
+
507
+ return (
508
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
509
+ <Pill text="All" initialValue={allActive} onclick={handleAllClick} />
510
+ {subjects.map(subject => (
511
+ <Pill
512
+ key={subject}
513
+ text={subject}
514
+ initialValue={activeFilters.has(subject)}
515
+ onclick={checked => handleSubjectClick(subject, checked)}
516
+ />
517
+ ))}
518
+ </div>
519
+ );
520
+ }
521
+ export default SubjectFilter;
522
+ `.trim(),
523
+ },
524
+ },
525
+ },
526
+ }, 'The "All" reset pattern recommended by the Confluence design spec. An "All" pill sits at the start of the row — clicking it clears all subject filters and activates itself. Selecting any individual subject automatically deactivates "All". Deselecting every subject reactivates "All" so the row is never left in an ambiguous empty state. The "All" pill uses no special props — it is a plain `Pill` at position zero.');
527
+ export const ContentGuidelines = withDescription({
528
+ render: ContentGuidelinesTemplate,
529
+ parameters: {
530
+ docs: {
531
+ source: {
532
+ language: 'tsx',
533
+ code: `
534
+ import { Pill } from '@arbor-education/design-system.components';
535
+
536
+ function ContentGuidelinesExample() {
537
+ return (
538
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)', padding: 'var(--spacing-xlarge)' }}>
539
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
540
+ {/* Good — 3 words or fewer (Confluence spec) */}
541
+ <Pill text="All" />
542
+ <Pill text="Year 7" />
543
+ <Pill text="Active" />
544
+ <Pill text="Flagged" />
545
+ <Pill text="Pupil Premium" />
546
+ </div>
547
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
548
+ {/* Too long — 4 or more words. Use a dropdown or combobox instead. */}
549
+ <Pill text="Currently being assessed" />
550
+ <Pill text="Due for review soon" />
551
+ <Pill text="Needs additional support" />
552
+ </div>
553
+ </div>
554
+ );
555
+ }
556
+ export default ContentGuidelinesExample;
557
+ `.trim(),
558
+ },
559
+ },
560
+ },
561
+ }, 'A side-by-side comparison of labels that follow the 3-word rule and labels that are too long. The Confluence spec is unambiguous: three words or fewer. Labels like "Currently being assessed" belong in a dropdown — they are too verbose for a filter pill and will stretch the component in ways that break filter-row layouts.');
562
+ export const AccessibilityNote = withDescription({
563
+ render: AccessibilityNoteTemplate,
564
+ parameters: {
565
+ docs: {
566
+ source: {
567
+ language: 'tsx',
568
+ code: `
569
+ import { Pill } from '@arbor-education/design-system.components';
570
+
571
+ function AccessibilityNoteExample() {
572
+ return (
573
+ <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)', padding: 'var(--spacing-xlarge)' }}>
574
+ {/* Checkbox mode embeds a real <input type="checkbox"> — Tab reaches it, Space toggles it. */}
575
+ <Pill text="Year 7" checkbox />
576
+ <Pill text="Year 8" checkbox initialValue />
577
+ <Pill text="Year 9" checkbox />
578
+ </div>
579
+ );
580
+ }
581
+ export default AccessibilityNoteExample;
582
+ `.trim(),
583
+ },
584
+ },
585
+ },
586
+ }, '**Read before shipping to production.** Toggle-mode `Pill` is not keyboard-accessible — it renders as `<span onClick>` with no `tabIndex` or ARIA role. Checkbox mode IS accessible. This story documents the limitation and shows an accessible checkbox-mode example you can interact with via keyboard. See the component description for the toggle-mode wrapper workaround.');
28
587
  //# sourceMappingURL=Pill.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pill.stories.js","sourceRoot":"","sources":["../../../src/components/pill/Pill.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,IAAI,GAAsB;IAC9B,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;KAChD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;KAC9D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;KAC9D;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Pill.stories.js","sourceRoot":"","sources":["../../../src/components/pill/Pill.stories.tsx"],"names":[],"mappings":"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"}