@arbor-education/design-system.components 0.12.0 → 0.13.1

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 (177) 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 +12 -0
  36. package/{.claude/component-library.md → component-library.md} +27 -10
  37. package/dist/components/badge/Badge.stories.d.ts +85 -6
  38. package/dist/components/badge/Badge.stories.d.ts.map +1 -1
  39. package/dist/components/badge/Badge.stories.js +626 -27
  40. package/dist/components/badge/Badge.stories.js.map +1 -1
  41. package/dist/components/banner/Banner.stories.d.ts +129 -63
  42. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  43. package/dist/components/banner/Banner.stories.js +855 -39
  44. package/dist/components/banner/Banner.stories.js.map +1 -1
  45. package/dist/components/button/Button.stories.d.ts +148 -8
  46. package/dist/components/button/Button.stories.d.ts.map +1 -1
  47. package/dist/components/button/Button.stories.js +1089 -80
  48. package/dist/components/button/Button.stories.js.map +1 -1
  49. package/dist/components/datePicker/DatePicker.d.ts +1 -0
  50. package/dist/components/datePicker/DatePicker.d.ts.map +1 -1
  51. package/dist/components/datePicker/DatePicker.js +2 -2
  52. package/dist/components/datePicker/DatePicker.js.map +1 -1
  53. package/dist/components/datePicker/DatePicker.stories.d.ts +1 -0
  54. package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
  55. package/dist/components/dot/Dot.stories.d.ts +46 -11
  56. package/dist/components/dot/Dot.stories.d.ts.map +1 -1
  57. package/dist/components/dot/Dot.stories.js +504 -15
  58. package/dist/components/dot/Dot.stories.js.map +1 -1
  59. package/dist/components/dropdown/Dropdown.stories.d.ts +89 -14
  60. package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
  61. package/dist/components/dropdown/Dropdown.stories.js +769 -17
  62. package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
  63. package/dist/components/formField/FormField.stories.d.ts +95 -35
  64. package/dist/components/formField/FormField.stories.d.ts.map +1 -1
  65. package/dist/components/formField/FormField.stories.js +1174 -69
  66. package/dist/components/formField/FormField.stories.js.map +1 -1
  67. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts +96 -9
  68. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts.map +1 -1
  69. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js +717 -10
  70. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js.map +1 -1
  71. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts +149 -11
  72. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts.map +1 -1
  73. package/dist/components/formField/inputs/number/NumberInput.stories.js +624 -10
  74. package/dist/components/formField/inputs/number/NumberInput.stories.js.map +1 -1
  75. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts +74 -1
  76. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  77. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +673 -44
  78. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  79. package/dist/components/formField/inputs/text/TextInput.stories.d.ts +119 -1
  80. package/dist/components/formField/inputs/text/TextInput.stories.d.ts.map +1 -1
  81. package/dist/components/formField/inputs/text/TextInput.stories.js +549 -10
  82. package/dist/components/formField/inputs/text/TextInput.stories.js.map +1 -1
  83. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts +129 -4
  84. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
  85. package/dist/components/formField/inputs/textArea/TextArea.stories.js +577 -3
  86. package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
  87. package/dist/components/heading/Heading.stories.d.ts +449 -50
  88. package/dist/components/heading/Heading.stories.d.ts.map +1 -1
  89. package/dist/components/heading/Heading.stories.js +536 -60
  90. package/dist/components/heading/Heading.stories.js.map +1 -1
  91. package/dist/components/icon/Icon.stories.d.ts +81 -10
  92. package/dist/components/icon/Icon.stories.d.ts.map +1 -1
  93. package/dist/components/icon/Icon.stories.js +979 -8
  94. package/dist/components/icon/Icon.stories.js.map +1 -1
  95. package/dist/components/pill/Pill.stories.d.ts +71 -19
  96. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  97. package/dist/components/pill/Pill.stories.js +573 -14
  98. package/dist/components/pill/Pill.stories.js.map +1 -1
  99. package/dist/components/progress/Progress.stories.d.ts +75 -298
  100. package/dist/components/progress/Progress.stories.d.ts.map +1 -1
  101. package/dist/components/progress/Progress.stories.js +449 -52
  102. package/dist/components/progress/Progress.stories.js.map +1 -1
  103. package/dist/components/separator/Separator.stories.d.ts +58 -5
  104. package/dist/components/separator/Separator.stories.d.ts.map +1 -1
  105. package/dist/components/separator/Separator.stories.js +443 -4
  106. package/dist/components/separator/Separator.stories.js.map +1 -1
  107. package/dist/components/table/Table.d.ts +7 -0
  108. package/dist/components/table/Table.d.ts.map +1 -1
  109. package/dist/components/table/Table.js +9 -0
  110. package/dist/components/table/Table.js.map +1 -1
  111. package/dist/components/table/Table.stories.d.ts +1 -0
  112. package/dist/components/table/Table.stories.d.ts.map +1 -1
  113. package/dist/components/table/Table.stories.js +87 -0
  114. package/dist/components/table/Table.stories.js.map +1 -1
  115. package/dist/components/table/Table.test.js +49 -1
  116. package/dist/components/table/Table.test.js.map +1 -1
  117. package/dist/components/table/cellEditors/DateCellEditor.d.ts +3 -0
  118. package/dist/components/table/cellEditors/DateCellEditor.d.ts.map +1 -0
  119. package/dist/components/table/cellEditors/DateCellEditor.js +13 -0
  120. package/dist/components/table/cellEditors/DateCellEditor.js.map +1 -0
  121. package/dist/components/table/cellEditors/DateCellEditor.test.d.ts +2 -0
  122. package/dist/components/table/cellEditors/DateCellEditor.test.d.ts.map +1 -0
  123. package/dist/components/table/cellEditors/DateCellEditor.test.js +81 -0
  124. package/dist/components/table/cellEditors/DateCellEditor.test.js.map +1 -0
  125. package/dist/components/tag/Tag.stories.d.ts +116 -5
  126. package/dist/components/tag/Tag.stories.d.ts.map +1 -1
  127. package/dist/components/tag/Tag.stories.js +581 -28
  128. package/dist/components/tag/Tag.stories.js.map +1 -1
  129. package/dist/index.css +8 -1
  130. package/dist/index.css.map +1 -1
  131. package/dist/index.d.ts +0 -5
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +0 -5
  134. package/dist/index.js.map +1 -1
  135. package/eslint.config.mts +5 -1
  136. package/package.json +3 -3
  137. package/src/components/badge/Badge.stories.tsx +869 -42
  138. package/src/components/banner/Banner.stories.tsx +1081 -63
  139. package/src/components/button/Button.stories.tsx +1394 -99
  140. package/src/components/datePicker/DatePicker.tsx +3 -0
  141. package/src/components/dot/Dot.stories.tsx +723 -32
  142. package/src/components/dropdown/Dropdown.stories.tsx +1174 -35
  143. package/src/components/formField/FormField.stories.tsx +1522 -105
  144. package/src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx +1020 -15
  145. package/src/components/formField/inputs/number/NumberInput.stories.tsx +908 -15
  146. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +932 -51
  147. package/src/components/formField/inputs/text/TextInput.stories.tsx +773 -13
  148. package/src/components/formField/inputs/textArea/TextArea.stories.tsx +756 -8
  149. package/src/components/heading/Heading.stories.tsx +752 -120
  150. package/src/components/icon/Icon.stories.tsx +1446 -12
  151. package/src/components/pill/Pill.stories.tsx +867 -21
  152. package/src/components/progress/Progress.stories.tsx +625 -58
  153. package/src/components/separator/Separator.stories.tsx +730 -8
  154. package/src/components/separator/separator.scss +12 -3
  155. package/src/components/table/Table.stories.tsx +102 -0
  156. package/src/components/table/Table.test.tsx +82 -3
  157. package/src/components/table/Table.tsx +9 -0
  158. package/src/components/table/cellEditors/DateCellEditor.test.tsx +109 -0
  159. package/src/components/table/cellEditors/DateCellEditor.tsx +27 -0
  160. package/src/components/tag/Tag.stories.tsx +755 -53
  161. package/src/index.ts +0 -5
  162. package/.claude/agent-memory/blanche-designspert/MEMORY.md +0 -64
  163. package/.claude/agent-memory/dorothy-fact-checker/MEMORY.md +0 -129
  164. package/.claude/agent-memory/rose-storybookspert/MEMORY.md +0 -29
  165. package/.claude/agent-memory/sophia-componentspert/MEMORY.md +0 -14
  166. package/.claude/design-assessment-daily-attendance-2026-04-10.md +0 -566
  167. package/.claude/figma-assessment-7154-58899.md +0 -404
  168. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-11086-97537.md +0 -392
  169. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-41974.md +0 -474
  170. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-43094.md +0 -462
  171. package/.claude/figma-assessment-fcFK4CGzkz2fVyY3koX8ZE-7154-59061.md +0 -440
  172. package/.claude/migration-report-custom-report-writer-2026-02-19.md +0 -591
  173. /package/{.claude/agent-memory → .agent-memory}/blanche-designspert/token-review-patterns.md +0 -0
  174. /package/{.claude/agent-memory → .agent-memory}/rose-storybookspert/patterns.md +0 -0
  175. /package/{.claude → .gather}/skills/create-page/SKILL.md +0 -0
  176. /package/{.claude → .gather}/skills/map-legacy/SKILL.md +0 -0
  177. /package/{.claude → .gather}/skills/migrate-page/SKILL.md +0 -0
