@boostdev/design-system-components 2.7.1 → 2.11.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 (535) hide show
  1. package/AGENTS.md +54 -46
  2. package/README.md +34 -20
  3. package/dist/client.cjs +1317 -779
  4. package/dist/client.css +1029 -812
  5. package/dist/client.d.cts +88 -26
  6. package/dist/client.d.ts +88 -26
  7. package/dist/client.js +1278 -732
  8. package/dist/index.cjs +1317 -779
  9. package/dist/index.css +1029 -812
  10. package/dist/index.d.cts +88 -26
  11. package/dist/index.d.ts +88 -26
  12. package/dist/index.js +1278 -732
  13. package/dist/web-components/chunk-2OLVQUBU.js +193 -0
  14. package/dist/web-components/chunk-3AY2YKCM.js +223 -0
  15. package/dist/web-components/chunk-3WAV6MDN.js +212 -0
  16. package/dist/web-components/{chunk-CZBIVR4V.js → chunk-47AT5KZD.js} +88 -16
  17. package/dist/web-components/chunk-4A2YYTYN.js +93 -0
  18. package/dist/web-components/{chunk-Q4T5BJT6.js → chunk-62NK3ZSC.js} +18 -3
  19. package/dist/web-components/chunk-66M6ETWD.js +77 -0
  20. package/dist/web-components/{chunk-NCPQ7AF3.js → chunk-6G22I2CK.js} +18 -3
  21. package/dist/web-components/{chunk-QDST57JC.js → chunk-7ZOJ7N4E.js} +14 -4
  22. package/dist/web-components/{chunk-5R6IFELV.js → chunk-AIBOHNDU.js} +11 -1
  23. package/dist/web-components/{chunk-ITHLKR7Q.js → chunk-AP4RDUL2.js} +16 -5
  24. package/dist/web-components/{chunk-QWPACK5L.js → chunk-BPYKZVDK.js} +11 -1
  25. package/dist/web-components/{chunk-YLVTEY23.js → chunk-BTCMJQKB.js} +53 -21
  26. package/dist/web-components/chunk-CUKQ2L5B.js +245 -0
  27. package/dist/web-components/chunk-DIZDCL7Z.js +14 -0
  28. package/dist/web-components/{chunk-PC3IOQAH.js → chunk-DV5T43ZC.js} +27 -7
  29. package/dist/web-components/{chunk-2QA62WCQ.js → chunk-EF7IVYTY.js} +10 -0
  30. package/dist/web-components/{chunk-L3XHOMN6.js → chunk-F3ZDNHZZ.js} +26 -1
  31. package/dist/web-components/chunk-FEDABOR5.js +248 -0
  32. package/dist/web-components/{chunk-6I2DBFQ7.js → chunk-HGFCJXOQ.js} +36 -5
  33. package/dist/web-components/{chunk-SOQQ7RVJ.js → chunk-IPGHUCJT.js} +23 -8
  34. package/dist/web-components/chunk-ITD2MV5K.js +392 -0
  35. package/dist/web-components/{chunk-CM3KYZ6Z.js → chunk-JH6LQKLK.js} +78 -6
  36. package/dist/web-components/chunk-JMCXAAFK.js +120 -0
  37. package/dist/web-components/{chunk-KUI55GFB.js → chunk-JUPCZVVW.js} +50 -18
  38. package/dist/web-components/chunk-JV5QT2OU.js +146 -0
  39. package/dist/web-components/{chunk-3GFWLSLS.js → chunk-KA3VPKMY.js} +29 -6
  40. package/dist/web-components/{chunk-CR5PGUHV.js → chunk-KJGRFDFI.js} +26 -11
  41. package/dist/web-components/{chunk-PY62FTRW.js → chunk-KZPRFY5P.js} +68 -33
  42. package/dist/web-components/{chunk-X46KL5BK.js → chunk-LDIPCTRN.js} +18 -1
  43. package/dist/web-components/chunk-M3ECULRH.js +174 -0
  44. package/dist/web-components/chunk-NBN2ENWJ.js +90 -0
  45. package/dist/web-components/chunk-NIN3JO6Q.js +189 -0
  46. package/dist/web-components/{chunk-2FGATTGT.js → chunk-NTQ4TCUT.js} +76 -55
  47. package/dist/web-components/chunk-OY74D4X6.js +302 -0
  48. package/dist/web-components/{chunk-3S42DZ7W.js → chunk-P24JYC5V.js} +7 -0
  49. package/dist/web-components/{chunk-BKIHQYJR.js → chunk-PXPPKCLT.js} +17 -2
  50. package/dist/web-components/{chunk-TQ7IQ4GZ.js → chunk-QEF2IRID.js} +71 -29
  51. package/dist/web-components/chunk-QZAIRJ75.js +111 -0
  52. package/dist/web-components/{chunk-6I3CFC26.js → chunk-RSZ3BWBK.js} +20 -5
  53. package/dist/web-components/chunk-RVF7W653.js +101 -0
  54. package/dist/web-components/chunk-SEO2F5KJ.js +234 -0
  55. package/dist/web-components/{chunk-VMMVWLXL.js → chunk-SFZ6Q4BP.js} +10 -0
  56. package/dist/web-components/{chunk-LY62SAVN.js → chunk-SYNLFKD3.js} +12 -2
  57. package/dist/web-components/chunk-TMWXRHGF.js +192 -0
  58. package/dist/web-components/{chunk-65JXQOBA.js → chunk-U3YZE6R6.js} +51 -7
  59. package/dist/web-components/chunk-UO7ROSHD.js +424 -0
  60. package/dist/web-components/chunk-VANAKB6D.js +152 -0
  61. package/dist/web-components/{chunk-PXZWYO6Z.js → chunk-VED2DFJ6.js} +108 -29
  62. package/dist/web-components/chunk-W6H5ID2U.js +161 -0
  63. package/dist/web-components/{chunk-57TRNCWQ.js → chunk-WFVKU4GX.js} +22 -11
  64. package/dist/web-components/{chunk-OQTRTMAB.js → chunk-WIBAN7KP.js} +10 -0
  65. package/dist/web-components/chunk-XI7KRAH7.js +54 -0
  66. package/dist/web-components/{chunk-F5E3IT7G.js → chunk-XIZWAWMJ.js} +50 -11
  67. package/dist/web-components/{chunk-FXURM6D5.js → chunk-YFAXGRPR.js} +10 -0
  68. package/dist/web-components/globals.js +1 -1
  69. package/dist/web-components/index.d.ts +77 -707
  70. package/dist/web-components/index.js +339 -2066
  71. package/dist/web-components/interaction/bds-accordion-item.js +1 -1
  72. package/dist/web-components/interaction/bds-accordion.js +1 -1
  73. package/dist/web-components/interaction/bds-button.d.ts +10 -2
  74. package/dist/web-components/interaction/bds-button.js +1 -1
  75. package/dist/web-components/interaction/bds-collapsible.d.ts +7 -2
  76. package/dist/web-components/interaction/bds-collapsible.js +1 -1
  77. package/dist/web-components/interaction/bds-dialog.d.ts +11 -3
  78. package/dist/web-components/interaction/bds-dialog.js +1 -1
  79. package/dist/web-components/interaction/bds-drawer.d.ts +7 -1
  80. package/dist/web-components/interaction/bds-drawer.js +1 -1
  81. package/dist/web-components/interaction/bds-dropdown-menu-item.d.ts +51 -0
  82. package/dist/web-components/interaction/bds-dropdown-menu-item.js +7 -0
  83. package/dist/web-components/interaction/bds-dropdown-menu.d.ts +70 -0
  84. package/dist/web-components/interaction/bds-dropdown-menu.js +7 -0
  85. package/dist/web-components/interaction/bds-popover.d.ts +14 -3
  86. package/dist/web-components/interaction/bds-popover.js +1 -1
  87. package/dist/web-components/interaction/bds-skip-link.js +1 -1
  88. package/dist/web-components/interaction/bds-tab-panel.js +1 -1
  89. package/dist/web-components/interaction/bds-tab.js +1 -1
  90. package/dist/web-components/interaction/bds-tabs.d.ts +1 -0
  91. package/dist/web-components/interaction/bds-tabs.js +1 -1
  92. package/dist/web-components/interaction/bds-toast-provider.js +1 -1
  93. package/dist/web-components/interaction/bds-tooltip.d.ts +19 -3
  94. package/dist/web-components/interaction/bds-tooltip.js +1 -1
  95. package/dist/web-components/interaction/form/bds-checkbox-group.d.ts +83 -0
  96. package/dist/web-components/interaction/form/bds-checkbox-group.js +7 -0
  97. package/dist/web-components/interaction/form/bds-checkbox.d.ts +6 -0
  98. package/dist/web-components/interaction/form/bds-checkbox.js +1 -1
  99. package/dist/web-components/interaction/form/bds-combobox.d.ts +18 -0
  100. package/dist/web-components/interaction/form/bds-combobox.js +1 -1
  101. package/dist/web-components/interaction/form/bds-field-group.d.ts +89 -0
  102. package/dist/web-components/interaction/form/bds-field-group.js +7 -0
  103. package/dist/web-components/interaction/form/bds-file-input.d.ts +1 -1
  104. package/dist/web-components/interaction/form/bds-file-input.js +1 -1
  105. package/dist/web-components/interaction/form/bds-form-input.d.ts +92 -0
  106. package/dist/web-components/interaction/form/bds-form-input.js +7 -0
  107. package/dist/web-components/interaction/form/bds-number-input.d.ts +18 -1
  108. package/dist/web-components/interaction/form/bds-number-input.js +1 -1
  109. package/dist/web-components/interaction/form/bds-radio-group.d.ts +81 -0
  110. package/dist/web-components/interaction/form/bds-radio-group.js +7 -0
  111. package/dist/web-components/interaction/form/bds-radio.d.ts +34 -6
  112. package/dist/web-components/interaction/form/bds-radio.js +1 -1
  113. package/dist/web-components/interaction/form/bds-segmented-control.d.ts +4 -4
  114. package/dist/web-components/interaction/form/bds-segmented-control.js +1 -1
  115. package/dist/web-components/interaction/form/bds-select.d.ts +22 -1
  116. package/dist/web-components/interaction/form/bds-select.js +1 -1
  117. package/dist/web-components/interaction/form/bds-slider.d.ts +42 -10
  118. package/dist/web-components/interaction/form/bds-slider.js +1 -1
  119. package/dist/web-components/interaction/form/bds-switch.d.ts +20 -0
  120. package/dist/web-components/interaction/form/bds-switch.js +1 -1
  121. package/dist/web-components/interaction/form/bds-textarea.d.ts +23 -3
  122. package/dist/web-components/interaction/form/bds-textarea.js +1 -1
  123. package/dist/web-components/layout/bds-grid-item.d.ts +63 -0
  124. package/dist/web-components/layout/bds-grid-item.js +7 -0
  125. package/dist/web-components/layout/bds-grid.d.ts +108 -0
  126. package/dist/web-components/layout/bds-grid.js +7 -0
  127. package/dist/web-components/ui/bds-alert.d.ts +16 -2
  128. package/dist/web-components/ui/bds-alert.js +1 -1
  129. package/dist/web-components/ui/bds-avatar.d.ts +2 -1
  130. package/dist/web-components/ui/bds-avatar.js +1 -1
  131. package/dist/web-components/ui/bds-badge.js +1 -1
  132. package/dist/web-components/ui/bds-breadcrumb.d.ts +3 -1
  133. package/dist/web-components/ui/bds-breadcrumb.js +1 -1
  134. package/dist/web-components/ui/bds-button-container.d.ts +52 -0
  135. package/dist/web-components/ui/bds-button-container.js +7 -0
  136. package/dist/web-components/ui/bds-button-group.d.ts +21 -0
  137. package/dist/web-components/ui/bds-button-group.js +8 -0
  138. package/dist/web-components/ui/bds-calendar.d.ts +121 -0
  139. package/dist/web-components/ui/bds-calendar.js +7 -0
  140. package/dist/web-components/ui/bds-card.d.ts +12 -3
  141. package/dist/web-components/ui/bds-card.js +1 -1
  142. package/dist/web-components/ui/bds-carousel.d.ts +98 -0
  143. package/dist/web-components/ui/bds-carousel.js +7 -0
  144. package/dist/web-components/ui/bds-description-list.js +1 -1
  145. package/dist/web-components/ui/bds-icon-wrapper.d.ts +0 -9
  146. package/dist/web-components/ui/bds-icon-wrapper.js +1 -1
  147. package/dist/web-components/ui/bds-link.js +1 -1
  148. package/dist/web-components/ui/bds-loading.js +1 -1
  149. package/dist/web-components/ui/bds-notification-banner.js +1 -1
  150. package/dist/web-components/ui/bds-pagination.d.ts +47 -0
  151. package/dist/web-components/ui/bds-pagination.js +7 -0
  152. package/dist/web-components/ui/bds-progress-circle.d.ts +3 -1
  153. package/dist/web-components/ui/bds-progress-circle.js +1 -1
  154. package/dist/web-components/ui/bds-progress.d.ts +3 -1
  155. package/dist/web-components/ui/bds-progress.js +1 -1
  156. package/dist/web-components/ui/bds-rating.js +1 -1
  157. package/dist/web-components/ui/bds-section-header.d.ts +18 -4
  158. package/dist/web-components/ui/bds-section-header.js +1 -1
  159. package/dist/web-components/ui/bds-separator.js +1 -1
  160. package/dist/web-components/ui/bds-skeleton.js +1 -1
  161. package/dist/web-components/ui/bds-table.d.ts +52 -0
  162. package/dist/web-components/ui/bds-table.js +7 -0
  163. package/dist/web-components/ui/bds-typography.d.ts +1 -0
  164. package/dist/web-components/ui/bds-typography.js +1 -1
  165. package/package.json +60 -3
  166. package/src/components/interaction/Button/Button.module.css +23 -14
  167. package/src/components/interaction/Button/Button.spec.tsx +20 -0
  168. package/src/components/interaction/Button/Button.tsx +2 -2
  169. package/src/components/interaction/Command/Command.mdx +5 -2
  170. package/src/components/interaction/Command/Command.module.css +23 -7
  171. package/src/components/interaction/Command/Command.spec.tsx +35 -0
  172. package/src/components/interaction/Command/Command.tsx +15 -4
  173. package/src/components/interaction/Command/index.ts +1 -1
  174. package/src/components/interaction/Dialog/Dialog.mdx +4 -4
  175. package/src/components/interaction/Dialog/Dialog.module.css +20 -0
  176. package/src/components/interaction/Dialog/Dialog.spec.tsx +20 -0
  177. package/src/components/interaction/Dialog/Dialog.tsx +8 -3
  178. package/src/components/interaction/Dialog/index.ts +1 -0
  179. package/src/components/interaction/Drawer/Drawer.mdx +5 -2
  180. package/src/components/interaction/Drawer/Drawer.module.css +34 -3
  181. package/src/components/interaction/Drawer/Drawer.spec.tsx +67 -1
  182. package/src/components/interaction/Drawer/Drawer.tsx +30 -12
  183. package/src/components/interaction/Drawer/index.ts +1 -0
  184. package/src/components/interaction/DropdownMenu/DropdownMenu.mdx +2 -0
  185. package/src/components/interaction/DropdownMenu/DropdownMenu.spec.tsx +34 -0
  186. package/src/components/interaction/DropdownMenu/DropdownMenu.tsx +15 -5
  187. package/src/components/interaction/DropdownMenu/index.ts +1 -0
  188. package/src/components/interaction/Popover/Popover.mdx +6 -2
  189. package/src/components/interaction/Popover/Popover.module.css +26 -18
  190. package/src/components/interaction/Popover/Popover.spec.tsx +38 -0
  191. package/src/components/interaction/Popover/Popover.tsx +19 -5
  192. package/src/components/interaction/Popover/index.ts +1 -0
  193. package/src/components/interaction/Rating/Rating.mdx +1 -1
  194. package/src/components/interaction/Rating/Rating.module.css +2 -2
  195. package/src/components/interaction/Rating/Rating.tsx +1 -1
  196. package/src/components/interaction/Rating/index.ts +1 -0
  197. package/src/components/interaction/Toast/Toast.mdx +3 -0
  198. package/src/components/interaction/Toast/Toast.module.css +35 -5
  199. package/src/components/interaction/Toast/Toast.spec.tsx +69 -1
  200. package/src/components/interaction/Toast/Toast.tsx +15 -9
  201. package/src/components/interaction/form/Checkbox/Checkbox.mdx +3 -0
  202. package/src/components/interaction/form/Checkbox/Checkbox.module.css +13 -6
  203. package/src/components/interaction/form/Checkbox/Checkbox.spec.tsx +6 -0
  204. package/src/components/interaction/form/Checkbox/Checkbox.tsx +1 -1
  205. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.mdx +16 -1
  206. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.module.css +24 -8
  207. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.spec.tsx +32 -2
  208. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.tsx +14 -2
  209. package/src/components/interaction/form/Combobox/Combobox.mdx +11 -4
  210. package/src/components/interaction/form/Combobox/Combobox.module.css +6 -6
  211. package/src/components/interaction/form/Combobox/Combobox.spec.tsx +47 -0
  212. package/src/components/interaction/form/Combobox/Combobox.tsx +10 -5
  213. package/src/components/interaction/form/FieldGroup/FieldGroup.mdx +9 -10
  214. package/src/components/interaction/form/FieldGroup/FieldGroup.module.css +57 -23
  215. package/src/components/interaction/form/FieldGroup/FieldGroup.spec.tsx +129 -7
  216. package/src/components/interaction/form/FieldGroup/FieldGroup.tsx +72 -12
  217. package/src/components/interaction/form/FileInput/FileInput.mdx +9 -1
  218. package/src/components/interaction/form/FileInput/FileInput.module.css +8 -8
  219. package/src/components/interaction/form/FileInput/FileInput.spec.tsx +89 -1
  220. package/src/components/interaction/form/FileInput/FileInput.tsx +6 -2
  221. package/src/components/interaction/form/FormInput/FormInput.mdx +9 -5
  222. package/src/components/interaction/form/FormInput/FormInput.module.css +17 -8
  223. package/src/components/interaction/form/FormInput/FormInput.spec.tsx +20 -0
  224. package/src/components/interaction/form/FormInput/FormInput.tsx +7 -2
  225. package/src/components/interaction/form/NumberInput/NumberInput.mdx +5 -1
  226. package/src/components/interaction/form/NumberInput/NumberInput.module.css +6 -6
  227. package/src/components/interaction/form/NumberInput/NumberInput.spec.tsx +51 -0
  228. package/src/components/interaction/form/NumberInput/NumberInput.tsx +36 -8
  229. package/src/components/interaction/form/Radio/Radio.mdx +8 -1
  230. package/src/components/interaction/form/Radio/Radio.module.css +20 -7
  231. package/src/components/interaction/form/Radio/Radio.spec.tsx +15 -0
  232. package/src/components/interaction/form/Radio/Radio.tsx +10 -4
  233. package/src/components/interaction/form/RadioGroup/RadioGroup.mdx +16 -1
  234. package/src/components/interaction/form/RadioGroup/RadioGroup.module.css +24 -8
  235. package/src/components/interaction/form/RadioGroup/RadioGroup.spec.tsx +32 -2
  236. package/src/components/interaction/form/RadioGroup/RadioGroup.tsx +14 -2
  237. package/src/components/interaction/form/SegmentedControl/SegmentedControl.mdx +9 -3
  238. package/src/components/interaction/form/SegmentedControl/SegmentedControl.module.css +25 -12
  239. package/src/components/interaction/form/SegmentedControl/SegmentedControl.spec.tsx +86 -5
  240. package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +44 -4
  241. package/src/components/interaction/form/Select/Select.mdx +10 -4
  242. package/src/components/interaction/form/Select/Select.module.css +4 -4
  243. package/src/components/interaction/form/Select/Select.spec.tsx +34 -0
  244. package/src/components/interaction/form/Select/Select.tsx +21 -9
  245. package/src/components/interaction/form/Slider/Slider.mdx +4 -1
  246. package/src/components/interaction/form/Slider/Slider.module.css +32 -8
  247. package/src/components/interaction/form/Slider/Slider.spec.tsx +29 -0
  248. package/src/components/interaction/form/Slider/Slider.tsx +9 -7
  249. package/src/components/interaction/form/Switch/Switch.mdx +2 -2
  250. package/src/components/interaction/form/Switch/Switch.module.css +12 -13
  251. package/src/components/interaction/form/Switch/Switch.spec.tsx +20 -0
  252. package/src/components/interaction/form/Switch/Switch.tsx +2 -1
  253. package/src/components/interaction/form/Textarea/Textarea.mdx +5 -0
  254. package/src/components/interaction/form/Textarea/Textarea.module.css +5 -5
  255. package/src/components/interaction/form/Textarea/Textarea.spec.tsx +13 -0
  256. package/src/components/interaction/form/Textarea/Textarea.tsx +3 -1
  257. package/src/components/interaction/form/atoms/Message.module.css +1 -1
  258. package/src/components/interaction/form/atoms/Message.spec.tsx +29 -0
  259. package/src/components/interaction/form/atoms/Message.tsx +1 -1
  260. package/src/components/layout/ButtonGroup/ButtonGroup.mdx +11 -0
  261. package/src/components/layout/ButtonGroup/ButtonGroup.module.css +1 -5
  262. package/src/components/layout/ButtonGroup/ButtonGroup.stories.tsx +14 -0
  263. package/src/components/layout/Card/Card.mdx +6 -1
  264. package/src/components/layout/Card/Card.module.css +26 -5
  265. package/src/components/layout/Card/Card.spec.tsx +7 -0
  266. package/src/components/layout/Card/Card.tsx +4 -3
  267. package/src/components/layout/Grid/Grid.spec.tsx +44 -0
  268. package/src/components/layout/Grid/Grid.tsx +5 -5
  269. package/src/components/layout/Grid/GridItem.tsx +6 -6
  270. package/src/components/layout/Grid/masonry.ts +31 -5
  271. package/src/components/layout/Grid/useIsomorphicLayoutEffect.ts +11 -0
  272. package/src/components/layout/IconWrapper/IconWrapper.mdx +8 -2
  273. package/src/components/layout/IconWrapper/IconWrapper.module.css +9 -6
  274. package/src/components/layout/SectionHeader/SectionHeader.mdx +4 -1
  275. package/src/components/layout/SectionHeader/SectionHeader.module.css +10 -9
  276. package/src/components/ui/Accordion/Accordion.mdx +4 -1
  277. package/src/components/ui/Accordion/Accordion.module.css +2 -1
  278. package/src/components/ui/Alert/Alert.mdx +21 -4
  279. package/src/components/ui/Alert/Alert.module.css +9 -4
  280. package/src/components/ui/Alert/Alert.spec.tsx +20 -0
  281. package/src/components/ui/Avatar/Avatar.mdx +8 -3
  282. package/src/components/ui/Avatar/Avatar.module.css +13 -8
  283. package/src/components/ui/Badge/Badge.mdx +3 -1
  284. package/src/components/ui/Breadcrumb/Breadcrumb.mdx +3 -0
  285. package/src/components/ui/Breadcrumb/Breadcrumb.module.css +4 -0
  286. package/src/components/ui/Breadcrumb/Breadcrumb.spec.tsx +12 -0
  287. package/src/components/ui/Breadcrumb/Breadcrumb.tsx +11 -3
  288. package/src/components/ui/Calendar/Calendar.mdx +6 -0
  289. package/src/components/ui/Calendar/Calendar.module.css +68 -19
  290. package/src/components/ui/Calendar/Calendar.spec.tsx +139 -24
  291. package/src/components/ui/Calendar/Calendar.stories.tsx +14 -0
  292. package/src/components/ui/Calendar/Calendar.tsx +143 -154
  293. package/src/components/ui/Calendar/CalendarRange.mdx +39 -0
  294. package/src/components/ui/Calendar/CalendarRange.spec.tsx +119 -0
  295. package/src/components/ui/Calendar/CalendarRange.stories.tsx +51 -0
  296. package/src/components/ui/Calendar/CalendarRange.tsx +213 -0
  297. package/src/components/ui/Calendar/MonthGrid.tsx +141 -0
  298. package/src/components/ui/Calendar/calendar-core.spec.ts +176 -0
  299. package/src/components/ui/Calendar/calendar-core.ts +164 -0
  300. package/src/components/ui/Calendar/index.ts +1 -0
  301. package/src/components/ui/Carousel/Carousel.mdx +8 -3
  302. package/src/components/ui/Carousel/Carousel.module.css +7 -5
  303. package/src/components/ui/Carousel/Carousel.spec.tsx +67 -0
  304. package/src/components/ui/Carousel/Carousel.tsx +19 -7
  305. package/src/components/ui/Collapsible/Collapsible.mdx +17 -6
  306. package/src/components/ui/Collapsible/Collapsible.module.css +7 -2
  307. package/src/components/ui/Collapsible/Collapsible.spec.tsx +40 -0
  308. package/src/components/ui/Collapsible/Collapsible.tsx +19 -2
  309. package/src/components/ui/DescriptionList/DescriptionList.mdx +2 -0
  310. package/src/components/ui/Link/Link.mdx +4 -2
  311. package/src/components/ui/Loading/Loading.mdx +6 -3
  312. package/src/components/ui/Loading/Loading.module.css +7 -7
  313. package/src/components/ui/Loading/Loading.spec.tsx +12 -0
  314. package/src/components/ui/Loading/Loading.tsx +8 -3
  315. package/src/components/ui/NotificationBanner/NotificationBanner.mdx +4 -0
  316. package/src/components/ui/NotificationBanner/NotificationBanner.module.css +5 -0
  317. package/src/components/ui/NotificationBanner/NotificationBanner.spec.tsx +20 -0
  318. package/src/components/ui/Pagination/Pagination.mdx +29 -7
  319. package/src/components/ui/Pagination/Pagination.module.css +15 -14
  320. package/src/components/ui/Progress/Progress.mdx +6 -2
  321. package/src/components/ui/Progress/Progress.module.css +1 -1
  322. package/src/components/ui/Progress/Progress.spec.tsx +17 -0
  323. package/src/components/ui/Progress/Progress.tsx +2 -2
  324. package/src/components/ui/ProgressCircle/ProgressCircle.mdx +8 -4
  325. package/src/components/ui/ProgressCircle/ProgressCircle.module.css +2 -2
  326. package/src/components/ui/ProgressCircle/ProgressCircle.spec.tsx +11 -1
  327. package/src/components/ui/ProgressCircle/ProgressCircle.tsx +1 -1
  328. package/src/components/ui/Separator/Separator.mdx +7 -0
  329. package/src/components/ui/Separator/Separator.module.css +1 -0
  330. package/src/components/ui/Skeleton/Skeleton.mdx +17 -0
  331. package/src/components/ui/Skeleton/Skeleton.module.css +12 -5
  332. package/src/components/ui/SkipLink/SkipLink.mdx +19 -0
  333. package/src/components/ui/SkipLink/SkipLink.module.css +8 -7
  334. package/src/components/ui/SkipLink/SkipLink.spec.tsx +28 -0
  335. package/src/components/ui/Table/Table.mdx +14 -0
  336. package/src/components/ui/Table/Table.module.css +13 -8
  337. package/src/components/ui/Table/Table.spec.tsx +56 -0
  338. package/src/components/ui/Table/Table.tsx +44 -6
  339. package/src/components/ui/Tabs/Tabs.mdx +16 -0
  340. package/src/components/ui/Tabs/Tabs.module.css +3 -3
  341. package/src/components/ui/Tabs/Tabs.spec.tsx +20 -0
  342. package/src/components/ui/Tabs/Tabs.tsx +5 -1
  343. package/src/components/ui/Tooltip/Tooltip.mdx +9 -0
  344. package/src/components/ui/Tooltip/Tooltip.module.css +32 -12
  345. package/src/components/ui/Tooltip/Tooltip.spec.tsx +56 -0
  346. package/src/components/ui/Tooltip/Tooltip.tsx +26 -7
  347. package/src/components/ui/Typography/Typography.mdx +7 -0
  348. package/src/components/ui/Typography/Typography.module.css +5 -5
  349. package/src/index.ts +7 -3
  350. package/src/stories/DesignSystem/Borders.mdx +14 -9
  351. package/src/stories/DesignSystem/Colors.mdx +43 -41
  352. package/src/stories/DesignSystem/Overview.mdx +4 -3
  353. package/src/stories/Introduction.mdx +5 -5
  354. package/src/web-components/globals.ts +7 -0
  355. package/src/web-components/index.ts +2 -0
  356. package/src/web-components/interaction/BdsAccordion.mdx +10 -1
  357. package/src/web-components/interaction/BdsButton.mdx +15 -4
  358. package/src/web-components/interaction/BdsButton.stories.tsx +1 -1
  359. package/src/web-components/interaction/BdsCollapsible.mdx +3 -3
  360. package/src/web-components/interaction/BdsDialog.mdx +12 -7
  361. package/src/web-components/interaction/BdsDialog.stories.tsx +2 -2
  362. package/src/web-components/interaction/BdsDrawer.mdx +9 -6
  363. package/src/web-components/interaction/BdsDropdownMenu.mdx +20 -1
  364. package/src/web-components/interaction/BdsPopover.mdx +7 -3
  365. package/src/web-components/interaction/BdsSkipLink.mdx +14 -1
  366. package/src/web-components/interaction/BdsTabs.mdx +18 -1
  367. package/src/web-components/interaction/BdsToastProvider.mdx +21 -3
  368. package/src/web-components/interaction/BdsTooltip.mdx +4 -4
  369. package/src/web-components/interaction/bds-accordion-item.ts +10 -0
  370. package/src/web-components/interaction/bds-accordion.spec.ts +41 -0
  371. package/src/web-components/interaction/bds-accordion.ts +28 -2
  372. package/src/web-components/interaction/bds-button.spec.ts +81 -0
  373. package/src/web-components/interaction/bds-button.ts +60 -13
  374. package/src/web-components/interaction/bds-collapsible.spec.ts +93 -2
  375. package/src/web-components/interaction/bds-collapsible.ts +49 -7
  376. package/src/web-components/interaction/bds-dialog.spec.ts +49 -0
  377. package/src/web-components/interaction/bds-dialog.ts +68 -11
  378. package/src/web-components/interaction/bds-drawer.spec.ts +93 -4
  379. package/src/web-components/interaction/bds-drawer.ts +54 -21
  380. package/src/web-components/interaction/bds-dropdown-menu-item.ts +12 -1
  381. package/src/web-components/interaction/bds-dropdown-menu.spec.ts +63 -0
  382. package/src/web-components/interaction/bds-dropdown-menu.ts +45 -7
  383. package/src/web-components/interaction/bds-popover.spec.ts +80 -6
  384. package/src/web-components/interaction/bds-popover.ts +83 -32
  385. package/src/web-components/interaction/bds-skip-link.spec.ts +18 -0
  386. package/src/web-components/interaction/bds-skip-link.ts +29 -8
  387. package/src/web-components/interaction/bds-tab-panel.ts +10 -0
  388. package/src/web-components/interaction/bds-tab.spec.ts +25 -0
  389. package/src/web-components/interaction/bds-tab.ts +20 -5
  390. package/src/web-components/interaction/bds-tabs.spec.ts +92 -5
  391. package/src/web-components/interaction/bds-tabs.ts +42 -1
  392. package/src/web-components/interaction/bds-toast-provider.spec.ts +43 -0
  393. package/src/web-components/interaction/bds-toast-provider.ts +50 -21
  394. package/src/web-components/interaction/bds-tooltip.spec.ts +71 -0
  395. package/src/web-components/interaction/bds-tooltip.ts +100 -5
  396. package/src/web-components/interaction/form/BdsCheckbox.mdx +20 -1
  397. package/src/web-components/interaction/form/BdsCheckbox.stories.tsx +8 -0
  398. package/src/web-components/interaction/form/BdsCheckboxGroup.mdx +4 -3
  399. package/src/web-components/interaction/form/BdsCombobox.mdx +39 -2
  400. package/src/web-components/interaction/form/BdsCombobox.stories.tsx +31 -0
  401. package/src/web-components/interaction/form/BdsFieldGroup.mdx +8 -3
  402. package/src/web-components/interaction/form/BdsFieldGroup.stories.tsx +1 -1
  403. package/src/web-components/interaction/form/BdsFileInput.mdx +26 -5
  404. package/src/web-components/interaction/form/BdsFormInput.mdx +16 -1
  405. package/src/web-components/interaction/form/BdsNumberInput.mdx +34 -2
  406. package/src/web-components/interaction/form/BdsNumberInput.stories.tsx +27 -3
  407. package/src/web-components/interaction/form/BdsRadio.mdx +39 -12
  408. package/src/web-components/interaction/form/BdsRadio.stories.tsx +26 -0
  409. package/src/web-components/interaction/form/BdsRadioGroup.mdx +9 -4
  410. package/src/web-components/interaction/form/BdsSegmentedControl.mdx +37 -11
  411. package/src/web-components/interaction/form/BdsSelect.mdx +22 -4
  412. package/src/web-components/interaction/form/BdsSelect.stories.tsx +33 -0
  413. package/src/web-components/interaction/form/BdsSlider.mdx +36 -19
  414. package/src/web-components/interaction/form/BdsSlider.stories.tsx +24 -0
  415. package/src/web-components/interaction/form/BdsSwitch.mdx +38 -11
  416. package/src/web-components/interaction/form/BdsSwitch.stories.tsx +16 -0
  417. package/src/web-components/interaction/form/BdsTextarea.mdx +42 -16
  418. package/src/web-components/interaction/form/BdsTextarea.stories.tsx +21 -0
  419. package/src/web-components/interaction/form/bds-checkbox-group.spec.ts +99 -0
  420. package/src/web-components/interaction/form/bds-checkbox-group.ts +95 -9
  421. package/src/web-components/interaction/form/bds-checkbox.spec.ts +55 -0
  422. package/src/web-components/interaction/form/bds-checkbox.ts +30 -5
  423. package/src/web-components/interaction/form/bds-combobox.spec.ts +79 -0
  424. package/src/web-components/interaction/form/bds-combobox.ts +102 -17
  425. package/src/web-components/interaction/form/bds-field-group.spec.ts +158 -0
  426. package/src/web-components/interaction/form/bds-field-group.ts +167 -23
  427. package/src/web-components/interaction/form/bds-file-input.spec.ts +73 -5
  428. package/src/web-components/interaction/form/bds-file-input.ts +71 -34
  429. package/src/web-components/interaction/form/bds-form-input.spec.ts +22 -0
  430. package/src/web-components/interaction/form/bds-form-input.ts +27 -16
  431. package/src/web-components/interaction/form/bds-number-input.spec.ts +49 -0
  432. package/src/web-components/interaction/form/bds-number-input.ts +118 -29
  433. package/src/web-components/interaction/form/bds-radio-group.spec.ts +57 -0
  434. package/src/web-components/interaction/form/bds-radio-group.ts +60 -12
  435. package/src/web-components/interaction/form/bds-radio.spec.ts +123 -0
  436. package/src/web-components/interaction/form/bds-radio.ts +136 -23
  437. package/src/web-components/interaction/form/bds-segmented-control.spec.ts +55 -0
  438. package/src/web-components/interaction/form/bds-segmented-control.ts +81 -59
  439. package/src/web-components/interaction/form/bds-select.spec.ts +57 -0
  440. package/src/web-components/interaction/form/bds-select.ts +96 -8
  441. package/src/web-components/interaction/form/bds-slider.spec.ts +83 -0
  442. package/src/web-components/interaction/form/bds-slider.ts +181 -33
  443. package/src/web-components/interaction/form/bds-switch.spec.ts +68 -0
  444. package/src/web-components/interaction/form/bds-switch.ts +142 -41
  445. package/src/web-components/interaction/form/bds-textarea.spec.ts +71 -0
  446. package/src/web-components/interaction/form/bds-textarea.ts +109 -8
  447. package/src/web-components/layout/BdsGrid.mdx +6 -2
  448. package/src/web-components/layout/BdsGrid.stories.tsx +4 -0
  449. package/src/web-components/layout/bds-grid-item.spec.ts +21 -0
  450. package/src/web-components/layout/bds-grid-item.ts +17 -3
  451. package/src/web-components/layout/bds-grid.spec.ts +98 -0
  452. package/src/web-components/layout/bds-grid.ts +139 -19
  453. package/src/web-components/ui/BdsAlert.mdx +6 -5
  454. package/src/web-components/ui/BdsAlert.stories.tsx +6 -6
  455. package/src/web-components/ui/BdsAvatar.mdx +4 -2
  456. package/src/web-components/ui/BdsBreadcrumb.mdx +3 -2
  457. package/src/web-components/ui/BdsButtonContainer.mdx +64 -0
  458. package/src/web-components/ui/BdsButtonContainer.stories.tsx +84 -0
  459. package/src/web-components/ui/BdsCalendar.mdx +29 -4
  460. package/src/web-components/ui/BdsCalendar.stories.tsx +16 -18
  461. package/src/web-components/ui/BdsCalendarRange.mdx +71 -0
  462. package/src/web-components/ui/BdsCalendarRange.stories.tsx +31 -0
  463. package/src/web-components/ui/BdsCard.mdx +7 -3
  464. package/src/web-components/ui/BdsCard.stories.tsx +17 -1
  465. package/src/web-components/ui/BdsCarousel.mdx +40 -12
  466. package/src/web-components/ui/BdsDescriptionList.mdx +6 -1
  467. package/src/web-components/ui/BdsIconWrapper.mdx +3 -2
  468. package/src/web-components/ui/BdsLink.mdx +14 -2
  469. package/src/web-components/ui/BdsNotificationBanner.mdx +18 -0
  470. package/src/web-components/ui/BdsPagination.mdx +40 -1
  471. package/src/web-components/ui/BdsProgress.mdx +8 -2
  472. package/src/web-components/ui/BdsProgressCircle.mdx +5 -2
  473. package/src/web-components/ui/BdsRating.mdx +7 -0
  474. package/src/web-components/ui/BdsSectionHeader.mdx +22 -3
  475. package/src/web-components/ui/BdsSectionHeader.stories.tsx +15 -13
  476. package/src/web-components/ui/BdsTable.mdx +23 -2
  477. package/src/web-components/ui/BdsTable.stories.tsx +8 -2
  478. package/src/web-components/ui/BdsTypography.mdx +17 -1
  479. package/src/web-components/ui/bds-alert.spec.ts +17 -2
  480. package/src/web-components/ui/bds-alert.ts +31 -5
  481. package/src/web-components/ui/bds-avatar.spec.ts +29 -0
  482. package/src/web-components/ui/bds-avatar.ts +30 -12
  483. package/src/web-components/ui/bds-badge.spec.ts +5 -0
  484. package/src/web-components/ui/bds-badge.ts +11 -1
  485. package/src/web-components/ui/bds-breadcrumb.spec.ts +30 -0
  486. package/src/web-components/ui/bds-breadcrumb.ts +26 -4
  487. package/src/web-components/ui/bds-button-container.spec.ts +39 -0
  488. package/src/web-components/ui/bds-button-container.ts +123 -0
  489. package/src/web-components/ui/bds-button-group.spec.ts +14 -20
  490. package/src/web-components/ui/bds-button-group.ts +13 -64
  491. package/src/web-components/ui/bds-calendar-range.spec.ts +123 -0
  492. package/src/web-components/ui/bds-calendar-range.ts +307 -0
  493. package/src/web-components/ui/bds-calendar.spec.ts +176 -0
  494. package/src/web-components/ui/bds-calendar.ts +186 -344
  495. package/src/web-components/ui/bds-card.spec.ts +32 -0
  496. package/src/web-components/ui/bds-card.ts +34 -9
  497. package/src/web-components/ui/bds-carousel.spec.ts +147 -0
  498. package/src/web-components/ui/bds-carousel.ts +113 -36
  499. package/src/web-components/ui/bds-description-list.spec.ts +15 -0
  500. package/src/web-components/ui/bds-description-list.ts +37 -3
  501. package/src/web-components/ui/bds-icon-wrapper.spec.ts +12 -0
  502. package/src/web-components/ui/bds-icon-wrapper.ts +16 -15
  503. package/src/web-components/ui/bds-link.spec.ts +17 -0
  504. package/src/web-components/ui/bds-link.ts +26 -11
  505. package/src/web-components/ui/bds-loading.ts +11 -1
  506. package/src/web-components/ui/bds-notification-banner.spec.ts +13 -0
  507. package/src/web-components/ui/bds-notification-banner.ts +18 -1
  508. package/src/web-components/ui/bds-pagination.spec.ts +44 -0
  509. package/src/web-components/ui/bds-pagination.ts +39 -19
  510. package/src/web-components/ui/bds-progress-circle.spec.ts +21 -0
  511. package/src/web-components/ui/bds-progress-circle.ts +17 -5
  512. package/src/web-components/ui/bds-progress.spec.ts +21 -0
  513. package/src/web-components/ui/bds-progress.ts +19 -6
  514. package/src/web-components/ui/bds-rating.spec.ts +6 -0
  515. package/src/web-components/ui/bds-rating.ts +12 -2
  516. package/src/web-components/ui/bds-section-header.spec.ts +39 -8
  517. package/src/web-components/ui/bds-section-header.ts +47 -13
  518. package/src/web-components/ui/bds-separator.ts +10 -0
  519. package/src/web-components/ui/bds-skeleton.ts +10 -0
  520. package/src/web-components/ui/bds-table.spec.ts +63 -0
  521. package/src/web-components/ui/bds-table.ts +88 -28
  522. package/src/web-components/ui/bds-typography.spec.ts +47 -0
  523. package/src/web-components/ui/bds-typography.ts +28 -10
  524. package/src/web-components/ui/calendar-styles.ts +94 -0
  525. package/dist/web-components/chunk-5TFWOPLH.js +0 -49
  526. package/dist/web-components/chunk-7FMR53BW.js +0 -127
  527. package/dist/web-components/chunk-AGKJTMJI.js +0 -56
  528. package/dist/web-components/chunk-BQLZ7I4G.js +0 -56
  529. package/dist/web-components/chunk-IYGF6CD5.js +0 -118
  530. package/dist/web-components/chunk-QBB6ZX4R.js +0 -107
  531. package/dist/web-components/chunk-Y3POAKGS.js +0 -133
  532. package/dist/web-components/chunk-Y4MAXTMA.js +0 -80
  533. package/dist/web-components/chunk-Y7V7LM6R.js +0 -98
  534. package/src/web-components/ui/BdsButtonGroup.mdx +0 -69
  535. package/src/web-components/ui/BdsButtonGroup.stories.tsx +0 -66
