@arbor-education/design-system.components 0.15.0 → 0.16.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 (304) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +23 -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 +3 -0
  131. package/dist/components/table/Table.stories.d.ts.map +1 -1
  132. package/dist/components/table/Table.stories.js +384 -5
  133. package/dist/components/table/Table.stories.js.map +1 -1
  134. package/dist/components/table/Table.test.js +30 -0
  135. package/dist/components/table/Table.test.js.map +1 -1
  136. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  137. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  138. package/dist/components/table/TableFooter.stories.js +137 -0
  139. package/dist/components/table/TableFooter.stories.js.map +1 -0
  140. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  141. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  142. package/dist/components/table/TableHeader.stories.js +176 -0
  143. package/dist/components/table/TableHeader.stories.js.map +1 -0
  144. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  145. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  146. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  147. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  148. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  149. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  150. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  151. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  152. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  153. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  154. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  155. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  156. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  157. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  158. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  159. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  160. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  161. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  162. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  163. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  164. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  165. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  166. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  167. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  168. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  169. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  170. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  171. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  172. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  173. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  174. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  175. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  176. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  177. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  178. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  179. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  180. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  181. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  182. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  183. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  184. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  185. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  186. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  187. package/dist/components/table/tableControls/HideColumnsDropdown.d.ts.map +1 -1
  188. package/dist/components/table/tableControls/HideColumnsDropdown.js +9 -3
  189. package/dist/components/table/tableControls/HideColumnsDropdown.js.map +1 -1
  190. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  191. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  192. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  193. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  194. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  195. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  196. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  197. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  198. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  199. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  200. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  201. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  202. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  203. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  204. package/dist/components/tabs/Tabs.stories.js +398 -22
  205. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  206. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  207. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  208. package/dist/components/tabs/TabsItem.stories.js +61 -9
  209. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  210. package/dist/components/toast/Toast.stories.d.ts +103 -10
  211. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  212. package/dist/components/toast/Toast.stories.js +409 -47
  213. package/dist/components/toast/Toast.stories.js.map +1 -1
  214. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  215. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  216. package/dist/components/toggle/Toggle.stories.js +311 -122
  217. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  218. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  219. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  220. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  221. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  222. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  223. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  224. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  225. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  226. package/dist/index.css +8 -0
  227. package/dist/index.css.map +1 -1
  228. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  229. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  230. package/dist/utils/PopupParentContext.stories.js +266 -0
  231. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  232. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  233. package/dist/utils/getDefaultPopupParent.js +6 -0
  234. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  235. package/package.json +1 -1
  236. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  237. package/src/components/avatar/Avatar.stories.tsx +504 -59
  238. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  239. package/src/components/banner/Banner.stories.tsx +7 -3
  240. package/src/components/card/Card.stories.tsx +466 -36
  241. package/src/components/combobox/Combobox.stories.tsx +867 -260
  242. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  243. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  244. package/src/components/editableText/EditableText.stories.tsx +567 -91
  245. package/src/components/formField/FormField.test.tsx +6 -0
  246. package/src/components/formField/FormField.tsx +5 -0
  247. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  248. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  249. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  250. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  251. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  252. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  253. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  254. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  255. package/src/components/formField/label/Label.stories.tsx +317 -8
  256. package/src/components/icoText/IcoText.stories.tsx +442 -31
  257. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  258. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  259. package/src/components/modal/Modal.stories.tsx +963 -26
  260. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  261. package/src/components/pill/Pill.stories.tsx +11 -13
  262. package/src/components/pill/Pill.tsx +1 -0
  263. package/src/components/row/Row.stories.tsx +474 -58
  264. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  265. package/src/components/section/Section.stories.tsx +723 -70
  266. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  267. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  268. package/src/components/table/DSDefaultColDef.ts +25 -5
  269. package/src/components/table/Table.stories.tsx +460 -5
  270. package/src/components/table/Table.test.tsx +53 -0
  271. package/src/components/table/Table.tsx +9 -2
  272. package/src/components/table/TableFooter.stories.tsx +196 -0
  273. package/src/components/table/TableHeader.stories.tsx +251 -0
  274. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  275. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  276. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  277. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  278. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  279. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  280. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  281. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  282. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  283. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  284. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  285. package/src/components/table/tableControls/HideColumnsDropdown.tsx +11 -2
  286. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  287. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  288. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  289. package/src/components/tabs/Tabs.stories.tsx +540 -60
  290. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  291. package/src/components/toast/Toast.stories.tsx +539 -77
  292. package/src/components/toggle/Toggle.stories.tsx +371 -135
  293. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  294. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  295. package/src/docs/Contributing.mdx +241 -0
  296. package/src/docs/UsingComponents.mdx +93 -0
  297. package/src/docs/Welcome.mdx +68 -0
  298. package/src/global.scss +7 -0
  299. package/src/utils/PopupParentContext.stories.tsx +367 -0
  300. package/src/utils/getDefaultPopupParent.ts +6 -0
  301. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  302. package/.ralph/storybook-upgrade/prd.json +0 -777
  303. package/.ralph/storybook-upgrade/progress.md +0 -342
  304. package/src/components/table/TableWIP.mdx +0 -3
