@boostdev/design-system-components 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/AGENTS.md +13 -10
  2. package/dist/client.cjs +77 -99
  3. package/dist/client.css +611 -580
  4. package/dist/client.d.cts +13 -16
  5. package/dist/client.d.ts +13 -16
  6. package/dist/client.js +87 -109
  7. package/dist/index.cjs +77 -99
  8. package/dist/index.css +611 -580
  9. package/dist/index.d.cts +13 -16
  10. package/dist/index.d.ts +13 -16
  11. package/dist/index.js +87 -109
  12. package/dist/native/index.cjs +9 -8
  13. package/dist/native/index.d.cts +1 -1
  14. package/dist/native/index.d.ts +1 -1
  15. package/dist/native/index.js +9 -8
  16. package/dist/web-components/chunk-2QA62WCQ.js +48 -0
  17. package/dist/web-components/chunk-3REOIRDW.js +246 -0
  18. package/dist/web-components/chunk-57TRNCWQ.js +93 -0
  19. package/dist/web-components/chunk-5IPHEONG.js +139 -0
  20. package/dist/web-components/chunk-5R6IFELV.js +63 -0
  21. package/dist/web-components/chunk-5TFWOPLH.js +49 -0
  22. package/dist/web-components/chunk-6I3CFC26.js +89 -0
  23. package/dist/web-components/chunk-6MH5UWUD.js +226 -0
  24. package/dist/web-components/chunk-7FMR53BW.js +127 -0
  25. package/dist/web-components/chunk-AGKJTMJI.js +56 -0
  26. package/dist/web-components/chunk-AJSXNDAP.js +151 -0
  27. package/dist/web-components/chunk-BQLZ7I4G.js +56 -0
  28. package/dist/web-components/chunk-BX3IPVOB.js +167 -0
  29. package/dist/web-components/chunk-CR5PGUHV.js +109 -0
  30. package/dist/web-components/chunk-DI46Q2EA.js +278 -0
  31. package/dist/web-components/chunk-DZRSJGPB.js +53 -0
  32. package/dist/web-components/chunk-EBJM3VD4.js +107 -0
  33. package/dist/web-components/chunk-ECW3HHWA.js +185 -0
  34. package/dist/web-components/chunk-HGBNDR22.js +98 -0
  35. package/dist/web-components/chunk-HHHRF2PS.js +118 -0
  36. package/dist/web-components/chunk-ITHLKR7Q.js +105 -0
  37. package/dist/web-components/chunk-JUKB3BUP.js +186 -0
  38. package/dist/web-components/chunk-L3XHOMN6.js +111 -0
  39. package/dist/{web-components.js → web-components/chunk-LGEZYFUU.js} +62 -844
  40. package/dist/web-components/chunk-LY62SAVN.js +64 -0
  41. package/dist/web-components/chunk-N6IMUOY4.js +185 -0
  42. package/dist/web-components/chunk-OHUTLSIQ.js +69 -0
  43. package/dist/web-components/chunk-OQTRTMAB.js +27 -0
  44. package/dist/web-components/chunk-PY62FTRW.js +179 -0
  45. package/dist/web-components/chunk-Q4T5BJT6.js +94 -0
  46. package/dist/web-components/chunk-QDST57JC.js +119 -0
  47. package/dist/web-components/chunk-QLZ2362S.js +279 -0
  48. package/dist/web-components/chunk-QPOKHLMQ.js +45 -0
  49. package/dist/web-components/chunk-SOQQ7RVJ.js +88 -0
  50. package/dist/web-components/chunk-T6AETZRP.js +131 -0
  51. package/dist/web-components/chunk-UFFCKVZE.js +149 -0
  52. package/dist/web-components/chunk-VMMVWLXL.js +53 -0
  53. package/dist/web-components/chunk-X3FKVHLK.js +144 -0
  54. package/dist/web-components/chunk-XNA6WTXG.js +133 -0
  55. package/dist/web-components/chunk-Y4MAXTMA.js +80 -0
  56. package/dist/web-components/chunk-YLVTEY23.js +165 -0
  57. package/dist/web-components/chunk-YRXCVKHV.js +116 -0
  58. package/dist/web-components/chunk-ZTC6GRP7.js +64 -0
  59. package/dist/web-components/globals.d.ts +2 -0
  60. package/dist/web-components/globals.js +1 -0
  61. package/dist/web-components/index.d.ts +41 -0
  62. package/dist/web-components/index.js +165 -0
  63. package/dist/web-components/interaction/bds-accordion-item.d.ts +54 -0
  64. package/dist/web-components/interaction/bds-accordion-item.js +7 -0
  65. package/dist/web-components/interaction/bds-accordion.d.ts +50 -0
  66. package/dist/web-components/interaction/bds-accordion.js +7 -0
  67. package/dist/web-components/interaction/bds-button.d.ts +100 -0
  68. package/dist/web-components/interaction/bds-button.js +7 -0
  69. package/dist/web-components/interaction/bds-collapsible.d.ts +52 -0
  70. package/dist/web-components/interaction/bds-collapsible.js +7 -0
  71. package/dist/web-components/interaction/bds-dialog.d.ts +56 -0
  72. package/dist/web-components/interaction/bds-dialog.js +7 -0
  73. package/dist/web-components/interaction/bds-drawer.d.ts +64 -0
  74. package/dist/web-components/interaction/bds-drawer.js +7 -0
  75. package/dist/web-components/interaction/bds-popover.d.ts +62 -0
  76. package/dist/web-components/interaction/bds-popover.js +7 -0
  77. package/dist/web-components/interaction/bds-skip-link.d.ts +36 -0
  78. package/dist/web-components/interaction/bds-skip-link.js +7 -0
  79. package/dist/web-components/interaction/bds-tab-panel.d.ts +26 -0
  80. package/dist/web-components/interaction/bds-tab-panel.js +7 -0
  81. package/dist/web-components/interaction/bds-tab.d.ts +45 -0
  82. package/dist/web-components/interaction/bds-tab.js +7 -0
  83. package/dist/web-components/interaction/bds-tabs.d.ts +46 -0
  84. package/dist/web-components/interaction/bds-tabs.js +7 -0
  85. package/dist/web-components/interaction/bds-toast-provider.d.ts +57 -0
  86. package/dist/web-components/interaction/bds-toast-provider.js +7 -0
  87. package/dist/web-components/interaction/bds-tooltip.d.ts +50 -0
  88. package/dist/web-components/interaction/bds-tooltip.js +7 -0
  89. package/dist/web-components/interaction/form/bds-checkbox.d.ts +70 -0
  90. package/dist/web-components/interaction/form/bds-checkbox.js +7 -0
  91. package/dist/web-components/interaction/form/bds-combobox.d.ts +84 -0
  92. package/dist/web-components/interaction/form/bds-combobox.js +7 -0
  93. package/dist/web-components/interaction/form/bds-file-input.d.ts +62 -0
  94. package/dist/web-components/interaction/form/bds-file-input.js +7 -0
  95. package/dist/web-components/interaction/form/bds-number-input.d.ts +68 -0
  96. package/dist/web-components/interaction/form/bds-number-input.js +7 -0
  97. package/dist/web-components/interaction/form/bds-radio.d.ts +68 -0
  98. package/dist/web-components/interaction/form/bds-radio.js +7 -0
  99. package/dist/web-components/interaction/form/bds-segmented-control.d.ts +88 -0
  100. package/dist/web-components/interaction/form/bds-segmented-control.js +7 -0
  101. package/dist/web-components/interaction/form/bds-select.d.ts +79 -0
  102. package/dist/web-components/interaction/form/bds-select.js +7 -0
  103. package/dist/web-components/interaction/form/bds-slider.d.ts +70 -0
  104. package/dist/web-components/interaction/form/bds-slider.js +7 -0
  105. package/dist/web-components/interaction/form/bds-switch.d.ts +67 -0
  106. package/dist/web-components/interaction/form/bds-switch.js +7 -0
  107. package/dist/web-components/interaction/form/bds-textarea.d.ts +70 -0
  108. package/dist/web-components/interaction/form/bds-textarea.js +7 -0
  109. package/dist/web-components/ui/bds-alert.d.ts +66 -0
  110. package/dist/web-components/ui/bds-alert.js +7 -0
  111. package/dist/web-components/ui/bds-avatar.d.ts +50 -0
  112. package/dist/web-components/ui/bds-avatar.js +7 -0
  113. package/dist/web-components/ui/bds-badge.d.ts +35 -0
  114. package/dist/web-components/ui/bds-badge.js +7 -0
  115. package/dist/web-components/ui/bds-breadcrumb.d.ts +35 -0
  116. package/dist/web-components/ui/bds-breadcrumb.js +7 -0
  117. package/dist/web-components/ui/bds-card.d.ts +72 -0
  118. package/dist/web-components/ui/bds-card.js +7 -0
  119. package/dist/web-components/ui/bds-description-list.d.ts +42 -0
  120. package/dist/web-components/ui/bds-description-list.js +7 -0
  121. package/dist/web-components/ui/bds-icon-wrapper.d.ts +39 -0
  122. package/dist/web-components/ui/bds-icon-wrapper.js +7 -0
  123. package/dist/web-components/ui/bds-link.d.ts +59 -0
  124. package/dist/web-components/ui/bds-link.js +7 -0
  125. package/dist/web-components/ui/bds-loading.d.ts +32 -0
  126. package/dist/web-components/ui/bds-loading.js +7 -0
  127. package/dist/web-components/ui/bds-notification-banner.d.ts +61 -0
  128. package/dist/web-components/ui/bds-notification-banner.js +7 -0
  129. package/dist/web-components/ui/bds-progress-circle.d.ts +53 -0
  130. package/dist/web-components/ui/bds-progress-circle.js +7 -0
  131. package/dist/web-components/ui/bds-progress.d.ts +54 -0
  132. package/dist/web-components/ui/bds-progress.js +7 -0
  133. package/dist/web-components/ui/bds-rating.d.ts +36 -0
  134. package/dist/web-components/ui/bds-rating.js +7 -0
  135. package/dist/web-components/ui/bds-section-header.d.ts +53 -0
  136. package/dist/web-components/ui/bds-section-header.js +8 -0
  137. package/dist/web-components/ui/bds-separator.d.ts +32 -0
  138. package/dist/web-components/ui/bds-separator.js +7 -0
  139. package/dist/web-components/ui/bds-skeleton.d.ts +22 -0
  140. package/dist/web-components/ui/bds-skeleton.js +7 -0
  141. package/dist/web-components/ui/bds-typography.d.ts +44 -0
  142. package/dist/web-components/ui/bds-typography.js +8 -0
  143. package/package.json +170 -5
  144. package/src/components/interaction/Button/Button.module.css +12 -11
  145. package/src/components/interaction/Button/Button.native.tsx +10 -9
  146. package/src/components/interaction/Button/Button.tsx +1 -1
  147. package/src/components/interaction/Command/Command.module.css +3 -7
  148. package/src/components/interaction/Dialog/Dialog.module.css +7 -5
  149. package/src/components/interaction/Drawer/Drawer.module.css +49 -1
  150. package/src/components/interaction/DropdownMenu/DropdownMenu.module.css +1 -3
  151. package/src/components/interaction/Popover/Popover.module.css +1 -3
  152. package/src/components/interaction/form/Checkbox/Checkbox.module.css +1 -3
  153. package/src/components/interaction/form/Combobox/Combobox.module.css +2 -6
  154. package/src/components/interaction/form/FormInput/FormInput.module.css +1 -3
  155. package/src/components/interaction/form/NumberInput/NumberInput.module.css +16 -4
  156. package/src/components/interaction/form/Radio/Radio.module.css +6 -16
  157. package/src/components/interaction/form/SegmentedControl/SegmentedControl.mdx +70 -25
  158. package/src/components/interaction/form/SegmentedControl/SegmentedControl.module.css +55 -33
  159. package/src/components/interaction/form/SegmentedControl/SegmentedControl.spec.tsx +127 -56
  160. package/src/components/interaction/form/SegmentedControl/SegmentedControl.stories.tsx +89 -72
  161. package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +40 -62
  162. package/src/components/interaction/form/SegmentedControl/index.ts +1 -1
  163. package/src/components/interaction/form/Select/Select.module.css +2 -4
  164. package/src/components/interaction/form/Switch/Switch.module.css +5 -7
  165. package/src/components/interaction/form/Switch/Switch.native.spec.tsx +9 -9
  166. package/src/components/interaction/form/Switch/Switch.native.tsx +2 -2
  167. package/src/components/interaction/form/Textarea/Textarea.module.css +1 -3
  168. package/src/components/interaction/form/atoms/InputContainer.stories.tsx +64 -0
  169. package/src/components/interaction/form/atoms/Label.stories.tsx +33 -0
  170. package/src/components/interaction/form/atoms/Message.stories.tsx +33 -0
  171. package/src/components/layout/Card/Card.module.css +1 -3
  172. package/src/components/ui/Accordion/Accordion.module.css +1 -2
  173. package/src/components/ui/Alert/Alert.module.css +1 -2
  174. package/src/components/ui/Calendar/Calendar.module.css +2 -5
  175. package/src/components/ui/Carousel/Carousel.module.css +1 -3
  176. package/src/components/ui/NotificationBanner/NotificationBanner.module.css +1 -2
  177. package/src/components/ui/Pagination/Pagination.module.css +1 -2
  178. package/src/components/ui/SkipLink/SkipLink.module.css +1 -2
  179. package/src/components/ui/Table/Table.module.css +1 -2
  180. package/src/css/bdc.css +16 -11
  181. package/src/index.ts +1 -1
  182. package/src/web-components/globals.ts +3 -3
  183. package/src/web-components/index.ts +47 -0
  184. package/src/web-components/interaction/BdsAccordion.mdx +51 -0
  185. package/src/web-components/interaction/BdsAccordion.stories.tsx +85 -0
  186. package/src/web-components/interaction/BdsCollapsible.mdx +46 -0
  187. package/src/web-components/interaction/BdsCollapsible.stories.tsx +87 -0
  188. package/src/web-components/interaction/BdsDialog.mdx +49 -0
  189. package/src/web-components/interaction/BdsDialog.stories.tsx +75 -0
  190. package/src/web-components/interaction/BdsDrawer.mdx +50 -0
  191. package/src/web-components/interaction/BdsDrawer.stories.tsx +66 -0
  192. package/src/web-components/interaction/BdsSkipLink.mdx +34 -0
  193. package/src/web-components/interaction/BdsSkipLink.stories.tsx +55 -0
  194. package/src/web-components/interaction/BdsTabs.mdx +47 -0
  195. package/src/web-components/interaction/BdsTabs.stories.tsx +80 -0
  196. package/src/web-components/interaction/BdsTooltip.mdx +38 -0
  197. package/src/web-components/interaction/BdsTooltip.stories.tsx +68 -0
  198. package/src/web-components/interaction/bds-accordion-item.spec.ts +75 -0
  199. package/src/web-components/interaction/bds-accordion-item.ts +181 -0
  200. package/src/web-components/interaction/bds-accordion.spec.ts +73 -0
  201. package/src/web-components/interaction/bds-accordion.ts +98 -0
  202. package/src/web-components/interaction/bds-button.ts +15 -13
  203. package/src/web-components/interaction/bds-collapsible.spec.ts +56 -0
  204. package/src/web-components/interaction/bds-collapsible.ts +170 -0
  205. package/src/web-components/interaction/bds-dialog.spec.ts +119 -0
  206. package/src/web-components/interaction/bds-dialog.ts +221 -0
  207. package/src/web-components/interaction/bds-drawer.spec.ts +113 -0
  208. package/src/web-components/interaction/bds-drawer.ts +315 -0
  209. package/src/web-components/interaction/bds-skip-link.spec.ts +42 -0
  210. package/src/web-components/interaction/bds-skip-link.ts +74 -0
  211. package/src/web-components/interaction/bds-tab-panel.spec.ts +32 -0
  212. package/src/web-components/interaction/bds-tab-panel.ts +38 -0
  213. package/src/web-components/interaction/bds-tab.spec.ts +71 -0
  214. package/src/web-components/interaction/bds-tab.ts +110 -0
  215. package/src/web-components/interaction/bds-tabs.spec.ts +120 -0
  216. package/src/web-components/interaction/bds-tabs.ts +152 -0
  217. package/src/web-components/interaction/bds-tooltip.spec.ts +49 -0
  218. package/src/web-components/interaction/bds-tooltip.ts +127 -0
  219. package/src/web-components/interaction/form/BdsCheckbox.mdx +39 -0
  220. package/src/web-components/interaction/form/BdsCheckbox.stories.tsx +73 -0
  221. package/src/web-components/interaction/form/BdsCombobox.mdx +52 -0
  222. package/src/web-components/interaction/form/BdsCombobox.stories.tsx +91 -0
  223. package/src/web-components/interaction/form/BdsFileInput.mdx +44 -0
  224. package/src/web-components/interaction/form/BdsFileInput.stories.tsx +84 -0
  225. package/src/web-components/interaction/form/BdsNumberInput.mdx +41 -0
  226. package/src/web-components/interaction/form/BdsNumberInput.stories.tsx +90 -0
  227. package/src/web-components/interaction/form/BdsRadio.mdx +41 -0
  228. package/src/web-components/interaction/form/BdsRadio.stories.tsx +90 -0
  229. package/src/web-components/interaction/form/BdsSegmentedControl.mdx +42 -0
  230. package/src/web-components/interaction/form/BdsSegmentedControl.stories.tsx +92 -0
  231. package/src/web-components/interaction/form/BdsSelect.mdx +38 -0
  232. package/src/web-components/interaction/form/BdsSelect.stories.tsx +93 -0
  233. package/src/web-components/interaction/form/BdsSlider.mdx +49 -0
  234. package/src/web-components/interaction/form/BdsSlider.stories.tsx +89 -0
  235. package/src/web-components/interaction/form/BdsSwitch.mdx +39 -0
  236. package/src/web-components/interaction/form/BdsSwitch.stories.tsx +73 -0
  237. package/src/web-components/interaction/form/BdsTextarea.mdx +41 -0
  238. package/src/web-components/interaction/form/BdsTextarea.stories.tsx +79 -0
  239. package/src/web-components/interaction/form/bds-checkbox.spec.ts +63 -0
  240. package/src/web-components/interaction/form/bds-checkbox.ts +166 -0
  241. package/src/web-components/interaction/form/bds-combobox.spec.ts +117 -0
  242. package/src/web-components/interaction/form/bds-combobox.ts +334 -0
  243. package/src/web-components/interaction/form/bds-file-input.spec.ts +58 -0
  244. package/src/web-components/interaction/form/bds-file-input.ts +209 -0
  245. package/src/web-components/interaction/form/bds-number-input.spec.ts +87 -0
  246. package/src/web-components/interaction/form/bds-number-input.ts +220 -0
  247. package/src/web-components/interaction/form/bds-radio.spec.ts +70 -0
  248. package/src/web-components/interaction/form/bds-radio.ts +151 -0
  249. package/src/web-components/interaction/form/bds-segmented-control.spec.ts +74 -0
  250. package/src/web-components/interaction/form/bds-segmented-control.ts +282 -0
  251. package/src/web-components/interaction/form/bds-select.spec.ts +74 -0
  252. package/src/web-components/interaction/form/bds-select.ts +188 -0
  253. package/src/web-components/interaction/form/bds-slider.spec.ts +41 -0
  254. package/src/web-components/interaction/form/bds-slider.ts +162 -0
  255. package/src/web-components/interaction/form/bds-switch.spec.ts +62 -0
  256. package/src/web-components/interaction/form/bds-switch.ts +165 -0
  257. package/src/web-components/interaction/form/bds-textarea.spec.ts +55 -0
  258. package/src/web-components/interaction/form/bds-textarea.ts +141 -0
  259. package/src/web-components/ui/BdsAvatar.mdx +67 -0
  260. package/src/web-components/ui/BdsAvatar.stories.tsx +62 -0
  261. package/src/web-components/ui/BdsBreadcrumb.mdx +63 -0
  262. package/src/web-components/ui/BdsBreadcrumb.stories.tsx +59 -0
  263. package/src/web-components/ui/BdsCard.mdx +83 -0
  264. package/src/web-components/ui/BdsCard.stories.tsx +90 -0
  265. package/src/web-components/ui/BdsDescriptionList.mdx +67 -0
  266. package/src/web-components/ui/BdsDescriptionList.stories.tsx +79 -0
  267. package/src/web-components/ui/BdsIconWrapper.mdx +70 -0
  268. package/src/web-components/ui/BdsIconWrapper.stories.tsx +76 -0
  269. package/src/web-components/ui/BdsLink.mdx +75 -0
  270. package/src/web-components/ui/BdsLink.stories.tsx +64 -0
  271. package/src/web-components/ui/BdsLoading.mdx +62 -0
  272. package/src/web-components/ui/BdsLoading.stories.tsx +37 -0
  273. package/src/web-components/ui/BdsNotificationBanner.mdx +90 -0
  274. package/src/web-components/ui/BdsNotificationBanner.stories.tsx +93 -0
  275. package/src/web-components/ui/BdsProgress.mdx +63 -0
  276. package/src/web-components/ui/BdsProgress.stories.tsx +70 -0
  277. package/src/web-components/ui/BdsProgressCircle.mdx +64 -0
  278. package/src/web-components/ui/BdsProgressCircle.stories.tsx +69 -0
  279. package/src/web-components/ui/BdsRating.mdx +61 -0
  280. package/src/web-components/ui/BdsRating.stories.tsx +39 -0
  281. package/src/web-components/ui/BdsSectionHeader.mdx +69 -0
  282. package/src/web-components/ui/BdsSectionHeader.stories.tsx +56 -0
  283. package/src/web-components/ui/BdsSeparator.mdx +63 -0
  284. package/src/web-components/ui/BdsSeparator.stories.tsx +47 -0
  285. package/src/web-components/ui/BdsSkeleton.mdx +67 -0
  286. package/src/web-components/ui/BdsSkeleton.stories.tsx +50 -0
  287. package/src/web-components/ui/BdsTypography.mdx +83 -0
  288. package/src/web-components/ui/BdsTypography.stories.tsx +51 -0
  289. package/src/web-components/ui/bds-alert.ts +1 -2
  290. package/src/web-components/ui/bds-avatar.spec.ts +75 -0
  291. package/src/web-components/ui/bds-avatar.ts +122 -0
  292. package/src/web-components/ui/bds-breadcrumb.spec.ts +55 -0
  293. package/src/web-components/ui/bds-breadcrumb.ts +114 -0
  294. package/src/web-components/ui/bds-card.spec.ts +70 -0
  295. package/src/web-components/ui/bds-card.ts +154 -0
  296. package/src/web-components/ui/bds-description-list.spec.ts +36 -0
  297. package/src/web-components/ui/bds-description-list.ts +79 -0
  298. package/src/web-components/ui/bds-icon-wrapper.spec.ts +21 -0
  299. package/src/web-components/ui/bds-icon-wrapper.ts +68 -0
  300. package/src/web-components/ui/bds-link.spec.ts +72 -0
  301. package/src/web-components/ui/bds-link.ts +138 -0
  302. package/src/web-components/ui/bds-loading.spec.ts +38 -0
  303. package/src/web-components/ui/bds-loading.ts +76 -0
  304. package/src/web-components/ui/bds-notification-banner.spec.ts +82 -0
  305. package/src/web-components/ui/bds-notification-banner.ts +184 -0
  306. package/src/web-components/ui/bds-progress-circle.spec.ts +58 -0
  307. package/src/web-components/ui/bds-progress-circle.ts +142 -0
  308. package/src/web-components/ui/bds-progress.spec.ts +66 -0
  309. package/src/web-components/ui/bds-progress.ts +127 -0
  310. package/src/web-components/ui/bds-rating.spec.ts +70 -0
  311. package/src/web-components/ui/bds-rating.ts +80 -0
  312. package/src/web-components/ui/bds-section-header.spec.ts +57 -0
  313. package/src/web-components/ui/bds-section-header.ts +96 -0
  314. package/src/web-components/ui/bds-separator.spec.ts +50 -0
  315. package/src/web-components/ui/bds-separator.ts +66 -0
  316. package/src/web-components/ui/bds-skeleton.spec.ts +22 -0
  317. package/src/web-components/ui/bds-skeleton.ts +55 -0
  318. package/src/web-components/ui/bds-typography.spec.ts +76 -0
  319. package/src/web-components/ui/bds-typography.ts +112 -0
  320. package/dist/web-components.d.ts +0 -304
