@arbor-education/design-system.components 0.15.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 (297) hide show
  1. package/.gather/skills/write-stories/SKILL.md +207 -271
  2. package/.storybook/preview.ts +5 -0
  3. package/CHANGELOG.md +17 -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/radio/RadioButtonGroup.d.ts +6 -2
  60. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  61. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  62. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  63. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
  64. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  65. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
  66. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  67. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
  68. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  69. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
  70. package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
  71. package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
  72. package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
  73. package/dist/components/formField/label/Label.stories.d.ts +54 -5
  74. package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
  75. package/dist/components/formField/label/Label.stories.js +238 -4
  76. package/dist/components/formField/label/Label.stories.js.map +1 -1
  77. package/dist/components/icoText/IcoText.stories.d.ts +32 -6
  78. package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
  79. package/dist/components/icoText/IcoText.stories.js +309 -14
  80. package/dist/components/icoText/IcoText.stories.js.map +1 -1
  81. package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
  82. package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
  83. package/dist/components/kpiCard/KPICard.stories.js +354 -10
  84. package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
  85. package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
  86. package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
  87. package/dist/components/kvpList/KVPList.stories.js +403 -10
  88. package/dist/components/kvpList/KVPList.stories.js.map +1 -1
  89. package/dist/components/modal/Modal.stories.d.ts +113 -9
  90. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  91. package/dist/components/modal/Modal.stories.js +633 -13
  92. package/dist/components/modal/Modal.stories.js.map +1 -1
  93. package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
  94. package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
  95. package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
  96. package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
  97. package/dist/components/pill/Pill.d.ts.map +1 -1
  98. package/dist/components/pill/Pill.js +1 -1
  99. package/dist/components/pill/Pill.js.map +1 -1
  100. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  101. package/dist/components/pill/Pill.stories.js +11 -13
  102. package/dist/components/pill/Pill.stories.js.map +1 -1
  103. package/dist/components/row/Row.stories.d.ts +1 -2
  104. package/dist/components/row/Row.stories.d.ts.map +1 -1
  105. package/dist/components/row/Row.stories.js +360 -50
  106. package/dist/components/row/Row.stories.js.map +1 -1
  107. package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
  108. package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
  109. package/dist/components/searchBar/SearchBar.stories.js +428 -36
  110. package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
  111. package/dist/components/section/Section.stories.d.ts +11 -41
  112. package/dist/components/section/Section.stories.d.ts.map +1 -1
  113. package/dist/components/section/Section.stories.js +494 -56
  114. package/dist/components/section/Section.stories.js.map +1 -1
  115. package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
  116. package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
  117. package/dist/components/singleUser/SingleUser.stories.js +303 -31
  118. package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
  119. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
  120. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
  121. package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
  122. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  123. package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
  124. package/dist/components/table/DSDefaultColDef.js +4 -3
  125. package/dist/components/table/DSDefaultColDef.js.map +1 -1
  126. package/dist/components/table/Table.d.ts +6 -1
  127. package/dist/components/table/Table.d.ts.map +1 -1
  128. package/dist/components/table/Table.js +8 -3
  129. package/dist/components/table/Table.js.map +1 -1
  130. package/dist/components/table/Table.stories.d.ts +2 -0
  131. package/dist/components/table/Table.stories.d.ts.map +1 -1
  132. package/dist/components/table/Table.stories.js +357 -3
  133. package/dist/components/table/Table.stories.js.map +1 -1
  134. package/dist/components/table/TableFooter.stories.d.ts +49 -0
  135. package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
  136. package/dist/components/table/TableFooter.stories.js +137 -0
  137. package/dist/components/table/TableFooter.stories.js.map +1 -0
  138. package/dist/components/table/TableHeader.stories.d.ts +93 -0
  139. package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
  140. package/dist/components/table/TableHeader.stories.js +176 -0
  141. package/dist/components/table/TableHeader.stories.js.map +1 -0
  142. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
  143. package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
  144. package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
  145. package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
  146. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
  147. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
  148. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
  149. package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
  150. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
  151. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
  152. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
  153. package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
  154. package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
  155. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
  156. package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
  157. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
  158. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
  159. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
  160. package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
  161. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
  162. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
  163. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
  164. package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
  165. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
  166. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
  167. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
  168. package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
  169. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
  170. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
  171. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
  172. package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
  173. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
  174. package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
  175. package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
  176. package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
  177. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
  178. package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
  179. package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
  180. package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
  181. package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
  182. package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
  183. package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
  184. package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
  185. package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
  186. package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
  187. package/dist/components/table/tableControls/TableControls.stories.js +356 -0
  188. package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
  189. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
  190. package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
  191. package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
  192. package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
  193. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
  194. package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
  195. package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
  196. package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
  197. package/dist/components/tabs/Tabs.stories.d.ts +22 -4
  198. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  199. package/dist/components/tabs/Tabs.stories.js +398 -22
  200. package/dist/components/tabs/Tabs.stories.js.map +1 -1
  201. package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
  202. package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
  203. package/dist/components/tabs/TabsItem.stories.js +61 -9
  204. package/dist/components/tabs/TabsItem.stories.js.map +1 -1
  205. package/dist/components/toast/Toast.stories.d.ts +103 -10
  206. package/dist/components/toast/Toast.stories.d.ts.map +1 -1
  207. package/dist/components/toast/Toast.stories.js +409 -47
  208. package/dist/components/toast/Toast.stories.js.map +1 -1
  209. package/dist/components/toggle/Toggle.stories.d.ts +61 -46
  210. package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
  211. package/dist/components/toggle/Toggle.stories.js +311 -122
  212. package/dist/components/toggle/Toggle.stories.js.map +1 -1
  213. package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
  214. package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
  215. package/dist/components/tooltip/Tooltip.stories.js +413 -7
  216. package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
  217. package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
  218. package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
  219. package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
  220. package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
  221. package/dist/index.css +8 -0
  222. package/dist/index.css.map +1 -1
  223. package/dist/utils/PopupParentContext.stories.d.ts +17 -0
  224. package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
  225. package/dist/utils/PopupParentContext.stories.js +266 -0
  226. package/dist/utils/PopupParentContext.stories.js.map +1 -0
  227. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
  228. package/dist/utils/getDefaultPopupParent.js +6 -0
  229. package/dist/utils/getDefaultPopupParent.js.map +1 -1
  230. package/package.json +1 -1
  231. package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
  232. package/src/components/avatar/Avatar.stories.tsx +504 -59
  233. package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
  234. package/src/components/banner/Banner.stories.tsx +7 -3
  235. package/src/components/card/Card.stories.tsx +466 -36
  236. package/src/components/combobox/Combobox.stories.tsx +867 -260
  237. package/src/components/datePicker/DatePicker.stories.tsx +777 -60
  238. package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
  239. package/src/components/editableText/EditableText.stories.tsx +567 -91
  240. package/src/components/formField/FormField.test.tsx +6 -0
  241. package/src/components/formField/FormField.tsx +5 -0
  242. package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
  243. package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
  244. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
  245. package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
  246. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
  247. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
  248. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
  249. package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
  250. package/src/components/formField/label/Label.stories.tsx +317 -8
  251. package/src/components/icoText/IcoText.stories.tsx +442 -31
  252. package/src/components/kpiCard/KPICard.stories.tsx +475 -30
  253. package/src/components/kvpList/KVPList.stories.tsx +593 -26
  254. package/src/components/modal/Modal.stories.tsx +963 -26
  255. package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
  256. package/src/components/pill/Pill.stories.tsx +11 -13
  257. package/src/components/pill/Pill.tsx +1 -0
  258. package/src/components/row/Row.stories.tsx +474 -58
  259. package/src/components/searchBar/SearchBar.stories.tsx +570 -38
  260. package/src/components/section/Section.stories.tsx +723 -70
  261. package/src/components/singleUser/SingleUser.stories.tsx +393 -34
  262. package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
  263. package/src/components/table/DSDefaultColDef.ts +25 -5
  264. package/src/components/table/Table.stories.tsx +411 -3
  265. package/src/components/table/Table.tsx +9 -2
  266. package/src/components/table/TableFooter.stories.tsx +196 -0
  267. package/src/components/table/TableHeader.stories.tsx +251 -0
  268. package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
  269. package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
  270. package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
  271. package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
  272. package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
  273. package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
  274. package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
  275. package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
  276. package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
  277. package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
  278. package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
  279. package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
  280. package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
  281. package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
  282. package/src/components/tabs/Tabs.stories.tsx +540 -60
  283. package/src/components/tabs/TabsItem.stories.tsx +82 -8
  284. package/src/components/toast/Toast.stories.tsx +539 -77
  285. package/src/components/toggle/Toggle.stories.tsx +371 -135
  286. package/src/components/tooltip/Tooltip.stories.tsx +606 -15
  287. package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
  288. package/src/docs/Contributing.mdx +241 -0
  289. package/src/docs/UsingComponents.mdx +93 -0
  290. package/src/docs/Welcome.mdx +68 -0
  291. package/src/global.scss +7 -0
  292. package/src/utils/PopupParentContext.stories.tsx +367 -0
  293. package/src/utils/getDefaultPopupParent.ts +6 -0
  294. package/.ralph/storybook-upgrade/knowledge.md +0 -308
  295. package/.ralph/storybook-upgrade/prd.json +0 -777
  296. package/.ralph/storybook-upgrade/progress.md +0 -342
  297. package/src/components/table/TableWIP.mdx +0 -3
