@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,51 +1,618 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Controls,
4
+ Heading as DocHeading,
5
+ Markdown,
6
+ Primary as DocPrimary,
7
+ Stories,
8
+ Subtitle,
9
+ Title,
10
+ } from '@storybook/addon-docs/blocks';
2
11
  import { Progress } from 'Components/progress/Progress';
3
12
  import { KVPList } from './KVPList';
4
13
 
14
+ // ---------------------------------------------------------------------------
15
+ // Docs page content
16
+ // ---------------------------------------------------------------------------
17
+
18
+ const DESCRIPTION_INTRO = [
19
+ '`KVPList` is a compound component for displaying structured key/value pair data.',
20
+ 'It uses semantic `<dl>/<dt>/<dd>` markup for accessibility and supports vertical or horizontal',
21
+ 'row layouts, two typographic prominence levels, and an optional percentage suffix.',
22
+ ].join(' ');
23
+
24
+ const ROW_PROPS = [
25
+ '| Prop | Type | Default | Description |',
26
+ '|---|---|---|---|',
27
+ '| `orientation` | `\'horizontal\' \\| \'vertical\'` | `\'vertical\'` | Vertical stacks term above definition; horizontal places them side by side |',
28
+ '| `className` | `string` | — | Additional CSS classes on the `<dl>` element |',
29
+ '| `...HTMLAttributes<dl>` | | | All standard `<dl>` attributes forwarded |',
30
+ ].join('\n');
31
+
32
+ const TERM_PROPS = [
33
+ '| Prop | Type | Default | Description |',
34
+ '|---|---|---|---|',
35
+ '| `children` | `ReactNode` | — | The key/label text |',
36
+ '| `className` | `string` | — | Additional CSS classes on the `<dt>` element |',
37
+ '| `...HTMLAttributes<dt>` | | | All standard element attributes forwarded |',
38
+ ].join('\n');
39
+
40
+ const DEFINITION_PROPS = [
41
+ '| Prop | Type | Default | Description |',
42
+ '|---|---|---|---|',
43
+ '| `children` | `ReactNode` | — | The value content |',
44
+ '| `isRow` | `boolean` | `false` | Makes the definition span the full row width |',
45
+ '| `isPercentage` | `boolean` | `false` | Appends a `%` suffix span. Do **not** also include `%` in `children` |',
46
+ '| `prominence` | `\'neutral\' \\| \'strong\'` | `\'neutral\'` | `neutral` = body text; `strong` = h2 typography |',
47
+ '| `className` | `string` | — | Additional CSS classes on the `<dd>` element |',
48
+ '| `...HTMLAttributes<dd>` | | | All standard element attributes forwarded |',
49
+ ].join('\n');
50
+
51
+ const USAGE_GUIDANCE = [
52
+ '### When to use',
53
+ '',
54
+ '- Displaying structured key/value data for one entity — student details, contact info, metric breakdowns',
55
+ '- Inside a `KPICard` as supplementary detail below the headline metric',
56
+ '- Detail panels, profile cards, and read-only form summaries',
57
+ '',
58
+ '---',
59
+ '',
60
+ '### When NOT to use',
61
+ '',
62
+ '| Situation | Use instead |',
63
+ '|---|---|',
64
+ '| A single dominant metric needing large typographic emphasis | [`KPICard`](?path=/docs/components-card-kpicard--docs) |',
65
+ '| Data with multiple records (rows/columns) | `<table>` with appropriate `<thead>/<tbody>` |',
66
+ '| Purely decorative label/value layout | Plain CSS grid — `KVPList` has specific accessibility semantics |',
67
+ ].join('\n');
68
+
69
+ const DEVELOPER_NOTES = [
70
+ '### Critical usage patterns',
71
+ '',
72
+ '**`role="group"` is conditional.** The `KVPList` root only adds `role="group"` when `aria-label`',
73
+ 'or `aria-labelledby` is provided. Without these, it is a plain `<div>`. Always provide `aria-label`',
74
+ 'when the list appears alongside other lists in a dashboard or detail panel.',
75
+ '',
76
+ '**`KVPList.Term` and `KVPList.Definition` must always be children of `KVPList.Row`.**',
77
+ 'They are `<dt>` and `<dd>` elements respectively — placing them outside a `<dl>` breaks HTML validity.',
78
+ '',
79
+ '**`isPercentage` adds "%" to the DOM** — it will be read aloud by screen readers.',
80
+ 'Do not also include "%" in your `children` content or you will render `"95%%"`.',
81
+ '',
82
+ '**`prominence="strong"` uses h2-scale typography but renders as `<dd>`.** This is intentional —',
83
+ 'the visual size is h2, but the semantic meaning is "definition in a definition list".',
84
+ 'Screen readers will not announce it as a heading.',
85
+ '',
86
+ '```tsx',
87
+ '<KVPList aria-label="Attendance summary">',
88
+ ' <KVPList.Row orientation="horizontal">',
89
+ ' <KVPList.Term>Overall attendance</KVPList.Term>',
90
+ ' <KVPList.Definition isPercentage prominence="strong">94.2</KVPList.Definition>',
91
+ ' </KVPList.Row>',
92
+ ' <KVPList.Row orientation="horizontal">',
93
+ ' <KVPList.Term>Autumn term</KVPList.Term>',
94
+ ' <KVPList.Definition isPercentage>96.1</KVPList.Definition>',
95
+ ' </KVPList.Row>',
96
+ '</KVPList>',
97
+ '```',
98
+ '',
99
+ '---',
100
+ '',
101
+ '### Accessibility',
102
+ '',
103
+ '- Provide `aria-label` on `KVPList` when it represents a named group — activates `role="group"`',
104
+ '- Use `aria-labelledby` when a visible heading is nearby — point to its `id`',
105
+ '- `KVPList.Term` (`dt`) and `KVPList.Definition` (`dd`) must be inside `KVPList.Row` (`dl`)',
106
+ '- `isPercentage` appends "%" to the DOM — never duplicate it in `children`',
107
+ '',
108
+ '---',
109
+ '',
110
+ '### TypeScript types',
111
+ '',
112
+ '```ts',
113
+ "import { KVPList } from '@arbor-education/design-system.components';",
114
+ "import type { KVPListProps, KVPListRowProps, KVPListTermProps, KVPListDefinitionProps } from '@arbor-education/design-system.components';",
115
+ '```',
116
+ ].join('\n');
117
+
118
+ const RELATED_COMPONENTS = [
119
+ '## Related components',
120
+ '',
121
+ '[KPICard](?path=/docs/components-card-kpicard--docs) · [Progress](?path=/docs/components-progress--docs) · [Card](?path=/docs/components-card--docs)',
122
+ ].join('\n');
123
+
124
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
125
+
126
+ // ---------------------------------------------------------------------------
127
+ // Custom DocsPage
128
+ // ---------------------------------------------------------------------------
129
+
130
+ function KVPListDocsPage() {
131
+ return (
132
+ <>
133
+ <Title />
134
+ <Subtitle />
135
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
136
+ <DocHeading>Interactive example</DocHeading>
137
+ <Markdown>{PROPS_INTRO}</Markdown>
138
+ <DocPrimary />
139
+ <Controls />
140
+ <DocHeading>KVPList.Row props</DocHeading>
141
+ <Markdown>{ROW_PROPS}</Markdown>
142
+ <DocHeading>KVPList.Term props</DocHeading>
143
+ <Markdown>{TERM_PROPS}</Markdown>
144
+ <DocHeading>KVPList.Definition props</DocHeading>
145
+ <Markdown>{DEFINITION_PROPS}</Markdown>
146
+ <DocHeading>Usage guidance</DocHeading>
147
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
148
+ <DocHeading>Developer notes</DocHeading>
149
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
150
+ <DocHeading>Examples</DocHeading>
151
+ <Stories title="" />
152
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
153
+ </>
154
+ );
155
+ }
156
+
157
+ // ---------------------------------------------------------------------------
158
+ // Meta
159
+ // ---------------------------------------------------------------------------
160
+
5
161
  const meta = {
6
162
  title: 'Components/KVPList',
7
163
  component: KVPList,
164
+ tags: ['autodocs'],
165
+ parameters: {
166
+ layout: 'padded',
167
+ docs: { page: KVPListDocsPage },
168
+ },
169
+ argTypes: {
170
+ 'aria-label': {
171
+ control: 'text',
172
+ description: 'When provided, adds `role="group"` to the root `<div>`. Use when the list represents a named data group.',
173
+ table: { type: { summary: 'string' } },
174
+ },
175
+ 'aria-labelledby': {
176
+ control: false,
177
+ description: 'ID of a visible heading element. Alternative to `aria-label` when a visible label is already in the DOM.',
178
+ table: { type: { summary: 'string' } },
179
+ },
180
+ 'className': {
181
+ control: false,
182
+ description: 'Additional CSS class names on the root `div.ds-kvp-list` element.',
183
+ table: { type: { summary: 'string' } },
184
+ },
185
+ 'children': {
186
+ control: false,
187
+ description: 'Compose using `KVPList.Row`, `KVPList.Term`, and `KVPList.Definition` sub-components.',
188
+ table: { type: { summary: 'ReactNode' } },
189
+ },
190
+ },
8
191
  } satisfies Meta<typeof KVPList>;