@@ -1,25 +1,514 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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 { Tag } from '../tag/Tag';
2
4
  import { Dot } from './Dot';
5
+ // ---------------------------------------------------------------------------
6
+ // Docs page content
7
+ // ---------------------------------------------------------------------------
8
+ const DESCRIPTION_INTRO = [
9
+ 'Dot is the smallest coloured indicator in the Arbor design system — a fixed 10 × 10 pixel',
10
+ 'circle that communicates status, category, or grouping through colour. It provides the visual',
11
+ 'primitive; the consuming application owns the semantic meaning.',
12
+ ].join('\n');
13
+ const USAGE_GUIDANCE = [
14
+ '### When to use',
15
+ '',
16
+ '- **Inside `Tag`\'s `slotStart`** — the canonical dot-prefix pattern for category tags',
17
+ ' (`"Year 7"`, `"SEN"`, `"Active"`)',
18
+ '- **Alongside text in lists or tables** — paired with a student name, status label, or row',
19
+ ' description so that colour is never the sole conveyor of meaning (WCAG 1.4.1)',
20
+ '- **Chart or map legends** — where an adjacent label names the colour grouping',
21
+ '',
22
+ '---',
23
+ '',
24
+ '### When NOT to use',
25
+ '',
26
+ '| Instead of Dot, use | When you need |',
27
+ '|---|---|',
28
+ '| [`Badge`](?path=/docs/components-badge--docs) | A numeric count: `3`, `12`, `99+` |',
29
+ '| [`Icon`](?path=/docs/components-icon--docs) | A recognisable glyph that conveys meaning by shape |',
30
+ '| [`Tag`](?path=/docs/components-tag--docs) | A text label for metadata or category |',
31
+ '| [`Pill`](?path=/docs/components-pill--docs) | An interactive filter toggle |',
32
+ '',
33
+ '```tsx',
34
+ '// BAD — Icon name="dot" is Lucide\'s 16 px dot glyph, not the design-system circle',
35
+ '<Icon name="dot" />',
36
+ '',
37
+ '// GOOD — Dot is always 10 × 10 and perfectly round',
38
+ '<Dot colour="green" />',
39
+ '```',
40
+ '',
41
+ '---',
42
+ '',
43
+ '### Arbor de-facto colour semantics',
44
+ '',
45
+ 'The Arbor platform has established informal conventions for Dot colours. These are **not**',
46
+ 'enforced at the design system level — your application owns the semantic mapping — but',
47
+ 'applying them consistently improves recognition across the product.',
48
+ '',
49
+ '| Colour | Arbor convention |',
50
+ '|---|---|',
51
+ '| `green` | On track, positive attendance, active |',
52
+ '| `salmon` | Pupil Premium, attention needed |',
53
+ '| `orange` | At risk, warning |',
54
+ '| `purple` | SEN |',
55
+ '| `teal` | EAL |',
56
+ '| `blue` | Subject or category grouping |',
57
+ '| `yellow` | Active, neutral attention |',
58
+ '',
59
+ 'Limit the number of distinct colours visible at once — per the Pills & Tags & Badges',
60
+ 'Confluence guidance, fewer colours used consistently carry more meaning than a full rainbow.',
61
+ ].join('\n');
62
+ const DEVELOPER_NOTES = [
63
+ '### Closed API',
64
+ '',
65
+ 'Dot is deliberately closed: `colour` and `label` are the only props. There is no `size`',
66
+ '(always 10 × 10), no `className` or `style` override, and no `onClick`. If you need a',
67
+ 'different size or a clickable indicator, compose a different component.',
68
+ '',
69
+ '---',
70
+ '',
71
+ '### Accessibility',
72
+ '',
73
+ 'Dot has two modes, controlled by the optional `label` prop:',
74
+ '',
75
+ '| Mode | When | Markup |',
76
+ '|---|---|---|',
77
+ '| **Decorative** (default) | Adjacent text carries the meaning | `aria-hidden="true"` — invisible to assistive technology |',
78
+ '| **Meaningful** | Dot is standalone with no adjacent label | `aria-label={label}` — announced by screen readers |',
79
+ '',
80
+ 'The rule is simple:',
81
+ '',
82
+ '- If visible text next to the dot tells users what the colour means — omit `label`.',
83
+ '- If the dot is the only signal — provide `label`.',
84
+ '',
85
+ '**WCAG 1.4.1 Use of Colour**: colour alone must never be the only means of conveying',
86
+ 'information. Either provide a `label`, or pair the dot with adjacent text that carries the',
87
+ 'semantic weight.',
88
+ '',
89
+ '---',
90
+ '',
91
+ '### TypeScript types',
92
+ '',
93
+ '```ts',
94
+ "import { Dot } from '@arbor-education/design-system.components';",
95
+ '',
96
+ 'function MyDot(props: Dot.Props) { ... }',
97
+ '```',
98
+ '',
99
+ '| Type | Description |',
100
+ '|---|---|',
101
+ '| `Dot.Props` | Full props interface |',
102
+ "| `Dot.Colour` | `'purple' \\| 'salmon' \\| 'teal' \\| 'yellow' \\| 'green' \\| 'orange' \\| 'blue'` |",
103
+ ].join('\n');
104
+ const RELATED_COMPONENTS = [
105
+ '## Related components',
106
+ '',
107
+ '[Tag](?path=/docs/components-tag--docs) · [Badge](?path=/docs/components-badge--docs) · [Icon](?path=/docs/components-icon--docs) · [Pill](?path=/docs/components-pill--docs)',
108
+ ].join('\n');
109
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
110
+ function DotDocsPage() {
111
+ 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 })] }));
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Data
115
+ // ---------------------------------------------------------------------------
116
+ const allColours = ['purple', 'salmon', 'teal', 'yellow', 'green', 'orange', 'blue'];
117
+ // ---------------------------------------------------------------------------
118
+ // Meta
119
+ // ---------------------------------------------------------------------------
3
120
  const meta = {
4
- tags: ['autodocs'],
5
121
  title: 'Components/Dot',
6
122
  component: Dot,
123
+ parameters: {
124
+ layout: 'centered',
125
+ docs: {
126
+ page: DotDocsPage,
127
+ },
128
+ },
129
+ tags: ['autodocs'],
130
+ argTypes: {
131
+ colour: {
132
+ control: 'select',
133
+ options: allColours,
134
+ description: [
135
+ 'The background colour of the circle. **Required** — there is no default.',
136
+ 'Establish a consistent semantic mapping in your application (e.g. green = on track,',
137
+ 'salmon = Pupil Premium) and apply it uniformly.',
138
+ ].join(' '),
139
+ table: {
140
+ type: { summary: "'purple' | 'salmon' | 'teal' | 'yellow' | 'green' | 'orange' | 'blue'" },
141
+ },
142
+ },
143
+ label: {
144
+ control: 'text',
145
+ description: [
146
+ 'Accessible label for the dot. When omitted (default), the dot is decorative and',
147
+ 'invisible to assistive technology — correct when adjacent visible text carries the',
148
+ 'meaning. When provided, the screen reader announces the label. Use this prop whenever',
149
+ 'the dot is the sole carrier of information (no adjacent text).',
150
+ ].join(' '),
151
+ table: {
152
+ type: { summary: 'string' },
153
+ defaultValue: { summary: 'undefined (decorative — aria-hidden)' },
154
+ },
155
+ },
156
+ },
7
157
  };
