@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
package/src/index.scss CHANGED
@@ -3,8 +3,10 @@
3
3
  @use "./global.scss";
4
4
  @use "components/button/button.scss";
5
5
  @use "components/icon/icon.scss";
6
+ @use "components/icoText/icoText.scss";
6
7
  @use "components/heading/heading.scss";
7
8
  @use "components/card/card.scss";
9
+ @use "components/articleCard/articleCard.scss";
8
10
  @use "components/dropdown/dropdown.scss";
9
11
  @use "components/formField/formField.scss";
10
12
  @use "components/formField/fieldset/fieldset.scss";
@@ -35,6 +37,8 @@
35
37
  @use "components/banner/banner.scss";
36
38
  @use "components/editableText/editableText.scss";
37
39
  @use "components/progress/progress.scss";
40
+ @use "components/kpiCard/kpiCard.scss";
41
+ @use "components/kvpList/kvpList.scss";
38
42
  @use "components/toast/toast.scss";
39
43
  @use "components/datePicker/datePicker.scss";
40
44
  @use "components/dateTimePicker/dateTimePicker.scss";
package/src/index.ts CHANGED
@@ -1,15 +1,18 @@
1
+ export { ArticleCard, type ArticleCardProps } from 'Components/articleCard/ArticleCard';
1
2
  export { Avatar } from 'Components/avatar/Avatar';
2
3
  export { AvatarGroup } from 'Components/avatarGroup/AvatarGroup';
3
4
  export { Badge } from 'Components/badge/Badge';
4
5
  export { Banner } from 'Components/banner/Banner';
5
6
  export { Button } from 'Components/button/Button';
6
- export { Card } from 'Components/card/Card';
7
+ export { Card, type CardProps } from 'Components/card/Card';
7
8
  export { Combobox } from 'Components/combobox/Combobox';
8
9
  export { DatePicker } from 'Components/datePicker/DatePicker';
9
10
  export { DateTimePicker } from 'Components/dateTimePicker/DateTimePicker';
10
11
  export { Dot } from 'Components/dot/Dot';
11
12
  export { Dropdown } from 'Components/dropdown/Dropdown';
12
13
  export { EditableText } from 'Components/editableText/EditableText';
14
+ export { Fieldset } from 'Components/formField/fieldset/Fieldset';
15
+ export { FormField } from 'Components/formField/FormField';
13
16
  export { CheckboxGroup } from 'Components/formField/inputs/checkbox/CheckboxGroup';
14
17
  export { CheckboxInput } from 'Components/formField/inputs/checkbox/CheckboxInput';
15
18
  export { ColourPickerDropdown } from 'Components/formField/inputs/colourPickerDropdown/ColourPickerDropdown';
@@ -18,12 +21,13 @@ export { RadioButtonGroup } from 'Components/formField/inputs/radio/RadioButtonG
18
21
  export { RadioButtonInput } from 'Components/formField/inputs/radio/RadioButtonInput';
19
22
  export { SelectDropdown } from 'Components/formField/inputs/selectDropdown/SelectDropdown';
20
23
  export { TextInput } from 'Components/formField/inputs/text/TextInput';
21
- export { TimeInput } from 'Components/formField/inputs/time/TimeInput';
22
24
  export { TextArea } from 'Components/formField/inputs/textArea/TextArea';
23
- export { Fieldset } from 'Components/formField/fieldset/Fieldset';
24
- export { FormField } from 'Components/formField/FormField';
25
+ export { TimeInput } from 'Components/formField/inputs/time/TimeInput';
25
26
  export { Heading } from 'Components/heading/Heading';
26
27
  export { Icon } from 'Components/icon/Icon';
28
+ export { IcoText, type IcoTextHeadingProps, type IcoTextIconProps, type IcoTextParagraphProps, type IcoTextProps } from 'Components/icoText/IcoText';
29
+ export { KPICard, type KPICardProps } from 'Components/kpiCard/KPICard';
30
+ export { KVPList, type KVPListDefinitionProps, type KVPListProps, type KVPListRowProps, type KVPListTermProps } from 'Components/kvpList/KVPList';
27
31
  export { Modal } from 'Components/modal/Modal';
