@arbor-education/design-system.components 0.15.0 → 0.16.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 (297) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +17 -0
  4. package/README.md +8 -0
  5. package/component-library.md +144 -13
  6. package/dist/components/articleCard/ArticleCard.stories.d.ts +137 -11
  7. package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -1
  8. package/dist/components/articleCard/ArticleCard.stories.js +358 -91
  9. package/dist/components/articleCard/ArticleCard.stories.js.map +1 -1
  10. package/dist/components/avatar/Avatar.stories.d.ts +6 -6
  11. package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
  12. package/dist/components/avatar/Avatar.stories.js +393 -49
  13. package/dist/components/avatar/Avatar.stories.js.map +1 -1
  14. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts +9 -7
  15. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
  16. package/dist/components/avatarGroup/AvatarGroup.stories.js +688 -65
  17. package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
  18. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  19. package/dist/components/banner/Banner.stories.js +7 -3
  20. package/dist/components/banner/Banner.stories.js.map +1 -1
  21. package/dist/components/card/Card.stories.d.ts +105 -4
  22. package/dist/components/card/Card.stories.d.ts.map +1 -1
  23. package/dist/components/card/Card.stories.js +336 -18
  24. package/dist/components/card/Card.stories.js.map +1 -1
  25. package/dist/components/combobox/Combobox.stories.d.ts +134 -21
  26. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
  27. package/dist/components/combobox/Combobox.stories.js +676 -175
  28. package/dist/components/combobox/Combobox.stories.js.map +1 -1
  29. package/dist/components/datePicker/DatePicker.stories.d.ts +119 -27
  30. package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
  31. package/dist/components/datePicker/DatePicker.stories.js +575 -47
  32. package/dist/components/datePicker/DatePicker.stories.js.map +1 -1
  33. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts +155 -39
  34. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts.map +1 -1
  35. package/dist/components/dateTimePicker/DateTimePicker.stories.js +674 -103
  36. package/dist/components/dateTimePicker/DateTimePicker.stories.js.map +1 -1
  37. package/dist/components/editableText/EditableText.stories.d.ts +53 -12
  38. package/dist/components/editableText/EditableText.stories.d.ts.map +1 -1
  39. package/dist/components/editableText/EditableText.stories.js +401 -64
  40. package/dist/components/editableText/EditableText.stories.js.map +1 -1
  41. package/dist/components/formField/FormField.d.ts +4 -0
  42. package/dist/components/formField/FormField.d.ts.map +1 -1
  43. package/dist/components/formField/FormField.js +2 -1
  44. package/dist/components/formField/FormField.js.map +1 -1
  45. package/dist/components/formField/FormField.test.js +5 -0
  46. package/dist/components/formField/FormField.test.js.map +1 -1
  47. package/dist/components/formField/fieldset/Fieldset.stories.d.ts +56 -4
  48. package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
  49. package/dist/components/formField/fieldset/Fieldset.stories.js +534 -28
  50. package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
  51. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts +3 -1
  52. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts.map +1 -1
  53. package/dist/components/formField/inputs/checkbox/CheckboxInput.js +1 -1
  54. package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -1
  55. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts +95 -1
  56. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts.map +1 -1
  57. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js +386 -9
  58. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js.map +1 -1
  59. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
  60. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  61. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  62. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  63. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
  64. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  65. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
  66. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  67. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
  68. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  69. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
  70. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
  71. package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
  72. package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
  73. package/dist/components/formField/label/Label.stories.d.ts +54 -5
  74. package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
  75. package/dist/components/formField/label/Label.stories.js +238 -4
  76. package/dist/components/formField/label/Label.stories.js.map +1 -1
  77. package/dist/components/icoText/IcoText.stories.d.ts +32 -6
  78. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
  79. package/dist/components/icoText/IcoText.stories.js +309 -14
  80. package/dist/components/icoText/IcoText.stories.js.map +1 -1
  81. package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
  82. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
  83. package/dist/components/kpiCard/KPICard.stories.js +354 -10
  84. package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
  85. package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
  86. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
  87. package/dist/components/kvpList/KVPList.stories.js +403 -10
  88. package/dist/components/kvpList/KVPList.stories.js.map +1 -1
  89. package/dist/components/modal/Modal.stories.d.ts +113 -9
  90. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  91. package/dist/components/modal/Modal.stories.js +633 -13
  92. package/dist/components/modal/Modal.stories.js.map +1 -1
  93. package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
  94. package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
  95. package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
  96. package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
  97. package/dist/components/pill/Pill.d.ts.map +1 -1
  98. package/dist/components/pill/Pill.js +1 -1
  99. package/dist/components/pill/Pill.js.map +1 -1
  100. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  101. package/dist/components/pill/Pill.stories.js +11 -13
  102. package/dist/components/pill/Pill.stories.js.map +1 -1
  103. package/dist/components/row/Row.stories.d.ts +1 -2
  104. package/dist/components/row/Row.stories.d.ts.map +1 -1
  105. package/dist/components/row/Row.stories.js +360 -50
  106. package/dist/components/row/Row.stories.js.map +1 -1
  107. package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
  108. package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
  109. package/dist/components/searchBar/SearchBar.stories.js +428 -36
  110. package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
  111. package/dist/components/section/Section.stories.d.ts +11 -41
  112. package/dist/components/section/Section.stories.d.ts.map +1 -1
  113. package/dist/components/section/Section.stories.js +494 -56
  114. package/dist/components/section/Section.stories.js.map +1 -1
  115. package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
  116. package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
  117. package/dist/components/singleUser/SingleUser.stories.js +303 -31
  118. package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
  119. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
  120. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
  121. package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
  122. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  123. package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
  124. package/dist/components/table/DSDefaultColDef.js +4 -3
  125. package/dist/components/table/DSDefaultColDef.js.map +1 -1
  126. package/dist/components/table/Table.d.ts +6 -1
  127. package/dist/components/table/Table.d.ts.map +1 -1
  128. package/dist/components/table/Table.js +8 -3
  129. package/dist/components/table/Table.js.map +1 -1
  130. package/dist/components/table/Table.stories.d.ts +2 -0
  131. package/dist/components/table/Table.stories.d.ts.map +1 -1
  132. package/dist/components/table/Table.stories.js +357 -3
  133. package/dist/components/table/Table.stories.js.map +1 -1
  134. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  135. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  136. package/dist/components/table/TableFooter.stories.js +137 -0
  137. package/dist/components/table/TableFooter.stories.js.map +1 -0
  138. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  139. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  140. package/dist/components/table/TableHeader.stories.js +176 -0
  141. package/dist/components/table/TableHeader.stories.js.map +1 -0
  142. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  143. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  144. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  145. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  146. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  147. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  148. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  149. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  150. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  151. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  152. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  153. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  154. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  155. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  156. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  157. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  158. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  159. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  160. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  161. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  162. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  163. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  164. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  165. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  166. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  167. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  168. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  169. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  170. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  171. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  172. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  173. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  174. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  175. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  176. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  177. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  178. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  179. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  180. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  181. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  182. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  183. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  184. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  185. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  186. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  187. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  188. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  189. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  190. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  191. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  192. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  193. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  194. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  195. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  196. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  197. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  198. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  199. package/dist/components/tabs/Tabs.stories.js +398 -22
  200. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  201. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  202. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  203. package/dist/components/tabs/TabsItem.stories.js +61 -9
  204. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  205. package/dist/components/toast/Toast.stories.d.ts +103 -10
  206. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  207. package/dist/components/toast/Toast.stories.js +409 -47
  208. package/dist/components/toast/Toast.stories.js.map +1 -1
  209. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  210. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  211. package/dist/components/toggle/Toggle.stories.js +311 -122
  212. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  213. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  214. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  215. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  216. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  217. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  218. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  219. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  220. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  221. package/dist/index.css +8 -0
  222. package/dist/index.css.map +1 -1
  223. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  224. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  225. package/dist/utils/PopupParentContext.stories.js +266 -0
  226. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  227. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  228. package/dist/utils/getDefaultPopupParent.js +6 -0
  229. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  230. package/package.json +1 -1
  231. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  232. package/src/components/avatar/Avatar.stories.tsx +504 -59
  233. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  234. package/src/components/banner/Banner.stories.tsx +7 -3
  235. package/src/components/card/Card.stories.tsx +466 -36
  236. package/src/components/combobox/Combobox.stories.tsx +867 -260
  237. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  238. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  239. package/src/components/editableText/EditableText.stories.tsx +567 -91
  240. package/src/components/formField/FormField.test.tsx +6 -0
  241. package/src/components/formField/FormField.tsx +5 -0
  242. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  243. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  244. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  245. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  246. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  247. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  248. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  249. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  250. package/src/components/formField/label/Label.stories.tsx +317 -8
  251. package/src/components/icoText/IcoText.stories.tsx +442 -31
  252. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  253. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  254. package/src/components/modal/Modal.stories.tsx +963 -26
  255. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  256. package/src/components/pill/Pill.stories.tsx +11 -13
  257. package/src/components/pill/Pill.tsx +1 -0
  258. package/src/components/row/Row.stories.tsx +474 -58
  259. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  260. package/src/components/section/Section.stories.tsx +723 -70
  261. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  262. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  263. package/src/components/table/DSDefaultColDef.ts +25 -5
  264. package/src/components/table/Table.stories.tsx +411 -3
  265. package/src/components/table/Table.tsx +9 -2
  266. package/src/components/table/TableFooter.stories.tsx +196 -0
  267. package/src/components/table/TableHeader.stories.tsx +251 -0
  268. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  269. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  270. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  271. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  272. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  273. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  274. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  275. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  276. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  277. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  278. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  279. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  280. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  281. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  282. package/src/components/tabs/Tabs.stories.tsx +540 -60
  283. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  284. package/src/components/toast/Toast.stories.tsx +539 -77
  285. package/src/components/toggle/Toggle.stories.tsx +371 -135
  286. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  287. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  288. package/src/docs/Contributing.mdx +241 -0
  289. package/src/docs/UsingComponents.mdx +93 -0
  290. package/src/docs/Welcome.mdx +68 -0
  291. package/src/global.scss +7 -0
  292. package/src/utils/PopupParentContext.stories.tsx +367 -0
  293. package/src/utils/getDefaultPopupParent.ts +6 -0
  294. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  295. package/.ralph/storybook-upgrade/prd.json +0 -777
  296. package/.ralph/storybook-upgrade/progress.md +0 -342
  297. package/src/components/table/TableWIP.mdx +0 -3
