@arbor-education/design-system.components 0.25.9 → 1.0.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 (461) hide show
  1. package/.gather/instructions/project-overview.md +1 -1
  2. package/.github/workflows/release.yml +3 -1
  3. package/.storybook/main.ts +12 -6
  4. package/CHANGELOG.md +20 -0
  5. package/CONTRIBUTING.md +7 -5
  6. package/component-library.md +97 -3
  7. package/dist/components/emptyState/EmptyState.d.ts +22 -0
  8. package/dist/components/emptyState/EmptyState.d.ts.map +1 -0
  9. package/dist/components/emptyState/EmptyState.js +11 -0
  10. package/dist/components/emptyState/EmptyState.js.map +1 -0
  11. package/dist/components/emptyState/EmptyState.stories.d.ts +117 -0
  12. package/dist/components/emptyState/EmptyState.stories.d.ts.map +1 -0
  13. package/dist/components/emptyState/EmptyState.stories.js +332 -0
  14. package/dist/components/emptyState/EmptyState.stories.js.map +1 -0
  15. package/dist/components/emptyState/EmptyState.test.d.ts +2 -0
  16. package/dist/components/emptyState/EmptyState.test.d.ts.map +1 -0
  17. package/dist/components/emptyState/EmptyState.test.js +80 -0
  18. package/dist/components/emptyState/EmptyState.test.js.map +1 -0
  19. package/dist/components/favourite/FavouriteButton.d.ts +18 -0
  20. package/dist/components/favourite/FavouriteButton.d.ts.map +1 -0
  21. package/dist/components/favourite/FavouriteButton.js +16 -0
  22. package/dist/components/favourite/FavouriteButton.js.map +1 -0
  23. package/dist/components/favourite/FavouriteButton.test.d.ts +2 -0
  24. package/dist/components/favourite/FavouriteButton.test.d.ts.map +1 -0
  25. package/dist/components/favourite/FavouriteButton.test.js +37 -0
  26. package/dist/components/favourite/FavouriteButton.test.js.map +1 -0
  27. package/dist/components/filterBar/FilterBar.d.ts +1 -1
  28. package/dist/components/filterBar/FilterBar.stories.d.ts +1 -1
  29. package/dist/components/icon/Icon.d.ts +1 -1
  30. package/dist/components/icon/Icon.d.ts.map +1 -1
  31. package/dist/components/icon/Icon.js +1 -1
  32. package/dist/components/icon/Icon.js.map +1 -1
  33. package/dist/components/pill/Pill.d.ts +3 -2
  34. package/dist/components/pill/Pill.d.ts.map +1 -1
  35. package/dist/components/pill/Pill.js +15 -9
  36. package/dist/components/pill/Pill.js.map +1 -1
  37. package/dist/components/pill/Pill.stories.d.ts +21 -3
  38. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  39. package/dist/components/pill/Pill.stories.js +275 -40
  40. package/dist/components/pill/Pill.stories.js.map +1 -1
  41. package/dist/components/pill/Pill.test.js +64 -3
  42. package/dist/components/pill/Pill.test.js.map +1 -1
  43. package/dist/components/sideNavigation/SideNavigation.d.ts +34 -0
  44. package/dist/components/sideNavigation/SideNavigation.d.ts.map +1 -0
  45. package/dist/components/sideNavigation/SideNavigation.js +30 -0
  46. package/dist/components/sideNavigation/SideNavigation.js.map +1 -0
  47. package/dist/components/sideNavigation/SideNavigation.stories.d.ts +72 -0
  48. package/dist/components/sideNavigation/SideNavigation.stories.d.ts.map +1 -0
  49. package/dist/components/sideNavigation/SideNavigation.stories.js +298 -0
  50. package/dist/components/sideNavigation/SideNavigation.stories.js.map +1 -0
  51. package/dist/components/sideNavigation/SideNavigation.test.d.ts +2 -0
  52. package/dist/components/sideNavigation/SideNavigation.test.d.ts.map +1 -0
  53. package/dist/components/sideNavigation/SideNavigation.test.js +74 -0
  54. package/dist/components/sideNavigation/SideNavigation.test.js.map +1 -0
  55. package/dist/components/sideNavigation/SideNavigationContext.d.ts +10 -0
  56. package/dist/components/sideNavigation/SideNavigationContext.d.ts.map +1 -0
  57. package/dist/components/sideNavigation/SideNavigationContext.js +15 -0
  58. package/dist/components/sideNavigation/SideNavigationContext.js.map +1 -0
  59. package/dist/components/{sidebarNav/SidebarNavGroup.d.ts → sideNavigation/SideNavigationGroup.d.ts} +3 -3
  60. package/dist/components/sideNavigation/SideNavigationGroup.d.ts.map +1 -0
  61. package/dist/components/sideNavigation/SideNavigationGroup.js +16 -0
  62. package/dist/components/sideNavigation/SideNavigationGroup.js.map +1 -0
  63. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts +2 -0
  64. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts.map +1 -0
  65. package/dist/components/sideNavigation/SideNavigationGroup.test.js +58 -0
  66. package/dist/components/sideNavigation/SideNavigationGroup.test.js.map +1 -0
  67. package/dist/components/{sidebarNav/SidebarNavItem.d.ts → sideNavigation/SideNavigationItem.d.ts} +11 -12
  68. package/dist/components/sideNavigation/SideNavigationItem.d.ts.map +1 -0
  69. package/dist/components/sideNavigation/SideNavigationItem.js +28 -0
  70. package/dist/components/sideNavigation/SideNavigationItem.js.map +1 -0
  71. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts +2 -0
  72. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts.map +1 -0
  73. package/dist/components/sideNavigation/SideNavigationItem.test.js +65 -0
  74. package/dist/components/sideNavigation/SideNavigationItem.test.js.map +1 -0
  75. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts +8 -0
  76. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts.map +1 -0
  77. package/dist/components/{sidebarNav/SidebarNavItemFavourite.js → sideNavigation/SideNavigationItemFavourite.js} +5 -5
  78. package/dist/components/sideNavigation/SideNavigationItemFavourite.js.map +1 -0
  79. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts +2 -0
  80. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts.map +1 -0
  81. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js +31 -0
  82. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js.map +1 -0
  83. package/dist/components/sideNavigation/SideNavigationTitle.d.ts +4 -0
  84. package/dist/components/sideNavigation/SideNavigationTitle.d.ts.map +1 -0
  85. package/dist/components/sideNavigation/SideNavigationTitle.js +7 -0
  86. package/dist/components/sideNavigation/SideNavigationTitle.js.map +1 -0
  87. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts +2 -0
  88. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts.map +1 -0
  89. package/dist/components/sideNavigation/SideNavigationTitle.test.js +22 -0
  90. package/dist/components/sideNavigation/SideNavigationTitle.test.js.map +1 -0
  91. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts +7 -0
  92. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts.map +1 -0
  93. package/dist/components/{sidebarNav/SidebarNavTooltip.js → sideNavigation/SideNavigationTooltip.js} +2 -2
  94. package/dist/components/sideNavigation/SideNavigationTooltip.js.map +1 -0
  95. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts +2 -0
  96. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts.map +1 -0
  97. package/dist/components/sideNavigation/SideNavigationTooltip.test.js +26 -0
  98. package/dist/components/sideNavigation/SideNavigationTooltip.test.js.map +1 -0
  99. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts +4 -0
  100. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts.map +1 -0
  101. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.js +5 -4
  102. package/dist/components/sideNavigation/resolvePanelItemProps.js.map +1 -0
  103. package/dist/components/sideNavigation/resolvePanelItemProps.test.d.ts.map +1 -0
  104. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.js +18 -4
  105. package/dist/components/sideNavigation/resolvePanelItemProps.test.js.map +1 -0
  106. package/dist/components/sideNavigation/types.d.ts +47 -0
  107. package/dist/components/sideNavigation/types.d.ts.map +1 -0
  108. package/dist/components/sideNavigation/types.js +2 -0
  109. package/dist/components/sideNavigation/types.js.map +1 -0
  110. package/dist/components/sidebar/Sidebar.d.ts +13 -0
  111. package/dist/components/sidebar/Sidebar.d.ts.map +1 -0
  112. package/dist/components/sidebar/Sidebar.js +9 -0
  113. package/dist/components/sidebar/Sidebar.js.map +1 -0
  114. package/dist/components/sidebar/Sidebar.stories.d.ts +48 -0
  115. package/dist/components/sidebar/Sidebar.stories.d.ts.map +1 -0
  116. package/dist/components/sidebar/Sidebar.stories.js +444 -0
  117. package/dist/components/sidebar/Sidebar.stories.js.map +1 -0
  118. package/dist/components/sidebar/Sidebar.test.d.ts +2 -0
  119. package/dist/components/sidebar/Sidebar.test.d.ts.map +1 -0
  120. package/dist/components/sidebar/Sidebar.test.js +81 -0
  121. package/dist/components/sidebar/Sidebar.test.js.map +1 -0
  122. package/dist/components/sidebar/SidebarItem.d.ts +7 -0
  123. package/dist/components/sidebar/SidebarItem.d.ts.map +1 -0
  124. package/dist/components/sidebar/SidebarItem.js +11 -0
  125. package/dist/components/sidebar/SidebarItem.js.map +1 -0
  126. package/dist/components/singleUser/SingleUser.d.ts +1 -1
  127. package/dist/components/table/Table.d.ts.map +1 -1
  128. package/dist/components/table/Table.js +2 -1
  129. package/dist/components/table/Table.js.map +1 -1
  130. package/dist/components/table/Table.stories.d.ts.map +1 -1
  131. package/dist/components/table/Table.stories.js +24 -70
  132. package/dist/components/table/Table.stories.js.map +1 -1
  133. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -1
  134. package/dist/components/table/cellEditors/DateCellEditor.stories.js +16 -13
  135. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -1
  136. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -1
  137. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +6 -7
  138. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -1
  139. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -1
  140. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +7 -8
  141. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -1
  142. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -1
  143. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +7 -8
  144. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -1
  145. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -1
  146. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +7 -8
  147. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -1
  148. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.d.ts.map +1 -1
  149. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js +12 -15
  150. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js.map +1 -1
  151. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -1
  152. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +19 -29
  153. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -1
  154. package/dist/components/table/columnTypes.d.ts +3 -0
  155. package/dist/components/table/columnTypes.d.ts.map +1 -0
  156. package/dist/components/table/columnTypes.js +55 -0
  157. package/dist/components/table/columnTypes.js.map +1 -0
  158. package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
  159. package/dist/components/toast/Toast.d.ts +11 -2
  160. package/dist/components/toast/Toast.d.ts.map +1 -1
  161. package/dist/components/toast/Toast.js +5 -3
  162. package/dist/components/toast/Toast.js.map +1 -1
  163. package/dist/components/toast/Toast.stories.d.ts +15 -3
  164. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  165. package/dist/components/toast/Toast.stories.js +43 -41
  166. package/dist/components/toast/Toast.stories.js.map +1 -1
  167. package/dist/components/toast/Toast.test.js +19 -4
  168. package/dist/components/toast/Toast.test.js.map +1 -1
  169. package/dist/components/toast/ToastAction.d.ts +7 -0
  170. package/dist/components/toast/ToastAction.d.ts.map +1 -0
  171. package/dist/components/toast/ToastAction.js +9 -0
  172. package/dist/components/toast/ToastAction.js.map +1 -0
  173. package/dist/components/toggleGroup/ToggleGroup.stories.js +1 -1
  174. package/dist/components/toggleGroup/ToggleGroup.stories.js.map +1 -1
  175. package/dist/components/tooltip/TooltipWrapper.d.ts +1 -0
  176. package/dist/components/tooltip/TooltipWrapper.d.ts.map +1 -1
  177. package/dist/components/tooltip/TooltipWrapper.js +2 -2
  178. package/dist/components/tooltip/TooltipWrapper.js.map +1 -1
  179. package/dist/components/widget/Widget.d.ts +18 -0
  180. package/dist/components/widget/Widget.d.ts.map +1 -0
  181. package/dist/components/widget/Widget.js +51 -0
  182. package/dist/components/widget/Widget.js.map +1 -0
  183. package/dist/components/widget/Widget.stories.d.ts +128 -0
  184. package/dist/components/widget/Widget.stories.d.ts.map +1 -0
  185. package/dist/components/widget/Widget.stories.js +417 -0
  186. package/dist/components/widget/Widget.stories.js.map +1 -0
  187. package/dist/components/widget/Widget.test.d.ts +2 -0
  188. package/dist/components/widget/Widget.test.d.ts.map +1 -0
  189. package/dist/components/widget/Widget.test.js +110 -0
  190. package/dist/components/widget/Widget.test.js.map +1 -0
  191. package/dist/components/widget/WidgetBody.d.ts +6 -0
  192. package/dist/components/widget/WidgetBody.d.ts.map +1 -0
  193. package/dist/components/widget/WidgetBody.js +20 -0
  194. package/dist/components/widget/WidgetBody.js.map +1 -0
  195. package/dist/components/widget/WidgetContext.d.ts +20 -0
  196. package/dist/components/widget/WidgetContext.d.ts.map +1 -0
  197. package/dist/components/widget/WidgetContext.js +10 -0
  198. package/dist/components/widget/WidgetContext.js.map +1 -0
  199. package/dist/components/widget/WidgetHeader.d.ts +8 -0
  200. package/dist/components/widget/WidgetHeader.d.ts.map +1 -0
  201. package/dist/components/widget/WidgetHeader.js +56 -0
  202. package/dist/components/widget/WidgetHeader.js.map +1 -0
  203. package/dist/components/widget/types.d.ts +43 -0
  204. package/dist/components/widget/types.d.ts.map +1 -0
  205. package/dist/components/widget/types.js +2 -0
  206. package/dist/components/widget/types.js.map +1 -0
  207. package/dist/components/widgetCalendar/WidgetCalendar.d.ts +35 -0
  208. package/dist/components/widgetCalendar/WidgetCalendar.d.ts.map +1 -0
  209. package/dist/components/widgetCalendar/WidgetCalendar.js +22 -0
  210. package/dist/components/widgetCalendar/WidgetCalendar.js.map +1 -0
  211. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts +60 -0
  212. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts.map +1 -0
  213. package/dist/components/widgetCalendar/WidgetCalendar.stories.js +140 -0
  214. package/dist/components/widgetCalendar/WidgetCalendar.stories.js.map +1 -0
  215. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts +2 -0
  216. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts.map +1 -0
  217. package/dist/components/widgetCalendar/WidgetCalendar.test.js +88 -0
  218. package/dist/components/widgetCalendar/WidgetCalendar.test.js.map +1 -0
  219. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts +17 -0
  220. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts.map +1 -0
  221. package/dist/components/widgetCalendar/WidgetCalendarItem.js +25 -0
  222. package/dist/components/widgetCalendar/WidgetCalendarItem.js.map +1 -0
  223. package/dist/components/widgetFavourites/WidgetFavourites.d.ts +12 -0
  224. package/dist/components/widgetFavourites/WidgetFavourites.d.ts.map +1 -0
  225. package/dist/components/widgetFavourites/WidgetFavourites.js +23 -0
  226. package/dist/components/widgetFavourites/WidgetFavourites.js.map +1 -0
  227. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts +84 -0
  228. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts.map +1 -0
  229. package/dist/components/widgetFavourites/WidgetFavourites.stories.js +210 -0
  230. package/dist/components/widgetFavourites/WidgetFavourites.stories.js.map +1 -0
  231. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts +2 -0
  232. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts.map +1 -0
  233. package/dist/components/widgetFavourites/WidgetFavourites.test.js +67 -0
  234. package/dist/components/widgetFavourites/WidgetFavourites.test.js.map +1 -0
  235. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts +3 -0
  236. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts.map +1 -0
  237. package/dist/components/widgetFavourites/WidgetFavouritesItem.js +10 -0
  238. package/dist/components/widgetFavourites/WidgetFavouritesItem.js.map +1 -0
  239. package/dist/components/widgetFavourites/types.d.ts +25 -0
  240. package/dist/components/widgetFavourites/types.d.ts.map +1 -0
  241. package/dist/components/widgetFavourites/types.js +2 -0
  242. package/dist/components/widgetFavourites/types.js.map +1 -0
  243. package/dist/components/widgetNotifications/WidgetNotifications.d.ts +33 -0
  244. package/dist/components/widgetNotifications/WidgetNotifications.d.ts.map +1 -0
  245. package/dist/components/widgetNotifications/WidgetNotifications.js +18 -0
  246. package/dist/components/widgetNotifications/WidgetNotifications.js.map +1 -0
  247. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts +60 -0
  248. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts.map +1 -0
  249. package/dist/components/widgetNotifications/WidgetNotifications.stories.js +269 -0
  250. package/dist/components/widgetNotifications/WidgetNotifications.stories.js.map +1 -0
  251. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts +2 -0
  252. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts.map +1 -0
  253. package/dist/components/widgetNotifications/WidgetNotifications.test.js +79 -0
  254. package/dist/components/widgetNotifications/WidgetNotifications.test.js.map +1 -0
  255. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts +14 -0
  256. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts.map +1 -0
  257. package/dist/components/widgetNotifications/WidgetNotificationsItem.js +14 -0
  258. package/dist/components/widgetNotifications/WidgetNotificationsItem.js.map +1 -0
  259. package/dist/index.css +756 -78
  260. package/dist/index.css.map +1 -1
  261. package/dist/index.d.ts +15 -9
  262. package/dist/index.d.ts.map +1 -1
  263. package/dist/index.js +15 -8
  264. package/dist/index.js.map +1 -1
  265. package/dist/utils/favourites/favouriteConstants.d.ts +12 -0
  266. package/dist/utils/favourites/favouriteConstants.d.ts.map +1 -0
  267. package/dist/utils/favourites/favouriteConstants.js +16 -0
  268. package/dist/utils/favourites/favouriteConstants.js.map +1 -0
  269. package/dist/utils/favourites/favouriteConstants.test.d.ts +2 -0
  270. package/dist/utils/favourites/favouriteConstants.test.d.ts.map +1 -0
  271. package/dist/utils/favourites/favouriteConstants.test.js +12 -0
  272. package/dist/utils/favourites/favouriteConstants.test.js.map +1 -0
  273. package/dist/utils/hooks/useControllableBoolean.d.ts.map +1 -0
  274. package/dist/utils/hooks/useControllableBoolean.js.map +1 -0
  275. package/dist/utils/hooks/useControllableBoolean.test.d.ts +2 -0
  276. package/dist/utils/hooks/useControllableBoolean.test.d.ts.map +1 -0
  277. package/dist/utils/hooks/useControllableBoolean.test.js +34 -0
  278. package/dist/utils/hooks/useControllableBoolean.test.js.map +1 -0
  279. package/package.json +10 -11
  280. package/src/components/emptyState/EmptyState.stories.tsx +487 -0
  281. package/src/components/emptyState/EmptyState.test.tsx +140 -0
  282. package/src/components/emptyState/EmptyState.tsx +84 -0
  283. package/src/components/emptyState/emptyState.scss +63 -0
  284. package/src/components/favourite/FavouriteButton.test.tsx +83 -0
  285. package/src/components/favourite/FavouriteButton.tsx +70 -0
  286. package/src/components/favourite/favouriteButton.scss +37 -0
  287. package/src/components/icon/Icon.tsx +2 -2
  288. package/src/components/link/link.scss +26 -0
  289. package/src/components/pill/Pill.stories.tsx +432 -41
  290. package/src/components/pill/Pill.test.tsx +74 -3
  291. package/src/components/pill/Pill.tsx +26 -11
  292. package/src/components/sideNavigation/SideNavigation.stories.tsx +578 -0
  293. package/src/components/sideNavigation/SideNavigation.test.tsx +109 -0
  294. package/src/components/sideNavigation/SideNavigation.tsx +98 -0
  295. package/src/components/sideNavigation/SideNavigationContext.tsx +25 -0
  296. package/src/components/sideNavigation/SideNavigationGroup.test.tsx +103 -0
  297. package/src/components/{sidebarNav/SidebarNavGroup.tsx → sideNavigation/SideNavigationGroup.tsx} +8 -8
  298. package/src/components/sideNavigation/SideNavigationItem.test.tsx +137 -0
  299. package/src/components/sideNavigation/SideNavigationItem.tsx +125 -0
  300. package/src/components/sideNavigation/SideNavigationItemFavourite.test.tsx +54 -0
  301. package/src/components/{sidebarNav/SidebarNavItemFavourite.tsx → sideNavigation/SideNavigationItemFavourite.tsx} +7 -7
  302. package/src/components/sideNavigation/SideNavigationTitle.test.tsx +23 -0
  303. package/src/components/sideNavigation/SideNavigationTitle.tsx +13 -0
  304. package/src/components/sideNavigation/SideNavigationTooltip.test.tsx +44 -0
  305. package/src/components/{sidebarNav/SidebarNavTooltip.tsx → sideNavigation/SideNavigationTooltip.tsx} +2 -2
  306. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.ts +20 -4
  307. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.ts +8 -7
  308. package/src/components/{sidebarNav/sidebarNav.scss → sideNavigation/sideNavigation.scss} +37 -136
  309. package/src/components/sideNavigation/types.ts +56 -0
  310. package/src/components/sidebar/Sidebar.stories.tsx +670 -0
  311. package/src/components/sidebar/Sidebar.test.tsx +155 -0
  312. package/src/components/sidebar/Sidebar.tsx +27 -0
  313. package/src/components/sidebar/SidebarItem.tsx +64 -0
  314. package/src/components/sidebar/sidebar.scss +65 -0
  315. package/src/components/table/Table.stories.tsx +24 -73
  316. package/src/components/table/Table.tsx +2 -0
  317. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +16 -14
  318. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +6 -7
  319. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +7 -8
  320. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +7 -8
  321. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +7 -8
  322. package/src/components/table/cellRenderers/NumberInputCellRenderer.stories.tsx +12 -15
  323. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +19 -29
  324. package/src/components/table/columnTypes.ts +56 -0
  325. package/src/components/toast/Toast.stories.tsx +75 -67
  326. package/src/components/toast/Toast.test.tsx +40 -10
  327. package/src/components/toast/Toast.tsx +19 -5
  328. package/src/components/toast/ToastAction.tsx +17 -0
  329. package/src/components/toast/toast.scss +37 -0
  330. package/src/components/toggleGroup/ToggleGroup.stories.tsx +1 -1
  331. package/src/components/tooltip/TooltipWrapper.tsx +3 -1
  332. package/src/components/widget/Widget.stories.tsx +600 -0
  333. package/src/components/widget/Widget.test.tsx +263 -0
  334. package/src/components/widget/Widget.tsx +102 -0
  335. package/src/components/widget/WidgetBody.tsx +66 -0
  336. package/src/components/widget/WidgetContext.tsx +31 -0
  337. package/src/components/widget/WidgetHeader.tsx +155 -0
  338. package/src/components/widget/types.ts +47 -0
  339. package/src/components/widget/widget.scss +218 -0
  340. package/src/components/widgetCalendar/WidgetCalendar.stories.tsx +241 -0
  341. package/src/components/widgetCalendar/WidgetCalendar.test.tsx +137 -0
  342. package/src/components/widgetCalendar/WidgetCalendar.tsx +105 -0
  343. package/src/components/widgetCalendar/WidgetCalendarItem.tsx +105 -0
  344. package/src/components/widgetCalendar/widgetCalendar.scss +124 -0
  345. package/src/components/widgetFavourites/WidgetFavourites.stories.tsx +341 -0
  346. package/src/components/widgetFavourites/WidgetFavourites.test.tsx +127 -0
  347. package/src/components/widgetFavourites/WidgetFavourites.tsx +83 -0
  348. package/src/components/widgetFavourites/WidgetFavouritesItem.tsx +37 -0
  349. package/src/components/widgetFavourites/types.ts +26 -0
  350. package/src/components/widgetFavourites/widgetFavourites.scss +84 -0
  351. package/src/components/widgetNotifications/WidgetNotifications.stories.tsx +417 -0
  352. package/src/components/widgetNotifications/WidgetNotifications.test.tsx +152 -0
  353. package/src/components/widgetNotifications/WidgetNotifications.tsx +112 -0
  354. package/src/components/widgetNotifications/WidgetNotificationsItem.tsx +88 -0
  355. package/src/components/widgetNotifications/widgetNotifications.scss +186 -0
  356. package/src/docs/Contributing.mdx +1 -1
  357. package/src/index.scss +9 -1
  358. package/src/index.ts +22 -18
  359. package/src/tokens.scss +12 -2
  360. package/src/utils/favourites/favouriteConstants.test.ts +19 -0
  361. package/src/utils/favourites/favouriteConstants.ts +21 -0
  362. package/src/utils/hooks/useControllableBoolean.test.ts +48 -0
  363. package/dist/components/sidebarNav/SidebarNav.d.ts +0 -46
  364. package/dist/components/sidebarNav/SidebarNav.d.ts.map +0 -1
  365. package/dist/components/sidebarNav/SidebarNav.js +0 -102
  366. package/dist/components/sidebarNav/SidebarNav.js.map +0 -1
  367. package/dist/components/sidebarNav/SidebarNav.stories.d.ts +0 -61
  368. package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +0 -1
  369. package/dist/components/sidebarNav/SidebarNav.stories.js +0 -253
  370. package/dist/components/sidebarNav/SidebarNav.stories.js.map +0 -1
  371. package/dist/components/sidebarNav/SidebarNav.test.d.ts +0 -2
  372. package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +0 -1
  373. package/dist/components/sidebarNav/SidebarNav.test.js +0 -240
  374. package/dist/components/sidebarNav/SidebarNav.test.js.map +0 -1
  375. package/dist/components/sidebarNav/SidebarNavContext.d.ts +0 -13
  376. package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +0 -1
  377. package/dist/components/sidebarNav/SidebarNavContext.js +0 -15
  378. package/dist/components/sidebarNav/SidebarNavContext.js.map +0 -1
  379. package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +0 -1
  380. package/dist/components/sidebarNav/SidebarNavGroup.js +0 -16
  381. package/dist/components/sidebarNav/SidebarNavGroup.js.map +0 -1
  382. package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +0 -1
  383. package/dist/components/sidebarNav/SidebarNavItem.js +0 -44
  384. package/dist/components/sidebarNav/SidebarNavItem.js.map +0 -1
  385. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +0 -8
  386. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +0 -1
  387. package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +0 -1
  388. package/dist/components/sidebarNav/SidebarNavPanel.d.ts +0 -4
  389. package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +0 -1
  390. package/dist/components/sidebarNav/SidebarNavPanel.js +0 -9
  391. package/dist/components/sidebarNav/SidebarNavPanel.js.map +0 -1
  392. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +0 -10
  393. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +0 -1
  394. package/dist/components/sidebarNav/SidebarNavPanelNav.js +0 -21
  395. package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +0 -1
  396. package/dist/components/sidebarNav/SidebarNavRail.d.ts +0 -6
  397. package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +0 -1
  398. package/dist/components/sidebarNav/SidebarNavRail.js +0 -7
  399. package/dist/components/sidebarNav/SidebarNavRail.js.map +0 -1
  400. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +0 -10
  401. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +0 -1
  402. package/dist/components/sidebarNav/SidebarNavRailItem.js +0 -25
  403. package/dist/components/sidebarNav/SidebarNavRailItem.js.map +0 -1
  404. package/dist/components/sidebarNav/SidebarNavRailList.d.ts +0 -4
  405. package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +0 -1
  406. package/dist/components/sidebarNav/SidebarNavRailList.js +0 -7
  407. package/dist/components/sidebarNav/SidebarNavRailList.js.map +0 -1
  408. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +0 -6
  409. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +0 -1
  410. package/dist/components/sidebarNav/SidebarNavRailSlot.js +0 -7
  411. package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +0 -1
  412. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +0 -6
  413. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +0 -1
  414. package/dist/components/sidebarNav/SidebarNavSeparator.js +0 -8
  415. package/dist/components/sidebarNav/SidebarNavSeparator.js.map +0 -1
  416. package/dist/components/sidebarNav/SidebarNavTitle.d.ts +0 -4
  417. package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +0 -1
  418. package/dist/components/sidebarNav/SidebarNavTitle.js +0 -7
  419. package/dist/components/sidebarNav/SidebarNavTitle.js.map +0 -1
  420. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +0 -7
  421. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +0 -1
  422. package/dist/components/sidebarNav/SidebarNavTooltip.js.map +0 -1
  423. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +0 -8
  424. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +0 -1
  425. package/dist/components/sidebarNav/SidebarNavTrigger.js +0 -15
  426. package/dist/components/sidebarNav/SidebarNavTrigger.js.map +0 -1
  427. package/dist/components/sidebarNav/index.d.ts +0 -4
  428. package/dist/components/sidebarNav/index.d.ts.map +0 -1
  429. package/dist/components/sidebarNav/index.js +0 -3
  430. package/dist/components/sidebarNav/index.js.map +0 -1
  431. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +0 -4
  432. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +0 -1
  433. package/dist/components/sidebarNav/resolvePanelItemProps.js.map +0 -1
  434. package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +0 -1
  435. package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +0 -1
  436. package/dist/components/sidebarNav/types.d.ts +0 -100
  437. package/dist/components/sidebarNav/types.d.ts.map +0 -1
  438. package/dist/components/sidebarNav/types.js +0 -4
  439. package/dist/components/sidebarNav/types.js.map +0 -1
  440. package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +0 -1
  441. package/dist/components/sidebarNav/useControllableBoolean.js.map +0 -1
  442. package/src/components/sidebarNav/SidebarNav.stories.tsx +0 -484
  443. package/src/components/sidebarNav/SidebarNav.test.tsx +0 -611
  444. package/src/components/sidebarNav/SidebarNav.tsx +0 -230
  445. package/src/components/sidebarNav/SidebarNavContext.tsx +0 -28
  446. package/src/components/sidebarNav/SidebarNavItem.tsx +0 -162
  447. package/src/components/sidebarNav/SidebarNavPanel.tsx +0 -20
  448. package/src/components/sidebarNav/SidebarNavPanelNav.tsx +0 -55
  449. package/src/components/sidebarNav/SidebarNavRail.tsx +0 -20
  450. package/src/components/sidebarNav/SidebarNavRailItem.tsx +0 -83
  451. package/src/components/sidebarNav/SidebarNavRailList.tsx +0 -11
  452. package/src/components/sidebarNav/SidebarNavRailSlot.tsx +0 -15
  453. package/src/components/sidebarNav/SidebarNavSeparator.tsx +0 -19
  454. package/src/components/sidebarNav/SidebarNavTitle.tsx +0 -13
  455. package/src/components/sidebarNav/SidebarNavTrigger.tsx +0 -52
  456. package/src/components/sidebarNav/index.ts +0 -6
  457. package/src/components/sidebarNav/types.ts +0 -126
  458. /package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.d.ts +0 -0
  459. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.d.ts +0 -0
  460. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.js +0 -0
  461. /package/src/{components/sidebarNav → utils/hooks}/useControllableBoolean.ts +0 -0
