@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
@@ -1,63 +1,422 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Controls,
4
+ Heading as DocHeading,
5
+ Markdown,
6
+ Primary as DocPrimary,
7
+ Stories,
8
+ Subtitle,
9
+ Title,
10
+ } from '@storybook/addon-docs/blocks';
11
+
2
12
  import { SingleUser } from './SingleUser';
3
13
 
14
+ // ---------------------------------------------------------------------------
15
+ // Content strings for the custom DocsPage
16
+ // ---------------------------------------------------------------------------
17
+
18
+ const DESCRIPTION_INTRO = [
19
+ '`SingleUser` renders a user identity pill — an avatar paired with a visible name label.',
20
+ 'The avatar is always decorative (`aria-hidden="true"`) so the `label` prop is the sole accessible name for the element.',
21
+ 'The component is built on top of the [`Avatar`](?path=/docs/components-avatar--docs) component and inherits its `src` and `initials` props.',
22
+ ].join(' ');
23
+
24
+ const PROPS_INTRO
25
+ = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
26
+
27
+ const USAGE_GUIDANCE = [
28
+ '### When to use',
29
+ '',
30
+ '- Displaying a named user inline — in a table cell, a row label, a card header, or a list of assignees.',
31
+ '- Anywhere a bare avatar would lack context — the label removes ambiguity about who the avatar represents.',
32
+ '- As a compact, non-interactive identity chip (e.g. "Assigned to · Sarah Okafor").',
33
+ '',
34
+ '---',
35
+ '',
36
+ '### When NOT to use',
37
+ '',
38
+ '| Situation | Use instead |',
39
+ '|---|---|',
40
+ '| Multiple users side by side | [`AvatarGroup`](?path=/docs/components-avatargroup--docs) |',
41
+ '| Avatar without a text label | [`Avatar`](?path=/docs/components-avatar--docs) directly |',
42
+ '| Clickable user link | Wrap `SingleUser` in an anchor or use a `Row` with `onClick` |',
43
+ '| User selection | A dropdown or autocomplete input |',
44
+ ].join('\n');
45
+
46
+ const DEVELOPER_NOTES = [
47
+ '### Avatar is always decorative',
48
+ '',
49
+ 'The inner `Avatar` is always rendered with `aria-hidden="true"` and `alt=""`. This means:',
50
+ '',
51
+ "- The `label` prop is the **only** accessible name — ensure it contains the user's full name.",
52
+ '- Screen readers announce the label text only; they will not announce initials or image alt text.',
53
+ '- You **cannot** override this behaviour via props — it is intentional design.',
54
+ '',
55
+ '---',
56
+ '',
57
+ '### Two className props',
58
+ '',
59
+ '`SingleUser` accepts two distinct `className` props:',
60
+ '',
61
+ '| Prop | Target element | Use case |',
62
+ '|---|---|---|',
63
+ '| `className` | Root `<span>` | Outer layout, margins, flex order |',
64
+ '| `avatarClassName` | Inner `<Avatar>` | Avatar-specific overrides |',
65
+ '',
66
+ '---',
67
+ '',
68
+ '### Default size is `"small"`',
69
+ '',
70
+ '> **Important:** `SingleUser` defaults to `size="small"`, not `"medium"` (which is `Avatar`\'s own default).',
71
+ '> Always pass `size` explicitly when a specific size is required.',
72
+ '',
73
+ '---',
74
+ '',
75
+ '### forwardRef',
76
+ '',
77
+ '`SingleUser` uses `React.forwardRef` and exposes a ref to the root `<span>` element.',
78
+ '',
79
+ '---',
80
+ '',
81
+ '### TypeScript types',
82
+ '',
83
+ '```ts',
84
+ "import { SingleUser } from '@arbor-education/design-system.components';",
85
+ "import type { SingleUserProps } from '@arbor-education/design-system.components';",
86
+ '',
87
+ 'type SingleUserProps = {',
88
+ ' label: string; // required — also the only accessible name',
89
+ ' className?: string; // applied to the root <span>',
90
+ ' avatarClassName?: string; // applied to the inner <Avatar>',
91
+ " size?: 'small' | 'medium' | 'large' | 'extra-large'; // default: 'small'",
92
+ ' src?: string; // avatar image URL',
93
+ ' initials?: string; // shown when src is absent or fails to load',
94
+ ' // ...plus remaining AvatarProps (excluding className, alt, size)',
95
+ '};',
96
+ '```',
97
+ ].join('\n');
98
+
99
+ const RELATED_COMPONENTS = [
100
+ '## Related components',
101
+ '',
102
+ '[Avatar](?path=/docs/components-avatar--docs) · [AvatarGroup](?path=/docs/components-avatargroup--docs) · [Row](?path=/docs/components-row--docs)',
103
+ ].join('\n');
104
+
105
+ // ---------------------------------------------------------------------------
106
+ // Custom DocsPage
107
+ // ---------------------------------------------------------------------------
108
+
109
+ function SingleUserDocsPage() {
110
+ return (
111
+ <>
112
+ <Title />
113
+ <Subtitle />
114
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
115
+ <DocHeading>Interactive example</DocHeading>
116
+ <Markdown>{PROPS_INTRO}</Markdown>
117
+ <DocPrimary />
118
+ <Controls />
119
+ <DocHeading>Usage guidance</DocHeading>
120
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
121
+ <DocHeading>Developer notes</DocHeading>
122
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
123
+ <DocHeading>Examples</DocHeading>
124
+ <Stories title="" />
125
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
126
+ </>
127
+ );
128
+ }
129
+
130
+ // ---------------------------------------------------------------------------
131
+ // Meta
132
+ // ---------------------------------------------------------------------------
133
+
4
134
  const meta: Meta<typeof SingleUser> = {
5
135
  title: 'Components/SingleUser',
6
136
  component: SingleUser,
7
137
  tags: ['autodocs'],
138
+ parameters: {
139
+ layout: 'padded',
140
+ docs: {
141
+ page: SingleUserDocsPage,
142
+ },
143
+ },
144
+ argTypes: {
145
+ label: {
146
+ description: [
147
+ 'The visible name label rendered alongside the avatar.',
148
+ 'This is also the **only** accessible name — the inner avatar is always `aria-hidden`.',
149
+ "Always pass the user's full name.",
150
+ ].join(' '),
151
+ control: 'text',
152
+ table: {
153
+ type: { summary: 'string' },
154
+ defaultValue: { summary: 'undefined' },
155
+ },
156
+ },
157
+ size: {
158
+ description: [
159
+ 'Controls the size of the inner avatar.',
160
+ "Defaults to `\"small\"` — note this differs from `Avatar`'s own default of `\"medium\"`.",
161
+ ].join(' '),
162
+ control: 'select',
163
+ options: ['small', 'medium', 'large', 'extra-large'],
164
+ table: {
165
+ type: { summary: "'small' | 'medium' | 'large' | 'extra-large'" },
166
+ defaultValue: { summary: "'small'" },
167
+ },
168
+ },
169
+ src: {
170
+ description: [
171
+ 'URL of the avatar image.',
172
+ 'When absent or broken, `initials` are used as a fallback.',
173
+ ].join(' '),
174
+ control: 'text',
175
+ table: {
176
+ type: { summary: 'string' },
177
+ defaultValue: { summary: 'undefined' },
178
+ },
179
+ },
180
+ initials: {
181
+ description:
182
+ 'One or two initials shown inside the avatar when no `src` is provided or when the image fails to load.',
183
+ control: 'text',
184
+ table: {
185
+ type: { summary: 'string' },
186
+ defaultValue: { summary: 'undefined' },
187
+ },
188
+ },
189
+ className: {
190
+ description: [
191
+ 'Additional CSS class names applied to the **root** `<span>` wrapper.',
192
+ 'Use `avatarClassName` to target the inner avatar specifically.',
193
+ ].join(' '),
194
+ control: 'text',
195
+ table: {
196
+ type: { summary: 'string' },
197
+ defaultValue: { summary: 'undefined' },
198
+ },
199
+ },
200
+ avatarClassName: {
201
+ description: [
202
+ 'Additional CSS class names applied only to the **inner** `<Avatar>` element.',
203
+ 'Useful for avatar-specific overrides without affecting the root layout.',
204
+ ].join(' '),
205
+ control: 'text',
206
+ table: {
207
+ type: { summary: 'string' },
208
+ defaultValue: { summary: 'undefined' },
209
+ },
210
+ },
211
+ },
8
212
  };
