@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
@@ -36,6 +36,20 @@ describe('Table', () => {
36
36
  expect(screen.getByTestId('test-table')).toHaveClass('ds-table__container');
37
37
  });
38
38
 
39
+ describe('verticalHeaderText', () => {
40
+ test('applies vertical header text class when enabled', () => {
41
+ const { container } = render(<Table verticalHeaderText />);
42
+
43
+ expect(container.querySelector('.ds-table')).toHaveClass('ds-table--vertical-header-text');
44
+ });
45
+
46
+ test('does not apply vertical header text class by default', () => {
47
+ const { container } = render(<Table />);
48
+
49
+ expect(container.querySelector('.ds-table')).not.toHaveClass('ds-table--vertical-header-text');
50
+ });
51
+ });
52
+
39
53
  describe('TableHeader', () => {
40
54
  test('renders header when headerContent is provided', () => {
41
55
  render(<Table headerContent={<div>Header content</div>} />);
@@ -1406,6 +1420,247 @@ describe('Table', () => {
1406
1420
 
1407
1421
  expect(onCellValueChanged).toHaveBeenLastCalledWith(expect.objectContaining({ oldValue: 30, newValue: 35 }));
1408
1422
  });
1423
+
1424
+ test('supports editing number fields with the number cell editor spinners', async () => {
1425
+ const onCellValueChanged = vi.fn();
1426
+ const columnDefs = [{
1427
+ field: 'age',
1428
+ headerName: 'Age',
1429
+ editable: true,
1430
+ cellDataType: 'number',
1431
+ cellEditor: 'dsNumberCellEditor',
1432
+ cellEditorParams: {
1433
+ min: 0,
1434
+ max: 100,
1435
+ step: 5,
1436
+ disableSpinners: false,
1437
+ },
1438
+ }];
1439
+ const rowData = [
1440
+ { id: 1, name: 'John Doe', age: 30 },
1441
+ { id: 2, name: 'Jane Smith', age: 25 },
1442
+ ];
1443
+
1444
+ render(
1445
+ <Table
1446
+ columnDefs={columnDefs}
1447
+ rowData={rowData}
1448
+ onCellValueChanged={onCellValueChanged}
1449
+ />,
1450
+ );
1451
+
1452
+ await waitFor(() => expect(screen.getByRole('grid')).toBeInTheDocument());
1453
+ await waitFor(() => expect(screen.getByText('30')).toBeInTheDocument());
1454
+
1455
+ const cell = screen.getByText('30');
1456
+ await userEvent.dblClick(cell);
1457
+
1458
+ const editorInput = await screen.findByRole('textbox');
1459
+ expect(editorInput).toHaveFocus();
1460
+
1461
+ await userEvent.click(screen.getByLabelText('Plus button'));
1462
+ await userEvent.keyboard('{Enter}');
1463
+
1464
+ await waitFor(() => {
1465
+ expect(onCellValueChanged).toHaveBeenCalled();
1466
+ });
1467
+
1468
+ expect(onCellValueChanged).toHaveBeenLastCalledWith(expect.objectContaining({ oldValue: 30, newValue: 35 }));
1469
+ });
1470
+
1471
+ test('clamps out-of-range number editor values when committing with enter', async () => {
1472
+ const onCellValueChanged = vi.fn();
1473
+ const columnDefs = [{
1474
+ field: 'age',
1475
+ headerName: 'Age',
1476
+ editable: true,
1477
+ cellDataType: 'number',
1478
+ cellEditor: 'dsNumberCellEditor',
1479
+ cellEditorParams: {
1480
+ min: 0,
1481
+ max: 100,
1482
+ step: 1,
1483
+ disableSpinners: true,
1484
+ },
1485
+ }];
1486
+ const rowData = [
1487
+ { id: 1, name: 'John Doe', age: 30 },
1488
+ { id: 2, name: 'Jane Smith', age: 25 },
1489
+ ];
1490
+
1491
+ render(
1492
+ <Table
1493
+ columnDefs={columnDefs}
1494
+ rowData={rowData}
1495
+ onCellValueChanged={onCellValueChanged}
1496
+ />,
1497
+ );
1498
+
1499
+ await waitFor(() => expect(screen.getByRole('grid')).toBeInTheDocument());
1500
+ await waitFor(() => expect(screen.getByText('30')).toBeInTheDocument());
1501
+
1502
+ const cell = screen.getByText('30');
1503
+ await userEvent.dblClick(cell);
1504
+
1505
+ const editorInput = await screen.findByRole('textbox');
1506
+ await userEvent.clear(editorInput);
1507
+ await userEvent.type(editorInput, '150');
1508
+ await userEvent.keyboard('{Enter}');
1509
+
1510
+ await waitFor(() => {
1511
+ expect(onCellValueChanged).toHaveBeenCalled();
1512
+ });
1513
+
1514
+ const lastCellChangeEvent = onCellValueChanged.mock.calls.at(-1)?.[0];
1515
+ expect(lastCellChangeEvent?.oldValue).toBe(30);
1516
+ expect(lastCellChangeEvent?.newValue).toBe(100);
1517
+ });
1518
+
1519
+ test('clamps below-min number editor values when committing with enter', async () => {
1520
+ const onCellValueChanged = vi.fn();
1521
+ const columnDefs = [{
1522
+ field: 'age',
1523
+ headerName: 'Age',
1524
+ editable: true,
1525
+ cellDataType: 'number',
1526
+ cellEditor: 'dsNumberCellEditor',
1527
+ cellEditorParams: {
1528
+ min: 0,
1529
+ max: 100,
1530
+ step: 1,
1531
+ disableSpinners: true,
1532
+ },
1533
+ }];
1534
+ const rowData = [
1535
+ { id: 1, name: 'John Doe', age: 30 },
1536
+ { id: 2, name: 'Jane Smith', age: 25 },
1537
+ ];
1538
+
1539
+ render(
1540
+ <Table
1541
+ columnDefs={columnDefs}
1542
+ rowData={rowData}
1543
+ onCellValueChanged={onCellValueChanged}
1544
+ />,
1545
+ );
1546
+
1547
+ await waitFor(() => expect(screen.getByRole('grid')).toBeInTheDocument());
1548
+ await waitFor(() => expect(screen.getByText('30')).toBeInTheDocument());
1549
+
1550
+ const cell = screen.getByText('30');
1551
+ await userEvent.dblClick(cell);
1552
+
1553
+ const editorInput = await screen.findByRole('textbox');
1554
+ await userEvent.clear(editorInput);
1555
+ await userEvent.type(editorInput, '-5');
1556
+ await userEvent.keyboard('{Enter}');
1557
+
1558
+ await waitFor(() => {
1559
+ expect(onCellValueChanged).toHaveBeenCalled();
1560
+ });
1561
+
1562
+ const lastCellChangeEvent = onCellValueChanged.mock.calls.at(-1)?.[0];
1563
+ expect(lastCellChangeEvent?.oldValue).toBe(30);
1564
+ expect(lastCellChangeEvent?.newValue).toBe(0);
1565
+ });
1566
+
1567
+ test('does not clamp in-progress number editor typing before commit', async () => {
1568
+ const onCellValueChanged = vi.fn();
1569
+ const columnDefs = [{
1570
+ field: 'age',
1571
+ headerName: 'Age',
1572
+ editable: true,
1573
+ cellDataType: 'number',
1574
+ cellEditor: 'dsNumberCellEditor',
1575
+ cellEditorParams: {
1576
+ min: 50,
1577
+ max: 100,
1578
+ step: 1,
1579
+ disableSpinners: true,
1580
+ },
1581
+ }];
1582
+ const rowData = [
1583
+ { id: 1, name: 'John Doe', age: 60 },
1584
+ { id: 2, name: 'Jane Smith', age: 25 },
1585
+ ];
1586
+
1587
+ render(
1588
+ <Table
1589
+ columnDefs={columnDefs}
1590
+ rowData={rowData}
1591
+ onCellValueChanged={onCellValueChanged}
1592
+ />,
1593
+ );
1594
+
1595
+ await waitFor(() => expect(screen.getByRole('grid')).toBeInTheDocument());
1596
+ await waitFor(() => expect(screen.getByText('60')).toBeInTheDocument());
1597
+
1598
+ const cell = screen.getByText('60');
1599
+ await userEvent.dblClick(cell);
1600
+
1601
+ const editorInput = await screen.findByRole('textbox');
1602
+ await userEvent.clear(editorInput);
1603
+ await userEvent.type(editorInput, '6');
1604
+ expect(editorInput).toHaveValue('6');
1605
+ await userEvent.type(editorInput, '5');
1606
+ await userEvent.keyboard('{Enter}');
1607
+
1608
+ await waitFor(() => {
1609
+ expect(onCellValueChanged).toHaveBeenCalled();
1610
+ });
1611
+
1612
+ const lastCellChangeEvent = onCellValueChanged.mock.calls.at(-1)?.[0];
1613
+ expect(lastCellChangeEvent?.oldValue).toBe(60);
1614
+ expect(lastCellChangeEvent?.newValue).toBe(65);
1615
+ });
1616
+
1617
+ test('supports clearing number editor values and committing null', async () => {
1618
+ const onCellValueChanged = vi.fn();
1619
+ const columnDefs = [{
1620
+ field: 'age',
1621
+ headerName: 'Age',
1622
+ editable: true,
1623
+ cellDataType: 'number',
1624
+ cellEditor: 'dsNumberCellEditor',
1625
+ cellEditorParams: {
1626
+ min: 0,
1627
+ max: 100,
1628
+ step: 1,
1629
+ disableSpinners: true,
1630
+ },
1631
+ }];
1632
+ const rowData = [
1633
+ { id: 1, name: 'John Doe', age: 30 },
1634
+ { id: 2, name: 'Jane Smith', age: 25 },
1635
+ ];
1636
+
1637
+ render(
1638
+ <Table
1639
+ columnDefs={columnDefs}
1640
+ rowData={rowData}
1641
+ onCellValueChanged={onCellValueChanged}
1642
+ />,
1643
+ );
1644
+
1645
+ await waitFor(() => expect(screen.getByRole('grid')).toBeInTheDocument());
1646
+ await waitFor(() => expect(screen.getByText('30')).toBeInTheDocument());
1647
+
1648
+ const cell = screen.getByText('30');
1649
+ await userEvent.dblClick(cell);
1650
+
1651
+ const editorInput = await screen.findByRole('textbox');
1652
+ expect(screen.queryByLabelText('Plus button')).not.toBeInTheDocument();
1653
+ expect(screen.queryByLabelText('Minus button')).not.toBeInTheDocument();
1654
+
1655
+ await userEvent.clear(editorInput);
1656
+ await userEvent.keyboard('{Enter}');
1657
+
1658
+ await waitFor(() => {
1659
+ expect(onCellValueChanged).toHaveBeenCalled();
1660
+ });
1661
+
1662
+ expect(onCellValueChanged).toHaveBeenLastCalledWith(expect.objectContaining({ oldValue: 30, newValue: null }));
1663
+ });
1409
1664
  });
1410
1665
 
1411
1666
  /**
@@ -2,7 +2,7 @@ import { AllEnterpriseModule, ModuleRegistry, type GridApi } from 'ag-grid-enter
2
2
  import { AgGridReact, type AgGridReactProps } from 'ag-grid-react';
3
3
  import { defaultTheme } from './theme/defaultTheme';
4
4
  import classNames from 'classnames';
5
- import { useRef, useState, type ReactNode } from 'react';
5
+ import { useContext, useRef, useState, type ReactNode } from 'react';
6
6
  import { TableFooter } from './TableFooter';
7
7
  import { TableHeader } from './TableHeader';
8
8
  import { GridApiContext } from './GridApiContext';
@@ -14,8 +14,10 @@ import { BulkActionsDropdown } from './tableControls/BulkActionsDropdown';
14
14
  import { HideColumnsDropdown } from './tableControls/HideColumnsDropdown';
15
15
  import { useTableSettings, type UseTableSettingsParams } from './useTableSettings';
16
16
  import { setAgGridLicenseKey } from 'Utils/setAgGridLicenseKey';
17
+ import { PopupParentContext } from 'Utils/PopupParentContext';
17
18
  import { toggleRowSelectionInCurrentRange } from './toggleRowSelectionInCurrentRange';
18
19
  import { defaultValueFormatter, DSDefaultColDef, shouldSuppressFocus } from './DSDefaultColDef';
20
+ import { NumberCellEditor } from './cellEditors/NumberCellEditor';
19
21
  import { ButtonCellRenderer } from './cellRenderers/ButtonCellRenderer';
20
22
  import { InlineTextCellRenderer } from './cellRenderers/InlineTextCellRenderer';
21
23
  import { SelectDropdownCellRenderer } from './cellRenderers/SelectDropdownCellRenderer';
@@ -24,7 +26,7 @@ import { focusFirstFocusableElement } from 'Utils/focusFirstFocusableElement';
24
26
  import { BooleanFilter } from './columnFilters/BooleanFilter/BooleanFilter';
25
27
  import { TimeFilter } from './columnFilters/TimeFilter/TimeFilter';
26
28
  import { DateCellEditor } from './cellEditors/DateCellEditor';
27
- import { TableSettingsDropdown } from './tableControls/TableSettingsDropdown';
29
+ import { TableSettingsDropdown, TABLE_SETTINGS_ITEMS } from './tableControls/TableSettingsDropdown';
28
30
  import { TableControls, type TableControlsProps, type BulkAction as BulkActionType } from './tableControls/TableControls';
29
31
  import type { HideColumnsDropdownProps } from './tableControls/HideColumnsDropdown';
30
32
  import { TABLE_SPACING } from './tableConsts';
@@ -45,6 +47,7 @@ type TableProps<TData = any> = {
45
47
  'enableSimultaneousRangeAndRowSelection'?: boolean;
46
48
  'disableDragSelect'?: boolean;
47
49
  'tableTheme'?: string;
50
+ 'verticalHeaderText'?: boolean;
48
51
  } & UseTableSettingsParams & AgGridReactProps<TData>;
49
52
 
50
53
  setAgGridLicenseKey();
@@ -76,6 +79,8 @@ export const Table = (props: TableProps) => {
76
79
  components = {},
77
80
  tableTheme,
78
81
  onCellFocused,
82
+ verticalHeaderText = false,
83
+ className: propsClassName,
79
84
  ...rest
80
85
  } = props;
81
86
 
@@ -83,6 +88,8 @@ export const Table = (props: TableProps) => {
83
88
 
84
89
  const [searchValue, setSearchValue] = useState('');
85
90
 
91
+ const popupParentRef = useContext(PopupParentContext);
92
+
86
93
  const {
87
94
  settings,
88
95
  resetSettings,
@@ -146,11 +153,13 @@ export const Table = (props: TableProps) => {
146
153
  )}
147
154
  <AgGridReact
148
155
  theme={getTheme()}
156
+ popupParent={popupParentRef.current}
149
157
  onGridReady={(event) => {
150
158
  const { api } = event;
151
159
  setGridApi(api);
152
160
  onGridReady?.(event);
153
161
  }}
162
+ className={classNames('ds-table', { 'ds-table--vertical-header-text': verticalHeaderText }, propsClassName)}
154
163
  enableFilterHandlers
155
164
  suppressPaginationPanel
156
165
  onCellSelectionChanged={(event) => {
@@ -185,6 +194,7 @@ export const Table = (props: TableProps) => {
185
194
  dsSelectDropdownCellRenderer: SelectDropdownCellRenderer,
186
195
  dsBooleanFilter: BooleanFilter,
187
196
  dsTimeFilter: TimeFilter,
197
+ dsNumberCellEditor: NumberCellEditor,
188
198
  dsDateCellEditor: DateCellEditor,
189
199
  dsCheckboxCellRenderer: CheckboxCellRenderer,
190
200
  dsBooleanCellRenderer: BooleanCellRenderer,
@@ -211,6 +221,8 @@ Table.RowCountInfo = RowCountInfo;
211
221
  Table.BulkActionsDropdown = BulkActionsDropdown;
212
222
  Table.HideColumnsDropdown = HideColumnsDropdown;
213
223
  Table.ButtonCellRenderer = ButtonCellRenderer;
224
+ Table.InlineTextCellRenderer = InlineTextCellRenderer;
225
+ Table.SelectDropdownCellRenderer = SelectDropdownCellRenderer;
214
226
  Table.BooleanCellRenderer = BooleanCellRenderer;
215
227
  Table.DefaultCellRenderer = DefaultCellRenderer;
216
228
  Table.DateCellEditor = DateCellEditor;
@@ -222,6 +234,7 @@ Table.TableSettingsDropdown = TableSettingsDropdown;
222
234
  Table.TableControls = TableControls;
223
235
 
224
236
  Table.Spacing = TABLE_SPACING;
237
+ Table.SettingsItems = TABLE_SETTINGS_ITEMS;
225
238
 
226
239
  export namespace Table {
227
240
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -0,0 +1,196 @@
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
+ import { fn } from 'storybook/test';
12
+ import { TableFooter } from './TableFooter';
13
+ import { PaginationPanel } from './pagination/PaginationPanel';
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Docs page content
17
+ // ---------------------------------------------------------------------------
18
+
19
+ const DESCRIPTION_INTRO = [
20
+ '`TableFooter` is the pre-composed footer slot for the Arbor data table.',
21
+ 'It renders a `<footer>` element and accepts any `children` (typically a `<PaginationPanel />` element).',
22
+ '',
23
+ 'Pass the entire `<TableFooter />` element as the `footerContent` prop of `<Table />`.',
24
+ ].join('\n');
25
+
26
+ const USAGE_GUIDANCE = [
27
+ '### When to use',
28
+ '',
29
+ '- As the `footerContent` of a `<Table />` when you need a standard footer region',
30
+ '- When you want to wrap `<PaginationPanel />` in the footer slot',
31
+ '- When you need custom footer content beyond pagination controls',
32
+ '',
33
+ '---',
34
+ '',
35
+ '### When NOT to use',
36
+ '',
37
+ '| Situation | Alternative |',
38
+ '|---|---|',
39
+ '| You only need pagination | Pass `<PaginationPanel />` directly as `footerContent` |',
40
+ '| The table has no footer | Omit `footerContent` entirely |',
41
+ '',
42
+ '---',
43
+ '',
44
+ '### Props summary',
45
+ '',
46
+ '| Prop | Description |',
47
+ '|---|---|',
48
+ '| `children` | Content rendered inside the footer — typically `<PaginationPanel />` |',
49
+ '| `className` | Additional CSS class name(s) on the root `<footer>` element |',
50
+ ].join('\n');
51
+
52
+ const DEVELOPER_NOTES = [
53
+ '### Wiring into `<Table />`',
54
+ '',
55
+ '```tsx',
56
+ "import { Table, TableFooter, PaginationPanel } from '@arbor-education/design-system.components';",
57
+ '',
58
+ 'function MyTable() {',
59
+ ' return (',
60
+ ' <Table',
61
+ ' rowData={rows}',
62
+ ' columnDefs={colDefs}',
63
+ ' footerContent={(',
64
+ ' <TableFooter>',
65
+ ' <PaginationPanel',
66
+ ' availableSizes={[10, 25, 50, 100]}',
67
+ ' initialPageSize={25}',
68
+ ' onPageSizeChange={setPageSize}',
69
+ ' />',
70
+ ' </TableFooter>',
71
+ ' )}',
72
+ ' />',
73
+ ' );',
74
+ '}',
75
+ '```',
76
+ '',
77
+ '---',
78
+ '',
79
+ '### `TableFooter` vs passing `<PaginationPanel />` directly',
80
+ '',
81
+ '`<TableFooter />` adds the `ds-table__footer` class and `<footer>` semantic element around its',
82
+ 'children. If you only need pagination, passing `<PaginationPanel />` directly as `footerContent`',
83
+ 'is also valid — `<Table />` renders `footerContent` inside its own footer region.',
84
+ ].join('\n');
85
+
86
+ const RELATED_COMPONENTS = [
87
+ '## Related components',
88
+ '',
89
+ '[Table](?path=/docs/components-table--docs) · [PaginationPanel](?path=/docs/components-table-paginationpanel--docs) · [TableHeader](?path=/docs/components-table-tableheader--docs)',
90
+ ].join('\n');
91
+
92
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel. `TableFooter` is a thin layout wrapper — its main value is the semantic `<footer>` element and `ds-table__footer` class it applies around its children.';
93
+
94
+ // ---------------------------------------------------------------------------
95
+ // Custom DocsPage
96
+ // ---------------------------------------------------------------------------
97
+
98
+ function TableFooterDocsPage() {
99
+ return (
100
+ <>
101
+ <Title />
102
+ <Subtitle />
103
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
104
+ <DocHeading>Interactive example</DocHeading>
105
+ <Markdown>{PROPS_INTRO}</Markdown>
106
+ <DocPrimary />
107
+ <Controls />
108
+ <DocHeading>Usage guidance</DocHeading>
109
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
110
+ <DocHeading>Developer notes</DocHeading>
111
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
112
+ <DocHeading>Examples</DocHeading>
113
+ <Stories title="" />
114
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
115
+ </>
116
+ );
117
+ }
118
+
119
+ // ---------------------------------------------------------------------------
120
+ // Meta
121
+ // ---------------------------------------------------------------------------
122
+
123
+ const meta = {
124
+ title: 'Components/Table/TableFooter',
125
+ component: TableFooter,
126
+ tags: ['autodocs'],
127
+ parameters: {
128
+ layout: 'padded',
129
+ docs: { page: TableFooterDocsPage },
130
+ },
131
+ argTypes: {
132
+ children: {
133
+ description: 'Content rendered inside the footer. Typically a `<PaginationPanel />` element.',
134
+ control: false,
135
+ table: { type: { summary: 'ReactNode' }, defaultValue: { summary: 'undefined' } },
136
+ },
137
+ className: {
138
+ description: 'Additional CSS class name(s) to apply to the root `<footer>` element.',
139
+ control: 'text',
140
+ table: { type: { summary: 'string' }, defaultValue: { summary: 'undefined' } },
141
+ },
142
+ },
143
+ } satisfies Meta<typeof TableFooter>;
144
+
145
+ export default meta;
146
+ type Story = StoryObj<typeof TableFooter>;
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Helper
150
+ // ---------------------------------------------------------------------------
151
+
152
+ const withDescription = (story: Story, description: string): Story => ({
153
+ ...story,
154
+ parameters: {
155
+ ...story.parameters,
156
+ docs: { ...story.parameters?.docs, description: { story: description } },
157
+ },
158
+ });
159
+
160
+ // ---------------------------------------------------------------------------
161
+ // Stories
162
+ // ---------------------------------------------------------------------------
163
+
164
+ export const Default: Story = withDescription(
165
+ {
166
+ args: {
167
+ children: (
168
+ <PaginationPanel
169
+ totalPages={10}
170
+ onPageChange={fn()}
171
+ availableSizes={[10, 25, 50, 100]}
172
+ initialPageSize={25}
173
+ onPageSizeChange={fn()}
174
+ />
175
+ ),
176
+ },
177
+ },
178
+ 'The canonical usage — `TableFooter` wrapping a `<PaginationPanel />`. '
179
+ + '`RowCountInfo` (the row count text) is not visible in this standalone preview because it '
180
+ + 'requires `GridApiContext` provided by a wrapping `<Table />`.',
181
+ );
182
+
183
+ export const WithCustomContent: Story = withDescription(
184
+ {
185
+ parameters: { controls: { disable: true } },
186
+ args: {
187
+ children: (
188
+ <span style={{ padding: '8px 16px', fontSize: '14px', color: 'var(--color-neutral-500)' }}>
189
+ Custom footer content — e.g. totals, status messages, or secondary actions
190
+ </span>
191
+ ),
192
+ },
193
+ },
194
+ '`TableFooter` accepts any `ReactNode` as `children` — not just `PaginationPanel`. '
195
+ + 'Use it to add totals rows, status messages, or any other custom footer content.',
196
+ );