@@ -2,7 +2,7 @@ import { Fieldset, type FieldsetProps } from 'Components/formField/fieldset/Fiel
2
2
  import { CheckboxInput, type CheckboxInputProps } from './CheckboxInput';
3
3
 
4
4
  export type CheckboxGroupProps = {
5
- options: CheckboxInputProps[];
5
+ options: (CheckboxInputProps & { id: string })[];
6
6
  } & FieldsetProps;
7
7
 
8
8
  export const CheckboxGroup = (props: CheckboxGroupProps) => {
@@ -1,6 +1,6 @@
1
1
  import classNames from 'classnames';
2
2
  import { useRef, useEffect, type InputHTMLAttributes } from 'react';
3
- import { Icon } from '../../../..';
3
+ import { Icon } from 'Components/icon/Icon';
4
4
 
5
5
  export type CheckboxInputProps = {
6
6
  indeterminate?: boolean;
@@ -1,29 +1,522 @@
1
+ import { useState } from 'react';
1
2
  import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import {
4
+ Controls,
5
+ Heading as DocHeading,
6
+ Markdown,
7
+ Primary as DocPrimary,
8
+ Stories,
9
+ Subtitle,
10
+ Title,
11
+ } from '@storybook/addon-docs/blocks';
12
+ import type { ColorResult } from '@uiw/color-convert';
13
+ import { FormField } from 'Components/formField/FormField';
2
14
  import { ColourPickerDropdown } from './ColourPickerDropdown';
3
- import type { ColorResult } from '@uiw/react-color';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Docs page content
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const DESCRIPTION_INTRO = [
21
+ 'ColourPickerDropdown is a dropdown-triggered colour picker that lets users select any colour from a',
22
+ 'full-spectrum palette, with Hex and RGB input fields for precise entry.',
23
+ 'Built on the [`@uiw/react-color` Sketch picker](https://uiwjs.github.io/react-color/), which provides',
24
+ 'the colour plane, hue slider, Hex/RGB inputs, and preset swatches.',
25
+ 'The dropdown panel renders via a Radix UI portal —',
26
+ '**do not place inside a container with `overflow: hidden`**.',
27
+ '',
28
+ 'The trigger renders as a small circular colour swatch inside a dropdown-variant button.',
29
+ 'Selection applies immediately — the swatch updates live as the user picks.',
30
+ 'The panel closes on click outside or `Escape`.',
31
+ ].join('\n');
32
+
33
+ const USAGE_GUIDANCE = [
34
+ '### When to use',
35
+ '',
36
+ '- Data-driven formatting where users assign a colour to a record — for example, background colours for conditional formatting bands in a marksheet.',
37
+ '- When users need to match a specific colour exactly by Hex or RGB value.',
38
+ '- When freedom of colour choice is appropriate and available colours are not predefined.',
39
+ '',
40
+ '---',
41
+ '',
42
+ '### When NOT to use',
43
+ '',
44
+ '| Situation | Use instead |',
45
+ '|---|---|',
46
+ '| Status choices ("On track / At risk / Off track") | `SelectDropdown` with named labels — colour alone is not sufficient to communicate status |',
47
+ '| Small fixed set of meaningful colours | `SelectDropdown` with colour swatches as option labels |',
48
+ '| Colour could reduce readability (e.g. text colour without contrast checks) | Constrain choices via `SelectDropdown` with an approved palette |',
49
+ ].join('\n');
50
+
51
+ const DEVELOPER_NOTES = [
52
+ '### Critical usage patterns',
53
+ '',
54
+ '**`onChange` receives a `ColorResult` object, not a plain hex string.** Read the format you need:',
55
+ '',
56
+ '```tsx',
57
+ "import type { ColorResult } from '@uiw/color-convert';",
58
+ '',
59
+ '<ColourPickerDropdown',
60
+ ' value={colour}',
61
+ ' onChange={(result: ColorResult) => {',
62
+ " const hex = result.hex; // '#3cad51'",
63
+ ' const { r, g, b } = result.rgb; // { r: 60, g: 173, b: 81 }',
64
+ ' setColour(hex);',
65
+ ' }}',
66
+ '/>',
67
+ '```',
68
+ '',
69
+ '**`id` is dual-purpose** — it sets the `name` on the hidden `<input>` (for native form submission) AND',
70
+ 'the `id` on the trigger button (for label association via `htmlFor`).',
71
+ '',
72
+ '**`hasError` is visual-only.** It changes the trigger button\'s border colour but tells screen readers',
73
+ 'nothing. Always pair it with `aria-invalid={true}`.',
74
+ '',
75
+ '**No alpha / transparency support** — `disableAlpha` is hardcoded. The picker never shows an opacity slider.',
76
+ '',
77
+ '**Semi-controlled pattern** — the component holds internal state via `useState`, but syncs from the',
78
+ '`value` prop via `useEffect`. Changing `value` externally (e.g. a form reset) will update the picker.',
79
+ '',
80
+ '**`onChange` fires on every picker interaction**, including while sliders are dragged.',
81
+ 'If you update server state in `onChange`, consider debouncing.',
82
+ '',
83
+ '**Portal rendering** — the dropdown panel renders via a Radix UI portal outside the trigger\'s DOM subtree.',
84
+ 'Do not place inside `overflow: hidden` or `position: relative` containers.',
85
+ '',
86
+ '---',
87
+ '',
88
+ '### Accessibility',
89
+ '',
90
+ '- The trigger button includes a visually-hidden "Toggle colour picker." label for screen readers.',
91
+ '- The swatch inside the trigger includes a visually-hidden "current colour: #hex" label that updates live.',
92
+ '- Always pair `hasError` with `aria-invalid={true}` — one is visual, one is for assistive technology.',
93
+ '- Use `aria-describedBy` pointing to the `id` of a `FormField.Error` element to provide the error message.',
94
+ '- The recommended pattern is `<FormField inputType="colourPicker" inputProps={{...}} />` — this wires `hasError`, `aria-invalid`, and `aria-describedby` automatically.',
95
+ '',
96
+ '---',
97
+ '',
98
+ '### TypeScript types',
99
+ '',
100
+ '```tsx',
101
+ "import type { ColorResult } from '@uiw/color-convert';",
102
+ "import { ColourPickerDropdown } from '@arbor-education/design-system.components';",
103
+ '',
104
+ '// Access colour values in onChange:',
105
+ 'onChange={(result: ColorResult) => {',
106
+ " const hex = result.hex; // '#3cad51'",
107
+ ' const { r, g, b } = result.rgb; // { r: 60, g: 173, b: 81 }',
108
+ '}}',
109
+ '',
110
+ '// Type your own props using the exported namespace:',
111
+ 'function MyField(props: ColourPickerDropdown.Props) { ... }',
112
+ '```',
113
+ ].join('\n');
114
+
115
+ const RELATED_COMPONENTS = [
116
+ '## Related components',
117
+ '',
118
+ '[FormField](?path=/docs/components-formfield--docs) · [SelectDropdown](?path=/docs/components-formfield-inputs-selectdropdown--docs) · [Combobox](?path=/docs/components-combobox--docs)',
119
+ ].join('\n');
120
+
121
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
122
+
123
+ function ColourPickerDropdownDocsPage() {
124
+ return (
125
+ <>
126
+ <Title />
127
+ <Subtitle />
128
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
129
+ <DocHeading>Interactive example</DocHeading>
130
+ <Markdown>{PROPS_INTRO}</Markdown>
131
+ <DocPrimary />
132
+ <Controls />
133
+ <DocHeading>Usage guidance</DocHeading>
134
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
135
+ <DocHeading>Developer notes</DocHeading>
136
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
137
+ <DocHeading>Examples</DocHeading>
138
+ <Stories title="" />
139
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
140
+ </>
141
+ );
142
+ }
143
+
144
+ // ---------------------------------------------------------------------------
145
+ // Meta
146
+ // ---------------------------------------------------------------------------
4
147
 
5
148
  const meta = {
6
149
  title: 'Components/FormField/Inputs/ColourPickerDropdown',
7
150
  component: ColourPickerDropdown,
8
151
  tags: ['autodocs'],
152
+ parameters: {
153
+ layout: 'padded',
154
+ docs: {
155
+ page: ColourPickerDropdownDocsPage,
156
+ },
157
+ },
158
+ argTypes: {
159
+ 'value': {
160
+ description: [
161
+ 'The current colour value as a hex string (e.g. `\'#3cad51\'`).',
162
+ 'The component holds internal state but syncs from this prop via `useEffect` —',
163
+ 'changing it externally (e.g. a form reset) will update the picker.',
164
+ ].join(' '),
165
+ control: { type: 'color' },
166
+ table: {
167
+ type: { summary: 'string' },
168
+ defaultValue: { summary: "'#3cad51'" },
169
+ },
170
+ },
171
+ 'onChange': {
172
+ description: [
173
+ 'Callback fired on every colour change (including while sliders are dragged).',
174
+ 'Receives a `ColorResult` object — read `.hex`, `.rgb`, or `.hsl` off it.',
175
+ ].join(' '),
176
+ action: 'onChange',
177
+ control: false,
178
+ table: {
179
+ type: { summary: '(value: ColorResult) => void' },
180
+ },
181
+ },
182
+ 'hasError': {
183
+ description: [
184
+ 'Applies error styling (red border) to the trigger button.',
185
+ 'Visual only — always pair with `aria-invalid` for screen-reader coverage.',
186
+ ].join(' '),
187
+ control: 'boolean',
188
+ table: {
189
+ type: { summary: 'boolean' },
190
+ defaultValue: { summary: 'false' },
191
+ },
192
+ },
193
+ 'disabled': {
194
+ description: 'When true, the trigger is non-interactive and visually muted.',
195
+ control: 'boolean',
196
+ table: {
197
+ type: { summary: 'boolean' },
198
+ defaultValue: { summary: 'false' },
199
+ },
200
+ },
201
+ 'id': {
202
+ description: [
203
+ 'Dual-purpose: sets the `name` on the hidden `<input>` for native form submission AND',
204
+ 'the `id` on the trigger button for label association via `htmlFor`.',
205
+ ].join(' '),
206
+ control: 'text',
207
+ table: {
208
+ type: { summary: 'string' },
209
+ },
210
+ },
211
+ 'aria-describedBy': {
212
+ description: [
213
+ 'ID of the element describing this field (e.g. a `FormField.Error`).',
214
+ 'Note the capital B — the component maps this to the lowercase `aria-describedby` DOM attribute.',
215
+ ].join(' '),
216
+ control: 'text',
217
+ table: {
218
+ type: { summary: 'string' },
219
+ },
220
+ },
221
+ 'aria-invalid': {
222
+ description: 'Marks the trigger as invalid for screen readers. Use alongside `hasError` and `aria-describedBy`.',
223
+ control: 'boolean',
224
+ table: {
225
+ type: { summary: 'boolean' },
226
+ defaultValue: { summary: 'false' },
227
+ },
228
+ },
229
+ },
9
230
  } satisfies Meta<typeof ColourPickerDropdown>;
10
231
 
11
232
  export default meta;
12
- type Story = StoryObj<typeof meta>;
233
+ type Story = StoryObj<typeof ColourPickerDropdown>;
234
+
235
+ // ---------------------------------------------------------------------------
236
+ // Helper: attach a per-story description to docs
237
+ // ---------------------------------------------------------------------------
238
+
239
+ const withDescription = (story: Story, description: string): Story => ({
240
+ ...story,
241
+ parameters: {
242
+ ...story.parameters,
243
+ docs: {
244
+ ...story.parameters?.docs,
245
+ description: {
246
+ story: description,
247
+ },
248
+ },
249
+ },
250
+ });
251
+
252
+ // ---------------------------------------------------------------------------
253
+ // Template components for stateful and composite stories
254
+ // ---------------------------------------------------------------------------
255
+
256
+ const ControlledTemplate = () => {
257
+ const [colour, setColour] = useState('#3cad51');
258
+ return (
259
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '20rem' }}>
260
+ <ColourPickerDropdown
261
+ value={colour}
262
+ onChange={(result: ColorResult) => setColour(result.hex)}
263
+ id="controlled-colour"
264
+ />
265
+ <p style={{ margin: 0, fontSize: '0.875rem', color: 'var(--color-grey-600)' }}>
266
+ Selected colour:
267
+ {' '}
268
+ <code>{colour}</code>
269
+ </p>
270
+ </div>
271
+ );
272
+ };
273
+
274
+ const InFormFieldTemplate = () => (
275
+ <div style={{ maxWidth: '20rem' }}>
276
+ <FormField
277
+ label="Category colour"
278
+ id="category-colour"
279
+ inputType="colourPicker"
280
+ inputProps={{ value: '#3cad51' }}
281
+ />
282
+ </div>
283
+ );
284
+
285
+ const WithFormFieldAndErrorTemplate = () => (
286
+ <div style={{ maxWidth: '20rem' }}>
287
+ <FormField
288
+ label="Background colour"
289
+ id="background-colour"
290
+ inputType="colourPicker"
291
+ errorText="Please choose a background colour."
292
+ inputProps={{ value: '#3cad51' }}
293
+ />
294
+ </div>
295
+ );
296
+
297
+ // ---------------------------------------------------------------------------
298
+ // Stories
299
+ // ---------------------------------------------------------------------------
13
300
 