@@ -5,7 +5,7 @@ import * as Stories from './BdsSlider.stories';
5
5
 
6
6
  # <bds-slider>
7
7
 
8
- Form-associated range slider. Wraps a native `<input type="range">` with a styled fill track driven by the `--slider_fill` CSS custom property.
8
+ Form-associated range slider. Wraps a native `<input type="range">` with a styled fill track driven by the `--slider_fill` CSS custom property, plus label/hint/error wiring matching the other form web components.
9
9
 
10
10
  > **Status: experimental** — API may change before stable release.
11
11
 
@@ -30,6 +30,12 @@ Use `<bds-slider>` for continuous or stepped numeric ranges — volume controls,
30
30
  ### With custom min/max (1–5)
31
31
  <Canvas of={Stories.WithMinMax} />
32
32
 
33
+ ### With label and value
34
+ <Canvas of={Stories.WithLabel} />
35
+
36
+ ### Error state
37
+ <Canvas of={Stories.WithError} />
38
+
33
39
  ### Disabled
34
40
  <Canvas of={Stories.Disabled} />
35
41
 
@@ -39,39 +45,50 @@ Use `<bds-slider>` for continuous or stepped numeric ranges — volume controls,
39
45
 
40
46
  ## Attributes
41
47
 
42
- | Attribute | Type | Default | Description |
43
- |------------|---------|---------|------------------------------------------|
44
- | `name` | string | `""` | Form field name |
45
- | `value` | number | `0` | Current value |
46
- | `min` | number | `0` | Minimum value |
47
- | `max` | number | `100` | Maximum value |
48
- | `step` | number | `1` | Step increment |
49
- | `disabled` | boolean | `false` | Disables the slider |
48
+ | Attribute | Type | Default | Description |
49
+ |--------------|---------|---------|-------------------------------------------------------|
50
+ | `name` | string | `""` | Form field name |
51
+ | `value` | number | `0` | Current value |
52
+ | `min` | number | `0` | Minimum value |
53
+ | `max` | number | `100` | Maximum value |
54
+ | `step` | number | `1` | Step increment |
55
+ | `label` | string | `""` | Visible label text, associated with the input via `for`/`id` |
56
+ | `hint` | string | — | Helper text shown below the slider |
57
+ | `error` | string | — | Error message; when set the slider enters error state and the input gets `aria-invalid="true"` |
58
+ | `show-value` | boolean | `false` | Shows the current value next to the label |
59
+ | `disabled` | boolean | `false` | Disables the slider |
50
60
 
