@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
@@ -0,0 +1,71 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as Stories from './BdsCalendarRange.stories';
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # &lt;bds-calendar-range&gt;
7
+
8
+ Form-associated range date picker custom element. Two-click selection with
9
+ hover/focus preview; value is an ISO range `"YYYY-MM-DD/YYYY-MM-DD"`.
10
+
11
+ > **Status: experimental** — API may change before stable release.
12
+
13
+ ## Installation
14
+
15
+ ```js
16
+ import '@boostdev/design-system-components/web-components';
17
+ ```
18
+
19
+ ## Examples
20
+
21
+ ### Default
22
+ <Canvas of={Stories.Default} />
23
+
24
+ ### With a preselected range
25
+ <Canvas of={Stories.WithValue} />
26
+
27
+ ### Two months
28
+ <Canvas of={Stories.TwoMonths} />
29
+
30
+ ## Attributes
31
+
32
+ | Attribute | Type | Default | Description |
33
+ |-----------|------|---------|-------------|
34
+ | `name` | string | — | Form field name |
35
+ | `value` | string | — | Selected range, `"YYYY-MM-DD/YYYY-MM-DD"` |
36
+ | `disabled` | boolean | `false` | Disables all interaction |
37
+ | `min` / `max` | string | — | Selectable bounds (ISO 8601) |
38
+ | `months` | number | `1` | Number of months shown side by side |
39
+ | `page-by` | `"months"` \| `"single"` | `"months"` | Pagination step |
40
+ | `first-day-of-week` | number (0–6) | `1` | First weekday column (Monday) |
41
+ | `locale` | string | runtime default | `Intl` locale for date text |
42
+ | `previous-label` / `next-label` | string | English | Nav button aria-labels |
43
+
44
+ ## Properties (JS only)
45
+
46
+ `isDateDisallowed(date) => boolean`, `formatWeekday(date)`, `formatMonth(date)`,
47
+ `formatDay(date)` — set on the element instance to override defaults.
48
+
49
+ ## Events
50
+
51
+ | Event | Detail | Description |
52
+ |-------|--------|-------------|
53
+ | `bds-range-select` | `{ start: string, end: string }` | Fired when both ends are chosen (sorted) |
54
+ | `bds-range-start` | `{ start: string }` | Fired on the first click |
55
+
56
+ ## Keyboard Navigation
57
+
58
+ | Key | Action |
59
+ |-----|--------|
60
+ | Arrow keys | Move focus between days |
61
+ | Home / End | Start / end of week |
62
+ | Page Up / Down | Previous / next month |
63
+ | Shift + Page Up / Down | Previous / next year |
64
+ | Enter / Space | Pick start, then end |
65
+ | Escape | Cancel an in-progress range |
66
+
67
+ ## Accessibility
68
+
69
+ - Full ARIA grid pattern with roving tabindex, matching `<bds-calendar>`
70
+ - Range start and end carry `aria-selected="true"` on their gridcell
71
+ - Respects `disabled`, `formDisabledCallback`, and `prefers-reduced-motion`
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../index'; // auto-registers all custom elements
4
+
5
+ function BdsCalendarRange({
6
+ name, value, min, max, months,
7
+ }: {
8
+ name?: string; value?: string; min?: string; max?: string; months?: number;
9
+ }) {
10
+ return React.createElement('bds-calendar-range', { name, value, min, max, months });
11
+ }
12
+
13
+ const meta = {
14
+ title: 'Web Components/UI/CalendarRange',
15
+ component: BdsCalendarRange,
16
+ tags: ['!stable', 'experimental'],
17
+ parameters: { layout: 'centered' },
18
+ argTypes: {
19
+ value: { control: 'text' },
20
+ min: { control: 'text' },
21
+ max: { control: 'text' },
22
+ months: { control: 'number' },
23
+ },
24
+ } satisfies Meta<typeof BdsCalendarRange>;
25
+
26
+ export default meta;
27
+ type Story = StoryObj<typeof meta>;
28
+
29
+ export const Default: Story = { args: {} };
30
+ export const WithValue: Story = { args: { value: '2026-04-10/2026-04-16' } };
31
+ export const TwoMonths: Story = { args: { value: '2026-04-10/2026-04-16', months: 2 } };
@@ -5,7 +5,7 @@ import * as Stories from './BdsCard.stories';
5
5
 
6
6
  # &lt;bds-card&gt;
7
7
 
8
- Framework-agnostic Card layout custom element. A versatile container with three visual variants, text alignment, and an optional clickable mode. Padding is controlled via the `--card_padding` CSS custom property.
8
+ Framework-agnostic Card layout custom element. A versatile container with three visual variants, five padding variants, text alignment, and an optional clickable mode. Each padding variant's resolved value can be overridden via the `--card_padding` CSS custom property.
9
9
 
