@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.
Files changed (461) hide show
  1. package/.gather/instructions/project-overview.md +1 -1
  2. package/.github/workflows/release.yml +3 -1
  3. package/.storybook/main.ts +12 -6
  4. package/CHANGELOG.md +20 -0
  5. package/CONTRIBUTING.md +7 -5
  6. package/component-library.md +97 -3
  7. package/dist/components/emptyState/EmptyState.d.ts +22 -0
  8. package/dist/components/emptyState/EmptyState.d.ts.map +1 -0
  9. package/dist/components/emptyState/EmptyState.js +11 -0
  10. package/dist/components/emptyState/EmptyState.js.map +1 -0
  11. package/dist/components/emptyState/EmptyState.stories.d.ts +117 -0
  12. package/dist/components/emptyState/EmptyState.stories.d.ts.map +1 -0
  13. package/dist/components/emptyState/EmptyState.stories.js +332 -0
  14. package/dist/components/emptyState/EmptyState.stories.js.map +1 -0
  15. package/dist/components/emptyState/EmptyState.test.d.ts +2 -0
  16. package/dist/components/emptyState/EmptyState.test.d.ts.map +1 -0
  17. package/dist/components/emptyState/EmptyState.test.js +80 -0
  18. package/dist/components/emptyState/EmptyState.test.js.map +1 -0
  19. package/dist/components/favourite/FavouriteButton.d.ts +18 -0
  20. package/dist/components/favourite/FavouriteButton.d.ts.map +1 -0
  21. package/dist/components/favourite/FavouriteButton.js +16 -0
  22. package/dist/components/favourite/FavouriteButton.js.map +1 -0
  23. package/dist/components/favourite/FavouriteButton.test.d.ts +2 -0
  24. package/dist/components/favourite/FavouriteButton.test.d.ts.map +1 -0
  25. package/dist/components/favourite/FavouriteButton.test.js +37 -0
  26. package/dist/components/favourite/FavouriteButton.test.js.map +1 -0
  27. package/dist/components/filterBar/FilterBar.d.ts +1 -1
  28. package/dist/components/filterBar/FilterBar.stories.d.ts +1 -1
  29. package/dist/components/icon/Icon.d.ts +1 -1
  30. package/dist/components/icon/Icon.d.ts.map +1 -1
  31. package/dist/components/icon/Icon.js +1 -1
  32. package/dist/components/icon/Icon.js.map +1 -1
  33. package/dist/components/pill/Pill.d.ts +3 -2
  34. package/dist/components/pill/Pill.d.ts.map +1 -1
  35. package/dist/components/pill/Pill.js +15 -9
  36. package/dist/components/pill/Pill.js.map +1 -1
  37. package/dist/components/pill/Pill.stories.d.ts +21 -3
  38. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  39. package/dist/components/pill/Pill.stories.js +275 -40
  40. package/dist/components/pill/Pill.stories.js.map +1 -1
  41. package/dist/components/pill/Pill.test.js +64 -3
  42. package/dist/components/pill/Pill.test.js.map +1 -1
  43. package/dist/components/sideNavigation/SideNavigation.d.ts +34 -0
  44. package/dist/components/sideNavigation/SideNavigation.d.ts.map +1 -0
  45. package/dist/components/sideNavigation/SideNavigation.js +30 -0
  46. package/dist/components/sideNavigation/SideNavigation.js.map +1 -0
  47. package/dist/components/sideNavigation/SideNavigation.stories.d.ts +72 -0
  48. package/dist/components/sideNavigation/SideNavigation.stories.d.ts.map +1 -0
  49. package/dist/components/sideNavigation/SideNavigation.stories.js +298 -0
  50. package/dist/components/sideNavigation/SideNavigation.stories.js.map +1 -0
  51. package/dist/components/sideNavigation/SideNavigation.test.d.ts +2 -0
  52. package/dist/components/sideNavigation/SideNavigation.test.d.ts.map +1 -0
  53. package/dist/components/sideNavigation/SideNavigation.test.js +74 -0
  54. package/dist/components/sideNavigation/SideNavigation.test.js.map +1 -0
  55. package/dist/components/sideNavigation/SideNavigationContext.d.ts +10 -0
  56. package/dist/components/sideNavigation/SideNavigationContext.d.ts.map +1 -0
  57. package/dist/components/sideNavigation/SideNavigationContext.js +15 -0
  58. package/dist/components/sideNavigation/SideNavigationContext.js.map +1 -0
  59. package/dist/components/{sidebarNav/SidebarNavGroup.d.ts → sideNavigation/SideNavigationGroup.d.ts} +3 -3
  60. package/dist/components/sideNavigation/SideNavigationGroup.d.ts.map +1 -0
  61. package/dist/components/sideNavigation/SideNavigationGroup.js +16 -0
  62. package/dist/components/sideNavigation/SideNavigationGroup.js.map +1 -0
  63. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts +2 -0
  64. package/dist/components/sideNavigation/SideNavigationGroup.test.d.ts.map +1 -0
  65. package/dist/components/sideNavigation/SideNavigationGroup.test.js +58 -0
  66. package/dist/components/sideNavigation/SideNavigationGroup.test.js.map +1 -0
  67. package/dist/components/{sidebarNav/SidebarNavItem.d.ts → sideNavigation/SideNavigationItem.d.ts} +11 -12
  68. package/dist/components/sideNavigation/SideNavigationItem.d.ts.map +1 -0
  69. package/dist/components/sideNavigation/SideNavigationItem.js +28 -0
  70. package/dist/components/sideNavigation/SideNavigationItem.js.map +1 -0
  71. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts +2 -0
  72. package/dist/components/sideNavigation/SideNavigationItem.test.d.ts.map +1 -0
  73. package/dist/components/sideNavigation/SideNavigationItem.test.js +65 -0
  74. package/dist/components/sideNavigation/SideNavigationItem.test.js.map +1 -0
  75. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts +8 -0
  76. package/dist/components/sideNavigation/SideNavigationItemFavourite.d.ts.map +1 -0
  77. package/dist/components/{sidebarNav/SidebarNavItemFavourite.js → sideNavigation/SideNavigationItemFavourite.js} +5 -5
  78. package/dist/components/sideNavigation/SideNavigationItemFavourite.js.map +1 -0
  79. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts +2 -0
  80. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.d.ts.map +1 -0
  81. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js +31 -0
  82. package/dist/components/sideNavigation/SideNavigationItemFavourite.test.js.map +1 -0
  83. package/dist/components/sideNavigation/SideNavigationTitle.d.ts +4 -0
  84. package/dist/components/sideNavigation/SideNavigationTitle.d.ts.map +1 -0
  85. package/dist/components/sideNavigation/SideNavigationTitle.js +7 -0
  86. package/dist/components/sideNavigation/SideNavigationTitle.js.map +1 -0
  87. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts +2 -0
  88. package/dist/components/sideNavigation/SideNavigationTitle.test.d.ts.map +1 -0
  89. package/dist/components/sideNavigation/SideNavigationTitle.test.js +22 -0
  90. package/dist/components/sideNavigation/SideNavigationTitle.test.js.map +1 -0
  91. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts +7 -0
  92. package/dist/components/sideNavigation/SideNavigationTooltip.d.ts.map +1 -0
  93. package/dist/components/{sidebarNav/SidebarNavTooltip.js → sideNavigation/SideNavigationTooltip.js} +2 -2
  94. package/dist/components/sideNavigation/SideNavigationTooltip.js.map +1 -0
  95. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts +2 -0
  96. package/dist/components/sideNavigation/SideNavigationTooltip.test.d.ts.map +1 -0
  97. package/dist/components/sideNavigation/SideNavigationTooltip.test.js +26 -0
  98. package/dist/components/sideNavigation/SideNavigationTooltip.test.js.map +1 -0
  99. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts +4 -0
  100. package/dist/components/sideNavigation/resolvePanelItemProps.d.ts.map +1 -0
  101. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.js +5 -4
  102. package/dist/components/sideNavigation/resolvePanelItemProps.js.map +1 -0
  103. package/dist/components/sideNavigation/resolvePanelItemProps.test.d.ts.map +1 -0
  104. package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.js +18 -4
  105. package/dist/components/sideNavigation/resolvePanelItemProps.test.js.map +1 -0
  106. package/dist/components/sideNavigation/types.d.ts +47 -0
  107. package/dist/components/sideNavigation/types.d.ts.map +1 -0
  108. package/dist/components/sideNavigation/types.js +2 -0
  109. package/dist/components/sideNavigation/types.js.map +1 -0
  110. package/dist/components/sidebar/Sidebar.d.ts +13 -0
  111. package/dist/components/sidebar/Sidebar.d.ts.map +1 -0
  112. package/dist/components/sidebar/Sidebar.js +9 -0
  113. package/dist/components/sidebar/Sidebar.js.map +1 -0
  114. package/dist/components/sidebar/Sidebar.stories.d.ts +48 -0
  115. package/dist/components/sidebar/Sidebar.stories.d.ts.map +1 -0
  116. package/dist/components/sidebar/Sidebar.stories.js +444 -0
  117. package/dist/components/sidebar/Sidebar.stories.js.map +1 -0
  118. package/dist/components/sidebar/Sidebar.test.d.ts +2 -0
  119. package/dist/components/sidebar/Sidebar.test.d.ts.map +1 -0
  120. package/dist/components/sidebar/Sidebar.test.js +81 -0
  121. package/dist/components/sidebar/Sidebar.test.js.map +1 -0
  122. package/dist/components/sidebar/SidebarItem.d.ts +7 -0
  123. package/dist/components/sidebar/SidebarItem.d.ts.map +1 -0
  124. package/dist/components/sidebar/SidebarItem.js +11 -0
  125. package/dist/components/sidebar/SidebarItem.js.map +1 -0
  126. package/dist/components/singleUser/SingleUser.d.ts +1 -1
  127. package/dist/components/table/Table.d.ts.map +1 -1
  128. package/dist/components/table/Table.js +2 -1
  129. package/dist/components/table/Table.js.map +1 -1
  130. package/dist/components/table/Table.stories.d.ts.map +1 -1
  131. package/dist/components/table/Table.stories.js +24 -70
  132. package/dist/components/table/Table.stories.js.map +1 -1
  133. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -1
  134. package/dist/components/table/cellEditors/DateCellEditor.stories.js +16 -13
  135. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -1
  136. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -1
  137. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +6 -7
  138. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -1
  139. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -1
  140. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +7 -8
  141. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -1
  142. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -1
  143. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +7 -8
  144. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -1
  145. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -1
  146. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +7 -8
  147. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -1
  148. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.d.ts.map +1 -1
  149. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js +12 -15
  150. package/dist/components/table/cellRenderers/NumberInputCellRenderer.stories.js.map +1 -1
  151. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -1
  152. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +19 -29
  153. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -1
  154. package/dist/components/table/columnTypes.d.ts +3 -0
  155. package/dist/components/table/columnTypes.d.ts.map +1 -0
  156. package/dist/components/table/columnTypes.js +55 -0
  157. package/dist/components/table/columnTypes.js.map +1 -0
  158. package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
  159. package/dist/components/toast/Toast.d.ts +11 -2
  160. package/dist/components/toast/Toast.d.ts.map +1 -1
  161. package/dist/components/toast/Toast.js +5 -3
  162. package/dist/components/toast/Toast.js.map +1 -1
  163. package/dist/components/toast/Toast.stories.d.ts +15 -3
  164. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  165. package/dist/components/toast/Toast.stories.js +43 -41
  166. package/dist/components/toast/Toast.stories.js.map +1 -1
  167. package/dist/components/toast/Toast.test.js +19 -4
  168. package/dist/components/toast/Toast.test.js.map +1 -1
  169. package/dist/components/toast/ToastAction.d.ts +7 -0
  170. package/dist/components/toast/ToastAction.d.ts.map +1 -0
  171. package/dist/components/toast/ToastAction.js +9 -0
  172. package/dist/components/toast/ToastAction.js.map +1 -0
  173. package/dist/components/toggleGroup/ToggleGroup.stories.js +1 -1
  174. package/dist/components/toggleGroup/ToggleGroup.stories.js.map +1 -1
  175. package/dist/components/tooltip/TooltipWrapper.d.ts +1 -0
  176. package/dist/components/tooltip/TooltipWrapper.d.ts.map +1 -1
  177. package/dist/components/tooltip/TooltipWrapper.js +2 -2
  178. package/dist/components/tooltip/TooltipWrapper.js.map +1 -1
  179. package/dist/components/widget/Widget.d.ts +18 -0
  180. package/dist/components/widget/Widget.d.ts.map +1 -0
  181. package/dist/components/widget/Widget.js +51 -0
  182. package/dist/components/widget/Widget.js.map +1 -0
  183. package/dist/components/widget/Widget.stories.d.ts +128 -0
  184. package/dist/components/widget/Widget.stories.d.ts.map +1 -0
  185. package/dist/components/widget/Widget.stories.js +417 -0
  186. package/dist/components/widget/Widget.stories.js.map +1 -0
  187. package/dist/components/widget/Widget.test.d.ts +2 -0
  188. package/dist/components/widget/Widget.test.d.ts.map +1 -0
  189. package/dist/components/widget/Widget.test.js +110 -0
  190. package/dist/components/widget/Widget.test.js.map +1 -0
  191. package/dist/components/widget/WidgetBody.d.ts +6 -0
  192. package/dist/components/widget/WidgetBody.d.ts.map +1 -0
  193. package/dist/components/widget/WidgetBody.js +20 -0
  194. package/dist/components/widget/WidgetBody.js.map +1 -0
  195. package/dist/components/widget/WidgetContext.d.ts +20 -0
  196. package/dist/components/widget/WidgetContext.d.ts.map +1 -0
  197. package/dist/components/widget/WidgetContext.js +10 -0
  198. package/dist/components/widget/WidgetContext.js.map +1 -0
  199. package/dist/components/widget/WidgetHeader.d.ts +8 -0
  200. package/dist/components/widget/WidgetHeader.d.ts.map +1 -0
  201. package/dist/components/widget/WidgetHeader.js +56 -0
  202. package/dist/components/widget/WidgetHeader.js.map +1 -0
  203. package/dist/components/widget/types.d.ts +43 -0
  204. package/dist/components/widget/types.d.ts.map +1 -0
  205. package/dist/components/widget/types.js +2 -0
  206. package/dist/components/widget/types.js.map +1 -0
  207. package/dist/components/widgetCalendar/WidgetCalendar.d.ts +35 -0
  208. package/dist/components/widgetCalendar/WidgetCalendar.d.ts.map +1 -0
  209. package/dist/components/widgetCalendar/WidgetCalendar.js +22 -0
  210. package/dist/components/widgetCalendar/WidgetCalendar.js.map +1 -0
  211. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts +60 -0
  212. package/dist/components/widgetCalendar/WidgetCalendar.stories.d.ts.map +1 -0
  213. package/dist/components/widgetCalendar/WidgetCalendar.stories.js +140 -0
  214. package/dist/components/widgetCalendar/WidgetCalendar.stories.js.map +1 -0
  215. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts +2 -0
  216. package/dist/components/widgetCalendar/WidgetCalendar.test.d.ts.map +1 -0
  217. package/dist/components/widgetCalendar/WidgetCalendar.test.js +88 -0
  218. package/dist/components/widgetCalendar/WidgetCalendar.test.js.map +1 -0
  219. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts +17 -0
  220. package/dist/components/widgetCalendar/WidgetCalendarItem.d.ts.map +1 -0
  221. package/dist/components/widgetCalendar/WidgetCalendarItem.js +25 -0
  222. package/dist/components/widgetCalendar/WidgetCalendarItem.js.map +1 -0
  223. package/dist/components/widgetFavourites/WidgetFavourites.d.ts +12 -0
  224. package/dist/components/widgetFavourites/WidgetFavourites.d.ts.map +1 -0
  225. package/dist/components/widgetFavourites/WidgetFavourites.js +23 -0
  226. package/dist/components/widgetFavourites/WidgetFavourites.js.map +1 -0
  227. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts +84 -0
  228. package/dist/components/widgetFavourites/WidgetFavourites.stories.d.ts.map +1 -0
  229. package/dist/components/widgetFavourites/WidgetFavourites.stories.js +210 -0
  230. package/dist/components/widgetFavourites/WidgetFavourites.stories.js.map +1 -0
  231. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts +2 -0
  232. package/dist/components/widgetFavourites/WidgetFavourites.test.d.ts.map +1 -0
  233. package/dist/components/widgetFavourites/WidgetFavourites.test.js +67 -0
  234. package/dist/components/widgetFavourites/WidgetFavourites.test.js.map +1 -0
  235. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts +3 -0
  236. package/dist/components/widgetFavourites/WidgetFavouritesItem.d.ts.map +1 -0
  237. package/dist/components/widgetFavourites/WidgetFavouritesItem.js +10 -0
  238. package/dist/components/widgetFavourites/WidgetFavouritesItem.js.map +1 -0
  239. package/dist/components/widgetFavourites/types.d.ts +25 -0
  240. package/dist/components/widgetFavourites/types.d.ts.map +1 -0
  241. package/dist/components/widgetFavourites/types.js +2 -0
  242. package/dist/components/widgetFavourites/types.js.map +1 -0
  243. package/dist/components/widgetNotifications/WidgetNotifications.d.ts +33 -0
  244. package/dist/components/widgetNotifications/WidgetNotifications.d.ts.map +1 -0
  245. package/dist/components/widgetNotifications/WidgetNotifications.js +18 -0
  246. package/dist/components/widgetNotifications/WidgetNotifications.js.map +1 -0
  247. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts +60 -0
  248. package/dist/components/widgetNotifications/WidgetNotifications.stories.d.ts.map +1 -0
  249. package/dist/components/widgetNotifications/WidgetNotifications.stories.js +269 -0
  250. package/dist/components/widgetNotifications/WidgetNotifications.stories.js.map +1 -0
  251. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts +2 -0
  252. package/dist/components/widgetNotifications/WidgetNotifications.test.d.ts.map +1 -0
  253. package/dist/components/widgetNotifications/WidgetNotifications.test.js +79 -0
  254. package/dist/components/widgetNotifications/WidgetNotifications.test.js.map +1 -0
  255. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts +14 -0
  256. package/dist/components/widgetNotifications/WidgetNotificationsItem.d.ts.map +1 -0
  257. package/dist/components/widgetNotifications/WidgetNotificationsItem.js +14 -0
  258. package/dist/components/widgetNotifications/WidgetNotificationsItem.js.map +1 -0
  259. package/dist/index.css +756 -78
  260. package/dist/index.css.map +1 -1
  261. package/dist/index.d.ts +15 -9
  262. package/dist/index.d.ts.map +1 -1
  263. package/dist/index.js +15 -8
  264. package/dist/index.js.map +1 -1
  265. package/dist/utils/favourites/favouriteConstants.d.ts +12 -0
  266. package/dist/utils/favourites/favouriteConstants.d.ts.map +1 -0
  267. package/dist/utils/favourites/favouriteConstants.js +16 -0
  268. package/dist/utils/favourites/favouriteConstants.js.map +1 -0
  269. package/dist/utils/favourites/favouriteConstants.test.d.ts +2 -0
  270. package/dist/utils/favourites/favouriteConstants.test.d.ts.map +1 -0
  271. package/dist/utils/favourites/favouriteConstants.test.js +12 -0
  272. package/dist/utils/favourites/favouriteConstants.test.js.map +1 -0
  273. package/dist/utils/hooks/useControllableBoolean.d.ts.map +1 -0
  274. package/dist/utils/hooks/useControllableBoolean.js.map +1 -0
  275. package/dist/utils/hooks/useControllableBoolean.test.d.ts +2 -0
  276. package/dist/utils/hooks/useControllableBoolean.test.d.ts.map +1 -0
  277. package/dist/utils/hooks/useControllableBoolean.test.js +34 -0
  278. package/dist/utils/hooks/useControllableBoolean.test.js.map +1 -0
  279. package/package.json +10 -11
  280. package/src/components/emptyState/EmptyState.stories.tsx +487 -0
  281. package/src/components/emptyState/EmptyState.test.tsx +140 -0
  282. package/src/components/emptyState/EmptyState.tsx +84 -0
  283. package/src/components/emptyState/emptyState.scss +63 -0
  284. package/src/components/favourite/FavouriteButton.test.tsx +83 -0
  285. package/src/components/favourite/FavouriteButton.tsx +70 -0
  286. package/src/components/favourite/favouriteButton.scss +37 -0
  287. package/src/components/icon/Icon.tsx +2 -2
  288. package/src/components/link/link.scss +26 -0
  289. package/src/components/pill/Pill.stories.tsx +432 -41
  290. package/src/components/pill/Pill.test.tsx +74 -3
  291. package/src/components/pill/Pill.tsx +26 -11
  292. package/src/components/sideNavigation/SideNavigation.stories.tsx +578 -0
  293. package/src/components/sideNavigation/SideNavigation.test.tsx +109 -0
  294. package/src/components/sideNavigation/SideNavigation.tsx +98 -0
  295. package/src/components/sideNavigation/SideNavigationContext.tsx +25 -0
  296. package/src/components/sideNavigation/SideNavigationGroup.test.tsx +103 -0
  297. package/src/components/{sidebarNav/SidebarNavGroup.tsx → sideNavigation/SideNavigationGroup.tsx} +8 -8
  298. package/src/components/sideNavigation/SideNavigationItem.test.tsx +137 -0
  299. package/src/components/sideNavigation/SideNavigationItem.tsx +125 -0
  300. package/src/components/sideNavigation/SideNavigationItemFavourite.test.tsx +54 -0
  301. package/src/components/{sidebarNav/SidebarNavItemFavourite.tsx → sideNavigation/SideNavigationItemFavourite.tsx} +7 -7
  302. package/src/components/sideNavigation/SideNavigationTitle.test.tsx +23 -0
  303. package/src/components/sideNavigation/SideNavigationTitle.tsx +13 -0
  304. package/src/components/sideNavigation/SideNavigationTooltip.test.tsx +44 -0
  305. package/src/components/{sidebarNav/SidebarNavTooltip.tsx → sideNavigation/SideNavigationTooltip.tsx} +2 -2
  306. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.ts +20 -4
  307. package/src/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.ts +8 -7
  308. package/src/components/{sidebarNav/sidebarNav.scss → sideNavigation/sideNavigation.scss} +37 -136
  309. package/src/components/sideNavigation/types.ts +56 -0
  310. package/src/components/sidebar/Sidebar.stories.tsx +670 -0
  311. package/src/components/sidebar/Sidebar.test.tsx +155 -0
  312. package/src/components/sidebar/Sidebar.tsx +27 -0
  313. package/src/components/sidebar/SidebarItem.tsx +64 -0
  314. package/src/components/sidebar/sidebar.scss +65 -0
  315. package/src/components/table/Table.stories.tsx +24 -73
  316. package/src/components/table/Table.tsx +2 -0
  317. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +16 -14
  318. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +6 -7
  319. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +7 -8
  320. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +7 -8
  321. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +7 -8
  322. package/src/components/table/cellRenderers/NumberInputCellRenderer.stories.tsx +12 -15
  323. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +19 -29
  324. package/src/components/table/columnTypes.ts +56 -0
  325. package/src/components/toast/Toast.stories.tsx +75 -67
  326. package/src/components/toast/Toast.test.tsx +40 -10
  327. package/src/components/toast/Toast.tsx +19 -5
  328. package/src/components/toast/ToastAction.tsx +17 -0
  329. package/src/components/toast/toast.scss +37 -0
  330. package/src/components/toggleGroup/ToggleGroup.stories.tsx +1 -1
  331. package/src/components/tooltip/TooltipWrapper.tsx +3 -1
  332. package/src/components/widget/Widget.stories.tsx +600 -0
  333. package/src/components/widget/Widget.test.tsx +263 -0
  334. package/src/components/widget/Widget.tsx +102 -0
  335. package/src/components/widget/WidgetBody.tsx +66 -0
  336. package/src/components/widget/WidgetContext.tsx +31 -0
  337. package/src/components/widget/WidgetHeader.tsx +155 -0
  338. package/src/components/widget/types.ts +47 -0
  339. package/src/components/widget/widget.scss +218 -0
  340. package/src/components/widgetCalendar/WidgetCalendar.stories.tsx +241 -0
  341. package/src/components/widgetCalendar/WidgetCalendar.test.tsx +137 -0
  342. package/src/components/widgetCalendar/WidgetCalendar.tsx +105 -0
  343. package/src/components/widgetCalendar/WidgetCalendarItem.tsx +105 -0
  344. package/src/components/widgetCalendar/widgetCalendar.scss +124 -0
  345. package/src/components/widgetFavourites/WidgetFavourites.stories.tsx +341 -0
  346. package/src/components/widgetFavourites/WidgetFavourites.test.tsx +127 -0
  347. package/src/components/widgetFavourites/WidgetFavourites.tsx +83 -0
  348. package/src/components/widgetFavourites/WidgetFavouritesItem.tsx +37 -0
  349. package/src/components/widgetFavourites/types.ts +26 -0
  350. package/src/components/widgetFavourites/widgetFavourites.scss +84 -0
  351. package/src/components/widgetNotifications/WidgetNotifications.stories.tsx +417 -0
  352. package/src/components/widgetNotifications/WidgetNotifications.test.tsx +152 -0
  353. package/src/components/widgetNotifications/WidgetNotifications.tsx +112 -0
  354. package/src/components/widgetNotifications/WidgetNotificationsItem.tsx +88 -0
  355. package/src/components/widgetNotifications/widgetNotifications.scss +186 -0
  356. package/src/docs/Contributing.mdx +1 -1
  357. package/src/index.scss +9 -1
  358. package/src/index.ts +22 -18
  359. package/src/tokens.scss +12 -2
  360. package/src/utils/favourites/favouriteConstants.test.ts +19 -0
  361. package/src/utils/favourites/favouriteConstants.ts +21 -0
  362. package/src/utils/hooks/useControllableBoolean.test.ts +48 -0
  363. package/dist/components/sidebarNav/SidebarNav.d.ts +0 -46
  364. package/dist/components/sidebarNav/SidebarNav.d.ts.map +0 -1
  365. package/dist/components/sidebarNav/SidebarNav.js +0 -102
  366. package/dist/components/sidebarNav/SidebarNav.js.map +0 -1
  367. package/dist/components/sidebarNav/SidebarNav.stories.d.ts +0 -61
  368. package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +0 -1
  369. package/dist/components/sidebarNav/SidebarNav.stories.js +0 -253
  370. package/dist/components/sidebarNav/SidebarNav.stories.js.map +0 -1
  371. package/dist/components/sidebarNav/SidebarNav.test.d.ts +0 -2
  372. package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +0 -1
  373. package/dist/components/sidebarNav/SidebarNav.test.js +0 -240
  374. package/dist/components/sidebarNav/SidebarNav.test.js.map +0 -1
  375. package/dist/components/sidebarNav/SidebarNavContext.d.ts +0 -13
  376. package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +0 -1
  377. package/dist/components/sidebarNav/SidebarNavContext.js +0 -15
  378. package/dist/components/sidebarNav/SidebarNavContext.js.map +0 -1
  379. package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +0 -1
  380. package/dist/components/sidebarNav/SidebarNavGroup.js +0 -16
  381. package/dist/components/sidebarNav/SidebarNavGroup.js.map +0 -1
  382. package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +0 -1
  383. package/dist/components/sidebarNav/SidebarNavItem.js +0 -44
  384. package/dist/components/sidebarNav/SidebarNavItem.js.map +0 -1
  385. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +0 -8
  386. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +0 -1
  387. package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +0 -1
  388. package/dist/components/sidebarNav/SidebarNavPanel.d.ts +0 -4
  389. package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +0 -1
  390. package/dist/components/sidebarNav/SidebarNavPanel.js +0 -9
  391. package/dist/components/sidebarNav/SidebarNavPanel.js.map +0 -1
  392. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +0 -10
  393. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +0 -1
  394. package/dist/components/sidebarNav/SidebarNavPanelNav.js +0 -21
  395. package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +0 -1
  396. package/dist/components/sidebarNav/SidebarNavRail.d.ts +0 -6
  397. package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +0 -1
  398. package/dist/components/sidebarNav/SidebarNavRail.js +0 -7
  399. package/dist/components/sidebarNav/SidebarNavRail.js.map +0 -1
  400. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +0 -10
  401. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +0 -1
  402. package/dist/components/sidebarNav/SidebarNavRailItem.js +0 -25
  403. package/dist/components/sidebarNav/SidebarNavRailItem.js.map +0 -1
  404. package/dist/components/sidebarNav/SidebarNavRailList.d.ts +0 -4
  405. package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +0 -1
  406. package/dist/components/sidebarNav/SidebarNavRailList.js +0 -7
  407. package/dist/components/sidebarNav/SidebarNavRailList.js.map +0 -1
  408. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +0 -6
  409. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +0 -1
  410. package/dist/components/sidebarNav/SidebarNavRailSlot.js +0 -7
  411. package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +0 -1
  412. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +0 -6
  413. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +0 -1
  414. package/dist/components/sidebarNav/SidebarNavSeparator.js +0 -8
  415. package/dist/components/sidebarNav/SidebarNavSeparator.js.map +0 -1
  416. package/dist/components/sidebarNav/SidebarNavTitle.d.ts +0 -4
  417. package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +0 -1
  418. package/dist/components/sidebarNav/SidebarNavTitle.js +0 -7
  419. package/dist/components/sidebarNav/SidebarNavTitle.js.map +0 -1
  420. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +0 -7
  421. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +0 -1
  422. package/dist/components/sidebarNav/SidebarNavTooltip.js.map +0 -1
  423. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +0 -8
  424. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +0 -1
  425. package/dist/components/sidebarNav/SidebarNavTrigger.js +0 -15
  426. package/dist/components/sidebarNav/SidebarNavTrigger.js.map +0 -1
  427. package/dist/components/sidebarNav/index.d.ts +0 -4
  428. package/dist/components/sidebarNav/index.d.ts.map +0 -1
  429. package/dist/components/sidebarNav/index.js +0 -3
  430. package/dist/components/sidebarNav/index.js.map +0 -1
  431. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +0 -4
  432. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +0 -1
  433. package/dist/components/sidebarNav/resolvePanelItemProps.js.map +0 -1
  434. package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +0 -1
  435. package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +0 -1
  436. package/dist/components/sidebarNav/types.d.ts +0 -100
  437. package/dist/components/sidebarNav/types.d.ts.map +0 -1
  438. package/dist/components/sidebarNav/types.js +0 -4
  439. package/dist/components/sidebarNav/types.js.map +0 -1
  440. package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +0 -1
  441. package/dist/components/sidebarNav/useControllableBoolean.js.map +0 -1
  442. package/src/components/sidebarNav/SidebarNav.stories.tsx +0 -484
  443. package/src/components/sidebarNav/SidebarNav.test.tsx +0 -611
  444. package/src/components/sidebarNav/SidebarNav.tsx +0 -230
  445. package/src/components/sidebarNav/SidebarNavContext.tsx +0 -28
  446. package/src/components/sidebarNav/SidebarNavItem.tsx +0 -162
  447. package/src/components/sidebarNav/SidebarNavPanel.tsx +0 -20
  448. package/src/components/sidebarNav/SidebarNavPanelNav.tsx +0 -55
  449. package/src/components/sidebarNav/SidebarNavRail.tsx +0 -20
  450. package/src/components/sidebarNav/SidebarNavRailItem.tsx +0 -83
  451. package/src/components/sidebarNav/SidebarNavRailList.tsx +0 -11
  452. package/src/components/sidebarNav/SidebarNavRailSlot.tsx +0 -15
  453. package/src/components/sidebarNav/SidebarNavSeparator.tsx +0 -19
  454. package/src/components/sidebarNav/SidebarNavTitle.tsx +0 -13
  455. package/src/components/sidebarNav/SidebarNavTrigger.tsx +0 -52
  456. package/src/components/sidebarNav/index.ts +0 -6
  457. package/src/components/sidebarNav/types.ts +0 -126
  458. /package/dist/components/{sidebarNav → sideNavigation}/resolvePanelItemProps.test.d.ts +0 -0
  459. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.d.ts +0 -0
  460. /package/dist/{components/sidebarNav → utils/hooks}/useControllableBoolean.js +0 -0
  461. /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 = ({ text, checkbox, onclick, initialValue = false }) => {
6
- const [checked, setChecked] = useState(initialValue);
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
- setChecked(prev => !prev);
19
+ toggle();
9
20
  };
