@arbor-education/design-system.components 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +27 -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/number/NumberInput.d.ts.map +1 -1
  60. package/dist/components/formField/inputs/number/NumberInput.js +14 -2
  61. package/dist/components/formField/inputs/number/NumberInput.js.map +1 -1
  62. package/dist/components/formField/inputs/number/NumberInput.test.js +21 -0
  63. package/dist/components/formField/inputs/number/NumberInput.test.js.map +1 -1
  64. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
  65. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  66. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  67. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  68. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
  69. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  70. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
  71. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  72. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
  73. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  74. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
  75. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
  76. package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
  77. package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
  78. package/dist/components/formField/label/Label.stories.d.ts +54 -5
  79. package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
  80. package/dist/components/formField/label/Label.stories.js +238 -4
  81. package/dist/components/formField/label/Label.stories.js.map +1 -1
  82. package/dist/components/icoText/IcoText.stories.d.ts +32 -6
  83. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
  84. package/dist/components/icoText/IcoText.stories.js +309 -14
  85. package/dist/components/icoText/IcoText.stories.js.map +1 -1
  86. package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
  87. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
  88. package/dist/components/kpiCard/KPICard.stories.js +354 -10
  89. package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
  90. package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
  91. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
  92. package/dist/components/kvpList/KVPList.stories.js +403 -10
  93. package/dist/components/kvpList/KVPList.stories.js.map +1 -1
  94. package/dist/components/modal/Modal.stories.d.ts +113 -9
  95. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  96. package/dist/components/modal/Modal.stories.js +633 -13
  97. package/dist/components/modal/Modal.stories.js.map +1 -1
  98. package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
  99. package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
  100. package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
  101. package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
  102. package/dist/components/pill/Pill.d.ts.map +1 -1
  103. package/dist/components/pill/Pill.js +1 -1
  104. package/dist/components/pill/Pill.js.map +1 -1
  105. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  106. package/dist/components/pill/Pill.stories.js +11 -13
  107. package/dist/components/pill/Pill.stories.js.map +1 -1
  108. package/dist/components/row/Row.stories.d.ts +1 -2
  109. package/dist/components/row/Row.stories.d.ts.map +1 -1
  110. package/dist/components/row/Row.stories.js +360 -50
  111. package/dist/components/row/Row.stories.js.map +1 -1
  112. package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
  113. package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
  114. package/dist/components/searchBar/SearchBar.stories.js +428 -36
  115. package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
  116. package/dist/components/section/Section.stories.d.ts +11 -41
  117. package/dist/components/section/Section.stories.d.ts.map +1 -1
  118. package/dist/components/section/Section.stories.js +494 -56
  119. package/dist/components/section/Section.stories.js.map +1 -1
  120. package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
  121. package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
  122. package/dist/components/singleUser/SingleUser.stories.js +303 -31
  123. package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
  124. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
  125. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
  126. package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
  127. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  128. package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
  129. package/dist/components/table/DSDefaultColDef.js +4 -3
  130. package/dist/components/table/DSDefaultColDef.js.map +1 -1
  131. package/dist/components/table/Table.d.ts +7 -1
  132. package/dist/components/table/Table.d.ts.map +1 -1
  133. package/dist/components/table/Table.js +12 -5
  134. package/dist/components/table/Table.js.map +1 -1
  135. package/dist/components/table/Table.stories.d.ts +3 -0
  136. package/dist/components/table/Table.stories.d.ts.map +1 -1
  137. package/dist/components/table/Table.stories.js +445 -3
  138. package/dist/components/table/Table.stories.js.map +1 -1
  139. package/dist/components/table/Table.test.js +184 -0
  140. package/dist/components/table/Table.test.js.map +1 -1
  141. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  142. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  143. package/dist/components/table/TableFooter.stories.js +137 -0
  144. package/dist/components/table/TableFooter.stories.js.map +1 -0
  145. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  146. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  147. package/dist/components/table/TableHeader.stories.js +176 -0
  148. package/dist/components/table/TableHeader.stories.js.map +1 -0
  149. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  150. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  151. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  152. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  153. package/dist/components/table/cellEditors/NumberCellEditor.d.ts +13 -0
  154. package/dist/components/table/cellEditors/NumberCellEditor.d.ts.map +1 -0
  155. package/dist/components/table/cellEditors/NumberCellEditor.js +35 -0
  156. package/dist/components/table/cellEditors/NumberCellEditor.js.map +1 -0
  157. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  158. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  159. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  160. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  161. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  162. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  163. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  164. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  165. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  166. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  167. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  168. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  169. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  170. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  171. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  172. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  173. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  174. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  175. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  176. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  177. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  178. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  179. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  180. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  181. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  182. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  183. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  184. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  185. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  186. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  187. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  188. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  189. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  190. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  191. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  192. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  193. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  194. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  195. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  196. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  197. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  198. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  199. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  200. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  201. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  202. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  203. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  204. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  205. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  206. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  207. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  208. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  209. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  210. package/dist/components/tabs/Tabs.stories.js +398 -22
  211. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  212. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  213. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  214. package/dist/components/tabs/TabsItem.stories.js +61 -9
  215. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  216. package/dist/components/toast/Toast.stories.d.ts +103 -10
  217. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  218. package/dist/components/toast/Toast.stories.js +409 -47
  219. package/dist/components/toast/Toast.stories.js.map +1 -1
  220. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  221. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  222. package/dist/components/toggle/Toggle.stories.js +311 -122
  223. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  224. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  225. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  226. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  227. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  228. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  229. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  230. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  231. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  232. package/dist/index.css +27 -0
  233. package/dist/index.css.map +1 -1
  234. package/dist/index.d.ts +3 -2
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +3 -2
  237. package/dist/index.js.map +1 -1
  238. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  239. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  240. package/dist/utils/PopupParentContext.stories.js +266 -0
  241. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  242. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  243. package/dist/utils/getDefaultPopupParent.js +6 -0
  244. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  245. package/package.json +1 -1
  246. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  247. package/src/components/avatar/Avatar.stories.tsx +504 -59
  248. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  249. package/src/components/banner/Banner.stories.tsx +7 -3
  250. package/src/components/card/Card.stories.tsx +466 -36
  251. package/src/components/combobox/Combobox.stories.tsx +867 -260
  252. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  253. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  254. package/src/components/editableText/EditableText.stories.tsx +567 -91
  255. package/src/components/formField/FormField.test.tsx +6 -0
  256. package/src/components/formField/FormField.tsx +5 -0
  257. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  258. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  259. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  260. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  261. package/src/components/formField/inputs/number/NumberInput.test.tsx +28 -0
  262. package/src/components/formField/inputs/number/NumberInput.tsx +15 -0
  263. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  264. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  265. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  266. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  267. package/src/components/formField/label/Label.stories.tsx +317 -8
  268. package/src/components/icoText/IcoText.stories.tsx +442 -31
  269. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  270. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  271. package/src/components/modal/Modal.stories.tsx +963 -26
  272. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  273. package/src/components/pill/Pill.stories.tsx +11 -13
  274. package/src/components/pill/Pill.tsx +1 -0
  275. package/src/components/row/Row.stories.tsx +474 -58
  276. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  277. package/src/components/section/Section.stories.tsx +723 -70
  278. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  279. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  280. package/src/components/table/DSDefaultColDef.ts +25 -5
  281. package/src/components/table/Table.stories.tsx +504 -3
  282. package/src/components/table/Table.test.tsx +255 -0
  283. package/src/components/table/Table.tsx +15 -2
  284. package/src/components/table/TableFooter.stories.tsx +196 -0
  285. package/src/components/table/TableHeader.stories.tsx +251 -0
  286. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  287. package/src/components/table/cellEditors/NumberCellEditor.tsx +83 -0
  288. package/src/components/table/cellEditors/numberCellEditor.scss +11 -0
  289. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  290. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  291. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  292. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  293. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  294. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  295. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  296. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  297. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  298. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  299. package/src/components/table/table.scss +11 -0
  300. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  301. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  302. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  303. package/src/components/tabs/Tabs.stories.tsx +540 -60
  304. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  305. package/src/components/toast/Toast.stories.tsx +539 -77
  306. package/src/components/toggle/Toggle.stories.tsx +371 -135
  307. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  308. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  309. package/src/docs/Contributing.mdx +241 -0
  310. package/src/docs/UsingComponents.mdx +93 -0
  311. package/src/docs/Welcome.mdx +68 -0
  312. package/src/global.scss +7 -0
  313. package/src/index.scss +1 -0
  314. package/src/index.ts +3 -2
  315. package/src/utils/PopupParentContext.stories.tsx +367 -0
  316. package/src/utils/getDefaultPopupParent.ts +6 -0
  317. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  318. package/.ralph/storybook-upgrade/prd.json +0 -777
  319. package/.ralph/storybook-upgrade/progress.md +0 -342
  320. package/src/components/table/TableWIP.mdx +0 -3