8
158
  export default meta;
9
- export const Purple = { args: { colour: 'purple' } };
10
- export const Salmon = { args: { colour: 'salmon' } };
11
- export const Teal = { args: { colour: 'teal' } };
12
- export const Yellow = { args: { colour: 'yellow' } };
13
- export const Green = { args: { colour: 'green' } };
14
- export const Orange = { args: { colour: 'orange' } };
15
- export const Blue = { args: { colour: 'blue' } };
16
- export const Labeled = {
159
+ // ---------------------------------------------------------------------------
160
+ // Helper: attach a per-story description to docs
161
+ // ---------------------------------------------------------------------------
162
+ const withDescription = (story, description) => ({
163
+ ...story,
164
+ parameters: {
165
+ ...story.parameters,
166
+ docs: {
167
+ ...story.parameters?.docs,
168
+ description: {
169
+ story: description,
170
+ },
171
+ },
172
+ },
173
+ });
174
+ // ---------------------------------------------------------------------------
175
+ // Template components for composition stories
176
+ // (Named components avoid react-hooks lint issues — the react-hooks ESLint
177
+ // plugin is NOT configured in this project, so do NOT add eslint-disable.)
178
+ // ---------------------------------------------------------------------------
179
+ const AllColoursTemplate = () => (_jsx("div", { style: {
180
+ padding: 'var(--spacing-xlarge)',
181
+ background: 'var(--color-grey-050)',
182
+ borderRadius: 'var(--border-radius-small)',
183
+ display: 'flex',
184
+ flexWrap: 'wrap',
185
+ gap: 'var(--spacing-small)',
186
+ alignItems: 'center',
187
+ }, children: allColours.map(colour => (_jsxs("div", { style: {
188
+ display: 'flex',
189
+ flexDirection: 'column',
190
+ alignItems: 'center',
191
+ gap: 'var(--spacing-small)',
192
+ }, children: [_jsx(Dot, { colour: colour, label: colour }), _jsx("span", { className: "ds-text", style: { color: 'var(--color-grey-600)' }, children: colour })] }, colour))) }));
193
+ const DecorativeVsMeaningfulTemplate = () => (_jsxs("div", { style: {
194
+ padding: 'var(--spacing-xlarge)',
195
+ display: 'flex',
196
+ gap: 'var(--spacing-xlarge)',
197
+ flexWrap: 'wrap',
198
+ }, children: [_jsxs("div", { style: {
199
+ display: 'flex',
200
+ flexDirection: 'column',
201
+ gap: 'var(--spacing-large)',
202
+ }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Decorative (aria-hidden)" }), _jsxs("div", { style: {
203
+ display: 'flex',
204
+ alignItems: 'center',
205
+ gap: 'var(--spacing-small)',
206
+ }, children: [_jsx(Dot, { colour: "green" }), _jsx("span", { className: "ds-text", children: "Active" })] }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: "Screen reader: \"Active\"" }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "The dot renders with no label prop. Adjacent text \"Active\" carries the full meaning \u2014 the dot is a decorative reinforcement only." })] }), _jsxs("div", { style: {
207
+ display: 'flex',
208
+ flexDirection: 'column',
209
+ gap: 'var(--spacing-large)',
210
+ }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Meaningful (aria-label)" }), _jsx("div", { style: {
211
+ display: 'flex',
212
+ alignItems: 'center',
213
+ gap: 'var(--spacing-small)',
214
+ }, children: _jsx(Dot, { colour: "green", label: "Active" }) }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: "Screen reader: \"Active\"" }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: ["The dot renders with", ' ', _jsx("code", { children: "label=\"Active\"" }), ". No adjacent text \u2014 so the dot itself must carry the semantic meaning via aria-label."] })] })] }));
215
+ const InTagContextTemplate = () => (_jsxs("div", { style: {
216
+ padding: 'var(--spacing-xlarge)',
217
+ display: 'flex',
218
+ gap: 'var(--spacing-small)',
219
+ flexWrap: 'wrap',
220
+ alignItems: 'center',
221
+ }, children: [_jsx(Tag, { color: "blue", slotStart: _jsx(Dot, { colour: "blue" }), children: "Year 7" }), _jsx(Tag, { color: "green", slotStart: _jsx(Dot, { colour: "green" }), children: "Active" }), _jsx(Tag, { color: "purple", slotStart: _jsx(Dot, { colour: "purple" }), children: "SEN" }), _jsx(Tag, { color: "salmon", slotStart: _jsx(Dot, { colour: "salmon" }), children: "At risk" })] }));
222
+ const InStatusListTemplate = () => (_jsxs("div", { style: {
223
+ padding: 'var(--spacing-xlarge)',
224
+ display: 'flex',
225
+ flexDirection: 'column',
226
+ gap: 'var(--spacing-large)',
227
+ }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Today's attendance" }), _jsx("div", { style: {
228
+ display: 'flex',
229
+ flexDirection: 'column',
230
+ gap: 'var(--spacing-small)',
231
+ }, children: [
232
+ { name: 'Ahmed Al-Rashidi', status: 'Present', colour: 'green' },
233
+ { name: 'Maria Santos', status: 'Present', colour: 'green' },
234
+ { name: 'James Okonkwo', status: 'Late', colour: 'yellow' },
235
+ { name: 'Chloe Patel', status: 'Medical', colour: 'teal' },
236
+ { name: 'Oliver Wright', status: 'Absent', colour: 'salmon' },
237
+ ].map(({ name, status, colour }) => (_jsxs("div", { style: {
238
+ display: 'flex',
239
+ alignItems: 'center',
240
+ gap: 'var(--spacing-small)',
241
+ }, children: [_jsx(Dot, { colour: colour }), _jsx("span", { className: "ds-text", children: name }), _jsxs("span", { className: "ds-text", style: { color: 'var(--color-grey-600)' }, children: ["\u2014", ' ', status] })] }, name))) })] }));
242
+ // ---------------------------------------------------------------------------
243
+ // Stories
244
+ // ---------------------------------------------------------------------------
245
+ export const Default = withDescription({
17
246
  args: {
18
247
  colour: 'purple',
19
- label: 'Priority indicator',
20
248
  },
21
- };
22
- export const AllColours = {
23
- render: () => (_jsxs("div", { style: { display: 'flex', gap: 8, alignItems: 'center' }, children: [_jsx(Dot, { colour: "purple" }), _jsx(Dot, { colour: "salmon" }), _jsx(Dot, { colour: "teal" }), _jsx(Dot, { colour: "yellow" }), _jsx(Dot, { colour: "green" }), _jsx(Dot, { colour: "orange" }), _jsx(Dot, { colour: "blue" })] })),
24
- };
249
+ render: args => _jsx(Dot, { ...args }),
250
+ }, 'The interactive canvas story — every prop is wired to the **Controls** panel. Use the controls to explore all 7 colours and toggle the `label` prop to switch between decorative (`aria-hidden`) and meaningful (`aria-label`) modes. Dot is decorative by default: no `label` prop means assistive technology ignores it entirely.');
251
+ export const AllColours = withDescription({
252
+ parameters: {
253
+ controls: { disable: true },
254
+ docs: {
255
+ source: {
256
+ language: 'tsx',
257
+ code: `
258
+ import { Dot } from '@arbor-education/design-system.components';
259
+
260
+ const allColours = ['purple', 'salmon', 'teal', 'yellow', 'green', 'orange', 'blue'] as const;
261
+
262
+ function AllColoursTemplate() {
263
+ return (
264
+ <div
265
+ style={{
266
+ padding: 'var(--spacing-xlarge)',
267
+ background: 'var(--color-grey-050)',
268
+ borderRadius: 'var(--border-radius-small)',
269
+ display: 'flex',
270
+ flexWrap: 'wrap',
271
+ gap: 'var(--spacing-small)',
272
+ alignItems: 'center',
273
+ }}
274
+ >
275
+ {allColours.map(colour => (
276
+ <div
277
+ key={colour}
278
+ style={{
279
+ display: 'flex',
280
+ flexDirection: 'column',
281
+ alignItems: 'center',
282
+ gap: 'var(--spacing-small)',
283
+ }}
284
+ >
285
+ <Dot colour={colour} label={colour} />
286
+ <span className="ds-text" style={{ color: 'var(--color-grey-600)' }}>
287
+ {colour}
288
+ </span>
289
+ </div>
290
+ ))}
291
+ </div>
292
+ );
293
+ }
294
+ export default AllColoursTemplate;
295
+ `.trim(),
296
+ },
297
+ },
298
+ },
299
+ render: AllColoursTemplate,
300
+ }, [
301
+ 'All 7 `DotColour` values displayed together. The subtle grey wash (`--color-grey-050`)',
302
+ 'background ensures 10 × 10 circles are visible against white canvas. Each dot uses',
303
+ '`label={colour}` here so screen readers can navigate the story sensibly — in real',
304
+ 'usage, decorative dots paired with visible text would omit the `label` prop.',
305
+ '',
306
+ '**Note:** `DotColour` shares its 7 values with `BadgeColour` — a single colour string',
307
+ 'works for both components without any casting.',
308
+ ].join(' '));
309
+ export const WithAccessibleLabel = withDescription({
310
+ args: {
311
+ colour: 'purple',
312
+ label: 'Purple — SEN category',
313
+ },
314
+ render: args => _jsx(Dot, { ...args }),
315
+ parameters: {
316
+ docs: {
317
+ source: {
318
+ language: 'tsx',
319
+ code: `
320
+ import { Dot } from '@arbor-education/design-system.components';
321
+
322
+ function WithAccessibleLabelExample() {
323
+ return <Dot colour="purple" label="Purple — SEN category" />;
324
+ }
325
+ export default WithAccessibleLabelExample;
326
+ `.trim(),
327
+ },
328
+ },
329
+ },
330
+ }, [
331
+ 'A dot with a `label` prop — rendered with `aria-label="Purple — SEN category"` and no',
332
+ '`aria-hidden`. A screen reader navigating to this element announces the label directly.',
333
+ 'Use this pattern whenever the dot is the sole carrier of information — for example, a',
334
+ 'standalone status indicator in a column with no adjacent text. When visible text is',
335
+ 'present beside the dot, omit `label` instead (see **DecorativeVsMeaningful**).',
336
+ ].join(' '));
337
+ export const DecorativeVsMeaningful = withDescription({
338
+ parameters: {
339
+ controls: { disable: true },
340
+ docs: {
341
+ source: {
342
+ language: 'tsx',
343
+ code: `
344
+ import { Dot } from '@arbor-education/design-system.components';
345
+
346
+ function DecorativeVsMeaningfulTemplate() {
347
+ return (
348
+ <div
349
+ style={{
350
+ padding: 'var(--spacing-xlarge)',
351
+ display: 'flex',
352
+ gap: 'var(--spacing-xlarge)',
353
+ flexWrap: 'wrap',
354
+ }}
355
+ >
356
+ {/* Decorative dot — adjacent text carries meaning */}
357
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }}>
358
+ <p className="ds-text" style={{ margin: 0, color: 'var(--color-grey-600)' }}>
359
+ Decorative (aria-hidden)
360
+ </p>
361
+ <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--spacing-small)' }}>
362
+ {/* No label prop — dot is decorative because "Active" text is present */}
363
+ <Dot colour="green" />
364
+ <span className="ds-text">Active</span>
365
+ </div>
366
+ <p className="ds-text" style={{ margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }}>
367
+ Screen reader: "Active"
368
+ </p>
369
+ </div>
370
+
371
+ {/* Meaningful dot — standalone, no adjacent text */}
372
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }}>
373
+ <p className="ds-text" style={{ margin: 0, color: 'var(--color-grey-600)' }}>
374
+ Meaningful (aria-label)
375
+ </p>
376
+ <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--spacing-small)' }}>
377
+ {/* label prop set — dot is meaningful, no adjacent text */}
378
+ <Dot colour="green" label="Active" />
379
+ </div>
380
+ <p className="ds-text" style={{ margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }}>
381
+ Screen reader: "Active"
382
+ </p>
383
+ </div>
384
+ </div>
385
+ );
386
+ }
387
+ export default DecorativeVsMeaningfulTemplate;
388
+ `.trim(),
389
+ },
390
+ },
391
+ },
392
+ render: DecorativeVsMeaningfulTemplate,
393
+ }, [
394
+ 'The core accessibility teaching story. **Left column**: a decorative dot paired with',
395
+ 'visible text ("Active") — no `label` prop, `aria-hidden="true"`, screen reader',
396
+ 'announces only the text. **Right column**: a standalone meaningful dot — `label="Active"`,',
397
+ 'screen reader announces the label.',
398
+ '',
399
+ '**WCAG 1.4.1 Use of Colour**: colour alone must never be the only means of conveying',
400
+ 'information. The rule is: if visible text next to the dot tells users what the colour means,',
401
+ 'omit `label`. If the dot is the only signal, provide `label`.',
402
+ ].join(' '));
403
+ export const InTagContext = withDescription({
404
+ parameters: {
405
+ controls: { disable: true },
406
+ docs: {
407
+ source: {
408
+ language: 'tsx',
409
+ code: `
410
+ import { Dot, Tag } from '@arbor-education/design-system.components';
411
+
412
+ function InTagContextTemplate() {
413
+ return (
414
+ <div
415
+ style={{
416
+ padding: 'var(--spacing-xlarge)',
417
+ display: 'flex',
418
+ gap: 'var(--spacing-small)',
419
+ flexWrap: 'wrap',
420
+ alignItems: 'center',
421
+ }}
422
+ >
423
+ <Tag color="blue" slotStart={<Dot colour="blue" />}>Year 7</Tag>
424
+ <Tag color="green" slotStart={<Dot colour="green" />}>Active</Tag>
425
+ <Tag color="purple" slotStart={<Dot colour="purple" />}>SEN</Tag>
426
+ <Tag color="salmon" slotStart={<Dot colour="salmon" />}>At risk</Tag>
427
+ </div>
428
+ );
429
+ }
430
+ export default InTagContextTemplate;
431
+ `.trim(),
432
+ },
433
+ },
434
+ },
435
+ render: InTagContextTemplate,
436
+ }, [
437
+ 'The canonical Arbor usage pattern: `<Tag slotStart={<Dot colour="..." />}>Label</Tag>`.',
438
+ 'All four dots are **decorative** — no `label` prop — because `Tag`\'s text children',
439
+ '("Year 7", "Active", "SEN", "At risk") already carry the full semantic meaning.',
440
+ '',
441
+ '`flex-shrink: 0` is built into `ds-dot`, so the circle never collapses inside',
442
+ '`Tag`\'s internal flex layout, even in very narrow containers.',
443
+ '',
444
+ '**Colour note:** `Tag` and `Dot` use separate colour props (`TagColor` vs `DotColour`)',
445
+ 'but share the same 7 extended-palette values. Always match both to the same colour',
446
+ 'for visual consistency.',
447
+ ].join(' '));
448
+ export const InStatusList = withDescription({
449
+ parameters: {
450
+ controls: { disable: true },
451
+ docs: {
452
+ source: {
453
+ language: 'tsx',
454
+ code: `
455
+ import { Dot } from '@arbor-education/design-system.components';
456
+
457
+ function InStatusListTemplate() {
458
+ const students = [
459
+ { name: 'Ahmed Al-Rashidi', status: 'Present', colour: 'green' as const },
460
+ { name: 'Maria Santos', status: 'Present', colour: 'green' as const },
461
+ { name: 'James Okonkwo', status: 'Late', colour: 'yellow' as const },
462
+ { name: 'Chloe Patel', status: 'Medical', colour: 'teal' as const },
463
+ { name: 'Oliver Wright', status: 'Absent', colour: 'salmon' as const },
464
+ ];
465
+
466
+ return (
467
+ <div
468
+ style={{
469
+ padding: 'var(--spacing-xlarge)',
470
+ display: 'flex',
471
+ flexDirection: 'column',
472
+ gap: 'var(--spacing-large)',
473
+ }}
474
+ >
475
+ <p className="ds-text" style={{ margin: 0, color: 'var(--color-grey-600)' }}>
476
+ Today's attendance
477
+ </p>
478
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
479
+ {students.map(({ name, status, colour }) => (
480
+ <div
481
+ key={name}
482
+ style={{ display: 'flex', alignItems: 'center', gap: 'var(--spacing-small)' }}
483
+ >
484
+ <Dot colour={colour} />
485
+ <span className="ds-text">{name}</span>
486
+ <span className="ds-text" style={{ color: 'var(--color-grey-600)' }}>
487
+ — {status}
488
+ </span>
489
+ </div>
490
+ ))}
491
+ </div>
492
+ </div>
493
+ );
494
+ }
495
+ export default InStatusListTemplate;
496
+ `.trim(),
497
+ },
498
+ },
499
+ },
500
+ render: InStatusListTemplate,
501
+ }, [
502
+ 'A realistic Arbor attendance list: student name, status text, and a Dot for each row.',
503
+ 'Most students share the same `green` dot ("Present") — only flagged entries use',
504
+ 'different colours (`yellow` for Late, `teal` for Medical, `salmon` for Absent).',
505
+ '',
506
+ 'This demonstrates the key design principle: **establish a semantic colour mapping and',
507
+ 'apply it consistently**. A meaningful pattern — where most rows are one colour and',
508
+ 'exceptions stand out — carries far more information than a decorative rainbow.',
509
+ '',
510
+ 'All dots here are **decorative** (no `label` prop) because the adjacent name and',
511
+ 'status text ("Ahmed Al-Rashidi — Present") carries the full meaning for every row.',
512
+ 'WCAG 1.4.1 is satisfied by the visible text, not the colour alone.',
513
+ ].join(' '));
25
514
  //# sourceMappingURL=Dot.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dot.stories.js","sourceRoot":"","sources":["../../../src/components/dot/Dot.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,IAAI,GAAqB;IAC7B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,KAAK,EAAE,gBAAgB;IACvB,SAAS,EAAE,GAAG;CACf,CAAC;AAEF,eAAe,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,IAAI,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,IAAI,GAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,oBAAoB;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aAC3D,KAAC,GAAG,IAAC,MAAM,EAAC,QAAQ,GAAG,EACvB,KAAC,GAAG,IAAC,MAAM,EAAC,QAAQ,GAAG,EACvB,KAAC,GAAG,IAAC,MAAM,EAAC,MAAM,GAAG,EACrB,KAAC,GAAG,IAAC,MAAM,EAAC,QAAQ,GAAG,EACvB,KAAC,GAAG,IAAC,MAAM,EAAC,OAAO,GAAG,EACtB,KAAC,GAAG,IAAC,MAAM,EAAC,QAAQ,GAAG,EACvB,KAAC,GAAG,IAAC,MAAM,EAAC,MAAM,GAAG,IACjB,CACP;CACF,CAAC"}
1
+ {"version":3,"file":"Dot.stories.js","sourceRoot":"","sources":["../../../src/components/dot/Dot.stories.tsx"],"names":[],"mappings":"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"}