51
61
  ## Events
52
62
 
53
- | Event | Detail | Description |
54
- |----------|--------|--------------------------------------|
55
- | `input` | — | Fired continuously as the user drags |
56
- | `change` | | Fired when the user releases |
63
+ | Event | Detail | Description |
64
+ |--------------|-------------------|-----------------------------------------------------------------------------------------------------------|
65
+ | `input` | — | Native event, fired continuously as the user drags |
66
+ | `bds-change` | `{ value: number }` | Fired when the user releases. Re-dispatched from the host as a composed event so it reliably crosses the shadow boundary — the native `change` event does not. |
57
67
 
58
68
  ## CSS Custom Properties
59
69
 
60
- | Property | Description |
61
- |-------------------------|-----------------------------------------|
62
- | `--slider_fill-color` | Fill track colour (defaults to `--bds-color_interactive`) |
63
- | `--slider_track-color` | Unfilled track colour (defaults to `--bds-color_bg--subtle`) |
64
- | `--slider_thumb-color` | Thumb colour (defaults to `--bds-color_interactive`) |
70
+ | Property | Description | Default |
71
+ |---------------------------|-------------------------------------------------------|-----------------------------------|
72
+ | `--slider_color` | Track `color` (used as a fallback text/context colour) | `--bds-color_on-bg` |
73
+ | `--slider_color-active` | Fill track + thumb colour | `--bdc-color_active` |
74
+ | `--slider_color--error` | Fill track + thumb colour when `error` is set | `--bds-color_error` |
75
+ | `--slider_track-bg` | Unfilled track colour | `--bds-color_bg--subtle` |
76
+ | `--slider_track-height` | Track thickness | `--bds-space_xxs` |
77
+ | `--slider_track-radius` | Track corner radius | `--bds-border_radius--full` |
78
+ | `--slider_thumb-size` | Thumb diameter | `calc(--bds-space_s * 2)` |
79
+ | `--slider_thumb-radius` | Thumb corner radius | `--bds-border_radius--circle` |
65
80
 
