@arbor-education/design-system.components 0.25.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gather/instructions/project-overview.md +1 -1
- package/.github/workflows/release.yml +3 -1
- package/.storybook/main.ts +12 -6
- package/CHANGELOG.md +20 -0
- package/CONTRIBUTING.md +7 -5
- package/component-library.md +97 -3
- package/dist/components/emptyState/EmptyState.d.ts +22 -0
- package/dist/components/emptyState/EmptyState.d.ts.map +1 -0
- package/dist/components/emptyState/EmptyState.js +11 -0
- package/dist/components/emptyState/EmptyState.js.map +1 -0
- package/dist/components/emptyState/EmptyState.stories.d.ts +117 -0
- package/dist/components/emptyState/EmptyState.stories.d.ts.map +1 -0
- package/dist/components/emptyState/EmptyState.stories.js +332 -0
- package/dist/components/emptyState/EmptyState.stories.js.map +1 -0
- package/dist/components/emptyState/EmptyState.test.d.ts +2 -0
- package/dist/components/emptyState/EmptyState.test.d.ts.map +1 -0
- package/dist/components/emptyState/EmptyState.test.js +80 -0
- package/dist/components/emptyState/EmptyState.test.js.map +1 -0
- package/dist/components/favourite/FavouriteButton.d.ts +18 -0
- package/dist/components/favourite/FavouriteButton.d.ts.map +1 -0
- package/dist/components/favourite/FavouriteButton.js +16 -0
- package/dist/components/favourite/FavouriteButton.js.map +1 -0
- package/dist/components/favourite/FavouriteButton.test.d.ts +2 -0
- package/dist/components/favourite/FavouriteButton.test.d.ts.map +1 -0
- package/dist/components/favourite/FavouriteButton.test.js +37 -0
- package/dist/components/favourite/FavouriteButton.test.js.map +1 -0
- package/dist/components/filterBar/FilterBar.d.ts +1 -1
- package/dist/components/filterBar/FilterBar.stories.d.ts +1 -1
- package/dist/components/icon/Icon.d.ts +1 -1
- package/dist/components/icon/Icon.d.ts.map +1 -1
- package/dist/components/icon/Icon.js +1 -1
- package/dist/components/icon/Icon.js.map +1 -1
- package/dist/components/pill/Pill.d.ts +3 -2
- package/dist/components/pill/Pill.d.ts.map +1 -1
- package/dist/components/pill/Pill.js +15 -9
- package/dist/components/pill/Pill.js.map +1 -1
- package/dist/components/pill/Pill.stories.d.ts +21 -3
- package/dist/components/pill/Pill.stories.d.ts.map +1 -1
- package/dist/components/pill/Pill.stories.js +275 -40
- package/dist/components/pill/Pill.stories.js.map +1 -1
- package/dist/components/pill/Pill.test.js +64 -3
- package/dist/components/pill/Pill.test.js.map +1 -1
- package/dist/components/sideNavigation/SideNavigation.d.ts +34 -0
- package/dist/components/sideNavigation/SideNavigation.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigation.js +30 -0
- package/dist/components/sideNavigation/SideNavigation.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigation.stories.d.ts +72 -0
- package/dist/components/sideNavigation/SideNavigation.stories.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigation.stories.js +298 -0
- package/dist/components/sideNavigation/SideNavigation.stories.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigation.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigation.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigation.test.js +74 -0
- package/dist/components/sideNavigation/SideNavigation.test.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationContext.d.ts +10 -0
- package/dist/components/sideNavigation/SideNavigationContext.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationContext.js +15 -0
- package/dist/components/sideNavigation/SideNavigationContext.js.map +1 -0
- package/dist/components/{sidebarNav/SidebarNavGroup.d.ts → sideNavigation/SideNavigationGroup.d.ts} +3 -3
- package/dist/components/sideNavigation/SideNavigationGroup.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationGroup.js +16 -0
- package/dist/components/sideNavigation/SideNavigationGroup.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationGroup.test.js +58 -0
- package/dist/components/sideNavigation/SideNavigationGroup.test.js.map +1 -0
- package/dist/components/{sidebarNav/SidebarNavItem.d.ts → sideNavigation/SideNavigationItem.d.ts} +11 -12
- package/dist/components/sideNavigation/SideNavigationItem.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItem.js +28 -0
- package/dist/components/sideNavigation/SideNavigationItem.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItem.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigationItem.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItem.test.js +65 -0
- package/dist/components/sideNavigation/SideNavigationItem.test.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts +8 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts.map +1 -0
- package/dist/components/{sidebarNav/SidebarNavItemFavourite.js → sideNavigation/SideNavigationItemFavourite.js} +5 -5
- package/dist/components/sideNavigation/SideNavigationItemFavourite.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js +31 -0
- package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTitle.d.ts +4 -0
- package/dist/components/sideNavigation/SideNavigationTitle.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTitle.js +7 -0
- package/dist/components/sideNavigation/SideNavigationTitle.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTitle.test.js +22 -0
- package/dist/components/sideNavigation/SideNavigationTitle.test.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.d.ts +7 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.d.ts.map +1 -0
- package/dist/components/{sidebarNav/SidebarNavTooltip.js → sideNavigation/SideNavigationTooltip.js} +2 -2
- package/dist/components/sideNavigation/SideNavigationTooltip.js.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts +2 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts.map +1 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.test.js +26 -0
- package/dist/components/sideNavigation/SideNavigationTooltip.test.js.map +1 -0
- package/dist/components/sideNavigation/resolvePanelItemProps.d.ts +4 -0
- package/dist/components/sideNavigation/resolvePanelItemProps.d.ts.map +1 -0
- package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.js +5 -4
- package/dist/components/sideNavigation/resolvePanelItemProps.js.map +1 -0
- package/dist/components/sideNavigation/resolvePanelItemProps.test.d.ts.map +1 -0
- package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.js +18 -4
- package/dist/components/sideNavigation/resolvePanelItemProps.test.js.map +1 -0
- package/dist/components/sideNavigation/types.d.ts +47 -0
- package/dist/components/sideNavigation/types.d.ts.map +1 -0
- package/dist/components/sideNavigation/types.js +2 -0
- package/dist/components/sideNavigation/types.js.map +1 -0
- package/dist/components/sidebar/Sidebar.d.ts +13 -0
- package/dist/components/sidebar/Sidebar.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.js +9 -0
- package/dist/components/sidebar/Sidebar.js.map +1 -0
- package/dist/components/sidebar/Sidebar.stories.d.ts +48 -0
- package/dist/components/sidebar/Sidebar.stories.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.stories.js +444 -0
- package/dist/components/sidebar/Sidebar.stories.js.map +1 -0
- package/dist/components/sidebar/Sidebar.test.d.ts +2 -0
- package/dist/components/sidebar/Sidebar.test.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.test.js +81 -0
- package/dist/components/sidebar/Sidebar.test.js.map +1 -0
- package/dist/components/sidebar/SidebarItem.d.ts +7 -0
- package/dist/components/sidebar/SidebarItem.d.ts.map +1 -0
- package/dist/components/sidebar/SidebarItem.js +11 -0
- package/dist/components/sidebar/SidebarItem.js.map +1 -0
- package/dist/components/singleUser/SingleUser.d.ts +1 -1
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +2 -1
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +24 -70
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -1
- package/dist/components/table/cellEditors/DateCellEditor.stories.js +16 -13
- package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +6 -7
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +7 -8
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +7 -8
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +7 -8
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js +12 -15
- package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js.map +1 -1
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +19 -29
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -1
- package/dist/components/table/columnTypes.d.ts +3 -0
- package/dist/components/table/columnTypes.d.ts.map +1 -0
- package/dist/components/table/columnTypes.js +55 -0
- package/dist/components/table/columnTypes.js.map +1 -0
- package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
- package/dist/components/toast/Toast.d.ts +11 -2
- package/dist/components/toast/Toast.d.ts.map +1 -1
- package/dist/components/toast/Toast.js +5 -3
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/toast/Toast.stories.d.ts +15 -3
- package/dist/components/toast/Toast.stories.d.ts.map +1 -1
- package/dist/components/toast/Toast.stories.js +43 -41
- package/dist/components/toast/Toast.stories.js.map +1 -1
- package/dist/components/toast/Toast.test.js +19 -4
- package/dist/components/toast/Toast.test.js.map +1 -1
- package/dist/components/toast/ToastAction.d.ts +7 -0
- package/dist/components/toast/ToastAction.d.ts.map +1 -0
- package/dist/components/toast/ToastAction.js +9 -0
- package/dist/components/toast/ToastAction.js.map +1 -0
- package/dist/components/toggleGroup/ToggleGroup.stories.js +1 -1
- package/dist/components/toggleGroup/ToggleGroup.stories.js.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.d.ts +1 -0
- package/dist/components/tooltip/TooltipWrapper.d.ts.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.js +2 -2
- package/dist/components/tooltip/TooltipWrapper.js.map +1 -1
- package/dist/components/widget/Widget.d.ts +18 -0
- package/dist/components/widget/Widget.d.ts.map +1 -0
- package/dist/components/widget/Widget.js +51 -0
- package/dist/components/widget/Widget.js.map +1 -0
- package/dist/components/widget/Widget.stories.d.ts +128 -0
- package/dist/components/widget/Widget.stories.d.ts.map +1 -0
- package/dist/components/widget/Widget.stories.js +417 -0
- package/dist/components/widget/Widget.stories.js.map +1 -0
- package/dist/components/widget/Widget.test.d.ts +2 -0
- package/dist/components/widget/Widget.test.d.ts.map +1 -0
- package/dist/components/widget/Widget.test.js +110 -0
- package/dist/components/widget/Widget.test.js.map +1 -0
- package/dist/components/widget/WidgetBody.d.ts +6 -0
- package/dist/components/widget/WidgetBody.d.ts.map +1 -0
- package/dist/components/widget/WidgetBody.js +20 -0
- package/dist/components/widget/WidgetBody.js.map +1 -0
- package/dist/components/widget/WidgetContext.d.ts +20 -0
- package/dist/components/widget/WidgetContext.d.ts.map +1 -0
- package/dist/components/widget/WidgetContext.js +10 -0
- package/dist/components/widget/WidgetContext.js.map +1 -0
- package/dist/components/widget/WidgetHeader.d.ts +8 -0
- package/dist/components/widget/WidgetHeader.d.ts.map +1 -0
- package/dist/components/widget/WidgetHeader.js +56 -0
- package/dist/components/widget/WidgetHeader.js.map +1 -0
- package/dist/components/widget/types.d.ts +43 -0
- package/dist/components/widget/types.d.ts.map +1 -0
- package/dist/components/widget/types.js +2 -0
- package/dist/components/widget/types.js.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.d.ts +35 -0
- package/dist/components/widgetCalendar/WidgetCalendar.d.ts.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.js +22 -0
- package/dist/components/widgetCalendar/WidgetCalendar.js.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts +60 -0
- package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.stories.js +140 -0
- package/dist/components/widgetCalendar/WidgetCalendar.stories.js.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts +2 -0
- package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendar.test.js +88 -0
- package/dist/components/widgetCalendar/WidgetCalendar.test.js.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts +17 -0
- package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts.map +1 -0
- package/dist/components/widgetCalendar/WidgetCalendarItem.js +25 -0
- package/dist/components/widgetCalendar/WidgetCalendarItem.js.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.d.ts +12 -0
- package/dist/components/widgetFavourites/WidgetFavourites.d.ts.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.js +23 -0
- package/dist/components/widgetFavourites/WidgetFavourites.js.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts +84 -0
- package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.stories.js +210 -0
- package/dist/components/widgetFavourites/WidgetFavourites.stories.js.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts +2 -0
- package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavourites.test.js +67 -0
- package/dist/components/widgetFavourites/WidgetFavourites.test.js.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts +3 -0
- package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts.map +1 -0
- package/dist/components/widgetFavourites/WidgetFavouritesItem.js +10 -0
- package/dist/components/widgetFavourites/WidgetFavouritesItem.js.map +1 -0
- package/dist/components/widgetFavourites/types.d.ts +25 -0
- package/dist/components/widgetFavourites/types.d.ts.map +1 -0
- package/dist/components/widgetFavourites/types.js +2 -0
- package/dist/components/widgetFavourites/types.js.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.d.ts +33 -0
- package/dist/components/widgetNotifications/WidgetNotifications.d.ts.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.js +18 -0
- package/dist/components/widgetNotifications/WidgetNotifications.js.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts +60 -0
- package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.stories.js +269 -0
- package/dist/components/widgetNotifications/WidgetNotifications.stories.js.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts +2 -0
- package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotifications.test.js +79 -0
- package/dist/components/widgetNotifications/WidgetNotifications.test.js.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts +14 -0
- package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts.map +1 -0
- package/dist/components/widgetNotifications/WidgetNotificationsItem.js +14 -0
- package/dist/components/widgetNotifications/WidgetNotificationsItem.js.map +1 -0
- package/dist/index.css +756 -78
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/dist/utils/favourites/favouriteConstants.d.ts +12 -0
- package/dist/utils/favourites/favouriteConstants.d.ts.map +1 -0
- package/dist/utils/favourites/favouriteConstants.js +16 -0
- package/dist/utils/favourites/favouriteConstants.js.map +1 -0
- package/dist/utils/favourites/favouriteConstants.test.d.ts +2 -0
- package/dist/utils/favourites/favouriteConstants.test.d.ts.map +1 -0
- package/dist/utils/favourites/favouriteConstants.test.js +12 -0
- package/dist/utils/favourites/favouriteConstants.test.js.map +1 -0
- package/dist/utils/hooks/useControllableBoolean.d.ts.map +1 -0
- package/dist/utils/hooks/useControllableBoolean.js.map +1 -0
- package/dist/utils/hooks/useControllableBoolean.test.d.ts +2 -0
- package/dist/utils/hooks/useControllableBoolean.test.d.ts.map +1 -0
- package/dist/utils/hooks/useControllableBoolean.test.js +34 -0
- package/dist/utils/hooks/useControllableBoolean.test.js.map +1 -0
- package/package.json +10 -11
- package/src/components/emptyState/EmptyState.stories.tsx +487 -0
- package/src/components/emptyState/EmptyState.test.tsx +140 -0
- package/src/components/emptyState/EmptyState.tsx +84 -0
- package/src/components/emptyState/emptyState.scss +63 -0
- package/src/components/favourite/FavouriteButton.test.tsx +83 -0
- package/src/components/favourite/FavouriteButton.tsx +70 -0
- package/src/components/favourite/favouriteButton.scss +37 -0
- package/src/components/icon/Icon.tsx +2 -2
- package/src/components/link/link.scss +26 -0
- package/src/components/pill/Pill.stories.tsx +432 -41
- package/src/components/pill/Pill.test.tsx +74 -3
- package/src/components/pill/Pill.tsx +26 -11
- package/src/components/sideNavigation/SideNavigation.stories.tsx +578 -0
- package/src/components/sideNavigation/SideNavigation.test.tsx +109 -0
- package/src/components/sideNavigation/SideNavigation.tsx +98 -0
- package/src/components/sideNavigation/SideNavigationContext.tsx +25 -0
- package/src/components/sideNavigation/SideNavigationGroup.test.tsx +103 -0
- package/src/components/{sidebarNav/SidebarNavGroup.tsx → sideNavigation/SideNavigationGroup.tsx} +8 -8
- package/src/components/sideNavigation/SideNavigationItem.test.tsx +137 -0
- package/src/components/sideNavigation/SideNavigationItem.tsx +125 -0
- package/src/components/sideNavigation/SideNavigationItemFavourite.test.tsx +54 -0
- package/src/components/{sidebarNav/SidebarNavItemFavourite.tsx → sideNavigation/SideNavigationItemFavourite.tsx} +7 -7
- package/src/components/sideNavigation/SideNavigationTitle.test.tsx +23 -0
- package/src/components/sideNavigation/SideNavigationTitle.tsx +13 -0
- package/src/components/sideNavigation/SideNavigationTooltip.test.tsx +44 -0
- package/src/components/{sidebarNav/SidebarNavTooltip.tsx → sideNavigation/SideNavigationTooltip.tsx} +2 -2
- package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.ts +20 -4
- package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.ts +8 -7
- package/src/components/{sidebarNav/sidebarNav.scss → sideNavigation/sideNavigation.scss} +37 -136
- package/src/components/sideNavigation/types.ts +56 -0
- package/src/components/sidebar/Sidebar.stories.tsx +670 -0
- package/src/components/sidebar/Sidebar.test.tsx +155 -0
- package/src/components/sidebar/Sidebar.tsx +27 -0
- package/src/components/sidebar/SidebarItem.tsx +64 -0
- package/src/components/sidebar/sidebar.scss +65 -0
- package/src/components/table/Table.stories.tsx +24 -73
- package/src/components/table/Table.tsx +2 -0
- package/src/components/table/cellEditors/DateCellEditor.stories.tsx +16 -14
- package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +6 -7
- package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +7 -8
- package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +7 -8
- package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +7 -8
- package/src/components/table/cellRenderers/NumberInputCellRenderer.stories.tsx +12 -15
- package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +19 -29
- package/src/components/table/columnTypes.ts +56 -0
- package/src/components/toast/Toast.stories.tsx +75 -67
- package/src/components/toast/Toast.test.tsx +40 -10
- package/src/components/toast/Toast.tsx +19 -5
- package/src/components/toast/ToastAction.tsx +17 -0
- package/src/components/toast/toast.scss +37 -0
- package/src/components/toggleGroup/ToggleGroup.stories.tsx +1 -1
- package/src/components/tooltip/TooltipWrapper.tsx +3 -1
- package/src/components/widget/Widget.stories.tsx +600 -0
- package/src/components/widget/Widget.test.tsx +263 -0
- package/src/components/widget/Widget.tsx +102 -0
- package/src/components/widget/WidgetBody.tsx +66 -0
- package/src/components/widget/WidgetContext.tsx +31 -0
- package/src/components/widget/WidgetHeader.tsx +155 -0
- package/src/components/widget/types.ts +47 -0
- package/src/components/widget/widget.scss +218 -0
- package/src/components/widgetCalendar/WidgetCalendar.stories.tsx +241 -0
- package/src/components/widgetCalendar/WidgetCalendar.test.tsx +137 -0
- package/src/components/widgetCalendar/WidgetCalendar.tsx +105 -0
- package/src/components/widgetCalendar/WidgetCalendarItem.tsx +105 -0
- package/src/components/widgetCalendar/widgetCalendar.scss +124 -0
- package/src/components/widgetFavourites/WidgetFavourites.stories.tsx +341 -0
- package/src/components/widgetFavourites/WidgetFavourites.test.tsx +127 -0
- package/src/components/widgetFavourites/WidgetFavourites.tsx +83 -0
- package/src/components/widgetFavourites/WidgetFavouritesItem.tsx +37 -0
- package/src/components/widgetFavourites/types.ts +26 -0
- package/src/components/widgetFavourites/widgetFavourites.scss +84 -0
- package/src/components/widgetNotifications/WidgetNotifications.stories.tsx +417 -0
- package/src/components/widgetNotifications/WidgetNotifications.test.tsx +152 -0
- package/src/components/widgetNotifications/WidgetNotifications.tsx +112 -0
- package/src/components/widgetNotifications/WidgetNotificationsItem.tsx +88 -0
- package/src/components/widgetNotifications/widgetNotifications.scss +186 -0
- package/src/docs/Contributing.mdx +1 -1
- package/src/index.scss +9 -1
- package/src/index.ts +22 -18
- package/src/tokens.scss +12 -2
- package/src/utils/favourites/favouriteConstants.test.ts +19 -0
- package/src/utils/favourites/favouriteConstants.ts +21 -0
- package/src/utils/hooks/useControllableBoolean.test.ts +48 -0
- package/dist/components/sidebarNav/SidebarNav.d.ts +0 -46
- package/dist/components/sidebarNav/SidebarNav.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNav.js +0 -102
- package/dist/components/sidebarNav/SidebarNav.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNav.stories.d.ts +0 -61
- package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNav.stories.js +0 -253
- package/dist/components/sidebarNav/SidebarNav.stories.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNav.test.d.ts +0 -2
- package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNav.test.js +0 -240
- package/dist/components/sidebarNav/SidebarNav.test.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavContext.d.ts +0 -13
- package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavContext.js +0 -15
- package/dist/components/sidebarNav/SidebarNavContext.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavGroup.js +0 -16
- package/dist/components/sidebarNav/SidebarNavGroup.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavItem.js +0 -44
- package/dist/components/sidebarNav/SidebarNavItem.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +0 -8
- package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavPanel.d.ts +0 -4
- package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavPanel.js +0 -9
- package/dist/components/sidebarNav/SidebarNavPanel.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +0 -10
- package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavPanelNav.js +0 -21
- package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRail.d.ts +0 -6
- package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRail.js +0 -7
- package/dist/components/sidebarNav/SidebarNavRail.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +0 -10
- package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailItem.js +0 -25
- package/dist/components/sidebarNav/SidebarNavRailItem.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailList.d.ts +0 -4
- package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailList.js +0 -7
- package/dist/components/sidebarNav/SidebarNavRailList.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +0 -6
- package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavRailSlot.js +0 -7
- package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +0 -6
- package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavSeparator.js +0 -8
- package/dist/components/sidebarNav/SidebarNavSeparator.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTitle.d.ts +0 -4
- package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTitle.js +0 -7
- package/dist/components/sidebarNav/SidebarNavTitle.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +0 -7
- package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTooltip.js.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +0 -8
- package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +0 -1
- package/dist/components/sidebarNav/SidebarNavTrigger.js +0 -15
- package/dist/components/sidebarNav/SidebarNavTrigger.js.map +0 -1
- package/dist/components/sidebarNav/index.d.ts +0 -4
- package/dist/components/sidebarNav/index.d.ts.map +0 -1
- package/dist/components/sidebarNav/index.js +0 -3
- package/dist/components/sidebarNav/index.js.map +0 -1
- package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +0 -4
- package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +0 -1
- package/dist/components/sidebarNav/resolvePanelItemProps.js.map +0 -1
- package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +0 -1
- package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +0 -1
- package/dist/components/sidebarNav/types.d.ts +0 -100
- package/dist/components/sidebarNav/types.d.ts.map +0 -1
- package/dist/components/sidebarNav/types.js +0 -4
- package/dist/components/sidebarNav/types.js.map +0 -1
- package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +0 -1
- package/dist/components/sidebarNav/useControllableBoolean.js.map +0 -1
- package/src/components/sidebarNav/SidebarNav.stories.tsx +0 -484
- package/src/components/sidebarNav/SidebarNav.test.tsx +0 -611
- package/src/components/sidebarNav/SidebarNav.tsx +0 -230
- package/src/components/sidebarNav/SidebarNavContext.tsx +0 -28
- package/src/components/sidebarNav/SidebarNavItem.tsx +0 -162
- package/src/components/sidebarNav/SidebarNavPanel.tsx +0 -20
- package/src/components/sidebarNav/SidebarNavPanelNav.tsx +0 -55
- package/src/components/sidebarNav/SidebarNavRail.tsx +0 -20
- package/src/components/sidebarNav/SidebarNavRailItem.tsx +0 -83
- package/src/components/sidebarNav/SidebarNavRailList.tsx +0 -11
- package/src/components/sidebarNav/SidebarNavRailSlot.tsx +0 -15
- package/src/components/sidebarNav/SidebarNavSeparator.tsx +0 -19
- package/src/components/sidebarNav/SidebarNavTitle.tsx +0 -13
- package/src/components/sidebarNav/SidebarNavTrigger.tsx +0 -52
- package/src/components/sidebarNav/index.ts +0 -6
- package/src/components/sidebarNav/types.ts +0 -126
- /package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.d.ts +0 -0
- /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.d.ts +0 -0
- /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.js +0 -0
- /package/src/{components/sidebarNav → utils/hooks}/useControllableBoolean.ts +0 -0
|
@@ -0,0 +1,670 @@
|
|
|
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 { Separator } from 'Components/separator/Separator';
|
|
14
|
+
import { useState } from 'react';
|
|
15
|
+
import { Sidebar } from './Sidebar.js';
|
|
16
|
+
import { SidebarItem } from './SidebarItem.js';
|
|
17
|
+
import { SideNavigation } from 'Components/sideNavigation/SideNavigation.js';
|
|
18
|
+
import type { SideNavigationNode } from 'Components/sideNavigation/types.js';
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Docs page content
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
const DESCRIPTION_INTRO = [
|
|
25
|
+
'Sidebar is the narrow icon rail that anchors an application\'s primary navigation.',
|
|
26
|
+
'It renders a semantic `<nav>` element containing `Sidebar.Item` entries and optionally',
|
|
27
|
+
'pairs with a `SideNavigation` panel beside it.',
|
|
28
|
+
'',
|
|
29
|
+
'Each `Sidebar.Item` renders as either a `<button>` (no `href`) or an `<a>` (with `href`),',
|
|
30
|
+
'with an icon centred in a square touch target. Hovering or focusing an item reveals a tooltip',
|
|
31
|
+
'to the right — each item wraps itself in its own `Tooltip`, so tooltips are fully self-contained',
|
|
32
|
+
'and need no provider from `Sidebar`.',
|
|
33
|
+
'',
|
|
34
|
+
'## Compound component API',
|
|
35
|
+
'',
|
|
36
|
+
'| Sub-component | Description |',
|
|
37
|
+
'|---|---|',
|
|
38
|
+
'| `<Sidebar />` | Root — renders a `<nav>`. |',
|
|
39
|
+
'| `<Sidebar.Item />` | Navigation item. No `href` → `<button>`; with `href` → `<a>`. |',
|
|
40
|
+
].join('\n');
|
|
41
|
+
|
|
42
|
+
const USAGE_GUIDANCE = [
|
|
43
|
+
'### When to use',
|
|
44
|
+
'',
|
|
45
|
+
'- **Application shell navigation** — persistent icon rail with tooltips for home, favourites, calendar, etc.',
|
|
46
|
+
'- **MIS module navigation** — rail icons paired with a `SideNavigation` panel for hierarchical links.',
|
|
47
|
+
'- **Any layout where navigation labels should be hidden by default** — icons only, labels on demand.',
|
|
48
|
+
'',
|
|
49
|
+
'---',
|
|
50
|
+
'',
|
|
51
|
+
'### When NOT to use',
|
|
52
|
+
'',
|
|
53
|
+
'| Situation | Use instead |',
|
|
54
|
+
'|---|---|',
|
|
55
|
+
'| Horizontal top-level product nav | `Menubar` or app header patterns |',
|
|
56
|
+
'| Navigation labels must always be visible | `SideNavigation` alone, or a nav with visible text links |',
|
|
57
|
+
'| Single flat list of links | `Tabs` or plain links |',
|
|
58
|
+
'| Account / settings dropdown menu | `Dropdown` |',
|
|
59
|
+
'| Inline or contextual page navigation | `SideNavigation` without the icon rail |',
|
|
60
|
+
].join('\n');
|
|
61
|
+
|
|
62
|
+
const DEVELOPER_NOTES = [
|
|
63
|
+
'### `aria-label` on every `Sidebar.Item` is effectively required',
|
|
64
|
+
'',
|
|
65
|
+
'The `aria-label` prop on `Sidebar.Item` does **two jobs at once**: it is the accessible name of the',
|
|
66
|
+
'interactive element (announced by screen readers) **and** the text shown in the right-side tooltip.',
|
|
67
|
+
'Without it, screen reader users receive no meaningful label and the tooltip renders blank.',
|
|
68
|
+
'',
|
|
69
|
+
'```tsx',
|
|
70
|
+
'// ✅ Good',
|
|
71
|
+
'<Sidebar.Item aria-label="Daily Attendance" selected={active === \'attendance\'} onClick={...}>',
|
|
72
|
+
' <Icon name="favourite-outline" size={24} />',
|
|
73
|
+
'</Sidebar.Item>',
|
|
74
|
+
'',
|
|
75
|
+
'// ❌ Bad — tooltip is empty, icon is inaccessible to screen readers',
|
|
76
|
+
'<Sidebar.Item selected={active === \'attendance\'} onClick={...}>',
|
|
77
|
+
' <Icon name="favourite-outline" size={24} />',
|
|
78
|
+
'</Sidebar.Item>',
|
|
79
|
+
'```',
|
|
80
|
+
'',
|
|
81
|
+
'---',
|
|
82
|
+
'',
|
|
83
|
+
'### The `selected` prop does two things',
|
|
84
|
+
'',
|
|
85
|
+
'`selected={true}` simultaneously:',
|
|
86
|
+
'1. Applies `ds-sidebar__item--selected` (the selected visual style)',
|
|
87
|
+
'2. Sets `aria-current="true"` on the underlying `<button>` or `<a>`',
|
|
88
|
+
'',
|
|
89
|
+
'The attribute is always rendered — even `aria-current="false"` is present when `selected` is falsy.',
|
|
90
|
+
'**Do not manage `aria-current` separately** — the component handles it.',
|
|
91
|
+
'',
|
|
92
|
+
'---',
|
|
93
|
+
'',
|
|
94
|
+
'### Button vs link — decided by `href` alone',
|
|
95
|
+
'',
|
|
96
|
+
'- No `href` → `<button type="button">` — use for SPA actions, panel toggles, modals',
|
|
97
|
+
'- With `href` → `<a>` — use for real URL navigation',
|
|
98
|
+
'',
|
|
99
|
+
'Visual output is identical. The choice is purely semantic.',
|
|
100
|
+
'',
|
|
101
|
+
'---',
|
|
102
|
+
'',
|
|
103
|
+
'### Each item\'s tooltip is a self-contained provider',
|
|
104
|
+
'',
|
|
105
|
+
'Every `Sidebar.Item` wraps itself in its own `Tooltip`, each with its own Radix provider.',
|
|
106
|
+
'This means tooltips work with no setup from `Sidebar`, but Radix\'s shared skip-delay behaviour',
|
|
107
|
+
'(where subsequent tooltips open instantly after the first) does **not** apply across items —',
|
|
108
|
+
'each item\'s open delay is independent.',
|
|
109
|
+
'',
|
|
110
|
+
'---',
|
|
111
|
+
'',
|
|
112
|
+
'### Badge overlay',
|
|
113
|
+
'',
|
|
114
|
+
'A `Badge` child inside `Sidebar.Item` is automatically positioned absolutely in the top-right corner',
|
|
115
|
+
'by `sidebar.scss`. No extra styling needed:',
|
|
116
|
+
'',
|
|
117
|
+
'```tsx',
|
|
118
|
+
'<Sidebar.Item aria-label="Notifications — 6 unread" selected={false}>',
|
|
119
|
+
' <Icon name="message-square-more" size={24} />',
|
|
120
|
+
' <Badge size="sm" colour="salmon">6</Badge>',
|
|
121
|
+
'</Sidebar.Item>',
|
|
122
|
+
'```',
|
|
123
|
+
'',
|
|
124
|
+
'Include the count in `aria-label` so screen reader users also receive the notification total.',
|
|
125
|
+
'',
|
|
126
|
+
'---',
|
|
127
|
+
'',
|
|
128
|
+
'### Panel pattern',
|
|
129
|
+
'',
|
|
130
|
+
'`SideNavigation` is a separate companion component — **not** a sub-component of `Sidebar`. It is styled as',
|
|
131
|
+
'a panel by default (width, gap, and overflow are built in), so render it as a flex sibling of `Sidebar`:',
|
|
132
|
+
'',
|
|
133
|
+
'```tsx',
|
|
134
|
+
'const [panelOpen, setPanelOpen] = useState(true);',
|
|
135
|
+
'',
|
|
136
|
+
'<div style={{ display: \'flex\', height: \'100%\' }}>',
|
|
137
|
+
' <Sidebar>',
|
|
138
|
+
' <Sidebar.Item',
|
|
139
|
+
' aria-label="Toggle navigation panel"',
|
|
140
|
+
' selected={panelOpen}',
|
|
141
|
+
' aria-expanded={panelOpen}',
|
|
142
|
+
' aria-controls="side-panel"',
|
|
143
|
+
' onClick={() => setPanelOpen(o => !o)}',
|
|
144
|
+
' >',
|
|
145
|
+
' <Icon name="menu" size={24} />',
|
|
146
|
+
' </Sidebar.Item>',
|
|
147
|
+
' </Sidebar>',
|
|
148
|
+
' {panelOpen && (',
|
|
149
|
+
' <div style={{ display: \'flex\', flexDirection: \'column\' }}>',
|
|
150
|
+
' <SideNavigation.Title>Attendance</SideNavigation.Title>',
|
|
151
|
+
' <SideNavigation id="side-panel" items={navItems} />',
|
|
152
|
+
' </div>',
|
|
153
|
+
' )}',
|
|
154
|
+
'</div>',
|
|
155
|
+
'```',
|
|
156
|
+
'',
|
|
157
|
+
'---',
|
|
158
|
+
'',
|
|
159
|
+
'### Accessibility',
|
|
160
|
+
'',
|
|
161
|
+
'- The `Sidebar` root renders a `<nav>` landmark. Set `ariaLabel` to a meaningful value when the',
|
|
162
|
+
' page contains more than one `<nav>` (default is `"Sidebar"`)',
|
|
163
|
+
'- All items are natively focusable (`<button>` or `<a>`) — tab order follows DOM order',
|
|
164
|
+
'- The tooltip surfaces on both hover **and** keyboard focus — keyboard users see labels too',
|
|
165
|
+
'- Icons carry `aria-hidden="true"` automatically; `aria-label` on the item is the sole accessible name',
|
|
166
|
+
'',
|
|
167
|
+
'---',
|
|
168
|
+
'',
|
|
169
|
+
'### TypeScript types',
|
|
170
|
+
'',
|
|
171
|
+
'```ts',
|
|
172
|
+
"import { Sidebar, SidebarItem } from '@arbor-education/design-system.components';",
|
|
173
|
+
'```',
|
|
174
|
+
'',
|
|
175
|
+
'---',
|
|
176
|
+
'',
|
|
177
|
+
'### Test IDs',
|
|
178
|
+
'',
|
|
179
|
+
'| Element | `data-testid` |',
|
|
180
|
+
'|---|---|',
|
|
181
|
+
'| Rail nav | `sidebar` |',
|
|
182
|
+
'| Individual item | pass `data-testid` directly to `<Sidebar.Item>` |',
|
|
183
|
+
].join('\n');
|
|
184
|
+
|
|
185
|
+
const RELATED_COMPONENTS = [
|
|
186
|
+
'## Related components',
|
|
187
|
+
'',
|
|
188
|
+
'[SideNavigation](?path=/docs/components-sidenavigation--docs) — the hierarchical tree panel that pairs with the Sidebar rail',
|
|
189
|
+
'',
|
|
190
|
+
'[Separator](?path=/docs/components-separator--docs) · [Tooltip](?path=/docs/components-tooltip--docs) · [Badge](?path=/docs/components-badge--docs)',
|
|
191
|
+
].join('\n');
|
|
192
|
+
|
|
193
|
+
const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
|
|
194
|
+
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Docs page
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
function SidebarDocsPage() {
|
|
200
|
+
return (
|
|
201
|
+
<>
|
|
202
|
+
<Title />
|
|
203
|
+
<Subtitle />
|
|
204
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
205
|
+
<DocHeading>Interactive example</DocHeading>
|
|
206
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
207
|
+
<DocPrimary />
|
|
208
|
+
<Controls />
|
|
209
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
210
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
211
|
+
<DocHeading>Developer notes</DocHeading>
|
|
212
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
213
|
+
<DocHeading>Examples</DocHeading>
|
|
214
|
+
<Stories title="" />
|
|
215
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
216
|
+
</>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Meta
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
|
|
224
|
+
const meta = {
|
|
225
|
+
title: 'Components/Sidebar',
|
|
226
|
+
component: Sidebar,
|
|
227
|
+
parameters: {
|
|
228
|
+
layout: 'padded',
|
|
229
|
+
docs: { page: SidebarDocsPage },
|
|
230
|
+
},
|
|
231
|
+
tags: ['autodocs'],
|
|
232
|
+
argTypes: {
|
|
233
|
+
ariaLabel: {
|
|
234
|
+
control: 'text',
|
|
235
|
+
description: [
|
|
236
|
+
'Accessible label for the `<nav>` landmark.',
|
|
237
|
+
'Defaults to `"Sidebar"`. Provide a meaningful value when the page has more than one `<nav>`',
|
|
238
|
+
'— screen readers list nav landmarks by their label.',
|
|
239
|
+
].join(' '),
|
|
240
|
+
table: {
|
|
241
|
+
type: { summary: 'string' },
|
|
242
|
+
defaultValue: { summary: '"Sidebar"' },
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
children: {
|
|
246
|
+
control: false,
|
|
247
|
+
description: 'Use `Sidebar.Item` and `Separator` as direct children.',
|
|
248
|
+
table: { type: { summary: 'ReactNode' } },
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
} satisfies Meta<typeof Sidebar>;
|
|
252
|
+
|
|
253
|
+
export default meta;
|
|
254
|
+
type Story = StoryObj<typeof Sidebar>;
|
|
255
|
+
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Helper
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
|
|
260
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
261
|
+
...story,
|
|
262
|
+
parameters: {
|
|
263
|
+
...story.parameters,
|
|
264
|
+
docs: { ...story.parameters?.docs, description: { story: description } },
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// Shared data
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
|
|
272
|
+
const storyWrapperStyle: React.CSSProperties = { display: 'flex', height: 640 };
|
|
273
|
+
|
|
274
|
+
const basePanelNavItems: SideNavigationNode[] = [
|
|
275
|
+
{
|
|
276
|
+
type: 'group',
|
|
277
|
+
id: 'registers',
|
|
278
|
+
label: 'Registers',
|
|
279
|
+
defaultExpanded: true,
|
|
280
|
+
children: [
|
|
281
|
+
{ type: 'item', id: 'covid', label: 'Covid-19 Dashboard', href: '/covid' },
|
|
282
|
+
{ type: 'item', id: 'daily', label: 'Daily Attendance', href: '/daily', current: true },
|
|
283
|
+
{ type: 'item', id: 'quick', label: 'Quick Follow-Up', href: '/quick' },
|
|
284
|
+
],
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
type: 'group',
|
|
288
|
+
id: 'absentees',
|
|
289
|
+
label: 'Absentees',
|
|
290
|
+
children: [
|
|
291
|
+
{ type: 'item', id: 'late', label: 'Latecomers', href: '/latecomers' },
|
|
292
|
+
{ type: 'item', id: 'stats', label: 'Statistics', href: '/statistics' },
|
|
293
|
+
],
|
|
294
|
+
},
|
|
295
|
+
];
|
|
296
|
+
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
// Templates
|
|
299
|
+
// ---------------------------------------------------------------------------
|
|
300
|
+
|
|
301
|
+
const DefaultTemplate = () => {
|
|
302
|
+
const [active, setActive] = useState<string>('favourites');
|
|
303
|
+
|
|
304
|
+
return (
|
|
305
|
+
<div style={storyWrapperStyle}>
|
|
306
|
+
<Sidebar ariaLabel="App navigation">
|
|
307
|
+
<SidebarItem
|
|
308
|
+
aria-label="Favourites"
|
|
309
|
+
selected={active === 'favourites'}
|
|
310
|
+
onClick={() => setActive('favourites')}
|
|
311
|
+
>
|
|
312
|
+
<Icon name="favourite-outline" size={24} />
|
|
313
|
+
</SidebarItem>
|
|
314
|
+
<SidebarItem
|
|
315
|
+
aria-label="Notifications"
|
|
316
|
+
selected={active === 'notifications'}
|
|
317
|
+
onClick={() => setActive('notifications')}
|
|
318
|
+
>
|
|
319
|
+
<Icon name="message-square-more" size={24} />
|
|
320
|
+
</SidebarItem>
|
|
321
|
+
<SidebarItem
|
|
322
|
+
aria-label="My Calendar"
|
|
323
|
+
selected={active === 'calendar'}
|
|
324
|
+
onClick={() => setActive('calendar')}
|
|
325
|
+
>
|
|
326
|
+
<Icon name="date" size={24} />
|
|
327
|
+
</SidebarItem>
|
|
328
|
+
</Sidebar>
|
|
329
|
+
</div>
|
|
330
|
+
);
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
const WithSeparatorsTemplate = () => {
|
|
334
|
+
const [active, setActive] = useState<string>('favourites');
|
|
335
|
+
|
|
336
|
+
return (
|
|
337
|
+
<div style={storyWrapperStyle}>
|
|
338
|
+
<Sidebar ariaLabel="App navigation">
|
|
339
|
+
<SidebarItem
|
|
340
|
+
aria-label="Favourites"
|
|
341
|
+
selected={active === 'favourites'}
|
|
342
|
+
onClick={() => setActive('favourites')}
|
|
343
|
+
>
|
|
344
|
+
<Icon name="favourite-outline" size={24} />
|
|
345
|
+
</SidebarItem>
|
|
346
|
+
<SidebarItem
|
|
347
|
+
aria-label="Notifications"
|
|
348
|
+
selected={active === 'notifications'}
|
|
349
|
+
onClick={() => setActive('notifications')}
|
|
350
|
+
>
|
|
351
|
+
<Icon name="message-square-more" size={24} />
|
|
352
|
+
</SidebarItem>
|
|
353
|
+
<SidebarItem
|
|
354
|
+
aria-label="My Calendar"
|
|
355
|
+
selected={active === 'calendar'}
|
|
356
|
+
onClick={() => setActive('calendar')}
|
|
357
|
+
>
|
|
358
|
+
<Icon name="date" size={24} />
|
|
359
|
+
</SidebarItem>
|
|
360
|
+
<Separator orientation="horizontal" decorative />
|
|
361
|
+
<SidebarItem
|
|
362
|
+
aria-label="Emergency Alerts"
|
|
363
|
+
selected={active === 'emergency'}
|
|
364
|
+
onClick={() => setActive('emergency')}
|
|
365
|
+
>
|
|
366
|
+
<Icon name="triangle-alert" size={24} />
|
|
367
|
+
</SidebarItem>
|
|
368
|
+
<Separator orientation="horizontal" decorative />
|
|
369
|
+
<SidebarItem
|
|
370
|
+
aria-label="Help & Learn with Arbor"
|
|
371
|
+
selected={active === 'help'}
|
|
372
|
+
onClick={() => setActive('help')}
|
|
373
|
+
>
|
|
374
|
+
<Icon name="circle-help" size={24} />
|
|
375
|
+
</SidebarItem>
|
|
376
|
+
</Sidebar>
|
|
377
|
+
</div>
|
|
378
|
+
);
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
const WithBadgeTemplate = () => {
|
|
382
|
+
const [active, setActive] = useState<string>('favourites');
|
|
383
|
+
|
|
384
|
+
return (
|
|
385
|
+
<div style={storyWrapperStyle}>
|
|
386
|
+
<Sidebar ariaLabel="App navigation">
|
|
387
|
+
<SidebarItem
|
|
388
|
+
aria-label="Favourites"
|
|
389
|
+
selected={active === 'favourites'}
|
|
390
|
+
onClick={() => setActive('favourites')}
|
|
391
|
+
>
|
|
392
|
+
<Icon name="favourite-outline" size={24} />
|
|
393
|
+
</SidebarItem>
|
|
394
|
+
<SidebarItem
|
|
395
|
+
aria-label="Notifications — 6 unread"
|
|
396
|
+
selected={active === 'notifications'}
|
|
397
|
+
onClick={() => setActive('notifications')}
|
|
398
|
+
>
|
|
399
|
+
<Icon name="message-square-more" size={24} />
|
|
400
|
+
<Badge size="sm" colour="salmon">6</Badge>
|
|
401
|
+
</SidebarItem>
|
|
402
|
+
<SidebarItem
|
|
403
|
+
aria-label="Emergency Alerts — 2 active"
|
|
404
|
+
selected={active === 'emergency'}
|
|
405
|
+
onClick={() => setActive('emergency')}
|
|
406
|
+
>
|
|
407
|
+
<Icon name="triangle-alert" size={24} />
|
|
408
|
+
<Badge size="sm" colour="yellow">2</Badge>
|
|
409
|
+
</SidebarItem>
|
|
410
|
+
<SidebarItem
|
|
411
|
+
aria-label="My Calendar"
|
|
412
|
+
selected={active === 'calendar'}
|
|
413
|
+
onClick={() => setActive('calendar')}
|
|
414
|
+
>
|
|
415
|
+
<Icon name="date" size={24} />
|
|
416
|
+
</SidebarItem>
|
|
417
|
+
</Sidebar>
|
|
418
|
+
</div>
|
|
419
|
+
);
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
const WithPanelTemplate = () => {
|
|
423
|
+
const [open, setOpen] = useState(true);
|
|
424
|
+
const [active, setActive] = useState<string>('favourites');
|
|
425
|
+
|
|
426
|
+
return (
|
|
427
|
+
<div style={storyWrapperStyle}>
|
|
428
|
+
<Sidebar ariaLabel="App navigation">
|
|
429
|
+
<SidebarItem
|
|
430
|
+
aria-label="Toggle navigation panel"
|
|
431
|
+
onClick={() => setOpen(prev => !prev)}
|
|
432
|
+
selected={open}
|
|
433
|
+
aria-expanded={open}
|
|
434
|
+
aria-controls="story-panel"
|
|
435
|
+
>
|
|
436
|
+
<Icon name="menu" size={24} />
|
|
437
|
+
</SidebarItem>
|
|
438
|
+
<Separator orientation="horizontal" decorative />
|
|
439
|
+
<SidebarItem
|
|
440
|
+
aria-label="Favourites"
|
|
441
|
+
selected={active === 'favourites'}
|
|
442
|
+
onClick={() => setActive('favourites')}
|
|
443
|
+
>
|
|
444
|
+
<Icon name="favourite-outline" size={24} />
|
|
445
|
+
</SidebarItem>
|
|
446
|
+
<SidebarItem
|
|
447
|
+
aria-label="My Calendar"
|
|
448
|
+
selected={active === 'calendar'}
|
|
449
|
+
onClick={() => setActive('calendar')}
|
|
450
|
+
>
|
|
451
|
+
<Icon name="date" size={24} />
|
|
452
|
+
</SidebarItem>
|
|
453
|
+
</Sidebar>
|
|
454
|
+
{open && (
|
|
455
|
+
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
|
456
|
+
<SideNavigation.Title>Attendance</SideNavigation.Title>
|
|
457
|
+
<SideNavigation id="story-panel" items={basePanelNavItems} />
|
|
458
|
+
</div>
|
|
459
|
+
)}
|
|
460
|
+
</div>
|
|
461
|
+
);
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
const WithLinksTemplate = () => (
|
|
465
|
+
<div style={storyWrapperStyle}>
|
|
466
|
+
<Sidebar ariaLabel="App navigation">
|
|
467
|
+
<SidebarItem href="/favourites" aria-label="Favourites">
|
|
468
|
+
<Icon name="favourite-outline" size={24} />
|
|
469
|
+
</SidebarItem>
|
|
470
|
+
<SidebarItem href="/calendar" aria-label="My Calendar" selected>
|
|
471
|
+
<Icon name="date" size={24} />
|
|
472
|
+
</SidebarItem>
|
|
473
|
+
<Separator orientation="horizontal" decorative />
|
|
474
|
+
<SidebarItem href="/help" aria-label="Help & Learn with Arbor">
|
|
475
|
+
<Icon name="circle-help" size={24} />
|
|
476
|
+
</SidebarItem>
|
|
477
|
+
</Sidebar>
|
|
478
|
+
</div>
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
// ---------------------------------------------------------------------------
|
|
482
|
+
// Stories
|
|
483
|
+
// ---------------------------------------------------------------------------
|
|
484
|
+
|
|
485
|
+
export const Default: Story = withDescription(
|
|
486
|
+
{ render: DefaultTemplate, parameters: { controls: { disable: true } } },
|
|
487
|
+
'Button items with interactive active state — click any item to select it. The selected item receives the `ds-sidebar__item--selected` visual state and `aria-current="true"`.',
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
export const WithSeparators: Story = withDescription(
|
|
491
|
+
{
|
|
492
|
+
render: WithSeparatorsTemplate,
|
|
493
|
+
parameters: {
|
|
494
|
+
controls: { disable: true },
|
|
495
|
+
docs: {
|
|
496
|
+
source: {
|
|
497
|
+
language: 'tsx',
|
|
498
|
+
code: `
|
|
499
|
+
import { Sidebar, SidebarItem, Separator, Icon } from '@arbor-education/design-system.components';
|
|
500
|
+
import { useState } from 'react';
|
|
501
|
+
|
|
502
|
+
function WithSeparatorsExample() {
|
|
503
|
+
const [active, setActive] = useState('favourites');
|
|
504
|
+
return (
|
|
505
|
+
<Sidebar ariaLabel="App navigation">
|
|
506
|
+
{/* Primary nav group */}
|
|
507
|
+
<SidebarItem aria-label="Favourites" selected={active === 'favourites'} onClick={() => setActive('favourites')}>
|
|
508
|
+
<Icon name="favourite-outline" size={24} />
|
|
509
|
+
</SidebarItem>
|
|
510
|
+
<SidebarItem aria-label="Notifications" selected={active === 'notifications'} onClick={() => setActive('notifications')}>
|
|
511
|
+
<Icon name="message-square-more" size={24} />
|
|
512
|
+
</SidebarItem>
|
|
513
|
+
<SidebarItem aria-label="My Calendar" selected={active === 'calendar'} onClick={() => setActive('calendar')}>
|
|
514
|
+
<Icon name="date" size={24} />
|
|
515
|
+
</SidebarItem>
|
|
516
|
+
<Separator orientation="horizontal" decorative />
|
|
517
|
+
{/* Alert group */}
|
|
518
|
+
<SidebarItem aria-label="Emergency Alerts" selected={active === 'emergency'} onClick={() => setActive('emergency')}>
|
|
519
|
+
<Icon name="triangle-alert" size={24} />
|
|
520
|
+
</SidebarItem>
|
|
521
|
+
<Separator orientation="horizontal" decorative />
|
|
522
|
+
{/* Utility group */}
|
|
523
|
+
<SidebarItem aria-label="Help & Learn with Arbor" selected={active === 'help'} onClick={() => setActive('help')}>
|
|
524
|
+
<Icon name="circle-help" size={24} />
|
|
525
|
+
</SidebarItem>
|
|
526
|
+
</Sidebar>
|
|
527
|
+
);
|
|
528
|
+
}
|
|
529
|
+
export default WithSeparatorsExample;
|
|
530
|
+
`.trim(),
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
'Three groups divided by `<Separator orientation="horizontal" decorative />`. A common layout: primary nav / alerts / utility items. Click any item to see the active state.',
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
export const WithBadge: Story = withDescription(
|
|
539
|
+
{
|
|
540
|
+
render: WithBadgeTemplate,
|
|
541
|
+
parameters: {
|
|
542
|
+
controls: { disable: true },
|
|
543
|
+
docs: {
|
|
544
|
+
source: {
|
|
545
|
+
language: 'tsx',
|
|
546
|
+
code: `
|
|
547
|
+
import { Sidebar, SidebarItem, Badge, Icon } from '@arbor-education/design-system.components';
|
|
548
|
+
import { useState } from 'react';
|
|
549
|
+
|
|
550
|
+
function WithBadgeExample() {
|
|
551
|
+
const [active, setActive] = useState('favourites');
|
|
552
|
+
return (
|
|
553
|
+
<Sidebar ariaLabel="App navigation">
|
|
554
|
+
<SidebarItem aria-label="Favourites" selected={active === 'favourites'} onClick={() => setActive('favourites')}>
|
|
555
|
+
<Icon name="favourite-outline" size={24} />
|
|
556
|
+
</SidebarItem>
|
|
557
|
+
{/*
|
|
558
|
+
Badge is automatically positioned top-right by sidebar.scss — no extra styling needed.
|
|
559
|
+
Include the count in aria-label so screen reader users also receive the total.
|
|
560
|
+
*/}
|
|
561
|
+
<SidebarItem aria-label="Notifications — 6 unread" selected={active === 'notifications'} onClick={() => setActive('notifications')}>
|
|
562
|
+
<Icon name="message-square-more" size={24} />
|
|
563
|
+
<Badge size="sm" colour="salmon">6</Badge>
|
|
564
|
+
</SidebarItem>
|
|
565
|
+
<SidebarItem aria-label="Emergency Alerts — 2 active" selected={active === 'emergency'} onClick={() => setActive('emergency')}>
|
|
566
|
+
<Icon name="triangle-alert" size={24} />
|
|
567
|
+
<Badge size="sm" colour="yellow">2</Badge>
|
|
568
|
+
</SidebarItem>
|
|
569
|
+
</Sidebar>
|
|
570
|
+
);
|
|
571
|
+
}
|
|
572
|
+
export default WithBadgeExample;
|
|
573
|
+
`.trim(),
|
|
574
|
+
},
|
|
575
|
+
},
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
'A `<Badge>` child inside `Sidebar.Item` is automatically positioned in the top-right corner by `sidebar.scss` — no wrapper or additional CSS needed. Include the count in `aria-label` so screen reader users also receive the notification total.',
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
export const WithPanel: Story = withDescription(
|
|
582
|
+
{
|
|
583
|
+
render: WithPanelTemplate,
|
|
584
|
+
parameters: {
|
|
585
|
+
controls: { disable: true },
|
|
586
|
+
docs: {
|
|
587
|
+
source: {
|
|
588
|
+
language: 'tsx',
|
|
589
|
+
code: `
|
|
590
|
+
import { useState } from 'react';
|
|
591
|
+
import { Sidebar, SidebarItem, Separator, Icon, SideNavigation } from '@arbor-education/design-system.components';
|
|
592
|
+
|
|
593
|
+
function WithPanelExample() {
|
|
594
|
+
const [open, setOpen] = useState(true);
|
|
595
|
+
|
|
596
|
+
return (
|
|
597
|
+
<div style={{ display: 'flex', height: '100%' }}>
|
|
598
|
+
<Sidebar ariaLabel="App navigation">
|
|
599
|
+
{/* aria-expanded and aria-controls wire the button to the panel for assistive technology */}
|
|
600
|
+
<SidebarItem
|
|
601
|
+
aria-label="Toggle navigation panel"
|
|
602
|
+
selected={open}
|
|
603
|
+
aria-expanded={open}
|
|
604
|
+
aria-controls="side-panel"
|
|
605
|
+
onClick={() => setOpen(o => !o)}
|
|
606
|
+
>
|
|
607
|
+
<Icon name="menu" size={24} />
|
|
608
|
+
</SidebarItem>
|
|
609
|
+
<Separator orientation="horizontal" decorative />
|
|
610
|
+
<SidebarItem aria-label="Favourites" selected={false}>
|
|
611
|
+
<Icon name="favourite-outline" size={24} />
|
|
612
|
+
</SidebarItem>
|
|
613
|
+
</Sidebar>
|
|
614
|
+
|
|
615
|
+
{/* SideNavigation is a separate companion component — not a sub-component of Sidebar. */}
|
|
616
|
+
{/* It is styled as a panel by default, so no extra wrapper class is needed. */}
|
|
617
|
+
{open && (
|
|
618
|
+
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
|
619
|
+
<SideNavigation.Title>Attendance</SideNavigation.Title>
|
|
620
|
+
<SideNavigation id="side-panel" items={navItems} />
|
|
621
|
+
</div>
|
|
622
|
+
)}
|
|
623
|
+
</div>
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
export default WithPanelExample;
|
|
627
|
+
`.trim(),
|
|
628
|
+
},
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
},
|
|
632
|
+
'The burger `Sidebar.Item` toggles a `SideNavigation` panel that sits beside the rail as a flex sibling. `aria-expanded` and `aria-controls` wire the trigger to the panel for assistive technology. Click the menu icon to toggle.',
|
|
633
|
+
);
|
|
634
|
+
|
|
635
|
+
export const WithLinks: Story = withDescription(
|
|
636
|
+
{
|
|
637
|
+
render: WithLinksTemplate,
|
|
638
|
+
parameters: {
|
|
639
|
+
controls: { disable: true },
|
|
640
|
+
docs: {
|
|
641
|
+
source: {
|
|
642
|
+
language: 'tsx',
|
|
643
|
+
code: `
|
|
644
|
+
import { Sidebar, SidebarItem, Separator, Icon } from '@arbor-education/design-system.components';
|
|
645
|
+
|
|
646
|
+
function WithLinksExample() {
|
|
647
|
+
return (
|
|
648
|
+
<Sidebar ariaLabel="App navigation">
|
|
649
|
+
{/* With href → renders <a>. Without href → renders <button>. Visual output is identical. */}
|
|
650
|
+
<SidebarItem href="/favourites" aria-label="Favourites">
|
|
651
|
+
<Icon name="favourite-outline" size={24} />
|
|
652
|
+
</SidebarItem>
|
|
653
|
+
<SidebarItem href="/calendar" aria-label="My Calendar" selected>
|
|
654
|
+
<Icon name="date" size={24} />
|
|
655
|
+
</SidebarItem>
|
|
656
|
+
<Separator orientation="horizontal" decorative />
|
|
657
|
+
<SidebarItem href="/help" aria-label="Help & Learn with Arbor">
|
|
658
|
+
<Icon name="circle-help" size={24} />
|
|
659
|
+
</SidebarItem>
|
|
660
|
+
</Sidebar>
|
|
661
|
+
);
|
|
662
|
+
}
|
|
663
|
+
export default WithLinksExample;
|
|
664
|
+
`.trim(),
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
'Pass `href` to render an `<a>` element instead of a `<button>`. Use links for real URL navigation; use buttons (no `href`) for SPA actions and panel toggles. The visual output is identical for both.',
|
|
670
|
+
);
|