@arbor-education/design-system.components 0.25.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.gather/instructions/project-overview.md +1 -1
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +7 -5
  4. package/component-library.md +97 -3
  5. package/dist/components/emptyState/EmptyState.d.ts +22 -0
  6. package/dist/components/emptyState/EmptyState.d.ts.map +1 -0
  7. package/dist/components/emptyState/EmptyState.js +11 -0
  8. package/dist/components/emptyState/EmptyState.js.map +1 -0
  9. package/dist/components/emptyState/EmptyState.stories.d.ts +117 -0
  10. package/dist/components/emptyState/EmptyState.stories.d.ts.map +1 -0
  11. package/dist/components/emptyState/EmptyState.stories.js +332 -0
  12. package/dist/components/emptyState/EmptyState.stories.js.map +1 -0
  13. package/dist/components/emptyState/EmptyState.test.d.ts +2 -0
  14. package/dist/components/emptyState/EmptyState.test.d.ts.map +1 -0
  15. package/dist/components/emptyState/EmptyState.test.js +80 -0
  16. package/dist/components/emptyState/EmptyState.test.js.map +1 -0
  17. package/dist/components/favourite/FavouriteButton.d.ts +18 -0
  18. package/dist/components/favourite/FavouriteButton.d.ts.map +1 -0
  19. package/dist/components/favourite/FavouriteButton.js +16 -0
  20. package/dist/components/favourite/FavouriteButton.js.map +1 -0
  21. package/dist/components/favourite/FavouriteButton.test.d.ts +2 -0
  22. package/dist/components/favourite/FavouriteButton.test.d.ts.map +1 -0
  23. package/dist/components/favourite/FavouriteButton.test.js +37 -0
  24. package/dist/components/favourite/FavouriteButton.test.js.map +1 -0
  25. package/dist/components/filterBar/FilterBar.d.ts +1 -1
  26. package/dist/components/filterBar/FilterBar.stories.d.ts +1 -1
  27. package/dist/components/icon/Icon.d.ts +1 -1
  28. package/dist/components/icon/Icon.d.ts.map +1 -1
  29. package/dist/components/icon/Icon.js +1 -1
  30. package/dist/components/icon/Icon.js.map +1 -1
  31. package/dist/components/pill/Pill.d.ts +3 -2
  32. package/dist/components/pill/Pill.d.ts.map +1 -1
  33. package/dist/components/pill/Pill.js +15 -9
  34. package/dist/components/pill/Pill.js.map +1 -1
  35. package/dist/components/pill/Pill.stories.d.ts +21 -3
  36. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  37. package/dist/components/pill/Pill.stories.js +275 -40
  38. package/dist/components/pill/Pill.stories.js.map +1 -1
  39. package/dist/components/pill/Pill.test.js +64 -3
  40. package/dist/components/pill/Pill.test.js.map +1 -1
  41. package/dist/components/sideNavigation/SideNavigation.d.ts +34 -0
  42. package/dist/components/sideNavigation/SideNavigation.d.ts.map +1 -0
  43. package/dist/components/sideNavigation/SideNavigation.js +30 -0
  44. package/dist/components/sideNavigation/SideNavigation.js.map +1 -0
  45. package/dist/components/sideNavigation/SideNavigation.stories.d.ts +72 -0
  46. package/dist/components/sideNavigation/SideNavigation.stories.d.ts.map +1 -0
  47. package/dist/components/sideNavigation/SideNavigation.stories.js +298 -0
  48. package/dist/components/sideNavigation/SideNavigation.stories.js.map +1 -0
  49. package/dist/components/sideNavigation/SideNavigation.test.d.ts +2 -0
  50. package/dist/components/sideNavigation/SideNavigation.test.d.ts.map +1 -0
  51. package/dist/components/sideNavigation/SideNavigation.test.js +74 -0
  52. package/dist/components/sideNavigation/SideNavigation.test.js.map +1 -0
  53. package/dist/components/sideNavigation/SideNavigationContext.d.ts +10 -0
  54. package/dist/components/sideNavigation/SideNavigationContext.d.ts.map +1 -0
  55. package/dist/components/sideNavigation/SideNavigationContext.js +15 -0
  56. package/dist/components/sideNavigation/SideNavigationContext.js.map +1 -0
  57. package/dist/components/{sidebarNav/SidebarNavGroup.d.ts → sideNavigation/SideNavigationGroup.d.ts} +3 -3
  58. package/dist/components/sideNavigation/SideNavigationGroup.d.ts.map +1 -0
  59. package/dist/components/sideNavigation/SideNavigationGroup.js +16 -0
  60. package/dist/components/sideNavigation/SideNavigationGroup.js.map +1 -0
  61. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts +2 -0
  62. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts.map +1 -0
  63. package/dist/components/sideNavigation/SideNavigationGroup.test.js +58 -0
  64. package/dist/components/sideNavigation/SideNavigationGroup.test.js.map +1 -0
  65. package/dist/components/{sidebarNav/SidebarNavItem.d.ts → sideNavigation/SideNavigationItem.d.ts} +11 -12
  66. package/dist/components/sideNavigation/SideNavigationItem.d.ts.map +1 -0
  67. package/dist/components/sideNavigation/SideNavigationItem.js +28 -0
  68. package/dist/components/sideNavigation/SideNavigationItem.js.map +1 -0
  69. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts +2 -0
  70. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts.map +1 -0
  71. package/dist/components/sideNavigation/SideNavigationItem.test.js +65 -0
  72. package/dist/components/sideNavigation/SideNavigationItem.test.js.map +1 -0
  73. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts +8 -0
  74. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts.map +1 -0
  75. package/dist/components/{sidebarNav/SidebarNavItemFavourite.js → sideNavigation/SideNavigationItemFavourite.js} +5 -5
  76. package/dist/components/sideNavigation/SideNavigationItemFavourite.js.map +1 -0
  77. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts +2 -0
  78. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts.map +1 -0
  79. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js +31 -0
  80. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js.map +1 -0
  81. package/dist/components/sideNavigation/SideNavigationTitle.d.ts +4 -0
  82. package/dist/components/sideNavigation/SideNavigationTitle.d.ts.map +1 -0
  83. package/dist/components/sideNavigation/SideNavigationTitle.js +7 -0
  84. package/dist/components/sideNavigation/SideNavigationTitle.js.map +1 -0
  85. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts +2 -0
  86. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts.map +1 -0
  87. package/dist/components/sideNavigation/SideNavigationTitle.test.js +22 -0
  88. package/dist/components/sideNavigation/SideNavigationTitle.test.js.map +1 -0
  89. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts +7 -0
  90. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts.map +1 -0
  91. package/dist/components/{sidebarNav/SidebarNavTooltip.js → sideNavigation/SideNavigationTooltip.js} +2 -2
  92. package/dist/components/sideNavigation/SideNavigationTooltip.js.map +1 -0
  93. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts +2 -0
  94. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts.map +1 -0
  95. package/dist/components/sideNavigation/SideNavigationTooltip.test.js +26 -0
  96. package/dist/components/sideNavigation/SideNavigationTooltip.test.js.map +1 -0
  97. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts +4 -0
  98. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts.map +1 -0
  99. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.js +5 -4
  100. package/dist/components/sideNavigation/resolvePanelItemProps.js.map +1 -0
  101. package/dist/components/sideNavigation/resolvePanelItemProps.test.d.ts.map +1 -0
  102. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.js +18 -4
  103. package/dist/components/sideNavigation/resolvePanelItemProps.test.js.map +1 -0
  104. package/dist/components/sideNavigation/types.d.ts +47 -0
  105. package/dist/components/sideNavigation/types.d.ts.map +1 -0
  106. package/dist/components/sideNavigation/types.js +2 -0
  107. package/dist/components/sideNavigation/types.js.map +1 -0
  108. package/dist/components/sidebar/Sidebar.d.ts +13 -0
  109. package/dist/components/sidebar/Sidebar.d.ts.map +1 -0
  110. package/dist/components/sidebar/Sidebar.js +9 -0
  111. package/dist/components/sidebar/Sidebar.js.map +1 -0
  112. package/dist/components/sidebar/Sidebar.stories.d.ts +48 -0
  113. package/dist/components/sidebar/Sidebar.stories.d.ts.map +1 -0
  114. package/dist/components/sidebar/Sidebar.stories.js +444 -0
  115. package/dist/components/sidebar/Sidebar.stories.js.map +1 -0
  116. package/dist/components/sidebar/Sidebar.test.d.ts +2 -0
  117. package/dist/components/sidebar/Sidebar.test.d.ts.map +1 -0
  118. package/dist/components/sidebar/Sidebar.test.js +81 -0
  119. package/dist/components/sidebar/Sidebar.test.js.map +1 -0
  120. package/dist/components/sidebar/SidebarItem.d.ts +7 -0
  121. package/dist/components/sidebar/SidebarItem.d.ts.map +1 -0
  122. package/dist/components/sidebar/SidebarItem.js +11 -0
  123. package/dist/components/sidebar/SidebarItem.js.map +1 -0
  124. package/dist/components/singleUser/SingleUser.d.ts +1 -1
  125. package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
  126. package/dist/components/toast/Toast.d.ts +11 -2
  127. package/dist/components/toast/Toast.d.ts.map +1 -1
  128. package/dist/components/toast/Toast.js +5 -3
  129. package/dist/components/toast/Toast.js.map +1 -1
  130. package/dist/components/toast/Toast.stories.d.ts +15 -3
  131. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  132. package/dist/components/toast/Toast.stories.js +43 -41
  133. package/dist/components/toast/Toast.stories.js.map +1 -1
  134. package/dist/components/toast/Toast.test.js +19 -4
  135. package/dist/components/toast/Toast.test.js.map +1 -1
  136. package/dist/components/toast/ToastAction.d.ts +7 -0
  137. package/dist/components/toast/ToastAction.d.ts.map +1 -0
  138. package/dist/components/toast/ToastAction.js +9 -0
  139. package/dist/components/toast/ToastAction.js.map +1 -0
  140. package/dist/components/tooltip/TooltipWrapper.d.ts +1 -0
  141. package/dist/components/tooltip/TooltipWrapper.d.ts.map +1 -1
  142. package/dist/components/tooltip/TooltipWrapper.js +2 -2
  143. package/dist/components/tooltip/TooltipWrapper.js.map +1 -1
  144. package/dist/components/widget/Widget.d.ts +18 -0
  145. package/dist/components/widget/Widget.d.ts.map +1 -0
  146. package/dist/components/widget/Widget.js +51 -0
  147. package/dist/components/widget/Widget.js.map +1 -0
  148. package/dist/components/widget/Widget.stories.d.ts +128 -0
  149. package/dist/components/widget/Widget.stories.d.ts.map +1 -0
  150. package/dist/components/widget/Widget.stories.js +417 -0
  151. package/dist/components/widget/Widget.stories.js.map +1 -0
  152. package/dist/components/widget/Widget.test.d.ts +2 -0
  153. package/dist/components/widget/Widget.test.d.ts.map +1 -0
  154. package/dist/components/widget/Widget.test.js +110 -0
  155. package/dist/components/widget/Widget.test.js.map +1 -0
  156. package/dist/components/widget/WidgetBody.d.ts +6 -0
  157. package/dist/components/widget/WidgetBody.d.ts.map +1 -0
  158. package/dist/components/widget/WidgetBody.js +20 -0
  159. package/dist/components/widget/WidgetBody.js.map +1 -0
  160. package/dist/components/widget/WidgetContext.d.ts +20 -0
  161. package/dist/components/widget/WidgetContext.d.ts.map +1 -0
  162. package/dist/components/widget/WidgetContext.js +10 -0
  163. package/dist/components/widget/WidgetContext.js.map +1 -0
  164. package/dist/components/widget/WidgetHeader.d.ts +8 -0
  165. package/dist/components/widget/WidgetHeader.d.ts.map +1 -0
  166. package/dist/components/widget/WidgetHeader.js +56 -0
  167. package/dist/components/widget/WidgetHeader.js.map +1 -0
  168. package/dist/components/widget/types.d.ts +43 -0
  169. package/dist/components/widget/types.d.ts.map +1 -0
  170. package/dist/components/widget/types.js +2 -0
  171. package/dist/components/widget/types.js.map +1 -0
  172. package/dist/components/widgetCalendar/WidgetCalendar.d.ts +35 -0
  173. package/dist/components/widgetCalendar/WidgetCalendar.d.ts.map +1 -0
  174. package/dist/components/widgetCalendar/WidgetCalendar.js +22 -0
  175. package/dist/components/widgetCalendar/WidgetCalendar.js.map +1 -0
  176. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts +60 -0
  177. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts.map +1 -0
  178. package/dist/components/widgetCalendar/WidgetCalendar.stories.js +140 -0
  179. package/dist/components/widgetCalendar/WidgetCalendar.stories.js.map +1 -0
  180. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts +2 -0
  181. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts.map +1 -0
  182. package/dist/components/widgetCalendar/WidgetCalendar.test.js +88 -0
  183. package/dist/components/widgetCalendar/WidgetCalendar.test.js.map +1 -0
  184. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts +17 -0
  185. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts.map +1 -0
  186. package/dist/components/widgetCalendar/WidgetCalendarItem.js +25 -0
  187. package/dist/components/widgetCalendar/WidgetCalendarItem.js.map +1 -0
  188. package/dist/components/widgetFavourites/WidgetFavourites.d.ts +12 -0
  189. package/dist/components/widgetFavourites/WidgetFavourites.d.ts.map +1 -0
  190. package/dist/components/widgetFavourites/WidgetFavourites.js +23 -0
  191. package/dist/components/widgetFavourites/WidgetFavourites.js.map +1 -0
  192. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts +84 -0
  193. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts.map +1 -0
  194. package/dist/components/widgetFavourites/WidgetFavourites.stories.js +210 -0
  195. package/dist/components/widgetFavourites/WidgetFavourites.stories.js.map +1 -0
  196. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts +2 -0
  197. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts.map +1 -0
  198. package/dist/components/widgetFavourites/WidgetFavourites.test.js +67 -0
  199. package/dist/components/widgetFavourites/WidgetFavourites.test.js.map +1 -0
  200. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts +3 -0
  201. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts.map +1 -0
  202. package/dist/components/widgetFavourites/WidgetFavouritesItem.js +10 -0
  203. package/dist/components/widgetFavourites/WidgetFavouritesItem.js.map +1 -0
  204. package/dist/components/widgetFavourites/types.d.ts +25 -0
  205. package/dist/components/widgetFavourites/types.d.ts.map +1 -0
  206. package/dist/components/widgetFavourites/types.js +2 -0
  207. package/dist/components/widgetFavourites/types.js.map +1 -0
  208. package/dist/components/widgetNotifications/WidgetNotifications.d.ts +33 -0
  209. package/dist/components/widgetNotifications/WidgetNotifications.d.ts.map +1 -0
  210. package/dist/components/widgetNotifications/WidgetNotifications.js +18 -0
  211. package/dist/components/widgetNotifications/WidgetNotifications.js.map +1 -0
  212. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts +60 -0
  213. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts.map +1 -0
  214. package/dist/components/widgetNotifications/WidgetNotifications.stories.js +269 -0
  215. package/dist/components/widgetNotifications/WidgetNotifications.stories.js.map +1 -0
  216. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts +2 -0
  217. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts.map +1 -0
  218. package/dist/components/widgetNotifications/WidgetNotifications.test.js +79 -0
  219. package/dist/components/widgetNotifications/WidgetNotifications.test.js.map +1 -0
  220. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts +14 -0
  221. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts.map +1 -0
  222. package/dist/components/widgetNotifications/WidgetNotificationsItem.js +14 -0
  223. package/dist/components/widgetNotifications/WidgetNotificationsItem.js.map +1 -0
  224. package/dist/index.css +756 -78
  225. package/dist/index.css.map +1 -1
  226. package/dist/index.d.ts +15 -9
  227. package/dist/index.d.ts.map +1 -1
  228. package/dist/index.js +15 -8
  229. package/dist/index.js.map +1 -1
  230. package/dist/utils/favourites/favouriteConstants.d.ts +12 -0
  231. package/dist/utils/favourites/favouriteConstants.d.ts.map +1 -0
  232. package/dist/utils/favourites/favouriteConstants.js +16 -0
  233. package/dist/utils/favourites/favouriteConstants.js.map +1 -0
  234. package/dist/utils/favourites/favouriteConstants.test.d.ts +2 -0
  235. package/dist/utils/favourites/favouriteConstants.test.d.ts.map +1 -0
  236. package/dist/utils/favourites/favouriteConstants.test.js +12 -0
  237. package/dist/utils/favourites/favouriteConstants.test.js.map +1 -0
  238. package/dist/utils/hooks/useControllableBoolean.d.ts.map +1 -0
  239. package/dist/utils/hooks/useControllableBoolean.js.map +1 -0
  240. package/dist/utils/hooks/useControllableBoolean.test.d.ts +2 -0
  241. package/dist/utils/hooks/useControllableBoolean.test.d.ts.map +1 -0
  242. package/dist/utils/hooks/useControllableBoolean.test.js +34 -0
  243. package/dist/utils/hooks/useControllableBoolean.test.js.map +1 -0
  244. package/package.json +1 -1
  245. package/src/components/emptyState/EmptyState.stories.tsx +487 -0
  246. package/src/components/emptyState/EmptyState.test.tsx +140 -0
  247. package/src/components/emptyState/EmptyState.tsx +84 -0
  248. package/src/components/emptyState/emptyState.scss +63 -0
  249. package/src/components/favourite/FavouriteButton.test.tsx +83 -0
  250. package/src/components/favourite/FavouriteButton.tsx +70 -0
  251. package/src/components/favourite/favouriteButton.scss +37 -0
  252. package/src/components/icon/Icon.tsx +2 -2
  253. package/src/components/link/link.scss +26 -0
  254. package/src/components/pill/Pill.stories.tsx +432 -41
  255. package/src/components/pill/Pill.test.tsx +74 -3
  256. package/src/components/pill/Pill.tsx +26 -11
  257. package/src/components/sideNavigation/SideNavigation.stories.tsx +578 -0
  258. package/src/components/sideNavigation/SideNavigation.test.tsx +109 -0
  259. package/src/components/sideNavigation/SideNavigation.tsx +98 -0
  260. package/src/components/sideNavigation/SideNavigationContext.tsx +25 -0
  261. package/src/components/sideNavigation/SideNavigationGroup.test.tsx +103 -0
  262. package/src/components/{sidebarNav/SidebarNavGroup.tsx → sideNavigation/SideNavigationGroup.tsx} +8 -8
  263. package/src/components/sideNavigation/SideNavigationItem.test.tsx +137 -0
  264. package/src/components/sideNavigation/SideNavigationItem.tsx +125 -0
  265. package/src/components/sideNavigation/SideNavigationItemFavourite.test.tsx +54 -0
  266. package/src/components/{sidebarNav/SidebarNavItemFavourite.tsx → sideNavigation/SideNavigationItemFavourite.tsx} +7 -7
  267. package/src/components/sideNavigation/SideNavigationTitle.test.tsx +23 -0
  268. package/src/components/sideNavigation/SideNavigationTitle.tsx +13 -0
  269. package/src/components/sideNavigation/SideNavigationTooltip.test.tsx +44 -0
  270. package/src/components/{sidebarNav/SidebarNavTooltip.tsx → sideNavigation/SideNavigationTooltip.tsx} +2 -2
  271. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.ts +20 -4
  272. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.ts +8 -7
  273. package/src/components/{sidebarNav/sidebarNav.scss → sideNavigation/sideNavigation.scss} +37 -136
  274. package/src/components/sideNavigation/types.ts +56 -0
  275. package/src/components/sidebar/Sidebar.stories.tsx +670 -0
  276. package/src/components/sidebar/Sidebar.test.tsx +155 -0
  277. package/src/components/sidebar/Sidebar.tsx +27 -0
  278. package/src/components/sidebar/SidebarItem.tsx +64 -0
  279. package/src/components/sidebar/sidebar.scss +65 -0
  280. package/src/components/toast/Toast.stories.tsx +75 -67
  281. package/src/components/toast/Toast.test.tsx +40 -10
  282. package/src/components/toast/Toast.tsx +19 -5
  283. package/src/components/toast/ToastAction.tsx +17 -0
  284. package/src/components/toast/toast.scss +37 -0
  285. package/src/components/tooltip/TooltipWrapper.tsx +3 -1
  286. package/src/components/widget/Widget.stories.tsx +600 -0
  287. package/src/components/widget/Widget.test.tsx +263 -0
  288. package/src/components/widget/Widget.tsx +102 -0
  289. package/src/components/widget/WidgetBody.tsx +66 -0
  290. package/src/components/widget/WidgetContext.tsx +31 -0
  291. package/src/components/widget/WidgetHeader.tsx +155 -0
  292. package/src/components/widget/types.ts +47 -0
  293. package/src/components/widget/widget.scss +218 -0
  294. package/src/components/widgetCalendar/WidgetCalendar.stories.tsx +241 -0
  295. package/src/components/widgetCalendar/WidgetCalendar.test.tsx +137 -0
  296. package/src/components/widgetCalendar/WidgetCalendar.tsx +105 -0
  297. package/src/components/widgetCalendar/WidgetCalendarItem.tsx +105 -0
  298. package/src/components/widgetCalendar/widgetCalendar.scss +124 -0
  299. package/src/components/widgetFavourites/WidgetFavourites.stories.tsx +341 -0
  300. package/src/components/widgetFavourites/WidgetFavourites.test.tsx +127 -0
  301. package/src/components/widgetFavourites/WidgetFavourites.tsx +83 -0
  302. package/src/components/widgetFavourites/WidgetFavouritesItem.tsx +37 -0
  303. package/src/components/widgetFavourites/types.ts +26 -0
  304. package/src/components/widgetFavourites/widgetFavourites.scss +84 -0
  305. package/src/components/widgetNotifications/WidgetNotifications.stories.tsx +417 -0
  306. package/src/components/widgetNotifications/WidgetNotifications.test.tsx +152 -0
  307. package/src/components/widgetNotifications/WidgetNotifications.tsx +112 -0
  308. package/src/components/widgetNotifications/WidgetNotificationsItem.tsx +88 -0
  309. package/src/components/widgetNotifications/widgetNotifications.scss +186 -0
  310. package/src/docs/Contributing.mdx +1 -1
  311. package/src/index.scss +9 -1
  312. package/src/index.ts +22 -18
  313. package/src/tokens.scss +12 -2
  314. package/src/utils/favourites/favouriteConstants.test.ts +19 -0
  315. package/src/utils/favourites/favouriteConstants.ts +21 -0
  316. package/src/utils/hooks/useControllableBoolean.test.ts +48 -0
  317. package/dist/components/sidebarNav/SidebarNav.d.ts +0 -46
  318. package/dist/components/sidebarNav/SidebarNav.d.ts.map +0 -1
  319. package/dist/components/sidebarNav/SidebarNav.js +0 -102
  320. package/dist/components/sidebarNav/SidebarNav.js.map +0 -1
  321. package/dist/components/sidebarNav/SidebarNav.stories.d.ts +0 -61
  322. package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +0 -1
  323. package/dist/components/sidebarNav/SidebarNav.stories.js +0 -253
  324. package/dist/components/sidebarNav/SidebarNav.stories.js.map +0 -1
  325. package/dist/components/sidebarNav/SidebarNav.test.d.ts +0 -2
  326. package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +0 -1
  327. package/dist/components/sidebarNav/SidebarNav.test.js +0 -240
  328. package/dist/components/sidebarNav/SidebarNav.test.js.map +0 -1
  329. package/dist/components/sidebarNav/SidebarNavContext.d.ts +0 -13
  330. package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +0 -1
  331. package/dist/components/sidebarNav/SidebarNavContext.js +0 -15
  332. package/dist/components/sidebarNav/SidebarNavContext.js.map +0 -1
  333. package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +0 -1
  334. package/dist/components/sidebarNav/SidebarNavGroup.js +0 -16
  335. package/dist/components/sidebarNav/SidebarNavGroup.js.map +0 -1
  336. package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +0 -1
  337. package/dist/components/sidebarNav/SidebarNavItem.js +0 -44
  338. package/dist/components/sidebarNav/SidebarNavItem.js.map +0 -1
  339. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +0 -8
  340. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +0 -1
  341. package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +0 -1
  342. package/dist/components/sidebarNav/SidebarNavPanel.d.ts +0 -4
  343. package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +0 -1
  344. package/dist/components/sidebarNav/SidebarNavPanel.js +0 -9
  345. package/dist/components/sidebarNav/SidebarNavPanel.js.map +0 -1
  346. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +0 -10
  347. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +0 -1
  348. package/dist/components/sidebarNav/SidebarNavPanelNav.js +0 -21
  349. package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +0 -1
  350. package/dist/components/sidebarNav/SidebarNavRail.d.ts +0 -6
  351. package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +0 -1
  352. package/dist/components/sidebarNav/SidebarNavRail.js +0 -7
  353. package/dist/components/sidebarNav/SidebarNavRail.js.map +0 -1
  354. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +0 -10
  355. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +0 -1
  356. package/dist/components/sidebarNav/SidebarNavRailItem.js +0 -25
  357. package/dist/components/sidebarNav/SidebarNavRailItem.js.map +0 -1
  358. package/dist/components/sidebarNav/SidebarNavRailList.d.ts +0 -4
  359. package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +0 -1
  360. package/dist/components/sidebarNav/SidebarNavRailList.js +0 -7
  361. package/dist/components/sidebarNav/SidebarNavRailList.js.map +0 -1
  362. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +0 -6
  363. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +0 -1
  364. package/dist/components/sidebarNav/SidebarNavRailSlot.js +0 -7
  365. package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +0 -1
  366. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +0 -6
  367. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +0 -1
  368. package/dist/components/sidebarNav/SidebarNavSeparator.js +0 -8
  369. package/dist/components/sidebarNav/SidebarNavSeparator.js.map +0 -1
  370. package/dist/components/sidebarNav/SidebarNavTitle.d.ts +0 -4
  371. package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +0 -1
  372. package/dist/components/sidebarNav/SidebarNavTitle.js +0 -7
  373. package/dist/components/sidebarNav/SidebarNavTitle.js.map +0 -1
  374. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +0 -7
  375. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +0 -1
  376. package/dist/components/sidebarNav/SidebarNavTooltip.js.map +0 -1
  377. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +0 -8
  378. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +0 -1
  379. package/dist/components/sidebarNav/SidebarNavTrigger.js +0 -15
  380. package/dist/components/sidebarNav/SidebarNavTrigger.js.map +0 -1
  381. package/dist/components/sidebarNav/index.d.ts +0 -4
  382. package/dist/components/sidebarNav/index.d.ts.map +0 -1
  383. package/dist/components/sidebarNav/index.js +0 -3
  384. package/dist/components/sidebarNav/index.js.map +0 -1
  385. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +0 -4
  386. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +0 -1
  387. package/dist/components/sidebarNav/resolvePanelItemProps.js.map +0 -1
  388. package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +0 -1
  389. package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +0 -1
  390. package/dist/components/sidebarNav/types.d.ts +0 -100
  391. package/dist/components/sidebarNav/types.d.ts.map +0 -1
  392. package/dist/components/sidebarNav/types.js +0 -4
  393. package/dist/components/sidebarNav/types.js.map +0 -1
  394. package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +0 -1
  395. package/dist/components/sidebarNav/useControllableBoolean.js.map +0 -1
  396. package/src/components/sidebarNav/SidebarNav.stories.tsx +0 -484
  397. package/src/components/sidebarNav/SidebarNav.test.tsx +0 -611
  398. package/src/components/sidebarNav/SidebarNav.tsx +0 -230
  399. package/src/components/sidebarNav/SidebarNavContext.tsx +0 -28
  400. package/src/components/sidebarNav/SidebarNavItem.tsx +0 -162
  401. package/src/components/sidebarNav/SidebarNavPanel.tsx +0 -20
  402. package/src/components/sidebarNav/SidebarNavPanelNav.tsx +0 -55
  403. package/src/components/sidebarNav/SidebarNavRail.tsx +0 -20
  404. package/src/components/sidebarNav/SidebarNavRailItem.tsx +0 -83
  405. package/src/components/sidebarNav/SidebarNavRailList.tsx +0 -11
  406. package/src/components/sidebarNav/SidebarNavRailSlot.tsx +0 -15
  407. package/src/components/sidebarNav/SidebarNavSeparator.tsx +0 -19
  408. package/src/components/sidebarNav/SidebarNavTitle.tsx +0 -13
  409. package/src/components/sidebarNav/SidebarNavTrigger.tsx +0 -52
  410. package/src/components/sidebarNav/index.ts +0 -6
  411. package/src/components/sidebarNav/types.ts +0 -126
  412. /package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.d.ts +0 -0
  413. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.d.ts +0 -0
  414. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.js +0 -0
  415. /package/src/{components/sidebarNav → utils/hooks}/useControllableBoolean.ts +0 -0