66
81
  ## Usage in plain HTML
67
82
 
68
83
  ```html
69
- <bds-slider name="volume" value="50" min="0" max="100" step="5"></bds-slider>
84
+ <bds-slider name="volume" label="Volume" value="50" min="0" max="100" step="5" show-value></bds-slider>
70
85
  ```
71
86
 
72
87
  ## Accessibility
73
88
 
74
89
  - Wraps a native `<input type="range">` which has full browser and assistive technology support
90
+ - `label` renders a shadow `<label for>` bound to the input — set it so the slider has an accessible name
91
+ - `hint`/`error` text is wired to the input via `aria-describedby`; `error` also sets `aria-invalid="true"`
75
92
  - Arrow keys adjust the value by `step`
76
93
  - `disabled` prevents interaction and reduces opacity
77
94
  - Participates in HTML forms via the Form-Associated Custom Elements API
@@ -8,6 +8,10 @@ function BdsSlider({
8
8
  min,
9
9
  max,
10
10
  step,
11
+ label,
12
+ hint,
13
+ error,
14
+ showValue,
11
15
  disabled,
12
16
  }: {
13
17
  name?: string;
@@ -15,6 +19,10 @@ function BdsSlider({
15
19
  min?: number;
16
20
  max?: number;
17
21
  step?: number;
22
+ label?: string;
23
+ hint?: string;
24
+ error?: string;
25
+ showValue?: boolean;
18
26
  disabled?: boolean;
19
27
  }) {
20
28
  return React.createElement('bds-slider', {
@@ -23,6 +31,10 @@ function BdsSlider({
23
31
  min,
24
32
  max,
25
33
  step,
34
+ label,
35
+ hint,
36
+ error,
37
+ 'show-value': showValue || undefined,
26
38
  disabled: disabled || undefined,
27
39
  });
28
40
  }
@@ -37,6 +49,10 @@ const meta = {
37
49
  min: { control: 'number' },
38
50
  max: { control: 'number' },
39
51
  step: { control: 'number' },
52
+ label: { control: 'text' },
53
+ hint: { control: 'text' },
54
+ error: { control: 'text' },
55
+ showValue: { control: 'boolean' },
40
56
  disabled: { control: 'boolean' },
41
57
  },
42
58
  decorators: [
@@ -63,6 +79,14 @@ export const WithMinMax: Story = {
63
79
  args: { name: 'rating', value: 3, min: 1, max: 5 },
64
80
  };
65
81
 
82
+ export const WithLabel: Story = {
83
+ args: { name: 'volume', label: 'Volume', value: 50, showValue: true, hint: 'Adjust the playback volume' },
84
+ };
85
+
86
+ export const WithError: Story = {
87
+ args: { name: 'volume', label: 'Volume', value: 90, error: 'Value exceeds the recommended maximum' },
88
+ };
89
+
66
90
  export const Disabled: Story = {
67
91
  args: { name: 'volume', value: 40, disabled: true },
68
92
  };
@@ -30,19 +30,27 @@ Use `<bds-switch>` for binary on/off settings where the change takes immediate e
30
30
  ### Disabled
31
31
  <Canvas of={Stories.Disabled} />
32
32
 
33
+ ### Small size
34
+ <Canvas of={Stories.Small} />
35
+
36
+ ### With error
37
+ <Canvas of={Stories.WithError} />
38
+
33
39
  ## Props
34
40
 
35
41
  <ArgTypes of={Stories} />
36
42
 
37
43
  ## Attributes
38
44
 
39
- | Attribute | Type | Default | Description |
40
- |------------|---------|---------|--------------------------------------------------|
41
- | `name` | string | `""` | Form field name |
42
- | `value` | string | `"on"` | Value submitted when the switch is on |
43
- | `checked` | boolean | `false` | Whether the switch is on |
44
- | `required` | boolean | `false` | Marks the field as required |
45
- | `disabled` | boolean | `false` | Disables the switch |
45
+ | Attribute | Type | Default | Description |
46
+ |------------|---------|------------|--------------------------------------------------------------|
47
+ | `name` | string | `""` | Form field name |
48
+ | `value` | string | `"on"` | Value submitted when the switch is on |
49
+ | `checked` | boolean | `false` | Whether the switch is on |
50
+ | `required` | boolean | `false` | Marks the field as required |
51
+ | `disabled` | boolean | `false` | Disables the switch |
52
+ | `error` | string | — | Error message; when set the track shows the error colour and the input reports `aria-invalid="true"` |
53
+ | `size` | string | `"medium"` | Track/thumb size: `small`, `medium`, `large` |
46
54
 
47
55
  ## Slots
48
56
 
@@ -52,21 +60,40 @@ Use `<bds-switch>` for binary on/off settings where the change takes immediate e
52
60
 
53
61
  ## Events
54
62
 
55
- | Event | Detail | Description |
56
- |----------|--------|------------------------------------------------|
57
- | `change` | | Fired when the switch state changes |
63
+ | Event | Detail | Description |
64
+ |--------------|------------------------|----------------------------------------------------------------------------------------------------------------|
65
+ | `bds-change` | `{ checked: boolean }` | Composed event fired when the switch is toggled; crosses the shadow boundary so it can be listened for on the host element |
58
66
 
59
67
  ## Usage in plain HTML
60
68
 
61
69
  ```html
62
70
  <bds-switch name="notifications" value="enabled">Enable notifications</bds-switch>
63
71
  <bds-switch name="darkMode" value="on" checked>Dark mode</bds-switch>
72
+ <bds-switch name="compact" size="small">Compact mode</bds-switch>
73
+ <bds-switch name="terms" required error="You must accept the terms">Accept terms</bds-switch>
64
74
  ```
65
75
 
76
+ ## CSS custom properties
77
+
78
+ | Property | Default | Description |
79
+ |----------------------------------|-------------------------------------------|---------------------------------------------|
80
+ | `--switch_color` | `var(--bds-color_on-bg)` | Label text colour |
81
+ | `--switch_thumb-size` | `1.25em` (`1em` small / `1.5em` large) | Thumb diameter — also drives track sizing |
82
+ | `--switch_track-pad` | `var(--bds-space_xxxs)` | Padding between track edge and thumb |
83
+ | `--switch_track-radius` | `var(--bds-border_radius--full)` | Track corner radius |
84
+ | `--switch_track-bg` | `var(--bds-color_grey--subtle)` | Track background when off |
85
+ | `--switch_track-bg--active` | `var(--bdc-color_active--subtle)` | Track background when on |
86
+ | `--switch_thumb-bg` | `var(--bds-color_interactive)` | Thumb (and track border) colour when off |
87
+ | `--switch_thumb-bg--active` | `var(--bds-color_interactive)` | Thumb colour when on |
88
+ | `--switch_thumb-radius` | `var(--bds-border_radius--circle)` | Thumb corner radius |
89
+ | `--switch_border-color--error` | `var(--bds-color_error)` | Track border colour when `error` is set |
90
+ | `--switch_shadow` | `var(--bdc-outline_shadow)` | Track box-shadow tail |
91
+
66
92
  ## Accessibility
67
93
 
68
94
  - Uses `role="switch"` on the inner `<input type="checkbox">` for correct screen reader announcement
69
95
  - The inner `<input>` is associated with a `<label>` via matching `id`/`for` attributes
70
96
  - The visual track and thumb are inside the `<label>` — clicking the label or the track both toggle the switch
71
97
  - `disabled` sets `pointer-events: none` and reduces opacity
72
- - Participates in HTML forms via the Form-Associated Custom Elements API
98
+ - `error` sets `aria-invalid="true"` on the inner input
99
+ - Participates in HTML forms via the Form-Associated Custom Elements API; `formResetCallback` restores the switch's initial `checked` state on form reset
@@ -8,6 +8,8 @@ function BdsSwitch({
8
8
  checked,
9
9
  required,
10
10
  disabled,
11
+ error,
12
+ size,
11
13
  children,
12
14
  }: {
13
15
  name?: string;
@@ -15,6 +17,8 @@ function BdsSwitch({
15
17
  checked?: boolean;
16
18
  required?: boolean;
17
19
  disabled?: boolean;
20
+ error?: string;
21
+ size?: 'small' | 'medium' | 'large';
18
22
  children?: React.ReactNode;
19
23
  }) {
20
24
  return React.createElement(
@@ -25,6 +29,8 @@ function BdsSwitch({
25
29
  checked: checked || undefined,
26
30
  required: required || undefined,
27
31
  disabled: disabled || undefined,
32
+ error,
33
+ size,
28
34
  },
29
35
  children,
30
36
  );
@@ -39,6 +45,8 @@ const meta = {
39
45
  checked: { control: 'boolean' },
40
46
  required: { control: 'boolean' },
41
47
  disabled: { control: 'boolean' },
48
+ error: { control: 'text' },
49
+ size: { control: 'select', options: ['small', 'medium', 'large'] },
42
50
  },
43
51
  } satisfies Meta<typeof BdsSwitch>;
44
52
 
@@ -56,3 +64,11 @@ export const Checked: Story = {
56
64
  export const Disabled: Story = {
57
65
  args: { name: 'notifications', value: 'enabled', disabled: true, children: 'Notifications (disabled)' },
58
66
  };
67
+
68
+ export const Small: Story = {
69
+ args: { name: 'compact', value: 'enabled', size: 'small', children: 'Compact mode' },
70
+ };
71
+
72
+ export const WithError: Story = {
73
+ args: { name: 'terms', value: 'accepted', required: true, error: 'You must accept the terms', children: 'Accept terms' },
74
+ };
@@ -30,6 +30,15 @@ Use `<bds-textarea>` for multiline text entry — messages, comments, descriptio
30
30
  ### Tall (8 rows)
31
31
  <Canvas of={Stories.TallRows} />
32
32
 
33
+ ### With label
34
+ <Canvas of={Stories.WithLabel} />
35
+
36
+ ### With hint
37
+ <Canvas of={Stories.WithHint} />
38
+
39
+ ### With error
40
+ <Canvas of={Stories.WithError} />
41
+
33
42
  ### Required
34
43
  <Canvas of={Stories.Required} />
35
44
 
@@ -42,32 +51,49 @@ Use `<bds-textarea>` for multiline text entry — messages, comments, descriptio
42
51
 
43
52
  ## Attributes
44
53
 
45
- | Attribute | Type | Default | Description |
46
- |---------------|---------|---------|------------------------------------------|
47
- | `name` | string | `""` | Form field name |
48
- | `value` | string | `""` | Text value |
49
- | `placeholder` | string | `""` | Placeholder text |
50
- | `rows` | number | `4` | Number of visible rows |
51
- | `required` | boolean | `false` | Marks the field as required |
52
- | `disabled` | boolean | `false` | Disables the textarea |
54
+ | Attribute | Type | Default | Description |
55
+ |---------------|---------|---------|----------------------------------------------------------|
56
+ | `name` | string | `""` | Form field name |
57
+ | `value` | string | `""` | Text value |
58
+ | `placeholder` | string | `""` | Placeholder text |
59
+ | `rows` | number | `4` | Number of visible rows |
60
+ | `label` | string | `""` | Visible label text, associated via `for`/`id` |
61
+ | `hint` | string | | Helper text shown below the textarea |
62
+ | `error` | string | — | Error message; when set the textarea enters error state |
63
+ | `required` | boolean | `false` | Marks the field as required |
64
+ | `disabled` | boolean | `false` | Disables the textarea |
53
65
 
54
66
  ## Events
55
67
 
56
- | Event | Detail | Description |
57
- |----------|--------|-----------------------------------------------------|
58
- | `input` | | Fired on every keystroke (native input event) |
59
- | `change` | | Fired when the value is committed (native change event) |
68
+ | Event | Detail | Description |
69
+ |--------------|------------------------|-------------------------------------|
70
+ | `bds-input` | `{ value: string }` | Fired on every keystroke |
71
+ | `bds-change` | `{ value: string }` | Fired when the value is committed |
72
+
73
+ ## CSS Custom Properties
74
+
75
+ | Property | Description |
76
+ |-------------------------|-------------------------------------------------------------------|
77
+ | `--textarea_border` | Native `border` shorthand (defaults to `none`; the frame is drawn by the inset bdc box-shadow) |
78
+ | `--textarea_radius` | Border radius (defaults to `--bdc-outline_radius--l`) |
79
+ | `--textarea_shadow` | Extra `box-shadow` layer appended after the bdc frame shadow |
80
+ | `--textarea_color_bg` | Background colour (defaults to `--bds-color_bg`) |
81
+ | `--textarea_color` | Text colour (defaults to `--bds-color_on-bg`) |
60
82
 
61
83
  ## Usage in plain HTML
62
84
 
63
85
  ```html
64
- <bds-textarea name="message" placeholder="Enter message…" rows="6"></bds-textarea>
65
- <bds-textarea name="bio" required rows="4"></bds-textarea>
86
+ <bds-textarea name="message" label="Message" placeholder="Enter message…" rows="6"></bds-textarea>
87
+ <bds-textarea name="bio" label="Bio" required rows="4"></bds-textarea>
88
+ <bds-textarea name="feedback" label="Feedback" error="Feedback is required"></bds-textarea>
66
89
  ```
67
90
 
68
91
  ## Accessibility
69
92
 
70
93
  - Wraps a native `<textarea>` which has full browser and assistive technology support
71
- - `required` uses the native `required` attribute for browser validation
94
+ - `label` renders a `<label for>` associated with the textarea via matching `id`
95
+ - `error` sets `aria-invalid="true"` on the textarea and links the error message via `aria-describedby`; the message uses `role="alert"` so it is announced immediately
96
+ - `hint` is linked to the textarea via `aria-describedby` for screen reader announcement
97
+ - `required` uses the native `required` attribute for browser validation plus `aria-required="true"`
72
98
  - `disabled` sets `pointer-events: none`, reduces opacity, and removes the resize handle
73
- - Participates in HTML forms via the Form-Associated Custom Elements API
99
+ - Participates in HTML forms via the Form-Associated Custom Elements API; `formResetCallback` restores the textarea's initial value
@@ -7,6 +7,9 @@ function BdsTextarea({
7
7
  value,
8
8
  placeholder,
9
9
  rows,
10
+ label,
11
+ hint,
12
+ error,
10
13
  required,
11
14
  disabled,
12
15
  }: {
@@ -14,6 +17,9 @@ function BdsTextarea({
14
17
  value?: string;
15
18
  placeholder?: string;
16
19
  rows?: number;
20
+ label?: string;
21
+ hint?: string;
22
+ error?: string;
17
23
  required?: boolean;
18
24
  disabled?: boolean;
19
25
  }) {
@@ -22,6 +28,9 @@ function BdsTextarea({
22
28
  value,
23
29
  placeholder,
24
30
  rows,
31
+ label,
32
+ hint,
33
+ error,
25
34
  required: required || undefined,
26
35
  disabled: disabled || undefined,
27
36
  });
@@ -61,6 +70,18 @@ export const TallRows: Story = {
61
70
  args: { name: 'message', placeholder: 'Enter a longer text…', rows: 8 },
62
71
  };
63
72
 
73
+ export const WithLabel: Story = {
74
+ args: { name: 'message', label: 'Message', placeholder: 'Enter your message…' },
75
+ };
76
+
77
+ export const WithHint: Story = {
78
+ args: { name: 'message', label: 'Message', hint: 'Max 500 characters' },
79
+ };
80
+
81
+ export const WithError: Story = {
82
+ args: { name: 'message', label: 'Message', error: 'Message is required' },
83
+ };
84
+
64
85
  export const Required: Story = {
65
86
  args: { name: 'message', placeholder: 'Required field', required: true },
66
87
  };
@@ -52,4 +52,103 @@ describe('bds-checkbox-group', () => {
52
52
  expect(message?.textContent?.trim()).toBe('Select all that apply');
53
53
  cleanup(el);
54
54
  });
55
+
56
+ it('propagates disabled to slotted bds-checkbox elements', async () => {
57
+ const el = await fixture(
58
+ '<bds-checkbox-group label="Interests" disabled>' +
59
+ '<bds-checkbox value="sports">Sports</bds-checkbox>' +
60
+ '<bds-checkbox value="music">Music</bds-checkbox>' +
61
+ '</bds-checkbox-group>',
62
+ ) as BdsCheckboxGroup;
63
+ await Promise.resolve();
64
+ const checkboxes = Array.from(el.querySelectorAll('bds-checkbox'));
65
+ expect(checkboxes.every(checkbox => checkbox.hasAttribute('disabled'))).toBe(true);
66
+ cleanup(el);
67
+ });
68
+
69
+ it('removes propagated disabled from slotted bds-checkbox elements when re-enabled, keeping individually-disabled ones', async () => {
70
+ const el = await fixture(
71
+ '<bds-checkbox-group label="Interests" disabled>' +
72
+ '<bds-checkbox value="sports">Sports</bds-checkbox>' +
73
+ '<bds-checkbox value="music" disabled>Music</bds-checkbox>' +
74
+ '</bds-checkbox-group>',
75
+ ) as BdsCheckboxGroup;
76
+ await Promise.resolve();
77
+
78
+ el.disabled = false;
79
+ await el.updateComplete;
80
+ await Promise.resolve();
81
+
82
+ const [sports, music] = Array.from(el.querySelectorAll('bds-checkbox'));
83
+ expect(sports.hasAttribute('disabled')).toBe(false);
84
+ expect(music.hasAttribute('disabled')).toBe(true);
85
+ cleanup(el);
86
+ });
87
+
88
+ it('propagates disabled to a bds-checkbox slotted in after the group is already disabled', async () => {
89
+ const el = await fixture('<bds-checkbox-group label="Interests" disabled></bds-checkbox-group>') as BdsCheckboxGroup;
90
+ const checkbox = document.createElement('bds-checkbox');
91
+ checkbox.setAttribute('value', 'sports');
92
+ el.appendChild(checkbox);
93
+ // slotchange fires asynchronously; allow a microtask.
94
+ await new Promise(r => requestAnimationFrame(() => r(null)));
95
+ expect(checkbox.hasAttribute('disabled')).toBe(true);
96
+ cleanup(el);
97
+ });
98
+
99
+ it('exposes a visually-hidden "(required)" text alternative instead of aria-required on the fieldset', async () => {
100
+ const el = await fixture('<bds-checkbox-group label="Test" required></bds-checkbox-group>');
101
+ const fieldset = el.shadowRoot!.querySelector('fieldset')!;
102
+ // aria-required is not supported ARIA on role=group (which is what a bare
103
+ // <fieldset> maps to) — assert it is never set.
104
+ expect(fieldset.hasAttribute('aria-required')).toBe(false);
105
+ const requiredLabel = el.shadowRoot!.querySelector('.requiredLabel');
106
+ expect(requiredLabel?.textContent?.trim()).toBe('(required)');
107
+ cleanup(el);
108
+ });
109
+
110
+ it('omits the required text alternative when not required', async () => {
111
+ const el = await fixture('<bds-checkbox-group label="Test"></bds-checkbox-group>');
112
+ expect(el.shadowRoot!.querySelector('.requiredLabel')).toBeNull();
113
+ cleanup(el);
114
+ });
115
+
116
+ it('wires aria-describedby on the fieldset to the error message id', async () => {
117
+ const el = await fixture('<bds-checkbox-group label="Test" error="Select at least one"></bds-checkbox-group>');
118
+ const fieldset = el.shadowRoot!.querySelector('fieldset')!;
119
+ const message = el.shadowRoot!.querySelector('.message--error')!;
120
+ expect(fieldset.getAttribute('aria-describedby')).toBe(message.id);
121
+ cleanup(el);
122
+ });
123
+
124
+ it('wires aria-describedby on the fieldset to the hint message id', async () => {
125
+ const el = await fixture('<bds-checkbox-group label="Test" hint="Select all that apply"></bds-checkbox-group>');
126
+ const fieldset = el.shadowRoot!.querySelector('fieldset')!;
127
+ const message = el.shadowRoot!.querySelector('.message--hint')!;
128
+ expect(fieldset.getAttribute('aria-describedby')).toBe(message.id);
129
+ cleanup(el);
130
+ });
131
+
132
+ it('omits aria-describedby on the fieldset when there is no error or hint', async () => {
133
+ const el = await fixture('<bds-checkbox-group label="Test"></bds-checkbox-group>');
134
+ const fieldset = el.shadowRoot!.querySelector('fieldset')!;
135
+ expect(fieldset.hasAttribute('aria-describedby')).toBe(false);
136
+ cleanup(el);
137
+ });
138
+
139
+ it('uses medium font-weight token for the legend (not semibold)', () => {
140
+ const styles = BdsCheckboxGroup.styles.toString();
141
+ expect(styles).toContain('--bds-font_weight--medium');
142
+ expect(styles).not.toContain('--bds-font_weight--semibold');
143
+ });
144
+
145
+ it('uses the on-bg error color token for the error message (not the raw error token)', () => {
146
+ const styles = BdsCheckboxGroup.styles.toString();
147
+ expect(styles).toContain('--bds-color_error_on-bg');
148
+ });
149
+
150
+ it('applies :host([disabled]) visual styling for the group', () => {
151
+ const styles = BdsCheckboxGroup.styles.toString();
152
+ expect(styles).toContain(':host([disabled])');
153
+ });
55
154
  });