10
10
  > **Status: experimental** — API may change before stable release.
11
11
 
@@ -25,6 +25,9 @@ import '@boostdev/design-system-components/web-components';
25
25
  ### All variants
26
26
  <Canvas of={Stories.AllVariants} />
27
27
 
28
+ ### All padding variants
29
+ <Canvas of={Stories.AllPaddingVariants} />
30
+
28
31
  ### Default
29
32
  <Canvas of={Stories.Default} />
30
33
 
@@ -46,6 +49,7 @@ import '@boostdev/design-system-components/web-components';
46
49
  | Attribute | Type | Default | Description |
47
50
  |-----------|------|---------|-------------|
48
51
  | `variant` | `"default" \| "elevated" \| "outlined"` | `"default"` | Shadow and border style |
52
+ | `padding` | `"none" \| "small" \| "medium" \| "large" \| "extra-large"` | `"medium"` | Inner padding scale |
49
53
  | `text-align` | `"start" \| "center" \| "end"` | `"start"` | Text alignment |
50
54
  | `clickable` | boolean | `false` | Renders the card as a `<button>` with hover/active effects |
51
55
  | `aria-label` | string | — | Accessible label (recommended when `clickable` is set) |
@@ -66,7 +70,7 @@ import '@boostdev/design-system-components/web-components';
66
70
 
67
71
  | Property | Description |
68
72
  |----------|-------------|