9
213
 
10
214
  export default meta;
11
-
12
215
  type Story = StoryObj<typeof SingleUser>;
13
216
 
217
+ // ---------------------------------------------------------------------------
218
+ // Helper
219
+ // ---------------------------------------------------------------------------
220
+
14
221
  const withDescription = (story: Story, description: string): Story => ({
15
222
  ...story,
16
223
  parameters: {
17
224
  ...story.parameters,
18
- docs: {
19
- ...story.parameters?.docs,
20
- description: {
21
- story: description,
22
- },
23
- },
225
+ docs: { ...story.parameters?.docs, description: { story: description } },
24
226
  },
25
227
  });
26
228
 
27
- const sampleSrc = 'https://i.pravatar.cc/150?img=12';
229
+ // ---------------------------------------------------------------------------
230
+ // Stories
231
+ // ---------------------------------------------------------------------------
28
232
 
29
- export const WithImage: Story = withDescription({
30
- args: {
31
- label: 'Jordan Matthews',
32
- src: sampleSrc,
233
+ export const Default: Story = withDescription(
234
+ {
235
+ args: {
236
+ label: 'Sarah Okafor',
237
+ initials: 'SO',
238
+ size: 'small',
239
+ },
240
+ render: args => <SingleUser {...args} />,
33
241
  },
34
- }, 'Displays `SingleUser` with an avatar image and the default small layout.');
242
+ 'The default story is wired to the Controls panel. Adjust `label`, `initials`, `src`, and `size` to see the component update in real time.',
243
+ );
244
+
245
+ export const WithPhoto: Story = withDescription(
246
+ {
247
+ parameters: {
248
+ controls: { disable: true },
249
+ docs: {
250
+ source: {
251
+ language: 'tsx',
252
+ code: `
253
+ import { SingleUser } from '@arbor-education/design-system.components';
35
254
 
36
- export const WithInitials: Story = withDescription({
37
- args: {
38
- label: 'Riley Chen',
39
- initials: 'RC',
255
+ function TeacherIdentity() {
256
+ return (
257
+ <SingleUser
258
+ label="Miss Clara Jones"
259
+ src="https://i.pravatar.cc/150?img=47"
260
+ size="medium"
261
+ />
262
+ );
263
+ }
264
+ export default TeacherIdentity;
265
+ `.trim(),
266
+ },
267
+ },
268
+ },
269
+ render: () => (
270
+ <SingleUser
271
+ label="Miss Clara Jones"
272
+ src="https://i.pravatar.cc/150?img=47"
273
+ size="medium"
274
+ />
275
+ ),
40
276
  },
41
- }, 'Uses initials when no image source is provided.');
277
+ 'When a `src` URL is provided the avatar displays the photo. If the image fails to load, the component falls back to `initials` if supplied. The avatar is still `aria-hidden` regardless — `label` remains the only accessible name.',
278
+ );
279
+
280
+ export const AllSizes: Story = withDescription(
281
+ {
282
+ parameters: {
283
+ controls: { disable: true },
284
+ docs: {
285
+ source: {
286
+ language: 'tsx',
287
+ code: `
288
+ import { SingleUser } from '@arbor-education/design-system.components';
42
289
 
43
- export const Placeholder: Story = withDescription({
44
- args: {
45
- label: 'Invited user',
290
+ function SizeShowcase() {
291
+ return (
292
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-medium)' }}>
293
+ <SingleUser label="James Okafor" initials="JO" size="small" />
294
+ <SingleUser label="James Okafor" initials="JO" size="medium" />
295
+ <SingleUser label="James Okafor" initials="JO" size="large" />
296
+ <SingleUser label="James Okafor" initials="JO" size="extra-large" />
297
+ </div>
298
+ );
299
+ }
300
+ export default SizeShowcase;
301
+ `.trim(),
302
+ },
303
+ },
304
+ },
305
+ render: () => (
306
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-medium)' }}>
307
+ <SingleUser label="James Okafor" initials="JO" size="small" />
308
+ <SingleUser label="James Okafor" initials="JO" size="medium" />
309
+ <SingleUser label="James Okafor" initials="JO" size="large" />
310
+ <SingleUser label="James Okafor" initials="JO" size="extra-large" />
311
+ </div>
312
+ ),
313
+ },
314
+ "All four supported sizes. `\"small\"` is the **default** — which differs from the underlying `Avatar` component's own default of `\"medium\"`. Always pass `size` explicitly when a specific size is required.",
315
+ );
316
+
317
+ export const InitialsFallback: Story = withDescription(
318
+ {
319
+ parameters: {
320
+ controls: { disable: true },
321
+ docs: {
322
+ source: {
323
+ language: 'tsx',
324
+ code: `
325
+ import { SingleUser } from '@arbor-education/design-system.components';
326
+
327
+ function StaffList() {
328
+ return (
329
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
330
+ <SingleUser label="Dorothy Zbornak" initials="DZ" />
331
+ <SingleUser label="Rose Nylund" initials="RN" />
332
+ <SingleUser label="Blanche Devereaux" initials="BD" />
333
+ <SingleUser label="Sophia Petrillo" initials="SP" />
334
+ </div>
335
+ );
336
+ }
337
+ export default StaffList;
338
+ `.trim(),
339
+ },
340
+ },
341
+ },
342
+ render: () => (
343
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
344
+ <SingleUser label="Dorothy Zbornak" initials="DZ" />
345
+ <SingleUser label="Rose Nylund" initials="RN" />
346
+ <SingleUser label="Blanche Devereaux" initials="BD" />
347
+ <SingleUser label="Sophia Petrillo" initials="SP" />
348
+ </div>
349
+ ),
46
350
  },
47
- }, 'Shows the placeholder avatar treatment when neither image nor initials are supplied.');
351
+ 'When no `src` is provided, the avatar falls back to `initials`. One or two characters are recommended for legibility across all sizes.',
352
+ );
48
353
 
