@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,21 +1,189 @@
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';
2
12
  import { Tabs } from './Tabs';
3
13
 
14
+ // ---------------------------------------------------------------------------
15
+ // Docs page content
16
+ // ---------------------------------------------------------------------------
17
+
18
+ const DESCRIPTION_INTRO = [
19
+ '`Tabs` renders a tab strip — a `<ul role="tablist">` containing `Tabs.Item` elements.',
20
+ '`Tabs` is **purely presentational**: it does not manage which tab is active.',
21
+ 'You control the `active` state on each `Tabs.Item` and listen for clicks via `tabElementProps.onClick`.',
22
+ ].join(' ');
23
+
24
+ const USAGE_GUIDANCE = [
25
+ '### When to use',
26
+ '',
27
+ '- **Page-level navigation** — switching between major sections of a page (Overview, Details, Settings)',
28
+ '- **Content filtering** — toggling between views of the same data (e.g. List / Calendar / Map)',
29
+ '- **Step indicators** — showing progress through a multi-section form (read-only, non-interactive)',
30
+ '',
31
+ '---',
32
+ '',
33
+ '### When NOT to use',
34
+ '',
35
+ '| Situation | Use instead |',
36
+ '|---|---|',
37
+ '| More than ~7 tabs — the strip becomes hard to scan | Consider a sidebar nav or `Dropdown` |',
38
+ '| Showing/hiding content in an accordion pattern | [`Section`](?path=/docs/components-section--docs) with `collapsible` |',
39
+ ].join('\n');
40
+
41
+ const DEVELOPER_NOTES = [
42
+ '### Controlling active state',
43
+ '',
44
+ '`Tabs` does **not** manage active state. Wire it yourself:',
45
+ '',
46
+ '```tsx',
47
+ "import { Tabs } from '@arbor-education/design-system.components';",
48
+ "import { useState } from 'react';",
49
+ '',
50
+ 'function PupilTabs() {',
51
+ " const [active, setActive] = useState('overview');",
52
+ '',
53
+ ' return (',
54
+ ' <Tabs>',
55
+ " <Tabs.Item active={active === 'overview'} tabElementProps={{ onClick: () => setActive('overview') }}>",
56
+ ' Overview',
57
+ ' </Tabs.Item>',
58
+ " <Tabs.Item active={active === 'details'} tabElementProps={{ onClick: () => setActive('details') }}>",
59
+ ' Details',
60
+ ' </Tabs.Item>',
61
+ " <Tabs.Item active={active === 'assessment'} tabElementProps={{ onClick: () => setActive('assessment') }}>",
62
+ ' Assessment',
63
+ ' </Tabs.Item>',
64
+ ' </Tabs>',
65
+ ' );',
66
+ '}',
67
+ '```',
68
+ '',
69
+ '---',
70
+ '',
71
+ '### Link tabs (router navigation)',
72
+ '',
73
+ 'Use `tabElement="link"` when tabs navigate to different routes.',
74
+ 'The inner element renders as `<a>` — pass your href via `tabElementProps`:',
75
+ '',
76
+ '```tsx',
77
+ '<Tabs>',
78
+ ' <Tabs.Item tabElement="link" tabElementProps={{ href: "/pupils/overview" }} active>',
79
+ ' Overview',
80
+ ' </Tabs.Item>',
81
+ ' <Tabs.Item tabElement="link" tabElementProps={{ href: "/pupils/details" }}>',
82
+ ' Details',
83
+ ' </Tabs.Item>',
84
+ '</Tabs>',
85
+ '```',
86
+ '',
87
+ 'For React Router, wrap `TabsItem` in `<NavLink>` as the `tabElementProps` does not accept a',
88
+ '`component` override — use the `<Link>` component to wrap or pass `href` for standard anchors.',
89
+ '',
90
+ '---',
91
+ '',
92
+ '### Sub-component props',
93
+ '',
94
+ '#### `Tabs`',
95
+ '',
96
+ 'Accepts all `HTMLAttributes<HTMLUListElement>` plus `children`.',
97
+ '',
98
+ '| Prop | Type | Default | Description |',
99
+ '|---|---|---|---|',
100
+ '| `children` | `ReactNode` | — | `Tabs.Item` elements |',
101
+ '| `className` | `string` | — | Extra CSS class on the `<ul>` |',
102
+ '',
103
+ '#### `Tabs.Item`',
104
+ '',
105
+ '| Prop | Type | Default | Description |',
106
+ '|---|---|---|---|',
107
+ '| `active` | `boolean` | `false` | Marks this tab as selected — sets `aria-selected` and active styles |',
108
+ '| `tabElement` | `"button" \\| "link"` | `"button"` | Inner element type. `"button"` for JS-controlled tabs; `"link"` for anchor/router navigation |',
109
+ '| `tabElementProps` | `ButtonHTMLAttributes` or `AnchorHTMLAttributes` | — | Props forwarded to the inner `<button>` or `<a>`. Use `onClick` for state control; `href` for links |',
110
+ '| `iconName` | `keyof allowedIcons` | — | Optional icon rendered before the label text (16 px) |',
111
+ '| `children` | `ReactNode` | — | Tab label text |',
112
+ '| `className` | `string` | — | Extra CSS class on the `<li>` wrapper |',
113
+ '',
114
+ '---',
115
+ '',
116
+ '### Accessibility',
117
+ '',
118
+ '- `Tabs` renders `role="tablist"` on the `<ul>`',
119
+ '- Each `Tabs.Item` renders `role="presentation"` on the `<li>` and `role="tab"` + `aria-selected` on the inner element',
120
+ '- Arrow key navigation within the tab list is provided by the browser for `role="tab"` elements',
121
+ '- `Tabs`/`TabsItem` only render the **tab strip** — tab panel content is your responsibility.',
122
+ ' Associate each panel with its tab using `aria-controls` on the tab and `role="tabpanel"` + `aria-labelledby` on the panel',
123
+ ].join('\n');
124
+
125
+ const RELATED_COMPONENTS = [
126
+ '## Related components',
127
+ '',
128
+ '[Section](?path=/docs/components-section--docs) · [Dropdown](?path=/docs/components-dropdown--docs)',
129
+ ].join('\n');
130
+
131
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // Docs page
135
+ // ---------------------------------------------------------------------------
136
+
137
+ function TabsDocsPage() {
138
+ return (
139
+ <>
140
+ <Title />
141
+ <Subtitle />
142
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
143
+ <DocHeading>Interactive example</DocHeading>
144
+ <Markdown>{PROPS_INTRO}</Markdown>
145
+ <DocPrimary />
146
+ <Controls />
147
+ <DocHeading>Usage guidance</DocHeading>
148
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
149
+ <DocHeading>Developer notes</DocHeading>
150
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
151
+ <DocHeading>Examples</DocHeading>
152
+ <Stories title="" />
153
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
154
+ </>
155
+ );
156
+ }
157
+
158
+ // ---------------------------------------------------------------------------
159
+ // Meta
160
+ // ---------------------------------------------------------------------------
161
+
4
162
  const meta = {
5
163
  title: 'Components/Tabs',
6
164
  component: Tabs,
165
+ tags: ['autodocs'],
7
166
  parameters: {
8
167
  layout: 'padded',
168
+ docs: {
169
+ page: TabsDocsPage,
170
+ },
9
171
  },
10
- tags: ['autodocs'],
11
172
  argTypes: {
12
173
  children: {
13
174
  control: false,
14
- description: 'Tab items to display',
175
+ description: '`Tabs.Item` elements that make up the tab strip.',
176
+ table: {
177
+ type: { summary: 'ReactNode' },
178
+ },
15
179
  },
16
180
  className: {
17
181
  control: 'text',
18
- description: 'Additional CSS classes',
182
+ description: 'Extra CSS class applied to the `<ul>` element.',
183
+ table: {
184
+ type: { summary: 'string' },
185
+ defaultValue: { summary: 'undefined' },
186
+ },
19
187
  },
20
188
  },
21
189
  } satisfies Meta<typeof Tabs>;
