@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
@@ -1,484 +0,0 @@
1
- import {
2
- Controls,
3
- Heading as DocHeading,
4
- Primary as DocPrimary,
5
- Markdown,
6
- Stories,
7
- Subtitle,
8
- Title,
9
- } from '@storybook/addon-docs/blocks';
10
- import type { Meta, StoryObj } from '@storybook/react-vite';
11
- import { Badge } from 'Components/badge/Badge';
12
- import { Icon } from 'Components/icon/Icon';
13
- import { useMemo, useState } from 'react';
14
- import { fn } from 'storybook/test';
15
- import { SidebarNav } from './SidebarNav.js';
16
- import type { SidebarNavNode, SidebarNavRailEntry } from './types.js';
17
-
18
- const DESCRIPTION_INTRO = [
19
- 'SidebarNav is a two-part navigation pattern: a fixed icon rail for global shortcuts and an expandable',
20
- 'panel for hierarchical section links. Place a `<Separator />` after the burger to divide the panel toggle',
21
- 'from the rest of the rail icons.',
22
- ].join('\n');
23
-
24
- const USAGE_GUIDANCE = [
25
- '### When to use',
26
- '',
27
- '- **Application shell navigation** — persistent rail icons (home, favourites, calendar) plus contextual section nav',
28
- '- **MIS module navigation** — attendance, students, or reporting areas with grouped links',
29
- '- **Favourites on leaf links** — `canFavourite` on panel items for user-pinned pages',
30
- '',
31
- '---',
32
- '',
33
- '### When NOT to use',
34
- '',
35
- '| Situation | Use instead |',
36
- '|---|---|',
37
- '| Horizontal top-level product nav | [`Menubar`](?path=/docs/components-menubar--docs) or app header patterns |',
38
- '| Single flat list of links | [`Tabs`](?path=/docs/components-tabs--docs) or plain links |',
39
- '| Account / settings menu | [`Dropdown`](?path=/docs/components-dropdown--docs) |',
40
- ].join('\n');
41
-
42
- const DEVELOPER_NOTES = [
43
- '### Rail layout',
44
- '',
45
- 'The rail is a single vertical column. Compose **`Trigger` → `SidebarNav.Separator` → `RailList`** (icon rows).',
46
- 'Insert additional `<SidebarNav.Separator />` siblings between `RailList` blocks when Figma shows a break',
47
- '(e.g. main shortcuts, emergency alert, help). `RailItem` and `RailSlot` each render their own',
48
- '`<li>` row wrapper — do not add `ds-sidebar-nav__*` layout classes in consumer code. Use `RailSlot` for other',
49
- 'custom rail rows inside `RailList`.',
50
- '',
51
- 'The rail `<nav>` defaults to `aria-label="Sidebar rail"`; the panel links nav defaults to `"Sidebar links"`.',
52
- 'Override via `ariaLabel` on `SidebarNav.Rail` or `SidebarNav.PanelNav` when needed.',
53
- '',
54
- '### Config-driven API',
55
- '',
56
- 'Pass `railItems` as an ordered array of item configs and `{ type: \'separator\', id }` entries. Use',
57
- '`opensPanel: true` on the burger item to render the panel trigger. Use `renderItem` for custom rail rows.',
58
- '',
59
- '### Favourites',
60
- '',
61
- 'Panel leaf items support `canFavourite`, `isPressed`, `onFavouriteClick`, and required `favouriteTooltip` when',
62
- '`canFavourite` is true (sets `aria-label` and shows a tooltip on hover/focus). The favourite `<button>` is a',
63
- 'sibling of the link (not inside the `<a>`), with `aria-pressed` reflecting state. Persistence is the',
64
- 'consumer\'s responsibility.',
65
- '',
66
- 'The panel toggle (`SidebarNav.Trigger`) always shows tooltip **Show/hide sub navigation** (override via `tooltip` prop).',
67
- '',
68
- '### `renderLink`',
69
- '',
70
- 'Provide `renderLink` at the root to integrate with your router. Panel items also support `linkElement="button"`',
71
- 'with `linkElementProps` for SPA actions without a URL. Data-driven items accept `href` and/or `onClick`.',
72
- 'Top-level `onClick` takes precedence over `linkElementProps.onClick` when both are set.',
73
- '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`).',
74
- 'Also spread `ariaLabel`, `ariaCurrent`, and `onClick` from the args as appropriate.',
75
- '',
76
- 'Pass `railItems={[]}` to render an intentionally empty data-driven rail. Omit `railItems` to compose the rail with JSX children.',
77
- '',
78
- '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.',
79
- '',
80
- 'The root provider passes shared state (panel open/closed, `renderLink`) to rail and panel subcomponents.',
81
- '',
82
- '---',
83
- '',
84
- '### Test IDs',
85
- '',
86
- '| Element | `data-testid` |',
87
- '|---|---|',
88
- '| Root | `sidebar-nav` |',
89
- '| Rail | `sidebar-nav-rail` |',
90
- '| Panel / trigger | `sidebar-nav-panel`, `sidebar-nav-panel-trigger`, `sidebar-nav-panel-trigger-{id}` |',
91
- '| Rail item | `sidebar-nav-rail-item-{id}` |',
92
- '| Rail separator | `sidebar-nav-rail-separator-{id}` |',
93
- '| Panel item / favourite | `sidebar-nav-panel-item-{itemId}`, `sidebar-nav-panel-item-favourite-{itemId}` — `itemId` is required on composable `SidebarNav.Item` |',
94
- ].join('\n');
95
-
96
- const RELATED_COMPONENTS = [
97
- '## Related components',
98
- '',
99
- '[Dropdown](?path=/docs/components-dropdown--docs) · [Tooltip](?path=/docs/components-tooltip--docs) ·',
100
- '[Badge](?path=/docs/components-badge--docs) · [Separator](?path=/docs/components-separator--docs) ·',
101
- '[IconText](?path=/docs/components-icontext--docs)',
102
- ].join('\n');
103
-
104
- const PROPS_INTRO = 'The preview below is wired to the **Controls** panel where applicable.';
105
-
106
- function SidebarNavDocsPage() {
107
- return (
108
- <>
109
- <Title />
110
- <Subtitle />
111
- <Markdown>{DESCRIPTION_INTRO}</Markdown>
112
- <DocHeading>Interactive example</DocHeading>
113
- <Markdown>{PROPS_INTRO}</Markdown>
114
- <DocPrimary />
115
- <Controls />
116
- <DocHeading>Usage guidance</DocHeading>
117
- <Markdown>{USAGE_GUIDANCE}</Markdown>
118
- <DocHeading>Developer notes</DocHeading>
119
- <Markdown>{DEVELOPER_NOTES}</Markdown>
120
- <DocHeading>Examples</DocHeading>
121
- <Stories title="" />
122
- <Markdown>{RELATED_COMPONENTS}</Markdown>
123
- </>
124
- );
125
- }
126
-
127
- const meta = {
128
- title: 'Components/SidebarNav',
129
- component: SidebarNav,
130
- parameters: {
131
- layout: 'padded',
132
- docs: {
133
- page: SidebarNavDocsPage,
134
- },
135
- },
136
- tags: ['autodocs'],
137
- args: {
138
- onExpandedChange: fn(),
139
- },
140
- argTypes: {
141
- defaultExpanded: {
142
- control: 'boolean',
143
- description: 'Initial panel open state when uncontrolled.',
144
- table: { defaultValue: { summary: 'true' } },
145
- },
146
- children: { control: false },
147
- railItems: { control: false },
148
- panelNavItems: { control: false },
149
- renderLink: { control: false },
150
- },
151
- } satisfies Meta<typeof SidebarNav>;
152
-
153
- export default meta;
154
- type Story = StoryObj<typeof SidebarNav>;
155
-
156
- const withDescription = (story: Story, description: string): Story => ({
157
- ...story,
158
- parameters: {
159
- ...story.parameters,
160
- docs: {
161
- ...story.parameters?.docs,
162
- description: { story: description },
163
- },
164
- },
165
- });
166
-
167
- const storyWrapperStyle = { height: 640 };
168
-
169
- const basePanelNavItems: SidebarNavNode[] = [
170
- {
171
- type: 'group',
172
- id: 'registers',
173
- label: 'Registers',
174
- defaultExpanded: true,
175
- children: [
176
- { type: 'item', id: 'covid', label: 'Covid-19 Dashboard', href: '/covid' },
177
- {
178
- type: 'item',
179
- id: 'daily',
180
- label: 'Daily Attendance',
181
- href: '/daily',
182
- current: true,
183
- canFavourite: true as const,
184
- isPressed: false,
185
- favouriteTooltip: 'Add to favourites',
186
- },
187
- { type: 'item', id: 'quick', label: 'Quick Follow-Up', href: '/quick' },
188
- ],
189
- },
190
- {
191
- type: 'group',
192
- id: 'absentees',
193
- label: 'Absentees',
194
- children: [
195
- { type: 'item', id: 'late', label: 'Latecomers', href: '/latecomers' },
196
- { type: 'item', id: 'stats', label: 'Statistics', href: '/statistics' },
197
- ],
198
- },
199
- ];
200
-
201
- const figmaRailItems: SidebarNavRailEntry[] = [
202
- {
203
- id: 'burger',
204
- label: 'Show/hide sub navigation',
205
- iconName: 'menu',
206
- opensPanel: true,
207
- },
208
- { type: 'separator', id: 'after-burger' },
209
- { id: 'favourites', label: 'Favourites', iconName: 'favourite-outline', href: '/favourites' },
210
- {
211
- id: 'notifications',
212
- label: 'Notifications',
213
- iconName: 'message-square-more',
214
- href: '/notifications',
215
- badgeContent: <Badge size="sm" colour="salmon">6</Badge>,
216
- },
217
- { id: 'calendar', label: 'My Calendar', iconName: 'date', href: '/calendar' },
218
- { type: 'separator', id: 'before-emergency' },
219
- {
220
- id: 'emergency',
221
- label: 'Emergency Alerts',
222
- iconName: 'triangle-alert',
223
- href: '/emergency',
224
- },
225
- { type: 'separator', id: 'before-help' },
226
- {
227
- id: 'help',
228
- label: 'Help & Learn with Arbor',
229
- iconName: 'circle-help',
230
- href: '/help',
231
- },
232
- ];
233
-
234
- const SidebarNavShell = ({ children }: { children: React.ReactNode }) => (
235
- <div style={storyWrapperStyle}>{children}</div>
236
- );
237
-
238
- /** Figma rail: burger → separator → shortcuts → separator → emergency → separator → help. */
239
- const FigmaRailComposition = () => (
240
- <>
241
- <SidebarNav.Trigger>
242
- <Icon name="menu" size={24} />
243
- </SidebarNav.Trigger>
244
- <SidebarNav.Separator id="after-burger" />
245
- <SidebarNav.RailList>
246
- <SidebarNav.RailItem href="/favourites" aria-label="Favourites">
247
- <Icon name="favourite-outline" size={24} />
248
- </SidebarNav.RailItem>
249
- <SidebarNav.RailItem href="/notifications" aria-label="Notifications">
250
- <Icon name="message-square-more" size={24} />
251
- <Badge size="sm" colour="salmon">6</Badge>
252
- </SidebarNav.RailItem>
253
- <SidebarNav.RailItem href="/calendar" aria-label="My Calendar">
254
- <Icon name="date" size={24} />
255
- </SidebarNav.RailItem>
256
- </SidebarNav.RailList>
257
- <SidebarNav.Separator id="before-emergency" />
258
- <SidebarNav.RailList>
259
- <SidebarNav.RailItem href="/emergency" aria-label="Emergency Alerts">
260
- <Icon name="triangle-alert" size={24} />
261
- </SidebarNav.RailItem>
262
- </SidebarNav.RailList>
263
- <SidebarNav.Separator id="before-help" />
264
- <SidebarNav.RailList>
265
- <SidebarNav.RailItem href="/help" aria-label="Help & Learn with Arbor">
266
- <Icon name="circle-help" size={24} />
267
- </SidebarNav.RailItem>
268
- </SidebarNav.RailList>
269
- </>
270
- );
271
-
272
- const DefaultTemplate = () => (
273
- <SidebarNavShell>
274
- <SidebarNav>
275
- <SidebarNav.Rail>
276
- <FigmaRailComposition />
277
- </SidebarNav.Rail>
278
- <SidebarNav.Panel>
279
- <SidebarNav.Title>Attendance</SidebarNav.Title>
280
- <SidebarNav.PanelNav items={basePanelNavItems} />
281
- </SidebarNav.Panel>
282
- </SidebarNav>
283
- </SidebarNavShell>
284
- );
285
-
286
- const CollapsedPanelTemplate = () => (
287
- <SidebarNavShell>
288
- <SidebarNav defaultExpanded={false}>
289
- <SidebarNav.Rail>
290
- <SidebarNav.Trigger>
291
- <Icon name="menu" size={24} />
292
- </SidebarNav.Trigger>
293
- <SidebarNav.Separator id="after-burger" />
294
- <SidebarNav.RailList>
295
- <SidebarNav.RailItem href="/favourites" aria-label="Favourites">
296
- <Icon name="favourite-outline" size={24} />
297
- </SidebarNav.RailItem>
298
- </SidebarNav.RailList>
299
- </SidebarNav.Rail>
300
- <SidebarNav.Panel>
301
- <SidebarNav.Title>Attendance</SidebarNav.Title>
302
- <SidebarNav.PanelNav items={[]} />
303
- </SidebarNav.Panel>
304
- </SidebarNav>
305
- </SidebarNavShell>
306
- );
307
-
308
- const ConfigDrivenTemplate = () => (
309
- <SidebarNavShell>
310
- <SidebarNav
311
- railItems={figmaRailItems}
312
- panelTitle="Attendance"
313
- panelNavItems={basePanelNavItems}
314
- />
315
- </SidebarNavShell>
316
- );
317
-
318
- const WithFavouritesTemplate = () => {
319
- const [favourites, setFavourites] = useState<Record<string, boolean>>({ daily: true });
320
-
321
- const toggle = (id: string) => {
322
- setFavourites(prev => ({ ...prev, [id]: !prev[id] }));
323
- };
324
-
325
- return (
326
- <SidebarNavShell>
327
- <SidebarNav>
328
- <SidebarNav.Rail>
329
- <SidebarNav.Trigger>
330
- <Icon name="menu" size={24} />
331
- </SidebarNav.Trigger>
332
- <SidebarNav.Separator id="after-burger" />
333
- </SidebarNav.Rail>
334
- <SidebarNav.Panel>
335
- <SidebarNav.Title>Attendance</SidebarNav.Title>
336
- <SidebarNav.PanelNav>
337
- <SidebarNav.Item
338
- href="/daily"
339
- itemId="daily"
340
- current
341
- canFavourite
342
- isPressed={Boolean(favourites.daily)}
343
- favouriteTooltip={favourites.daily ? 'Remove from favourites' : 'Add to favourites'}
344
- onFavouriteClick={() => toggle('daily')}
345
- >
346
- Daily Attendance
347
- </SidebarNav.Item>
348
- <SidebarNav.Item href="/quick" itemId="quick">
349
- Quick Follow-Up
350
- </SidebarNav.Item>
351
- </SidebarNav.PanelNav>
352
- </SidebarNav.Panel>
353
- </SidebarNav>
354
- </SidebarNavShell>
355
- );
356
- };
357
-
358
- const ConfigDrivenWithFavouritesTemplate = () => {
359
- const [favourites, setFavourites] = useState<Record<string, boolean>>({ daily: true });
360
-
361
- const panelNavItems = useMemo(
362
- (): SidebarNavNode[] => basePanelNavItems.map(node => (
363
- node.type === 'group'
364
- ? {
365
- ...node,
366
- children: node.children.map((child) => {
367
- if (child.id !== 'daily') {
368
- return child;
369
- }
370
-
371
- return {
372
- ...child,
373
- canFavourite: true as const,
374
- isPressed: Boolean(favourites.daily),
375
- favouriteTooltip: favourites.daily ? 'Remove from favourites' : 'Add to favourites',
376
- onFavouriteClick: () => setFavourites(prev => ({ ...prev, daily: !prev.daily })),
377
- };
378
- }),
379
- }
380
- : node
381
- )),
382
- [favourites.daily],
383
- );
384
-
385
- return (
386
- <SidebarNavShell>
387
- <SidebarNav
388
- railItems={figmaRailItems}
389
- panelTitle="Attendance"
390
- panelNavItems={panelNavItems}
391
- />
392
- </SidebarNavShell>
393
- );
394
- };
395
-
396
- const WithRenderLinkTemplate = () => (
397
- <SidebarNavShell>
398
- <SidebarNav
399
- renderLink={({
400
- href,
401
- className,
402
- children,
403
- ariaCurrent,
404
- ariaLabel,
405
- onClick,
406
- linkProps,
407
- linkElementProps,
408
- }) => (
409
- <a
410
- href={href}
411
- className={className}
412
- aria-current={ariaCurrent}
413
- aria-label={ariaLabel}
414
- data-router-link="true"
415
- onClick={onClick ?? (e => e.preventDefault())}
416
- {...linkProps}
417
- {...linkElementProps}
418
- >
419
- {children}
420
- </a>
421
- )}
422
- >
423
- <SidebarNav.Rail>
424
- <SidebarNav.Trigger>
425
- <Icon name="menu" size={24} />
426
- </SidebarNav.Trigger>
427
- <SidebarNav.Separator id="after-burger" />
428
- </SidebarNav.Rail>
429
- <SidebarNav.Panel>
430
- <SidebarNav.PanelNav
431
- items={[{ type: 'item', id: 'home', label: 'Home', href: '/' }]}
432
- />
433
- </SidebarNav.Panel>
434
- </SidebarNav>
435
- </SidebarNavShell>
436
- );
437
-
438
- export const Default: Story = withDescription(
439
- {
440
- render: DefaultTemplate,
441
- parameters: { controls: { disable: true } },
442
- },
443
- 'Composed rail: `Trigger`, separators between `RailList` sections (favourites/notifications/calendar, emergency, help). Panel uses `Trigger` ↔ `Panel` via context (`aria-controls` / `aria-expanded`).',
444
- );
445
-
446
- export const CollapsedPanel: Story = withDescription(
447
- {
448
- render: CollapsedPanelTemplate,
449
- parameters: { controls: { disable: true } },
450
- },
451
- 'Panel hidden by default (`defaultExpanded={false}`). Use the burger trigger to open the panel.',
452
- );
453
-
454
- export const ConfigDriven: Story = withDescription(
455
- {
456
- render: ConfigDrivenTemplate,
457
- parameters: { controls: { disable: true } },
458
- },
459
- 'Same Figma rail order via `railItems` (burger, `{ type: \'separator\' }` entries, then icons). Compare with **Default** for the composed `RailList` + `Separator` pattern.',
460
- );
461
-
462
- export const WithFavourites: Story = withDescription(
463
- {
464
- render: WithFavouritesTemplate,
465
- parameters: { controls: { disable: true } },
466
- },
467
- 'Composable panel items with `canFavourite`, `isPressed`, and `onFavouriteClick`. State is mocked in the story — wire to your store or API in MIS.',
468
- );
469
-
470
- export const ConfigDrivenWithFavourites: Story = withDescription(
471
- {
472
- render: ConfigDrivenWithFavouritesTemplate,
473
- parameters: { controls: { disable: true } },
474
- },
475
- 'Config-driven rail (`figmaRailItems`) and `panelNavItems` with favourite props merged from local state.',
476
- );
477
-
478
- export const WithRenderLink: Story = withDescription(
479
- {
480
- render: WithRenderLinkTemplate,
481
- parameters: { controls: { disable: true } },
482
- },
483
- 'Root `renderLink` replaces default `<a>` elements for router integration.',
484
- );