@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
@@ -18,22 +18,34 @@ import { LitElement, css, html } from 'lit';
18
18
  */
19
19
  export class BdsIconWrapper extends LitElement {
20
20
  static styles = css`
21
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
22
+ here; otherwise elements with an explicit size + padding size as
23
+ content-box and layouts drift from the React (light-DOM) versions. */
24
+ :host,
25
+ *,
26
+ *::before,
27
+ *::after {
28
+ box-sizing: border-box;
29
+ }
30
+
21
31
  :host {
22
32
  display: inline-flex;
23
33
  }
24
34
 
35
+ /* --icon-wrapper-radius / --icon-wrapper-color (hyphen-delimited) are deprecated
36
+ aliases for --icon-wrapper_radius / --icon-wrapper_color, kept working for one major. */
25
37
  .wrapper {
26
38
  inline-size: 2em;
27
39
  block-size: 2em;
28
40
  font-size: 3em;
29
- border-radius: 50%;
41
+ border-radius: var(--icon-wrapper_radius, var(--icon-wrapper-radius, var(--bds-border_radius--circle)));
30
42
  display: flex;
31
43
  align-items: center;
32
44
  justify-content: center;
33
45
  margin: var(--bds-space_l) auto var(--bds-space_m);
34
- background: var(--icon-wrapper-color, var(--bds-color_bg));
35
- color: var(--bds-on-icon-wrapper-color, var(--bds-color_on-bg));
36
- fill: var(--bds-on-icon-wrapper-color, var(--bds-color_on-bg));
46
+ background: var(--icon-wrapper_color, var(--icon-wrapper-color, var(--bds-color_bg)));
47
+ color: var(--icon-wrapper_on-color, var(--bds-color_on-bg));
48
+ fill: currentcolor;
37
49
  position: relative;
38
50
  transition: var(--bds-animation_transition);
39
51
  }
@@ -43,17 +55,6 @@ export class BdsIconWrapper extends LitElement {
43
55
  }
44
56
  `;
45
57
 
46
- static properties = {
47
- ariaHidden: { type: String, attribute: 'aria-hidden', reflect: true },
48
- };
49
-
50
- declare ariaHidden: string;
51
-
52
- constructor() {
53
- super();
54
- this.ariaHidden = '';
55
- }
56
-
57
58
  render() {
58
59
  return html`<div class="wrapper"><slot></slot></div>`;
59
60
  }
@@ -69,4 +69,21 @@ describe('bds-link', () => {
69
69
  expect(el.getAttribute('variant')).toBe('standalone');
70
70
  cleanup(el);
71
71
  });
72
+
73
+ it('sets the color property (not a custom property) on :hover so variant rules cannot override it by source order', () => {
74
+ const cssText = BdsLink.styles.cssText;
75
+ expect(cssText).toMatch(/\.link:hover\s*{[^}]*color:\s*var\(--link_color-hover,\s*var\(--link_color-hover--variant,\s*var\(--bds-color_blue--strong\)\)\)/);
76
+ });
77
+
78
+ it('has variant rules write only to the internal --link_color--variant/--link_color-hover--variant slots, not the public tokens', () => {
79
+ const cssText = BdsLink.styles.cssText;
80
+ expect(cssText).not.toMatch(/\.--variant_default\s*{[^}]*--link_color:/);
81
+ expect(cssText).toMatch(/\.--variant_default\s*{[^}]*--link_color--variant:\s*var\(--link_color--default,/);
82
+ expect(cssText).toMatch(/\.--variant_default\s*{[^}]*--link_color-hover--variant:\s*var\(--link_color-hover--default,/);
83
+ });
84
+
85
+ it('lets the public --link_color / --link_color-hover tokens win over per-variant defaults', () => {
86
+ const cssText = BdsLink.styles.cssText;
87
+ expect(cssText).toMatch(/\.link\s*{[^}]*color:\s*var\(--link_color,\s*var\(--link_color--variant,\s*var\(--bds-color_interactive_on-bg\)\)\)/);
88
+ });
72
89
  });
@@ -22,12 +22,27 @@ export type LinkVariant = 'default' | 'subtle' | 'standalone';
22
22
  */
23
23
  export class BdsLink extends LitElement {
24
24
  static styles = css`
25
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
26
+ here; otherwise elements with an explicit size + padding size as
27
+ content-box and layouts drift from the React (light-DOM) versions. */
28
+ :host,
29
+ *,
30
+ *::before,
31
+ *::after {
32
+ box-sizing: border-box;
33
+ }
34
+
25
35
  :host {
26
36
  display: inline;
27
37
  }
28
38
 
39
+ /* Layered cascade (mirrors Link.module.css): public override (--link_color)
40
+ wins over per-variant defaults. Variants write to the inner
41
+ --link_color--variant slot. Resting and hover have INDEPENDENT public
42
+ tokens — setting --link_color on an ancestor themes only resting;
43
+ setting --link_color-hover themes only hover. */
29
44
  .link {
30
- color: var(--link_color, var(--bds-color_interactive_on-bg));
45
+ color: var(--link_color, var(--link_color--variant, var(--bds-color_interactive_on-bg)));
31
46
  text-decoration: underline;
32
47
  text-underline-offset: 0.2em;
33
48
  transition: var(--bds-animation_transition);
@@ -42,23 +57,23 @@ export class BdsLink extends LitElement {
42
57
 
43
58
  @media (hover: hover) and (pointer: fine) {
44
59
  .link:hover {
45
- --link_color: var(--link_color-hover, var(--bds-color_blue--strong));
60
+ color: var(--link_color-hover, var(--link_color-hover--variant, var(--bds-color_blue--strong)));
46
61
  }
47
62
  }
48
63
 
49
- .link.--variant_default {
50
- --link_color: var(--bds-color_interactive_on-bg);
51
- --link_color-hover: var(--bds-color_blue--strong);
64
+ .--variant_default {
65
+ --link_color--variant: var(--link_color--default, var(--bds-color_interactive_on-bg));
66
+ --link_color-hover--variant: var(--link_color-hover--default, var(--bds-color_blue--strong));
52
67
  }
53
68
 
54
- .link.--variant_subtle {
55
- --link_color: var(--bds-color_on-bg);
56
- --link_color-hover: var(--bds-color_interactive_on-bg);
69
+ .--variant_subtle {
70
+ --link_color--variant: var(--link_color--subtle, var(--bds-color_on-bg));
71
+ --link_color-hover--variant: var(--link_color-hover--subtle, var(--bds-color_interactive_on-bg));
57
72
  }
58
73
 
59
- .link.--variant_standalone {
60
- --link_color: var(--bds-color_interactive_on-bg);
61
- --link_color-hover: var(--bds-color_blue--strong);
74
+ .--variant_standalone {
75
+ --link_color--variant: var(--link_color--standalone, var(--bds-color_interactive_on-bg));
76
+ --link_color-hover--variant: var(--link_color-hover--standalone, var(--bds-color_blue--strong));
62
77
  display: inline-flex;
63
78
  align-items: center;
64
79
  gap: var(--bds-space_xxs);
@@ -12,6 +12,16 @@ import { LitElement, css, html } from 'lit';
12
12
  */
13
13
  export class BdsLoading extends LitElement {
14
14
  static styles = css`
15
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
16
+ here; otherwise elements with an explicit size + padding size as
17
+ content-box and layouts drift from the React (light-DOM) versions. */
18
+ :host,
19
+ *,
20
+ *::before,
21
+ *::after {
22
+ box-sizing: border-box;
23
+ }
24
+
15
25
  :host {
16
26
  display: flex;
17
27
  justify-content: center;
@@ -23,7 +33,7 @@ export class BdsLoading extends LitElement {
23
33
  block-size: 2.5em;
24
34
  border: 4px solid var(--bds-color_bg);
25
35
  border-block-start: 4px solid var(--bds-color_interactive);
26
- border-radius: 50%;
36
+ border-radius: var(--loading_radius, var(--bds-border_radius--circle));
27
37
  animation: spin 1s linear infinite;
28
38
  }
29
39
 
@@ -79,4 +79,17 @@ describe('bds-notification-banner', () => {
79
79
  expect(el.getAttribute('variant')).toBe('success');
80
80
  cleanup(el);
81
81
  });
82
+
83
+ it('gives the dismiss button a 44x44px minimum touch target', () => {
84
+ const cssText = BdsNotificationBanner.styles.cssText;
85
+ expect(cssText).toMatch(/\.dismiss\s*{[^}]*min-inline-size:\s*var\(--banner_dismiss-size,\s*2\.75rem\)/);
86
+ expect(cssText).toMatch(/\.dismiss\s*{[^}]*min-block-size:\s*var\(--banner_dismiss-size,\s*2\.75rem\)/);
87
+ });
88
+
89
+ it('names the dismiss border-color hook to match the --banner_* family, keeping the old name as an alias', () => {
90
+ const cssText = BdsNotificationBanner.styles.cssText;
91
+ expect(cssText).toMatch(
92
+ /--bdc_color:\s*var\(--banner_dismiss-border-color,\s*var\(--notification-banner_dismiss-border-color,\s*currentcolor\)\)/,
93
+ );
94
+ });
82
95
  });
@@ -25,6 +25,16 @@ export type NotificationBannerVariant = 'info' | 'success' | 'warning' | 'error'
25
25
  */
26
26
  export class BdsNotificationBanner extends LitElement {
27
27
  static styles = css`
28
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
29
+ here; otherwise elements with an explicit size + padding size as
30
+ content-box and layouts drift from the React (light-DOM) versions. */
31
+ :host,
32
+ *,
33
+ *::before,
34
+ *::after {
35
+ box-sizing: border-box;
36
+ }
37
+
28
38
  :host {
29
39
  display: block;
30
40
  }
@@ -88,10 +98,17 @@ export class BdsNotificationBanner extends LitElement {
88
98
  flex-shrink: 0;
89
99
  cursor: pointer;
90
100
  color: currentcolor;
101
+
102
+ /* WCAG 2.5.5: minimum 44x44px interactive area — the visible icon stays
103
+ 1rem; the hit area grows around it via min-inline-size/min-block-size. */
104
+ min-inline-size: var(--banner_dismiss-size, 2.75rem);
105
+ min-block-size: var(--banner_dismiss-size, 2.75rem);
91
106
  border-radius: var(--banner_dismiss-radius, var(--bds-border_radius--circle));
92
107
  border: var(--banner_dismiss-border, none);
93
108
  transition: var(--bds-animation_transition);
94
- --bdc_color: var(--notification-banner_dismiss-border-color, currentcolor);
109
+ /* --notification-banner_dismiss-border-color kept as a deprecated alias;
110
+ --banner_dismiss-border-color matches the --banner_* token family. */
111
+ --bdc_color: var(--banner_dismiss-border-color, var(--notification-banner_dismiss-border-color, currentcolor));
95
112
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
96
113
  }
97
114
 
@@ -64,4 +64,48 @@ describe('bds-pagination', () => {
64
64
  expect(ellipsis.length).toBeGreaterThan(0);
65
65
  cleanup(el);
66
66
  });
67
+
68
+ it('gives numbered buttons a "Page N" accessible name', async () => {
69
+ const el = await fixture('<bds-pagination current-page="1" total-pages="3"></bds-pagination>');
70
+ const buttons = el.shadowRoot!.querySelectorAll<HTMLButtonElement>('.button:not(.--nav)');
71
+ expect(Array.from(buttons).map(b => b.getAttribute('aria-label'))).toEqual([
72
+ 'Page 1',
73
+ 'Page 2',
74
+ 'Page 3',
75
+ ]);
76
+ cleanup(el);
77
+ });
78
+
79
+ it('omits aria-current on non-active page buttons instead of "false"', async () => {
80
+ const el = await fixture('<bds-pagination current-page="2" total-pages="3"></bds-pagination>');
81
+ const buttons = el.shadowRoot!.querySelectorAll<HTMLButtonElement>('.button:not(.--nav)');
82
+ expect(buttons[0].hasAttribute('aria-current')).toBe(false);
83
+ expect(buttons[1].getAttribute('aria-current')).toBe('page');
84
+ expect(buttons[2].hasAttribute('aria-current')).toBe(false);
85
+ cleanup(el);
86
+ });
87
+
88
+ it('exposes the layered --pagination_item-* token cascade with --btn_* deprecated aliases', async () => {
89
+ const el = await fixture('<bds-pagination total-pages="3"></bds-pagination>');
90
+ const styleText = el.shadowRoot!.querySelector('style')!.textContent!;
91
+ expect(styleText).toContain('var(--pagination_radius, var(--bds-border_radius--full))');
92
+ expect(styleText).toContain('var(--pagination_item-bg, var(--btn_bg, var(--btn_bg--state, transparent)))');
93
+ expect(styleText).toContain(
94
+ 'var(--pagination_item-color, var(--btn_color, var(--btn_color--state, var(--bds-color_on-bg))))',
95
+ );
96
+ expect(styleText).toContain(
97
+ 'var(--pagination_item-border, var(--btn_border, var(--btn_border--state, var(--bds-color_bg--subtle))))',
98
+ );
99
+ expect(styleText).toContain('var(--pagination_item-bg--active, var(--btn_bg--active, var(--bdc-color_active)))');
100
+ cleanup(el);
101
+ });
102
+
103
+ it('sizes page and ellipsis buttons to the 44px (2.75rem) touch target and centers the nav', async () => {
104
+ const el = await fixture('<bds-pagination current-page="1" total-pages="3"></bds-pagination>');
105
+ const styleText = el.shadowRoot!.querySelector('style')!.textContent!;
106
+ expect(styleText).toContain('justify-content: center');
107
+ expect(styleText).toMatch(/\.button\s*\{[^}]*min-inline-size: 2\.75rem;[^}]*block-size: 2\.75rem;/s);
108
+ expect(styleText).toMatch(/\.ellipsis\s*\{[^}]*min-inline-size: 2\.75rem;[^}]*block-size: 2\.75rem;/s);
109
+ cleanup(el);
110
+ });
67
111
  });
@@ -1,4 +1,4 @@
1
- import { LitElement, css, html } from 'lit';
1
+ import { LitElement, css, html, nothing } from 'lit';
2
2
 
3
3
  function getPageRange(current: number, total: number): (number | '...')[] {
4
4
  const delta = 1;
@@ -32,13 +32,23 @@ function getPageRange(current: number, total: number): (number | '...')[] {
32
32
  */
33
33
  export class BdsPagination extends LitElement {
34
34
  static styles = css`
35
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
36
+ here; otherwise elements with an explicit size + padding size as
37
+ content-box and layouts drift from the React (light-DOM) versions. */
38
+ :host,
39
+ *,
40
+ *::before,
41
+ *::after {
42
+ box-sizing: border-box;
43
+ }
44
+
35
45
  :host {
36
46
  display: block;
37
47
  }
38
48
 
39
49
  .pagination {
40
50
  display: flex;
41
- align-items: center;
51
+ justify-content: center;
42
52
  }
43
53
 
44
54
  .list {
@@ -54,20 +64,26 @@ export class BdsPagination extends LitElement {
54
64
  display: inline-flex;
55
65
  align-items: center;
56
66
  justify-content: center;
57
- min-inline-size: 2rem;
58
- block-size: 2rem;
67
+ min-inline-size: 2.75rem;
68
+ block-size: 2.75rem;
59
69
  padding-inline: var(--bds-space_xs);
60
- font-size: var(--bds-font_size--body--s);
61
- font-family: var(--bds-font_family--body);
70
+ border-radius: var(--pagination_radius, var(--bds-border_radius--full));
71
+
72
+ /* Layered cascade: public overrides (--pagination_item-bg, --pagination_item-color,
73
+ --pagination_item-border) win over per-state defaults. The old --btn_* names are
74
+ kept as deprecated aliases. Hover/active write to the inner --btn_*--state slot. */
75
+ background-color: var(--pagination_item-bg, var(--btn_bg, var(--btn_bg--state, transparent)));
76
+ color: var(--pagination_item-color, var(--btn_color, var(--btn_color--state, var(--bds-color_on-bg))));
77
+ --bdc_color: var(--pagination_item-border, var(--btn_border, var(--btn_border--state, var(--bds-color_bg--subtle))));
78
+
62
79
  border: none;
63
- background: none;
64
- border-radius: var(--bds-border_radius--xs);
80
+ box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
81
+ font-family: var(--bds-font_family--body);
82
+ font-size: var(--bds-font_size--body);
83
+ font-variant-numeric: tabular-nums;
65
84
  cursor: pointer;
66
- color: var(--bds-color_on-bg);
67
85
  transition: var(--bds-animation_transition);
68
- --bdc_color: var(--pagination_border-color, transparent);
69
- --bdc-outline_radius: var(--bds-border_radius--xs);
70
- box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--bdc-outline_shadow);
86
+ box-sizing: border-box;
71
87
  }
72
88
 
73
89
  .button:focus-visible {
@@ -76,14 +92,16 @@ export class BdsPagination extends LitElement {
76
92
  }
77
93
 
78
94
  @media (hover: hover) and (pointer: fine) {
79
- .button:not(:disabled):not(.--active):hover {
80
- background-color: var(--bds-color_bg--subtle);
95
+ .button:not(:disabled, .--active):hover {
96
+ --btn_bg--state: var(--pagination_item-bg--hover, var(--btn_bg--hover, var(--bds-color_bg--subtle)));
97
+ --btn_color--state: var(--pagination_item-color--hover, var(--btn_color--hover, var(--bds-color_interactive_on-bg)));
81
98
  }
82
99
  }
83
100
 
84
101
  .button.--active {
85
- background-color: var(--bds-color_interactive);
86
- color: var(--bds-color_on-interactive);
102
+ --btn_bg--state: var(--pagination_item-bg--active, var(--btn_bg--active, var(--bdc-color_active)));
103
+ --btn_color--state: var(--pagination_item-color--active, var(--btn_color--active, var(--bdc-color_on-active)));
104
+ --btn_border--state: var(--pagination_item-border--active, var(--btn_border--active, var(--bdc-color_active)));
87
105
  font-weight: var(--bds-font_weight--semibold);
88
106
  }
89
107
 
@@ -100,9 +118,10 @@ export class BdsPagination extends LitElement {
100
118
  display: inline-flex;
101
119
  align-items: center;
102
120
  justify-content: center;
103
- min-inline-size: 2rem;
121
+ min-inline-size: 2.75rem;
122
+ block-size: 2.75rem;
104
123
  color: var(--bds-color_on-bg--subtle);
105
- font-size: var(--bds-font_size--body--s);
124
+ font-size: var(--bds-font_size--body);
106
125
  user-select: none;
107
126
  }
108
127
 
@@ -163,7 +182,8 @@ export class BdsPagination extends LitElement {
163
182
  <button
164
183
  type="button"
165
184
  class="button ${page === this.currentPage ? '--active' : ''}"
166
- aria-current=${page === this.currentPage ? 'page' : 'false'}
185
+ aria-label="Page ${page}"
186
+ aria-current=${page === this.currentPage ? 'page' : nothing}
167
187
  @click=${() => this._navigate(page as number)}
168
188
  >${page}</button>
169
189
  </li>
@@ -55,4 +55,25 @@ describe('bds-progress-circle', () => {
55
55
  expect(svg!.getAttribute('aria-hidden')).toBe('true');
56
56
  cleanup(el);
57
57
  });
58
+
59
+ it('omits aria-label instead of rendering it empty when label is unset', async () => {
60
+ const el = await fixture('<bds-progress-circle value="50"></bds-progress-circle>');
61
+ const wrapper = el.shadowRoot!.querySelector('[role="progressbar"]');
62
+ expect(wrapper!.hasAttribute('aria-label')).toBe(false);
63
+ cleanup(el);
64
+ });
65
+
66
+ it('clamps aria-valuenow to max when value exceeds max', async () => {
67
+ const el = await fixture('<bds-progress-circle value="150" max="100" label="Done"></bds-progress-circle>');
68
+ const wrapper = el.shadowRoot!.querySelector('[role="progressbar"]');
69
+ expect(wrapper!.getAttribute('aria-valuenow')).toBe('100');
70
+ cleanup(el);
71
+ });
72
+
73
+ it('clamps aria-valuenow to 0 for negative values', async () => {
74
+ const el = await fixture('<bds-progress-circle value="-10" label="Done"></bds-progress-circle>');
75
+ const wrapper = el.shadowRoot!.querySelector('[role="progressbar"]');
76
+ expect(wrapper!.getAttribute('aria-valuenow')).toBe('0');
77
+ cleanup(el);
78
+ });
58
79
  });
@@ -9,7 +9,9 @@ const STROKE_WIDTH = 4;
9
9
  * Attributes:
10
10
  * value — current progress value (required)
11
11
  * max — maximum value (default: 100)
12
- * label — accessible label for the progress bar
12
+ * label — accessible label for the progress bar (required — the host
13
+ * renders role="progressbar" and is nameless to assistive
14
+ * technology without it)
13
15
  * show-value — boolean; when set, displays the percentage in the centre
14
16
  * size — "small" | "medium" (default) | "large"
15
17
  *
@@ -18,6 +20,16 @@ const STROKE_WIDTH = 4;
18
20
  */
19
21
  export class BdsProgressCircle extends LitElement {
20
22
  static styles = css`
23
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
24
+ here; otherwise elements with an explicit size + padding size as
25
+ content-box and layouts drift from the React (light-DOM) versions. */
26
+ :host,
27
+ *,
28
+ *::before,
29
+ *::after {
30
+ box-sizing: border-box;
31
+ }
32
+
21
33
  :host {
22
34
  display: inline-flex;
23
35
  align-items: center;
@@ -30,7 +42,7 @@ export class BdsProgressCircle extends LitElement {
30
42
  }
31
43
 
32
44
  .track {
33
- stroke: var(--bds-color_bg--subtle);
45
+ stroke: var(--progressCircle_color-track, var(--bds-color_bg--subtle));
34
46
  }
35
47
 
36
48
  .fill {
@@ -47,7 +59,7 @@ export class BdsProgressCircle extends LitElement {
47
59
  line-height: 1;
48
60
  }
49
61
 
50
- :host([size='small']) .value { font-size: 0.5rem; }
62
+ :host([size='small']) .value { font-size: var(--progressCircle_font-size--small, var(--bds-font_size--body--s)); }
51
63
  :host([size='large']) .value { font-size: var(--bds-font_size--body); }
52
64
 
53
65
  @media (prefers-reduced-motion: reduce) {
@@ -91,8 +103,8 @@ export class BdsProgressCircle extends LitElement {
91
103
  return html`
92
104
  <div
93
105
  role="progressbar"
94
- aria-label=${this.label}
95
- aria-valuenow=${this.value}
106
+ aria-label=${this.label || nothing}
107
+ aria-valuenow=${Math.min(this.max, Math.max(0, this.value))}
96
108
  aria-valuemin="0"
97
109
  aria-valuemax=${this.max}
98
110
  style="position: relative; display: inline-flex; align-items: center; justify-content: center;"
@@ -63,4 +63,25 @@ describe('bds-progress', () => {
63
63
  expect(el.getAttribute('size')).toBe('large');
64
64
  cleanup(el);
65
65
  });
66
+
67
+ it('omits aria-label instead of rendering it empty when label is unset', async () => {
68
+ const el = await fixture('<bds-progress value="50"></bds-progress>');
69
+ const track = el.shadowRoot!.querySelector('.track');
70
+ expect(track!.hasAttribute('aria-label')).toBe(false);
71
+ cleanup(el);
72
+ });
73
+
74
+ it('clamps aria-valuenow to max when value exceeds max', async () => {
75
+ const el = await fixture('<bds-progress value="150" max="100" label="Done"></bds-progress>');
76
+ const track = el.shadowRoot!.querySelector('.track');
77
+ expect(track!.getAttribute('aria-valuenow')).toBe('100');
78
+ cleanup(el);
79
+ });
80
+
81
+ it('clamps aria-valuenow to 0 for negative values', async () => {
82
+ const el = await fixture('<bds-progress value="-10" label="Done"></bds-progress>');
83
+ const track = el.shadowRoot!.querySelector('.track');
84
+ expect(track!.getAttribute('aria-valuenow')).toBe('0');
85
+ cleanup(el);
86
+ });
66
87
  });
@@ -6,7 +6,9 @@ import { LitElement, css, html, nothing } from 'lit';
6
6
  * Attributes:
7
7
  * value — current progress value (required)
8
8
  * max — maximum value (default: 100)
9
- * label — accessible label for the progress bar
9
+ * label — accessible label for the progress bar (required — without it the
10
+ * progressbar has no accessible name; aria-label is omitted, not
11
+ * rendered empty, when unset)
10
12
  * show-label — boolean; when set, displays the label and percentage above the bar
11
13
  * size — "small" | "medium" (default) | "large"
12
14
  *
@@ -15,6 +17,16 @@ import { LitElement, css, html, nothing } from 'lit';
15
17
  */
16
18
  export class BdsProgress extends LitElement {
17
19
  static styles = css`
20
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
21
+ here; otherwise elements with an explicit size + padding size as
22
+ content-box and layouts drift from the React (light-DOM) versions. */
23
+ :host,
24
+ *,
25
+ *::before,
26
+ *::after {
27
+ box-sizing: border-box;
28
+ }
29
+
18
30
  :host {
19
31
  display: block;
20
32
  }
@@ -41,8 +53,8 @@ export class BdsProgress extends LitElement {
41
53
  .track {
42
54
  inline-size: 100%;
43
55
  block-size: var(--progress_height, var(--bds-space_xs));
44
- background-color: var(--bds-color_bg--subtle);
45
- border-radius: 999px;
56
+ background-color: var(--progress_color-track, var(--bds-color_bg--subtle));
57
+ border-radius: var(--progress_radius, var(--bds-border_radius--full));
46
58
  overflow: hidden;
47
59
  }
48
60
 
@@ -53,7 +65,7 @@ export class BdsProgress extends LitElement {
53
65
  .fill {
54
66
  block-size: 100%;
55
67
  background-color: var(--progress_color-active, var(--bdc-color_active));
56
- border-radius: 999px;
68
+ border-radius: var(--progress_radius, var(--bds-border_radius--full));
57
69
  transition: inline-size var(--bds-animation_transition-duration) var(--bds-animation_easing);
58
70
  }
59
71
 
@@ -93,6 +105,7 @@ export class BdsProgress extends LitElement {
93
105
 
94
106
  render() {
95
107
  const pct = this._percentage;
108
+ const clampedValue = Math.min(this.max, Math.max(0, this.value));
96
109
  return html`
97
110
  <div class="container">
98
111
  ${this.showLabel
@@ -106,8 +119,8 @@ export class BdsProgress extends LitElement {
106
119
  <div
107
120
  class="track"
108
121
  role="progressbar"
109
- aria-label=${this.label}
110
- aria-valuenow=${this.value}
122
+ aria-label=${this.label || nothing}
123
+ aria-valuenow=${clampedValue}
111
124
  aria-valuemin="0"
112
125
  aria-valuemax=${this.max}
113
126
  >
@@ -67,4 +67,10 @@ describe('bds-rating', () => {
67
67
  expect(filledStars.length).toBe(4);
68
68
  cleanup(el);
69
69
  });
70
+
71
+ it('exposes --rating_color and --rating_color--filled override hooks, matching the React counterpart', () => {
72
+ const cssText = BdsRating.styles.cssText;
73
+ expect(cssText).toMatch(/color:\s*var\(--rating_color,\s*var\(--bds-color_bg\)\)/);
74
+ expect(cssText).toMatch(/color:\s*var\(--rating_color--filled,\s*var\(--bds-color_warning\)\)/);
75
+ });
70
76
  });
@@ -15,6 +15,16 @@ const STAR_PATH = 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.6
15
15
  */
16
16
  export class BdsRating extends LitElement {
17
17
  static styles = css`
18
+ /* Shadow DOM does not inherit the global box-sizing reset, so set it
19
+ here; otherwise elements with an explicit size + padding size as
20
+ content-box and layouts drift from the React (light-DOM) versions. */
21
+ :host,
22
+ *,
23
+ *::before,
24
+ *::after {
25
+ box-sizing: border-box;
26
+ }
27
+
18
28
  :host {
19
29
  display: inline-flex;
20
30
  }
@@ -22,7 +32,7 @@ export class BdsRating extends LitElement {
22
32
  .rating {
23
33
  display: inline-flex;
24
34
  gap: var(--bds-space_xxxs);
25
- color: var(--bds-color_bg);
35
+ color: var(--rating_color, var(--bds-color_bg));
26
36
  }
27
37
 
28
38
  .star {
@@ -31,7 +41,7 @@ export class BdsRating extends LitElement {
31
41
  }
32
42
 
33
43
  .star.--filled {
34
- color: var(--bds-color_warning);
44
+ color: var(--rating_color--filled, var(--bds-color_warning));
35
45
  }
36
46
  `;
37
47