@@ -0,0 +1,155 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { Icon } from 'Components/icon/Icon';
5
+ import { Separator } from 'Components/separator/Separator';
6
+ import { describe, expect, test, vi } from 'vitest';
7
+ import { Sidebar } from './Sidebar.js';
8
+ import { SidebarItem } from './SidebarItem.js';
9
+
10
+ describe('Sidebar', () => {
11
+ test('renders a nav element with default aria-label', () => {
12
+ render(<Sidebar />);
13
+ expect(screen.getByRole('navigation', { name: 'Sidebar' })).toBeInTheDocument();
14
+ });
15
+
16
+ test('renders a nav element with a custom ariaLabel', () => {
17
+ render(<Sidebar ariaLabel="App navigation" />);
18
+ expect(screen.getByRole('navigation', { name: 'App navigation' })).toBeInTheDocument();
19
+ });
20
+
21
+ test('applies data-testid to the nav', () => {
22
+ render(<Sidebar />);
23
+ expect(screen.getByTestId('sidebar')).toBeInTheDocument();
24
+ });
25
+ });
26
+
27
+ describe('SidebarItem', () => {
28
+ test('renders an anchor when href is provided', () => {
29
+ render(
30
+ <Sidebar>
31
+ <SidebarItem href="/home" aria-label="Home">
32
+ <Icon name="menu" size={24} />
33
+ </SidebarItem>
34
+ </Sidebar>,
35
+ );
36
+ const link = screen.getByRole('link', { name: 'Home' });
37
+ expect(link).toBeInTheDocument();
38
+ expect(link).toHaveAttribute('href', '/home');
39
+ });
40
+
41
+ test('renders a button when no href is provided', () => {
42
+ render(
43
+ <Sidebar>
44
+ <SidebarItem aria-label="Menu" onClick={vi.fn()}>
45
+ <Icon name="menu" size={24} />
46
+ </SidebarItem>
47
+ </Sidebar>,
48
+ );
49
+ const button = screen.getByRole('button', { name: 'Menu' });
50
+ expect(button).toBeInTheDocument();
51
+ expect(button.tagName).toBe('BUTTON');
52
+ });
53
+
54
+ test('applies selected class and aria-current when current is true on a link', () => {
55
+ render(
56
+ <Sidebar>
57
+ <SidebarItem href="/home" aria-label="Home" selected>
58
+ <Icon name="menu" size={24} />
59
+ </SidebarItem>
60
+ </Sidebar>,
61
+ );
62
+ const link = screen.getByRole('link', { name: 'Home' });
63
+ expect(link).toHaveClass('ds-sidebar__item--selected');
64
+ expect(link).toHaveAttribute('aria-current', 'true');
65
+ });
66
+
67
+ test('applies selected class on a button when selected is true', () => {
68
+ render(
69
+ <Sidebar>
70
+ <SidebarItem aria-label="Menu" selected onClick={vi.fn()}>
71
+ <Icon name="menu" size={24} />
72
+ </SidebarItem>
73
+ </Sidebar>,
74
+ );
75
+ const button = screen.getByRole('button', { name: 'Menu' });
76
+ expect(button).toHaveClass('ds-sidebar__item--selected');
77
+ expect(button).toHaveAttribute('aria-current', 'true');
78
+ });
79
+
80
+ test('does not apply selected class or aria-current when current is false', () => {
81
+ render(
82
+ <Sidebar>
83
+ <SidebarItem href="/home" aria-label="Home">
84
+ <Icon name="menu" size={24} />
85
+ </SidebarItem>
86
+ </Sidebar>,
87
+ );
88
+ const link = screen.getByRole('link', { name: 'Home' });
89
+ expect(link).not.toHaveClass('ds-sidebar__item--selected');
90
+ expect(link).toHaveAttribute('aria-current', 'false');
91
+ });
92
+
93
+ test('calls onClick when the button is clicked', async () => {
94
+ const onClick = vi.fn();
95
+ render(
96
+ <Sidebar>
97
+ <SidebarItem aria-label="Menu" onClick={onClick}>
98
+ <Icon name="menu" size={24} />
99
+ </SidebarItem>
100
+ </Sidebar>,
101
+ );
102
+ await userEvent.click(screen.getByRole('button', { name: 'Menu' }));
103
+ expect(onClick).toHaveBeenCalledOnce();
104
+ });
105
+
106
+ test('passes through extra HTML attributes to the button', () => {
107
+ render(
108
+ <Sidebar>
109
+ <SidebarItem
110
+ aria-label="Toggle nav"
111
+ aria-expanded={false}
112
+ aria-controls="nav-panel"
113
+ onClick={vi.fn()}
114
+ >
115
+ <Icon name="menu" size={24} />
116
+ </SidebarItem>
117
+ </Sidebar>,
118
+ );
119
+ const button = screen.getByRole('button', { name: 'Toggle nav' });
120
+ expect(button).toHaveAttribute('aria-expanded', 'false');
121
+ expect(button).toHaveAttribute('aria-controls', 'nav-panel');
122
+ });
123
+
124
+ test('applies data-testid to the rendered element', () => {
125
+ render(
126
+ <Sidebar>
127
+ <SidebarItem href="/home" aria-label="Home" data-testid="home-item">
128
+ <Icon name="menu" size={24} />
129
+ </SidebarItem>
130
+ </Sidebar>,
131
+ );
132
+ expect(screen.getByTestId('home-item')).toBeInTheDocument();
133
+ });
134
+ });
135
+
136
+ describe('Sidebar + SidebarItem + Separator composition', () => {
137
+ test('renders items and a separator together', () => {
138
+ render(
139
+ <Sidebar ariaLabel="App navigation">
140
+ <SidebarItem href="/home" aria-label="Home">
141
+ <Icon name="menu" size={24} />
142
+ </SidebarItem>
143
+ <Separator orientation="horizontal" decorative />
144
+ <SidebarItem href="/calendar" aria-label="Calendar">
145
+ <Icon name="date" size={24} />
146
+ </SidebarItem>
147
+ </Sidebar>,
148
+ );
149
+
150
+ expect(screen.getByRole('navigation', { name: 'App navigation' })).toBeInTheDocument();
151
+ expect(screen.getByRole('link', { name: 'Home' })).toBeInTheDocument();
152
+ expect(screen.getByRole('link', { name: 'Calendar' })).toBeInTheDocument();
153
+ expect(document.querySelector('.ds-separator')).toBeInTheDocument();
154
+ });
155
+ });
@@ -0,0 +1,27 @@
1
+ import classNames from 'classnames';
2
+ import { SidebarItem, type SidebarItemProps } from './SidebarItem.js';
3
+
4
+ export type SidebarProps = {
5
+ ariaLabel?: string;
6
+ } & React.HTMLAttributes<HTMLDivElement>;
7
+
8
+ export const Sidebar = (props: SidebarProps) => {
9
+ const { ariaLabel = 'Sidebar', className, children, ...rest } = props;
10
+ return (
11
+ <nav
12
+ aria-label={ariaLabel}
13
+ className={classNames('ds-sidebar', className)}
14
+ data-testid="sidebar"
15
+ {...rest}
16
+ >
17
+ {children}
18
+ </nav>
19
+ );
20
+ };
21
+
22
+ Sidebar.Item = SidebarItem;
23
+
24
+ export namespace Sidebar {
25
+ export type Props = SidebarProps;
26
+ export type ItemProps = SidebarItemProps;
27
+ }
@@ -0,0 +1,64 @@
1
+ import classNames from 'classnames';
2
+ import { Tooltip } from 'Components/tooltip/Tooltip.js';
3
+
4
+ export type SidebarItemProps = {
5
+ 'href'?: string;
6
+ 'selected'?: boolean;
7
+ 'data-testid'?: string;
8
+ } & React.HTMLAttributes<HTMLElement>;
9
+
10
+ export const SidebarItem = (props: SidebarItemProps) => {
11
+ const {
12
+ href,
13
+ onClick,
14
+ selected,
15
+ 'aria-label': ariaLabel,
16
+ 'data-testid': dataTestId,
17
+ className,
18
+ children,
19
+ ...rest
20
+ } = props;
21
+
22
+ const itemClassName = classNames(
23
+ 'ds-sidebar__item',
24
+ { 'ds-sidebar__item--selected': Boolean(selected) },
25
+ className,
26
+ );
27
+
28
+ return (
29
+ <Tooltip>
30
+ <Tooltip.Trigger>
31
+ {href
32
+ ? (
33
+ <a
34
+ href={href}
35
+ className={itemClassName}
36
+ aria-current={selected ? 'true' : 'false'}
37
+ aria-label={ariaLabel}
38
+ onClick={onClick}
39
+ data-testid={dataTestId}
40
+ {...rest}
41
+ >
42
+ {children}
43
+ </a>
44
+ )
45
+ : (
46
+ <button
47
+ type="button"
48
+ className={itemClassName}
49
+ aria-current={selected ? 'true' : 'false'}
50
+ aria-label={ariaLabel}
51
+ onClick={onClick}
52
+ data-testid={dataTestId}
53
+ {...rest}
54
+ >
55
+ {children}
56
+ </button>
57
+ )}
58
+ </Tooltip.Trigger>
59
+ <Tooltip.Content side="right">
60
+ {ariaLabel}
61
+ </Tooltip.Content>
62
+ </Tooltip>
63
+ );
64
+ };
@@ -0,0 +1,65 @@
1
+ .ds-sidebar {
2
+ margin: 0;
3
+ width: var(--sidebar-nav-rail-width);
4
+ display: flex;
5
+ flex-direction: column;
6
+ align-items: center;
7
+ padding: var(--spacing-small);
8
+ gap: var(--spacing-large);
9
+ box-sizing: border-box;
10
+ border-right: var(--border-weight) solid var(--page-base-color-border);
11
+ }
12
+
13
+ .ds-sidebar__item {
14
+ position: relative;
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ width: var(--sidebar-nav-rail-item-size);
19
+ height: var(--sidebar-nav-rail-item-size);
20
+ background: transparent;
21
+ border: 0;
22
+ padding: 0;
23
+ border-radius: var(--border-radius-round);
24
+ color: var(--sidebar-nav-rail-item-color-icon);
25
+ cursor: pointer;
26
+ text-decoration: none;
27
+
28
+ &:hover,
29
+ &:active,
30
+ &[data-state='delayed-open'],
31
+ &[data-state='instant-open'],
32
+ &[data-state='open'] {
33
+ color: var(--sidebar-nav-rail-item-color-icon-hover);
34
+ background: var(--sidebar-nav-rail-item-color-background-hover);
35
+ }
36
+
37
+ &:focus {
38
+ outline: none;
39
+ }
40
+
41
+ &:focus-visible {
42
+ outline: none;
43
+ box-shadow: 0 0 0 var(--focus-border) var(--focus-color-focus);
44
+ }
45
+ }
46
+
47
+ .ds-sidebar__item--selected {
48
+ color: var(--sidebar-nav-rail-item-color-icon-selected);
49
+ background: var(--sidebar-nav-rail-item-color-background-selected);
50
+
51
+ &:hover,
52
+ &:active,
53
+ &[data-state='delayed-open'],
54
+ &[data-state='instant-open'],
55
+ &[data-state='open'] {
56
+ color: var(--sidebar-nav-rail-item-color-icon-selected);
57
+ background: var(--sidebar-nav-rail-item-color-background-selected);
58
+ }
59
+ }
60
+
61
+ .ds-sidebar__item .ds-badge {
62
+ position: absolute;
63
+ top: var(--spacing-xsmall);
64
+ right: var(--spacing-xsmall);
65
+ }
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { fn } from '@storybook/test';
2
+ import { fn } from 'storybook/test';
3
3
  import {
4
4
  Controls,
5
5
  Heading as DocHeading,
@@ -503,7 +503,7 @@ const sampleColumnDefs: (ColDef | ColGroupDef)[] = [
503
503
  {
504
504
  field: 'marks',
505
505
  cellDataType: 'number',
506
- cellEditor: 'dsNumberCellEditor',
506
+ type: 'dsNumberColumn',
507
507
  cellEditorParams: {
508
508
  min: 0,
509
509
  max: 100,
@@ -1042,11 +1042,7 @@ const sampleColumnDefsWithButtonCellRenderer: (ColDef | ColGroupDef)[] = [
1042
1042
  {
1043
1043
  field: 'name',
1044
1044
  headerTooltip: 'The name of the user',
1045
- cellRenderer: 'dsButtonCellRenderer',
1046
- cellRendererParams: {
1047
- suppressCellFocusAndFocusFirstElement: true,
1048
- },
1049
- editable: false,
1045
+ type: 'dsButtonColumn',
1050
1046
  },
1051
1047
  {
1052
1048
  field: 'email',
@@ -1370,13 +1366,7 @@ export const WithInlineTextCellRenderer: Story = {
1370
1366
  columnDefs: [
1371
1367
  {
1372
1368
  field: 'name',
1373
- cellRenderer: 'dsInlineTextCellRenderer',
1374
- cellRendererParams: {
1375
- suppressCellFocusAndFocusFirstElement: true,
1376
- suppressCount: true,
1377
- suppressDoubleClickExpand: true,
1378
- suppressEnterExpand: true,
1379
- },
1369
+ type: 'dsInlineTextColumn',
1380
1370
  },
1381
1371
  ],
1382
1372
  defaultColDef,
@@ -1572,7 +1562,7 @@ const marksheetTidyTableColumnDefs: (ColDef | ColGroupDef)[] = [
1572
1562
  {
1573
1563
  headerName: 'Assessment Component',
1574
1564
  field: 'assessmentComponent',
1575
- cellRenderer: 'dsComboboxCellRenderer',
1565
+ type: 'dsComboboxColumn',
1576
1566
  cellRendererParams: (params: CustomCellRendererProps) => {
1577
1567
  return {
1578
1568
  options: assessmentComponentOptions,
@@ -1580,16 +1570,12 @@ const marksheetTidyTableColumnDefs: (ColDef | ColGroupDef)[] = [
1580
1570
  hasError: params.node.data.assessmentComponent === 'comp-maths',
1581
1571
  };
1582
1572
  },
1583
- editable: false,
1584
- ...Table.ComboboxCellRenderer.colDefDefaults,
1585
1573
  },
1586
1574
  {
1587
1575
  headerName: 'Visibility',
1588
1576
  field: 'visibility',
1589
- cellRenderer: 'dsComboboxCellRenderer',
1577
+ type: 'dsComboboxColumn',
1590
1578
  cellRendererParams: { options: visibilityOptions, placeholder: 'Select' },
1591
- editable: false,
1592
- ...Table.ComboboxCellRenderer.colDefDefaults,
1593
1579
  },
1594
1580
  {
1595
1581
  headerName: 'Editable',
@@ -1973,29 +1959,17 @@ const dateEditorColDefs: (ColDef | ColGroupDef)[] = [
1973
1959
  {
1974
1960
  field: 'dateOfBirth',
1975
1961
  headerName: 'Date of Birth',
1976
- cellEditor: 'dsDateCellEditor',
1977
- valueFormatter: params =>
1978
- params.value instanceof Date
1979
- ? params.value.toLocaleDateString('en-GB')
1980
- : params.value ?? '',
1962
+ type: 'dsDateColumn',
1981
1963
  },
1982
1964
  {
1983
1965
  field: 'enrollmentDate',
1984
1966
  headerName: 'Enrollment Date',
1985
- cellEditor: 'dsDateCellEditor',
1986
- valueFormatter: params =>
1987
- params.value instanceof Date
1988
- ? params.value.toLocaleDateString('en-GB')
1989
- : params.value ?? '',
1967
+ type: 'dsDateColumn',
1990
1968
  },
1991
1969
  {
1992
1970
  field: 'graduationDate',
1993
1971
  headerName: 'Graduation Date',
1994
- cellEditor: 'dsDateCellEditor',
1995
- valueFormatter: params =>
1996
- params.value instanceof Date
1997
- ? params.value.toLocaleDateString('en-GB')
1998
- : params.value ?? '',
1972
+ type: 'dsDateColumn',
1999
1973
  },
2000
1974
  ];
2001
1975
 
@@ -2039,14 +2013,12 @@ const booleanCellRendererColumnDefs: ColDef<BooleanRowData>[] = [
2039
2013
  {
2040
2014
  field: 'hasPet',
2041
2015
  headerName: 'Has Pet',
2042
- cellRenderer: 'dsBooleanCellRenderer',
2043
- editable: false,
2016
+ type: 'dsBooleanColumn',
2044
2017
  },
2045
2018
  {
2046
2019
  field: 'isEnrolled',
2047
2020
  headerName: 'Is Enrolled',
2048
- cellRenderer: 'dsBooleanCellRenderer',
2049
- editable: false,
2021
+ type: 'dsBooleanColumn',
2050
2022
  },
2051
2023
  ];
2052
2024
 
@@ -2129,20 +2101,12 @@ const checkboxColumnDefs: ColDef[] = [
2129
2101
  {
2130
2102
  field: 'attended',
2131
2103
  headerName: 'Attended',
2132
- cellRenderer: 'dsCheckboxCellRenderer',
2133
- cellRendererParams: {
2134
- suppressCellFocusAndFocusFirstElement: true,
2135
- },
2136
- editable: false,
2104
+ type: 'dsCheckboxColumn',
2137
2105
  },
2138
2106
  {
2139
2107
  field: 'consented',
2140
2108
  headerName: 'Consented',
2141
- cellRenderer: 'dsCheckboxCellRenderer',
2142
- cellRendererParams: {
2143
- suppressCellFocusAndFocusFirstElement: true,
2144
- },
2145
- editable: false,
2109
+ type: 'dsCheckboxColumn',
2146
2110
  },
2147
2111
  ];
2148
2112
 
@@ -2273,23 +2237,20 @@ const selectDropdownColDefs: (ColDef | ColGroupDef)[] = [
2273
2237
  {
2274
2238
  field: 'status',
2275
2239
  headerName: 'Status',
2276
- cellRenderer: 'dsSelectDropdownCellRenderer',
2240
+ type: 'dsSelectDropdownColumn',
2277
2241
  cellRendererParams: { options: statusOptions, placeholder: 'Select status' },
2278
- editable: false,
2279
2242
  },
2280
2243
  {
2281
2244
  field: 'priority',
2282
2245
  headerName: 'Priority',
2283
- cellRenderer: 'dsSelectDropdownCellRenderer',
2246
+ type: 'dsSelectDropdownColumn',
2284
2247
  cellRendererParams: { options: priorityOptions, placeholder: 'Select priority' },
2285
- editable: false,
2286
2248
  },
2287
2249
  {
2288
2250
  field: 'category',
2289
2251
  headerName: 'Category',
2290
- cellRenderer: 'dsSelectDropdownCellRenderer',
2252
+ type: 'dsSelectDropdownColumn',
2291
2253
  cellRendererParams: { options: categoryOptions, placeholder: 'Select category' },
2292
- editable: false,
2293
2254
  },
2294
2255
  ];
2295
2256
 
@@ -2361,34 +2322,26 @@ const comboboxColDefs: (ColDef | ColGroupDef)[] = [
2361
2322
  {
2362
2323
  field: 'subject',
2363
2324
  headerName: 'Subject (single, input)',
2364
- cellRenderer: 'dsComboboxCellRenderer',
2325
+ type: 'dsComboboxColumn',
2365
2326
  cellRendererParams: { options: subjectOptions, placeholder: 'Select subject' },
2366
- editable: false,
2367
- ...Table.ComboboxCellRenderer.colDefDefaults,
2368
2327
  },
2369
2328
  {
2370
2329
  field: 'level',
2371
2330
  headerName: 'Level (single, button)',
2372
- cellRenderer: 'dsComboboxCellRenderer',
2331
+ type: 'dsComboboxColumn',
2373
2332
  cellRendererParams: { options: levelOptions, placeholder: 'Select level', triggerVariant: 'button' },
2374
- editable: false,
2375
- ...Table.ComboboxCellRenderer.colDefDefaults,
2376
2333
  },
2377
2334
  {
2378
2335
  field: 'tags',
2379
2336
  headerName: 'Tags (multi, button)',
2380
- cellRenderer: 'dsComboboxCellRenderer',
2337
+ type: 'dsComboboxColumn',
2381
2338
  cellRendererParams: { options: tagOptions, placeholder: 'Select tags', multiple: true, triggerVariant: 'button' },
2382
- editable: false,
2383
- ...Table.ComboboxCellRenderer.colDefDefaults,
2384
2339
  },
2385
2340
  {
2386
2341
  field: 'skills',
2387
2342
  headerName: 'Skills (multi, input)',
2388
- cellRenderer: 'dsComboboxCellRenderer',
2343
+ type: 'dsComboboxColumn',
2389
2344
  cellRendererParams: { options: skillOptions, placeholder: 'Select skills', multiple: true },
2390
- editable: false,
2391
- ...Table.ComboboxCellRenderer.colDefDefaults,
2392
2345
  },
2393
2346
  ];
2394
2347
 
@@ -2422,17 +2375,15 @@ const numberInputColDefs: (ColDef | ColGroupDef)[] = [
2422
2375
  field: 'sessions',
2423
2376
  headerName: 'Sessions',
2424
2377
  flex: 1,
2425
- editable: false,
2426
- cellRenderer: 'dsNumberInputCellRenderer',
2427
- cellRendererParams: { min: 0, suppressCellFocusAndFocusFirstElement: true },
2378
+ type: 'dsNumberInputColumn',
2379
+ cellRendererParams: { min: 0 },
2428
2380
  },
2429
2381
  {
2430
2382
  field: 'score',
2431
2383
  headerName: 'Score (/100)',
2432
2384
  flex: 1,
2433
- editable: false,
2434
- cellRenderer: 'dsNumberInputCellRenderer',
2435
- cellRendererParams: { min: 0, max: 100, suppressCellFocusAndFocusFirstElement: true },
2385
+ type: 'dsNumberInputColumn',
2386
+ cellRendererParams: { min: 0, max: 100 },
2436
2387
  },
2437
2388
  ];
2438
2389
 
@@ -36,6 +36,7 @@ import { CheckboxCellRenderer } from './cellRenderers/CheckboxCellRenderer.js';
36
36
  import { ComboboxCellRenderer } from './cellRenderers/ComboboxCellRenderer.js';
37
37
  import { DefaultCellRenderer } from './cellRenderers/DefaultCellRenderer.js';
38
38
  import { NumberInputCellRenderer } from './cellRenderers/NumberInputCellRenderer.js';
39
+ import { columnTypes } from './columnTypes.js';
39
40
 
40
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
42
  type TableProps<TData = any> = {
@@ -214,6 +215,7 @@ export const Table = (props: TableProps) => {
214
215
  dsNumberInputCellRenderer: NumberInputCellRenderer,
215
216
  ...components,
216
217
  }}
218
+ columnTypes={columnTypes}
217
219
  {...rest}
218
220
  {...(hasSearch && { quickFilterText: searchValue })}
219
221
  />
@@ -21,7 +21,9 @@ const DESCRIPTION_INTRO = [
21
21
  '`DateCellEditor` is an AG Grid cell editor component that renders an Arbor `DatePicker` inside a table cell.',
22
22
  'It is invoked when a user begins editing a date column (e.g. by pressing Enter or double-clicking the cell).',
23
23
  '',
24
- 'Register it via the AG Grid `cellEditor` column definition property.',
24
+ 'Register it via `type: \'dsDateColumn\'` on the column definition (pre-registered by Arbor\'s `Table`,',
25
+ 'and also applies a `valueFormatter` that renders `Date` values as `en-GB` strings), or via the AG Grid',
26
+ '`cellEditor` column definition property directly.',
25
27
  ].join('\n');
26
28
 
27
29
  const USAGE_GUIDANCE = [
@@ -35,12 +37,22 @@ const USAGE_GUIDANCE = [
35
37
  '### Registration',
36
38
  '',
37
39
  '```tsx',
40
+ 'const colDefs = [',
41
+ ' {',
42
+ " field: 'dob',",
43
+ " headerName: 'Date of birth',",
44
+ " type: 'dsDateColumn', // preferred — pre-registered on Arbor's Table",
45
+ ' },',
46
+ '];',
47
+ '',
48
+ '// or register the editor directly:',
38
49
  "import { DateCellEditor } from '@arbor-education/design-system.components';",
39
50
  '',
40
51
  'const colDefs = [',
41
52
  ' {',
42
53
  " field: 'dob',",
43
54
  " headerName: 'Date of birth',",
55
+ ' editable: true,',
44
56
  ' cellEditor: DateCellEditor,',
45
57
  ' // or via string key:',
46
58
  " cellEditor: 'dsDateCellEditor',",
@@ -200,12 +212,7 @@ function DateCellEditorExample() {
200
212
  field: 'dateOfBirth',
201
213
  headerName: 'Date of birth',
202
214
  flex: 1,
203
- editable: true,
204
- cellEditor: 'dsDateCellEditor',
205
- valueFormatter: (params) =>
206
- params.value instanceof Date
207
- ? params.value.toLocaleDateString('en-GB')
208
- : params.value,
215
+ type: 'dsDateColumn',
209
216
  },
210
217
  ]}
211
218
  defaultColDef={{ flex: 1, minWidth: 120 }}
@@ -228,12 +235,7 @@ export default DateCellEditorExample;
228
235
  field: 'dateOfBirth',
229
236
  headerName: 'Date of birth',
230
237
  flex: 1,
231
- editable: true,
232
- cellEditor: 'dsDateCellEditor',
233
- valueFormatter: params =>
234
- params.value instanceof Date
235
- ? params.value.toLocaleDateString('en-GB')
236
- : params.value,
238
+ type: 'dsDateColumn',
237
239
  },
238
240
  ]}
239
241
  defaultColDef={{ flex: 1, minWidth: 120 }}
@@ -241,5 +243,5 @@ export default DateCellEditorExample;
241
243
  />
242
244
  ),
243
245
  },
244
- '`dsDateCellEditor` wired up inside a full `Table`. Double-click (or press F2/Enter) on a Date of birth cell to open the `DatePicker` editor — AG Grid mounts the editor component and passes the current cell value as `value`. The `valueFormatter` formats the stored `Date` object as a localised string for display.',
246
+ '`type: \'dsDateColumn\'` wired up inside a full `Table`. Double-click (or press F2/Enter) on a Date of birth cell to open the `DatePicker` editor — AG Grid mounts the editor component and passes the current cell value as `value`. The column type\'s `valueFormatter` formats the stored `Date` object as a localised string for display.',
245
247
  );
@@ -21,7 +21,8 @@ const DESCRIPTION_INTRO = [
21
21
  'A `true` value renders a green check icon; a `false` value renders a red ✕ icon;',
22
22
  'any other value (including `null` and `undefined`) renders nothing.',
23
23
  '',
24
- 'Register it via the string key `dsBooleanCellRenderer` (pre-registered by Arbor\'s `Table`) or by importing the component directly.',
24
+ 'Register it via `type: \'dsBooleanColumn\'` on the column definition (pre-registered by Arbor\'s `Table`),',
25
+ 'via the string key `dsBooleanCellRenderer`, or by importing the component directly.',
25
26
  ].join('\n');
26
27
 
27
28
  const USAGE_GUIDANCE = [
@@ -55,7 +56,7 @@ const DEVELOPER_NOTES = [
55
56
  ' {',
56
57
  " field: 'isActive',",
57
58
  " headerName: 'Active',",
58
- " cellRenderer: 'dsBooleanCellRenderer', // string key — no import needed",
59
+ " type: 'dsBooleanColumn', // pre-registered column type — no import needed",
59
60
  ' },',
60
61
  '];',
61
62
  '```',
@@ -241,8 +242,7 @@ function BooleanCellRendererExample() {
241
242
  field: 'active',
242
243
  headerName: 'Active',
243
244
  flex: 1,
244
- editable: false,
245
- cellRenderer: 'dsBooleanCellRenderer',
245
+ type: 'dsBooleanColumn',
246
246
  },
247
247
  ]}
248
248
  defaultColDef={{ flex: 1, minWidth: 120 }}
@@ -265,8 +265,7 @@ export default BooleanCellRendererExample;
265
265
  field: 'active',
266
266
  headerName: 'Active',
267
267
  flex: 1,
268
- editable: false,
269
- cellRenderer: 'dsBooleanCellRenderer',
268
+ type: 'dsBooleanColumn',
270
269
  },
271
270
  ]}
272
271
  defaultColDef={{ flex: 1, minWidth: 120 }}
@@ -274,5 +273,5 @@ export default BooleanCellRendererExample;
274
273
  />
275
274
  ),
276
275
  },
277
- '`dsBooleanCellRenderer` wired up inside a full `Table`. `true` renders a check, `false` renders a ✕, and `null` leaves the cell empty. The Active column is set to `editable: false` — this renderer is display-only.',
276
+ '`type: \'dsBooleanColumn\'` wired up inside a full `Table`. `true` renders a check, `false` renders a ✕, and `null` leaves the cell empty. The column type sets `editable: false` — this renderer is display-only.',
278
277
  );