@@ -1,4 +1,10 @@
1
- import type { CellClassParams, CellFocusedParams, ColDef, SuppressMouseEventHandlingParams, ValueFormatterFunc } from 'ag-grid-community';
1
+ import type {
2
+ CellClassParams,
3
+ CellFocusedParams,
4
+ ColDef,
5
+ SuppressMouseEventHandlingParams,
6
+ ValueFormatterFunc,
7
+ } from 'ag-grid-community';
2
8
  import { cellColorStyles } from './cellColorStyles';
3
9
 
4
10
  // checks if the value is wrapped in a object with a value property
@@ -15,17 +21,28 @@ export const defaultValueFormatter: ValueFormatterFunc = (params) => {
15
21
  return value;
16
22
  };
17
23
 
18
- export const shouldSuppressFocus = (params: SuppressMouseEventHandlingParams | CellClassParams | CellFocusedParams) => {
24
+ export const shouldSuppressFocus = (
25
+ params:
26
+ | SuppressMouseEventHandlingParams
27
+ | CellClassParams
28
+ | CellFocusedParams,
29
+ ) => {
19
30
  if (typeof params.column !== 'object') {
20
31
  return false;
21
32
  }
22
- return params.column?.getColDef().cellRendererParams.suppressCellFocusAndFocusFirstElement ?? false;
33
+ return (
34
+ params.column?.getColDef()?.cellRendererParams
35
+ ?.suppressCellFocusAndFocusFirstElement ?? false
36
+ );
23
37
  };
24
38
 
25
39
  export const DSDefaultColDef: ColDef = {
26
40
  cellStyle: cellColorStyles,
27
41
  valueGetter: (params) => {
28
- const { data, colDef: { field } } = params;
42
+ const {
43
+ data,
44
+ colDef: { field },
45
+ } = params;
29
46
  if (data == null || field == null) {
30
47
  return undefined;
31
48
  }
@@ -33,7 +50,10 @@ export const DSDefaultColDef: ColDef = {
33
50
  },
34
51
  valueFormatter: defaultValueFormatter,
35
52
  filterValueGetter: (params) => {
36
- const { data, colDef: { field } } = params;
53
+ const {
54
+ data,
55
+ colDef: { field },
56
+ } = params;
37
57
  if (data == null || field == null) {
38
58
  return undefined;
39
59
  }
@@ -1,4 +1,13 @@
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';
2
11
  import { type Column, type ColDef, type ColGroupDef } from 'ag-grid-enterprise';
3
12
  import { Table } from './Table';
4
13
  import { Button } from 'Components/button/Button';
@@ -24,15 +33,344 @@ import type { CustomCellRendererProps } from 'ag-grid-react';
24
33
 
25
34
  type TableProps = ComponentProps<typeof Table>;
26
35
 
36
+ // ---------------------------------------------------------------------------
37
+ // Content strings for the custom DocsPage
38
+ // ---------------------------------------------------------------------------
39
+
40
+ const DESCRIPTION_INTRO = [
41
+ '`Table` is an enterprise-grade data table built on top of [AG Grid React](https://www.ag-grid.com/react-data-grid/).',
42
+ 'It wraps `AgGridReact` with Arbor design tokens, a custom theme, built-in search, pagination, bulk actions,',
43
+ 'hide-columns, and a suite of custom cell renderers and column filters.',
44
+ 'All AG Grid props pass through via `...rest`, so the full AG Grid API is available.',
45
+ ].join(' ');
46
+
47
+ const PROPS_INTRO
48
+ = 'The preview below is wired to the **Controls** panel — tweak any DS-specific prop to see the story update in real time.';
49
+
50
+ const USAGE_GUIDANCE = [
51
+ '### When to use',
52
+ '',
53
+ '- Displaying large, structured datasets where users need to sort, filter, search, or paginate.',
54
+ '- Any screen in Arbor that renders rows of records (pupil lists, staff registers, attendance grids, marksheets).',
55
+ '- When cells need interactive controls — buttons, dropdowns, checkboxes, date pickers.',
56
+ '- When column visibility, row selection, and bulk actions are required.',
57
+ '',
58
+ '---',
59
+ '',
60
+ '### When NOT to use',
61
+ '',
62
+ '| Situation | Use instead |',
63
+ '|---|---|',
64
+ '| A small read-only list of key–value pairs | [`Section`](?path=/docs/components-section--docs) with [`Row`](?path=/docs/components-row--docs) components |',
65
+ '| A two-column data summary (label + value) | [`Row`](?path=/docs/components-row--docs) inside a `Section` |',
66
+ '| Simple static HTML tables | Native `<table>` with semantic markup |',
67
+ '| A handful of rows that never change | Native `<table>` — AG Grid has overhead |',
68
+ ].join('\n');
69
+
70
+ const DEVELOPER_NOTES = [
71
+ '### AG Grid license',
72
+ '',
73
+ '`setAgGridLicenseKey()` is called automatically inside the `Table` component.',
74
+ 'You do **not** need to call it yourself.',
75
+ '',
76
+ '---',
77
+ '',
78
+ '### Registered cell renderers',
79
+ '',
80
+ 'These string keys are pre-registered and available in any `cellRenderer` or `cellRendererParams`:',
81
+ '',
82
+ '| Key | Component | Purpose |',
83
+ '|---|---|---|',
84
+ '| `dsButtonCellRenderer` | `Table.ButtonCellRenderer` | Renders a `Button` inside a cell |',
85
+ '| `dsInlineTextCellRenderer` | `Table.InlineTextCellRenderer` | Inline text editing with expand/collapse support |',
86
+ '| `dsSelectDropdownCellRenderer` | `Table.SelectDropdownCellRenderer` | Renders a `SelectDropdown` in a cell |',
87
+ '| `dsBooleanCellRenderer` | `Table.BooleanCellRenderer` | Read-only boolean display |',
88
+ '| `dsCheckboxCellRenderer` | `Table.CheckboxCellRenderer` | Editable boolean checkbox |',
89
+ '| `dsDateCellEditor` | `Table.DateCellEditor` | Date picker cell editor |',
90
+ '',
91
+ '---',
92
+ '',
93
+ '### Registered column filters',
94
+ '',
95
+ '| Import | `doesFilterPass` helper | Use case |',
96
+ '|---|---|---|',
97
+ '| `BooleanFilter` | `doesBooleanFilterPass` | Filtering boolean / active columns |',
98
+ '| `TimeFilter` | `doesTimeFilterPass` | Filtering time string columns |',
99
+ '',
100
+ '---',
101
+ '',
102
+ '### Header and footer slots',
103
+ '',
104
+ '- `headerContent` — pass any `ReactNode` here; the `<TableHeader>` wraps it with a built-in search bar.',
105
+ ' Use `Table.TableControls` for the standard toolbar (bulk actions, hide columns, settings, download, help, expand).',
106
+ '- `hasSearch` (default `true`) — controls whether the search bar is rendered inside the header.',
107
+ ' Set to `false` when the header has no search functionality.',
108
+ '- `footerContent` — pass any `ReactNode` here; the `<TableFooter>` wraps it.',
109
+ ' Use `Table.PaginationPanel` for standard pagination.',
110
+ '',
111
+ '---',
112
+ '',
113
+ '### TableSettingsDropdown customisation',
114
+ '',
115
+ '`Table.TableSettingsDropdown` accepts an optional `items` prop to control which controls are shown and in what order.',
116
+ 'Omit `items` (or omit any key) to hide that control entirely.',
117
+ '',
118
+ '```tsx',
119
+ '// Built-in keys — use any subset in any order:',
120
+ '<Table.TableSettingsDropdown items={[\'tableSpacing\', \'separator\', \'style\']} />',
121
+ '',
122
+ '// Custom checkbox group:',
123
+ '<Table.TableSettingsDropdown items={[',
124
+ ' \'tableSpacing\',',
125
+ ' { type: \'checkboxGroup\', legend: \'View options\', options: [',
126
+ ' { label: \'Show inactive\', checked: showInactive, onChange: setShowInactive },',
127
+ ' ] },',
128
+ ']} />',
129
+ '',
130
+ '// Custom radio group:',
131
+ '<Table.TableSettingsDropdown items={[',
132
+ ' { type: \'radioGroup\', legend: \'Display\', name: \'display\', checkedValue: view, onChange: setView,',
133
+ ' options: [{ label: \'Compact\', value: \'compact\' }, { label: \'Default\', value: \'default\' }] },',
134
+ ']} />',
135
+ '```',
136
+ '',
137
+ 'Use `Table.SettingsItems` to access the default items array and extend it:',
138
+ '',
139
+ '```tsx',
140
+ 'const myItems = [...Table.SettingsItems, { type: \'checkboxGroup\', options: [...] }];',
141
+ '<Table.TableSettingsDropdown items={myItems} />',
142
+ '```',
143
+ '',
144
+ 'Use `onTableSettingsReset` on `Table` to reset your custom state when the reset button is clicked.',
145
+ '',
146
+ '---',
147
+ '',
148
+ '### Themes',
149
+ '',
150
+ '| Value | Description |',
151
+ '|---|---|',
152
+ '| _(omit)_ | Default Arbor table theme with full spacing and borders |',
153
+ '| `"tidy"` | Compact theme for dense layouts like marksheets. Suppresses expand/collapse icons. |',
154
+ '',
155
+ '---',
156
+ '',
157
+ '### Table spacing',
158
+ '',
159
+ 'Use `Table.Spacing` (enum `TABLE_SPACING`) when handling `onTableSpacingChanged`:',
160
+ '',
161
+ '```ts',
162
+ "import { Table } from '@arbor-education/design-system.components';",
163
+ '',
164
+ '// Table.Spacing values:',
165
+ '// Table.Spacing.XS → 0',
166
+ '// Table.Spacing.S → var(--spacing-xsmall)',
167
+ '// Table.Spacing.M → var(--spacing-small) ← default',
168
+ '// Table.Spacing.L → var(--spacing-medium)',
169
+ '```',
170
+ '',
171
+ '---',
172
+ '',
173
+ '### GridApiContext',
174
+ '',
175
+ 'Child components that need the AG Grid `GridApi` can consume `Table.GridApiContext`:',
176
+ '',
177
+ '```tsx',
178
+ "import { useContext } from 'react';",
179
+ "import { Table } from '@arbor-education/design-system.components';",
180
+ '',
181
+ 'function MyTableChild() {',
182
+ ' const gridApi = useContext(Table.GridApiContext);',
183
+ ' return <button onClick={() => gridApi?.exportDataAsCsv()}>Export</button>;',
184
+ '}',
185
+ '```',
186
+ '',
187
+ '---',
188
+ '',
189
+ '### DefaultColDef and DefaultValueFormatter',
190
+ '',
191
+ '`Table.DefaultColDef` contains Arbor defaults (editable, sortable, resizable, min-width, flex).',
192
+ 'Spread it into your `defaultColDef` and add overrides:',
193
+ '',
194
+ '```ts',
195
+ 'const defaultColDef = {',
196
+ ' ...Table.DefaultColDef,',
197
+ ' editable: false, // override',
198
+ '};',
199
+ '```',
200
+ '',
201
+ '`Table.DefaultValueFormatter` handles the `{ value: string }` cell data shape.',
202
+ 'Any column using the object cell shape (`{ value, backgroundColor, foregroundColor, semanticColor }`) **must** use this formatter.',
203
+ '',
204
+ '---',
205
+ '',
206
+ '### TypeScript types',
207
+ '',
208
+ '```ts',
209
+ "import { Table } from '@arbor-education/design-system.components';",
210
+ "import type { TableProps, TableControlsProps, BulkAction, HideColumnsProps } from '@arbor-education/design-system.components';",
211
+ '',
212
+ '// or via namespace:',
213
+ 'type MyTableProps = Table.Props;',
214
+ 'type MyControlsProps = Table.ControlsProps;',
215
+ 'type MyBulkAction = Table.BulkAction;',
216
+ 'type MySpacing = Table.Spacing;',
217
+ '',
218
+ '// Table.SettingsItems — the default settings items array (spread to extend):',
219
+ 'const myItems = [...Table.SettingsItems, { type: \'checkboxGroup\' as const, options: [] }];',
220
+ '```',
221
+ ].join('\n');
222
+
223
+ const RELATED_COMPONENTS = [
224
+ '## Related components',
225
+ '',
226
+ '[Section](?path=/docs/components-section--docs) · [Row](?path=/docs/components-row--docs) · [Button](?path=/docs/components-button--docs) · [SelectDropdown](?path=/docs/components-selectdropdown--docs)',
227
+ ].join('\n');
228
+
229
+ // ---------------------------------------------------------------------------
230
+ // Custom DocsPage
231
+ // ---------------------------------------------------------------------------
232
+
233
+ function TableDocsPage() {
234
+ return (
235
+ <>
236
+ <Title />
237
+ <Subtitle />
238
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
239
+ <DocHeading>Interactive example</DocHeading>
240
+ <Markdown>{PROPS_INTRO}</Markdown>
241
+ <DocPrimary />
242
+ <Controls />
243
+ <DocHeading>Usage guidance</DocHeading>
244
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
245
+ <DocHeading>Developer notes</DocHeading>
246
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
247
+ <DocHeading>Examples</DocHeading>
248
+ <Stories title="" />
249
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
250
+ </>
251
+ );
252
+ }
253
+
254
+ // ---------------------------------------------------------------------------
255
+ // Meta
256
+ // ---------------------------------------------------------------------------
257
+
27
258
  const meta: Meta<TableProps> = {
28
259
  title: 'Components/Table',
29
260
  component: Table,
30
261
  tags: ['autodocs'],
31
262
  parameters: {
263
+ layout: 'padded',
32
264
  docs: {
33
- description: {
34
- component:
35
- 'The Table component is a wrapper around the ag-grid-react component. It provides a set of props that can be used to configure the table.',
265
+ page: TableDocsPage,
266
+ },
267
+ },
268
+ argTypes: {
269
+ wrapperClassName: {
270
+ description: 'Additional CSS class names applied to the root `<section>` wrapper.',
271
+ control: 'text',
272
+ table: {
273
+ type: { summary: 'string' },
274
+ defaultValue: { summary: 'undefined' },
275
+ },
276
+ },
277
+ hasSearch: {
278
+ description: [
279
+ 'When `true` (the default) a quick-filter search bar is rendered inside the header area.',
280
+ 'Set to `false` when using `headerContent` without a search requirement,',
281
+ 'or when you want to suppress the search bar entirely.',
282
+ ].join(' '),
283
+ control: 'boolean',
284
+ table: {
285
+ type: { summary: 'boolean' },
286
+ defaultValue: { summary: 'true' },
287
+ },
288
+ },
289
+ headerContent: {
290
+ description: [
291
+ 'ReactNode rendered inside the `<TableHeader>` above the grid.',
292
+ 'Use `Table.TableControls` for the standard composed toolbar.',
293
+ 'The built-in search bar appears here when `hasSearch` is `true`.',
294
+ ].join(' '),
295
+ control: false,
296
+ table: {
297
+ type: { summary: 'ReactNode' },
298
+ defaultValue: { summary: 'undefined' },
299
+ },
300
+ },
301
+ footerContent: {
302
+ description: [
303
+ 'ReactNode rendered inside the `<TableFooter>` below the grid.',
304
+ 'Use `Table.PaginationPanel` for standard client-side or server-side pagination.',
305
+ ].join(' '),
306
+ control: false,
307
+ table: {
308
+ type: { summary: 'ReactNode' },
309
+ defaultValue: { summary: 'undefined' },
310
+ },
311
+ },
312
+ tableTheme: {
313
+ description: [
314
+ 'Visual theme for the grid.',
315
+ 'Pass `"tidy"` for the compact marksheet-style theme.',
316
+ 'Omit (or pass `undefined`) for the default Arbor table theme.',
317
+ ].join(' '),
318
+ control: 'select',
319
+ options: [undefined, 'tidy'],
320
+ table: {
321
+ type: { summary: "'tidy' | undefined" },
322
+ defaultValue: { summary: 'undefined' },
323
+ },
324
+ },
325
+ enableSimultaneousRangeAndRowSelection: {
326
+ description: [
327
+ 'When `true`, allows both cell-range selection and row selection to be active at the same time.',
328
+ 'Default `false` — drag selection clears row selection.',
329
+ ].join(' '),
330
+ control: 'boolean',
331
+ table: {
332
+ type: { summary: 'boolean' },
333
+ defaultValue: { summary: 'false' },
334
+ },
335
+ },
336
+ disableDragSelect: {
337
+ description: 'When `true`, disables drag-to-select behaviour on cell range selection.',
338
+ control: 'boolean',
339
+ table: {
340
+ type: { summary: 'boolean' },
341
+ defaultValue: { summary: 'false' },
342
+ },
343
+ },
344
+ onTableSettingsChanged: {
345
+ description: 'Fired when the user changes table settings (column borders, spacing, cell colours) via the settings dropdown.',
346
+ control: false,
347
+ table: {
348
+ type: { summary: '(settings: TableSettings) => void' },
349
+ defaultValue: { summary: 'undefined' },
350
+ },
351
+ },
352
+ onTableSpacingChanged: {
353
+ description: 'Fired when the user changes row spacing. Receives a `Table.Spacing` (TABLE_SPACING) enum value.',
354
+ control: false,
355
+ table: {
356
+ type: { summary: '(val: TABLE_SPACING) => void' },
357
+ defaultValue: { summary: 'undefined' },
358
+ },
359
+ },
360
+ onColumnBordersChanged: {
361
+ description: 'Fired when the user toggles column borders on or off via the settings dropdown.',
362
+ control: false,
363
+ table: {
364
+ type: { summary: '(hasBorders: boolean) => void' },
365
+ defaultValue: { summary: 'undefined' },
366
+ },
367
+ },
368
+ onTableSettingsReset: {
369
+ description: 'Fired when the user resets all table settings to their defaults.',
370
+ control: false,
371
+ table: {
372
+ type: { summary: '() => void' },
373
+ defaultValue: { summary: 'undefined' },
36
374
  },
37
375
  },
38
376
  },
@@ -52,6 +390,7 @@ interface RowData {
52
390
  email: { value: string } & CellColors;
53
391
  role: { value: string } & CellColors;
54
392
  status: { value: string } & CellColors;
393
+ marks: number;
55
394
  active: boolean;
56
395
  time: string;
57
396
  dateOfBirth: Date;
@@ -64,6 +403,7 @@ const sampleData: RowData[] = [
64
403
  email: { value: 'alice.johnson@example.com' },
65
404
  role: { value: 'Developer' },
66
405
  status: { value: 'Active' },
406
+ marks: 84,
67
407
  active: true,
68
408
  time: '2026-01-28 12:00:00',
69
409
  dateOfBirth: new Date(1990, 0, 1),
@@ -74,6 +414,7 @@ const sampleData: RowData[] = [
74
414
  email: { value: 'bob.smith@example.com' },
75
415
  role: { value: 'Designer' },
76
416
  status: { value: 'Active' },
417
+ marks: 76,
77
418
  active: false,
78
419
  time: '2026-01-28 13:00:00',
79
420
  dateOfBirth: new Date(1991, 1, 2),
@@ -84,6 +425,7 @@ const sampleData: RowData[] = [
84
425
  email: { value: 'charlie.brown@example.com' },
85
426
  role: { value: 'Manager' },
86
427
  status: { value: 'Inactive' },
428
+ marks: 92,
87
429
  active: true,
88
430
  time: '2026-01-28 14:00:00',
89
431
  dateOfBirth: new Date(1992, 2, 3),
@@ -94,6 +436,7 @@ const sampleData: RowData[] = [
94
436
  email: { value: 'diana.prince@example.com' },
95
437
  role: { value: 'Developer' },
96
438
  status: { value: 'Active' },
439
+ marks: 88,
97
440
  active: false,
98
441
  time: '2026-01-28 15:00:00',
99
442
  dateOfBirth: new Date(1993, 3, 4),
@@ -104,6 +447,7 @@ const sampleData: RowData[] = [
104
447
  email: { value: 'ethan.hunt@example.com' },
105
448
  role: { value: 'Analyst' },
106
449
  status: { value: 'Active' },
450
+ marks: 69,
107
451
  active: false,
108
452
  time: '2026-01-28 16:00:00',
109
453
  dateOfBirth: new Date(1994, 4, 5),
@@ -154,6 +498,17 @@ const sampleColumnDefs: (ColDef | ColGroupDef)[] = [
154
498
  valueFormatter: Table.DefaultValueFormatter,
155
499
  },
156
500
  { field: 'status', valueFormatter: Table.DefaultValueFormatter },
501
+ {
502
+ field: 'marks',
503
+ cellDataType: 'number',
504
+ cellEditor: 'dsNumberCellEditor',
505
+ cellEditorParams: {
506
+ min: 0,
507
+ max: 100,
508
+ step: 1,
509
+ disableSpinners: false,
510
+ },
511
+ },
157
512
  {
158
513
  field: 'active',
159
514
  filter: { component: BooleanFilter, doesFilterPass: doesBooleanFilterPass },
@@ -168,6 +523,60 @@ const sampleColumnDefs: (ColDef | ColGroupDef)[] = [
168
523
  },
169
524
  ];
170
525
 
526
+ const verticalHeaderTextColumnDefs: (ColDef | ColGroupDef)[] = [
527
+ {
528
+ headerName: 'Details',
529
+ children: [
530
+ {
531
+ field: 'name',
532
+ headerName: 'Preferred Learner Name',
533
+ filter: 'agSetColumnFilter',
534
+ },
535
+ {
536
+ field: 'email',
537
+ headerName: 'Primary Contact Email Address',
538
+ filter: 'agSetColumnFilter',
539
+ },
540
+ {
541
+ field: 'role',
542
+ headerName: 'Role',
543
+ filter: 'agSetColumnFilter',
544
+ },
545
+ {
546
+ field: 'dateOfBirth',
547
+ headerName: 'Date of Birth',
548
+ filter: 'agDateColumnFilter',
549
+ filterParams: { buttons: ['clear', 'apply'] },
550
+ valueFormatter: params =>
551
+ params.value instanceof Date
552
+ ? params.value.toLocaleDateString()
553
+ : params.value,
554
+ },
555
+ ],
556
+ valueFormatter: Table.DefaultValueFormatter,
557
+ },
558
+ {
559
+ field: 'status',
560
+ headerName: 'Current Enrollment Status',
561
+ },
562
+ {
563
+ field: 'marks',
564
+ headerName: 'Overall Score (%)',
565
+ cellDataType: 'number',
566
+ },
567
+ {
568
+ field: 'active',
569
+ headerName: 'Active?',
570
+ cellDataType: 'boolean',
571
+ editable: false,
572
+ },
573
+ {
574
+ field: 'time',
575
+ headerName: 'Most Recent Activity Timestamp',
576
+ editable: false,
577
+ },
578
+ ];
579
+
171
580
  const footerContent = [
172
581
  <Button key={0} variant="primary">
173
582
  Button 1
@@ -201,6 +610,28 @@ export const Default: Story = {
201
610
  },
202
611
  };
203
612
 
613
+ export const WithVerticalHeaderText: Story = {
614
+ parameters: {
615
+ docs: {
616
+ description: {
617
+ story:
618
+ 'Use the `verticalHeaderText` prop when columns are narrow and header labels need to remain readable.',
619
+ },
620
+ },
621
+ },
622
+ args: {
623
+ rowData: sampleData,
624
+ columnDefs: verticalHeaderTextColumnDefs,
625
+ defaultColDef: {
626
+ ...defaultColDef,
627
+ wrapHeaderText: true,
628
+ autoHeaderHeight: true,
629
+ },
630
+ domLayout: 'autoHeight',
631
+ verticalHeaderText: true,
632
+ },
633
+ };
634
+
204
635
  export const WithFooter: Story = {
205
636
  args: {
206
637
  rowData: sampleData,
@@ -1661,6 +2092,76 @@ const checkboxColumnDefs: ColDef[] = [
1661
2092
  },
1662
2093
  ];
1663
2094
 
2095
+ export const WithTableSettingsDropdownItems: Story = {
2096
+ parameters: {
2097
+ docs: {
2098
+ description: {
2099
+ story:
2100
+ 'Pass an `items` array to control exactly which controls appear. Only the items you include will be shown. Available keys: `tableSpacing`, `separator`, `style`.',
2101
+ },
2102
+ },
2103
+ },
2104
+ args: {
2105
+ rowData: sampleData,
2106
+ columnDefs: sampleColumnDefs,
2107
+ defaultColDef,
2108
+ domLayout: 'autoHeight',
2109
+ headerContent: (
2110
+ <Table.TableSettingsDropdown
2111
+ items={['tableSpacing']}
2112
+ />
2113
+ ),
2114
+ },
2115
+ };
2116
+
2117
+ export const WithTableSettingsDropdownCustomItems: Story = {
2118
+ parameters: {
2119
+ docs: {
2120
+ description: {
2121
+ story:
2122
+ 'Pass an `items` array with any mix of built-in keys and custom item objects in any order. Built-in keys: `tableSpacing`, `separator`, `style`. For custom items, use `{ type: "checkboxGroup", legend?, options }` for a group of toggles or `{ type: "radioGroup", legend?, name, checkedValue, onChange, options }` for mutually exclusive options. Custom item state is managed externally. Use `onTableSettingsReset` on the Table to reset custom state when the reset button is clicked.',
2123
+ },
2124
+ },
2125
+ },
2126
+ args: {
2127
+ rowData: sampleData,
2128
+ columnDefs: sampleColumnDefs,
2129
+ defaultColDef,
2130
+ domLayout: 'autoHeight',
2131
+ },
2132
+ render: (args) => {
2133
+ const [showInactive, setShowInactive] = useState(false);
2134
+ const filteredData = showInactive
2135
+ ? args.rowData
2136
+ : args.rowData?.filter((row: RowData) => row.active);
2137
+
2138
+ return (
2139
+ <Table
2140
+ {...args}
2141
+ rowData={filteredData}
2142
+ onTableSettingsReset={() => setShowInactive(false)}
2143
+ headerContent={(
2144
+ <Table.TableSettingsDropdown
2145
+ items={[
2146
+ 'tableSpacing',
2147
+ 'separator',
2148
+ 'style',
2149
+ 'separator',
2150
+ {
2151
+ type: 'checkboxGroup',
2152
+ legend: 'View options',
2153
+ options: [
2154
+ { label: 'Show inactive users', checked: showInactive, onChange: setShowInactive },
2155
+ ],
2156
+ },
2157
+ ]}
2158
+ />
2159
+ )}
2160
+ />
2161
+ );
2162
+ },
2163
+ };
2164
+
1664
2165
  export const WithCheckboxCellRenderer: Story = {
1665
2166
  parameters: {
1666
2167
  docs: {