@@ -0,0 +1,82 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsNotificationBanner } from './bds-notification-banner';
3
+
4
+ describe('bds-notification-banner', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-notification-banner')).toBe(BdsNotificationBanner);
7
+ });
8
+
9
+ it('defaults to variant="info"', async () => {
10
+ const el = await fixture('<bds-notification-banner>Message</bds-notification-banner>');
11
+ expect(el.getAttribute('variant')).toBe('info');
12
+ cleanup(el);
13
+ });
14
+
15
+ it('renders banner with role="status" for info variant', async () => {
16
+ const el = await fixture('<bds-notification-banner variant="info">Info</bds-notification-banner>');
17
+ const banner = el.shadowRoot!.querySelector('.banner');
18
+ expect(banner!.getAttribute('role')).toBe('status');
19
+ expect(banner!.getAttribute('aria-live')).toBe('polite');
20
+ cleanup(el);
21
+ });
22
+
23
+ it('renders banner with role="alert" for error variant', async () => {
24
+ const el = await fixture('<bds-notification-banner variant="error">Error</bds-notification-banner>');
25
+ const banner = el.shadowRoot!.querySelector('.banner');
26
+ expect(banner!.getAttribute('role')).toBe('alert');
27
+ expect(banner!.getAttribute('aria-live')).toBe('assertive');
28
+ cleanup(el);
29
+ });
30
+
31
+ it('renders banner with role="alert" for warning variant', async () => {
32
+ const el = await fixture('<bds-notification-banner variant="warning">Warning</bds-notification-banner>');
33
+ const banner = el.shadowRoot!.querySelector('.banner');
34
+ expect(banner!.getAttribute('role')).toBe('alert');
35
+ cleanup(el);
36
+ });
37
+
38
+ it('does not render dismiss button by default', async () => {
39
+ const el = await fixture('<bds-notification-banner>Message</bds-notification-banner>');
40
+ expect(el.shadowRoot!.querySelector('button.dismiss')).toBeNull();
41
+ cleanup(el);
42
+ });
43
+
44
+ it('renders dismiss button when dismissible is set', async () => {
45
+ const el = await fixture('<bds-notification-banner dismissible>Message</bds-notification-banner>');
46
+ const btn = el.shadowRoot!.querySelector('button.dismiss');
47
+ expect(btn).not.toBeNull();
48
+ expect(btn!.getAttribute('aria-label')).toBe('Dismiss notification');
49
+ cleanup(el);
50
+ });
51
+
52
+ it('uses custom dismiss-label when set', async () => {
53
+ const el = await fixture('<bds-notification-banner dismissible dismiss-label="Close banner">Message</bds-notification-banner>');
54
+ const btn = el.shadowRoot!.querySelector('button.dismiss');
55
+ expect(btn!.getAttribute('aria-label')).toBe('Close banner');
56
+ cleanup(el);
57
+ });
58
+
59
+ it('fires bds-dismiss when dismiss button is clicked', async () => {
60
+ const el = await fixture('<bds-notification-banner dismissible>Message</bds-notification-banner>');
61
+ const btn = el.shadowRoot!.querySelector('button.dismiss')!;
62
+ const handler = vi.fn();
63
+ el.addEventListener('bds-dismiss', handler);
64
+ btn.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true }));
65
+ expect(handler).toHaveBeenCalledOnce();
66
+ cleanup(el);
67
+ });
68
+
69
+ it('renders slotted content', async () => {
70
+ const el = await fixture('<bds-notification-banner>Hello world</bds-notification-banner>');
71
+ expect(el.textContent?.trim()).toBe('Hello world');
72
+ cleanup(el);
73
+ });
74
+
75
+ it('reflects variant property updates', async () => {
76
+ const el = await fixture('<bds-notification-banner>Message</bds-notification-banner>') as BdsNotificationBanner;
77
+ el.variant = 'success';
78
+ await el.updateComplete;
79
+ expect(el.getAttribute('variant')).toBe('success');
80
+ cleanup(el);
81
+ });
82
+ });
@@ -0,0 +1,184 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+
3
+ export type NotificationBannerVariant = 'info' | 'success' | 'warning' | 'error';
4
+
5
+ /**
6
+ * `<bds-notification-banner>` — framework-agnostic Notification Banner custom element.
7
+ *
8
+ * Attributes:
9
+ * variant — "info" (default) | "success" | "warning" | "error"
10
+ * dismissible — boolean; shows a dismiss button when present
11
+ * dismiss-label — aria-label for the dismiss button (default: "Dismiss notification")
12
+ *
13
+ * Slots:
14
+ * (default) — banner body content
15
+ * action — optional action area (e.g. a button)
16
+ *
17
+ * Events:
18
+ * bds-dismiss — fired (bubbles, composed) when the dismiss button is clicked
19
+ *
20
+ * @example
21
+ * <bds-notification-banner variant="success">
22
+ * Your changes have been saved.
23
+ * <button slot="action" type="button">Undo</button>
24
+ * </bds-notification-banner>
25
+ */
26
+ export class BdsNotificationBanner extends LitElement {
27
+ static styles = css`
28
+ :host {
29
+ display: block;
30
+ }
31
+
32
+ .banner {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: var(--bds-space_m);
36
+ padding: var(--bds-space_s) var(--bds-space_m);
37
+ background-color: var(--banner_bg, var(--bds-color_blue--subtle));
38
+ color: var(--banner_text, var(--bds-color_on-blue--subtle));
39
+ border-block-end: 3px solid var(--banner_border, var(--bds-color_blue));
40
+ font-size: var(--bds-font_size--body);
41
+ line-height: var(--bds-font_line-height--body);
42
+ inline-size: 100%;
43
+ box-sizing: border-box;
44
+ }
45
+
46
+ :host([variant='info']) .banner {
47
+ --banner_bg: var(--bds-color_blue--subtle);
48
+ --banner_text: var(--bds-color_on-blue--subtle);
49
+ --banner_border: var(--bds-color_blue);
50
+ }
51
+
52
+ :host([variant='success']) .banner {
53
+ --banner_bg: var(--bds-color_success--subtle);
54
+ --banner_text: var(--bds-color_on-success--subtle);
55
+ --banner_border: var(--bds-color_success);
56
+ }
57
+
58
+ :host([variant='warning']) .banner {
59
+ --banner_bg: var(--bds-color_orange--subtle);
60
+ --banner_text: var(--bds-color_on-orange--subtle);
61
+ --banner_border: var(--bds-color_warning);
62
+ }
63
+
64
+ :host([variant='error']) .banner {
65
+ --banner_bg: rgb(from var(--bds-color_error) r g b / 12%);
66
+ --banner_text: var(--bds-color_on-bg);
67
+ --banner_border: var(--bds-color_error);
68
+ }
69
+
70
+ .content {
71
+ flex: 1;
72
+ }
73
+
74
+ .action {
75
+ flex-shrink: 0;
76
+ display: none;
77
+ }
78
+
79
+ .action.has-content {
80
+ display: block;
81
+ }
82
+
83
+ .dismiss {
84
+ all: unset;
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ flex-shrink: 0;
89
+ cursor: pointer;
90
+ color: currentcolor;
91
+ border-radius: 50%;
92
+ transition: var(--bds-animation_transition);
93
+ --bdc_color: currentcolor;
94
+ box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
95
+ }
96
+
97
+ .dismiss svg {
98
+ inline-size: 1rem;
99
+ block-size: 1rem;
100
+ }
101
+
102
+ .dismiss:focus-visible {
103
+ outline: var(--bds-outline_default);
104
+ outline-offset: var(--bds-outline_offset);
105
+ }
106
+
107
+ @media (hover: hover) and (pointer: fine) {
108
+ .dismiss:hover {
109
+ opacity: 0.7;
110
+ }
111
+ }
112
+ `;
113
+
114
+ static properties = {
115
+ variant: { type: String, reflect: true },
116
+ dismissible: { type: Boolean, reflect: true },
117
+ dismissLabel: { type: String, attribute: 'dismiss-label' },
118
+ _actionFilled: { state: true },
119
+ };
120
+
121
+ declare variant: NotificationBannerVariant;
122
+ declare dismissible: boolean;
123
+ declare dismissLabel: string;
124
+ declare private _actionFilled: boolean;
125
+
126
+ constructor() {
127
+ super();
128
+ this.variant = 'info';
129
+ this.dismissible = false;
130
+ this.dismissLabel = 'Dismiss notification';
131
+ this._actionFilled = false;
132
+ }
133
+
134
+ private _onActionSlotChange(e: Event) {
135
+ const slot = e.target as HTMLSlotElement;
136
+ this._actionFilled = slot.assignedNodes({ flatten: true }).length > 0;
137
+ }
138
+
139
+ private get _isUrgent() {
140
+ return this.variant === 'error' || this.variant === 'warning';
141
+ }
142
+
143
+ private _handleDismiss() {
144
+ this.dispatchEvent(new CustomEvent('bds-dismiss', { bubbles: true, composed: true }));
145
+ }
146
+
147
+ render() {
148
+ return html`
149
+ <div
150
+ class="banner"
151
+ role=${this._isUrgent ? 'alert' : 'status'}
152
+ aria-live=${this._isUrgent ? 'assertive' : 'polite'}
153
+ aria-atomic="true"
154
+ >
155
+ <div class="content"><slot></slot></div>
156
+ <div class="action ${this._actionFilled ? 'has-content' : ''}">
157
+ <slot name="action" @slotchange=${this._onActionSlotChange}></slot>
158
+ </div>
159
+ ${this.dismissible
160
+ ? html`
161
+ <button
162
+ type="button"
163
+ class="dismiss"
164
+ @click=${this._handleDismiss}
165
+ aria-label=${this.dismissLabel}
166
+ >
167
+ <svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
168
+ <path stroke-linecap="round" stroke-linejoin="round" d="M18 6L6 18M6 6l12 12" />
169
+ </svg>
170
+ </button>
171
+ `
172
+ : nothing}
173
+ </div>
174
+ `;
175
+ }
176
+ }
177
+
178
+ customElements.define('bds-notification-banner', BdsNotificationBanner);
179
+
180
+ declare global {
181
+ interface HTMLElementTagNameMap {
182
+ 'bds-notification-banner': BdsNotificationBanner;
183
+ }
184
+ }
@@ -0,0 +1,58 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsProgressCircle } from './bds-progress-circle';
3
+
4
+ describe('bds-progress-circle', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-progress-circle')).toBe(BdsProgressCircle);
7
+ });
8
+
9
+ it('defaults to max=100 and size="medium"', async () => {
10
+ const el = await fixture('<bds-progress-circle value="50" label="Loading"></bds-progress-circle>') as BdsProgressCircle;
11
+ expect(el.max).toBe(100);
12
+ expect(el.getAttribute('size')).toBe('medium');
13
+ cleanup(el);
14
+ });
15
+
16
+ it('renders a progressbar wrapper in shadow DOM', async () => {
17
+ const el = await fixture('<bds-progress-circle value="50" label="Loading"></bds-progress-circle>');
18
+ const wrapper = el.shadowRoot!.querySelector('[role="progressbar"]');
19
+ expect(wrapper).not.toBeNull();
20
+ cleanup(el);
21
+ });
22
+
23
+ it('sets aria-label and aria-valuenow', async () => {
24
+ const el = await fixture('<bds-progress-circle value="75" label="Upload"></bds-progress-circle>');
25
+ const wrapper = el.shadowRoot!.querySelector('[role="progressbar"]');
26
+ expect(wrapper!.getAttribute('aria-label')).toBe('Upload');
27
+ expect(wrapper!.getAttribute('aria-valuenow')).toBe('75');
28
+ cleanup(el);
29
+ });
30
+
31
+ it('renders two SVG circles (track and fill)', async () => {
32
+ const el = await fixture('<bds-progress-circle value="50" label="Loading"></bds-progress-circle>');
33
+ const circles = el.shadowRoot!.querySelectorAll('circle');
34
+ expect(circles.length).toBe(2);
35
+ cleanup(el);
36
+ });
37
+
38
+ it('does not render the value text by default', async () => {
39
+ const el = await fixture('<bds-progress-circle value="50" label="Loading"></bds-progress-circle>');
40
+ expect(el.shadowRoot!.querySelector('.value')).toBeNull();
41
+ cleanup(el);
42
+ });
43
+
44
+ it('renders percentage text when show-value is set', async () => {
45
+ const el = await fixture('<bds-progress-circle value="75" label="Loading" show-value></bds-progress-circle>');
46
+ const value = el.shadowRoot!.querySelector('.value');
47
+ expect(value).not.toBeNull();
48
+ expect(value!.textContent).toBe('75%');
49
+ cleanup(el);
50
+ });
51
+
52
+ it('SVG has aria-hidden="true"', async () => {
53
+ const el = await fixture('<bds-progress-circle value="50" label="Loading"></bds-progress-circle>');
54
+ const svg = el.shadowRoot!.querySelector('svg');
55
+ expect(svg!.getAttribute('aria-hidden')).toBe('true');
56
+ cleanup(el);
57
+ });
58
+ });
@@ -0,0 +1,142 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+
3
+ const SIZE_PX = { small: 40, medium: 64, large: 96 } as const;
4
+ const STROKE_WIDTH = 4;
5
+
6
+ /**
7
+ * `<bds-progress-circle>` — framework-agnostic circular Progress custom element.
8
+ *
9
+ * Attributes:
10
+ * value — current progress value (required)
11
+ * max — maximum value (default: 100)
12
+ * label — accessible label for the progress bar
13
+ * show-value — boolean; when set, displays the percentage in the centre
14
+ * size — "small" | "medium" (default) | "large"
15
+ *
16
+ * @example
17
+ * <bds-progress-circle value="75" label="Loading" show-value></bds-progress-circle>
18
+ */
19
+ export class BdsProgressCircle extends LitElement {
20
+ static styles = css`
21
+ :host {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ position: relative;
26
+ }
27
+
28
+ .svg {
29
+ display: block;
30
+ }
31
+
32
+ .track {
33
+ stroke: var(--bds-color_bg--subtle);
34
+ }
35
+
36
+ .fill {
37
+ stroke: var(--progressCircle_color-active, var(--bdc-color_active));
38
+ transition: stroke-dashoffset var(--bds-animation_transition-duration) var(--bds-animation_easing);
39
+ }
40
+
41
+ .value {
42
+ position: absolute;
43
+ font-size: var(--bds-font_size--body--s);
44
+ font-weight: var(--bds-font_weight--semibold);
45
+ font-variant-numeric: tabular-nums;
46
+ color: var(--bds-color_on-bg);
47
+ line-height: 1;
48
+ }
49
+
50
+ :host([size='small']) .value { font-size: 0.5rem; }
51
+ :host([size='large']) .value { font-size: var(--bds-font_size--body); }
52
+
53
+ @media (prefers-reduced-motion: reduce) {
54
+ .fill {
55
+ transition: none;
56
+ }
57
+ }
58
+ `;
59
+
60
+ static properties = {
61
+ value: { type: Number },
62
+ max: { type: Number },
63
+ label: { type: String },
64
+ showValue: { type: Boolean, attribute: 'show-value', reflect: true },
65
+ size: { type: String, reflect: true },
66
+ };
67
+
68
+ declare value: number;
69
+ declare max: number;
70
+ declare label: string;
71
+ declare showValue: boolean;
72
+ declare size: 'small' | 'medium' | 'large';
73
+
74
+ constructor() {
75
+ super();
76
+ this.value = 0;
77
+ this.max = 100;
78
+ this.label = '';
79
+ this.showValue = false;
80
+ this.size = 'medium';
81
+ }
82
+
83
+ render() {
84
+ const percentage = Math.min(100, Math.max(0, (this.value / this.max) * 100));
85
+ const px = SIZE_PX[this.size] ?? SIZE_PX.medium;
86
+ const radius = (px - STROKE_WIDTH * 2) / 2;
87
+ const circumference = 2 * Math.PI * radius;
88
+ const offset = circumference - (percentage / 100) * circumference;
89
+ const cx = px / 2;
90
+
91
+ return html`
92
+ <div
93
+ role="progressbar"
94
+ aria-label=${this.label}
95
+ aria-valuenow=${this.value}
96
+ aria-valuemin="0"
97
+ aria-valuemax=${this.max}
98
+ style="position: relative; display: inline-flex; align-items: center; justify-content: center;"
99
+ >
100
+ <svg
101
+ class="svg"
102
+ width=${px}
103
+ height=${px}
104
+ viewBox="0 0 ${px} ${px}"
105
+ aria-hidden="true"
106
+ >
107
+ <circle
108
+ class="track"
109
+ cx=${cx}
110
+ cy=${cx}
111
+ r=${radius}
112
+ stroke-width=${STROKE_WIDTH}
113
+ fill="none"
114
+ />
115
+ <circle
116
+ class="fill"
117
+ cx=${cx}
118
+ cy=${cx}
119
+ r=${radius}
120
+ stroke-width=${STROKE_WIDTH}
121
+ fill="none"
122
+ stroke-dasharray=${circumference}
123
+ stroke-dashoffset=${offset}
124
+ stroke-linecap="round"
125
+ transform="rotate(-90 ${cx} ${cx})"
126
+ />
127
+ </svg>
128
+ ${this.showValue
129
+ ? html`<span class="value" aria-hidden="true">${Math.round(percentage)}%</span>`
130
+ : nothing}
131
+ </div>
132
+ `;
133
+ }
134
+ }
135
+
136
+ customElements.define('bds-progress-circle', BdsProgressCircle);
137
+
138
+ declare global {
139
+ interface HTMLElementTagNameMap {
140
+ 'bds-progress-circle': BdsProgressCircle;
141
+ }
142
+ }
@@ -0,0 +1,66 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsProgress } from './bds-progress';
3
+
4
+ describe('bds-progress', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-progress')).toBe(BdsProgress);
7
+ });
8
+
9
+ it('defaults to max=100 and size="medium"', async () => {
10
+ const el = await fixture('<bds-progress value="50" label="Loading"></bds-progress>') as BdsProgress;
11
+ expect(el.max).toBe(100);
12
+ expect(el.getAttribute('size')).toBe('medium');
13
+ cleanup(el);
14
+ });
15
+
16
+ it('renders a progressbar track in shadow DOM', async () => {
17
+ const el = await fixture('<bds-progress value="50" label="Loading"></bds-progress>');
18
+ const track = el.shadowRoot!.querySelector('.track');
19
+ expect(track).not.toBeNull();
20
+ expect(track!.getAttribute('role')).toBe('progressbar');
21
+ cleanup(el);
22
+ });
23
+
24
+ it('sets aria-label, aria-valuenow, aria-valuemax on the track', async () => {
25
+ const el = await fixture('<bds-progress value="60" max="200" label="Upload"></bds-progress>');
26
+ const track = el.shadowRoot!.querySelector('.track');
27
+ expect(track!.getAttribute('aria-label')).toBe('Upload');
28
+ expect(track!.getAttribute('aria-valuenow')).toBe('60');
29
+ expect(track!.getAttribute('aria-valuemax')).toBe('200');
30
+ cleanup(el);
31
+ });
32
+
33
+ it('does not render the label row by default', async () => {
34
+ const el = await fixture('<bds-progress value="50" label="Loading"></bds-progress>');
35
+ expect(el.shadowRoot!.querySelector('.label-row')).toBeNull();
36
+ cleanup(el);
37
+ });
38
+
39
+ it('renders label row when show-label is set', async () => {
40
+ const el = await fixture('<bds-progress value="50" label="Upload" show-label></bds-progress>');
41
+ const labelRow = el.shadowRoot!.querySelector('.label-row');
42
+ expect(labelRow).not.toBeNull();
43
+ expect(labelRow!.querySelector('.label')!.textContent).toBe('Upload');
44
+ cleanup(el);
45
+ });
46
+
47
+ it('clamps percentage to 100 for value > max', async () => {
48
+ const el = await fixture('<bds-progress value="150" label="Done" show-label></bds-progress>');
49
+ const valueSpan = el.shadowRoot!.querySelector('.value');
50
+ expect(valueSpan!.textContent).toBe('100%');
51
+ cleanup(el);
52
+ });
53
+
54
+ it('clamps percentage to 0 for negative value', async () => {
55
+ const el = await fixture('<bds-progress value="-10" label="Done" show-label></bds-progress>');
56
+ const valueSpan = el.shadowRoot!.querySelector('.value');
57
+ expect(valueSpan!.textContent).toBe('0%');
58
+ cleanup(el);
59
+ });
60
+
61
+ it('reflects size attribute', async () => {
62
+ const el = await fixture('<bds-progress value="50" label="Loading" size="large"></bds-progress>') as BdsProgress;
63
+ expect(el.getAttribute('size')).toBe('large');
64
+ cleanup(el);
65
+ });
66
+ });
@@ -0,0 +1,127 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+
3
+ /**
4
+ * `<bds-progress>` — framework-agnostic Progress bar custom element.
5
+ *
6
+ * Attributes:
7
+ * value — current progress value (required)
8
+ * max — maximum value (default: 100)
9
+ * label — accessible label for the progress bar
10
+ * show-label — boolean; when set, displays the label and percentage above the bar
11
+ * size — "small" | "medium" (default) | "large"
12
+ *
13
+ * @example
14
+ * <bds-progress value="60" label="Upload progress" show-label></bds-progress>
15
+ */
16
+ export class BdsProgress extends LitElement {
17
+ static styles = css`
18
+ :host {
19
+ display: block;
20
+ }
21
+
22
+ .container {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: var(--bds-space_xxs);
26
+ inline-size: 100%;
27
+ }
28
+
29
+ .label-row {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ align-items: baseline;
33
+ font-size: var(--bds-font_size--body--s);
34
+ color: var(--bds-color_on-bg);
35
+ }
36
+
37
+ .value {
38
+ font-variant-numeric: tabular-nums;
39
+ }
40
+
41
+ .track {
42
+ inline-size: 100%;
43
+ block-size: var(--progress_height, var(--bds-space_xs));
44
+ background-color: var(--bds-color_bg--subtle);
45
+ border-radius: 999px;
46
+ overflow: hidden;
47
+ }
48
+
49
+ :host([size='small']) .track { --progress_height: var(--bds-space_xxs); }
50
+ :host([size='medium']) .track { --progress_height: var(--bds-space_xs); }
51
+ :host([size='large']) .track { --progress_height: var(--bds-space_s); }
52
+
53
+ .fill {
54
+ block-size: 100%;
55
+ background-color: var(--progress_color-active, var(--bdc-color_active));
56
+ border-radius: 999px;
57
+ transition: inline-size var(--bds-animation_transition-duration) var(--bds-animation_easing);
58
+ }
59
+
60
+ @media (prefers-reduced-motion: reduce) {
61
+ .fill {
62
+ transition: none;
63
+ }
64
+ }
65
+ `;
66
+
67
+ static properties = {
68
+ value: { type: Number },
69
+ max: { type: Number },
70
+ label: { type: String },
71
+ showLabel: { type: Boolean, attribute: 'show-label', reflect: true },
72
+ size: { type: String, reflect: true },
73
+ };
74
+
75
+ declare value: number;
76
+ declare max: number;
77
+ declare label: string;
78
+ declare showLabel: boolean;
79
+ declare size: 'small' | 'medium' | 'large';
80
+
81
+ constructor() {
82
+ super();
83
+ this.value = 0;
84
+ this.max = 100;
85
+ this.label = '';
86
+ this.showLabel = false;
87
+ this.size = 'medium';
88
+ }
89
+
90
+ private get _percentage(): number {
91
+ return Math.min(100, Math.max(0, (this.value / this.max) * 100));
92
+ }
93
+
94
+ render() {
95
+ const pct = this._percentage;
96
+ return html`
97
+ <div class="container">
98
+ ${this.showLabel
99
+ ? html`
100
+ <div class="label-row">
101
+ <span class="label">${this.label}</span>
102
+ <span class="value">${Math.round(pct)}%</span>
103
+ </div>
104
+ `
105
+ : nothing}
106
+ <div
107
+ class="track"
108
+ role="progressbar"
109
+ aria-label=${this.label}
110
+ aria-valuenow=${this.value}
111
+ aria-valuemin="0"
112
+ aria-valuemax=${this.max}
113
+ >
114
+ <div class="fill" style="inline-size: ${pct}%"></div>
115
+ </div>
116
+ </div>
117
+ `;
118
+ }
119
+ }
120
+
121
+ customElements.define('bds-progress', BdsProgress);
122
+
123
+ declare global {
124
+ interface HTMLElementTagNameMap {
125
+ 'bds-progress': BdsProgress;
126
+ }
127
+ }