9
192
 
10
- type Story = StoryObj<typeof meta>;
193
+ export default meta;
194
+ type Story = StoryObj<typeof KVPList>;
195
+
196
+ // ---------------------------------------------------------------------------
197
+ // Helper: attach a per-story description to docs
198
+ // ---------------------------------------------------------------------------
199
+
200
+ const withDescription = (story: Story, description: string): Story => ({
201
+ ...story,
202
+ parameters: {
203
+ ...story.parameters,
204
+ docs: { ...story.parameters?.docs, description: { story: description } },
205
+ },
206
+ });
207
+
208
+ // ---------------------------------------------------------------------------
209
+ // Template components
210
+ // ---------------------------------------------------------------------------
11
211
 
12
- export const Summary: Story = {
13
- render: args => (
14
- <KVPList {...args} aria-label="Attendance metrics">
212
+ const MultipleRowsTemplate = () => (
213
+ <KVPList aria-label="Student attendance summary">
214
+ <KVPList.Row orientation="horizontal">
215
+ <KVPList.Term>Overall attendance</KVPList.Term>
216
+ <KVPList.Definition isPercentage prominence="strong">94.2</KVPList.Definition>
217
+ </KVPList.Row>
218
+ <KVPList.Row orientation="horizontal">
219
+ <KVPList.Term>Autumn term</KVPList.Term>
220
+ <KVPList.Definition isPercentage>96.1</KVPList.Definition>
221
+ </KVPList.Row>
222
+ <KVPList.Row orientation="horizontal">
223
+ <KVPList.Term>Spring term</KVPList.Term>
224
+ <KVPList.Definition isPercentage>93.4</KVPList.Definition>
225
+ </KVPList.Row>
226
+ <KVPList.Row orientation="horizontal">
227
+ <KVPList.Term>Summer term</KVPList.Term>
228
+ <KVPList.Definition isPercentage>92.8</KVPList.Definition>
229
+ </KVPList.Row>
230
+ </KVPList>
231
+ );
232
+
233
+ const MixedOrientationsTemplate = () => (
234
+ <KVPList aria-label="Student profile">
235
+ <KVPList.Row orientation="vertical">
236
+ <KVPList.Term>Full name</KVPList.Term>
237
+ <KVPList.Definition prominence="strong">Alice Johnson</KVPList.Definition>
238
+ </KVPList.Row>
239
+ <KVPList.Row orientation="horizontal">
240
+ <KVPList.Term>Year group</KVPList.Term>
241
+ <KVPList.Definition>Year 10</KVPList.Definition>
242
+ </KVPList.Row>
243
+ <KVPList.Row orientation="horizontal">
244
+ <KVPList.Term>Form</KVPList.Term>
245
+ <KVPList.Definition>10B</KVPList.Definition>
246
+ </KVPList.Row>
247
+ <KVPList.Row orientation="horizontal">
248
+ <KVPList.Term>Attendance</KVPList.Term>
249
+ <KVPList.Definition isPercentage>94.2</KVPList.Definition>
250
+ </KVPList.Row>
251
+ </KVPList>
252
+ );
253
+
254
+ const WithProgressTemplate = () => (
255
+ <KVPList aria-label="Attendance breakdown by year group">
256
+ {[
257
+ { label: 'Year 7', value: 96, progress: 96 },
258
+ { label: 'Year 8', value: 94, progress: 94 },
259
+ { label: 'Year 9', value: 91, progress: 91 },
260
+ { label: 'Year 10', value: 93, progress: 93 },
261
+ { label: 'Year 11', value: 89, progress: 89 },
262
+ ].map(({ label, value, progress }) => (
263
+ <KVPList.Row key={label} orientation="horizontal">
264
+ <KVPList.Term>{label}</KVPList.Term>
265
+ <KVPList.Definition isPercentage>{value}</KVPList.Definition>
266
+ <KVPList.Definition aria-hidden="true" isRow>
267
+ <Progress aria-label={`${label} attendance`} max={100} value={progress} />
268
+ </KVPList.Definition>
269
+ </KVPList.Row>
270
+ ))}
271
+ </KVPList>
272
+ );
273
+
274
+ // ---------------------------------------------------------------------------
275
+ // Stories
276
+ // ---------------------------------------------------------------------------
277
+
278
+ export const Default: Story = withDescription(
279
+ {
280
+ args: { 'aria-label': 'Student details' },
281
+ render: args => (
282
+ <KVPList {...args}>
283
+ <KVPList.Row orientation="vertical">
284
+ <KVPList.Term>Student</KVPList.Term>
285
+ <KVPList.Definition>Alice Johnson</KVPList.Definition>
286
+ </KVPList.Row>
287
+ </KVPList>
288
+ ),
289
+ },
290
+ 'A single vertical row — term stacked above definition. The default `orientation="vertical"` and `prominence="neutral"` baseline.',
291
+ );
292
+
293
+ export const HorizontalOrientation: Story = withDescription(
294
+ {
295
+ parameters: {
296
+ controls: { disable: true },
297
+ docs: {
298
+ source: {
299
+ language: 'tsx',
300
+ code: `
301
+ import { KVPList } from '@arbor-education/design-system.components';
302
+
303
+ function HorizontalOrientationExample() {
304
+ return (
305
+ <KVPList aria-label="Attendance summary">
15
306
  <KVPList.Row orientation="horizontal">
16
- <KVPList.Term>Attendance</KVPList.Term>
17
- <KVPList.Definition isPercentage prominence="strong">95</KVPList.Definition>
307
+ <KVPList.Term>Attendance rate</KVPList.Term>
308
+ <KVPList.Definition isPercentage>94.2</KVPList.Definition>
18
309
  </KVPList.Row>
19
310
  </KVPList>
20
- ),
21
- };
311
+ );
312
+ }
313
+ export default HorizontalOrientationExample;
314
+ `.trim(),
315
+ },
316
+ },
317
+ },
318
+ render: () => (
319
+ <KVPList aria-label="Attendance summary">
320
+ <KVPList.Row orientation="horizontal">
321
+ <KVPList.Term>Attendance rate</KVPList.Term>
322
+ <KVPList.Definition isPercentage>94.2</KVPList.Definition>
323
+ </KVPList.Row>
324
+ <KVPList.Row orientation="horizontal">
325
+ <KVPList.Term>Sessions attended</KVPList.Term>
326
+ <KVPList.Definition>342 of 364</KVPList.Definition>
327
+ </KVPList.Row>
328
+ </KVPList>
329
+ ),
330
+ },
331
+ '`orientation="horizontal"` places the term and definition on the same line. The term takes `flex: 1` and the definition is right-aligned at `flex: 0 0 auto`.',
332
+ );
333
+
334
+ export const StrongProminence: Story = withDescription(
335
+ {
336
+ parameters: {
337
+ controls: { disable: true },
338
+ docs: {
339
+ source: {
340
+ language: 'tsx',
341
+ code: `
342
+ import { KVPList } from '@arbor-education/design-system.components';
343
+
344
+ function StrongProminenceExample() {
345
+ return (
346
+ <KVPList aria-label="Key metric">
347
+ <KVPList.Row orientation="horizontal">
348
+ <KVPList.Term>Overall attendance</KVPList.Term>
349
+ <KVPList.Definition isPercentage prominence="strong">94.2</KVPList.Definition>
350
+ </KVPList.Row>
351
+ </KVPList>
352
+ );
353
+ }
354
+ export default StrongProminenceExample;
355
+ `.trim(),
356
+ },
357
+ },
358
+ },
359
+ render: () => (
360
+ <KVPList aria-label="Key metric">
361
+ <KVPList.Row orientation="horizontal">
362
+ <KVPList.Term>Overall attendance</KVPList.Term>
363
+ <KVPList.Definition isPercentage prominence="strong">94.2</KVPList.Definition>
364
+ </KVPList.Row>
365
+ <KVPList.Row orientation="horizontal">
366
+ <KVPList.Term>Autumn term</KVPList.Term>
367
+ <KVPList.Definition isPercentage prominence="neutral">96.1</KVPList.Definition>
368
+ </KVPList.Row>
369
+ </KVPList>
370
+ ),
371
+ },
372
+ '`prominence="strong"` applies h2-scale typography to the definition — rendered as `<dd>` semantically but visually dominant. Use for the primary metric value in a list; `"neutral"` for supporting context.',
373
+ );
374
+
375
+ export const IsRow: Story = withDescription(
376
+ {
377
+ parameters: {
378
+ controls: { disable: true },
379
+ docs: {
380
+ source: {
381
+ language: 'tsx',
382
+ code: `
383
+ import { KVPList } from '@arbor-education/design-system.components';
384
+ import { Progress } from '@arbor-education/design-system.components';
22
385
 
23
- export const WithProgressAndPercentage: Story = {
24
- render: args => (
25
- <KVPList {...args} aria-label="Attendance breakdown">
386
+ function IsRowExample() {
387
+ return (
388
+ <KVPList aria-label="Attendance breakdown">
26
389
  <KVPList.Row orientation="horizontal">
27
- <KVPList.Term>Bar label text</KVPList.Term>
28
- <KVPList.Definition isPercentage prominence="neutral">95</KVPList.Definition>
390
+ <KVPList.Term>Year 9</KVPList.Term>
391
+ <KVPList.Definition isPercentage>91</KVPList.Definition>
29
392
  <KVPList.Definition aria-hidden="true" isRow>
30
- <Progress aria-label="Attendance progress" max={100} value={95} />
393
+ <Progress aria-label="Year 9 attendance" max={100} value={91} />
31
394
  </KVPList.Definition>
32
395
  </KVPList.Row>
33
396
  </KVPList>
34
- ),
35
- };
397
+ );
398
+ }
399
+ export default IsRowExample;
400
+ `.trim(),
401
+ },
402
+ },
403
+ },
404
+ render: () => (
405
+ <KVPList aria-label="Attendance breakdown">
406
+ <KVPList.Row orientation="horizontal">
407
+ <KVPList.Term>Year 9</KVPList.Term>
408
+ <KVPList.Definition isPercentage>91</KVPList.Definition>
409
+ <KVPList.Definition aria-hidden="true" isRow>
410
+ <Progress aria-label="Year 9 attendance" max={100} value={91} />
411
+ </KVPList.Definition>
412
+ </KVPList.Row>
413
+ </KVPList>
414
+ ),
415
+ },
416
+ '`isRow=true` on a Definition makes it span the full row width (`flex-basis: 100%`). Use for long text values or embedded components like `Progress` that need the full horizontal space.',
417
+ );
36
418
 
37
- export const WithProgressNoPercentage: Story = {
38
- render: args => (
39
- <KVPList {...args} aria-label="Attendance breakdown without percentage">
419
+ export const AsPercentage: Story = withDescription(
420
+ {
421
+ parameters: {
422
+ controls: { disable: true },
423
+ docs: {
424
+ source: {
425
+ language: 'tsx',
426
+ code: `
427
+ import { KVPList } from '@arbor-education/design-system.components';
428
+
429
+ function AsPercentageExample() {
430
+ return (
431
+ <KVPList aria-label="Session attendance">
432
+ <KVPList.Row orientation="horizontal">
433
+ <KVPList.Term>Present</KVPList.Term>
434
+ {/* isPercentage adds "%" — do NOT also include "%" in children */}
435
+ <KVPList.Definition isPercentage>94.2</KVPList.Definition>
436
+ </KVPList.Row>
437
+ </KVPList>
438
+ );
439
+ }
440
+ export default AsPercentageExample;
441
+ `.trim(),
442
+ },
443
+ },
444
+ },
445
+ render: () => (
446
+ <KVPList aria-label="Session attendance">
447
+ <KVPList.Row orientation="horizontal">
448
+ <KVPList.Term>Present</KVPList.Term>
449
+ <KVPList.Definition isPercentage>94.2</KVPList.Definition>
450
+ </KVPList.Row>
451
+ <KVPList.Row orientation="horizontal">
452
+ <KVPList.Term>Authorised absence</KVPList.Term>
453
+ <KVPList.Definition isPercentage>3.1</KVPList.Definition>
454
+ </KVPList.Row>
455
+ <KVPList.Row orientation="horizontal">
456
+ <KVPList.Term>Unauthorised absence</KVPList.Term>
457
+ <KVPList.Definition isPercentage>2.7</KVPList.Definition>
458
+ </KVPList.Row>
459
+ </KVPList>
460
+ ),
461
+ },
462
+ '`isPercentage=true` appends a `%` suffix span after the definition content. The `%` is part of the DOM and will be read by screen readers — never also include `%` in `children`.',
463
+ );
464
+
465
+ export const MultipleRows: Story = withDescription(
466
+ {
467
+ parameters: {
468
+ controls: { disable: true },
469
+ docs: {
470
+ source: {
471
+ language: 'tsx',
472
+ code: `
473
+ import { KVPList } from '@arbor-education/design-system.components';
474
+
475
+ function MultipleRowsExample() {
476
+ return (
477
+ <KVPList aria-label="Student attendance summary">
478
+ <KVPList.Row orientation="horizontal">
479
+ <KVPList.Term>Overall attendance</KVPList.Term>
480
+ <KVPList.Definition isPercentage prominence="strong">94.2</KVPList.Definition>
481
+ </KVPList.Row>
482
+ <KVPList.Row orientation="horizontal">
483
+ <KVPList.Term>Autumn term</KVPList.Term>
484
+ <KVPList.Definition isPercentage>96.1</KVPList.Definition>
485
+ </KVPList.Row>
486
+ <KVPList.Row orientation="horizontal">
487
+ <KVPList.Term>Spring term</KVPList.Term>
488
+ <KVPList.Definition isPercentage>93.4</KVPList.Definition>
489
+ </KVPList.Row>
490
+ </KVPList>
491
+ );
492
+ }
493
+ export default MultipleRowsExample;
494
+ `.trim(),
495
+ },
496
+ },
497
+ },
498
+ render: MultipleRowsTemplate,
499
+ },
500
+ 'The most common production pattern — several horizontal rows with one `prominence="strong"` value at the top for the headline metric, followed by `"neutral"` breakdown rows.',
501
+ );
502
+
503
+ export const MixedOrientations: Story = withDescription(
504
+ {
505
+ parameters: {
506
+ controls: { disable: true },
507
+ docs: {
508
+ source: {
509
+ language: 'tsx',
510
+ code: `
511
+ import { KVPList } from '@arbor-education/design-system.components';
512
+
513
+ function MixedOrientationsExample() {
514
+ return (
515
+ <KVPList aria-label="Student profile">
516
+ <KVPList.Row orientation="vertical">
517
+ <KVPList.Term>Full name</KVPList.Term>
518
+ <KVPList.Definition prominence="strong">Alice Johnson</KVPList.Definition>
519
+ </KVPList.Row>
520
+ <KVPList.Row orientation="horizontal">
521
+ <KVPList.Term>Year group</KVPList.Term>
522
+ <KVPList.Definition>Year 10</KVPList.Definition>
523
+ </KVPList.Row>
524
+ </KVPList>
525
+ );
526
+ }
527
+ export default MixedOrientationsExample;
528
+ `.trim(),
529
+ },
530
+ },
531
+ },
532
+ render: MixedOrientationsTemplate,
533
+ },
534
+ 'Vertical and horizontal rows can be mixed freely within the same list. Vertical orientation (term above definition) suits long values or primary identity fields; horizontal suits compact metric rows.',
535
+ );
536
+
537
+ export const WithAriaLabel: Story = withDescription(
538
+ {
539
+ parameters: {
540
+ controls: { disable: true },
541
+ docs: {
542
+ source: {
543
+ language: 'tsx',
544
+ code: `
545
+ import { KVPList } from '@arbor-education/design-system.components';
546
+
547
+ function WithAriaLabelExample() {
548
+ return (
549
+ // aria-label activates role="group" on the root div
550
+ <KVPList aria-label="Contact details">
551
+ <KVPList.Row orientation="horizontal">
552
+ <KVPList.Term>Email</KVPList.Term>
553
+ <KVPList.Definition>alice.johnson@school.edu</KVPList.Definition>
554
+ </KVPList.Row>
40
555
  <KVPList.Row orientation="horizontal">
41
- <KVPList.Term>Bar label text</KVPList.Term>
42
- <KVPList.Definition prominence="neutral">X</KVPList.Definition>
556
+ <KVPList.Term>Phone</KVPList.Term>
557
+ <KVPList.Definition>01234 567890</KVPList.Definition>
558
+ </KVPList.Row>
559
+ </KVPList>
560
+ );
561
+ }
562
+ export default WithAriaLabelExample;
563
+ `.trim(),
564
+ },
565
+ },
566
+ },
567
+ render: () => (
568
+ <KVPList aria-label="Contact details">
569
+ <KVPList.Row orientation="horizontal">
570
+ <KVPList.Term>Email</KVPList.Term>
571
+ <KVPList.Definition>alice.johnson@school.edu</KVPList.Definition>
572
+ </KVPList.Row>
573
+ <KVPList.Row orientation="horizontal">
574
+ <KVPList.Term>Phone</KVPList.Term>
575
+ <KVPList.Definition>01234 567890</KVPList.Definition>
576
+ </KVPList.Row>
577
+ <KVPList.Row orientation="horizontal">
578
+ <KVPList.Term>Key stage</KVPList.Term>
579
+ <KVPList.Definition>Key Stage 4</KVPList.Definition>
580
+ </KVPList.Row>
581
+ </KVPList>
582
+ ),
583
+ },
584
+ 'Providing `aria-label` activates `role="group"` on the root `<div>`, giving screen readers a navigable group landmark. Without `aria-label`, the root is a plain `<div>` with no group semantics.',
585
+ );
586
+
587
+ export const WithProgressBars: Story = withDescription(
588
+ {
589
+ parameters: {
590
+ controls: { disable: true },
591
+ docs: {
592
+ source: {
593
+ language: 'tsx',
594
+ code: `
595
+ import { KVPList, Progress } from '@arbor-education/design-system.components';
596
+
597
+ function WithProgressBarsExample() {
598
+ return (
599
+ <KVPList aria-label="Attendance by year group">
600
+ <KVPList.Row orientation="horizontal">
601
+ <KVPList.Term>Year 7</KVPList.Term>
602
+ <KVPList.Definition isPercentage>96</KVPList.Definition>
43
603
  <KVPList.Definition aria-hidden="true" isRow>
44
- <Progress aria-label="Attendance progress second" max={100} value={95} />
604
+ <Progress aria-label="Year 7 attendance" max={100} value={96} />
45
605
  </KVPList.Definition>
46
606
  </KVPList.Row>
47
607
  </KVPList>
48
- ),
49
- };
50
-
51
- export default meta;
608
+ );
609
+ }
610
+ export default WithProgressBarsExample;
611
+ `.trim(),
612
+ },
613
+ },
614
+ },
615
+ render: WithProgressTemplate,
616
+ },
617
+ 'A `Progress` bar embedded via `isRow` on a Definition spans the full row width. The progress bar is `aria-hidden="true"` since the percentage value in the preceding Definition already conveys the data to screen readers.',
618
+ );