49
- export const MediumAvatar: Story = withDescription({
50
- name: 'Size override (medium)',
51
- args: {
52
- label: 'Taylor Brooks',
53
- initials: 'TB',
54
- size: 'medium',
354
+ export const TwoClassNameProps: Story = withDescription(
355
+ {
356
+ parameters: {
357
+ controls: { disable: true },
358
+ docs: {
359
+ source: {
360
+ language: 'tsx',
361
+ code: `
362
+ import { SingleUser } from '@arbor-education/design-system.components';
363
+
364
+ function AssignedUser() {
365
+ return (
366
+ <SingleUser
367
+ label="Amara Osei-Bonsu"
368
+ initials="AO"
369
+ className="my-root-override"
370
+ avatarClassName="my-avatar-override"
371
+ />
372
+ );
373
+ }
374
+ export default AssignedUser;
375
+ `.trim(),
376
+ },
377
+ },
378
+ },
379
+ render: () => (
380
+ <SingleUser
381
+ label="Amara Osei-Bonsu"
382
+ initials="AO"
383
+ className="my-root-override"
384
+ avatarClassName="my-avatar-override"
385
+ />
386
+ ),
55
387
  },
56
- }, 'Demonstrates overriding the default avatar size within the SingleUser pill.');
388
+ '`SingleUser` exposes two separate `className` props: `className` targets the **root `<span>`** and `avatarClassName` targets only the **inner `<Avatar>`**. Use them independently to avoid unintended style bleed.',
389
+ );
57
390
 
58
- export const LongLabel: Story = withDescription({
59
- args: {
60
- label: 'Dr. Alexandrina Constantinopolous-Worthington',
61
- initials: 'AC',
391
+ export const LongLabel: Story = withDescription(
392
+ {
393
+ parameters: {
394
+ controls: { disable: true },
395
+ docs: {
396
+ source: {
397
+ language: 'tsx',
398
+ code: `
399
+ import { SingleUser } from '@arbor-education/design-system.components';
400
+
401
+ function LongNameExample() {
402
+ return (
403
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
404
+ <SingleUser label="Mrs Jacqueline Abernathy-Thornton" initials="JA" />
405
+ <SingleUser label="Mr Bartholomew Featherington-Smythe" initials="BF" size="medium" />
406
+ </div>
407
+ );
408
+ }
409
+ export default LongNameExample;
410
+ `.trim(),
411
+ },
412
+ },
413
+ },
414
+ render: () => (
415
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
416
+ <SingleUser label="Mrs Jacqueline Abernathy-Thornton" initials="JA" />
417
+ <SingleUser label="Mr Bartholomew Featherington-Smythe" initials="BF" size="medium" />
418
+ </div>
419
+ ),
62
420
  },
63
- }, 'Exercises the component with a longer label so text wrapping and spacing can be reviewed.');
421
+ 'Long display names flow naturally the label has no enforced max-width and extends the pill as needed. Apply a width constraint via `className` if truncation is required.',
422
+ );