@@ -1,15 +1,324 @@
1
- import type { Meta } from '@storybook/react-vite';
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';
11
+ import { TextInput } from 'Components/formField/inputs/text/TextInput';
2
12
  import { Label } from './Label';
3
13
 
4
- const meta: Meta<typeof Label> = {
14
+ // ---------------------------------------------------------------------------
15
+ // Docs page content
16
+ // ---------------------------------------------------------------------------
17
+
18
+ const DESCRIPTION_INTRO = [
19
+ 'Label renders a styled `<label>` element for form controls. It applies the design system\'s label',
20
+ 'typography — bold weight, the semantic label colour, and a bottom margin that separates it from the',
21
+ 'input below.',
22
+ '',
23
+ 'In most cases you do not use Label directly:',
24
+ '[`FormField`](?path=/docs/components-formfield--docs) renders it automatically when you pass a `label`',
25
+ 'prop. Use Label directly only when building a custom layout that cannot use FormField.',
26
+ ].join('\n');
27
+
28
+ const USAGE_GUIDANCE = [
29
+ '### When to use',
30
+ '',
31
+ '- **Custom form layouts** — when `FormField` does not fit your layout but you still need a correctly',
32
+ ' styled label',
33
+ '- **Labelling non-standard controls** — e.g. a custom rich-text editor, a map control, or a file',
34
+ ' upload zone',
35
+ '- **Wrapping pattern** — when no `htmlFor` target `id` is available, wrap the control inside',
36
+ ' `<Label>` so the browser infers the association automatically',
37
+ '',
38
+ '---',
39
+ '',
40
+ '### When NOT to use',
41
+ '',
42
+ '| Situation | Use instead |',
43
+ '|---|---|',
44
+ '| Standard input with a label | [`FormField`](?path=/docs/components-formfield--docs) — it renders Label automatically |',
45
+ '| Decorative, non-form text | `<p className="ds-text">` or a heading element |',
46
+ '| Required field indicator | Add `" *"` to the label `children` — Label has no built-in required prop |',
47
+ ].join('\n');
48
+
49
+ const DEVELOPER_NOTES = [
50
+ '### Critical usage patterns',
51
+ '',
52
+ '**Always pass `htmlFor`.** The `htmlFor` prop maps to the HTML `for` attribute, creating an accessible',
53
+ 'association between the label and its input. Screen readers announce the label text when the input',
54
+ 'receives focus. Without it, the label and input are visually close but semantically disconnected.',
55
+ '',
56
+ '**`htmlFor` value must match the input\'s `id`.** If the input has `id="pupil-name"`, set',
57
+ '`htmlFor="pupil-name"` on the Label. A mismatch silently breaks the association without any error.',
58
+ '',
59
+ '**Reduced margin when followed by a description.** The SCSS uses `:has(+ .ds-form-field__description)`',
60
+ 'to automatically reduce `margin-bottom` when a sibling description element immediately follows the',
61
+ 'label. This is handled internally by `FormField` — only relevant when composing a custom layout with',
62
+ 'Label and a description element.',
63
+ '',
64
+ '---',
65
+ '',
66
+ '### Accessibility',
67
+ '',
68
+ '- Always associate Label with its control via `htmlFor` / `id` pairing',
69
+ '- Do not rely on visual proximity alone — screen readers use the DOM association, not layout position',
70
+ '- The `<label>` element is `display: block` — it always occupies its own line',
71
+ '- Clicking or touching a correctly associated label focuses the input — this enlarges the tap target',
72
+ '',
73
+ '---',
74
+ '',
75
+ '### Design tokens used',
76
+ '',
77
+ '| Token | Usage |',
78
+ '|---|---|',
79
+ '| `--form-field-label-color-text` | Label text colour |',
80
+ '| `--type-body-bold-weight` | Bold font weight |',
81
+ '| `--form-field-spacing-vertical` | Bottom margin (default) |',
82
+ '| `--form-field-spacing-vertical-gap` | Bottom margin (reduced, when description follows) |',
83
+ ].join('\n');
84
+
85
+ const RELATED_COMPONENTS = [
86
+ '## Related components',
87
+ '',
88
+ '[FormField](?path=/docs/components-formfield--docs) · [TextInput](?path=/docs/components-formfield-inputs-textinput--docs) · [Fieldset](?path=/docs/components-formfield-fieldset--docs)',
89
+ ].join('\n');
90
+
91
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
92
+
93
+ function LabelDocsPage() {
94
+ return (
95
+ <>
96
+ <Title />
97
+ <Subtitle />
98
+ <Markdown>{DESCRIPTION_INTRO}</Markdown>
99
+ <DocHeading>Interactive example</DocHeading>
100
+ <Markdown>{PROPS_INTRO}</Markdown>
101
+ <DocPrimary />
102
+ <Controls />
103
+ <DocHeading>Usage guidance</DocHeading>
104
+ <Markdown>{USAGE_GUIDANCE}</Markdown>
105
+ <DocHeading>Developer notes</DocHeading>
106
+ <Markdown>{DEVELOPER_NOTES}</Markdown>
107
+ <DocHeading>Examples</DocHeading>
108
+ <Stories title="" />
109
+ <Markdown>{RELATED_COMPONENTS}</Markdown>
110
+ </>
111
+ );
112
+ }
113
+
114
+ // ---------------------------------------------------------------------------
115
+ // Meta
116
+ // ---------------------------------------------------------------------------
117
+
118
+ const meta = {
5
119
  title: 'Components/FormField/Inputs/Label',
6
120
  component: Label,
7
- };
8
-
9
- export const Default = {
10
- args: {
11
- children: 'Label',
121
+ parameters: {
122
+ layout: 'padded',
123
+ docs: {
124
+ page: LabelDocsPage,
125
+ },
126
+ },
127
+ tags: ['autodocs'],
128
+ argTypes: {
129
+ children: {
130
+ control: 'text',
131
+ description: 'The label text content.',
132
+ table: {
133
+ type: { summary: 'ReactNode' },
134
+ defaultValue: { summary: 'undefined' },
135
+ },
136
+ },
137
+ htmlFor: {
138
+ control: 'text',
139
+ description: [
140
+ 'The `id` of the form control this label describes.',
141
+ 'Maps to the HTML `for` attribute. Required for an accessible label-input association.',
142
+ ].join(' '),
143
+ table: {
144
+ type: { summary: 'string' },
145
+ defaultValue: { summary: 'undefined' },
146
+ },
147
+ },
148
+ className: {
149
+ control: 'text',
150
+ description: 'Additional CSS class names appended to `ds-label`. Use sparingly.',
151
+ table: {
152
+ type: { summary: 'string' },
153
+ defaultValue: { summary: 'undefined' },
154
+ },
155
+ },
12
156
  },
13
- };
157
+ } satisfies Meta<typeof Label>;
14
158
 
15
159
  export default meta;
160
+ type Story = StoryObj<typeof Label>;
161
+
162
+ // ---------------------------------------------------------------------------
163
+ // Helper: attach a per-story description to docs
164
+ // ---------------------------------------------------------------------------
165
+
166
+ const withDescription = (story: Story, description: string): Story => ({
167
+ ...story,
168
+ parameters: {
169
+ ...story.parameters,
170
+ docs: {
171
+ ...story.parameters?.docs,
172
+ description: {
173
+ story: description,
174
+ },
175
+ },
176
+ },
177
+ });
178
+
179
+ // ---------------------------------------------------------------------------
180
+ // Template components
181
+ // ---------------------------------------------------------------------------
182
+
183
+ const WithHtmlForTemplate = () => (
184
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '4px', maxWidth: '360px' }}>
185
+ <Label htmlFor="pupil-name">Pupil full name</Label>
186
+ <TextInput id="pupil-name" placeholder="e.g. Amelia Pemberton" />
187
+ </div>
188
+ );
189
+
190
+ const WithDescriptionTemplate = () => (
191
+ <div style={{ display: 'flex', flexDirection: 'column', maxWidth: '360px' }}>
192
+ <Label htmlFor="preferred-name">Preferred name</Label>
193
+ <div className="ds-form-field__description" style={{ marginBottom: '4px' }}>
194
+ This is the name the pupil prefers to be called — it may differ from their legal name.
195
+ </div>
196
+ <TextInput id="preferred-name" placeholder="e.g. Millie" />
197
+ </div>
198
+ );
199
+
200
+ const LongTextTemplate = () => (
201
+ <div style={{ maxWidth: '360px' }}>
202
+ <Label htmlFor="send-status">
203
+ Special educational needs and disabilities (SEND) status and current support requirements
204
+ </Label>
205
+ <TextInput id="send-status" placeholder="e.g. EHC plan in place" />
206
+ </div>
207
+ );
208
+
209
+ // ---------------------------------------------------------------------------
210
+ // Stories
211
+ // ---------------------------------------------------------------------------
212
+
213
+ export const Default: Story = withDescription(
214
+ {
215
+ args: {
216
+ children: 'Pupil full name',
217
+ htmlFor: 'pupil-name',
218
+ },
219
+ render: args => <Label {...args} />,
220
+ },
221
+ 'The interactive canvas — every prop is wired to the Controls panel below. Edit `children` to change the label text and `htmlFor` to set the associated input id.',
222
+ );
223
+
224
+ export const WithHtmlFor: Story = withDescription(
225
+ {
226
+ render: WithHtmlForTemplate,
227
+ parameters: {
228
+ controls: { disable: true },
229
+ docs: {
230
+ source: {
231
+ language: 'tsx',
232
+ code: `
233
+ import { Label, TextInput } from '@arbor-education/design-system.components';
234
+
235
+ function PupilNameField() {
236
+ return (
237
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
238
+ <Label htmlFor="pupil-name">Pupil full name</Label>
239
+ <TextInput id="pupil-name" placeholder="e.g. Amelia Pemberton" />
240
+ </div>
241
+ );
242
+ }
243
+ export default PupilNameField;
244
+ `.trim(),
245
+ },
246
+ },
247
+ },
248
+ },
249
+ [
250
+ '**The most important pattern.** Pass `htmlFor` matching the input\'s `id` to create an accessible',
251
+ 'label-input association. Clicking the label focuses the input — this enlarges the effective tap',
252
+ 'target on touch devices. Screen readers announce the label text when the input receives focus.',
253
+ ].join(' '),
254
+ );
255
+
256
+ export const WithDescription: Story = withDescription(
257
+ {
258
+ render: WithDescriptionTemplate,
259
+ parameters: {
260
+ controls: { disable: true },
261
+ docs: {
262
+ source: {
263
+ language: 'tsx',
264
+ code: `
265
+ import { Label, TextInput } from '@arbor-education/design-system.components';
266
+
267
+ function PreferredNameField() {
268
+ return (
269
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
270
+ <Label htmlFor="preferred-name">Preferred name</Label>
271
+ {/* .ds-form-field__description triggers :has() CSS — label margin-bottom reduces automatically */}
272
+ <div className="ds-form-field__description" style={{ marginBottom: '4px' }}>
273
+ This is the name the pupil prefers to be called — it may differ from their legal name.
274
+ </div>
275
+ <TextInput id="preferred-name" placeholder="e.g. Millie" />
276
+ </div>
277
+ );
278
+ }
279
+ export default PreferredNameField;
280
+ `.trim(),
281
+ },
282
+ },
283
+ },
284
+ },
285
+ [
286
+ 'When a `.ds-form-field__description` element immediately follows the label in the DOM,',
287
+ 'the label\'s `margin-bottom` automatically reduces via `:has(+ .ds-form-field__description)` CSS.',
288
+ '`FormField` handles this for you — only relevant when composing a custom layout.',
289
+ ].join(' '),
290
+ );
291
+
292
+ export const LongText: Story = withDescription(
293
+ {
294
+ render: LongTextTemplate,
295
+ parameters: {
296
+ controls: { disable: true },
297
+ docs: {
298
+ source: {
299
+ language: 'tsx',
300
+ code: `
301
+ import { Label, TextInput } from '@arbor-education/design-system.components';
302
+
303
+ function SendField() {
304
+ return (
305
+ <div style={{ maxWidth: '360px' }}>
306
+ <Label htmlFor="send-status">
307
+ Special educational needs and disabilities (SEND) status and current support requirements
308
+ </Label>
309
+ <TextInput id="send-status" placeholder="e.g. EHC plan in place" />
310
+ </div>
311
+ );
312
+ }
313
+ export default SendField;
314
+ `.trim(),
315
+ },
316
+ },
317
+ },
318
+ },
319
+ [
320
+ 'Long label text wraps naturally — Label is `display: block` and fills the full width of its',
321
+ 'container with no truncation. If your label is very long, consider shortening it or using a',
322
+ 'description element for supplementary detail.',
323
+ ].join(' '),
324
+ );