@arbor-education/design-system.components 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +27 -0
  4. package/README.md +8 -0
  5. package/component-library.md +144 -13
  6. package/dist/components/articleCard/ArticleCard.stories.d.ts +137 -11
  7. package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -1
  8. package/dist/components/articleCard/ArticleCard.stories.js +358 -91
  9. package/dist/components/articleCard/ArticleCard.stories.js.map +1 -1
  10. package/dist/components/avatar/Avatar.stories.d.ts +6 -6
  11. package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
  12. package/dist/components/avatar/Avatar.stories.js +393 -49
  13. package/dist/components/avatar/Avatar.stories.js.map +1 -1
  14. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts +9 -7
  15. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
  16. package/dist/components/avatarGroup/AvatarGroup.stories.js +688 -65
  17. package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
  18. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  19. package/dist/components/banner/Banner.stories.js +7 -3
  20. package/dist/components/banner/Banner.stories.js.map +1 -1
  21. package/dist/components/card/Card.stories.d.ts +105 -4
  22. package/dist/components/card/Card.stories.d.ts.map +1 -1
  23. package/dist/components/card/Card.stories.js +336 -18
  24. package/dist/components/card/Card.stories.js.map +1 -1
  25. package/dist/components/combobox/Combobox.stories.d.ts +134 -21
  26. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
  27. package/dist/components/combobox/Combobox.stories.js +676 -175
  28. package/dist/components/combobox/Combobox.stories.js.map +1 -1
  29. package/dist/components/datePicker/DatePicker.stories.d.ts +119 -27
  30. package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
  31. package/dist/components/datePicker/DatePicker.stories.js +575 -47
  32. package/dist/components/datePicker/DatePicker.stories.js.map +1 -1
  33. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts +155 -39
  34. package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts.map +1 -1
  35. package/dist/components/dateTimePicker/DateTimePicker.stories.js +674 -103
  36. package/dist/components/dateTimePicker/DateTimePicker.stories.js.map +1 -1
  37. package/dist/components/editableText/EditableText.stories.d.ts +53 -12
  38. package/dist/components/editableText/EditableText.stories.d.ts.map +1 -1
  39. package/dist/components/editableText/EditableText.stories.js +401 -64
  40. package/dist/components/editableText/EditableText.stories.js.map +1 -1
  41. package/dist/components/formField/FormField.d.ts +4 -0
  42. package/dist/components/formField/FormField.d.ts.map +1 -1
  43. package/dist/components/formField/FormField.js +2 -1
  44. package/dist/components/formField/FormField.js.map +1 -1
  45. package/dist/components/formField/FormField.test.js +5 -0
  46. package/dist/components/formField/FormField.test.js.map +1 -1
  47. package/dist/components/formField/fieldset/Fieldset.stories.d.ts +56 -4
  48. package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
  49. package/dist/components/formField/fieldset/Fieldset.stories.js +534 -28
  50. package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
  51. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts +3 -1
  52. package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts.map +1 -1
  53. package/dist/components/formField/inputs/checkbox/CheckboxInput.js +1 -1
  54. package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -1
  55. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts +95 -1
  56. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts.map +1 -1
  57. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js +386 -9
  58. package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js.map +1 -1
  59. package/dist/components/formField/inputs/number/NumberInput.d.ts.map +1 -1
  60. package/dist/components/formField/inputs/number/NumberInput.js +14 -2
  61. package/dist/components/formField/inputs/number/NumberInput.js.map +1 -1
  62. package/dist/components/formField/inputs/number/NumberInput.test.js +21 -0
  63. package/dist/components/formField/inputs/number/NumberInput.test.js.map +1 -1
  64. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
  65. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  66. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  67. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  68. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
  69. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  70. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
  71. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  72. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
  73. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  74. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
  75. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
  76. package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
  77. package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
  78. package/dist/components/formField/label/Label.stories.d.ts +54 -5
  79. package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
  80. package/dist/components/formField/label/Label.stories.js +238 -4
  81. package/dist/components/formField/label/Label.stories.js.map +1 -1
  82. package/dist/components/icoText/IcoText.stories.d.ts +32 -6
  83. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
  84. package/dist/components/icoText/IcoText.stories.js +309 -14
  85. package/dist/components/icoText/IcoText.stories.js.map +1 -1
  86. package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
  87. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
  88. package/dist/components/kpiCard/KPICard.stories.js +354 -10
  89. package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
  90. package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
  91. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
  92. package/dist/components/kvpList/KVPList.stories.js +403 -10
  93. package/dist/components/kvpList/KVPList.stories.js.map +1 -1
  94. package/dist/components/modal/Modal.stories.d.ts +113 -9
  95. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  96. package/dist/components/modal/Modal.stories.js +633 -13
  97. package/dist/components/modal/Modal.stories.js.map +1 -1
  98. package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
  99. package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
  100. package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
  101. package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
  102. package/dist/components/pill/Pill.d.ts.map +1 -1
  103. package/dist/components/pill/Pill.js +1 -1
  104. package/dist/components/pill/Pill.js.map +1 -1
  105. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  106. package/dist/components/pill/Pill.stories.js +11 -13
  107. package/dist/components/pill/Pill.stories.js.map +1 -1
  108. package/dist/components/row/Row.stories.d.ts +1 -2
  109. package/dist/components/row/Row.stories.d.ts.map +1 -1
  110. package/dist/components/row/Row.stories.js +360 -50
  111. package/dist/components/row/Row.stories.js.map +1 -1
  112. package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
  113. package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
  114. package/dist/components/searchBar/SearchBar.stories.js +428 -36
  115. package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
  116. package/dist/components/section/Section.stories.d.ts +11 -41
  117. package/dist/components/section/Section.stories.d.ts.map +1 -1
  118. package/dist/components/section/Section.stories.js +494 -56
  119. package/dist/components/section/Section.stories.js.map +1 -1
  120. package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
  121. package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
  122. package/dist/components/singleUser/SingleUser.stories.js +303 -31
  123. package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
  124. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
  125. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
  126. package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
  127. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  128. package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
  129. package/dist/components/table/DSDefaultColDef.js +4 -3
  130. package/dist/components/table/DSDefaultColDef.js.map +1 -1
  131. package/dist/components/table/Table.d.ts +7 -1
  132. package/dist/components/table/Table.d.ts.map +1 -1
  133. package/dist/components/table/Table.js +12 -5
  134. package/dist/components/table/Table.js.map +1 -1
  135. package/dist/components/table/Table.stories.d.ts +3 -0
  136. package/dist/components/table/Table.stories.d.ts.map +1 -1
  137. package/dist/components/table/Table.stories.js +445 -3
  138. package/dist/components/table/Table.stories.js.map +1 -1
  139. package/dist/components/table/Table.test.js +184 -0
  140. package/dist/components/table/Table.test.js.map +1 -1
  141. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  142. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  143. package/dist/components/table/TableFooter.stories.js +137 -0
  144. package/dist/components/table/TableFooter.stories.js.map +1 -0
  145. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  146. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  147. package/dist/components/table/TableHeader.stories.js +176 -0
  148. package/dist/components/table/TableHeader.stories.js.map +1 -0
  149. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  150. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  151. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  152. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  153. package/dist/components/table/cellEditors/NumberCellEditor.d.ts +13 -0
  154. package/dist/components/table/cellEditors/NumberCellEditor.d.ts.map +1 -0
  155. package/dist/components/table/cellEditors/NumberCellEditor.js +35 -0
  156. package/dist/components/table/cellEditors/NumberCellEditor.js.map +1 -0
  157. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  158. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  159. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  160. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  161. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  162. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  163. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  164. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  165. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  166. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  167. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  168. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  169. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  170. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  171. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  172. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  173. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  174. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  175. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  176. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  177. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  178. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  179. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  180. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  181. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  182. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  183. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  184. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  185. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  186. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  187. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  188. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  189. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  190. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  191. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  192. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  193. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  194. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  195. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  196. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  197. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  198. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  199. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  200. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  201. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  202. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  203. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  204. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  205. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  206. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  207. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  208. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  209. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  210. package/dist/components/tabs/Tabs.stories.js +398 -22
  211. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  212. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  213. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  214. package/dist/components/tabs/TabsItem.stories.js +61 -9
  215. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  216. package/dist/components/toast/Toast.stories.d.ts +103 -10
  217. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  218. package/dist/components/toast/Toast.stories.js +409 -47
  219. package/dist/components/toast/Toast.stories.js.map +1 -1
  220. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  221. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  222. package/dist/components/toggle/Toggle.stories.js +311 -122
  223. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  224. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  225. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  226. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  227. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  228. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  229. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  230. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  231. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  232. package/dist/index.css +27 -0
  233. package/dist/index.css.map +1 -1
  234. package/dist/index.d.ts +3 -2
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +3 -2
  237. package/dist/index.js.map +1 -1
  238. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  239. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  240. package/dist/utils/PopupParentContext.stories.js +266 -0
  241. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  242. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  243. package/dist/utils/getDefaultPopupParent.js +6 -0
  244. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  245. package/package.json +1 -1
  246. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  247. package/src/components/avatar/Avatar.stories.tsx +504 -59
  248. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  249. package/src/components/banner/Banner.stories.tsx +7 -3
  250. package/src/components/card/Card.stories.tsx +466 -36
  251. package/src/components/combobox/Combobox.stories.tsx +867 -260
  252. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  253. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  254. package/src/components/editableText/EditableText.stories.tsx +567 -91
  255. package/src/components/formField/FormField.test.tsx +6 -0
  256. package/src/components/formField/FormField.tsx +5 -0
  257. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  258. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  259. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  260. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  261. package/src/components/formField/inputs/number/NumberInput.test.tsx +28 -0
  262. package/src/components/formField/inputs/number/NumberInput.tsx +15 -0
  263. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  264. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  265. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  266. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  267. package/src/components/formField/label/Label.stories.tsx +317 -8
  268. package/src/components/icoText/IcoText.stories.tsx +442 -31
  269. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  270. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  271. package/src/components/modal/Modal.stories.tsx +963 -26
  272. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  273. package/src/components/pill/Pill.stories.tsx +11 -13
  274. package/src/components/pill/Pill.tsx +1 -0
  275. package/src/components/row/Row.stories.tsx +474 -58
  276. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  277. package/src/components/section/Section.stories.tsx +723 -70
  278. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  279. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  280. package/src/components/table/DSDefaultColDef.ts +25 -5
  281. package/src/components/table/Table.stories.tsx +504 -3
  282. package/src/components/table/Table.test.tsx +255 -0
  283. package/src/components/table/Table.tsx +15 -2
  284. package/src/components/table/TableFooter.stories.tsx +196 -0
  285. package/src/components/table/TableHeader.stories.tsx +251 -0
  286. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  287. package/src/components/table/cellEditors/NumberCellEditor.tsx +83 -0
  288. package/src/components/table/cellEditors/numberCellEditor.scss +11 -0
  289. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  290. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  291. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  292. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  293. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  294. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  295. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  296. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  297. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  298. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  299. package/src/components/table/table.scss +11 -0
  300. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  301. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  302. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  303. package/src/components/tabs/Tabs.stories.tsx +540 -60
  304. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  305. package/src/components/toast/Toast.stories.tsx +539 -77
  306. package/src/components/toggle/Toggle.stories.tsx +371 -135
  307. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  308. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  309. package/src/docs/Contributing.mdx +241 -0
  310. package/src/docs/UsingComponents.mdx +93 -0
  311. package/src/docs/Welcome.mdx +68 -0
  312. package/src/global.scss +7 -0
  313. package/src/index.scss +1 -0
  314. package/src/index.ts +3 -2
  315. package/src/utils/PopupParentContext.stories.tsx +367 -0
  316. package/src/utils/getDefaultPopupParent.ts +6 -0
  317. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  318. package/.ralph/storybook-upgrade/prd.json +0 -777
  319. package/.ralph/storybook-upgrade/progress.md +0 -342
  320. package/src/components/table/TableWIP.mdx +0 -3
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: write-stories
3
- description: Write comprehensive, autodocs-powered Storybook stories for Arbor design system components. Fetches designer guidance from Confluence, enlists the full Golden Girls team, and produces BOMBASS documentation that teaches consumers exactly how and when to use each component.
3
+ description: Write comprehensive, production-quality Storybook stories for Arbor design system components. Fetches designer guidance from Confluence, enlists the full Golden Girls team, and produces BOMBASS documentation that teaches consumers exactly how and when to use each component.
4
4
  ---