package/src/tokens.scss CHANGED
@@ -27,6 +27,9 @@
27
27
  --size-control-large: 4rem;
28
28
  --size-control-xlarge: 5rem;
29
29
  --shadow-small: 0 4px 12px 0 rgba(32, 32, 32, 0.08);
30
+ --shadow-medium: 0 8px 24px 0 rgba(32, 32, 32, 0.12);
31
+ --z-index-popup: 1;
32
+ --z-index-toast: 10;
30
33
  --page-sign-in-color-background: #fffcf8;
31
34
  --color-grey-100: #efefef;
32
35
  --color-grey-200: #dfdfdf;
@@ -832,6 +835,12 @@
832
835
  --widget-calendar-weight-border: var(--border-weight);
833
836
  --widget-calendar-spacing-vertical: var(--spacing-medium);
834
837
  --widget-calendar-spacing-horizontal: var(--spacing-small);
838
+ --widget-calendar-list-gap: var(--spacing-xsmall);
839
+ --widget-calendar-type-bar-width: 3px;
840
+ --widget-calendar-type-bar-radius: var(--border-radius-xsmall);
841
+ --widget-calendar-type-primary-color: var(--color-brand-500);
842
+ --widget-calendar-type-secondary-color: var(--color-grey-300);
843
+ --widget-calendar-color-title: var(--color-grey-900);
835
844
  --widget-list-row-hover-hover-bg: var(--color-grey-050);