28
32
  export { ModalManager } from 'Components/modal/modalManager/ModalManager';
29
33
  export { Pill } from 'Components/pill/Pill';
@@ -35,6 +39,11 @@ export { Separator } from 'Components/separator/Separator';
35
39
  export { SingleUser } from 'Components/singleUser/SingleUser';
36
40
  export { Slideover } from 'Components/slideover/Slideover';
37
41
  export { SlideoverManager } from 'Components/slideoverManager/SlideoverManager';
42
+ export { BooleanCellRenderer } from 'Components/table/cellRenderers/BooleanCellRenderer';
43
+ export { CheckboxCellRenderer } from 'Components/table/cellRenderers/CheckboxCellRenderer';
44
+ export { DefaultCellRenderer } from 'Components/table/cellRenderers/DefaultCellRenderer';
45
+ export { DSDefaultColDef } from 'Components/table/DSDefaultColDef';
46
+ export { GridApiContext } from 'Components/table/GridApiContext';
38
47
  export { Table } from 'Components/table/Table';
39
48
  export { Tabs } from 'Components/tabs/Tabs';
40
49
  export { Tag } from 'Components/tag/Tag';
package/src/tokens.scss CHANGED
@@ -211,6 +211,12 @@
211
211
  --kpi-spacing-vertical: var(--spacing-large);
212
212
  --kpi-color-benchmark-text: var(--color-grey-500);
213
213
  --kpi-color-benchmark-text-bg: var(--color-grey-100);
214
+ --kvp-list-color-text-subtle: var(--color-grey-800);
215
+ --kvp-list-color-text-strong: var(--color-mono-black);
216
+ --ico-text-spacing-gap-horizontal: var(--spacing-large);
217
+ --ico-text-spacing-gap-vertical: var(--spacing-medium);
218
+ --kpi-card-color-text-label: var(--color-grey-800);
219
+ --kpi-card-color-text-value: var(--color-mono-black);
214
220
  --tag-radius: var(--border-radius-round);
215
221
  --tag-neutral-color-text: var(--color-grey-900);
216
222
  --tag-neutral-color-background: var(--color-grey-050);
@@ -51,6 +51,36 @@
51
51
  "$value": "{color.grey.100}"
52
52
  }
53
53
  },