@@ -10,6 +10,7 @@ import {
10
10
  } from '@storybook/addon-docs/blocks';
11
11
  import { useState } from 'react';
12
12
  import { fn } from 'storybook/test';
13
+ import { Icon } from 'Components/icon/Icon';
13
14
  import { RadioButtonInput } from './RadioButtonInput';
14
15
  import { RadioButtonGroup } from './RadioButtonGroup';
15
16
 
@@ -72,19 +73,26 @@ const DEVELOPER_NOTES = [
72
73
  '#### 1. `hasError` is ARIA-only — it makes zero visual difference',
73
74
  '`hasError={true}` sets `aria-invalid="true"` on the native `<input>`. There are NO CSS rules',
74
75
  'that change the appearance of the indicator circle based on `aria-invalid`.',
75
- 'To show a visible error state, YOU must render an error message element below the group.',
76
- 'See the `WithError` and `RadioGroupWithError` stories for the correct pattern.',
76
+ 'To show a visible error state, render an error message yourself below the group using',
77
+ '`FormField`\'s canonical markup `.ds-form-field__message` wrapping a `.ds-form-field__message--error`',
78
+ 'span with a `triangle-alert` `Icon`. This keeps radio errors visually consistent with text/number/select',
79
+ 'fields wrapped in `FormField`. (`FormField` itself does not currently support `inputType="radio"`,',
80
+ 'so you have to hand-roll the markup.)',
81
+ 'See the `WithError` and `RadioGroupWithError` stories for the full pattern.',
77
82
  '',
78
83
  '```tsx',
79
84
  '// WRONG — hasError alone shows no visible change',
80
85
  '<RadioButtonInput hasError name="period" value="term" label="Current term" checked onChange={() => {}} />',
81
86
  '',
82
- '// CORRECT — pair hasError with a visible error message rendered by the consumer',
87
+ '// CORRECT — pair hasError with the canonical FormField error markup',
83
88
  '<div>',
84
89
  ' <RadioButtonInput hasError name="period" value="term" label="Current term" checked onChange={() => {}} />',
85
- ' <p role="alert" style={{ color: "var(--form-field-text-error-color-error-text)" }}>',
86
- ' Please select a valid report period.',
87
- ' </p>',
90
+ ' <div className="ds-form-field__message">',
91
+ ' <span className="ds-form-field__message--error" role="alert">',
92
+ ' <Icon size={12} name="triangle-alert" />',
93
+ ' Please select a valid report period.',
94
+ ' </span>',
95
+ ' </div>',
88
96
  '</div>',
89
97
  '```',
90
98
  '',
@@ -395,21 +403,17 @@ const RadioGroupWithErrorTemplate = () => {
395
403
  checkedValue={method}
396
404
  onChange={e => setMethod(e.target.value)}
397
405
  options={[
398
- { id: 'opt-email', value: 'email', label: 'Email', hasError: true },
399
- { id: 'opt-sms', value: 'sms', label: 'SMS', hasError: true },
400
- { id: 'opt-post', value: 'post', label: 'Post', hasError: true },
406
+ { id: 'opt-email', value: 'email', label: 'Email' },
407
+ { id: 'opt-sms', value: 'sms', label: 'SMS' },
408
+ { id: 'opt-post', value: 'post', label: 'Post' },
401
409
  ]}
402
410
  />
403
- <p
404
- role="alert"
405
- style={{
406
- margin: 'var(--spacing-small) 0 0',
407
- color: 'var(--form-field-text-error-color-error-text)',
408
- fontSize: 'var(--font-size-2-13)',
409
- }}
410
- >
411
- Please select a notification method to continue.
412
- </p>
411
+ <div className="ds-form-field__message">
412
+ <span className="ds-form-field__message--error" role="alert">
413
+ <Icon size={12} name="triangle-alert" />
414
+ Please select a notification method to continue.
415
+ </span>
416
+ </div>
413
417
  </div>
414
418
  );
415
419
  };
