@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
|
@@ -2,20 +2,26 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import classNames from 'classnames';
|
|
3
3
|
import { CheckboxInput } from '../formField/inputs/checkbox/CheckboxInput.js';
|
|
4
4
|
import { useEffect, useState } from 'react';
|
|
5
|
-
export const Pill = (
|
|
6
|
-
const
|
|
5
|
+
export const Pill = (props) => {
|
|
6
|
+
const { text, checkbox, onChange, initialValue = false, checked: controlledChecked, } = props;
|
|
7
|
+
const [checked, setChecked] = useState(controlledChecked ?? initialValue);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (typeof controlledChecked !== 'undefined') {
|
|
10
|
+
setChecked(!!controlledChecked);
|
|
11
|
+
}
|
|
12
|
+
}, [controlledChecked]);
|
|
13
|
+
const toggle = () => {
|
|
14
|
+
const next = !checked;
|
|
15
|
+
setChecked(next);
|
|
16
|
+
onChange?.(next);
|
|
17
|
+
};
|
|
7
18
|
const handlePillClick = () => {
|
|
8
|
-
|
|
19
|
+
toggle();
|
|
9
20
|
};
|
|
10
21
|
const handleCheckboxClick = (event) => {
|
|
11
22
|
event.stopPropagation();
|
|
12
|
-
|
|
23
|
+
toggle();
|
|
13
24
|
};
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
if (onclick) {
|
|
16
|
-
onclick(checked);
|
|
17
|
-
}
|
|
18
|
-
}, [checked, onclick]);
|
|
19
25
|
return (_jsxs("span", { onClick: handlePillClick, className: classNames('ds-pill', checkbox ? { 'ds-pill__checked': checked, 'ds-pill__unchecked': !checked } : { 'ds-pill__active': checked, 'ds-pill__inactive': !checked }), children: [checkbox && (_jsx("span", { className: classNames('ds-pill__checkbox'), onClick: e => e.stopPropagation(), children: _jsx(CheckboxInput, { checked: checked, onChange: () => { }, onClick: handleCheckboxClick }) })), text] }));
|
|
20
26
|
};
|
|
21
27
|
//# sourceMappingURL=Pill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pill.js","sourceRoot":"","sources":["../../../src/components/pill/Pill.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Pill.js","sourceRoot":"","sources":["../../../src/components/pill/Pill.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAU5C,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAgB,EAAE,EAAE;IACvC,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,GAAG,KAAK,EACpB,OAAO,EAAE,iBAAiB,GAC3B,GAAG,KAAK,CAAC;IAEV,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,iBAAiB,IAAI,YAAY,CAAC,CAAC;IAE1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,iBAAiB,KAAK,WAAW,EAAE,CAAC;YAC7C,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC;QACtB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAAuB,EAAE,EAAE;QACtD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,OAAO,CACL,gBACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,UAAU,CACnB,SAAS,EACT,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,OAAO,EAAE,CAC3I,aAEA,QAAQ,IAAI,CACX,eAAM,SAAS,EAAE,UAAU,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,YACjF,KAAC,aAAa,IACZ,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAClB,OAAO,EAAE,mBAAmB,GAC5B,GACG,CACR,EACA,IAAI,IACA,CACR,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -3,11 +3,12 @@ import { Pill } from './Pill.js';
|
|
|
3
3
|
declare function PillDocsPage(): import("react/jsx-runtime").JSX.Element;
|
|
4
4
|
declare const meta: {
|
|
5
5
|
title: string;
|
|
6
|
-
component: (
|
|
6
|
+
component: (props: {
|
|
7
7
|
text: string;
|
|
8
8
|
initialValue?: boolean;
|
|
9
9
|
checkbox?: boolean;
|
|
10
|
-
|
|
10
|
+
onChange?: (checked: boolean) => void;
|
|
11
|
+
checked?: boolean;
|
|
11
12
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
tags: string[];
|
|
13
14
|
parameters: {
|
|
@@ -49,7 +50,19 @@ declare const meta: {
|
|
|
49
50
|
};
|
|
50
51
|
};
|
|
51
52
|
};
|
|
52
|
-
|
|
53
|
+
checked: {
|
|
54
|
+
control: "boolean";
|
|
55
|
+
description: string;
|
|
56
|
+
table: {
|
|
57
|
+
type: {
|
|
58
|
+
summary: string;
|
|
59
|
+
};
|
|
60
|
+
defaultValue: {
|
|
61
|
+
summary: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
onChange: {
|
|
53
66
|
control: false;
|
|
54
67
|
description: string;
|
|
55
68
|
table: {
|
|
@@ -66,6 +79,8 @@ declare const meta: {
|
|
|
66
79
|
export default meta;
|
|
67
80
|
type Story = StoryObj<typeof Pill>;
|
|
68
81
|
export declare const Default: Story;
|
|
82
|
+
export declare const Uncontrolled: Story;
|
|
83
|
+
export declare const Controlled: Story;
|
|
69
84
|
export declare const ToggleActive: Story;
|
|
70
85
|
export declare const CheckboxMode: Story;
|
|
71
86
|
export declare const CheckboxModeSelected: Story;
|
|
@@ -75,4 +90,7 @@ export declare const MultiSelectFilterGroup: Story;
|
|
|
75
90
|
export declare const WithAllOption: Story;
|
|
76
91
|
export declare const ContentGuidelines: Story;
|
|
77
92
|
export declare const AccessibilityNote: Story;
|
|
93
|
+
export declare const OnChangeBehaviour: Story;
|
|
94
|
+
export declare const ControlledCheckboxMode: Story;
|
|
95
|
+
export declare const PillGroupWrapping: Story;
|
|
78
96
|
//# sourceMappingURL=Pill.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pill.stories.d.ts","sourceRoot":"","sources":["../../../src/components/pill/Pill.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Pill.stories.d.ts","sourceRoot":"","sources":["../../../src/components/pill/Pill.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA6HjC,iBAAS,YAAY,4CAmBpB;AAMD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EmB,CAAC;AAE9B,eAAe,IAAI,CAAC;AAIpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA8fnC,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KA4B1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA8BxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAuB1B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAuB1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAwBlC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAiCzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAmCzB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KA4CpC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAwD3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAqC/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KA2B/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAkC/B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KA8CpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAkC/B,CAAC"}
|
|
@@ -39,10 +39,10 @@ const USAGE_GUIDANCE = [
|
|
|
39
39
|
'',
|
|
40
40
|
'```tsx',
|
|
41
41
|
'// BAD — Pill is a filter control, not an action trigger',
|
|
42
|
-
'<Pill text="Save student"
|
|
42
|
+
'<Pill text="Save student" onChange={handleSave} />',
|
|
43
43
|
'',
|
|
44
44
|
'// GOOD — Pill used as an auto-apply filter',
|
|
45
|
-
'<Pill text="Year 7"
|
|
45
|
+
'<Pill text="Year 7" onChange={checked => onFilterChange("year7", checked)} />',
|
|
46
46
|
'```',
|
|
47
47
|
'',
|
|
48
48
|
'---',
|
|
@@ -59,40 +59,37 @@ const USAGE_GUIDANCE = [
|
|
|
59
59
|
' dedicated "Apply filters" submit button.',
|
|
60
60
|
].join('\n');
|
|
61
61
|
const DEVELOPER_NOTES = [
|
|
62
|
-
'###
|
|
62
|
+
'### Controlled vs uncontrolled',
|
|
63
63
|
'',
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'`false`) the moment the component mounts — before the user has clicked anything.',
|
|
68
|
-
'',
|
|
69
|
-
'To suppress the mount-time call, guard with a ref:',
|
|
64
|
+
'**Uncontrolled** (default) — pass `initialValue` to set the starting state and let the pill',
|
|
65
|
+
'own its checked state from there. Use `onChange` to be notified of changes without taking',
|
|
66
|
+
'ownership of the state.',
|
|
70
67
|
'',
|
|
71
68
|
'```tsx',
|
|
72
|
-
'
|
|
73
|
-
'',
|
|
74
|
-
'<Pill',
|
|
75
|
-
' text="Autumn term"',
|
|
76
|
-
' onclick={(checked) => {',
|
|
77
|
-
' if (!hasMounted.current) { hasMounted.current = true; return; }',
|
|
78
|
-
' handleFilter(checked);',
|
|
79
|
-
' }}',
|
|
80
|
-
'/>',
|
|
69
|
+
'<Pill text="Autumn term" initialValue={false} onChange={checked => console.log(checked)} />',
|
|
81
70
|
'```',
|
|
82
71
|
'',
|
|
83
|
-
'**
|
|
84
|
-
'
|
|
85
|
-
'force React to remount it. Note that remounting also triggers the mount-time `onclick` firing.',
|
|
72
|
+
'**Controlled** — pass `checked` to make the parent own the state. Every time `checked` changes,',
|
|
73
|
+
'the pill syncs to match. Wire `onChange` back to your state setter so clicks are reflected.',
|
|
86
74
|
'',
|
|
87
75
|
'```tsx',
|
|
88
|
-
'const [
|
|
76
|
+
'const [active, setActive] = useState(false);',
|
|
89
77
|
'',
|
|
90
|
-
'<Pill
|
|
91
|
-
'<
|
|
78
|
+
'<Pill text="Autumn term" checked={active} onChange={setActive} />',
|
|
79
|
+
'<button onClick={() => setActive(false)}>Clear</button>',
|
|
92
80
|
'```',
|
|
93
81
|
'',
|
|
94
82
|
'---',
|
|
95
83
|
'',
|
|
84
|
+
'### When `onChange` fires',
|
|
85
|
+
'',
|
|
86
|
+
'`onChange` fires only in response to user interaction — a click on the pill (or its embedded',
|
|
87
|
+
'checkbox). It receives the new checked value. It does **not** fire on mount, and it does **not**',
|
|
88
|
+
'fire when the controlled `checked` prop is updated by the parent, so driving the pill externally',
|
|
89
|
+
'(e.g. a "Clear all filters" button) never re-triggers your handler.',
|
|
90
|
+
'',
|
|
91
|
+
'---',
|
|
92
|
+
'',
|
|
96
93
|
'### Accessibility',
|
|
97
94
|
'',
|
|
98
95
|
'**Known limitation:** `Pill` renders as a `<span>` with an `onClick` handler. It is not natively',
|
|
@@ -113,7 +110,7 @@ const DEVELOPER_NOTES = [
|
|
|
113
110
|
" if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handleToggle(); }",
|
|
114
111
|
' }}',
|
|
115
112
|
'>',
|
|
116
|
-
' <Pill text="Year 7"
|
|
113
|
+
' <Pill text="Year 7" onChange={handleToggle} />',
|
|
117
114
|
'</span>',
|
|
118
115
|
'```',
|
|
119
116
|
].join('\n');
|
|
@@ -169,21 +166,35 @@ const meta = {
|
|
|
169
166
|
'Sets the initial checked/active state on first mount. Defaults to `false` (inactive).',
|
|
170
167
|
'Use `initialValue={true}` to pre-select a pill — for example, pre-activating an "All"',
|
|
171
168
|
'pill when a filter row first loads.',
|
|
172
|
-
'
|
|
169
|
+
'Only applies in uncontrolled mode; when `checked` is provided, the parent owns the state.',
|
|
173
170
|
].join(' '),
|
|
174
171
|
table: {
|
|
175
172
|
type: { summary: 'boolean' },
|
|
176
173
|
defaultValue: { summary: 'false' },
|
|
177
174
|
},
|
|
178
175
|
},
|
|
179
|
-
|
|
176
|
+
checked: {
|
|
177
|
+
control: 'boolean',
|
|
178
|
+
description: [
|
|
179
|
+
'Makes the pill **controlled** — the parent owns the checked state.',
|
|
180
|
+
'When provided, the pill syncs to this value whenever it changes.',
|
|
181
|
+
'Pair with `onChange` so that user clicks are reflected back into your state.',
|
|
182
|
+
'Omit to use **uncontrolled** mode where `initialValue` sets the starting state',
|
|
183
|
+
'and the pill manages itself from there.',
|
|
184
|
+
].join(' '),
|
|
185
|
+
table: {
|
|
186
|
+
type: { summary: 'boolean' },
|
|
187
|
+
defaultValue: { summary: 'undefined' },
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
onChange: {
|
|
180
191
|
control: false,
|
|
181
192
|
description: [
|
|
182
|
-
'Callback fired each time the pill
|
|
193
|
+
'Callback fired each time the user toggles the pill (a click on the pill or its checkbox).',
|
|
183
194
|
'Receives `true` when the pill becomes active/checked, `false` when it becomes inactive.',
|
|
184
|
-
'Example: `
|
|
185
|
-
'
|
|
186
|
-
'
|
|
195
|
+
'Example: `onChange={checked => onFilterChange("year7", checked)}`.',
|
|
196
|
+
'Fires only on user interaction — never on mount, and never when a controlled `checked`',
|
|
197
|
+
'prop is updated by the parent.',
|
|
187
198
|
].join(' '),
|
|
188
199
|
table: {
|
|
189
200
|
type: { summary: '(checked: boolean) => void' },
|
|
@@ -214,7 +225,7 @@ const withDescription = (story, description) => ({
|
|
|
214
225
|
const FilterGroupTemplate = () => {
|
|
215
226
|
const [active, setActive] = useState(null);
|
|
216
227
|
const yearGroups = ['Year 7', 'Year 8', 'Year 9', 'Year 10', 'Year 11'];
|
|
217
|
-
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by year group" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: yearGroups.map(year => (_jsx(Pill, { text: year, initialValue: active === year,
|
|
228
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by year group" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: yearGroups.map(year => (_jsx(Pill, { text: year, initialValue: active === year, onChange: checked => setActive(checked ? year : null) }, year))) })] }));
|
|
218
229
|
};
|
|
219
230
|
const MultiSelectFilterGroupTemplate = () => {
|
|
220
231
|
const [selected, setSelected] = useState(new Set());
|
|
@@ -231,7 +242,7 @@ const MultiSelectFilterGroupTemplate = () => {
|
|
|
231
242
|
return next;
|
|
232
243
|
});
|
|
233
244
|
};
|
|
234
|
-
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by status" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: statuses.map(status => (_jsx(Pill, { text: status, checkbox: true,
|
|
245
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by status" }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: statuses.map(status => (_jsx(Pill, { text: status, checkbox: true, onChange: checked => toggle(status, checked) }, status))) }), selected.size > 0 && (_jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: ["Selected:", ' ', Array.from(selected).join(', ')] }))] }));
|
|
235
246
|
};
|
|
236
247
|
const WithAllOptionTemplate = () => {
|
|
237
248
|
const [activeFilters, setActiveFilters] = useState(new Set());
|
|
@@ -257,7 +268,29 @@ const WithAllOptionTemplate = () => {
|
|
|
257
268
|
}
|
|
258
269
|
setActiveFilters(next);
|
|
259
270
|
};
|
|
260
|
-
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by subject" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "All", initialValue: allActive,
|
|
271
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Filter by subject" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "All", initialValue: allActive, onChange: handleAllClick }), subjects.map(subject => (_jsx(Pill, { text: subject, initialValue: activeFilters.has(subject), onChange: checked => handleSubjectClick(subject, checked) }, subject)))] })] }));
|
|
272
|
+
};
|
|
273
|
+
const UncontrolledTemplate = () => {
|
|
274
|
+
const [lastValue, setLastValue] = useState(null);
|
|
275
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: ["Pill owns its own state \u2014 parent only observes via", ' ', _jsx("code", { children: "onChange" }), "."] }), _jsx(Pill, { text: "Autumn term", initialValue: false, onChange: v => setLastValue(v) }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: ["Last", ' ', _jsx("code", { children: "onChange" }), ': ', _jsx("code", { children: lastValue === null ? '(not fired yet)' : String(lastValue) })] })] }));
|
|
276
|
+
};
|
|
277
|
+
const ControlledTemplate = () => {
|
|
278
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
279
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Parent owns the state \u2014 click the pill or the external button to observe they stay in sync." }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)', alignItems: 'center' }, children: [_jsx(Pill, { text: "Autumn term", checked: isChecked, onChange: setIsChecked }), _jsx("button", { type: "button", style: {
|
|
280
|
+
padding: 'var(--spacing-xsmall) var(--spacing-medium)',
|
|
281
|
+
border: 'var(--border-weight) solid var(--color-grey-300)',
|
|
282
|
+
borderRadius: 'var(--border-radius-small)',
|
|
283
|
+
background: 'var(--color-white)',
|
|
284
|
+
cursor: 'pointer',
|
|
285
|
+
fontSize: 'var(--font-size-1-13)',
|
|
286
|
+
}, onClick: () => setIsChecked(v => !v), children: "Toggle from outside" }), _jsx("button", { type: "button", style: {
|
|
287
|
+
padding: 'var(--spacing-xsmall) var(--spacing-medium)',
|
|
288
|
+
border: 'var(--border-weight) solid var(--color-grey-300)',
|
|
289
|
+
borderRadius: 'var(--border-radius-small)',
|
|
290
|
+
background: 'var(--color-white)',
|
|
291
|
+
cursor: 'pointer',
|
|
292
|
+
fontSize: 'var(--font-size-1-13)',
|
|
293
|
+
}, onClick: () => setIsChecked(false), children: "Reset" })] }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: ["External state:", ' ', _jsx("code", { children: String(isChecked) })] })] }));
|
|
261
294
|
};
|
|
262
295
|
const AllVariantsTemplate = () => (_jsxs("div", { style: {
|
|
263
296
|
padding: 'var(--spacing-xlarge)',
|
|
@@ -286,6 +319,46 @@ const AccessibilityNoteTemplate = () => (_jsxs("div", { style: {
|
|
|
286
319
|
flexDirection: 'column',
|
|
287
320
|
gap: 'var(--spacing-small)',
|
|
288
321
|
}, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)', fontWeight: 'var(--font-weight-semi-bold)' }, children: "Known limitation: keyboard accessibility" }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["Toggle-mode", ' ', _jsx("code", { children: "Pill" }), ' ', "renders as a", ' ', _jsx("code", { children: "<span onClick>" }), ' ', "\u2014 it is not reachable via Tab and cannot be activated with Space or Enter. Keyboard-only users and screen reader users cannot interact with it in this mode."] }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["Checkbox mode (", _jsx("code", { children: "checkbox={true}" }), ") is accessible: the embedded", ' ', _jsx("code", { children: "CheckboxInput" }), ' ', "provides a real", ' ', _jsx("code", { children: "<input type=\"checkbox\">" }), ' ', "that Tab reaches and Space toggles."] }), _jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-semantic-warning-800)' }, children: ["For toggle mode where keyboard accessibility is required, wrap each pill and supply the missing semantics manually. See the component description above for the wrapper pattern. Toggle mode pills should carry", ' ', _jsx("code", { children: "role=\"radio\"" }), ' ', "inside a", ' ', _jsx("code", { children: "role=\"radiogroup\"" }), "."] })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Accessible example \u2014 checkbox mode (Year 8 cohort filter)" }), _jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: [_jsx(Pill, { text: "Year 7", checkbox: true }), _jsx(Pill, { text: "Year 8", checkbox: true, initialValue: true }), _jsx(Pill, { text: "Year 9", checkbox: true })] }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: "Tab into any of the pills above \u2014 the embedded checkbox is focusable and Space toggles it." })] })] }));
|
|
322
|
+
const OnChangeBehaviourTemplate = () => {
|
|
323
|
+
const [log, setLog] = useState([]);
|
|
324
|
+
const handleChange = (value) => {
|
|
325
|
+
setLog(prev => [value, ...prev]);
|
|
326
|
+
};
|
|
327
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: "Click the pill. Each click fires `onChange` with the new value \u2014 nothing is logged until you interact." }), _jsx(Pill, { text: "Autumn term", onChange: handleChange }), _jsx("div", { style: {
|
|
328
|
+
border: '1px solid var(--color-grey-300)',
|
|
329
|
+
borderRadius: 'var(--border-radius-small)',
|
|
330
|
+
padding: 'var(--spacing-small)',
|
|
331
|
+
minHeight: '4rem',
|
|
332
|
+
maxHeight: '12rem',
|
|
333
|
+
overflowY: 'auto',
|
|
334
|
+
background: 'var(--color-grey-050)',
|
|
335
|
+
}, children: log.length === 0
|
|
336
|
+
? (_jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: "Waiting for events..." }))
|
|
337
|
+
: (log.map((value, i) => (_jsx("p", { className: "ds-text", style: { margin: '0 0 var(--spacing-xsmall)' }, children: `onChange(${String(value)})` }, i)))) })] }));
|
|
338
|
+
};
|
|
339
|
+
const SUBJECTS = ['Maths', 'English', 'Science', 'History', 'Art', 'French', 'PE'];
|
|
340
|
+
const ControlledCheckboxModeTemplate = () => {
|
|
341
|
+
const [selected, setSelected] = useState(['Maths', 'Science']);
|
|
342
|
+
const toggle = (subject) => {
|
|
343
|
+
setSelected(prev => prev.includes(subject)
|
|
344
|
+
? prev.filter(s => s !== subject)
|
|
345
|
+
: [...prev, subject]);
|
|
346
|
+
};
|
|
347
|
+
return (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: ["Parent owns a string[] of selected subjects and passes", ' ', _jsxs("code", { children: ["checked=", '{selected.includes(subject)}'] }), ' ', "to each pill."] }), _jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }, children: SUBJECTS.map(subject => (_jsx(Pill, { text: subject, checkbox: true, checked: selected.includes(subject), onChange: () => toggle(subject) }, subject))) }), _jsx("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)', fontStyle: 'italic' }, children: selected.length === 0 ? 'No subjects selected' : `Subjects: ${selected.join(', ')}` })] }));
|
|
348
|
+
};
|
|
349
|
+
const ALL_PILLS = [
|
|
350
|
+
'Year 7', 'Year 8', 'Year 9', 'Year 10', 'Year 11', 'Year 12', 'Year 13',
|
|
351
|
+
'Maths', 'English', 'Science', 'History', 'Art', 'French', 'PE', 'PE', 'Drama',
|
|
352
|
+
];
|
|
353
|
+
const PillGroupWrappingTemplate = () => (_jsxs("div", { style: { padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }, children: [_jsxs("p", { className: "ds-text", style: { margin: 0, color: 'var(--color-grey-600)' }, children: ["16 pills in a 380px container \u2014 the consumer's flex wrapper is what makes them wrap. Pills themselves are", ' ', _jsx("code", { children: "width: fit-content" }), ' ', "and will overflow without", ' ', _jsx("code", { children: "flex-wrap: wrap" }), ' ', "on the parent."] }), _jsx("div", { style: {
|
|
354
|
+
maxWidth: '380px',
|
|
355
|
+
display: 'flex',
|
|
356
|
+
flexWrap: 'wrap',
|
|
357
|
+
gap: 'var(--spacing-small)',
|
|
358
|
+
padding: 'var(--spacing-small)',
|
|
359
|
+
border: '1px dashed var(--color-grey-300)',
|
|
360
|
+
borderRadius: 'var(--border-radius-small)',
|
|
361
|
+
}, children: ALL_PILLS.map((label, i) => (_jsx(Pill, { text: label }, `${label}-${i}`))) })] }));
|
|
289
362
|
// ---------------------------------------------------------------------------
|
|
290
363
|
// Stories
|
|
291
364
|
// ---------------------------------------------------------------------------
|
|
@@ -294,10 +367,64 @@ export const Default = withDescription({
|
|
|
294
367
|
text: 'Year 7',
|
|
295
368
|
checkbox: false,
|
|
296
369
|
initialValue: false,
|
|
297
|
-
|
|
370
|
+
onChange: fn(),
|
|
298
371
|
},
|
|
299
372
|
render: args => _jsx(Pill, { ...args }),
|
|
300
|
-
}, 'The interactive canvas. Every prop is wired to the Controls panel below — toggle `checkbox` to switch between single-select and multi-select modes, toggle `initialValue` to start in the active/checked state. The `
|
|
373
|
+
}, 'The interactive canvas. Every prop is wired to the Controls panel below — toggle `checkbox` to switch between single-select and multi-select modes, toggle `initialValue` to start in the active/checked state. The `onChange` callback fires into the Actions panel on every state change.');
|
|
374
|
+
export const Uncontrolled = withDescription({
|
|
375
|
+
render: UncontrolledTemplate,
|
|
376
|
+
parameters: {
|
|
377
|
+
docs: {
|
|
378
|
+
source: {
|
|
379
|
+
language: 'tsx',
|
|
380
|
+
code: `
|
|
381
|
+
import { useState } from 'react';
|
|
382
|
+
import { Pill } from '@arbor-education/design-system.components';
|
|
383
|
+
|
|
384
|
+
function UncontrolledExample() {
|
|
385
|
+
const [lastValue, setLastValue] = useState<boolean | null>(null);
|
|
386
|
+
|
|
387
|
+
return (
|
|
388
|
+
<>
|
|
389
|
+
<Pill text="Autumn term" initialValue={false} onChange={v => setLastValue(v)} />
|
|
390
|
+
<p>Last onChange: {lastValue === null ? '(not fired yet)' : String(lastValue)}</p>
|
|
391
|
+
</>
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
export default UncontrolledExample;
|
|
395
|
+
`.trim(),
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
}, 'The pill owns its own checked state — `initialValue` seeds it on first mount and the pill manages itself from there. The parent observes changes via `onChange` but does NOT hold the source of truth. Click the pill to toggle it; the last `onChange` value echoes below.');
|
|
400
|
+
export const Controlled = withDescription({
|
|
401
|
+
render: ControlledTemplate,
|
|
402
|
+
parameters: {
|
|
403
|
+
docs: {
|
|
404
|
+
source: {
|
|
405
|
+
language: 'tsx',
|
|
406
|
+
code: `
|
|
407
|
+
import { useState } from 'react';
|
|
408
|
+
import { Pill } from '@arbor-education/design-system.components';
|
|
409
|
+
|
|
410
|
+
function ControlledExample() {
|
|
411
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
412
|
+
|
|
413
|
+
return (
|
|
414
|
+
<>
|
|
415
|
+
<Pill text="Autumn term" checked={isChecked} onChange={setIsChecked} />
|
|
416
|
+
<button type="button" onClick={() => setIsChecked(v => !v)}>Toggle from outside</button>
|
|
417
|
+
<button type="button" onClick={() => setIsChecked(false)}>Reset</button>
|
|
418
|
+
<p>External state: {String(isChecked)}</p>
|
|
419
|
+
</>
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
export default ControlledExample;
|
|
423
|
+
`.trim(),
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
}, 'The parent holds the source of truth via `checked` + `onChange`. Clicking the pill fires `onChange` → parent updates its state → `checked` prop changes → pill syncs. The external "Toggle from outside" button demonstrates that the parent can drive the pill\'s state independently of user clicks. Use this pattern when you need to reset or synchronise pills from elsewhere in your UI (e.g. a "Clear all filters" button).');
|
|
301
428
|
export const ToggleActive = withDescription({
|
|
302
429
|
args: {
|
|
303
430
|
text: 'Active',
|
|
@@ -414,7 +541,7 @@ function YearGroupFilter() {
|
|
|
414
541
|
key={year}
|
|
415
542
|
text={year}
|
|
416
543
|
initialValue={active === year}
|
|
417
|
-
|
|
544
|
+
onChange={checked => setActive(checked ? year : null)}
|
|
418
545
|
/>
|
|
419
546
|
))}
|
|
420
547
|
</div>
|
|
@@ -456,7 +583,7 @@ function StatusFilter() {
|
|
|
456
583
|
key={status}
|
|
457
584
|
text={status}
|
|
458
585
|
checkbox
|
|
459
|
-
|
|
586
|
+
onChange={checked => toggle(status, checked)}
|
|
460
587
|
/>
|
|
461
588
|
))}
|
|
462
589
|
</div>
|
|
@@ -504,13 +631,13 @@ function SubjectFilter() {
|
|
|
504
631
|
|
|
505
632
|
return (
|
|
506
633
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
|
|
507
|
-
<Pill text="All" initialValue={allActive}
|
|
634
|
+
<Pill text="All" initialValue={allActive} onChange={handleAllClick} />
|
|
508
635
|
{subjects.map(subject => (
|
|
509
636
|
<Pill
|
|
510
637
|
key={subject}
|
|
511
638
|
text={subject}
|
|
512
639
|
initialValue={activeFilters.has(subject)}
|
|
513
|
-
|
|
640
|
+
onChange={checked => handleSubjectClick(subject, checked)}
|
|
514
641
|
/>
|
|
515
642
|
))}
|
|
516
643
|
</div>
|
|
@@ -582,4 +709,112 @@ export default AccessibilityNoteExample;
|
|
|
582
709
|
},
|
|
583
710
|
},
|
|
584
711
|
}, '**Read before shipping to production.** Toggle-mode `Pill` is not keyboard-accessible — it renders as `<span onClick>` with no `tabIndex` or ARIA role. Checkbox mode IS accessible. This story documents the limitation and shows an accessible checkbox-mode example you can interact with via keyboard. See the component description for the toggle-mode wrapper workaround.');
|
|
712
|
+
export const OnChangeBehaviour = withDescription({
|
|
713
|
+
render: OnChangeBehaviourTemplate,
|
|
714
|
+
parameters: {
|
|
715
|
+
controls: { disable: true },
|
|
716
|
+
docs: {
|
|
717
|
+
source: {
|
|
718
|
+
language: 'tsx',
|
|
719
|
+
code: `
|
|
720
|
+
import { useState } from 'react';
|
|
721
|
+
import { Pill } from '@arbor-education/design-system.components';
|
|
722
|
+
|
|
723
|
+
function PillOnChangeLog() {
|
|
724
|
+
const [log, setLog] = useState<boolean[]>([]);
|
|
725
|
+
|
|
726
|
+
return (
|
|
727
|
+
<>
|
|
728
|
+
<Pill
|
|
729
|
+
text="Autumn term"
|
|
730
|
+
onChange={checked => setLog(prev => [checked, ...prev])}
|
|
731
|
+
/>
|
|
732
|
+
<ul>
|
|
733
|
+
{log.map((value, i) => <li key={i}>onChange({String(value)})</li>)}
|
|
734
|
+
</ul>
|
|
735
|
+
</>
|
|
736
|
+
);
|
|
737
|
+
}
|
|
738
|
+
export default PillOnChangeLog;
|
|
739
|
+
`.trim(),
|
|
740
|
+
},
|
|
741
|
+
},
|
|
742
|
+
},
|
|
743
|
+
}, '`onChange` fires only on user interaction — once per click, with the new checked value. Nothing is logged until you click the pill: it does not fire on mount, and it does not fire when a controlled `checked` prop is updated by the parent. Wire it straight to a filter handler or state setter without needing a mount guard.');
|
|
744
|
+
export const ControlledCheckboxMode = withDescription({
|
|
745
|
+
render: ControlledCheckboxModeTemplate,
|
|
746
|
+
parameters: {
|
|
747
|
+
controls: { disable: true },
|
|
748
|
+
docs: {
|
|
749
|
+
source: {
|
|
750
|
+
language: 'tsx',
|
|
751
|
+
code: `
|
|
752
|
+
import { useState } from 'react';
|
|
753
|
+
import { Pill } from '@arbor-education/design-system.components';
|
|
754
|
+
|
|
755
|
+
const SUBJECTS = ['Maths', 'English', 'Science', 'History', 'Art', 'French', 'PE'];
|
|
756
|
+
|
|
757
|
+
function SubjectFilter() {
|
|
758
|
+
const [selected, setSelected] = useState<string[]>(['Maths', 'Science']);
|
|
759
|
+
|
|
760
|
+
const toggle = (subject: string) => {
|
|
761
|
+
setSelected(prev =>
|
|
762
|
+
prev.includes(subject)
|
|
763
|
+
? prev.filter(s => s !== subject)
|
|
764
|
+
: [...prev, subject],
|
|
765
|
+
);
|
|
766
|
+
};
|
|
767
|
+
|
|
768
|
+
return (
|
|
769
|
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
|
|
770
|
+
{SUBJECTS.map(subject => (
|
|
771
|
+
<Pill
|
|
772
|
+
key={subject}
|
|
773
|
+
text={subject}
|
|
774
|
+
checkbox
|
|
775
|
+
checked={selected.includes(subject)}
|
|
776
|
+
onChange={() => toggle(subject)}
|
|
777
|
+
/>
|
|
778
|
+
))}
|
|
779
|
+
</div>
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
export default SubjectFilter;
|
|
783
|
+
`.trim(),
|
|
784
|
+
},
|
|
785
|
+
},
|
|
786
|
+
},
|
|
787
|
+
}, 'The canonical controlled multi-select pattern. The parent holds a `string[]` of selected subjects and passes `checked={selected.includes(subject)}` to each pill. `onChange` updates the array. Use this when filter state needs to live outside the component — e.g. in a URL param, a form, or a shared store. Two subjects are pre-selected to demonstrate the starting state.');
|
|
788
|
+
export const PillGroupWrapping = withDescription({
|
|
789
|
+
render: PillGroupWrappingTemplate,
|
|
790
|
+
parameters: {
|
|
791
|
+
controls: { disable: true },
|
|
792
|
+
docs: {
|
|
793
|
+
source: {
|
|
794
|
+
language: 'tsx',
|
|
795
|
+
code: `
|
|
796
|
+
import { Pill } from '@arbor-education/design-system.components';
|
|
797
|
+
|
|
798
|
+
function FilterPillGroup() {
|
|
799
|
+
const labels = [
|
|
800
|
+
'Year 7', 'Year 8', 'Year 9', 'Year 10', 'Year 11', 'Year 12', 'Year 13',
|
|
801
|
+
'Maths', 'English', 'Science', 'History', 'Art',
|
|
802
|
+
];
|
|
803
|
+
|
|
804
|
+
// flex-wrap: wrap on the PARENT is what makes pills wrap.
|
|
805
|
+
// Pills themselves are width: fit-content and will overflow without it.
|
|
806
|
+
return (
|
|
807
|
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
|
|
808
|
+
{labels.map(label => (
|
|
809
|
+
<Pill key={label} text={label} />
|
|
810
|
+
))}
|
|
811
|
+
</div>
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
export default FilterPillGroup;
|
|
815
|
+
`.trim(),
|
|
816
|
+
},
|
|
817
|
+
},
|
|
818
|
+
},
|
|
819
|
+
}, 'Pills must wrap — never scroll horizontally. The wrapper here is constrained to 380px so you can see the wrapping in action. In production the container width comes from the page layout. The key CSS is `display: flex; flex-wrap: wrap; gap: var(--spacing-small)` on the **parent** — Pill itself is `width: fit-content` and will overflow without it.');
|
|
585
820
|
//# sourceMappingURL=Pill.stories.js.map
|