@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
@@ -0,0 +1,268 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import {
4
+ Controls,
5
+ Heading as DocHeading,
6
+ Markdown,
7
+ Primary as DocPrimary,
8
+ Stories,
9
+ Subtitle,
10
+ Title,
11
+ } from '@storybook/addon-docs/blocks';
12
+ import { fn } from 'storybook/test';
13
+ import { BooleanFilter, doesBooleanFilterPass } from './BooleanFilter/BooleanFilter';
14
+ import { Table } from 'Components/table/Table';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Docs page content
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const DESCRIPTION_INTRO = [
21
+ '`BooleanFilter` is an AG Grid column filter component for boolean columns.',
22
+ 'It renders a radio group with three options — **Yes**, **No**, and **Not set** —',
23
+ 'and calls `onModelChange` with a `{ allowTrue, allowFalse }` model whenever the selection changes.',
24
+ '',
25
+ 'Register it via the AG Grid `filter` column definition property alongside `doesBooleanFilterPass`.',
26
+ ].join('\n');
27
+
28
+ const USAGE_GUIDANCE = [
29
+ '### When to use',
30
+ '',
31
+ '- On boolean columns (active/inactive, yes/no flags) that need a user-friendly filter UI',
32
+ '- When you want a three-state filter: show all `true`, show all `false`, or show everything',
33
+ '',
34
+ '---',
35
+ '',
36
+ '### Registration',
37
+ '',
38
+ '```tsx',
39
+ "import { BooleanFilter, doesBooleanFilterPass } from '@arbor-education/design-system.components';",
40
+ '',
41
+ 'const colDefs = [',
42
+ ' {',
43
+ " field: 'isActive',",
44
+ ' filter: { component: BooleanFilter, doesFilterPass: doesBooleanFilterPass },',
45
+ ' },',
46
+ '];',
47
+ '```',
48
+ '',
49
+ '---',
50
+ '',
51
+ '### Filter model',
52
+ '',
53
+ '```ts',
54
+ 'type BooleanFilterModel = {',
55
+ ' allowTrue: boolean;',
56
+ ' allowFalse: boolean;',
57
+ '};',
58
+ '',
59
+ '// Yes selected: { allowTrue: true, allowFalse: false }',
60
+ '// No selected: { allowTrue: false, allowFalse: true }',
61
+ '// Not set / All: { allowTrue: true, allowFalse: true }',
62
+ '```',
63
+ ].join('\n');
64
+
65
+ const RELATED_COMPONENTS = [
66
+ '## Related components',
67
+ '',
68
+ '[Table](?path=/docs/components-table--docs) · [TimeFilter](?path=/docs/components-table-columnfilters-timefilter--docs)',
69
+ ].join('\n');
70
+
71
+ const PROPS_INTRO = 'The preview below is interactive — click the radio buttons to see the filter model update in the **Actions** panel.';
72
+
73
+ // ---------------------------------------------------------------------------
74
+ // Custom DocsPage
75
+ // ---------------------------------------------------------------------------
76
+
77
+ function BooleanFilterDocsPage() {
78
+ return (
79
+ <>
80
+ <Title />
81
+ <Subtitle />
82
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
83
+ <DocHeading>Interactive example</DocHeading>
84
+ <Markdown>{PROPS_INTRO}</Markdown>
85
+ <DocPrimary />
86
+ <Controls />
87
+ <DocHeading>Usage guidance</DocHeading>
88
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
89
+ <DocHeading>Examples</DocHeading>
90
+ <Stories title="" />
91
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
92
+ </>
93
+ );
94
+ }
95
+
96
+ // ---------------------------------------------------------------------------
97
+ // Meta
98
+ // ---------------------------------------------------------------------------
99
+
100
+ const meta = {
101
+ title: 'Components/Table/ColumnFilters/BooleanFilter',
102
+ component: BooleanFilter,
103
+ tags: ['autodocs'],
104
+ parameters: {
105
+ layout: 'padded',
106
+ docs: { page: BooleanFilterDocsPage },
107
+ },
108
+ argTypes: {
109
+ model: {
110
+ description: 'The current filter model. `null` means no filter is active (same as Not set). Pass `{ allowTrue, allowFalse }` to set a specific state.',
111
+ control: false,
112
+ table: { type: { summary: '{ allowTrue: boolean; allowFalse: boolean } | null' }, defaultValue: { summary: 'null' } },
113
+ },
114
+ onModelChange: {
115
+ description: 'Called whenever the user changes the filter selection. Receives the new `{ allowTrue, allowFalse }` model.',
116
+ control: false,
117
+ table: { type: { summary: '(model: BooleanFilterModel) => void' } },
118
+ },
119
+ },
120
+ args: {
121
+ onModelChange: fn(),
122
+ },
123
+ } satisfies Meta<typeof BooleanFilter>;
124
+
125
+ export default meta;
126
+ type Story = StoryObj<typeof BooleanFilter>;
127
+
128
+ const withDescription = (story: Story, description: string): Story => ({
129
+ ...story,
130
+ parameters: {
131
+ ...story.parameters,
132
+ docs: { ...story.parameters?.docs, description: { story: description } },
133
+ },
134
+ });
135
+
136
+ // ---------------------------------------------------------------------------
137
+ // Stories
138
+ // ---------------------------------------------------------------------------
139
+
140
+ export const Default: Story = withDescription(
141
+ {
142
+ args: {
143
+ model: null,
144
+ onModelChange: fn(),
145
+ },
146
+ },
147
+ 'No active filter (`model: null`) — all three options visible, **Not set** selected by default.',
148
+ );
149
+
150
+ export const YesSelected: Story = withDescription(
151
+ {
152
+ parameters: { controls: { disable: true } },
153
+ args: {
154
+ model: { allowTrue: true, allowFalse: false },
155
+ onModelChange: fn(),
156
+ },
157
+ },
158
+ '**Yes** selected — filter model is `{ allowTrue: true, allowFalse: false }`. Only rows with `true` in this column pass the filter.',
159
+ );
160
+
161
+ export const NoSelected: Story = withDescription(
162
+ {
163
+ parameters: { controls: { disable: true } },
164
+ args: {
165
+ model: { allowTrue: false, allowFalse: true },
166
+ onModelChange: fn(),
167
+ },
168
+ },
169
+ '**No** selected — filter model is `{ allowTrue: false, allowFalse: true }`. Only rows with `false` in this column pass the filter.',
170
+ );
171
+
172
+ export const Controlled: Story = withDescription(
173
+ {
174
+ parameters: { controls: { disable: true } },
175
+ render: () => {
176
+ const [model, setModel] = React.useState<{ allowTrue: boolean; allowFalse: boolean } | null>(null);
177
+ return (
178
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
179
+ <BooleanFilter model={model} onModelChange={setModel} />
180
+ <pre style={{ fontSize: '12px', background: 'var(--color-neutral-50)', padding: '8px', borderRadius: '4px' }}>
181
+ {JSON.stringify(model, null, 2) ?? 'null'}
182
+ </pre>
183
+ </div>
184
+ );
185
+ },
186
+ },
187
+ 'Fully controlled — the current model is rendered below the filter as JSON. Click the radio buttons to see the model update.',
188
+ );
189
+
190
+ const BOOLEAN_FILTER_IN_TABLE_DATA = [
191
+ { name: 'Alice Johnson', active: true },
192
+ { name: 'Bob Smith', active: false },
193
+ { name: 'Charlie Brown', active: true },
194
+ { name: 'Diana Prince', active: false },
195
+ { name: 'Ethan Hunt', active: true },
196
+ ];
197
+
198
+ export const InATable: Story = withDescription(
199
+ {
200
+ parameters: {
201
+ controls: { disable: true },
202
+ docs: {
203
+ source: {
204
+ language: 'tsx',
205
+ code: `
206
+ import {
207
+ Table,
208
+ BooleanFilter,
209
+ doesBooleanFilterPass,
210
+ } from '@arbor-education/design-system.components';
211
+
212
+ const rowData = [
213
+ { name: 'Alice Johnson', active: true },
214
+ { name: 'Bob Smith', active: false },
215
+ { name: 'Charlie Brown', active: true },
216
+ { name: 'Diana Prince', active: false },
217
+ { name: 'Ethan Hunt', active: true },
218
+ ];
219
+
220
+ function BooleanFilterExample() {
221
+ return (
222
+ <Table
223
+ rowData={rowData}
224
+ columnDefs={[
225
+ { field: 'name', headerName: 'Name', flex: 2 },
226
+ {
227
+ field: 'active',
228
+ headerName: 'Active',
229
+ flex: 1,
230
+ editable: false,
231
+ cellRenderer: 'dsBooleanCellRenderer',
232
+ filter: { component: BooleanFilter, doesFilterPass: doesBooleanFilterPass },
233
+ suppressHeaderFilterButton: false,
234
+ },
235
+ ]}
236
+ defaultColDef={{ flex: 1, minWidth: 120, suppressHeaderFilterButton: true }}
237
+ domLayout="autoHeight"
238
+ />
239
+ );
240
+ }
241
+
242
+ export default BooleanFilterExample;
243
+ `.trim(),
244
+ },
245
+ },
246
+ },
247
+ render: () => (
248
+ <Table
249
+ rowData={BOOLEAN_FILTER_IN_TABLE_DATA}
250
+ columnDefs={[
251
+ { field: 'name', headerName: 'Name', flex: 2 },
252
+ {
253
+ field: 'active',
254
+ headerName: 'Active',
255
+ flex: 1,
256
+ editable: false,
257
+ cellRenderer: 'dsBooleanCellRenderer',
258
+ filter: { component: BooleanFilter, doesFilterPass: doesBooleanFilterPass },
259
+ suppressHeaderFilterButton: false,
260
+ },
261
+ ]}
262
+ defaultColDef={{ flex: 1, minWidth: 120, suppressHeaderFilterButton: true }}
263
+ domLayout="autoHeight"
264
+ />
265
+ ),
266
+ },
267
+ '`BooleanFilter` wired up inside a full `Table`. Click the funnel icon in the **Active** column header to open the filter panel — select **Yes**, **No**, or **Not set** to filter the rows. The Active column also uses `dsBooleanCellRenderer` to show check/✕ icons.',
268
+ );
@@ -0,0 +1,281 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import {
4
+ Controls,
5
+ Heading as DocHeading,
6
+ Markdown,
7
+ Primary as DocPrimary,
8
+ Stories,
9
+ Subtitle,
10
+ Title,
11
+ } from '@storybook/addon-docs/blocks';
12
+ import { fn } from 'storybook/test';
13
+ import { TimeFilter, doesTimeFilterPass } from './TimeFilter/TimeFilter';
14
+ import { Table } from 'Components/table/Table';
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Docs page content
18
+ // ---------------------------------------------------------------------------
19
+
20
+ const DESCRIPTION_INTRO = [
21
+ '`TimeFilter` is an AG Grid column filter component for time-string columns.',
22
+ 'It renders a filter-type selector (**Before**, **After**, **At**) and a time input,',
23
+ 'then calls `onModelChange` with a `{ filterType, pivot }` model when either changes.',
24
+ '',
25
+ 'Register it via the AG Grid `filter` column definition property alongside `doesTimeFilterPass`.',
26
+ ].join('\n');
27
+
28
+ const USAGE_GUIDANCE = [
29
+ '### When to use',
30
+ '',
31
+ '- On columns containing time strings (e.g. `"09:30"`, `"14:45"`) that need a time-based filter',
32
+ '- When users need to find rows before, after, or at a specific time',
33
+ '',
34
+ '---',
35
+ '',
36
+ '### Registration',
37
+ '',
38
+ '```tsx',
39
+ "import { TimeFilter, doesTimeFilterPass } from '@arbor-education/design-system.components';",
40
+ '',
41
+ 'const colDefs = [',
42
+ ' {',
43
+ " field: 'startTime',",
44
+ ' filter: { component: TimeFilter, doesFilterPass: doesTimeFilterPass },',
45
+ ' },',
46
+ '];',
47
+ '```',
48
+ '',
49
+ '---',
50
+ '',
51
+ '### Filter model',
52
+ '',
53
+ '```ts',
54
+ 'type TimeFilterModel = {',
55
+ " filterType: 'before' | 'after' | 'equal';",
56
+ ' pivot: string; // HH:mm format, e.g. "09:30"',
57
+ '};',
58
+ '```',
59
+ '',
60
+ '---',
61
+ '',
62
+ '### `doesTimeFilterPass`',
63
+ '',
64
+ '`doesTimeFilterPass` is the companion filter function. Import it alongside `TimeFilter` and pass',
65
+ 'it to `doesFilterPass` in your column definition. It compares the cell value (time string or `Date`)',
66
+ 'against the `pivot` using the selected `filterType`.',
67
+ ].join('\n');
68
+
69
+ const RELATED_COMPONENTS = [
70
+ '## Related components',
71
+ '',
72
+ '[Table](?path=/docs/components-table--docs) · [BooleanFilter](?path=/docs/components-table-columnfilters-booleanfilter--docs)',
73
+ ].join('\n');
74
+
75
+ const PROPS_INTRO = 'The preview below is interactive — change the filter type or time value to see the model update in the **Actions** panel.';
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // Custom DocsPage
79
+ // ---------------------------------------------------------------------------
80
+
81
+ function TimeFilterDocsPage() {
82
+ return (
83
+ <>
84
+ <Title />
85
+ <Subtitle />
86
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
87
+ <DocHeading>Interactive example</DocHeading>
88
+ <Markdown>{PROPS_INTRO}</Markdown>
89
+ <DocPrimary />
90
+ <Controls />
91
+ <DocHeading>Usage guidance</DocHeading>
92
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
93
+ <DocHeading>Examples</DocHeading>
94
+ <Stories title="" />
95
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
96
+ </>
97
+ );
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // Meta
102
+ // ---------------------------------------------------------------------------
103
+
104
+ const meta = {
105
+ title: 'Components/Table/ColumnFilters/TimeFilter',
106
+ component: TimeFilter,
107
+ tags: ['autodocs'],
108
+ parameters: {
109
+ layout: 'padded',
110
+ docs: { page: TimeFilterDocsPage },
111
+ },
112
+ argTypes: {
113
+ model: {
114
+ description: 'The current filter model. `null` means no filter is active. Provide `{ filterType, pivot }` to pre-set the filter.',
115
+ control: false,
116
+ table: { type: { summary: '{ filterType: "before" | "after" | "equal"; pivot: string } | null' }, defaultValue: { summary: 'null' } },
117
+ },
118
+ onModelChange: {
119
+ description: 'Called whenever the user changes the filter type or time value. Receives the new `{ filterType, pivot }` model.',
120
+ control: false,
121
+ table: { type: { summary: '(model: TimeFilterModel) => void' } },
122
+ },
123
+ },
124
+ args: {
125
+ onModelChange: fn(),
126
+ },
127
+ } satisfies Meta<typeof TimeFilter>;
128
+
129
+ export default meta;
130
+ type Story = StoryObj<typeof TimeFilter>;
131
+
132
+ const withDescription = (story: Story, description: string): Story => ({
133
+ ...story,
134
+ parameters: {
135
+ ...story.parameters,
136
+ docs: { ...story.parameters?.docs, description: { story: description } },
137
+ },
138
+ });
139
+
140
+ // ---------------------------------------------------------------------------
141
+ // Stories
142
+ // ---------------------------------------------------------------------------
143
+
144
+ export const Default: Story = withDescription(
145
+ {
146
+ args: {
147
+ model: null,
148
+ onModelChange: fn(),
149
+ },
150
+ },
151
+ 'No active filter (`model: null`) — filter type defaults to **Before**, time input is empty.',
152
+ );
153
+
154
+ export const BeforeNoon: Story = withDescription(
155
+ {
156
+ parameters: { controls: { disable: true } },
157
+ args: {
158
+ model: { filterType: 'before', pivot: '12:00' },
159
+ onModelChange: fn(),
160
+ },
161
+ },
162
+ '**Before 12:00** — shows rows where the cell value is a time before noon.',
163
+ );
164
+
165
+ export const AfterNine: Story = withDescription(
166
+ {
167
+ parameters: { controls: { disable: true } },
168
+ args: {
169
+ model: { filterType: 'after', pivot: '09:00' },
170
+ onModelChange: fn(),
171
+ },
172
+ },
173
+ '**After 09:00** — shows rows where the cell value is a time after 9am.',
174
+ );
175
+
176
+ export const ExactTime: Story = withDescription(
177
+ {
178
+ parameters: { controls: { disable: true } },
179
+ args: {
180
+ model: { filterType: 'equal', pivot: '14:30' },
181
+ onModelChange: fn(),
182
+ },
183
+ },
184
+ '**At 14:30** — shows rows where the cell value exactly matches the pivot time.',
185
+ );
186
+
187
+ export const Controlled: Story = withDescription(
188
+ {
189
+ parameters: { controls: { disable: true } },
190
+ render: () => {
191
+ const [model, setModel] = React.useState<{ filterType: 'before' | 'after' | 'equal'; pivot: string } | null>(null);
192
+ return (
193
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>
194
+ <TimeFilter model={model} onModelChange={setModel} />
195
+ <pre style={{ fontSize: '12px', background: 'var(--color-neutral-50)', padding: '8px', borderRadius: '4px' }}>
196
+ {model ? JSON.stringify(model, null, 2) : 'null'}
197
+ </pre>
198
+ </div>
199
+ );
200
+ },
201
+ },
202
+ 'Fully controlled — the current model is rendered below the filter as JSON. Interact with the filter to see the model update in real time.',
203
+ );
204
+
205
+ const TIME_FILTER_IN_TABLE_DATA = [
206
+ { pupil: 'Alice Johnson', registrationTime: '08:45' },
207
+ { pupil: 'Bob Smith', registrationTime: '09:15' },
208
+ { pupil: 'Charlie Brown', registrationTime: '09:00' },
209
+ { pupil: 'Diana Prince', registrationTime: '10:30' },
210
+ { pupil: 'Ethan Hunt', registrationTime: '08:30' },
211
+ ];
212
+
213
+ export const InATable: Story = withDescription(
214
+ {
215
+ parameters: {
216
+ controls: { disable: true },
217
+ docs: {
218
+ source: {
219
+ language: 'tsx',
220
+ code: `
221
+ import {
222
+ Table,
223
+ TimeFilter,
224
+ doesTimeFilterPass,
225
+ } from '@arbor-education/design-system.components';
226
+
227
+ const rowData = [
228
+ { pupil: 'Alice Johnson', registrationTime: '08:45' },
229
+ { pupil: 'Bob Smith', registrationTime: '09:15' },
230
+ { pupil: 'Charlie Brown', registrationTime: '09:00' },
231
+ { pupil: 'Diana Prince', registrationTime: '10:30' },
232
+ { pupil: 'Ethan Hunt', registrationTime: '08:30' },
233
+ ];
234
+
235
+ function TimeFilterExample() {
236
+ return (
237
+ <Table
238
+ rowData={rowData}
239
+ columnDefs={[
240
+ { field: 'pupil', headerName: 'Pupil', flex: 2 },
241
+ {
242
+ field: 'registrationTime',
243
+ headerName: 'Registration time',
244
+ flex: 1,
245
+ editable: false,
246
+ filter: { component: TimeFilter, doesFilterPass: doesTimeFilterPass },
247
+ suppressHeaderFilterButton: false,
248
+ },
249
+ ]}
250
+ defaultColDef={{ flex: 1, minWidth: 120, suppressHeaderFilterButton: true }}
251
+ domLayout="autoHeight"
252
+ />
253
+ );
254
+ }
255
+
256
+ export default TimeFilterExample;
257
+ `.trim(),
258
+ },
259
+ },
260
+ },
261
+ render: () => (
262
+ <Table
263
+ rowData={TIME_FILTER_IN_TABLE_DATA}
264
+ columnDefs={[
265
+ { field: 'pupil', headerName: 'Pupil', flex: 2 },
266
+ {
267
+ field: 'registrationTime',
268
+ headerName: 'Registration time',
269
+ flex: 1,
270
+ editable: false,
271
+ filter: { component: TimeFilter, doesFilterPass: doesTimeFilterPass },
272
+ suppressHeaderFilterButton: false,
273
+ },
274
+ ]}
275
+ defaultColDef={{ flex: 1, minWidth: 120, suppressHeaderFilterButton: true }}
276
+ domLayout="autoHeight"
277
+ />
278
+ ),
279
+ },
280
+ '`TimeFilter` wired up inside a full `Table`. Click the funnel icon in the **Registration time** column header to open the filter panel — choose **Before**, **After**, or **At** and enter a time (e.g. `09:00`) to filter the rows.',
281
+ );