5
5
 
6
6
  # Write Storybook Stories
@@ -11,11 +11,11 @@ AROOOOO HUNNI!! 🐺💖 Time to write the most EXCELLENT, most BODACIOUS Storyb
11
11
 
12
12
  Write **comprehensive, production-quality Storybook stories** for a given Arbor design system component that:
13
13
 
14
- - ✅ Enable `autodocs` so consumers get full generated API documentation
15
- - ✅ Include a rich component-level description (what it is, when to use, when NOT to use, a11y notes, design guidance)
16
- - ✅ Define `argTypes` for all key props so the **Props** table is always populated
14
+ - ✅ Use the **mandatory custom docs.page format** (see below — NOT plain autodocs)
15
+ - ✅ Include a custom `DocsPage` component with the correct TOC structure
16
+ - ✅ Define `argTypes` for all key props so the **Controls** panel is always populated
17
17
  - ✅ Cover every variant, size, and state the component supports
18
- - ✅ Include per-story descriptions explaining what each story demonstrates and why you'd use it
18
+ - ✅ Include per-story descriptions via the `withDescription` helper
19
19
  - ✅ Incorporate designer guidance fetched directly from Confluence
20
20
  - ✅ Show interactive examples for components with complex behaviour (modals, dropdowns, etc.)