@@ -23,70 +191,382 @@ const meta = {
23
191
  export default meta;
24
192
  type Story = StoryObj<typeof meta>;
25
193
 
26
- // Basic tabs with buttons
27
- export const Default: Story = {
28
- args: {
29
- children: (
30
- <>
31
- <Tabs.Item active>Overview</Tabs.Item>
32
- <Tabs.Item>Details</Tabs.Item>
33
- <Tabs.Item>Settings</Tabs.Item>
34
- </>
35
- ),
194
+ // ---------------------------------------------------------------------------
195
+ // Helper
196
+ // ---------------------------------------------------------------------------
197
+
198
+ const withDescription = (story: Omit<Story, 'args'>, description: string): Story => ({
199
+ ...(story as Story),
200
+ parameters: {
201
+ ...story.parameters,
202
+ docs: {
203
+ ...story.parameters?.docs,
204
+ description: {
205
+ story: description,
206
+ },
207
+ },
36
208
  },
209
+ });
210
+
211
+ // ---------------------------------------------------------------------------
212
+ // Templates
213
+ // ---------------------------------------------------------------------------
214
+
215
+ const DefaultTemplate = () => {
216
+ const [active, setActive] = useState('overview');
217
+ return (
218
+ <Tabs>
219
+ <Tabs.Item active={active === 'overview'} tabElementProps={{ onClick: () => setActive('overview') }}>
220
+ Overview
221
+ </Tabs.Item>
222
+ <Tabs.Item active={active === 'details'} tabElementProps={{ onClick: () => setActive('details') }}>
223
+ Details
224
+ </Tabs.Item>
225
+ <Tabs.Item active={active === 'assessment'} tabElementProps={{ onClick: () => setActive('assessment') }}>
226
+ Assessment
227
+ </Tabs.Item>
228
+ <Tabs.Item active={active === 'attendance'} tabElementProps={{ onClick: () => setActive('attendance') }}>
229
+ Attendance
230
+ </Tabs.Item>
231
+ </Tabs>
232
+ );
37
233
  };
38
234
 
39
- // Tabs with links
40
- export const WithLinks: Story = {
41
- args: {
42
- children: (
43
- <>
44
- <Tabs.Item tabElement="link" tabElementProps={{ href: '#overview' }} active>
45
- Overview
46
- </Tabs.Item>
47
- <Tabs.Item tabElement="link" tabElementProps={{ href: '#details' }}>
48
- Details
49
- </Tabs.Item>
50
- <Tabs.Item tabElement="link" tabElementProps={{ href: '#settings' }}>
51
- Settings
52
- </Tabs.Item>
53
- </>
54
- ),
55
- },
235
+ const WithIconsTemplate = () => {
236
+ const [active, setActive] = useState('profile');
237
+ return (
238
+ <Tabs>
239
+ <Tabs.Item
240
+ iconName="user"
241
+ active={active === 'profile'}
242
+ tabElementProps={{ onClick: () => setActive('profile') }}
243
+ >
244
+ Profile
245
+ </Tabs.Item>
246
+ <Tabs.Item
247
+ iconName="date"
248
+ active={active === 'timetable'}
249
+ tabElementProps={{ onClick: () => setActive('timetable') }}
250
+ >
251
+ Timetable
252
+ </Tabs.Item>
253
+ <Tabs.Item
254
+ iconName="chart-column-increasing"
255
+ active={active === 'results'}
256
+ tabElementProps={{ onClick: () => setActive('results') }}
257
+ >
258
+ Results
259
+ </Tabs.Item>
260
+ <Tabs.Item
261
+ iconName="settings"
262
+ active={active === 'settings'}
263
+ tabElementProps={{ onClick: () => setActive('settings') }}
264
+ >
265
+ Settings
266
+ </Tabs.Item>
267
+ </Tabs>
268
+ );
56
269
  };
57
270
 
58
- // Mixed tabs (buttons and links)
59
- export const Mixed: Story = {
60
- args: {
61
- children: (
62
- <>
63
- <Tabs.Item active>Home</Tabs.Item>
64
- <Tabs.Item tabElement="link" tabElementProps={{ href: '#about' }}>
65
- About
271
+ const WithLinkTabsTemplate = () => (
272
+ <Tabs>
273
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#overview' }} active>
274
+ Overview
275
+ </Tabs.Item>
276
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#details' }}>
277
+ Details
278
+ </Tabs.Item>
279
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#assessment' }}>
280
+ Assessment
281
+ </Tabs.Item>
282
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#attendance' }}>
283
+ Attendance
284
+ </Tabs.Item>
285
+ </Tabs>
286
+ );
287
+
288
+ const WithManyTabsTemplate = () => {
289
+ const [active, setActive] = useState('autumn');
290
+ const terms = ['Autumn 1', 'Autumn 2', 'Spring 1', 'Spring 2', 'Summer 1', 'Summer 2'];
291
+ return (
292
+ <Tabs>
293
+ {terms.map(term => (
294
+ <Tabs.Item
295
+ key={term}
296
+ active={active === term}
297
+ tabElementProps={{ onClick: () => setActive(term) }}
298
+ >
299
+ {term}
66
300
  </Tabs.Item>
67
- <Tabs.Item>Contact</Tabs.Item>
68
- <Tabs.Item tabElement="link" tabElementProps={{ href: '#help' }}>
69
- Help
301
+ ))}
302
+ </Tabs>
303
+ );
304
+ };
305
+
306
+ const MixedTabsTemplate = () => {
307
+ const [active, setActive] = useState('overview');
308
+ return (
309
+ <Tabs>
310
+ <Tabs.Item active={active === 'overview'} tabElementProps={{ onClick: () => setActive('overview') }}>
311
+ Overview
312
+ </Tabs.Item>
313
+ <Tabs.Item active={active === 'details'} tabElementProps={{ onClick: () => setActive('details') }}>
314
+ Details
315
+ </Tabs.Item>
316
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '#help' }}>
317
+ Help
318
+ </Tabs.Item>
319
+ </Tabs>
320
+ );
321
+ };
322
+
323
+ // ---------------------------------------------------------------------------
324
+ // Stories
325
+ // ---------------------------------------------------------------------------
326
+
327
+ export const Default: Story = withDescription(
328
+ {
329
+ render: DefaultTemplate,
330
+ parameters: {
331
+ controls: { disable: true },
332
+ docs: {
333
+ source: {
334
+ language: 'tsx',
335
+ code: `
336
+ import { Tabs } from '@arbor-education/design-system.components';
337
+ import { useState } from 'react';
338
+
339
+ function PupilTabs() {
340
+ const [active, setActive] = useState('overview');
341
+
342
+ return (
343
+ <Tabs>
344
+ <Tabs.Item
345
+ active={active === 'overview'}
346
+ tabElementProps={{ onClick: () => setActive('overview') }}
347
+ >
348
+ Overview
349
+ </Tabs.Item>
350
+ <Tabs.Item
351
+ active={active === 'details'}
352
+ tabElementProps={{ onClick: () => setActive('details') }}
353
+ >
354
+ Details
355
+ </Tabs.Item>
356
+ <Tabs.Item
357
+ active={active === 'assessment'}
358
+ tabElementProps={{ onClick: () => setActive('assessment') }}
359
+ >
360
+ Assessment
361
+ </Tabs.Item>
362
+ <Tabs.Item
363
+ active={active === 'attendance'}
364
+ tabElementProps={{ onClick: () => setActive('attendance') }}
365
+ >
366
+ Attendance
367
+ </Tabs.Item>
368
+ </Tabs>
369
+ );
370
+ }
371
+ export default PupilTabs;
372
+ `.trim(),
373
+ },
374
+ },
375
+ },
376
+ },
377
+ [
378
+ '`Tabs` does **not** manage which tab is active — that is your responsibility.',
379
+ 'Control `active` on each `Tabs.Item` and listen for clicks via `tabElementProps.onClick`.',
380
+ 'Click the tabs to see the active state switch.',
381
+ ].join(' '),
382
+ );
383
+
384
+ export const WithIcons: Story = withDescription(
385
+ {
386
+ render: WithIconsTemplate,
387
+ parameters: {
388
+ controls: { disable: true },
389
+ docs: {
390
+ source: {
391
+ language: 'tsx',
392
+ code: `
393
+ import { Tabs } from '@arbor-education/design-system.components';
394
+ import { useState } from 'react';
395
+
396
+ function PupilTabsWithIcons() {
397
+ const [active, setActive] = useState('profile');
398
+
399
+ return (
400
+ <Tabs>
401
+ <Tabs.Item
402
+ iconName="user"
403
+ active={active === 'profile'}
404
+ tabElementProps={{ onClick: () => setActive('profile') }}
405
+ >
406
+ Profile
407
+ </Tabs.Item>
408
+ <Tabs.Item
409
+ iconName="date"
410
+ active={active === 'timetable'}
411
+ tabElementProps={{ onClick: () => setActive('timetable') }}
412
+ >
413
+ Timetable
414
+ </Tabs.Item>
415
+ <Tabs.Item
416
+ iconName="chart-column-increasing"
417
+ active={active === 'results'}
418
+ tabElementProps={{ onClick: () => setActive('results') }}
419
+ >
420
+ Results
421
+ </Tabs.Item>
422
+ </Tabs>
423
+ );
424
+ }
425
+ export default PupilTabsWithIcons;
426
+ `.trim(),
427
+ },
428
+ },
429
+ },
430
+ },
431
+ [
432
+ 'Add an icon before the tab label with the `iconName` prop.',
433
+ 'Icons render at 16 px and use any name from the icon library.',
434
+ 'Keep labels short when using icons — the icon + text combination can make tabs wide.',
435
+ ].join(' '),
436
+ );
437
+
438
+ export const WithLinkTabs: Story = withDescription(
439
+ {
440
+ render: WithLinkTabsTemplate,
441
+ parameters: {
442
+ controls: { disable: true },
443
+ docs: {
444
+ source: {
445
+ language: 'tsx',
446
+ code: `
447
+ import { Tabs } from '@arbor-education/design-system.components';
448
+
449
+ // Use tabElement="link" when tabs navigate to different URLs.
450
+ // The inner element renders as <a> — pass href via tabElementProps.
451
+ function PupilLinkTabs() {
452
+ return (
453
+ <Tabs>
454
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '/pupils/overview' }} active>
455
+ Overview
456
+ </Tabs.Item>
457
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '/pupils/details' }}>
458
+ Details
459
+ </Tabs.Item>
460
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '/pupils/assessment' }}>
461
+ Assessment
462
+ </Tabs.Item>
463
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '/pupils/attendance' }}>
464
+ Attendance
465
+ </Tabs.Item>
466
+ </Tabs>
467
+ );
468
+ }
469
+ export default PupilLinkTabs;
470
+ `.trim(),
471
+ },
472
+ },
473
+ },
474
+ },
475
+ [
476
+ 'Use `tabElement="link"` when each tab navigates to a different URL.',
477
+ 'The inner element renders as `<a>` — pass `href` (and any other anchor attributes) via `tabElementProps`.',
478
+ 'Set `active` on the tab that matches the current route.',
479
+ ].join(' '),
480
+ );
481
+
482
+ export const WithManyTabs: Story = withDescription(
483
+ {
484
+ render: WithManyTabsTemplate,
485
+ parameters: {
486
+ controls: { disable: true },
487
+ docs: {
488
+ source: {
489
+ language: 'tsx',
490
+ code: `
491
+ import { Tabs } from '@arbor-education/design-system.components';
492
+ import { useState } from 'react';
493
+
494
+ function TermTabs() {
495
+ const [active, setActive] = useState('Autumn 1');
496
+ const terms = ['Autumn 1', 'Autumn 2', 'Spring 1', 'Spring 2', 'Summer 1', 'Summer 2'];
497
+
498
+ return (
499
+ <Tabs>
500
+ {terms.map(term => (
501
+ <Tabs.Item
502
+ key={term}
503
+ active={active === term}
504
+ tabElementProps={{ onClick: () => setActive(term) }}
505
+ >
506
+ {term}
70
507
  </Tabs.Item>
71
- </>
72
- ),
508
+ ))}
509
+ </Tabs>
510
+ );
511
+ }
512
+ export default TermTabs;
513
+ `.trim(),
514
+ },
515
+ },
516
+ },
73
517
  },
74
- };
518
+ [
519
+ 'Tabs wrap onto multiple lines when there are more tabs than the strip can fit.',
520
+ 'If you have more than ~7 tabs, consider whether a `Dropdown` or sidebar navigation',
521
+ 'would be easier to scan. Dynamic lists of tabs (e.g. academic terms) are a good use case',
522
+ 'for rendering `Tabs.Item` from an array.',
523
+ ].join(' '),
524
+ );
525
+
526
+ export const MixedButtonAndLink: Story = withDescription(
527
+ {
528
+ render: MixedTabsTemplate,
529
+ parameters: {
530
+ controls: { disable: true },
531
+ docs: {
532
+ source: {
533
+ language: 'tsx',
534
+ code: `
535
+ import { Tabs } from '@arbor-education/design-system.components';
536
+ import { useState } from 'react';
75
537
 
76
- // Many tabs
77
- export const ManyTabs: Story = {
78
- args: {
79
- children: (
80
- <>
81
- <Tabs.Item active iconName="list">Tab 1</Tabs.Item>
82
- <Tabs.Item iconName="list">Tab 2</Tabs.Item>
83
- <Tabs.Item iconName="list">Tab 3</Tabs.Item>
84
- <Tabs.Item iconName="list">Tab 4</Tabs.Item>
85
- <Tabs.Item iconName="list">Tab 5</Tabs.Item>
86
- <Tabs.Item iconName="list">Tab 6</Tabs.Item>
87
- <Tabs.Item iconName="list">Tab 7</Tabs.Item>
88
- <Tabs.Item iconName="list">Tab 8</Tabs.Item>
89
- </>
90
- ),
538
+ function PupilTabsMixed() {
539
+ const [active, setActive] = useState('overview');
540
+
541
+ return (
542
+ <Tabs>
543
+ <Tabs.Item
544
+ active={active === 'overview'}
545
+ tabElementProps={{ onClick: () => setActive('overview') }}
546
+ >
547
+ Overview
548
+ </Tabs.Item>
549
+ <Tabs.Item
550
+ active={active === 'details'}
551
+ tabElementProps={{ onClick: () => setActive('details') }}
552
+ >
553
+ Details
554
+ </Tabs.Item>
555
+ <Tabs.Item tabElement="link" tabElementProps={{ href: '/help' }}>
556
+ Help
557
+ </Tabs.Item>
558
+ </Tabs>
559
+ );
560
+ }
561
+ export default PupilTabsMixed;
562
+ `.trim(),
563
+ },
564
+ },
565
+ },
91
566
  },
92
- };
567
+ [
568
+ 'You can mix `button` and `link` tabs in the same strip.',
569
+ 'Use `tabElement="button"` (default) for JS-controlled tabs and `tabElement="link"` for any tab that',
570
+ 'navigates to an external URL or a help page — without disrupting the active state of the in-page tabs.',
571
+ ].join(' '),
572
+ );