14
301
  export const Default: Story = {
15
302
  args: {
16
303
  value: '#3cad51',
17
- onChange: (value: ColorResult) => { console.log(value); },
18
304
  },
19
- argTypes: {
20
- value: {
21
- control: 'color',
22
- description: 'The colour to display in the preview',
305
+ render: args => (
306
+ <div style={{ maxWidth: '20rem' }}>
307
+ <ColourPickerDropdown {...args} />
308
+ </div>
309
+ ),
310
+ };
311
+
312
+ export const WithCustomValue: Story = withDescription(
313
+ {
314
+ parameters: {
315
+ controls: { disable: true },
316
+ docs: {
317
+ source: {
318
+ language: 'tsx',
319
+ code: `
320
+ import { ColourPickerDropdown } from '@arbor-education/design-system.components';
321
+
322
+ function WithCustomValueExample() {
323
+ return (
324
+ <div style={{ maxWidth: '20rem' }}>
325
+ <ColourPickerDropdown value="#e84393" id="highlight-colour" />
326
+ </div>
327
+ );
328
+ }
329
+
330
+ export default WithCustomValueExample;
331
+ `.trim(),
332
+ },
333
+ },
23
334
  },
24
- onChange: {
25
- action: 'changed',
26
- description: 'The function to call when the colour is changed',
335
+ render: () => (
336
+ <div style={{ maxWidth: '20rem' }}>
337
+ <ColourPickerDropdown value="#e84393" id="highlight-colour" />
338
+ </div>
339
+ ),
340
+ },
341
+ 'Pass any valid hex string to `value` to pre-seed the picker with a specific colour. The swatch in the trigger updates immediately.',
342
+ );
343
+
344
+ export const Disabled: Story = withDescription(
345
+ {
346
+ parameters: {
347
+ controls: { disable: true },
348
+ docs: {
349
+ source: {
350
+ language: 'tsx',
351
+ code: `
352
+ import { ColourPickerDropdown } from '@arbor-education/design-system.components';
353
+
354
+ function DisabledExample() {
355
+ return (
356
+ <div style={{ maxWidth: '20rem' }}>
357
+ <ColourPickerDropdown value="#3cad51" disabled id="disabled-colour" />
358
+ </div>
359
+ );
360
+ }
361
+
362
+ export default DisabledExample;
363
+ `.trim(),
364
+ },
365
+ },
27
366
  },
367
+ render: () => (
368
+ <div style={{ maxWidth: '20rem' }}>
369
+ <ColourPickerDropdown value="#3cad51" disabled id="disabled-colour" />
370
+ </div>
371
+ ),
28
372
  },
29
- };
373
+ 'When `disabled` is true the trigger is non-interactive and visually muted. The colour swatch is still visible so the current value remains clear.',
374
+ );
375
+
376
+ export const WithError: Story = withDescription(
377
+ {
378
+ parameters: {
379
+ controls: { disable: true },
380
+ docs: {
381
+ source: {
382
+ language: 'tsx',
383
+ code: `
384
+ import { ColourPickerDropdown } from '@arbor-education/design-system.components';
385
+
386
+ function WithErrorExample() {
387
+ return (
388
+ <div style={{ maxWidth: '20rem' }}>
389
+ <ColourPickerDropdown
390
+ value="#3cad51"
391
+ hasError
392
+ aria-invalid
393
+ id="colour-with-error"
394
+ />
395
+ </div>
396
+ );
397
+ }
398
+
399
+ export default WithErrorExample;
400
+ `.trim(),
401
+ },
402
+ },
403
+ },
404
+ render: () => (
405
+ <div style={{ maxWidth: '20rem' }}>
406
+ <ColourPickerDropdown
407
+ value="#3cad51"
408
+ hasError
409
+ aria-invalid
410
+ id="colour-with-error"
411
+ />
412
+ </div>
413
+ ),
414
+ },
415
+ 'Both `hasError` (red border on the trigger) and `aria-invalid` (screen-reader announcement) must be set together for a complete error treatment. Neither alone is sufficient.',
416
+ );
417
+
418
+ export const Controlled: Story = withDescription(
419
+ {
420
+ parameters: {
421
+ controls: { disable: true },
422
+ docs: {
423
+ source: {
424
+ language: 'tsx',
425
+ code: `
426
+ import { useState } from 'react';
427
+ import type { ColorResult } from '@uiw/color-convert';
428
+ import { ColourPickerDropdown } from '@arbor-education/design-system.components';
429
+
430
+ function ControlledExample() {
431
+ const [colour, setColour] = useState('#3cad51');
432
+
433
+ return (
434
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '20rem' }}>
435
+ <ColourPickerDropdown
436
+ value={colour}
437
+ onChange={(result: ColorResult) => setColour(result.hex)}
438
+ id="controlled-colour"
439
+ />
440
+ <p style={{ margin: 0, fontSize: '0.875rem' }}>
441
+ Selected colour: <code>{colour}</code>
442
+ </p>
443
+ </div>
444
+ );
445
+ }
446
+
447
+ export default ControlledExample;
448
+ `.trim(),
449
+ },
450
+ },
451
+ },
452
+ render: () => <ControlledTemplate />,
453
+ },
454
+ '`onChange` receives a `ColorResult` object — read `.hex` off it to keep your own state in sync. The selected hex value is reflected live beneath the picker.',
455
+ );
456
+
457
+ export const InFormField: Story = withDescription(
458
+ {
459
+ parameters: {
460
+ controls: { disable: true },
461
+ docs: {
462
+ source: {
463
+ language: 'tsx',
464
+ code: `
465
+ import { FormField } from '@arbor-education/design-system.components';
466
+
467
+ function InFormFieldExample() {
468
+ return (
469
+ <div style={{ maxWidth: '20rem' }}>
470
+ <FormField
471
+ label="Category colour"
472
+ id="category-colour"
473
+ inputType="colourPicker"
474
+ inputProps={{ value: '#3cad51' }}
475
+ />
476
+ </div>
477
+ );
478
+ }
479
+
480
+ export default InFormFieldExample;
481
+ `.trim(),
482
+ },
483
+ },
484
+ },
485
+ render: () => <InFormFieldTemplate />,
486
+ },
487
+ 'The recommended usage pattern — `FormField` with `inputType="colourPicker"` auto-wires the label, `hasError`, `aria-invalid`, and `aria-describedby`. No manual prop threading required.',
488
+ );
489
+
490
+ export const WithFormFieldAndError: Story = withDescription(
491
+ {
492
+ parameters: {
493
+ controls: { disable: true },
494
+ docs: {
495
+ source: {
496
+ language: 'tsx',
497
+ code: `
498
+ import { FormField } from '@arbor-education/design-system.components';
499
+
500
+ function WithFormFieldAndErrorExample() {
501
+ return (
502
+ <div style={{ maxWidth: '20rem' }}>
503
+ <FormField
504
+ label="Background colour"
505
+ id="background-colour"
506
+ inputType="colourPicker"
507
+ errorText="Please choose a background colour."
508
+ inputProps={{ value: '#3cad51' }}
509
+ />
510
+ </div>
511
+ );
512
+ }
513
+
514
+ export default WithFormFieldAndErrorExample;
515
+ `.trim(),
516
+ },
517
+ },
518
+ },
519
+ render: () => <WithFormFieldAndErrorTemplate />,
520
+ },
521
+ 'The full error treatment via `FormField` — setting `errorText` automatically passes `hasError`, `aria-invalid`, and `aria-describedby` to the picker. No manual prop threading required.',
522
+ );
@@ -1,10 +1,16 @@
1
1
  import type { ChangeEvent } from 'react';
2
- import { RadioButtonInput, type RadioButtonInputProps } from './RadioButtonInput';
2
+ import { RadioButtonInput } from './RadioButtonInput';
3
3
  import { Fieldset, type FieldsetProps } from '../../fieldset/Fieldset';
4
4
 
5
+ export type RadioGroupOption = {
6
+ id: string;
7
+ value?: string | number | readonly string[];
8
+ label?: string;
9
+ };
10
+
5
11
  export type RadioButtonGroupProps = {
6
12
  name: string;
7
- options: RadioButtonInputProps[];
13
+ options: RadioGroupOption[];
8
14
  checkedValue: string;
9
15
  onChange: (event: ChangeEvent<HTMLInputElement>) => void;
10
16
  } & Omit<FieldsetProps, 'onChange'>;
@@ -14,8 +20,15 @@ export const RadioButtonGroup = (props: RadioButtonGroupProps) => {
14
20
 
15
21
  return (
16
22
  <Fieldset legend={legend} {...rest}>
17
- {options.map((option: RadioButtonInputProps) => (
18
- <RadioButtonInput key={option.id} name={name} value={option.value} label={option.label} checked={checkedValue === option.value} onChange={onChange} />
23
+ {options.map((option: RadioGroupOption) => (
24
+ <RadioButtonInput
25
+ key={option.id}
26
+ name={name}
27
+ value={option.value}
28
+ label={option.label}
29
+ checked={checkedValue === option.value}
30
+ onChange={onChange}
31
+ />
19
32
  ))}
20
33
  </Fieldset>
21
34
  );