21
21
  - ✅ Link related components using Storybook story paths so consumers can navigate the docs
@@ -23,11 +23,16 @@ Write **comprehensive, production-quality Storybook stories** for a given Arbor
23
23
 
24
24
  **Output**: An updated (or new) `.stories.tsx` file at the component's existing location.
25
25
 
26
- > **Note on the global docs template**: A custom docs template is configured at `.storybook/DocsTemplate.tsx` and wired up in `.storybook/preview.ts`. It automatically renders: `Title → Subtitle → Description → Primary story → **Props (Controls — interactive)** → Stories`. The `Controls` block drives the Primary story canvas in real time — changing a prop value instantly updates what you see above. A Table of Contents panel is also enabled globally, picking up `h2`/`h3` headings from the Description and any `Subheading` blocks.
26
+ > **⚠️ MANDATORY DOCS FORMAT READ THIS BEFORE DOING ANYTHING ELSE**
27
27
  >
28
- > **For simple components**: you do NOT need to do anything special — these apply automatically to every component with `tags: ['autodocs']`. Your job is to make sure `argTypes` is populated and the Default story uses `render: (args) => <Component {...args} />` so controls are wired up.
28
+ > ALL stories in this codebase use a **custom `docs.page` component** NOT the plain autodocs format.
29
+ > The canonical reference file is `src/components/progress/Progress.stories.tsx`. READ IT before writing any stories.
29
30
  >
30
- > **For compound components** (e.g. Dropdown, Modal, Tabs — anything with sub-components): override `docs.page` in the story meta with a custom React component that adds `<ArgTypes of={SubComponent} />` for each sub-component, each preceded by a `<Subheading>`. Each `Subheading` also appears in the TOC. See the Compound Components section below for the exact pattern.
31
+ > The required page structure (TOC sections the user expects to see):
32
+ > **Interactive example → Usage guidance → Developer notes → Examples → Related components**
33
+ >
34
+ > Do NOT use `parameters.docs.description.component` as a single blob. Do NOT omit the `docs.page` override.
35
+ > Every single stories file must have the `XxxDocsPage` function and `docs: { page: XxxDocsPage }` in meta.
31
36
 
32
37
  ---
33
38
 
@@ -113,7 +118,7 @@ Look up designer guidance for this component using the Atlassian MCP tools. Use
113
118
 
114
119
  ### Step 4 — Read the Component Library Manifest
115
120
 
116
- Read `component-library.md` (project root) for a comprehensive overview of the component's role in the design system, use cases, and known relationships to other components.
121
+ Read `.claude/component-library.md` for a comprehensive overview of the component's role in the design system, use cases, and known relationships to other components.
117
122
 
118
123
  If it contains guidance about when to use this component vs. alternatives, note it — it goes into the story description.
119
124
 
@@ -212,247 +217,149 @@ TARGET FILE PATH: [src/components/{componentName}/{ComponentName}.stories.tsx]
212
217
 
213
218
  REQUIREMENTS — please follow ALL of these:
214
219
 