@@ -608,16 +612,12 @@ export const WithError: Story = withDescription(
608
612
  onChange={fn()}
609
613
  label="Full academic year"
610
614
  />
611
- <p
612
- role="alert"
613
- style={{
614
- margin: 0,
615
- color: 'var(--form-field-text-error-color-error-text)',
616
- fontSize: 'var(--font-size-2-13)',
617
- }}
618
- >
619
- Please select a report period to continue.
620
- </p>
615
+ <div className="ds-form-field__message">
616
+ <span className="ds-form-field__message--error" role="alert">
617
+ <Icon size={12} name="triangle-alert" />
618
+ Please select a report period to continue.
619
+ </span>
620
+ </div>
621
621
  </div>
622
622
  ),
623
623
  parameters: {
@@ -625,12 +625,14 @@ export const WithError: Story = withDescription(
625
625
  source: {
626
626
  language: 'tsx',
627
627
  code: `
628
- import { RadioButtonInput } from '@arbor-education/design-system.components';
628
+ import { Icon, RadioButtonInput } from '@arbor-education/design-system.components';
629
629
 
630
630
  function WithErrorExample() {
631
- // IMPORTANT: hasError sets aria-invalid="true" on the <input> but makes
632
- // NO visual change to the indicator circle — there are zero CSS rules for
633
- // the error state. You MUST render the error message yourself.
631
+ // hasError sets aria-invalid="true" on the <input> but makes NO visual change
632
+ // to the indicator circle — there are zero CSS rules for the error state.
633
+ // Render the error message yourself using FormField's canonical markup so the
634
+ // look matches text/number/select fields:
635
+ // .ds-form-field__message > .ds-form-field__message--error + triangle-alert Icon
634
636
  return (
635
637
  <div>
636
638
  <RadioButtonInput
@@ -660,10 +662,12 @@ function WithErrorExample() {
660
662
  onChange={() => {}}
661
663
  label="Full academic year"
662
664
  />
663
- {/* Consumer-rendered error message — hasError alone shows nothing visually */}
664
- <p role="alert" style={{ color: 'var(--form-field-text-error-color-error-text)' }}>
665
- Please select a report period to continue.
666
- </p>
665
+ <div className="ds-form-field__message">
666
+ <span className="ds-form-field__message--error" role="alert">
667
+ <Icon size={12} name="triangle-alert" />
668
+ Please select a report period to continue.
669
+ </span>
670
+ </div>
667
671
  </div>
668
672
  );
669
673
  }
@@ -678,8 +682,11 @@ export default WithErrorExample;
678
682
  '**Important:** `hasError={true}` sets `aria-invalid="true"` on the native `<input>` — this is',
679
683
  'ARIA-only and makes zero visual difference to the indicator circle.',
680
684
  'There are no CSS rules in the design system that change the indicator\'s appearance based on `aria-invalid`.',
681
- 'To communicate the error visually, you must render your own error message below the group (shown here',
682
- 'with `role="alert"` so screen readers announce it automatically).',
685
+ 'To communicate the error visually, render your own message below the group using `FormField`\'s',
686
+ 'canonical error markup a `.ds-form-field__message` wrapper with a `.ds-form-field__message--error`',
687
+ 'span containing a `triangle-alert` `Icon` and the error text (with `role="alert"` so screen readers',
688
+ 'announce it automatically). Reusing this markup keeps radio errors visually consistent with',
689
+ 'text/number/select fields wrapped in `FormField`.',
683
690
  'Error validation should always be at the field level, not per-option.',
684
691
  ].join(' '),
685
692
  );
@@ -938,15 +945,16 @@ export const RadioGroupWithError: Story = withDescription(
938
945
  language: 'tsx',
939
946
  code: `
940
947
  import { useState } from 'react';
941
- import { RadioButtonGroup } from '@arbor-education/design-system.components';
948
+ import { Icon, RadioButtonGroup } from '@arbor-education/design-system.components';
942
949
 
943
950
  function NotificationMethodWithErrorExample() {
944
951
  const [method, setMethod] = useState('');
945
952
 
946
- // hasError in each option sets aria-invalid="true" on each <input>.
947
- // This makes ZERO visual difference to the indicator circles there are
948
- // no CSS rules for the aria-invalid error state. The visible error message
949
- // below is the only thing that communicates the error to sighted users.
953
+ // RadioButtonGroup has no per-option hasError API its option type is
954
+ // { id, value, label } only. Communicate validation at the field level by
955
+ // rendering an error message below the group, matching FormField's canonical
956
+ // markup (.ds-form-field__message--error + triangle-alert Icon) so the look
957
+ // is consistent with the rest of the design system.
950
958
  return (
951
959
  <div>
952
960
  <RadioButtonGroup
@@ -955,15 +963,17 @@ function NotificationMethodWithErrorExample() {
955
963
  checkedValue={method}
956
964
  onChange={(e) => setMethod(e.target.value)}
957
965
  options={[
958
- { id: 'opt-email', value: 'email', label: 'Email', hasError: true },
959
- { id: 'opt-sms', value: 'sms', label: 'SMS', hasError: true },
960
- { id: 'opt-post', value: 'post', label: 'Post', hasError: true },
966
+ { id: 'opt-email', value: 'email', label: 'Email' },
967
+ { id: 'opt-sms', value: 'sms', label: 'SMS' },
968
+ { id: 'opt-post', value: 'post', label: 'Post' },
961
969
  ]}
962
970
  />
963
- {/* Consumer-rendered error message — hasError alone shows nothing visually */}
964
- <p role="alert" style={{ color: 'var(--form-field-text-error-color-error-text)' }}>
965
- Please select a notification method to continue.
966
- </p>
971
+ <div className="ds-form-field__message">
972
+ <span className="ds-form-field__message--error" role="alert">
973
+ <Icon size={12} name="triangle-alert" />
974
+ Please select a notification method to continue.
975
+ </span>
976
+ </div>
967
977
  </div>
968
978
  );
969
979
  }
@@ -975,13 +985,15 @@ export default NotificationMethodWithErrorExample;
975
985
  },
976
986
  },
977
987
  [
978
- '**Field-level validation** error state is shown at the group level, not per option.',
979
- '`hasError` is passed to each option in the `options` array, which sets `aria-invalid="true"`',
980
- 'on each native `<input>`. Screen readers will announce each option as invalid.',
981
- '**However, `hasError` makes ZERO visual change to the indicator circles** — there are no CSS rules',
982
- 'for the error state. The visible error message rendered below the group (with `role="alert"`) is',
983
- 'the only thing that communicates the error to sighted users.',
984
- 'Start with no option selected and note how the error message is present — select any option to',
985
- 'resolve the validation in a real implementation.',
988
+ '**Field-level validation.** `RadioButtonGroup`\'s option type is `{ id, value, label }` only ',
989
+ 'there is no per-option `hasError` and no group-level error prop.',
990
+ 'To communicate an error, render your own message below the group using the same canonical markup',
991
+ '`FormField` produces: a `.ds-form-field__message` wrapper containing a `.ds-form-field__message--error`',
992
+ 'span with a `triangle-alert` `Icon` and the error text. This keeps radio errors visually consistent',
993
+ 'with text/number/select fields wrapped in `FormField`.',
994
+ 'Note: `FormField` itself does not currently support `inputType="radio"`, so this hand-rolled',
995
+ 'pattern is the recommended approach.',
996
+ 'Start with no option selected — the error message is present; select any option to resolve the',
997
+ 'validation in a real implementation.',
986
998
  ].join(' '),
987
999
  );