836
845
  --widget-list-row-hover-color-icon-arrow: var(--color-grey-900);
837
846
  --widget-list-row-active-active-bg: var(--color-grey-200);
@@ -880,6 +889,7 @@
880
889
  --widget-attachments-default-color-background: var(--color-grey-050);
881
890
  --widget-attachments-spacing-vertical: var(--spacing-large);
882
891
  --widget-attachments-spacing-horizontal: var(--spacing-small);
892
+ --widget-notifications-timestamp-font-size: 0.625rem; // 10px
883
893
  --widget-notifications-read-focus-icon-hover-color-background: var(--color-grey-050);
884
894
  --widget-notifications-read-focus-icon-active-color-background: var(--color-grey-100);
885
895
  --widget-notifications-read-focus-icon-default-color-background: var(--color-mono-white);
@@ -909,11 +919,11 @@
909
919
  --widget-notifications-unread-default-color-background: var(--color-brand-050);
910
920
  --widget-notifications-unread-color-text: var(--color-brand-900);
911
921
  --widget-notifications-unread-color-title: var(--color-brand-900);
912
- --widget-notifications-x-posted-spacing-vertical-gap: var(--spacing-small);
922
+ --widget-notifications-secondary-spacing-vertical-gap: var(--spacing-xsmall);
913
923
  --widget-notifications-color-text: var(--color-grey-600);