215
- 1. IMPORT: Always use `import type { Meta, StoryObj } from '@storybook/react-vite';`
216
-
217
- 2. META TAGS: Always include `tags: ['autodocs']` in the meta object
218
-
219
- 3. COMPONENT DESCRIPTION: Include a rich description in meta.parameters.docs.description.component that covers:
220
- - What the component is and what it does (1-2 sentences)
221
- - WHEN TO USE IT (specific scenarios with examples from Confluence design guidance)
222
- - WHEN NOT TO USE IT (e.g. 'Use Modal instead when you need to block the user', 'Use Toast instead for transient messages')
223
- - Any content/usage guidelines from the designers (e.g. 'Keep text to 1-2 lines', 'Always include an icon', etc.)
224
- - Accessibility notes (keyboard behaviour, aria attributes, screen reader text)
225
- - A note about related components (if any)
226
- - **Radix UI link** (if applicable — see rule below)
227
-
228
- **RADIX UI DOCS LINK:** If the component wraps a Radix UI primitive (check the component source for `@radix-ui` imports), add a "Built on Radix UI" note to the description with a link to the relevant Radix docs page. This is especially important when the component passes through Radix props (e.g. `...rest` spread onto a Radix root) — consumers need to know where to find the full prop reference for the underlying primitive. Format:
229
- ```markdown
230
- > **Built on [Radix UI ComponentName](https://www.radix-ui.com/primitives/docs/components/component-name).**
231
- > Props not listed above are passed through to the Radix primitive — see the Radix docs for the full API.
220
+ **⚠️ BEFORE YOU WRITE A SINGLE LINE READ `src/components/progress/Progress.stories.tsx`.**
221
+ That is the canonical reference. Every stories file in this codebase follows that format. No exceptions.
222
+
223
+ 1. STORYBOOK IMPORT:
224
+ ```tsx
225
+ import type { Meta, StoryObj } from '@storybook/react-vite';
226
+ import {
227
+ Controls,
228
+ Heading as DocHeading,
229
+ Markdown,
230
+ Primary as DocPrimary,
231
+ Stories,
232
+ Subtitle,
233
+ Title,
234
+ } from '@storybook/addon-docs/blocks';
232
235
  ```
233
- Only include the "Props not listed above" sentence when the component actually does prop pass-through. If the component only uses Radix internally without exposing its props, just link to Radix for context (e.g. so consumers understand keyboard/focus behaviour).
234
-
235
- Format it in markdown, keep it warm and informative. Consumers should finish reading it and know EXACTLY what this component is for.
236
-
237
- 4. STORY DESCRIPTIONS: Every single story MUST have a description in parameters.docs.description.story that explains:
238
- - What this story demonstrates
239
- - When you'd choose this variant or configuration in a real product
240
-
241
- Use the withDescription helper pattern from Badge.stories.tsx (see below).
242
-
243
- 5. COVER EVERY VARIANT/STATE: Write a dedicated story for each variant, size, and significant state:
244
- - All enum values (e.g., every Banner level, every Button variant)
245
- - Disabled state
246
- - Error state (if applicable)
247
- - Loading state (if applicable)
248
- - With and without optional content (e.g., icon, title, button)
249
- - Edge cases (very long text, empty state, etc.)
250
-
251
- 6. COMPOSITE STORIES: Include at least one 'AllVariants' or 'Overview' story using a render function that shows all variants side-by-side. This helps consumers see the full palette at a glance.
252
-
253
- 7. INTERACTIVE STORIES: For components with complex behaviour (modals, dropdowns, controlled inputs), use render functions with useState to show real interactive behaviour.
254
-
255
- 8. CONTENT GUIDELINES STORY: If Confluence specifies content length limits or copy guidelines (like Toast: max 2 lines, ideally 1), include a story that demonstrates both the ideal case AND what NOT to do (using a 'DoNotUse' or 'ContentGuidelines' story with inline comments).
256
-
257
- 9. ARGTYPE DESCRIPTIONS: `argTypes` is MANDATORY and must be defined in the meta for every key prop. Each entry needs:
258
- - `description`: plain English explanation of the prop's purpose
259
- - `control`: the right control type (`'boolean'`, `'select'`, `'text'`, `false` to disable)
260
- - `table.type.summary`: the TypeScript type as a string
261
- - `table.defaultValue.summary`: the default value as a string
262
- - `options`: array of allowed values for `control: 'select'` props
263
-
264
- This is what populates the **Props (Controls)** section in the global docs template. If `argTypes` is empty, consumers see an empty table. Every important prop must be documented. For compound components, add a `children` entry with a note pointing to sub-component prop documentation in the stories below.
265
-
266
- 10. INTERACTIVE DEFAULT STORY: The `Default` story MUST use `render: (args) => <Component {...args} />` and declare `args` with sensible defaults. This is what wires the `Controls` block to the live canvas — without this, controls exist in the table but don't change anything on screen.
267
-
268
- Do **NOT** add an explicit `source.code` block to the Default story — Storybook auto-generates the code from the current args so the code panel updates live when the user tweaks controls. This is the intended UX. If Storybook uses the wrong internal name (e.g. `BannerRoot` instead of `Banner` because the component uses `Object.assign`), use `source.transform` to patch the name without breaking live updates:
269
- ```tsx
270
- parameters: {
271
- docs: {
272
- source: {
273
- transform: (src: string) => src.replace(/InternalName/g, 'ExportedName'),
274
- },
275
- },
276
- },
277
- ```
278
236
 
279
- 11. SOURCE CODE FORMAT ALL stories with `parameters.docs.source.code` MUST follow the Radix UI convention:
280
- - Wrap JSX in a **named function component** never bare JSX, never an anonymous arrow
281
- - Add `export default ComponentNameExample;` at the bottom
282
- - Name format: `{StoryName}Example` (e.g. story `WithTitle` `BannerWithTitleExample`)
283
- - Import only what is used
284
-
285
- ```tsx
286
- parameters: {
287
- docs: {
288
- source: {
289
- language: 'tsx',
290
- code: `
291
- import { Banner } from '@arbor-education/design-system.components';
292
-
293
- function BannerInfoExample() {
294
- return (
295
- <Banner
296
- level={Banner.Level.INFO}
297
- text="Your session will expire in 10 minutes."
298
- />
299
- );
300
- }
301
-
302
- export default BannerInfoExample;
303
- `.trim(),
304
- },
305
- },
306
- },
307
- ```
237
+ 2. CONTENT STRINGSdefine these as separate named consts ABOVE everything else:
238
+ - `DESCRIPTION_INTRO` 1-2 sentence intro + Radix UI link if applicable (blockquote format)
239
+ - `USAGE_GUIDANCE` — `### When to use` bullets + `---` + `### When NOT to use` table
240
+ - `DEVELOPER_NOTES` `### Critical usage patterns` + `---` + `### Accessibility` + `---` + `### TypeScript types` code block
241
+ - `RELATED_COMPONENTS` `## Related components` with component links
242
+ - `PROPS_INTRO` — one sentence: `'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.'`
243
+
244
+ 3. CUSTOM DOCS PAGE — define a named function component ABOVE the meta:
245
+ ```tsx
246
+ function ComponentNameDocsPage() {
247
+ return (
248
+ <>
249
+ <Title />
250
+ <Subtitle />
251
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
252
+ <DocHeading>Interactive example</DocHeading>
253
+ <Markdown>{PROPS_INTRO}</Markdown>
254
+ <DocPrimary />
255
+ <Controls />
256
+ <DocHeading>Usage guidance</DocHeading>
257
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
258
+ <DocHeading>Developer notes</DocHeading>
259
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
260
+ <DocHeading>Examples</DocHeading>
261
+ <Stories title="" />
262
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
263
+ </>
264
+ );
265
+ }
266
+ ```
267
+ This is NOT optional. This is what produces the correct TOC.
268
+
269
+ 4. META — use `satisfies Meta<typeof ComponentName>` and wire the docs page:
270
+ ```tsx
271
+ const meta = {
272
+ title: 'Components/ComponentName',
273
+ component: ComponentName,
274
+ tags: ['autodocs'],
275
+ parameters: {
276
+ layout: 'padded',
277
+ docs: { page: ComponentNameDocsPage },
278
+ },
279
+ argTypes: { /* all key props */ },
280
+ } satisfies Meta<typeof ComponentName>;
281
+ ```
282
+ Do NOT put `description.component` in parameters.docs — the content is rendered by the Markdown blocks in the DocsPage function.
283
+
284
+ 5. ARGTYPES — MANDATORY for every key prop:
285
+ - `description`: plain English (use array of strings joined with space for long descriptions)
286
+ - `control`: appropriate control type or `false` to disable
287
+ - `table.type.summary`: TypeScript type as string
288
+ - `table.defaultValue.summary`: default value as string
289
+ - For callbacks: `action: 'callbackName'`, `control: false`
290
+
291
+ 6. STORY TYPE — prefer `type Story = StoryObj<typeof meta>` over `StoryObj<typeof ComponentName>`. The `typeof meta` form is stricter: it picks up `args` and `argTypes` for better type inference.
292
+
293
+ 7. WITHDESCRPTION HELPER — include verbatim (copy from Progress.stories.tsx):
294
+ ```tsx
295
+ const withDescription = (story: Story, description: string): Story => ({
296
+ ...story,
297
+ parameters: {
298
+ ...story.parameters,
299
+ docs: { ...story.parameters?.docs, description: { story: description } },
300
+ },
301
+ });
302
+ ```
308
303
 