10
21
  const handleCheckboxClick = (event) => {
11
22
  event.stopPropagation();
12
- setChecked(prev => !prev);
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;AAS5C,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK,EAAa,EAAE,EAAE;IACnF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAErD,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAAuB,EAAE,EAAE;QACtD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvB,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"}
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: ({ text, checkbox, onclick, initialValue }: {
6
+ component: (props: {
7
7
  text: string;
8
8
  initialValue?: boolean;
9
9
  checkbox?: boolean;
10
- onclick?: (checked: boolean) => void;
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
- onclick: {
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;AAgIjC,iBAAS,YAAY,4CAmBpB;AAMD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DmB,CAAC;AAE9B,eAAe,IAAI,CAAC;AAIpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAwTnC,eAAO,MAAM,OAAO,EAAE,KAWrB,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"}
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" onclick={handleSave} />',
42
+ '<Pill text="Save student" onChange={handleSave} />',
43
43
  '',
44
44
  '// GOOD — Pill used as an auto-apply filter',
45
- '<Pill text="Year 7" onclick={checked => onFilterChange("year7", checked)} />',
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
- '### Quirks to know before shipping',
62
+ '### Controlled vs uncontrolled',
63
63
  '',
64
- '**`onclick` fires on mount, not only on user interaction.** The implementation uses',
65
- '`useEffect(() => { if (onclick) onclick(checked); }, [checked, onclick])`, which means React',
66
- 'runs it after the first render. Your handler will receive the initial `initialValue` (default',
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
- 'const hasMounted = useRef(false);',
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
- '**Pill is uncontrolled there is no `value` prop.** Once mounted, its state is private.',
84
- 'To reset a pill from outside (e.g. a "Clear all filters" button), change its `key` prop to',
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 [resetKey, setResetKey] = useState(0);',
76
+ 'const [active, setActive] = useState(false);',
89
77
  '',
90
- '<Pill key={resetKey} text="Autumn term" onclick={handleToggle} />',
91
- '<Button type="button" onClick={() => setResetKey(k => k + 1)}>Clear filters</Button>',
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" onclick={handleToggle} />',
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
- '**Note:** when `initialValue={true}`, the `onclick` callback fires on mount with `true`.',
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
- onclick: {
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\'s checked state changes.',
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: `onclick={checked => onFilterChange("year7", checked)}`.',
185
- '**Quirk:** also fires on mount with the current `initialValue`. Guard with a `useRef`',
186
- 'if you need to suppress the mount-time call. See the component description for the pattern.',
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, onclick: checked => setActive(checked ? year : null) }, 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, onclick: 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(', ')] }))] }));
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, onclick: handleAllClick }), subjects.map(subject => (_jsx(Pill, { text: subject, initialValue: activeFilters.has(subject), onclick: checked => handleSubjectClick(subject, checked) }, subject)))] })] }));
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
- onclick: fn(),
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 `onclick` callback fires into the Actions panel on every state change.');
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
- onclick={checked => setActive(checked ? year : null)}
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
- onclick={checked => toggle(status, checked)}
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} onclick={handleAllClick} />
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
- onclick={checked => handleSubjectClick(subject, checked)}
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