@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
@@ -1,611 +0,0 @@
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 { describe, expect, test, vi } from 'vitest';
6
- import { SidebarNav } from './SidebarNav.js';
7
-
8
- describe('SidebarNav', () => {
9
- test('toggles panel visibility via trigger (uncontrolled)', async () => {
10
- render(
11
- <SidebarNav defaultExpanded={false}>
12
- <SidebarNav.Rail>
13
- <SidebarNav.Trigger>
14
- <Icon name="menu" size={24} />
15
- </SidebarNav.Trigger>
16
- </SidebarNav.Rail>
17
- <SidebarNav.Panel>
18
- <SidebarNav.Title>Attendance</SidebarNav.Title>
19
- <SidebarNav.PanelNav items={[]} />
20
- </SidebarNav.Panel>
21
- </SidebarNav>,
22
- );
23
-
24
- const panel = screen.getByTestId('sidebar-nav-panel');
25
- expect(panel).toHaveAttribute('aria-hidden', 'true');
26
-
27
- const trigger = screen.getByRole('button', { name: 'Show/hide sub navigation' });
28
- await userEvent.click(trigger);
29
- expect(panel).toHaveAttribute('aria-hidden', 'false');
30
- expect(screen.getByText('Attendance')).toBeInTheDocument();
31
-
32
- await userEvent.click(trigger);
33
- expect(panel).toHaveAttribute('aria-hidden', 'true');
34
- });
35
-
36
- test('expands and collapses groups in place', async () => {
37
- render(
38
- <SidebarNav>
39
- <SidebarNav.Rail>
40
- <SidebarNav.Trigger>
41
- <Icon name="menu" size={24} />
42
- </SidebarNav.Trigger>
43
- </SidebarNav.Rail>
44
- <SidebarNav.Panel>
45
- <SidebarNav.PanelNav
46
- items={[
47
- {
48
- type: 'group',
49
- id: 'registers',
50
- label: 'Registers',
51
- children: [
52
- { type: 'item', id: 'daily', label: 'Daily attendance', href: '/daily' },
53
- ],
54
- },
55
- ]}
56
- />
57
- </SidebarNav.Panel>
58
- </SidebarNav>,
59
- );
60
-
61
- const registersTrigger = screen.getByRole('button', { name: 'Registers' });
62
- const groupChildren = document.getElementById(registersTrigger.getAttribute('aria-controls')!);
63
- expect(groupChildren).toHaveAttribute('aria-hidden', 'true');
64
-
65
- await userEvent.click(registersTrigger);
66
- expect(groupChildren).toHaveAttribute('aria-hidden', 'false');
67
- expect(screen.getByText('Daily attendance')).toBeInTheDocument();
68
-
69
- await userEvent.click(registersTrigger);
70
- expect(groupChildren).toHaveAttribute('aria-hidden', 'true');
71
- });
72
-
73
- test('renders group row as a button with aria-expanded', () => {
74
- render(
75
- <SidebarNav>
76
- <SidebarNav.Rail>
77
- <SidebarNav.Trigger>
78
- <Icon name="menu" size={24} />
79
- </SidebarNav.Trigger>
80
- </SidebarNav.Rail>
81
- <SidebarNav.Panel>
82
- <SidebarNav.PanelNav
83
- items={[
84
- {
85
- type: 'group',
86
- id: 'registers',
87
- label: 'Registers',
88
- children: [],
89
- },
90
- ]}
91
- />
92
- </SidebarNav.Panel>
93
- </SidebarNav>,
94
- );
95
-
96
- const registers = screen.getByRole('button', { name: 'Registers' });
97
- expect(registers).toHaveAttribute('aria-expanded', 'false');
98
- expect(registers.tagName).toBe('BUTTON');
99
- });
100
-
101
- test('supports nested groups (sub-sub menus)', async () => {
102
- render(
103
- <SidebarNav>
104
- <SidebarNav.Rail>
105
- <SidebarNav.Trigger>
106
- <Icon name="menu" size={24} />
107
- </SidebarNav.Trigger>
108
- </SidebarNav.Rail>
109
- <SidebarNav.Panel>
110
- <SidebarNav.PanelNav
111
- items={[
112
- {
113
- type: 'group',
114
- id: 'a',
115
- label: 'A',
116
- children: [
117
- {
118
- type: 'group',
119
- id: 'b',
120
- label: 'B',
121
- children: [{ type: 'item', id: 'c', label: 'C', href: '/c' }],
122
- },
123
- ],
124
- },
125
- ]}
126
- />
127
- </SidebarNav.Panel>
128
- </SidebarNav>,
129
- );
130
-
131
- const triggerA = screen.getByRole('button', { name: 'A' });
132
- const groupAChildren = document.getElementById(triggerA.getAttribute('aria-controls')!);
133
- const triggerB = screen.getByRole('button', { name: 'B', hidden: true });
134
- const groupC = document.getElementById(triggerB.getAttribute('aria-controls')!);
135
-
136
- expect(groupC).toHaveAttribute('aria-hidden', 'true');
137
- await userEvent.click(triggerA);
138
- expect(groupAChildren).toHaveAttribute('aria-hidden', 'false');
139
- expect(groupC).toHaveAttribute('aria-hidden', 'true');
140
- await userEvent.click(screen.getByRole('button', { name: 'B' }));
141
- expect(groupC).toHaveAttribute('aria-hidden', 'false');
142
- expect(screen.getByText('C')).toBeInTheDocument();
143
- });
144
-
145
- test('uses renderLink for leaf items', () => {
146
- const renderLink = vi.fn(({
147
- href,
148
- className,
149
- children,
150
- ariaCurrent,
151
- onClick,
152
- linkProps,
153
- }) => (
154
- <a
155
- href={href}
156
- className={className}
157
- data-custom-link="true"
158
- {...(ariaCurrent ? { 'aria-current': ariaCurrent } : {})}
159
- {...linkProps}
160
- onClick={onClick}
161
- >
162
- {children}
163
- </a>
164
- ));
165
-
166
- render(
167
- <SidebarNav renderLink={renderLink}>
168
- <SidebarNav.Rail>
169
- <SidebarNav.Trigger>
170
- <Icon name="menu" size={24} />
171
- </SidebarNav.Trigger>
172
- </SidebarNav.Rail>
173
- <SidebarNav.Panel>
174
- <SidebarNav.PanelNav
175
- items={[
176
- { type: 'item', id: 'home', label: 'Home', href: '/' },
177
- ]}
178
- />
179
- </SidebarNav.Panel>
180
- </SidebarNav>,
181
- );
182
-
183
- expect(screen.getByText('Home').closest('a')).toHaveAttribute('data-custom-link', 'true');
184
- expect(renderLink).toHaveBeenCalledWith(
185
- expect.objectContaining({
186
- linkProps: undefined,
187
- }),
188
- );
189
- });
190
-
191
- test('passes linkProps through renderLink for panel items', () => {
192
- const renderLink = vi.fn(({ href, className, children, linkProps }) => (
193
- <a href={href} className={className} data-custom-link="true" {...linkProps}>
194
- {children}
195
- </a>
196
- ));
197
-
198
- render(
199
- <SidebarNav renderLink={renderLink}>
200
- <SidebarNav.Rail>
201
- <SidebarNav.Trigger>
202
- <Icon name="menu" size={24} />
203
- </SidebarNav.Trigger>
204
- </SidebarNav.Rail>
205
- <SidebarNav.Panel>
206
- <SidebarNav.PanelNav>
207
- <SidebarNav.Item itemId="daily" href="/daily" linkProps={{ 'data-track': 'daily' }}>
208
- Daily Attendance
209
- </SidebarNav.Item>
210
- </SidebarNav.PanelNav>
211
- </SidebarNav.Panel>
212
- </SidebarNav>,
213
- );
214
-
215
- expect(screen.getByRole('link', { name: 'Daily Attendance' })).toHaveAttribute('data-track', 'daily');
216
- expect(renderLink).toHaveBeenCalledWith(
217
- expect.objectContaining({
218
- linkProps: { 'data-track': 'daily' },
219
- }),
220
- );
221
- });
222
-
223
- test('passes linkElementProps through renderLink for panel items', () => {
224
- const renderLink = vi.fn(({ href, className, children, linkProps, linkElementProps }) => (
225
- <a
226
- href={href}
227
- className={className}
228
- data-custom-link="true"
229
- {...linkProps}
230
- {...linkElementProps}
231
- >
232
- {children}
233
- </a>
234
- ));
235
-
236
- render(
237
- <SidebarNav renderLink={renderLink}>
238
- <SidebarNav.Rail>
239
- <SidebarNav.Trigger>
240
- <Icon name="menu" size={24} />
241
- </SidebarNav.Trigger>
242
- </SidebarNav.Rail>
243
- <SidebarNav.Panel>
244
- <SidebarNav.PanelNav>
245
- <SidebarNav.Item
246
- itemId="daily"
247
- href="/daily"
248
- linkElementProps={{ 'aria-describedby': 'daily-desc' }}
249
- >
250
- Daily Attendance
251
- </SidebarNav.Item>
252
- </SidebarNav.PanelNav>
253
- </SidebarNav.Panel>
254
- </SidebarNav>,
255
- );
256
-
257
- expect(screen.getByRole('link', { name: 'Daily Attendance' })).toHaveAttribute(
258
- 'aria-describedby',
259
- 'daily-desc',
260
- );
261
- expect(renderLink).toHaveBeenCalledWith(
262
- expect.objectContaining({
263
- linkElementProps: { 'aria-describedby': 'daily-desc' },
264
- }),
265
- );
266
- });
267
-
268
- test('passes ariaLabel through renderLink for rail items', () => {
269
- const renderLink = vi.fn(({ href, className, children, ariaLabel, onClick }) => (
270
- <a
271
- href={href}
272
- className={className}
273
- aria-label={ariaLabel}
274
- data-custom-link="true"
275
- onClick={onClick}
276
- >
277
- {children}
278
- </a>
279
- ));
280
-
281
- render(
282
- <SidebarNav renderLink={renderLink}>
283
- <SidebarNav.Rail>
284
- <SidebarNav.RailList>
285
- <SidebarNav.RailItem href="/favourites" aria-label="Favourites">
286
- <Icon name="favourite-outline" size={24} />
287
- </SidebarNav.RailItem>
288
- </SidebarNav.RailList>
289
- </SidebarNav.Rail>
290
- </SidebarNav>,
291
- );
292
-
293
- expect(screen.getByRole('link', { name: 'Favourites' })).toHaveAttribute('data-custom-link', 'true');
294
- expect(renderLink).toHaveBeenCalledWith(
295
- expect.objectContaining({
296
- ariaLabel: 'Favourites',
297
- }),
298
- );
299
- });
300
-
301
- test('renders onClick-only panel items as buttons', async () => {
302
- const onClick = vi.fn();
303
-
304
- render(
305
- <SidebarNav>
306
- <SidebarNav.Rail>
307
- <SidebarNav.Trigger>
308
- <Icon name="menu" size={24} />
309
- </SidebarNav.Trigger>
310
- </SidebarNav.Rail>
311
- <SidebarNav.Panel>
312
- <SidebarNav.PanelNav
313
- items={[
314
- { type: 'item', id: 'action', label: 'Run action', onClick },
315
- ]}
316
- />
317
- </SidebarNav.Panel>
318
- </SidebarNav>,
319
- );
320
-
321
- const action = screen.getByRole('button', { name: 'Run action' });
322
- expect(action.tagName).toBe('BUTTON');
323
- await userEvent.click(action);
324
- expect(onClick).toHaveBeenCalled();
325
- });
326
-
327
- test('renders composable button items via linkElement', async () => {
328
- const onClick = vi.fn();
329
-
330
- render(
331
- <SidebarNav>
332
- <SidebarNav.Rail>
333
- <SidebarNav.Trigger>
334
- <Icon name="menu" size={24} />
335
- </SidebarNav.Trigger>
336
- </SidebarNav.Rail>
337
- <SidebarNav.Panel>
338
- <SidebarNav.PanelNav>
339
- <SidebarNav.Item
340
- itemId="action"
341
- linkElement="button"
342
- linkElementProps={{ onClick }}
343
- >
344
- Run action
345
- </SidebarNav.Item>
346
- </SidebarNav.PanelNav>
347
- </SidebarNav.Panel>
348
- </SidebarNav>,
349
- );
350
-
351
- await userEvent.click(screen.getByRole('button', { name: 'Run action' }));
352
- expect(onClick).toHaveBeenCalled();
353
- });
354
-
355
- test('prefers top-level onClick over linkElementProps.onClick when both are provided', async () => {
356
- const topLevelOnClick = vi.fn();
357
- const linkElementPropsOnClick = vi.fn();
358
-
359
- render(
360
- <SidebarNav>
361
- <SidebarNav.Rail>
362
- <SidebarNav.Trigger>
363
- <Icon name="menu" size={24} />
364
- </SidebarNav.Trigger>
365
- </SidebarNav.Rail>
366
- <SidebarNav.Panel>
367
- <SidebarNav.PanelNav>
368
- <SidebarNav.Item
369
- itemId="action"
370
- linkElement="button"
371
- onClick={topLevelOnClick}
372
- linkElementProps={{ onClick: linkElementPropsOnClick }}
373
- >
374
- Run action
375
- </SidebarNav.Item>
376
- </SidebarNav.PanelNav>
377
- </SidebarNav.Panel>
378
- </SidebarNav>,
379
- );
380
-
381
- await userEvent.click(screen.getByRole('button', { name: 'Run action' }));
382
- expect(topLevelOnClick).toHaveBeenCalledTimes(1);
383
- expect(linkElementPropsOnClick).not.toHaveBeenCalled();
384
- });
385
-
386
- test('assigns distinct test ids to composable items via required itemId', () => {
387
- render(
388
- <SidebarNav>
389
- <SidebarNav.Rail>
390
- <SidebarNav.Trigger>
391
- <Icon name="menu" size={24} />
392
- </SidebarNav.Trigger>
393
- </SidebarNav.Rail>
394
- <SidebarNav.Panel>
395
- <SidebarNav.PanelNav>
396
- <SidebarNav.Item itemId="first" linkElement="button" linkElementProps={{ onClick: vi.fn() }}>
397
- First action
398
- </SidebarNav.Item>
399
- <SidebarNav.Item itemId="second" linkElement="button" linkElementProps={{ onClick: vi.fn() }}>
400
- Second action
401
- </SidebarNav.Item>
402
- </SidebarNav.PanelNav>
403
- </SidebarNav.Panel>
404
- </SidebarNav>,
405
- );
406
-
407
- expect(screen.getByTestId('sidebar-nav-panel-item-first')).toBeInTheDocument();
408
- expect(screen.getByTestId('sidebar-nav-panel-item-second')).toBeInTheDocument();
409
- });
410
-
411
- test('warns when composable Rail is wrapped and hybrid panel mode is used', () => {
412
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
413
-
414
- render(
415
- <SidebarNav panelTitle="Attendance" panelNavItems={[]}>
416
- <>
417
- <SidebarNav.Rail>
418
- <SidebarNav.Trigger>
419
- <Icon name="menu" size={24} />
420
- </SidebarNav.Trigger>
421
- </SidebarNav.Rail>
422
- </>
423
- </SidebarNav>,
424
- );
425
-
426
- expect(warnSpy).toHaveBeenCalledWith(
427
- expect.stringContaining('SidebarNav.Rail must be a direct child of SidebarNav'),
428
- );
429
-
430
- warnSpy.mockRestore();
431
- });
432
-
433
- test('does not warn for rail-only data-driven sidebar', () => {
434
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
435
-
436
- render(
437
- <SidebarNav
438
- railItems={[
439
- {
440
- id: 'burger',
441
- label: 'Show/hide sub navigation',
442
- iconName: 'menu',
443
- opensPanel: true,
444
- },
445
- ]}
446
- />,
447
- );
448
-
449
- expect(warnSpy).not.toHaveBeenCalled();
450
-
451
- warnSpy.mockRestore();
452
- });
453
-
454
- test('defaults rail nav aria-label to Sidebar rail', () => {
455
- render(
456
- <SidebarNav defaultExpanded={false}>
457
- <SidebarNav.Rail>
458
- <SidebarNav.Trigger>
459
- <Icon name="menu" size={24} />
460
- </SidebarNav.Trigger>
461
- </SidebarNav.Rail>
462
- </SidebarNav>,
463
- );
464
-
465
- expect(screen.getByRole('navigation', { name: 'Sidebar rail' })).toBeInTheDocument();
466
- });
467
-
468
- test('allows overriding rail nav aria-label', () => {
469
- render(
470
- <SidebarNav defaultExpanded={false}>
471
- <SidebarNav.Rail ariaLabel="App shortcuts">
472
- <SidebarNav.Trigger>
473
- <Icon name="menu" size={24} />
474
- </SidebarNav.Trigger>
475
- </SidebarNav.Rail>
476
- </SidebarNav>,
477
- );
478
-
479
- expect(screen.getByRole('navigation', { name: 'App shortcuts' })).toBeInTheDocument();
480
- });
481
-
482
- test('uses data-driven railItems when an empty array is passed', () => {
483
- render(
484
- <SidebarNav railItems={[]} panelTitle="Attendance" panelNavItems={[]} />,
485
- );
486
-
487
- expect(screen.getByTestId('sidebar-nav-rail')).toBeInTheDocument();
488
- expect(screen.queryByTestId('sidebar-nav-rail-item-burger')).not.toBeInTheDocument();
489
- expect(screen.getByText('Attendance')).toBeInTheDocument();
490
- });
491
-
492
- test('prefixes data-driven trigger test id with entry id', () => {
493
- render(
494
- <SidebarNav
495
- railItems={[
496
- {
497
- id: 'burger',
498
- label: 'Show/hide sub navigation',
499
- iconName: 'menu',
500
- opensPanel: true,
501
- },
502
- ]}
503
- panelNavItems={[]}
504
- />,
505
- );
506
-
507
- expect(screen.getByTestId('sidebar-nav-panel-trigger-burger')).toBeInTheDocument();
508
- });
509
-
510
- test('renders favourite button outside the item link with aria-pressed', async () => {
511
- const onFavouriteClick = vi.fn();
512
-
513
- render(
514
- <SidebarNav>
515
- <SidebarNav.Rail>
516
- <SidebarNav.Trigger>
517
- <Icon name="menu" size={24} />
518
- </SidebarNav.Trigger>
519
- </SidebarNav.Rail>
520
- <SidebarNav.Panel>
521
- <SidebarNav.PanelNav
522
- items={[
523
- {
524
- type: 'item',
525
- id: 'daily',
526
- label: 'Daily Attendance',
527
- href: '/daily',
528
- canFavourite: true,
529
- isPressed: true,
530
- favouriteTooltip: 'Remove from favourites',
531
- onFavouriteClick,
532
- },
533
- ]}
534
- />
535
- </SidebarNav.Panel>
536
- </SidebarNav>,
537
- );
538
-
539
- const listItem = screen.getByTestId('sidebar-nav-panel-item-daily');
540
- const link = screen.getByRole('link', { name: 'Daily Attendance' });
541
- const favourite = screen.getByTestId('sidebar-nav-panel-item-favourite-daily');
542
-
543
- expect(listItem).toContainElement(link);
544
- expect(listItem).toContainElement(favourite);
545
- expect(favourite).not.toContainElement(link);
546
- expect(link).not.toContainElement(favourite);
547
- expect(favourite).toHaveAttribute('aria-pressed', 'true');
548
-
549
- await userEvent.click(favourite);
550
- expect(onFavouriteClick).toHaveBeenCalled();
551
- });
552
-
553
- test('uses favouriteTooltip as aria-label on favourite button', () => {
554
- render(
555
- <SidebarNav>
556
- <SidebarNav.Rail>
557
- <SidebarNav.Trigger>
558
- <Icon name="menu" size={24} />
559
- </SidebarNav.Trigger>
560
- </SidebarNav.Rail>
561
- <SidebarNav.Panel>
562
- <SidebarNav.PanelNav
563
- items={[
564
- {
565
- type: 'item',
566
- id: 'daily',
567
- label: 'Daily Attendance',
568
- href: '/daily',
569
- canFavourite: true,
570
- isPressed: false,
571
- favouriteTooltip: 'Add to favourites',
572
- },
573
- ]}
574
- />
575
- </SidebarNav.Panel>
576
- </SidebarNav>,
577
- );
578
-
579
- expect(screen.getByTestId('sidebar-nav-panel-item-favourite-daily')).toHaveAttribute(
580
- 'aria-label',
581
- 'Add to favourites',
582
- );
583
- });
584
-
585
- test('does not render favourite button when canFavourite is false', () => {
586
- render(
587
- <SidebarNav>
588
- <SidebarNav.Rail>
589
- <SidebarNav.Trigger>
590
- <Icon name="menu" size={24} />
591
- </SidebarNav.Trigger>
592
- </SidebarNav.Rail>
593
- <SidebarNav.Panel>
594
- <SidebarNav.PanelNav
595
- items={[
596
- {
597
- type: 'item',
598
- id: 'daily',
599
- label: 'Daily Attendance',
600
- href: '/daily',
601
- canFavourite: false,
602
- },
603
- ]}
604
- />
605
- </SidebarNav.Panel>
606
- </SidebarNav>,
607
- );
608
-
609
- expect(screen.queryByTestId('sidebar-nav-panel-item-favourite-daily')).not.toBeInTheDocument();
610
- });
611
- });