69
- | `--card_padding` | Inner padding (default: `var(--bds-space_m)`) |
73
+ | `--card_padding` | Overrides the resolved padding value for the active `padding` variant (default: the variant's scale token — `0`, `--bds-space_s`, `--bds-space_m`, `--bds-space_l`, or `--bds-space_xl`) |
70
74
  | `--card_color` | Card background colour |
71
75
  | `--card_on-color` | Card text/foreground colour |
72
76
  | `--card_border` | Border on outlined variant (default: `none`) |
@@ -74,7 +78,7 @@ import '@boostdev/design-system-components/web-components';
74
78
  ## Usage in plain HTML
75
79
 
76
80
  ```html
77
- <bds-card variant="elevated" style="--card_padding: var(--bds-space_l)">
81
+ <bds-card variant="elevated" padding="large">
78
82
  <p>Card content</p>
79
83
  </bds-card>
80
84
 
@@ -1,16 +1,18 @@
1
1
  import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
- import type { CardVariant, CardTextAlign } from './bds-card';
3
+ import type { CardVariant, CardPadding, CardTextAlign } from './bds-card';
4
4
  import '../index'; // auto-registers all custom elements
5
5
 
6
6
  function BdsCard({
7
7
  variant = 'default',
8
+ padding = 'medium',
8
9
  textAlign = 'start',
9
10
  clickable,
10
11
  ariaLabel,
11
12
  children,
12
13
  }: {
13
14
  variant?: CardVariant;
15
+ padding?: CardPadding;
14
16
  textAlign?: CardTextAlign;
15
17
  clickable?: boolean;
16
18
  ariaLabel?: string;
@@ -20,6 +22,7 @@ function BdsCard({
20
22
  'bds-card',
21
23
  {
22
24
  variant,
25
+ padding,
23
26
  'text-align': textAlign,
24
27
  clickable: clickable || undefined,
25
28
  'aria-label': ariaLabel,
@@ -35,6 +38,7 @@ const meta = {
35
38
  parameters: { layout: 'centered' },
36
39
  argTypes: {
37
40
  variant: { control: 'select', options: ['default', 'elevated', 'outlined'] },
41
+ padding: { control: 'select', options: ['none', 'small', 'medium', 'large', 'extra-large'] },
38
42
  textAlign: { control: 'select', options: ['start', 'center', 'end'] },
39
43
  clickable: { control: 'boolean' },
40
44
  },
@@ -61,3 +65,15 @@ export const AllVariants: Story = {
61
65
  </div>
62
66
  ),
63
67
  };
68
+
69
+ export const AllPaddingVariants: Story = {
70
+ render: () => (
71
+ <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap', maxWidth: 700 }}>
72
+ {(['none', 'small', 'medium', 'large', 'extra-large'] as const).map(p =>
73
+ React.createElement('bds-card', { key: p, variant: 'outlined', padding: p, style: { width: 160 } },
74
+ React.createElement('p', { style: { margin: 0 } }, p),
75
+ ),
76
+ )}
77
+ </div>
78
+ ),
79
+ };
@@ -40,23 +40,34 @@ import '@boostdev/design-system-components/web-components';
40
40
 
41
41
  | Attribute | Type | Default | Description |
42
42
  |-----------|------|---------|-------------|
43
- | `current-index` | number | `0` | Active slide index (0-based) |
43
+ | `current-index` | number | `0` | Active slide index (0-based). Setting this attribute/property scrolls the track to that slide. |
44
44
  | `indicators` | boolean | `false` | Shows dot indicator buttons below the slides |
45
45
  | `loop` | boolean | `false` | Wraps from last slide to first and vice versa |
46
+ | `label` | string | `"Carousel"` | Accessible name for the slide region |
47
+ | `prev-label` | string | `"Previous slide"` | Accessible name for the built-in previous button |
48
+ | `next-label` | string | `"Next slide"` | Accessible name for the built-in next button |
46
49
 
47
50
  ## Slots
48
51
 
49
52
  | Slot | Description |
50
53
  |------|-------------|
51
- | `(default)` | Slide content — each direct child is one slide |
52
- | `prev` | Custom previous button (replaces the built-in button) |
53
- | `next` | Custom next button (replaces the built-in button) |
54
+ | `(default)` | Slide content — each direct child with no `slot` attribute is one slide |
55
+ | `prev` | Custom previous button (replaces the built-in button). Clicks anywhere inside this slot navigate to the previous slide. |
56
+ | `next` | Custom next button (replaces the built-in button). Clicks anywhere inside this slot navigate to the next slide. |
57
+
58
+ ## Methods
59
+
60
+ | Method | Description |
61
+ |--------|-------------|
62
+ | `goTo(index: number)` | Navigate to a specific slide (clamped, or wrapped when `loop` is set) |
63
+ | `next()` | Navigate to the next slide |
64
+ | `prev()` | Navigate to the previous slide |
54
65
 
55
66
  ## Events
56
67
 
57
68
  | Event | Detail | Description |
58
69
  |-------|--------|-------------|
59
- | `bds-slide-change` | `{ index: number }` | Fired when the active slide changes |
70
+ | `bds-slide-change` | `{ index: number }` | Fired when the active slide changes, via navigation (`goTo`/`next`/`prev`, the nav buttons, or a dot) or via manual scroll/swipe |
60
71
 
61
72
  ## Usage in plain HTML
62
73
 
@@ -68,16 +79,33 @@ import '@boostdev/design-system-components/web-components';
68
79
  </bds-carousel>
69
80
 
70
81
  <script>
71
- document.querySelector('bds-carousel')
72
- .addEventListener('bds-slide-change', e => {
73
- console.log('Active slide:', e.detail.index);
74
- });
82
+ const carousel = document.querySelector('bds-carousel');
83
+ carousel.addEventListener('bds-slide-change', e => {
84
+ console.log('Active slide:', e.detail.index);
85
+ });
86
+
87
+ // Public navigation API
88
+ carousel.next();
89
+ carousel.prev();
90
+ carousel.goTo(2);
75
91
  </script>
76
92
  ```
77
93
 
94
+ ### Custom prev/next buttons
95
+
96
+ ```html
97
+ <bds-carousel>
98
+ <div>Slide 1</div>
99
+ <div>Slide 2</div>
100
+ <button slot="prev">◀</button>
101
+ <button slot="next">▶</button>
102
+ </bds-carousel>
103
+ ```
104
+
78
105
  ## Accessibility
79
106
 
80
- - The slide track has `role="region"` with `aria-label="Carousel"`
81
- - Dot indicators carry `role="tab"` and `aria-selected`; the indicator list has `role="tablist"`
82
- - Navigation buttons have descriptive `aria-label` values and are disabled at boundaries (unless `loop` is set)
107
+ - The slide track has `role="region"` with a consumer-supplied `aria-label` (via the `label` attribute, defaulting to "Carousel")
108
+ - Dot indicators are plain buttons with `aria-current="true"` on the active slide (no incomplete ARIA tabs pattern); the indicator group has `role="group"`
109
+ - Dot indicators keep an 8px visual size but expose a larger invisible hit area (~24px) to meet the WCAG 2.5.8 minimum touch-target size
110
+ - Navigation buttons have descriptive, overridable `aria-label` values (`prev-label`/`next-label`) and are disabled at boundaries (unless `loop` is set)
83
111
  - Smooth scroll is suppressed when `prefers-reduced-motion: reduce` is set
@@ -18,7 +18,12 @@ import '@boostdev/design-system-components/web-components';
18
18
  ## When to use
19
19
 
20
20
  - Displaying key–value data such as user profiles, settings summaries, or metadata panels
21
- - Use `layout="inline"` to place term and value side-by-side on wider screens
21
+ - Use `layout="inline"` to place term and value side-by-side in a two-column grid (term column: `minmax(8rem, 1fr)`, value column: `2fr`)
22
+
23
+ ## Layout behaviour
24
+
25
+ - **Stacked** (default): each `<dt>` sits directly above its `<dd>` with a tight gap (`--bds-space_xxs`); a looser gap (`--bds-space_s`) separates one term/detail pair from the next.
26
+ - **Inline**: `<dt>`/`<dd>` pairs are laid out side by side as grid rows — the term in a `minmax(8rem, 1fr)` column, the detail in a `2fr` column, `align-items: baseline`.
22
27
 
23
28
  ## Examples
24
29
 
@@ -51,8 +51,9 @@ import '@boostdev/design-system-components/web-components';
51
51
 
52
52
  | Property | Description |
53
53
  |----------|-------------|
54
- | `--icon-wrapper-color` | Background fill of the circular container |
55
- | `--bds-on-icon-wrapper-color` | Icon/foreground colour inside the wrapper |
54
+ | `--icon-wrapper_radius` | Border radius of the circular container (default `var(--bds-border_radius--circle)`); `--icon-wrapper-radius` (hyphen-delimited) is a deprecated alias |
55
+ | `--icon-wrapper_color` | Background fill of the circular container (default `var(--bds-color_bg)`); `--icon-wrapper-color` (hyphen-delimited) is a deprecated alias |
56
+ | `--icon-wrapper_on-color` | Icon/foreground colour inside the wrapper (default `var(--bds-color_on-bg)`) |
56
57
 
57
58
  ## Usage in plain HTML
58
59
 
@@ -60,10 +60,22 @@ import '@boostdev/design-system-components/web-components';
60
60
 
61
61
  ## CSS Custom Properties
62
62
 
63
+ Resting and hover colours are independent, layered overrides: a top-level
64
+ override (e.g. `--link_color`) wins over the per-variant default for that
65
+ same state (e.g. `--link_color--default`), which falls back to the design
66
+ token. Setting `--link_color` on an ancestor themes only the resting state
67
+ across all variants; setting `--link_color-hover` themes only hover.
68
+
63
69
  | Property | Description |
64
70
  |----------|-------------|
65
- | `--link_color` | Link colour |
66
- | `--link_color-hover` | Link hover colour |
71
+ | `--link_color` | Link colour override (all variants, resting state) |
72
+ | `--link_color-hover` | Link hover colour override (all variants) |
73
+ | `--link_color--default` | Resting colour override for `variant="default"` |
74
+ | `--link_color-hover--default` | Hover colour override for `variant="default"` |
75
+ | `--link_color--subtle` | Resting colour override for `variant="subtle"` |
76
+ | `--link_color-hover--subtle` | Hover colour override for `variant="subtle"` |
77
+ | `--link_color--standalone` | Resting colour override for `variant="standalone"` |
78
+ | `--link_color-hover--standalone` | Hover colour override for `variant="standalone"` |
67
79
 
68
80
  ## Usage in plain HTML
69
81
 
@@ -63,6 +63,23 @@ import '@boostdev/design-system-components/web-components';
63
63
  | `(default)` | Banner body text or HTML |
64
64
  | `action` | Optional action area (e.g. a `<button>` or `<a>`) |
65
65
 
66
+ ## CSS Custom Properties
67
+
68
+ | Property | Description |
69
+ |----------|-------------|
70
+ | `--banner_bg` | Banner background colour (all variants) |
71
+ | `--banner_text` | Banner text colour (all variants) |
72
+ | `--banner_border` | Banner bottom border colour (all variants) |
73
+ | `--banner_bg--info` / `--banner_text--info` / `--banner_border--info` | Info variant colours |
74
+ | `--banner_bg--success` / `--banner_text--success` / `--banner_border--success` | Success variant colours |
75
+ | `--banner_bg--warning` / `--banner_text--warning` / `--banner_border--warning` | Warning variant colours |
76
+ | `--banner_bg--error` / `--banner_text--error` / `--banner_border--error` | Error variant colours |
77
+ | `--banner_dismiss-size` | Dismiss button minimum touch target (default `2.75rem`, WCAG 2.5.5); the visible icon stays 1rem |
78
+ | `--banner_dismiss-radius` | Dismiss button border radius |
79
+ | `--banner_dismiss-border` | Dismiss button border |
80
+ | `--banner_dismiss-border-color` | Dismiss button inset-border colour (default `currentcolor`). `--notification-banner_dismiss-border-color` is a deprecated alias for the same hook. |
81
+ | `--banner_dismiss-opacity--hover` | Dismiss button opacity on hover |
82
+
66
83
  ## Events
67
84
 
68
85
  | Event | Detail | Description |
@@ -83,3 +100,4 @@ import '@boostdev/design-system-components/web-components';
83
100
  - `error` and `warning` variants render `role="alert"` with `aria-live="assertive"`
84
101
  - `info` and `success` variants render `role="status"` with `aria-live="polite"`
85
102
  - The dismiss button has a configurable `aria-label` via `dismiss-label`
103
+ - The dismiss button's interactive hit area meets the WCAG 2.5.5 44×44px minimum (`--banner_dismiss-size`), even though the visible icon stays 1rem
@@ -54,6 +54,44 @@ import '@boostdev/design-system-components/web-components';
54
54
  |-------|--------|-------------|
55
55
  | `bds-page-change` | `{ page: number }` | Fired when the user navigates to a different page |
56
56
 
57
+ ## CSS variables
58
+
59
+ The override surface is **layered**. Setting `--pagination_item-bg` / `--pagination_item-color` / `--pagination_item-border` on the element (or any ancestor) wins in every state — resting, hover, and active. Setting a per-state token targets only that one state.
60
+
61
+ ### Public override tokens (win over per-state defaults)
62
+
63
+ | Variable | Default | Description |
64
+ |----------|---------|-------------|
65
+ | `--pagination_radius` | `var(--bds-border_radius--full)` | Page button border radius |
66
+ | `--pagination_item-bg` | `transparent` (per state) | Button background — themes every state at once |
67
+ | `--pagination_item-color` | per state | Button text colour |
68
+ | `--pagination_item-border` | per state | Button border colour (bdc inset border) |
69
+
70
+ ### Per-state overrides
71
+
72
+ | State | Background | Text | Border |
73
+ |-------|-----------|------|--------|
74
+ | resting | (`transparent`) | (`var(--bds-color_on-bg)`) | (`var(--bds-color_bg--subtle)`) |
75
+ | hover | `--pagination_item-bg--hover` | `--pagination_item-color--hover` | — |
76
+ | active (current page) | `--pagination_item-bg--active` | `--pagination_item-color--active` | `--pagination_item-border--active` |
77
+
78
+ Defaults: hover resolves to `--bds-color_bg--subtle` / `--bds-color_interactive_on-bg`; active resolves through the shared `--bdc-color_active` / `--bdc-color_on-active` hooks (`--bds-color_interactive` / `--bds-color_on-interactive` by default), so a global active-state theme override also re-colours the current page.
79
+
80
+ ### Deprecated aliases
81
+
82
+ The original `--btn_*` token names are still read as a fallback layer beneath the `--pagination_item-*` names above, so existing overrides keep working. Prefer the new names for new code.
83
+
84
+ | Deprecated | Use instead |
85
+ |------------|-------------|
86
+ | `--btn_bg` | `--pagination_item-bg` |
87
+ | `--btn_color` | `--pagination_item-color` |
88
+ | `--btn_border` | `--pagination_item-border` |
89
+ | `--btn_bg--hover` | `--pagination_item-bg--hover` |
90
+ | `--btn_color--hover` | `--pagination_item-color--hover` |
91
+ | `--btn_bg--active` | `--pagination_item-bg--active` |
92
+ | `--btn_color--active` | `--pagination_item-color--active` |
93
+ | `--btn_border--active` | `--pagination_item-border--active` |
94
+
57
95
  ## Usage in plain HTML
58
96
 
59
97
  ```html
@@ -70,5 +108,6 @@ import '@boostdev/design-system-components/web-components';
70
108
  ## Accessibility
71
109
 
72
110
  - Wrapped in `<nav aria-label="Pagination">` with an `<ul>` list structure
73
- - Active page button carries `aria-current="page"`
111
+ - Numbered page buttons carry `aria-label="Page N"`; the active page button additionally carries `aria-current="page"` (non-active buttons omit `aria-current` entirely rather than emitting `aria-current="false"`)
74
112
  - Previous/Next buttons have descriptive `aria-label` values and are `disabled` at the boundaries
113
+ - Page buttons meet the 44×44px (2.75rem) WCAG 2.5.5 minimum touch target
@@ -55,7 +55,10 @@ import '@boostdev/design-system-components/web-components';
55
55
 
56
56
  | Property | Description |
57
57
  |----------|-------------|
58
- | `--progress_color-active` | Fill colour of the progress bar |
58
+ | `--progress_color-active` | Fill colour of the progress bar (defaults to `var(--bdc-color_active)`) |
59
+ | `--progress_color-track` | Empty track colour (defaults to `var(--bds-color_bg--subtle)`) |
60
+ | `--progress_radius` | Track and fill corner radius (defaults to `var(--bds-border_radius--full)`) |
61
+ | `--progress_height` | Track block-size (defaults per `size`: `--bds-space_xxs`/`--bds-space_xs`/`--bds-space_s`) |
59
62
 
60
63
  ## Usage in plain HTML
61
64
 
@@ -67,4 +70,7 @@ import '@boostdev/design-system-components/web-components';
67
70
  ## Accessibility
68
71
 
69
72
  - Renders with `role="progressbar"`, `aria-valuenow`, `aria-valuemin`, and `aria-valuemax`
70
- - Always provide a `label` to give the bar a meaningful accessible name
73
+ - Always provide a `label` to give the bar a meaningful accessible name — when `label` is
74
+ unset, `aria-label` is omitted entirely (not rendered as an empty string), so the
75
+ progressbar falls back to having **no** accessible name
76
+ - `aria-valuenow` is clamped to the `0`–`max` range, matching the visual fill
@@ -47,7 +47,7 @@ import '@boostdev/design-system-components/web-components';
47
47
  |-----------|------|---------|-------------|
48
48
  | `value` | number | `0` | Current progress value |
49
49
  | `max` | number | `100` | Maximum value |
50
- | `label` | string | — | Accessible label for the progress bar |
50
+ | `label` | string | — | Accessible label for the progress bar (required — see Accessibility) |
51
51
  | `show-value` | boolean | `false` | Displays the rounded percentage in the centre of the ring |
52
52
  | `size` | `"small" \| "medium" \| "large"` | `"medium"` | Diameter (`40px` / `64px` / `96px`) |
53
53
 
@@ -56,6 +56,8 @@ import '@boostdev/design-system-components/web-components';
56
56
  | Property | Description |
57
57
  |----------|-------------|
58
58
  | `--progressCircle_color-active` | Stroke colour of the filled arc |
59
+ | `--progressCircle_color-track` | Stroke colour of the background track (default: `--bds-color_bg--subtle`) |
60
+ | `--progressCircle_font-size--small` | Font size of the centred value label at `size="small"` (default: `--bds-font_size--body--s`) |
59
61
 
60
62
  ## Usage in plain HTML
61
63
 
@@ -67,4 +69,5 @@ import '@boostdev/design-system-components/web-components';
67
69
  ## Accessibility
68
70
 
69
71
  - Renders with `role="progressbar"`, `aria-valuenow`, `aria-valuemin`, and `aria-valuemax`
70
- - Always provide a `label` to give the indicator a meaningful accessible name
72
+ - `label` is required — without it the host renders `role="progressbar"` with no accessible name. When `label` is unset, `aria-label` is omitted entirely (never rendered empty) so assistive technology falls back correctly instead of announcing a nameless control.
73
+ - `aria-valuenow` is clamped to the `0`–`max` range, matching the visual fill, even if `value` is passed out of range
@@ -55,6 +55,13 @@ import '@boostdev/design-system-components/web-components';
55
55
  <bds-rating value="4" max="10"></bds-rating>
56
56
  ```
57
57
 
58
+ ## CSS Custom Properties
59
+
60
+ | Variable | Default | Description |
61
+ |----------|---------|--------------|
62
+ | `--rating_color` | `var(--bds-color_bg)` | Colour of unfilled stars |
63
+ | `--rating_color--filled` | `var(--bds-color_warning)` | Colour of filled stars |
64
+
58
65
  ## Accessibility
59
66
 
60
67
  - Renders `role="img"` with `aria-label` set to `"{value} out of {max} stars"`
@@ -29,6 +29,9 @@ import '@boostdev/design-system-components/web-components';
29
29
  ### Default
30
30
  <Canvas of={Stories.Default} />
31
31
 
32
+ ### Extra small
33
+ <Canvas of={Stories.ExtraSmall} />
34
+
32
35
  ### Small
33
36
  <Canvas of={Stories.Small} />
34
37
 
@@ -49,17 +52,18 @@ import '@boostdev/design-system-components/web-components';
49
52
 
50
53
  | Attribute | Type | Default | Description |
51
54
  |-----------|------|---------|-------------|
52
- | `title` | string | — | Heading text (required) |
55
+ | `heading` | string | — | Heading text (required) |
56
+ | `title` | string | — | **Deprecated** — alias for `heading`. Sharing the name with the global HTML `title` attribute triggers a native browser tooltip on hover; kept working as a fallback when `heading` is unset, will be removed in a later major. Use `heading` instead. |
53
57
  | `subtitle` | string | — | Optional subheading text |
54
58
  | `alignment` | `"start" \| "center" \| "end"` | `"start"` | Text and flex alignment |
55
- | `size` | `"small" \| "medium" \| "large"` | `"medium"` | Font size scale for title and subtitle |
59
+ | `size` | `"xs" \| "small" \| "medium" \| "large"` | `"medium"` | Font size scale for title and subtitle |
56
60
  | `title-as` | string | `"h2"` | Override the HTML element rendered for the title |
57
61
 
58
62
  ## Usage in plain HTML
59
63
 
60
64
  ```html
61
65
  <bds-section-header
62
- title="Our Products"
66
+ heading="Our Products"
63
67
  subtitle="Browse the full range"
64
68
  size="large"
65
69
  alignment="center">
@@ -70,3 +74,18 @@ import '@boostdev/design-system-components/web-components';
70
74
 
71
75
  - The title renders as `h2` by default; use `title-as` to match the page heading hierarchy
72
76
  - Avoid skipping heading levels when changing `title-as`
77
+
78
+ ## CSS custom properties
79
+
80
+ | Token | Default | Description |
81
+ |-------|---------|--------------|
82
+ | `--sectionHeader_gap` | `--bds-space_m` | Gap between title and subtitle |
83
+ | `--sectionHeader_title-color` | `--bds-color_on-bg` | Title text color (`--sectionHeader-title-color`, kebab-delimited, is a deprecated alias) |
84
+ | `--sectionHeader_subtitle-color` | `--bds-color_grey--strong` | Subtitle text color |
85
+ | `--sectionHeader_title-size` | Size-variant font-size token (e.g. `--bds-font_size--display` for medium/large) | Title font size |
86
+ | `--sectionHeader_title-line-height` | Size-variant line-height token | Title line height |
87
+ | `--sectionHeader_title-weight` | `--bds-font_weight--bold` | Title font weight |
88
+ | `--sectionHeader_subtitle-size` | Size-variant font-size token | Subtitle font size |
89
+ | `--sectionHeader_subtitle-line-height` | `1.3` (medium/large) or `1.4` (xs/small) | Subtitle line height |
90
+
91
+ The host also sets `grid-column: var(--bds-grid_span-100)` so the header spans the full row when placed inside `<bds-grid>`.
@@ -3,19 +3,19 @@ import type { Meta, StoryObj } from '@storybook/react';
3
3
  import '../index'; // auto-registers all custom elements
4
4
 
5
5
  function BdsSectionHeader({
6
- title = '',
6
+ heading = '',
7
7
  subtitle,
8
8
  alignment = 'start',
9
9
  size = 'medium',
10
10
  titleAs,
11
11
  }: {
12
- title?: string;
12
+ heading?: string;
13
13
  subtitle?: string;
14
14
  alignment?: 'start' | 'center' | 'end';
15
- size?: 'small' | 'medium' | 'large';
15
+ size?: 'xs' | 'small' | 'medium' | 'large';
16
16
  titleAs?: string;
17
17
  }) {
18
- return React.createElement('bds-section-header', { title, subtitle, alignment, size, 'title-as': titleAs });
18
+ return React.createElement('bds-section-header', { heading, subtitle, alignment, size, 'title-as': titleAs });
19
19
  }
20
20
 
21
21
  const meta = {
@@ -25,7 +25,7 @@ const meta = {
25
25
  parameters: { layout: 'padded' },
26
26
  argTypes: {
27
27
  alignment: { control: 'select', options: ['start', 'center', 'end'] },
28
- size: { control: 'select', options: ['small', 'medium', 'large'] },
28
+ size: { control: 'select', options: ['xs', 'small', 'medium', 'large'] },
29
29
  titleAs: { control: 'text' },
30
30
  },
31
31
  } satisfies Meta<typeof BdsSectionHeader>;
@@ -34,21 +34,23 @@ export default meta;
34
34
  type Story = StoryObj<typeof meta>;
35
35
 
36
36
  export const Default: Story = {
37
- args: { title: 'Our Products', subtitle: 'Browse the full range', size: 'medium', alignment: 'start' },
37
+ args: { heading: 'Our Products', subtitle: 'Browse the full range', size: 'medium', alignment: 'start' },
38
38
  };
39
- export const Small: Story = { args: { title: 'Recent Activity', subtitle: 'Last 30 days', size: 'small' } };
40
- export const Large: Story = { args: { title: 'Welcome Back', subtitle: 'Here is what happened today', size: 'large' } };
39
+ export const ExtraSmall: Story = { args: { heading: 'Filters', subtitle: 'Refine the results', size: 'xs' } };
40
+ export const Small: Story = { args: { heading: 'Recent Activity', subtitle: 'Last 30 days', size: 'small' } };
41
+ export const Large: Story = { args: { heading: 'Welcome Back', subtitle: 'Here is what happened today', size: 'large' } };
41
42
  export const Centered: Story = {
42
- args: { title: 'Our Mission', subtitle: 'We are building something great', alignment: 'center' },
43
+ args: { heading: 'Our Mission', subtitle: 'We are building something great', alignment: 'center' },
43
44
  };
44
- export const TitleOnly: Story = { args: { title: 'Settings', size: 'small' } };
45
+ export const TitleOnly: Story = { args: { heading: 'Settings', size: 'small' } };
45
46
 
46
47
  export const AllSizes: Story = {
47
48
  render: () => (
48
49
  <div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>
49
- {React.createElement('bds-section-header', { title: 'Small Heading', subtitle: 'Subtitle text', size: 'small' })}
50
- {React.createElement('bds-section-header', { title: 'Medium Heading', subtitle: 'Subtitle text', size: 'medium' })}
51
- {React.createElement('bds-section-header', { title: 'Large Heading', subtitle: 'Subtitle text', size: 'large' })}
50
+ {React.createElement('bds-section-header', { heading: 'Extra Small Heading', subtitle: 'Subtitle text', size: 'xs' })}
51
+ {React.createElement('bds-section-header', { heading: 'Small Heading', subtitle: 'Subtitle text', size: 'small' })}
52
+ {React.createElement('bds-section-header', { heading: 'Medium Heading', subtitle: 'Subtitle text', size: 'medium' })}
53
+ {React.createElement('bds-section-header', { heading: 'Large Heading', subtitle: 'Subtitle text', size: 'large' })}
52
54
  </div>
53
55
  ),
54
56
  };
@@ -9,6 +9,13 @@ Framework-agnostic scrollable Table wrapper custom element. Apply design-system
9
9
 
10
10
  > **Status: experimental** — API may change before stable release.
11
11
 
12
+ > **Light-DOM styling contract:** `::slotted()` can only match the node placed directly into
13
+ > the slot (the `<table>` itself), never its descendants. `<thead>`/`<th>`/`<td>` styling is
14
+ > therefore shipped as a document-level stylesheet scoped to the `bds-table > table …` selector
15
+ > (adopted once, the first time any `<bds-table>` module is imported). This means the slotted
16
+ > `<table>` must be a **direct child** of `<bds-table>` for cell styling and `sticky-header` to
17
+ > apply — don't wrap it in an intermediate element.
18
+
12
19
  ## Installation
13
20
 
14
21
  ```js
@@ -37,12 +44,21 @@ import '@boostdev/design-system-components/web-components';
37
44
  | Attribute | Type | Default | Description |
38
45
  |-----------|------|---------|-------------|
39
46
  | `sticky-header` | boolean | `false` | Freezes `<thead>` at the top when the table overflows vertically |
47
+ | `aria-label` | string | — | Accessible name for the scrollable region; also enables `role="region"` on the wrapper |
40
48
 
41
49
  ## Slots
42
50
 
43
51
  | Slot | Description |
44
52
  |------|-------------|
45
- | `(default)` | A standard `<table>` element with `<thead>` and `<tbody>` |
53
+ | `(default)` | A standard `<table>` element (must be a direct child — see the light-DOM styling contract above) |
54
+
55
+ ## CSS Custom Properties
56
+
57
+ | Property | Description |
58
+ |----------|-------------|
59
+ | `--table_border` | Wrapper border (default: `none`) |
60
+ | `--table_radius` | Wrapper corner radius (default: `var(--bdc-outline_radius)`, itself set to `var(--bds-border_radius--s)` on the wrapper) |
61
+ | `--table_row-bg--hover` | Row background on hover, pointer devices only (default: `var(--bds-color_bg--subtle)`) |
46
62
 
47
63
  ## Usage in plain HTML
48
64
 
@@ -78,4 +94,9 @@ import '@boostdev/design-system-components/web-components';
78
94
 
79
95
  - Use a standard `<table>` with proper `<thead>` / `<tbody>` structure
80
96
  - Column headers (`<th>`) are automatically styled; add `scope="col"` for complex tables
81
- - The wrapper is horizontally scrollable (`overflow-inline: auto`) on small viewports
97
+ - The wrapper is horizontally scrollable (`overflow-inline: auto`) on small viewports and is
98
+ keyboard-focusable (`tabindex="0"`) with a `:focus-visible` outline, so it can be scrolled
99
+ without a mouse in browsers that don't auto-focus scroll containers
100
+ - Set `aria-label` on `<bds-table>` to give the scrollable region an accessible name — this also
101
+ adds `role="region"` on the wrapper; without it, the wrapper stays unlabelled and roleless to
102
+ avoid a nameless landmark