309
- This applies to: template stories (`render: SomeTemplate`), inline render stories (`render: () => (...)`), AND the Default story. ALL stories need this treatment. Bare `<Component ... />` without a wrapper is not valid standalone code.
310
-
311
- 12. RELATED COMPONENTS ORDERING: Related components must appear at the **very bottom** of the docs page, AFTER Stories. It's the last thing a consumer reaches for — the hierarchy of need is: What is it → Primary canvas → Props → Stories → Related components. The global `DocsTemplate` renders the description BEFORE the Primary story, so if "## Related components" is inside the description it will appear near the top of the page, which is wrong.
312
-
313
- **For simple components**, the global `DocsTemplate` renders `parameters.docs.relatedComponents` as a Markdown block at the very bottom of the page automatically. You do NOT need a custom `docs.page`. Just split the related components out of the description into its own parameter:
314
-
315
- ```tsx
316
- const COMPONENT_DESCRIPTION = [
317
- // main markdown: intro, when to use, when not, design guidance, gotchas, accessibility
318
- // DO NOT include "## Related components" here
319
- ].join('\n');
320
-
321
- const RELATED_COMPONENTS = [
322
- '## Related components',
323
- '',
324
- '[ComponentA](?path=/docs/components-a--docs) · [ComponentB](?path=/docs/components-b--docs)',
325
- ].join('\n');
326
-
327
- const meta = {
328
- title: 'Components/ComponentName',
329
- component: ComponentName,
330
- tags: ['autodocs'],
331
- parameters: {
332
- docs: {
333
- description: { component: COMPONENT_DESCRIPTION },
334
- relatedComponents: RELATED_COMPONENTS,
335
- },
336
- },
337
- argTypes: { /* ... */ },
338
- };
339
- ```
304
+ 8. NAMED TEMPLATE COMPONENTS for ALL stateful or complex stories, define a named function component BEFORE the story exports. No inline `() => {}` with useState. Follow the Progress.stories.tsx pattern exactly:
305
+ ```tsx
306
+ const MyStoryTemplate = () => {
307
+ const [state, setState] = useState(...);
308
+ return <Component ... />;
309
+ };
310
+ ```
311
+
312
+ 9. ALL STORIES use `withDescription(storyObject, 'description')`:
313
+ - `Default` story: `args` + `render: args => <Component {...args} />` — this wires Controls
314
+ - All other stories: `render: TemplateComponent` or `render: args => <Wrapper><Component {...args} /></Wrapper>`
315
+ - Non-default stories include `parameters.controls: { disable: true }` and `parameters.docs.source.code` with a named function component + `export default`
316
+
317
+ 10. SOURCE CODE — CRITICAL DISTINCTION:
318
+ - **Default/interactive story**: do NOT add `source.code`. Let Storybook auto-generate from current args so the code panel updates live when controls change. This is the intended UX.
319
+ - **All other stories** (template-based, inline renders, stateful): use explicit `source.code` with a named function + `export default`.
320
+
321
+ For `Object.assign` components (Banner, AvatarGroup) where Storybook picks up the internal function name, use `source.transform` on the Default story to rename without breaking live updates:
322
+ ```tsx
323
+ parameters: {
324
+ docs: {
325
+ source: {
326
+ transform: (src: string) => src.replace(/BannerRoot/g, 'Banner'),
327
+ },
328
+ },
329
+ },
330
+ ```
340
331
 