914
924
  --widget-notifications-color-title: var(--color-grey-900);
915
925
  --widget-notifications-spacing-vertical: var(--spacing-small);
916
- --widget-notifications-spacing-horizointal: var(--spacing-small);
926
+ --widget-notifications-spacing-horizontal: var(--spacing-small);
917
927
  --widget-notifications-spacing-vertical-gap: var(--spacing-small);
918
928
  --filters-hover-color-background: var(--color-grey-100);
919
929
  --filters-radius: var(--border-radius-small);
@@ -0,0 +1,19 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import {
3
+ FAVOURITE_TOOLTIP,
4
+ getFavouriteRemovedToastMessage,
5
+ getFavouriteTooltip,
6
+ } from './favouriteConstants.js';
7
+
8
+ describe('favouriteConstants', () => {
9
+ test('getFavouriteTooltip returns add or remove copy', () => {
10
+ expect(getFavouriteTooltip(false)).toBe(FAVOURITE_TOOLTIP.add);
11
+ expect(getFavouriteTooltip(true)).toBe(FAVOURITE_TOOLTIP.remove);
12
+ });
13
+
14
+ test('getFavouriteRemovedToastMessage includes item label', () => {
15
+ expect(getFavouriteRemovedToastMessage('Daily Attendance')).toBe(
16
+ 'Daily Attendance removed from favourites',
17
+ );
18
+ });
19
+ });
@@ -0,0 +1,21 @@
1
+ import type { IconName } from 'Components/icon/allowedIcons';
2
+
3
+ export const FAVOURITE_ICON = {
4
+ outline: 'favourite-outline',
5
+ filled: 'favourite-filled',
6
+ } as const satisfies Record<'outline' | 'filled', IconName>;
7
+
8
+ export const FAVOURITE_FILLED_ICON_COLOR = 'var(--color-brand-600)';
9
+
10
+ export const FAVOURITE_TOOLTIP = {
11
+ add: 'Add to favourites',
12
+ remove: 'Remove from favourites',
13
+ } as const;
14
+
15
+ export function getFavouriteTooltip(isFavourited: boolean): string {
16
+ return isFavourited ? FAVOURITE_TOOLTIP.remove : FAVOURITE_TOOLTIP.add;
17
+ }
18
+
19
+ export function getFavouriteRemovedToastMessage(label: string): string {
20
+ return `${label} removed from favourites`;
21
+ }
@@ -0,0 +1,48 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { describe, expect, test, vi } from 'vitest';
3
+ import { useControllableBoolean } from './useControllableBoolean.js';
4
+
5
+ describe('useControllableBoolean', () => {
6
+ test('uses defaultValue when uncontrolled', () => {
7
+ const { result } = renderHook(() => useControllableBoolean({ defaultValue: true }));
8
+ expect(result.current.value).toBe(true);
9
+ });
10
+
11
+ test('updates internal state when uncontrolled and set is called', () => {
12
+ const { result } = renderHook(() => useControllableBoolean({ defaultValue: false }));
13
+
14
+ act(() => result.current.set(true));
15
+
16
+ expect(result.current.value).toBe(true);
17
+ });
18
+
19
+ test('calls onChange with the new value when set is called while uncontrolled', () => {
20
+ const onChange = vi.fn();
21
+ const { result } = renderHook(() => useControllableBoolean({ defaultValue: false, onChange }));
22
+
23
+ act(() => result.current.set(true));
24
+
25
+ expect(onChange).toHaveBeenCalledWith(true);
26
+ });
27
+
28
+ test('uses the provided value when controlled, ignoring defaultValue', () => {
29
+ const { result } = renderHook(() => useControllableBoolean({ value: true, defaultValue: false }));
30
+ expect(result.current.value).toBe(true);
31
+ });
32
+
33
+ test('does not update its own value when controlled and set is called, but still calls onChange', () => {
34
+ const onChange = vi.fn();
35
+ const { result, rerender } = renderHook(
36
+ ({ value }) => useControllableBoolean({ value, defaultValue: false, onChange }),
37
+ { initialProps: { value: false } },
38
+ );
39
+
40
+ act(() => result.current.set(true));
41
+
42
+ expect(onChange).toHaveBeenCalledWith(true);
43
+ expect(result.current.value).toBe(false);
44
+
45
+ rerender({ value: true });
46
+ expect(result.current.value).toBe(true);
47
+ });
48
+ });
@@ -1,46 +0,0 @@
1
- import { SidebarNavGroup } from './SidebarNavGroup.js';
2
- import type { SidebarNavGroupProps } from './SidebarNavGroup.js';
3
- import { SidebarNavItem } from './SidebarNavItem.js';
4
- import type { SidebarNavItemProps } from './SidebarNavItem.js';
5
- import { SidebarNavPanelNav } from './SidebarNavPanelNav.js';
6
- import type { SidebarNavPanelNavProps } from './SidebarNavPanelNav.js';
7
- import { SidebarNavPanel } from './SidebarNavPanel.js';
8
- import type { SidebarNavPanelProps } from './SidebarNavPanel.js';
9
- import { SidebarNavRail } from './SidebarNavRail.js';
10
- import type { SidebarNavRailProps } from './SidebarNavRail.js';
11
- import { SidebarNavRailItem } from './SidebarNavRailItem.js';
12
- import type { SidebarNavRailItemProps } from './SidebarNavRailItem.js';
13
- import { SidebarNavRailList } from './SidebarNavRailList.js';
14
- import { SidebarNavRailSlot } from './SidebarNavRailSlot.js';
15
- import { SidebarNavSeparator } from './SidebarNavSeparator.js';
16
- import { SidebarNavTitle } from './SidebarNavTitle.js';
17
- import { SidebarNavTrigger } from './SidebarNavTrigger.js';
18
- import type { SidebarNavTriggerProps } from './SidebarNavTrigger.js';
19
- import type { SidebarNavProps } from './types.js';
20
- declare const SidebarNavImpl: (props: SidebarNavProps) => import("react/jsx-runtime").JSX.Element;
21
- type SidebarNavComponent = typeof SidebarNavImpl & {
22
- Rail: typeof SidebarNavRail;
23
- Separator: typeof SidebarNavSeparator;
24
- RailList: typeof SidebarNavRailList;
25
- RailItem: typeof SidebarNavRailItem;
26
- RailSlot: typeof SidebarNavRailSlot;
27
- Trigger: typeof SidebarNavTrigger;
28
- Panel: typeof SidebarNavPanel;
29
- Title: typeof SidebarNavTitle;
30
- PanelNav: typeof SidebarNavPanelNav;
31
- Group: typeof SidebarNavGroup;
32
- Item: typeof SidebarNavItem;
33
- };
34
- export declare const SidebarNav: SidebarNavComponent;
35
- export declare namespace SidebarNav {
36
- type Props = SidebarNavProps;
37
- type RailProps = SidebarNavRailProps;
38
- type RailItemProps = SidebarNavRailItemProps;
39
- type TriggerProps = SidebarNavTriggerProps;
40
- type PanelProps = SidebarNavPanelProps;
41
- type PanelNavProps = SidebarNavPanelNavProps;
42
- type GroupProps = SidebarNavGroupProps;
43
- type ItemProps = SidebarNavItemProps;
44
- }
45
- export {};
46
- //# sourceMappingURL=SidebarNav.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SidebarNav.d.ts","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAoFpB,QAAA,MAAM,cAAc,GAAI,OAAO,eAAe,4CA+E7C,CAAC;AAEF,KAAK,mBAAmB,GAAG,OAAO,cAAc,GAAG;IACjD,IAAI,EAAE,OAAO,cAAc,CAAC;IAC5B,SAAS,EAAE,OAAO,mBAAmB,CAAC;IACtC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,OAAO,EAAE,OAAO,iBAAiB,CAAC;IAClC,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,IAAI,EAAE,OAAO,cAAc,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAqB,mBAAmB,CAAC;AAchE,yBAAiB,UAAU,CAAC;IAC1B,KAAY,KAAK,GAAG,eAAe,CAAC;IACpC,KAAY,SAAS,GAAG,mBAAmB,CAAC;IAC5C,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,YAAY,GAAG,sBAAsB,CAAC;IAClD,KAAY,UAAU,GAAG,oBAAoB,CAAC;IAC9C,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,UAAU,GAAG,oBAAoB,CAAC;IAC9C,KAAY,SAAS,GAAG,mBAAmB,CAAC;CAC7C"}
@@ -1,102 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Icon } from '../icon/Icon.js';
3
- import classNames from 'classnames';
4
- import { Tooltip as TooltipPrimitive } from 'radix-ui';
5
- import React, { useId, useMemo } from 'react';
6
- import { SidebarNavProvider } from './SidebarNavContext.js';
7
- import { SidebarNavGroup } from './SidebarNavGroup.js';
8
- import { SidebarNavItem } from './SidebarNavItem.js';
9
- import { SidebarNavPanelNav } from './SidebarNavPanelNav.js';
10
- import { SidebarNavPanel } from './SidebarNavPanel.js';
11
- import { SidebarNavRail } from './SidebarNavRail.js';
12
- import { SidebarNavRailItem } from './SidebarNavRailItem.js';
13
- import { SidebarNavRailList } from './SidebarNavRailList.js';
14
- import { SidebarNavRailSlot } from './SidebarNavRailSlot.js';
15
- import { SidebarNavSeparator } from './SidebarNavSeparator.js';
16
- import { SidebarNavTitle } from './SidebarNavTitle.js';
17
- import { SidebarNavTrigger } from './SidebarNavTrigger.js';
18
- import { isSidebarNavRailSeparator } from './types.js';
19
- import { useControllableBoolean } from './useControllableBoolean.js';
20
- function renderRailListItem(item) {
21
- if (item.renderItem) {
22
- return (_jsx(React.Fragment, { children: item.renderItem(item) }, item.id));
23
- }
24
- return (_jsxs(SidebarNavRailItem, { "data-testid": `sidebar-nav-rail-item-${item.id}`, href: item.href, onClick: item.onClick, current: item.current, "aria-label": item.label, children: [_jsx(Icon, { name: item.iconName, size: 24, color: item.iconColor }), item.badgeContent] }, item.id));
25
- }
26
- function SidebarNavRailFromData(props) {
27
- const { items } = props;
28
- const nodes = [];
29
- let currentGroup = [];
30
- let groupKey = 'rail-list-leading';
31
- const flushGroup = () => {
32
- if (currentGroup.length === 0) {
33
- return;
34
- }
35
- nodes.push(_jsx(SidebarNavRailList, { children: currentGroup.map(renderRailListItem) }, groupKey));
36
- currentGroup = [];
37
- };
38
- for (const entry of items) {
39
- if (isSidebarNavRailSeparator(entry)) {
40
- flushGroup();
41
- nodes.push(_jsx(SidebarNavSeparator, { id: entry.id }, entry.id));
42
- groupKey = `rail-list-after-${entry.id}`;
43
- continue;
44
- }
45
- if (entry.opensPanel) {
46
- flushGroup();
47
- nodes.push(_jsx(SidebarNavTrigger, { "data-testid": `sidebar-nav-panel-trigger-${entry.id}`, tooltip: entry.label, onClick: (e) => {
48
- entry.onClick?.(e);
49
- }, children: _jsx(Icon, { name: entry.iconName, size: 24, color: entry.iconColor }) }, entry.id));
50
- continue;
51
- }
52
- currentGroup.push(entry);
53
- }
54
- flushGroup();
55
- return (_jsx(SidebarNavRail, { children: nodes }));
56
- }
57
- const SidebarNavImpl = (props) => {
58
- const { expanded, defaultExpanded = true, onExpandedChange, renderLink, railItems, panelTitle, panelNavItems, className, children, ...rest } = props;
59
- const panelId = useId();
60
- const { value: isExpanded, set: setExpanded } = useControllableBoolean({
61
- value: expanded,
62
- defaultValue: defaultExpanded,
63
- onChange: onExpandedChange,
64
- });
65
- const useDataRail = railItems !== undefined;
66
- const useDataPanel = panelTitle !== undefined || panelNavItems !== undefined;
67
- const childArray = React.Children.toArray(children);
68
- const railChild = childArray.find(c => c.type === SidebarNavRail);
69
- const panelChild = childArray.find(c => c.type === SidebarNavPanel);
70
- if (process.env.NODE_ENV !== 'production') {
71
- if (useDataPanel && !useDataRail && railChild == null && childArray.length > 0) {
72
- console.warn('SidebarNav: composable SidebarNav.Rail was not found. In hybrid mode, SidebarNav.Rail must be a direct child of SidebarNav (not wrapped in Fragment or other wrappers).');
73
- }
74
- }
75
- const content = useDataRail || useDataPanel
76
- ? (_jsxs(_Fragment, { children: [useDataRail
77
- ? _jsx(SidebarNavRailFromData, { items: railItems })
78
- : railChild, useDataPanel
79
- ? (_jsxs(SidebarNavPanel, { children: [panelTitle !== undefined && (_jsx(SidebarNavTitle, { children: panelTitle })), _jsx(SidebarNavPanelNav, { items: panelNavItems ?? [] })] }))
80
- : panelChild] }))
81
- : children;
82
- const contextValue = useMemo(() => ({
83
- expanded: isExpanded,
84
- setExpanded,
85
- panelId,
86
- renderLink,
87
- }), [isExpanded, setExpanded, panelId, renderLink]);
88
- return (_jsx(TooltipPrimitive.Provider, { delayDuration: 400, children: _jsx(SidebarNavProvider, { value: contextValue, children: _jsx("div", { className: classNames('ds-sidebar-nav', className), "data-testid": "sidebar-nav", ...rest, children: content }) }) }));
89
- };
90
- export const SidebarNav = SidebarNavImpl;
91
- SidebarNav.Rail = SidebarNavRail;
92
- SidebarNav.Separator = SidebarNavSeparator;
93
- SidebarNav.RailList = SidebarNavRailList;
94
- SidebarNav.RailItem = SidebarNavRailItem;
95
- SidebarNav.RailSlot = SidebarNavRailSlot;
96
- SidebarNav.Trigger = SidebarNavTrigger;
97
- SidebarNav.Panel = SidebarNavPanel;
98
- SidebarNav.Title = SidebarNavTitle;
99
- SidebarNav.PanelNav = SidebarNavPanelNav;
100
- SidebarNav.Group = SidebarNavGroup;
101
- SidebarNav.Item = SidebarNavItem;
102
- //# sourceMappingURL=SidebarNav.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SidebarNav.js","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.tsx"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- import type { StoryObj } from '@storybook/react-vite';
2
- import { SidebarNav } from './SidebarNav.js';
3
- declare function SidebarNavDocsPage(): import("react/jsx-runtime").JSX.Element;
4
- declare const meta: {
5
- title: string;
6
- component: ((props: import("./types.js").SidebarNavProps) => import("react/jsx-runtime").JSX.Element) & {
7
- Rail: typeof import("./SidebarNavRail.js").SidebarNavRail;
8
- Separator: typeof import("./SidebarNavSeparator.js").SidebarNavSeparator;
9
- RailList: typeof import("./SidebarNavRailList.js").SidebarNavRailList;
10
- RailItem: typeof import("./SidebarNavRailItem.js").SidebarNavRailItem;
11
- RailSlot: typeof import("./SidebarNavRailSlot.js").SidebarNavRailSlot;
12
- Trigger: typeof import("./SidebarNavTrigger.js").SidebarNavTrigger;
13
- Panel: typeof import("./SidebarNavPanel.js").SidebarNavPanel;
14
- Title: typeof import("./SidebarNavTitle.js").SidebarNavTitle;
15
- PanelNav: typeof import("./SidebarNavPanelNav.js").SidebarNavPanelNav;
16
- Group: typeof import("./SidebarNavGroup.js").SidebarNavGroup;
17
- Item: typeof import("./SidebarNavItem.js").SidebarNavItem;
18
- };
19
- parameters: {
20
- layout: string;
21
- docs: {
22
- page: typeof SidebarNavDocsPage;
23
- };
24
- };
25
- tags: string[];
26
- args: {
27
- onExpandedChange: import("vitest").Mock<(...args: any[]) => any>;
28
- };
29
- argTypes: {
30
- defaultExpanded: {
31
- control: "boolean";
32
- description: string;
33
- table: {
34
- defaultValue: {
35
- summary: string;
36
- };
37
- };
38
- };
39
- children: {
40
- control: false;
41
- };
42
- railItems: {
43
- control: false;
44
- };
45
- panelNavItems: {
46
- control: false;
47
- };
48
- renderLink: {
49
- control: false;
50
- };
51
- };
52
- };
53
- export default meta;
54
- type Story = StoryObj<typeof SidebarNav>;
55
- export declare const Default: Story;
56
- export declare const CollapsedPanel: Story;
57
- export declare const ConfigDriven: Story;
58
- export declare const WithFavourites: Story;
59
- export declare const ConfigDrivenWithFavourites: Story;
60
- export declare const WithRenderLink: Story;
61
- //# sourceMappingURL=SidebarNav.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SidebarNav.stories.d.ts","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.stories.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA2F7C,iBAAS,kBAAkB,4CAmB1B;AAED,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwByB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,UAAU,CAAC,CAAC;AA4RzC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,KAMxC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC"}
@@ -1,253 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Controls, Heading as DocHeading, Primary as DocPrimary, Markdown, Stories, Subtitle, Title, } from '@storybook/addon-docs/blocks';
3
- import { Badge } from '../badge/Badge.js';
4
- import { Icon } from '../icon/Icon.js';
5
- import { useMemo, useState } from 'react';
6
- import { fn } from 'storybook/test';
7
- import { SidebarNav } from './SidebarNav.js';
8
- const DESCRIPTION_INTRO = [
9
- 'SidebarNav is a two-part navigation pattern: a fixed icon rail for global shortcuts and an expandable',
10
- 'panel for hierarchical section links. Place a `<Separator />` after the burger to divide the panel toggle',
11
- 'from the rest of the rail icons.',
12
- ].join('\n');
13
- const USAGE_GUIDANCE = [
14
- '### When to use',
15
- '',
16
- '- **Application shell navigation** — persistent rail icons (home, favourites, calendar) plus contextual section nav',
17
- '- **MIS module navigation** — attendance, students, or reporting areas with grouped links',
18
- '- **Favourites on leaf links** — `canFavourite` on panel items for user-pinned pages',
19
- '',
20
- '---',
21
- '',
22
- '### When NOT to use',
23
- '',
24
- '| Situation | Use instead |',
25
- '|---|---|',
26
- '| Horizontal top-level product nav | [`Menubar`](?path=/docs/components-menubar--docs) or app header patterns |',
27
- '| Single flat list of links | [`Tabs`](?path=/docs/components-tabs--docs) or plain links |',
28
- '| Account / settings menu | [`Dropdown`](?path=/docs/components-dropdown--docs) |',
29
- ].join('\n');
30
- const DEVELOPER_NOTES = [
31
- '### Rail layout',
32
- '',
33
- 'The rail is a single vertical column. Compose **`Trigger` → `SidebarNav.Separator` → `RailList`** (icon rows).',
34
- 'Insert additional `<SidebarNav.Separator />` siblings between `RailList` blocks when Figma shows a break',
35
- '(e.g. main shortcuts, emergency alert, help). `RailItem` and `RailSlot` each render their own',
36
- '`<li>` row wrapper — do not add `ds-sidebar-nav__*` layout classes in consumer code. Use `RailSlot` for other',
37
- 'custom rail rows inside `RailList`.',
38
- '',
39
- 'The rail `<nav>` defaults to `aria-label="Sidebar rail"`; the panel links nav defaults to `"Sidebar links"`.',
40
- 'Override via `ariaLabel` on `SidebarNav.Rail` or `SidebarNav.PanelNav` when needed.',
41
- '',
42
- '### Config-driven API',
43
- '',
44
- 'Pass `railItems` as an ordered array of item configs and `{ type: \'separator\', id }` entries. Use',
45
- '`opensPanel: true` on the burger item to render the panel trigger. Use `renderItem` for custom rail rows.',
46
- '',
47
- '### Favourites',
48
- '',
49
- 'Panel leaf items support `canFavourite`, `isPressed`, `onFavouriteClick`, and required `favouriteTooltip` when',
50
- '`canFavourite` is true (sets `aria-label` and shows a tooltip on hover/focus). The favourite `<button>` is a',
51
- 'sibling of the link (not inside the `<a>`), with `aria-pressed` reflecting state. Persistence is the',
52
- 'consumer\'s responsibility.',
53
- '',
54
- 'The panel toggle (`SidebarNav.Trigger`) always shows tooltip **Show/hide sub navigation** (override via `tooltip` prop).',
55
- '',
56
- '### `renderLink`',
57
- '',
58
- 'Provide `renderLink` at the root to integrate with your router. Panel items also support `linkElement="button"`',
59
- 'with `linkElementProps` for SPA actions without a URL. Data-driven items accept `href` and/or `onClick`.',
60
- 'Top-level `onClick` takes precedence over `linkElementProps.onClick` when both are set.',
61
- 'When `renderLink` is set, both `linkProps` and `linkElementProps` are forwarded in the args — spread them onto your router link (same order as the default `<a>`: `linkProps` then `linkElementProps`).',
62
- 'Also spread `ariaLabel`, `ariaCurrent`, and `onClick` from the args as appropriate.',
63
- '',
64
- 'Pass `railItems={[]}` to render an intentionally empty data-driven rail. Omit `railItems` to compose the rail with JSX children.',
65
- '',
66
- 'For data-driven rail items, pass `iconColor` as a design-token CSS value (e.g. `var(--icons-icon-default)` or `var(--color-semantic-warning-600)`), not hardcoded hex.',
67
- '',
68
- 'The root provider passes shared state (panel open/closed, `renderLink`) to rail and panel subcomponents.',
69
- '',
70
- '---',
71
- '',
72
- '### Test IDs',
73
- '',
74
- '| Element | `data-testid` |',
75
- '|---|---|',
76
- '| Root | `sidebar-nav` |',
77
- '| Rail | `sidebar-nav-rail` |',
78
- '| Panel / trigger | `sidebar-nav-panel`, `sidebar-nav-panel-trigger`, `sidebar-nav-panel-trigger-{id}` |',
79
- '| Rail item | `sidebar-nav-rail-item-{id}` |',
80
- '| Rail separator | `sidebar-nav-rail-separator-{id}` |',
81
- '| Panel item / favourite | `sidebar-nav-panel-item-{itemId}`, `sidebar-nav-panel-item-favourite-{itemId}` — `itemId` is required on composable `SidebarNav.Item` |',
82
- ].join('\n');
83
- const RELATED_COMPONENTS = [
84
- '## Related components',
85
- '',
86
- '[Dropdown](?path=/docs/components-dropdown--docs) · [Tooltip](?path=/docs/components-tooltip--docs) ·',
87
- '[Badge](?path=/docs/components-badge--docs) · [Separator](?path=/docs/components-separator--docs) ·',
88
- '[IconText](?path=/docs/components-icontext--docs)',
89
- ].join('\n');
90
- const PROPS_INTRO = 'The preview below is wired to the **Controls** panel where applicable.';
91
- function SidebarNavDocsPage() {
92
- return (_jsxs(_Fragment, { children: [_jsx(Title, {}), _jsx(Subtitle, {}), _jsx(Markdown, { children: DESCRIPTION_INTRO }), _jsx(DocHeading, { children: "Interactive example" }), _jsx(Markdown, { children: PROPS_INTRO }), _jsx(DocPrimary, {}), _jsx(Controls, {}), _jsx(DocHeading, { children: "Usage guidance" }), _jsx(Markdown, { children: USAGE_GUIDANCE }), _jsx(DocHeading, { children: "Developer notes" }), _jsx(Markdown, { children: DEVELOPER_NOTES }), _jsx(DocHeading, { children: "Examples" }), _jsx(Stories, { title: "" }), _jsx(Markdown, { children: RELATED_COMPONENTS })] }));
93
- }
94
- const meta = {
95
- title: 'Components/SidebarNav',
96
- component: SidebarNav,
97
- parameters: {
98
- layout: 'padded',
99
- docs: {
100
- page: SidebarNavDocsPage,
101
- },
102
- },
103
- tags: ['autodocs'],
104
- args: {
105
- onExpandedChange: fn(),
106
- },
107
- argTypes: {
108
- defaultExpanded: {
109
- control: 'boolean',
110
- description: 'Initial panel open state when uncontrolled.',
111
- table: { defaultValue: { summary: 'true' } },
112
- },
113
- children: { control: false },
114
- railItems: { control: false },
115
- panelNavItems: { control: false },
116
- renderLink: { control: false },
117
- },
118
- };
119
- export default meta;
120
- const withDescription = (story, description) => ({
121
- ...story,
122
- parameters: {
123
- ...story.parameters,
124
- docs: {
125
- ...story.parameters?.docs,
126
- description: { story: description },
127
- },
128
- },
129
- });
130
- const storyWrapperStyle = { height: 640 };
131
- const basePanelNavItems = [
132
- {
133
- type: 'group',
134
- id: 'registers',
135
- label: 'Registers',
136
- defaultExpanded: true,
137
- children: [
138
- { type: 'item', id: 'covid', label: 'Covid-19 Dashboard', href: '/covid' },
139
- {
140
- type: 'item',
141
- id: 'daily',
142
- label: 'Daily Attendance',
143
- href: '/daily',
144
- current: true,
145
- canFavourite: true,
146
- isPressed: false,
147
- favouriteTooltip: 'Add to favourites',
148
- },
149
- { type: 'item', id: 'quick', label: 'Quick Follow-Up', href: '/quick' },
150
- ],
151
- },
152
- {
153
- type: 'group',
154
- id: 'absentees',
155
- label: 'Absentees',
156
- children: [
157
- { type: 'item', id: 'late', label: 'Latecomers', href: '/latecomers' },
158
- { type: 'item', id: 'stats', label: 'Statistics', href: '/statistics' },
159
- ],
160
- },
161
- ];
162
- const figmaRailItems = [
163
- {
164
- id: 'burger',
165
- label: 'Show/hide sub navigation',
166
- iconName: 'menu',
167
- opensPanel: true,
168
- },
169
- { type: 'separator', id: 'after-burger' },
170
- { id: 'favourites', label: 'Favourites', iconName: 'favourite-outline', href: '/favourites' },
171
- {
172
- id: 'notifications',
173
- label: 'Notifications',
174
- iconName: 'message-square-more',
175
- href: '/notifications',
176
- badgeContent: _jsx(Badge, { size: "sm", colour: "salmon", children: "6" }),
177
- },
178
- { id: 'calendar', label: 'My Calendar', iconName: 'date', href: '/calendar' },
179
- { type: 'separator', id: 'before-emergency' },
180
- {
181
- id: 'emergency',
182
- label: 'Emergency Alerts',
183
- iconName: 'triangle-alert',
184
- href: '/emergency',
185
- },
186
- { type: 'separator', id: 'before-help' },
187
- {
188
- id: 'help',
189
- label: 'Help & Learn with Arbor',
190
- iconName: 'circle-help',
191
- href: '/help',
192
- },
193
- ];
194
- const SidebarNavShell = ({ children }) => (_jsx("div", { style: storyWrapperStyle, children: children }));
195
- /** Figma rail: burger → separator → shortcuts → separator → emergency → separator → help. */
196
- const FigmaRailComposition = () => (_jsxs(_Fragment, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" }), _jsxs(SidebarNav.RailList, { children: [_jsx(SidebarNav.RailItem, { href: "/favourites", "aria-label": "Favourites", children: _jsx(Icon, { name: "favourite-outline", size: 24 }) }), _jsxs(SidebarNav.RailItem, { href: "/notifications", "aria-label": "Notifications", children: [_jsx(Icon, { name: "message-square-more", size: 24 }), _jsx(Badge, { size: "sm", colour: "salmon", children: "6" })] }), _jsx(SidebarNav.RailItem, { href: "/calendar", "aria-label": "My Calendar", children: _jsx(Icon, { name: "date", size: 24 }) })] }), _jsx(SidebarNav.Separator, { id: "before-emergency" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/emergency", "aria-label": "Emergency Alerts", children: _jsx(Icon, { name: "triangle-alert", size: 24 }) }) }), _jsx(SidebarNav.Separator, { id: "before-help" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/help", "aria-label": "Help & Learn with Arbor", children: _jsx(Icon, { name: "circle-help", size: 24 }) }) })] }));
197
- const DefaultTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { children: [_jsx(SidebarNav.Rail, { children: _jsx(FigmaRailComposition, {}) }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsx(SidebarNav.PanelNav, { items: basePanelNavItems })] })] }) }));
198
- const CollapsedPanelTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { defaultExpanded: false, children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/favourites", "aria-label": "Favourites", children: _jsx(Icon, { name: "favourite-outline", size: 24 }) }) })] }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsx(SidebarNav.PanelNav, { items: [] })] })] }) }));
199
- const ConfigDrivenTemplate = () => (_jsx(SidebarNavShell, { children: _jsx(SidebarNav, { railItems: figmaRailItems, panelTitle: "Attendance", panelNavItems: basePanelNavItems }) }));
200
- const WithFavouritesTemplate = () => {
201
- const [favourites, setFavourites] = useState({ daily: true });
202
- const toggle = (id) => {
203
- setFavourites(prev => ({ ...prev, [id]: !prev[id] }));
204
- };
205
- return (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" })] }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsxs(SidebarNav.PanelNav, { children: [_jsx(SidebarNav.Item, { href: "/daily", itemId: "daily", current: true, canFavourite: true, isPressed: Boolean(favourites.daily), favouriteTooltip: favourites.daily ? 'Remove from favourites' : 'Add to favourites', onFavouriteClick: () => toggle('daily'), children: "Daily Attendance" }), _jsx(SidebarNav.Item, { href: "/quick", itemId: "quick", children: "Quick Follow-Up" })] })] })] }) }));
206
- };
207
- const ConfigDrivenWithFavouritesTemplate = () => {
208
- const [favourites, setFavourites] = useState({ daily: true });
209
- const panelNavItems = useMemo(() => basePanelNavItems.map(node => (node.type === 'group'
210
- ? {
211
- ...node,
212
- children: node.children.map((child) => {
213
- if (child.id !== 'daily') {
214
- return child;
215
- }
216
- return {
217
- ...child,
218
- canFavourite: true,
219
- isPressed: Boolean(favourites.daily),
220
- favouriteTooltip: favourites.daily ? 'Remove from favourites' : 'Add to favourites',
221
- onFavouriteClick: () => setFavourites(prev => ({ ...prev, daily: !prev.daily })),
222
- };
223
- }),
224
- }
225
- : node)), [favourites.daily]);
226
- return (_jsx(SidebarNavShell, { children: _jsx(SidebarNav, { railItems: figmaRailItems, panelTitle: "Attendance", panelNavItems: panelNavItems }) }));
227
- };
228
- const WithRenderLinkTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { renderLink: ({ href, className, children, ariaCurrent, ariaLabel, onClick, linkProps, linkElementProps, }) => (_jsx("a", { href: href, className: className, "aria-current": ariaCurrent, "aria-label": ariaLabel, "data-router-link": "true", onClick: onClick ?? (e => e.preventDefault()), ...linkProps, ...linkElementProps, children: children })), children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" })] }), _jsx(SidebarNav.Panel, { children: _jsx(SidebarNav.PanelNav, { items: [{ type: 'item', id: 'home', label: 'Home', href: '/' }] }) })] }) }));
229
- export const Default = withDescription({
230
- render: DefaultTemplate,
231
- parameters: { controls: { disable: true } },
232
- }, 'Composed rail: `Trigger`, separators between `RailList` sections (favourites/notifications/calendar, emergency, help). Panel uses `Trigger` ↔ `Panel` via context (`aria-controls` / `aria-expanded`).');
233
- export const CollapsedPanel = withDescription({
234
- render: CollapsedPanelTemplate,
235
- parameters: { controls: { disable: true } },
236
- }, 'Panel hidden by default (`defaultExpanded={false}`). Use the burger trigger to open the panel.');
237
- export const ConfigDriven = withDescription({
238
- render: ConfigDrivenTemplate,
239
- parameters: { controls: { disable: true } },
240
- }, 'Same Figma rail order via `railItems` (burger, `{ type: \'separator\' }` entries, then icons). Compare with **Default** for the composed `RailList` + `Separator` pattern.');
241
- export const WithFavourites = withDescription({
242
- render: WithFavouritesTemplate,
243
- parameters: { controls: { disable: true } },
244
- }, 'Composable panel items with `canFavourite`, `isPressed`, and `onFavouriteClick`. State is mocked in the story — wire to your store or API in MIS.');
245
- export const ConfigDrivenWithFavourites = withDescription({
246
- render: ConfigDrivenWithFavouritesTemplate,
247
- parameters: { controls: { disable: true } },
248
- }, 'Config-driven rail (`figmaRailItems`) and `panelNavItems` with favourite props merged from local state.');
249
- export const WithRenderLink = withDescription({
250
- render: WithRenderLinkTemplate,
251
- parameters: { controls: { disable: true } },
252
- }, 'Root `renderLink` replaces default `<a>` elements for router integration.');
253
- //# sourceMappingURL=SidebarNav.stories.js.map