@arbor-education/design-system.components 0.25.8 → 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.
- package/.gather/instructions/project-overview.md +1 -1
- package/.github/CODEOWNERS +1 -0
- package/.snyk +3 -0
- package/CHANGELOG.md +20 -0
- package/CODEOWNERS +2 -1
- package/CONTRIBUTING.md +7 -5
- package/component-library.md +97 -3
- package/dist/components/datePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/datePicker/DatePicker.js +8 -6
- package/dist/components/datePicker/DatePicker.js.map +1 -1
- package/dist/components/datePicker/DatePickerCalendar.d.ts +10 -0
- package/dist/components/datePicker/DatePickerCalendar.d.ts.map +1 -0
- package/dist/components/datePicker/DatePickerCalendar.js +9 -0
- package/dist/components/datePicker/DatePickerCalendar.js.map +1 -0
- package/dist/components/dateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.js +11 -8
- package/dist/components/dateTimePicker/DateTimePicker.js.map +1 -1
- 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/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/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 +850 -205
- 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 +1 -1
- package/src/components/datePicker/DatePicker.tsx +30 -35
- package/src/components/datePicker/DatePickerCalendar.tsx +46 -0
- package/src/components/dateTimePicker/DateTimePicker.tsx +66 -38
- package/src/components/dateTimePicker/dateTimePicker.scss +0 -2
- 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/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/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,600 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Controls,
|
|
3
|
+
Heading as DocHeading,
|
|
4
|
+
Primary as DocPrimary,
|
|
5
|
+
Markdown,
|
|
6
|
+
Stories,
|
|
7
|
+
Subheading,
|
|
8
|
+
Subtitle,
|
|
9
|
+
Title,
|
|
10
|
+
} from '@storybook/addon-docs/blocks';
|
|
11
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
12
|
+
import { EmptyState } from 'Components/emptyState/EmptyState';
|
|
13
|
+
import { Icon } from 'Components/icon/Icon';
|
|
14
|
+
import type { ComponentProps } from 'react';
|
|
15
|
+
import { Widget } from './Widget.js';
|
|
16
|
+
|
|
17
|
+
const DESCRIPTION_INTRO = [
|
|
18
|
+
'`Widget` is a compound dashboard card built on [`Card`](?path=/docs/components-card--docs).',
|
|
19
|
+
'Compose it with `Widget.Header` and `Widget.Body` to show a titled region with optional link navigation,',
|
|
20
|
+
'collapsible body, header tooltip, and built-in loading or empty states.',
|
|
21
|
+
'',
|
|
22
|
+
'> **Built on [`TooltipWrapper`](?path=/docs/components-tooltip-tooltipwrapper--docs) for header tooltips.**',
|
|
23
|
+
'Tooltips render via a portal — do not place the widget inside a container with `overflow: hidden` if the tooltip is clipped.',
|
|
24
|
+
].join('\n');
|
|
25
|
+
|
|
26
|
+
const USAGE_GUIDANCE = [
|
|
27
|
+
'### When to use',
|
|
28
|
+
'',
|
|
29
|
+
'- Dashboard panels that summarise a dataset (alerts, favourites, attendance) inside a card shell',
|
|
30
|
+
'- Regions that need a linked header to drill into a full page (`href` + chevron)',
|
|
31
|
+
'- Collapsible summary widgets where the body can be hidden to save vertical space',
|
|
32
|
+
'- Async widgets that swap between loading, empty, and populated body content',
|
|
33
|
+
'',
|
|
34
|
+
'---',
|
|
35
|
+
'',
|
|
36
|
+
'### When NOT to use',
|
|
37
|
+
'',
|
|
38
|
+
'| Situation | Use instead |',
|
|
39
|
+
'|---|---|',
|
|
40
|
+
'| A single metric with label and value | [`KPICard`](?path=/docs/components-card-kpicard--docs) |',
|
|
41
|
+
'| A static content block with no header states | [`Card`](?path=/docs/components-card--docs) directly |',
|
|
42
|
+
'| Full-page section with action button in header | [`Section`](?path=/docs/components-section--docs) |',
|
|
43
|
+
'| Header navigates AND toggles collapse | Pick one — `href` and `collapsible` cannot be combined |',
|
|
44
|
+
].join('\n');
|
|
45
|
+
|
|
46
|
+
const DEVELOPER_NOTES = [
|
|
47
|
+
'### Critical usage patterns',
|
|
48
|
+
'',
|
|
49
|
+
'**Compound composition only.** Always render `Widget.Header` and `Widget.Body` inside `Widget`.',
|
|
50
|
+
'Sub-components read shared state from context — they throw if used outside the root.',
|
|
51
|
+
'',
|
|
52
|
+
'**`href` and `collapsible` are mutually exclusive.** TypeScript prevents both; a dev runtime error',
|
|
53
|
+
'is also thrown if both props are passed. A header cannot navigate and toggle body visibility.',
|
|
54
|
+
'',
|
|
55
|
+
'**Linked headers use a stretched link overlay.** When `href` is set, the anchor wraps the title text',
|
|
56
|
+
'and a CSS `::after` pseudo-element covers `slotStart`, the heading, and the end chevron.',
|
|
57
|
+
'The tooltip icon sits in `.ds-widget__header-heading-row` beside the heading, raised above the overlay.',
|
|
58
|
+
'A `chevron-right` is auto-injected at the header end.',
|
|
59
|
+
'',
|
|
60
|
+
'**Empty state is consumer-composed.** Pass `isEmpty` and an `emptyState` node — typically',
|
|
61
|
+
'[`<EmptyState />`](?path=/docs/components-emptystate--docs). The default heading outline is',
|
|
62
|
+
'`Widget.Header` → `h3`, nested `EmptyState` → `h4`. Override `EmptyState` `headingLevel` for other contexts.',
|
|
63
|
+
'',
|
|
64
|
+
'**Loading sets `aria-busy`.** When `isLoading` is true, the body shows a status indicator',
|
|
65
|
+
'and the body container sets `aria-busy="true"`.',
|
|
66
|
+
'',
|
|
67
|
+
'**Dense spacing is fixed.** Widget always renders with `Card` spacing `"dense"`.',
|
|
68
|
+
'',
|
|
69
|
+
'**Body overflow.** When the widget sits in a height-constrained parent (e.g. a dashboard grid cell),',
|
|
70
|
+
'`.ds-widget__body` scrolls vertically while the header stays pinned. Give the parent an explicit height',
|
|
71
|
+
'and place the widget inside a flex column container — the widget fills `height: 100%` automatically.',
|
|
72
|
+
'',
|
|
73
|
+
'---',
|
|
74
|
+
'',
|
|
75
|
+
'### Accessibility',
|
|
76
|
+
'',
|
|
77
|
+
'- Collapsible headers render an `h3` wrapping a toggle `button` (title span + chevron) with `aria-expanded` and `aria-controls` pointing at the body id',
|
|
78
|
+
'- `Widget.Header` renders the title via [`Heading`](?path=/docs/components-heading--docs) at level `3`',
|
|
79
|
+
'- Enter and Space toggle collapsible headers',
|
|
80
|
+
'- Tooltip trigger is a separate `<button>` beside the heading — it is not nested inside the link or collapse control',
|
|
81
|
+
'- Set `live={true}` when body content swaps dynamically after fetch',
|
|
82
|
+
'',
|
|
83
|
+
'---',
|
|
84
|
+
'',
|
|
85
|
+
'### TypeScript types',
|
|
86
|
+
'',
|
|
87
|
+
'```ts',
|
|
88
|
+
"import { Widget } from '@arbor-education/design-system.components';",
|
|
89
|
+
'',
|
|
90
|
+
'function AlertsWidget(props: Widget.Props) {',
|
|
91
|
+
' return (',
|
|
92
|
+
' <Widget {...props}>',
|
|
93
|
+
' <Widget.Header>Alerts</Widget.Header>',
|
|
94
|
+
' <Widget.Body />',
|
|
95
|
+
' </Widget>',
|
|
96
|
+
' );',
|
|
97
|
+
'}',
|
|
98
|
+
'```',
|
|
99
|
+
].join('\n');
|
|
100
|
+
|
|
101
|
+
const RELATED_COMPONENTS = [
|
|
102
|
+
'## Related components',
|
|
103
|
+
'',
|
|
104
|
+
'[Card](?path=/docs/components-card--docs) · [EmptyState](?path=/docs/components-emptystate--docs) · [Heading](?path=/docs/components-heading--docs) · [TooltipWrapper](?path=/docs/components-tooltip-tooltipwrapper--docs)',
|
|
105
|
+
].join('\n');
|
|
106
|
+
|
|
107
|
+
const PROPS_INTRO = [
|
|
108
|
+
'The preview below wires root-level props to the **Controls** panel.',
|
|
109
|
+
'Because `Widget` is compound, `Widget.Header` and `Widget.Body` props are documented in the manual tables below.',
|
|
110
|
+
].join(' ');
|
|
111
|
+
|
|
112
|
+
const HEADER_PROPS = [
|
|
113
|
+
'| Prop | Type | Default | Description |',
|
|
114
|
+
'|---|---|---|---|',
|
|
115
|
+
'| `children` | `ReactNode` | — | **Required.** Header title text |',
|
|
116
|
+
'| `slotStart` | `ReactNode` | — | Leading slot (e.g. avatar); included in linked header hit area |',
|
|
117
|
+
'| `className` | `string` | — | Additional CSS classes on the header wrapper |',
|
|
118
|
+
].join('\n');
|
|
119
|
+
|
|
120
|
+
const BODY_PROPS = [
|
|
121
|
+
'| Prop | Type | Default | Description |',
|
|
122
|
+
'|---|---|---|---|',
|
|
123
|
+
'| `children` | `ReactNode` | — | Main body content when not loading or empty |',
|
|
124
|
+
'| `className` | `string` | — | Additional CSS classes on the body wrapper |',
|
|
125
|
+
].join('\n');
|
|
126
|
+
|
|
127
|
+
function WidgetDocsPage() {
|
|
128
|
+
return (
|
|
129
|
+
<>
|
|
130
|
+
<Title />
|
|
131
|
+
<Subtitle />
|
|
132
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
133
|
+
<DocHeading>Interactive example</DocHeading>
|
|
134
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
135
|
+
<DocPrimary />
|
|
136
|
+
<Controls />
|
|
137
|
+
<Subheading>Widget.Header props</Subheading>
|
|
138
|
+
<Markdown>{HEADER_PROPS}</Markdown>
|
|
139
|
+
<Subheading>Widget.Body props</Subheading>
|
|
140
|
+
<Markdown>{BODY_PROPS}</Markdown>
|
|
141
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
142
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
143
|
+
<DocHeading>Developer notes</DocHeading>
|
|
144
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
145
|
+
<DocHeading>Examples</DocHeading>
|
|
146
|
+
<Stories title="" />
|
|
147
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
148
|
+
</>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const meta = {
|
|
153
|
+
title: 'Components/Widget',
|
|
154
|
+
component: Widget,
|
|
155
|
+
parameters: {
|
|
156
|
+
layout: 'padded',
|
|
157
|
+
docs: {
|
|
158
|
+
page: WidgetDocsPage,
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
tags: ['autodocs'],
|
|
162
|
+
argTypes: {
|
|
163
|
+
tooltip: {
|
|
164
|
+
control: 'text',
|
|
165
|
+
description: 'Renders an info icon with tooltip beside the header title.',
|
|
166
|
+
table: { type: { summary: 'string' } },
|
|
167
|
+
},
|
|
168
|
+
isLoading: {
|
|
169
|
+
control: 'boolean',
|
|
170
|
+
description: 'Replaces body content with a loading indicator and sets `aria-busy` on the body.',
|
|
171
|
+
table: {
|
|
172
|
+
type: { summary: 'boolean' },
|
|
173
|
+
defaultValue: { summary: 'false' },
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
isEmpty: {
|
|
177
|
+
control: 'boolean',
|
|
178
|
+
description: 'Renders `emptyState` instead of body children.',
|
|
179
|
+
table: {
|
|
180
|
+
type: { summary: 'boolean' },
|
|
181
|
+
defaultValue: { summary: 'false' },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
loadingLabel: {
|
|
185
|
+
control: 'text',
|
|
186
|
+
description: 'Accessible name for the loading status indicator.',
|
|
187
|
+
table: {
|
|
188
|
+
type: { summary: 'string' },
|
|
189
|
+
defaultValue: { summary: 'Loading' },
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
live: {
|
|
193
|
+
control: 'boolean',
|
|
194
|
+
description: 'Sets `aria-live="polite"` on the body when content swaps dynamically.',
|
|
195
|
+
table: {
|
|
196
|
+
type: { summary: 'boolean' },
|
|
197
|
+
defaultValue: { summary: 'false' },
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
collapsible: { control: false },
|
|
201
|
+
href: { control: false },
|
|
202
|
+
renderLink: { control: false },
|
|
203
|
+
linkProps: { control: false },
|
|
204
|
+
emptyState: { control: false },
|
|
205
|
+
children: { control: false },
|
|
206
|
+
className: { control: false },
|
|
207
|
+
expanded: { control: false },
|
|
208
|
+
defaultExpanded: { control: false },
|
|
209
|
+
onExpandedChange: { control: false },
|
|
210
|
+
},
|
|
211
|
+
} satisfies Meta<typeof Widget>;
|
|
212
|
+
|
|
213
|
+
export default meta;
|
|
214
|
+
|
|
215
|
+
type Story = StoryObj<typeof Widget>;
|
|
216
|
+
|
|
217
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
218
|
+
...story,
|
|
219
|
+
parameters: {
|
|
220
|
+
...story.parameters,
|
|
221
|
+
docs: {
|
|
222
|
+
...story.parameters?.docs,
|
|
223
|
+
description: { story: description },
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
function FixedHeightWidgetContainer({
|
|
229
|
+
children,
|
|
230
|
+
height = 280,
|
|
231
|
+
}: {
|
|
232
|
+
children: React.ReactNode;
|
|
233
|
+
height?: number;
|
|
234
|
+
}) {
|
|
235
|
+
return (
|
|
236
|
+
<div
|
|
237
|
+
style={{
|
|
238
|
+
height,
|
|
239
|
+
display: 'flex',
|
|
240
|
+
flexDirection: 'column',
|
|
241
|
+
border: '1px dashed var(--color-grey-300)',
|
|
242
|
+
}}
|
|
243
|
+
>
|
|
244
|
+
{children}
|
|
245
|
+
</div>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const StaticWithEmptyStateTemplate = () => (
|
|
250
|
+
<Widget
|
|
251
|
+
isEmpty
|
|
252
|
+
emptyState={(
|
|
253
|
+
<EmptyState
|
|
254
|
+
padding="md"
|
|
255
|
+
illustration={<Icon name="circle-help" size={24} color="var(--color-grey-400)" />}
|
|
256
|
+
heading="All clear!"
|
|
257
|
+
subHeading={(
|
|
258
|
+
<>
|
|
259
|
+
There are no alerts for you right now. Find out how alerts work
|
|
260
|
+
{' '}
|
|
261
|
+
<a className="ds-link" href="/help/alerts">here</a>
|
|
262
|
+
.
|
|
263
|
+
</>
|
|
264
|
+
)}
|
|
265
|
+
/>
|
|
266
|
+
)}
|
|
267
|
+
>
|
|
268
|
+
<Widget.Header>Alerts (0)</Widget.Header>
|
|
269
|
+
<Widget.Body />
|
|
270
|
+
</Widget>
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
const LinkedWithContentTemplate = () => (
|
|
274
|
+
<Widget href="/alerts">
|
|
275
|
+
<Widget.Header>Alerts (2)</Widget.Header>
|
|
276
|
+
<Widget.Body>
|
|
277
|
+
<ul style={{ margin: 0, padding: 0, listStyle: 'none' }}>
|
|
278
|
+
<li>New message from school head</li>
|
|
279
|
+
<li>Parents evening begins in 5 days</li>
|
|
280
|
+
</ul>
|
|
281
|
+
</Widget.Body>
|
|
282
|
+
</Widget>
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const WithTooltipTemplate = () => (
|
|
286
|
+
<Widget tooltip="Your starred items appear here">
|
|
287
|
+
<Widget.Header>Favourites</Widget.Header>
|
|
288
|
+
<Widget.Body>
|
|
289
|
+
<ul style={{ margin: 0, padding: 0, listStyle: 'none' }}>
|
|
290
|
+
{Array.from({ length: 6 }, (_, index) => (
|
|
291
|
+
<li key={index}>Favourite</li>
|
|
292
|
+
))}
|
|
293
|
+
</ul>
|
|
294
|
+
</Widget.Body>
|
|
295
|
+
</Widget>
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
const CollapsibleTemplate = () => (
|
|
299
|
+
<Widget collapsible defaultExpanded>
|
|
300
|
+
<Widget.Header>Attendance summary</Widget.Header>
|
|
301
|
+
<Widget.Body>
|
|
302
|
+
<p style={{ margin: 0 }}>Widget body content</p>
|
|
303
|
+
</Widget.Body>
|
|
304
|
+
</Widget>
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
const LoadingTemplate = () => (
|
|
308
|
+
<Widget isLoading loadingLabel="Loading alerts">
|
|
309
|
+
<Widget.Header>Alerts</Widget.Header>
|
|
310
|
+
<Widget.Body><p>Content hidden while loading</p></Widget.Body>
|
|
311
|
+
</Widget>
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
const WithRenderLinkTemplate = () => (
|
|
315
|
+
<Widget
|
|
316
|
+
href="/alerts"
|
|
317
|
+
renderLink={({ href, className, children, linkProps }) => (
|
|
318
|
+
<a href={href} className={className} data-router-link="true" {...linkProps}>
|
|
319
|
+
{children}
|
|
320
|
+
</a>
|
|
321
|
+
)}
|
|
322
|
+
>
|
|
323
|
+
<Widget.Header>Alerts (2)</Widget.Header>
|
|
324
|
+
<Widget.Body>
|
|
325
|
+
<p style={{ margin: 0 }}>Linked via custom renderLink</p>
|
|
326
|
+
</Widget.Body>
|
|
327
|
+
</Widget>
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
const FixedHeightOverflowTemplate = () => (
|
|
331
|
+
<FixedHeightWidgetContainer>
|
|
332
|
+
<Widget isFloating>
|
|
333
|
+
<Widget.Header>Favourites</Widget.Header>
|
|
334
|
+
<Widget.Body>
|
|
335
|
+
<ul style={{ margin: 0, padding: 0, listStyle: 'none' }}>
|
|
336
|
+
{Array.from({ length: 20 }, (_, index) => (
|
|
337
|
+
<li key={index} style={{ padding: 'var(--spacing-xsmall) 0' }}>
|
|
338
|
+
{`Favourite item ${index + 1}`}
|
|
339
|
+
</li>
|
|
340
|
+
))}
|
|
341
|
+
</ul>
|
|
342
|
+
</Widget.Body>
|
|
343
|
+
</Widget>
|
|
344
|
+
</FixedHeightWidgetContainer>
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
export const Default = {
|
|
348
|
+
args: {
|
|
349
|
+
tooltip: '',
|
|
350
|
+
isLoading: false,
|
|
351
|
+
isEmpty: false,
|
|
352
|
+
loadingLabel: 'Loading',
|
|
353
|
+
live: false,
|
|
354
|
+
},
|
|
355
|
+
render: (args: ComponentProps<typeof Widget>) => (
|
|
356
|
+
<Widget {...args}>
|
|
357
|
+
<Widget.Header>Attendance summary</Widget.Header>
|
|
358
|
+
<Widget.Body>
|
|
359
|
+
<p style={{ margin: 0 }}>Widget body content</p>
|
|
360
|
+
</Widget.Body>
|
|
361
|
+
</Widget>
|
|
362
|
+
),
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
export const StaticWithEmptyState: Story = withDescription(
|
|
366
|
+
{
|
|
367
|
+
render: StaticWithEmptyStateTemplate,
|
|
368
|
+
parameters: {
|
|
369
|
+
controls: { disable: true },
|
|
370
|
+
docs: {
|
|
371
|
+
source: {
|
|
372
|
+
language: 'tsx',
|
|
373
|
+
code: `
|
|
374
|
+
import { EmptyState, Icon, Widget } from '@arbor-education/design-system.components';
|
|
375
|
+
|
|
376
|
+
function WidgetStaticEmptyExample() {
|
|
377
|
+
return (
|
|
378
|
+
<Widget
|
|
379
|
+
isEmpty
|
|
380
|
+
emptyState={
|
|
381
|
+
<EmptyState
|
|
382
|
+
padding="md"
|
|
383
|
+
illustration={<Icon name="circle-help" size={24} color="var(--color-grey-400)" />}
|
|
384
|
+
heading="All clear!"
|
|
385
|
+
subHeading={
|
|
386
|
+
<>
|
|
387
|
+
There are no alerts for you right now. Find out how alerts work{' '}
|
|
388
|
+
<a className="ds-link" href="/help/alerts">here</a>
|
|
389
|
+
.
|
|
390
|
+
</>
|
|
391
|
+
}
|
|
392
|
+
/>
|
|
393
|
+
}
|
|
394
|
+
>
|
|
395
|
+
<Widget.Header>Alerts (0)</Widget.Header>
|
|
396
|
+
<Widget.Body />
|
|
397
|
+
</Widget>
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
export default WidgetStaticEmptyExample;
|
|
401
|
+
`.trim(),
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
'Static header with no link or chevron. Body shows `emptyState` when `isEmpty` is true.',
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
export const LinkedWithContent: Story = withDescription(
|
|
410
|
+
{
|
|
411
|
+
render: LinkedWithContentTemplate,
|
|
412
|
+
parameters: {
|
|
413
|
+
controls: { disable: true },
|
|
414
|
+
docs: {
|
|
415
|
+
source: {
|
|
416
|
+
language: 'tsx',
|
|
417
|
+
code: `
|
|
418
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
419
|
+
|
|
420
|
+
function WidgetLinkedExample() {
|
|
421
|
+
return (
|
|
422
|
+
<Widget href="/alerts">
|
|
423
|
+
<Widget.Header>Alerts (2)</Widget.Header>
|
|
424
|
+
<Widget.Body>
|
|
425
|
+
<ul>
|
|
426
|
+
<li>New message from school head</li>
|
|
427
|
+
</ul>
|
|
428
|
+
</Widget.Body>
|
|
429
|
+
</Widget>
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
export default WidgetLinkedExample;
|
|
433
|
+
`.trim(),
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
'Linked header: anchor wraps the title; a CSS overlay covers slotStart, heading, and end chevron. Tooltip stays above the overlay.',
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
export const WithTooltip: Story = withDescription(
|
|
442
|
+
{
|
|
443
|
+
render: WithTooltipTemplate,
|
|
444
|
+
parameters: {
|
|
445
|
+
controls: { disable: true },
|
|
446
|
+
docs: {
|
|
447
|
+
source: {
|
|
448
|
+
language: 'tsx',
|
|
449
|
+
code: `
|
|
450
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
451
|
+
|
|
452
|
+
function WidgetWithTooltipExample() {
|
|
453
|
+
return (
|
|
454
|
+
<Widget tooltip="Your starred items appear here">
|
|
455
|
+
<Widget.Header>Favourites</Widget.Header>
|
|
456
|
+
<Widget.Body>
|
|
457
|
+
<ul>
|
|
458
|
+
<li>Favourite</li>
|
|
459
|
+
</ul>
|
|
460
|
+
</Widget.Body>
|
|
461
|
+
</Widget>
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
export default WidgetWithTooltipExample;
|
|
465
|
+
`.trim(),
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
'Info icon tooltip sits in the heading row immediately beside the title text.',
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
export const Collapsible: Story = withDescription(
|
|
474
|
+
{
|
|
475
|
+
render: CollapsibleTemplate,
|
|
476
|
+
parameters: {
|
|
477
|
+
controls: { disable: true },
|
|
478
|
+
docs: {
|
|
479
|
+
source: {
|
|
480
|
+
language: 'tsx',
|
|
481
|
+
code: `
|
|
482
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
483
|
+
|
|
484
|
+
function WidgetCollapsibleExample() {
|
|
485
|
+
return (
|
|
486
|
+
<Widget collapsible defaultExpanded>
|
|
487
|
+
<Widget.Header>Attendance summary</Widget.Header>
|
|
488
|
+
<Widget.Body>
|
|
489
|
+
<p>Widget body content</p>
|
|
490
|
+
</Widget.Body>
|
|
491
|
+
</Widget>
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
export default WidgetCollapsibleExample;
|
|
495
|
+
`.trim(),
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
|
+
},
|
|
499
|
+
},
|
|
500
|
+
'Collapsible header toggles body visibility. Chevron rotates when expanded.',
|
|
501
|
+
);
|
|
502
|
+
|
|
503
|
+
export const Loading: Story = withDescription(
|
|
504
|
+
{
|
|
505
|
+
render: LoadingTemplate,
|
|
506
|
+
parameters: {
|
|
507
|
+
controls: { disable: true },
|
|
508
|
+
docs: {
|
|
509
|
+
source: {
|
|
510
|
+
language: 'tsx',
|
|
511
|
+
code: `
|
|
512
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
513
|
+
|
|
514
|
+
function WidgetLoadingExample() {
|
|
515
|
+
return (
|
|
516
|
+
<Widget isLoading loadingLabel="Loading alerts">
|
|
517
|
+
<Widget.Header>Alerts</Widget.Header>
|
|
518
|
+
<Widget.Body />
|
|
519
|
+
</Widget>
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
export default WidgetLoadingExample;
|
|
523
|
+
`.trim(),
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
'Loading replaces body content and sets `aria-busy="true"` on the body container.',
|
|
529
|
+
);
|
|
530
|
+
|
|
531
|
+
export const WithRenderLink: Story = withDescription(
|
|
532
|
+
{
|
|
533
|
+
render: WithRenderLinkTemplate,
|
|
534
|
+
parameters: {
|
|
535
|
+
controls: { disable: true },
|
|
536
|
+
docs: {
|
|
537
|
+
source: {
|
|
538
|
+
language: 'tsx',
|
|
539
|
+
code: `
|
|
540
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
541
|
+
|
|
542
|
+
function WidgetRenderLinkExample() {
|
|
543
|
+
return (
|
|
544
|
+
<Widget
|
|
545
|
+
href="/alerts"
|
|
546
|
+
renderLink={({ href, className, children, linkProps }) => (
|
|
547
|
+
<a href={href} className={className} {...linkProps}>
|
|
548
|
+
{children}
|
|
549
|
+
</a>
|
|
550
|
+
)}
|
|
551
|
+
>
|
|
552
|
+
<Widget.Header>Alerts (2)</Widget.Header>
|
|
553
|
+
<Widget.Body />
|
|
554
|
+
</Widget>
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
export default WidgetRenderLinkExample;
|
|
558
|
+
`.trim(),
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
'Inject a custom router link via `renderLink` — same pattern as SidebarNav.',
|
|
564
|
+
);
|
|
565
|
+
|
|
566
|
+
export const FixedHeightOverflow: Story = withDescription(
|
|
567
|
+
{
|
|
568
|
+
render: FixedHeightOverflowTemplate,
|
|
569
|
+
parameters: {
|
|
570
|
+
controls: { disable: true },
|
|
571
|
+
docs: {
|
|
572
|
+
source: {
|
|
573
|
+
language: 'tsx',
|
|
574
|
+
code: `
|
|
575
|
+
import { Widget } from '@arbor-education/design-system.components';
|
|
576
|
+
|
|
577
|
+
function WidgetFixedHeightOverflowExample() {
|
|
578
|
+
return (
|
|
579
|
+
<div style={{ height: 280, display: 'flex', flexDirection: 'column' }}>
|
|
580
|
+
<Widget isFloating>
|
|
581
|
+
<Widget.Header>Favourites</Widget.Header>
|
|
582
|
+
<Widget.Body>
|
|
583
|
+
<ul>
|
|
584
|
+
{Array.from({ length: 20 }, (_, index) => (
|
|
585
|
+
<li key={index}>Favourite item {index + 1}</li>
|
|
586
|
+
))}
|
|
587
|
+
</ul>
|
|
588
|
+
</Widget.Body>
|
|
589
|
+
</Widget>
|
|
590
|
+
</div>
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
export default WidgetFixedHeightOverflowExample;
|
|
594
|
+
`.trim(),
|
|
595
|
+
},
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
'Parent container constrains height; the widget header stays pinned while `.ds-widget__body` scrolls overflow content.',
|
|
600
|
+
);
|