341
- The global template picks up `parameters.docs.relatedComponents` via `useOf('meta')` and renders it as a final markdown block after `<Stories />`. No other wiring required.
342
-
343
- **Props is a Heading (h2), not a Subheading (h3)**: the global template uses `<Heading>Props</Heading>` so Props sits as a TOC sibling of the description's h2 sections rather than nested under the last h2 in the description.
344
-
345
- 12. COMPOUND COMPONENTS — CUSTOM DOCS PAGE: If the component is a compound component (exposes sub-components as static properties, e.g. `Dropdown.Trigger`, `Dropdown.Content`, `Modal.Header`), you MUST:
346
- a. Import the doc blocks at the top of the stories file:
347
- ```tsx
348
- import { ArgTypes, Controls, Description, Primary, Stories, Subheading, Subtitle, Title } from '@storybook/addon-docs/blocks';
349
- ```
350
- b. Import each sub-component directly (not from the root barrel, but from their own files):
351
- ```tsx
352
- import { DropdownTrigger } from './DropdownTrigger';
353
- import { DropdownContent } from './DropdownContent';
354
- ```
355
- c. Use the SAME string structure as simple components — `DESCRIPTION_INTRO` (1–2 sentences ONLY, no headings), `USAGE_GUIDANCE` (When to use, When NOT to use, Compound component API), `DEVELOPER_NOTES` (Critical gotchas, Accessibility), `RELATED_COMPONENTS`. Do NOT use a `DESCRIPTION_OUTRO` — that pattern is deprecated. The DocsPage function renders them in order, with the Props reference tables interleaved between the interactive canvas and Usage guidance sections.
356
-
357
- d. Define a named docs page function ABOVE the meta. Use `Markdown` blocks (not `<Description />`) to render the split content:
358
- ```tsx
359
- // Import Markdown alongside the other blocks:
360
- import { ArgTypes, Controls, Heading, Markdown, Primary, Stories, Subheading, Subtitle, Title } from '@storybook/addon-docs/blocks';
361
-
362
- function ComponentDocsPage() {
363
- return (
364
- <>
365
- <Title />
366
- <Subtitle />
367
- <Markdown>{DESCRIPTION_INTRO}</Markdown>
368
- <Primary />
369
- <Heading>Props reference</Heading>
370
- <Subheading>Root props (ComponentName)</Subheading>
371
- <Controls />
372
- <Subheading>Component.SubA props</Subheading>
373
- <ArgTypes of={SubComponentA} />
374
- <Subheading>Component.SubB props</Subheading>
375
- <ArgTypes of={SubComponentB} />
376
- <Markdown>{DESCRIPTION_OUTRO}</Markdown>
377
- <Stories />
378
- </>
379
- );
380
- }
381
- ```
382
- **Page order this achieves**: intro → primary story → props reference → critical notes + accessibility + related components → all stories. Related components is always last.
383
-
384
- **IMPORTANT — TOC nesting fix**: `Subheading` renders as h3. The description uses `##` (h2). Without `<Heading>Props reference</Heading>`, the TOC nests all Subheadings under the last h2 in the intro (e.g. "Compound component API"). The `Heading` block (h2) gives the props sections their own TOC parent. Always include it.
385
-
386
- **Do NOT include `description.component` in meta.parameters.docs** when using `Markdown` blocks — the content is rendered by the blocks directly, so a separate `description.component` is redundant.
387
- d. Set `docs.page` in the meta:
388
- ```tsx
389
- parameters: {
390
- docs: {
391
- page: ComponentDocsPage,
392
- description: { component: COMPONENT_DESCRIPTION },
393
- },
332
+ Non-default SOURCE CODE FORMAT:
333
+ ```tsx
334
+ parameters: {
335
+ controls: { disable: true },
336
+ docs: {
337
+ source: {
338
+ language: 'tsx',
339
+ code: `
340
+ import { ComponentName } from '@arbor-education/design-system.components';
341
+
342
+ function ComponentNameStoryNameExample() {
343
+ return (
344
+ <ComponentName ... />
345
+ );
346
+ }
347
+ export default ComponentNameStoryNameExample;
348
+ `.trim(),
394
349
  },
395
- ```
396
- Each `Subheading` also appears in the global Table of Contents, so consumers can jump directly to the sub-component props section they need.
397
-
398
- 12. ACCESSIBILITY STORIES: If the component has important a11y props (like Badge's a11yLabel), include a dedicated accessibility story.
399
-
400
- 13. FILE STRUCTURE: Use the same structure as existing stories in this codebase. No default export at the bottom — it goes before story exports.
401
-
402
- 14. STORYBOOK IMPORT: Use `import type { Meta, StoryObj } from '@storybook/react-vite';` — NOT `@storybook/react`.
403
-
404
- REFERENCEthe withDescription helper pattern used in this codebase:
405
- \`\`\`tsx
406
- const withDescription = (story: Story, description: string): Story => ({
407
- ...story,
408
- parameters: {
409
- ...story.parameters,
410
- docs: {
411
- ...story.parameters?.docs,
412
- description: {
413
- story: description,
414
- },
415
- },
416
- },
417
- });
418
- \`\`\`
419
-
420
- REFERENCE — component description goes in meta like this:
421
- \`\`\`tsx
422
- const meta: Meta<typeof ComponentName> = {
423
- title: 'Components/ComponentName',
424
- component: ComponentName,
425
- tags: ['autodocs'],
426
- parameters: {
427
- docs: {
428
- description: {
429
- component: \`
430
- **ComponentName** does X, Y, Z.
431
-
432
- ### When to use
433
- - Use ComponentName when...
434
- - Use it for...
435
-
436
- ### When NOT to use
437
- - Use [OtherComponent] instead when...
438
- - Avoid ComponentName when...
439
-
440
- ### Design guidance
441
- - Keep content to X lines
442
- - Always include...
443
-
444
- ### Accessibility
445
- - Keyboard: ...
446
- - Screen readers: ...
447
- \`,
448
- },
449
- },
450
- },
451
- argTypes: { ... },
452
- };
453
- \`\`\`
454
-
455
- Please write the COMPLETE stories file. Include every story from Sophia's outline. Make it comprehensive, warm, and genuinely useful for developers building with this component. AROOOOO!! 🌹💖"
350
+ },
351
+ },
352
+ ```
353
+
354
+ 10. REALISTIC CONTENT — use realistic Arbor/school-management copy in options and examples, not "Option 1, Option 2" or "Lorem ipsum"
355
+
356
+ 11. RADIX UI LINK — if the component wraps a Radix primitive, add this to DESCRIPTION_INTRO:
357
+ ```markdown
358
+ > **Built on [Radix UI ComponentName](https://www.radix-ui.com/primitives/docs/components/component-name).**
359
+ > The [panel/overlay/etc] renders via a portal do **not** place inside a container with `overflow: hidden`.
360
+ ```
361
+
362
+ Please write the COMPLETE stories file. Read Progress.stories.tsx first — match its structure exactly. Include every story from Sophia's outline. AROOOOO!! 🌹💖"
456
363
  ```
457
364
 
458
365
  **WAIT for Rose's full story file.** Rose will produce the complete `.stories.tsx` content.
@@ -704,15 +611,20 @@ If you need a component not in this table, derive its path from the `title` in i
704
611
 
705
612
  The Atlassian cloud ID is always `orchard.atlassian.net`. Fetch pages with `mcp__atlassian__getConfluencePage`.
706
613
 
614
+ > **⚠️ Page staleness warning**: Some older page IDs are archived. If a page returns no usable content, use CQL search to find the current page: `mcp__atlassian__searchConfluenceUsingCql` with `title ~ "ComponentName" AND space.key = "AG"`.
615
+
707
616
  | Component | Confluence Page ID | Key Guidance |
708
617
  |---|---|---|
709
- | Banner | `2216762167` | 4 types (Info/blue, Neutral/transparent, Destructive/red, Warning/orange). Use icons. Content max ~2 lines. |
710
- | Button | `2216957127` | Cover all states (disabled, focus, hover). Multiple variants. |
711
- | Modal | `2216762125` | Max 2 CTA buttons. Has overlay. Blocks interaction. For focused tasks. |
712
- | Slideover | `2216891079` | Blocks bg interaction, slides from edge. Use when editing while needing context. |
713
- | Tooltip, Dropdown, DatePicker | `2216891079` | Non-blocking, anchor-based. Use for quick contextual info. |
714
- | Section | `2217056643` | Section header link styles guidance. |
618
+ | Banner | `2390032476` | Current page: "Banners (on-page)". 4 types, icon guidance, content length. |
619
+ | Button, inputs | `2216957127` | States, number inputs, date/time (check if archived). |
620
+ | Modal | `2216762125` | CTA buttons, size options, delete confirmations. |
621
+ | Modal, Slideover, Tooltip, Dropdown | `2216891079` | Popup vs Modal vs Slideover when to use each. |
622
+ | Section | `2217056643` | Section header link styles. |
715
623
  | Toast | `2216957106` | Max 2 lines, ideally 1. Icon aligned to centre of first line. |
624
+ | Icon | `2431778909` | 3-sizes-only rule, icon+label patterns, accessibility. |
625
+ | Badge / Tag / Pill | `2394521682` | "Pills & Tags (& Badges)" — current. |
626
+ | Heading | `2393767941` | Single-H1 rule, action button limits, back-button legacy. |
627
+ | CheckboxInput / RadioButtonInput | `2390720566` | Use cases, label phrasing, disabled tooltip guidance, keyboard/a11y. |
716
628
  | All (overview) | `2371747857` | Tables row heights, tooltip triggers, shadow guidance. |
717
629
 
718
630
  If no dedicated page exists for a component, still fetch the overview page — there may be a relevant section.
@@ -726,9 +638,13 @@ If no dedicated page exists for a component, still fetch the overview page — t
726
638
  - **Dorothy has final say** — if she flags a prop as wrong, fix it before shipping
727
639
  - **Real content matters** — use realistic Arbor-style copy in stories (e.g., school management UI language, not placeholder text)
728
640
  - **Storybook import**: always `@storybook/react-vite`, NOT `@storybook/react`
641
+ - **Story type**: prefer `type Story = StoryObj<typeof meta>` over `StoryObj<typeof ComponentName>` — stricter inference
642
+ - **`fn` imports**: come from `storybook/test` (unscoped), NOT `@storybook/test`
729
643
  - **No testIds in stories** — use accessible queries
730
644
  - **Always `nvm use`** before running any yarn commands (use `source ~/.nvm/nvm.sh && nvm use && yarn ...`)
731
645
  - **Use yarn, not npm**
646
+ - **No unsourced authority claims** — never write "most common bug" or "consumers frequently hit" without a source
647
+ - **UserDropdown** — slated for demolition, do NOT write stories for it and exclude from "related components" lists
732
648
  - This codebase serves millions of users in schools — ACCURATE documentation matters enormously
733
649
  - AROOO like you mean it!! 🐺💪
734
650
 
@@ -736,44 +652,64 @@ If no dedicated page exists for a component, still fetch the overview page — t
736
652
 
737
653
  When stories need wrapper elements (divs, paragraphs, labels) to set context or layout, follow these rules:
738
654
 
739
- - **Never use inline styles for typography** — use a `ds-` class instead. Any class beginning with `ds-` automatically inherits the design system's base font styles. Use `className="ds-text"` for body copy, labels, and paragraph text in story wrappers.
740
655
  - **Use CSS tokens for spacing** — `var(--spacing-xlarge)`, `var(--spacing-large)`, etc. Never hardcode px values for padding/gap.
741
656
  - **Use CSS tokens for colours** — `var(--color-grey-600)`, `var(--color-semantic-destructive-600)`, etc. Never hardcode hex values.
742
657
  - **No `overflow: hidden` or `position: relative` on wrappers** for components that portal their content (Dropdown, Modal, Tooltip, Slideover) — it will clip the floating content.
658
+ - **No unsourced authority claims** — never write "most common bug consumers report" or "consumers frequently hit this". No data source = no claim.
743
659
 
744
660
  Example of a well-styled story wrapper:
745
661
  ```tsx
746
662
  <div style={{ padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }}>
747
- <p className="ds-text" style={{ margin: 0 }}>Attendance report filter</p>
663
+ <p style={{ margin: 0, fontSize: 'var(--font-size-3-14)' }}>Attendance report filter</p>
748
664
  <Dropdown>...</Dropdown>
749
665
  </div>
750
666
  ```
751
667
 
752
- ## Global Docs Template & Page Structure
668
+ ## Design Token Gotchas (Verified always check before using)
669
+
670
+ - **Font sizes are numeric, not semantic**: `--font-size-1-11` (0.688rem), `--font-size-2-13` (0.812rem), `--font-size-3-14` (0.875rem). There is NO `--font-size-small`, `--font-size-body`, or `--font-size-caption`.
671
+ - **Grey scale**: `--color-grey-050` and `--color-grey-100` both exist. `--color-grey-50` (no leading zero) does NOT exist.
672
+ - **Border radius**: only `--border-radius-xsmall` (4px), `--border-radius-small` (8px), `--border-radius-large` (16px), `--border-radius-round` (99px). NO `--border-radius-medium`.
673
+ - **Spacing tokens**: `--spacing-xsmall`, `--spacing-small`, `--spacing-medium`, `--spacing-large`, `--spacing-xlarge`, `--spacing-xxlarge`, `--spacing-xxxlarge`.
674
+ - **`--color-semantic-info-200` is phantom** — info scale is 050/100/300/500/600/700/800/900. No 200 tier.
675
+ - **Icon names — always grep `allowedIcons.tsx`**: `calendar` is keyed as `date`. `bell` does NOT exist. Never assume an icon name.
676
+ - **`fn` imports come from `storybook/test`** (unscoped), NOT `@storybook/test`. Flag if Rose ever uses the scoped form.
753
677
 
754
- The global template (`.storybook/DocsTemplate.tsx`) applies to all simple components automatically. It renders:
678
+ ## Docs Page Structure
755
679
 
756
- 1. Title + Subtitle
757
- 2. Description (from `parameters.docs.description.component`) — intro, When to use, When NOT to use, design guidance, gotchas, accessibility. **DO NOT include "## Related components" here.**
758
- 3. `<Heading>Props</Heading>` — h2 heading, TOC sibling of the description's h2 sections.
759
- 4. Props intro copy — one-line hint ("The preview below is wired to the Controls panel — tweak any prop to see this story update in real time.") rendered as a Markdown block.
760
- 5. Primary story (live interactive canvas) — lives UNDER the Props heading because the canvas and Controls are one interactive unit.
761
- 6. `<Controls />` — interactive prop table driving the Primary canvas.
762
- 7. `<Heading>Stories</Heading>` + `<Stories title="" />` — suppresses the built-in "STORIES" label so our explicit Heading is the only one.
763
- 8. Related components — rendered automatically from `parameters.docs.relatedComponents` (a markdown string). Always last.
680
+ ALL stories use a custom `docs.page` function. The canonical reference is `src/components/progress/Progress.stories.tsx`.
764
681
 
765
- For simple components, set both parameters in the meta:
682
+ The required page structure produces this TOC:
683
+ 1. **Interactive example** — `<DocPrimary />` + `<Controls />`
684
+ 2. **Usage guidance** — When to use / When NOT to use
685
+ 3. **Developer notes** — Critical usage patterns / Accessibility / TypeScript types
686
+ 4. **Examples** — `<Stories title="" />`
687
+ 5. **Related components** — `<Markdown>{RELATED_COMPONENTS}</Markdown>` (always last)
766
688
 
767
689
  ```tsx
768
- parameters: {
769
- docs: {
770
- description: { component: COMPONENT_DESCRIPTION },
771
- relatedComponents: RELATED_COMPONENTS,
772
- },
773
- },
690
+ function ComponentNameDocsPage() {
691
+ return (
692
+ <>
693
+ <Title />
694
+ <Subtitle />
695
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
696
+ <DocHeading>Interactive example</DocHeading>
697
+ <Markdown>{PROPS_INTRO}</Markdown>
698
+ <DocPrimary />
699
+ <Controls />
700
+ <DocHeading>Usage guidance</DocHeading>
701
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
702
+ <DocHeading>Developer notes</DocHeading>
703
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
704
+ <DocHeading>Examples</DocHeading>
705
+ <Stories title="" />
706
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
707
+ </>
708
+ );
709
+ }
774
710
  ```
775
711
 
776
- For **compound components** (sub-component prop tables required), override `docs.page` with a custom function. Match the same final page order: intro → **Heading "Props" + intro copy** Primary Controls + sub-component tables → Stories → Related components.
712
+ For **compound components** (sub-components with their own prop tables), extend this pattern by adding `<Subheading>` + `<ArgTypes of={SubComponent} />` blocks between Controls and Usage guidance.
777
713
 
778
714
  ### Sub-component props for compound components
779
715
 
@@ -5,6 +5,11 @@ import '../src/index.scss';
5
5
 
6
6
  const preview: Preview = {
7
7
  parameters: {
8
+ options: {
9
+ storySort: {
10
+ order: ['Getting Started', ['Welcome', 'Using the Components', 'Contributing'], 'Components', '*'],
11
+ },
12
+ },
8
13
  controls: {
9
14
  matchers: {
10
15
  color: /(background|color)$/i,
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#175](https://github.com/arbor-education/design-system.components/pull/175) [`eb701a4`](https://github.com/arbor-education/design-system.components/commit/eb701a4177d358ceee29419247d7d6d898930faf) Thanks [@angusmglfraser](https://github.com/angusmglfraser)! - MIS-69977 🐛 sort out key population on checkbox and radio groups
8
+
9
+ - [#168](https://github.com/arbor-education/design-system.components/pull/168) [`36de162`](https://github.com/arbor-education/design-system.components/commit/36de1620148a853b07539116b4f003585dd0a468) Thanks [@rickbairstow](https://github.com/rickbairstow)! - MIS-70192 Customisations for Table Dropdown Settings
10
+
11
+ - [#171](https://github.com/arbor-education/design-system.components/pull/171) [`ba865e1`](https://github.com/arbor-education/design-system.components/commit/ba865e1b0316114120fed1264bd28996f7fead28) Thanks [@AmeeMorris](https://github.com/AmeeMorris)! - MIS-70118 New public API additions:
12
+
13
+ - `FormField` now supports `inputType: 'dateTimePicker'` with `inputProps: DateTimePickerProps`
14
+ - `Table.InlineTextCellRenderer` and `Table.SelectDropdownCellRenderer` are now exported from the `Table` namespace, consistent with all other cell renderers
15
+
16
+ ### Patch Changes
17
+
18
+ - [#174](https://github.com/arbor-education/design-system.components/pull/174) [`d4ea4b7`](https://github.com/arbor-education/design-system.components/commit/d4ea4b74c0e81c2abd2c07f61a1d3d89bf282bd8) Thanks [@angusmglfraser](https://github.com/angusmglfraser)! - MIS-68567 🐛 fix AG Grid floating elements clamping to the main grid container
19
+
20
+ ## 0.15.0
21
+
22
+ ### Minor Changes
23
+
24
+ - [#155](https://github.com/arbor-education/design-system.components/pull/155) [`1461039`](https://github.com/arbor-education/design-system.components/commit/146103967baa767076ec7a316944d5cb156134e6) Thanks [@Alex-DN-SP](https://github.com/Alex-DN-SP)! - MIS-69125 Number cell editor
25
+
26
+ ### Patch Changes
27
+
28
+ - [#160](https://github.com/arbor-education/design-system.components/pull/160) [`cc9dc10`](https://github.com/arbor-education/design-system.components/commit/cc9dc10adafba77d790020afa60d7f3a22deb071) Thanks [@Alex-DN-SP](https://github.com/Alex-DN-SP)! - MIS-64984 Added option for vertical column headers
29
+
3
30
  ## 0.14.0
4
31
 
5
32
  ### Minor Changes
package/README.md CHANGED
@@ -15,6 +15,14 @@ https://main--68c3f2a09d95b22aa55a11e8.chromatic.com/
15
15
 
16
16
  ---
17
17
 
18
+ ## Consuming the package
19
+
20
+ If you're integrating this library into a consumer project, check out the guide on Confluence:
21
+
22
+ [Consuming the design system NPM package](https://orchard.atlassian.net/wiki/spaces/SATD/pages/2500591662/Consuming+the+design+system+NPM+package)
23
+
24
+ ---
25
+
18
26
  ## Local setup
19
27
 
20
28
  ### Prerequisites