54
+ "kvp-list": {
55
+ "color-text-subtle": {
56
+ "$type": "color",
57
+ "$value": "{color.grey.800}"
58
+ },
59
+ "color-text-strong": {
60
+ "$type": "color",
61
+ "$value": "{color.mono.black}"
62
+ }
63
+ },
64
+ "ico-text": {
65
+ "spacing-gap-horizontal": {
66
+ "$type": "dimension",
67
+ "$value": "{spacing.large}"
68
+ },
69
+ "spacing-gap-vertical": {
70
+ "$type": "dimension",
71
+ "$value": "{spacing.medium}"
72
+ }
73
+ },
74
+ "kpi-card": {
75
+ "color-text-label": {
76
+ "$type": "color",
77
+ "$value": "{color.grey.800}"
78
+ },
79
+ "color-text-value": {
80
+ "$type": "color",
81
+ "$value": "{color.mono.black}"
82
+ }
83
+ },
54
84
  "tag": {
55
85
  "radius": {
56
86
  "$type": "borderRadius",
@@ -1,64 +0,0 @@
1
- # Blanche Designspert - Persistent Memory
2
-
3
- ## Key File Locations
4
- - Design tokens: `src/tokens.scss` (CSS custom properties, NOT Sass vars - globally available, never import)
5
- - Component public API: `src/index.ts`
6
- - Styles entry: `src/index.scss`
7
- - `src/pages/` does NOT exist on the current branch (confirmed 2026-04-17) — was on a prior branch
8
-
9
- ## Token Conventions (confirmed from src/tokens.scss)
10
- - Spacing tokens: `--spacing-xsmall` (0.25rem), `--spacing-small` (0.5rem), `--spacing-medium` (0.75rem), `--spacing-large` (1rem), `--spacing-xlarge` (1.5rem), `--spacing-xxlarge` (2rem), `--spacing-xxxlarge` (4rem)
11
- - Grey scale: `--color-grey-050` through `--color-grey-900` (050, 100, 200, 300, 400, 500, 600, 700, 800, 900)
12
- - Mono: `--color-mono-black` (#202020), `--color-mono-white` (#ffffff)
13
- - Font sizes: `--font-size-1-11` through `--font-size-8-40` (no `--font-size-5-18` listed on line 9-16 but IS defined at line 16)
14
- - Font weights: `--font-weight-regular`, `--font-weight-medium`, `--font-weight-semi-bold`, `--font-weight-bold`
15
- - Border radius: `--border-radius-xsmall` (4px), `--border-radius-small` (8px), `--border-radius-large` (16px), `--border-radius-round` (99px)
16
- - Line heights: `--line-height-tight` (1.25), `--line-height-default` (1.5)
17
-
18
- ## Semantic / Component Tokens (use over base tokens)
19
- - Hyperlink color: `--type-body-hyperlink-color` (maps to `--color-brand-700`) - use for link text
20
- - Hyperlink weight: `--type-body-hyperlink-weight` (maps to `--font-weight-medium`)
21
- - Body text size: `--type-body-p-size` (maps to `--font-size-2-13`)
22
- - Page background: `--page-color-background` (maps to `--color-grey-050`)
23
- - Page border: `--page-base-color-border` (maps to `--color-grey-050`)
24
- - Page heading text: `--page-heading-color-text` (maps to `--color-mono-black`)
25
- - Page heading gap: `--page-heading-spacing-gap` (maps to `--spacing-small`)
26
- - Default icon color: `--icons-icon-default` (maps to `--color-grey-900`)
27
- - Focus color: `--focus-color-focus` (maps to `--color-brand-500`)
28
-
29
- ## CSS Naming Conventions
30
- - Prefix: `ds-` (all design system classes)
31
- - BEM: `ds-{block}`, `ds-{block}__{element}`, `ds-{block}--{modifier}`
32
- - SCSS file: camelCase matching directory name (e.g. `assessmentsPage.scss`)
33
- - Use `classnames` library for conditional classes
34
-
35
- ## Typography Color Patterns (for body text in pages)
36
- - Primary / heading text: `--color-grey-900` or `--color-mono-black`
37
- - Secondary / supporting text: `--color-grey-600` or `--color-grey-500`
38
- - Muted / disabled: `--color-grey-400`
39
- - Links: use breadcrumb component tokens when in breadcrumbs (NOT raw `--type-body-hyperlink-color` or `--color-grey-600`)
40
- - Current breadcrumb text: `--breadcrumbs-breadcrumb-link-active-color-text` (maps to `--color-grey-900`)
41
-
42
- ## Breadcrumb Component Tokens (tokens exist — line numbers may drift as tokens.scss grows)
43
- - List gap: `--breadcrumbs-spacing-gap-horizontal` (maps to `--spacing-small`)
44
- - Divider color: `--breadcrumbs-divider-default-color` (maps to `--color-grey-600`)
45
- - Link default color: `--breadcrumbs-breadcrumb-link-default-color-text` (maps to `--color-grey-600`)
46
- - Link hover color: `--breadcrumbs-breadcrumb-link-hover-color-text` (maps to `--color-brand-600`)
47
- - Link active/current color: `--breadcrumbs-breadcrumb-link-active-color-text` (maps to `--color-grey-900`)
48
- - Link hover icon color: `--breadcrumbs-breadcrumb-link-hover-color-icon` (maps to `--color-brand-600`)
49
- - Link default icon color: `--breadcrumbs-breadcrumb-link-default-color-icon` (maps to `--color-grey-600`)
50
- - No breadcrumb-specific font-weight token exists; use `--type-body-hyperlink-weight` for link weight
51
-
52
- ## Design Token Hierarchy to Enforce
53
- 1. Component tokens (e.g. `--breadcrumbs-breadcrumb-link-default-color-text`) - most specific, prefer always
54
- 2. Semantic tokens (e.g. `--type-body-hyperlink-color`, `--page-color-background`)
55
- 3. Base tokens (e.g. `--color-grey-600`) - only if no semantic equivalent
56
-
57
- ## Known Issues / Patterns
58
- - Breadcrumb implementations commonly use `--color-grey-600` or `--type-body-hyperlink-color` when dedicated `--breadcrumbs-*` component tokens exist and should be used instead
59
- - Breadcrumb hover state commonly missing color change; `--breadcrumbs-breadcrumb-link-hover-color-text` should be applied on hover alongside text-decoration
60
- - `--type-body-bold-weight` DOES exist in tokens.scss (maps to `--font-weight-semi-bold`). It IS a valid semantic token. Use it for bold body text emphasis instead of reaching for the base token directly.
61
- - Also note: `--hyperlink-default`, `--hyperlink-hover`, `--hyperlink-active` are component tokens for hyperlinks. These are the most specific link tokens and should be used in preference to `--type-body-hyperlink-color` for actual inline hyperlinks.
62
- - `src/examples/` does NOT exist on the current branch (confirmed 2026-04-17) — was on a prior branch
63
- - No `@use` import needed for tokens.scss in SCSS files - tokens are CSS custom properties, globally available
64
- - Do NOT use breadcrumb component tokens (e.g. `--breadcrumbs-breadcrumb-link-default-color-text`) for non-breadcrumb elements like table row counts. Use `--color-grey-600` for secondary/supporting body text when no semantic token exists.
@@ -1,129 +0,0 @@
1
- # Dorothy Fact-Checker Memory
2
-
3
- ## Agent File Locations
4
- - Agent definitions (all four): `.claude/agents/{blanche-designspert,dorothy-fact-checker,rose-storybookspert,sophia-componentspert}.md`
5
- - Agent memory directories: `.claude/agent-memory/{agent-name}/`
6
- - These files use relative paths (from project root) for portability across developer machines
7
- - Frontmatter `name` field must match the filename (without .md extension)
8
-
9
- ## The Golden Girls Team
10
- - blanche-designspert: model sonnet, color purple, design tokens & styling
11
- - dorothy-fact-checker: model opus, color blue, QA & fact-checking
12
- - rose-storybookspert: model sonnet, color pink, Storybook stories
13
- - sophia-componentspert: model sonnet, color gold, component guidance
14
- - Emojis: blanche=lipstick, dorothy=magnifying glass, rose=rose, sophia=purse
15
-
16
- ## Create-Page Skill Integration
17
- - Skill at `.claude/skills/create-page/SKILL.md` calls agents at steps 3/4 (Sophia), 6 (Blanche), 8 (Rose), 10 (Dorothy)
18
- - Agent names in backtick code refs are what matter for resolution, not the heading text
19
-
20
- ## Verification Patterns
21
- - When checking agent file changes, compare against what was loaded into the system prompt (which reflects the pre-change state) since these files may be untracked and have no git history to diff against
22
- - The Grep tool and memory system resolve relative paths against the project working directory
23
- - Claude Code injects absolute paths at runtime even when files use relative paths -- this is expected behavior
24
-
25
- ## Common Issues to Watch For
26
- - Absolute paths leaking into config files (especially `/Users/{username}/...` patterns)
27
- - Files claimed to be committed but actually untracked (check `git ls-files` and `git status`)
28
- - Agent memory directories may be empty (no MEMORY.md) until agents run for the first time -- this is by design
29
-
30
- ## Project Structure Notes
31
- - `src/pages/` is a new directory added for page-level components (not in original architecture)
32
- - No `Pages/*` path alias exists in tsconfig.json -- only `Components/*` and `Utils/*`
33
- - Therefore page exports in `src/index.ts` must use relative paths (`./pages/...`) not aliases
34
- - ESLint catches stylistic issues that `check-types` and `style-lint` do not -- always run all three
35
-
36
- ## Common Hallucination Patterns
37
- - Agents may claim "all quality checks passed" but only run check-types and style-lint, missing ESLint errors
38
- - ESLint stylistic rules (@stylistic/arrow-parens, @stylistic/brace-style, @stylistic/operator-linebreak, @stylistic/jsx-one-expression-per-line) are frequently violated in generated code
39
- - The `yarn eslint` command is not listed in CLAUDE.md's common commands but is critical for quality
40
- - **NEW PAGE REGISTRATION**: Agents frequently create page component files but forget to register them in `src/index.ts` (export) and `src/index.scss` (@use). The existing pattern (see AssessmentsPage) requires BOTH. Without these, the SCSS is dead code and the component is not part of the library's public API
41
- - Icon name grep: allowedIcons file is `.tsx` not `.ts` -- use correct extension when searching
42
- - **Components that DO exist (agents have hallucinated these as missing):**
43
- - `Badge` IS exported (index.ts line 20) with `BadgeColour`, `BadgeProps`, `BadgeSize` — `'sm'|'md'|'lg'` sizes, 7 colours
44
- - `Dot` IS exported (index.ts line 18) with `DotColour`
45
- - `CheckboxInput` IS exported (index.ts line 24)
46
- - `SearchBar` IS exported (index.ts line 40)
47
- - `BooleanCellRenderer` IS exported (index.ts line 47), also registered as `'dsBooleanCellRenderer'`
48
- - **Sophia prop hallucinations (confirmed 2026-02-19):**
49
- - Button `ghost` variant does NOT exist (actual: primary, secondary, tertiary, primary-destructive, secondary-destructive, text-link, dropdown) ✅ CORRECT
50
- - Section `defaultExpanded` does NOT exist (actual: `collapsed` boolean, inverted logic) ✅ CORRECT
51
- - Section `headerContent` does NOT exist (Section has buttonText/buttonOnClick for a single button, not an arbitrary ReactNode slot -- Table has headerContent) ✅ CORRECT
52
- - Icon `grip-vertical` does NOT exist (actual name: `'grab'` which maps to GripVertical lucide icon) ✅ CORRECT
53
- - CheckboxInput IS exported from index.ts (line 24, confirmed 2026-04-17) -- DO NOT claim it's internal
54
- - Tree data: codebase uses `treeDataChildrenField` pattern, not `getDataPath` ✅ CORRECT
55
- - TextInput has NO icon/prefix support -- it's a bare `<input>` wrapper with only `size` and `hasError` custom props; everything else is passthrough from InputHTMLAttributes ✅ CORRECT
56
- - Dropdown has `Dropdown.SelectItem` in addition to `Dropdown.Item` -- agents often omit SelectItem ✅ CORRECT
57
- - Table's `treeData`, `getDataPath`, `rowDragManaged` are AG Grid passthroughs (via AgGridReactProps), not Arbor-specific features -- agents should not present them as Table component features ✅ CORRECT
58
- - **Dorothy's mistakes (corrected):**
59
- - ❌ I incorrectly claimed Button `iconLeftName`/`iconRightName` props don't exist - THEY DO EXIST (Button.tsx). User caught this error. These props are real and should be used.
60
- - ❌ I claimed CheckboxInput was NOT exported — WRONG. CheckboxInput IS exported (index.ts line 24, confirmed 2026-04-17).
61
- - ❌ I claimed Badge does NOT exist — WRONG. Badge IS exported (index.ts line 20, confirmed 2026-04-17) with BadgeColour/BadgeProps/BadgeSize types.
62
-
63
- ## Table Cell Renderers (verified 2026-02-19)
64
- - All three registered in Table.tsx `components` prop by string name:
65
- - `dsInlineTextCellRenderer` -> InlineTextCellRenderer (renders span with value)
66
- - `dsSelectDropdownCellRenderer` -> SelectDropdownCellRenderer (renders dropdown Button, paired with dsSelectDropdownCellEditor)
67
- - `dsButtonCellRenderer` -> ButtonCellRenderer (spreads ButtonProps from value, supports iconLeftName/iconRightName for icon buttons)
68
- - Only `Table.ButtonCellRenderer` is exposed as a static property; others used via string names in colDef
69
- - `Table.DefaultValueFormatter` also exposed as static property
70
-
71
- ## Table Themes (verified 2026-02-19)
72
- - `tidyTheme`: activated via `tableTheme="tidy"` prop. White bg, no borders, clean look. Full example in TidyTable story.
73
- - `defaultTheme`: the standard theme, supports hasColumnBorders and tableSpacing settings
74
- - TidyTable story demonstrates: treeData + treeDataChildrenField + inline editing + all cell renderers together
75
-
76
- ## Section Component (verified 2026-02-19)
77
- - `title` prop is typed as `string` (NOT ReactNode) -- cannot directly embed JSX like Pill
78
- - Chevron icon IS auto-added when `collapsible={true}` (chevron-down/chevron-up with aria-expanded)
79
- - `collapsed` prop sets initial state (inverted from defaultExpanded)
80
- - `buttonText`/`buttonOnClick` for optional action button in heading
81
- - `titleIconName`/`titleIconColor`/`titleIconScreenReaderText` for icon next to title
82
-
83
- ## Sophia Accuracy Trend
84
- - 2026-02-19 (earlier): Multiple hallucinations (ghost variant, defaultExpanded, headerContent on Section, grip-vertical icon)
85
- - 2026-02-19 (Student Profile analysis): 100% accuracy on all prop claims across 8 components. Zero hallucinations. Only omissions were Dropdown.SelectItem, some Button variants, and SearchBar.placeholderText -- all editorial choices, not errors.
86
- - 2026-02-19 (Migration mapping): 14/14 claims verified. Zero hallucinations. Correct on: Heading.InnerContainer, Button type Omit, Tabs semantic HTML, BulkActionsDropdown actions.length (not selected rows), both '3-dot' and 'ellipsis-vertical' icon aliases, setAgGridLicenseKey auto-call, all Table sub-component props. Minor omissions: Tabs.Item link mode, headerContent gatekeeper for search.
87
- - TooltipWrapper: triggerProps.asChild is technically valid but redundant -- TooltipTrigger already hardcodes asChild={true}
88
-
89
- ## Icon Alias Gotcha (verified 2026-02-19)
90
- - `'3-dot'` and `'ellipsis-vertical'` both map to Lucide `EllipsisVertical` -- they are interchangeable aliases
91
- - `'grab'` maps to Lucide `GripVertical` (NOT `'grip-vertical'`)
92
- - Prefer Lucide-style naming ('ellipsis-vertical') over legacy aliases ('3-dot') for consistency
93
-
94
- ## Table Search Gatekeeper (verified 2026-02-19)
95
- - SearchBar in Table only renders when BOTH `headerContent` is truthy AND `hasSearch` is true (default)
96
- - `headerContent` controls whether `<TableHeader>` renders at all (Table.tsx line 149)
97
- - If `headerContent` is falsy, `hasSearch={true}` does nothing -- no search bar appears
98
- - `quickFilterText` is wired to search state (Table.tsx line 196)
99
-
100
- ## Export Status (verified 2026-04-17 against src/index.ts)
101
- - SearchBar: exported (line 40) ✅
102
- - CheckboxInput: exported (line 24) ✅
103
- - CheckboxGroup: NOT exported — internal only ✅
104
- - RadioButtonGroup: NOT exported — internal only ✅
105
- - BooleanCellRenderer: exported (line 47) ✅ — also registered as `'dsBooleanCellRenderer'` in Table
106
- - New exports added recently: Toggle, Row, SingleUser, Combobox (+ types), TimeInput (+ types), DatePicker, DateTimePicker (+ types)
107
-
108
- ## Pill Component API
109
- - `onclick` prop (lowercase c) accepts `(checked: boolean) => void`
110
- - Uses `useEffect` to fire onclick on checked state change, including on mount
111
- - State setters from `useState` are stable references, so passing them directly as onclick is safe
112
-
113
- ## Test Quality Benchmarks
114
- - Tests should use accessible queries (getByRole, getByLabelText) over getByText/getByTestId
115
- - userEvent is preferred over fireEvent for user interactions
116
- - Tests should verify callback arguments, not just that callbacks were called
117
- - Edge cases (empty state, no data) should be covered
118
-
119
- ## Recurring Bugs in Generated Pages (confirmed 2026-02-19)
120
- - **Icon name `'edit'` does NOT exist** in allowedIcons.tsx -- correct name is `'pencil'`
121
- - **CSS ds- prefix mismatch**: SCSS uses `.ds-{page-name}` but component JSX omits the `ds-` prefix. Always verify SCSS selectors match JSX classNames
122
- - **Direct SCSS import in page components**: Pages in `src/pages/` should NOT `import './foo.scss'` directly (causes TS2307). Pages in `src/examples/pages/` CAN use direct imports because Storybook/Vitest handle them fine (global.d.ts declares `*.scss` modules). The `src/examples/` path is for example/demo pages that are NOT part of the library build
123
- - **Pill renders as `<span>`, NOT `<button>`**: Tests that use `getByRole('button')` to find Pills will fail. Use `getByText` instead
124
- - **SearchBar inactive state**: SearchBar with empty `searchValue` renders as a collapsed Button, not an input. Tests must click to activate it first, or initialize with non-empty searchValue
125
- - **TS error downplaying**: Agents may call real TS compilation errors "warnings" or "expected" -- always verify exit code of `yarn check-types`
126
- - **Page registration still forgotten**: AssessmentBuilderPage was missing from both index.ts and index.scss (same pattern as before)
127
- - **`@stylistic/jsx-one-expression-per-line` is the #1 ESLint violation**: `<br />` tags inline with text content always trigger this. 12 of 13 ESLint errors in StudentProfilePage were this exact rule. The `--fix` flag can auto-resolve these
128
- - **Unused imports in test files**: Agents import `beforeEach` from vitest but never use it (1 of 13 errors in StudentProfilePage)
129
- - **`src/examples/pages/` is a separate convention** from `src/pages/`: example pages are NOT library exports and do NOT need registration in index.ts/index.scss. Direct SCSS imports are fine here
@@ -1,29 +0,0 @@
1
- # Rose's Storybookspert Memory
2
-
3
- See `patterns.md` for full details on codebase conventions.
4
-
5
- ## Quick Reference
6
-
7
- - Meta/StoryObj import: `from '@storybook/react-vite'`
8
- - fn() import: `from 'storybook/test'` (NOT `@storybook/test`)
9
- - Meta pattern: `satisfies Meta<typeof ComponentName>` with `export default meta`
10
- - Story type: `type Story = StoryObj<typeof meta>`
11
- - Storybook version: v9 (storybook package) with `@storybook/react-vite` ^9.1.8
12
- - Page-level stories: use `layout: 'fullscreen'` in parameters
13
- - `src/pages/` does NOT exist on the current branch (confirmed 2026-04-17) — this directory was on a previous branch and may not be present
14
- - Story files use `.stories.tsx` extension (not `.story.tsx` for new files)
15
- - tsconfig excludes `*.story.tsx` but includes `*.stories.tsx` and `*.test.tsx`
16
-
17
- ## useState in Story Render Functions
18
-
19
- - Do NOT use `eslint-disable-next-line react-hooks/rules-of-hooks` — the `react-hooks` plugin
20
- is NOT configured in this project's eslint.config.mts, so the disable comment itself causes
21
- an ESLint error ("Definition for rule not found").
22
- - Instead, extract stateful render logic into a named template component defined above the story:
23
- `const MyTemplate = (args: React.ComponentProps<typeof MyComponent>) => { ... }`
24
- then reference it: `render: MyTemplate`. See Toast.stories.tsx for the inline render alternative
25
- (useState directly in the render arrow function also works fine without any disable comment).
26
-
27
- ## Known Pre-existing Issues
28
-
29
- - `src/pages/` directory does not exist on the current branch — notes about AssessmentsPage TS errors are stale (from a prior branch)
@@ -1,14 +0,0 @@
1
- # Sophia Componentspert Memory
2
-
3
- See topic files for details:
4
- - [components.md](./components.md) - Component APIs, gotchas, and patterns
5
-
6
- ## Key Project Facts
7
- - Path aliases: `Components/*` → `src/components/*`, `Utils/*` → `src/utils/*`
8
- - CSS prefix: `ds-` (e.g. `ds-button`, `ds-button--primary`)
9
- - Package manager: yarn (NOT npm)
10
- - Button prop is `variant` not `type` - common gotcha
11
- - SearchBar IS exported from src/index.ts (confirmed 2026-04-17) - available to consumers
12
- - CheckboxGroup EXISTS but is NOT exported from src/index.ts — internal only (confirmed 2026-04-17)
13
- - New components added 2026-04-17: Toggle, Row, SingleUser, DatePicker, DateTimePicker, TimeInput, Combobox, BooleanCellRenderer
14
- - BooleanCellRenderer registered in Table as `'dsBooleanCellRenderer'` string name AND exported directly