@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,154 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+
3
+ export type CardVariant = 'default' | 'elevated' | 'outlined';
4
+ export type CardPadding = 'none' | 'small' | 'medium' | 'large';
5
+ export type CardTextAlign = 'start' | 'center' | 'end';
6
+
7
+ /**
8
+ * `<bds-card>` — framework-agnostic Card layout custom element.
9
+ *
10
+ * Attributes:
11
+ * variant — "default" (default) | "elevated" | "outlined"
12
+ * padding — "none" | "small" | "medium" (default) | "large"
13
+ * text-align — "start" (default) | "center" | "end"
14
+ * clickable — boolean; renders as a <button> with hover/active effects
15
+ * aria-label — accessible label (useful when clickable)
16
+ *
17
+ * Slots:
18
+ * (default) — card content
19
+ *
20
+ * Events:
21
+ * bds-click — fired (bubbles, composed) when the card button is clicked
22
+ *
23
+ * @example
24
+ * <bds-card variant="elevated" padding="large">
25
+ * <p>Card content</p>
26
+ * </bds-card>
27
+ *
28
+ * <bds-card clickable aria-label="Open details">
29
+ * <p>Clickable card</p>
30
+ * </bds-card>
31
+ */
32
+ export class BdsCard extends LitElement {
33
+ static styles = css`
34
+ :host {
35
+ display: block;
36
+ }
37
+
38
+ .card {
39
+ background-color: var(--card_color, var(--bds-color_bg));
40
+ color: var(--card_on-color, var(--bds-color_on-bg));
41
+ border-radius: var(--bds-border_radius--m);
42
+ transition: all 0.3s ease;
43
+ position: relative;
44
+ box-sizing: border-box;
45
+ inline-size: 100%;
46
+ text-align: inherit;
47
+ font: inherit;
48
+ border: none;
49
+ }
50
+
51
+ .card.--default { box-shadow: var(--bds-shadow_s); }
52
+ .card.--elevated { box-shadow: var(--bds-shadow_m); }
53
+
54
+ .card.--outlined {
55
+ --bdc_color: currentcolor;
56
+ box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--bds-shadow_s);
57
+ }
58
+
59
+ .card.--padding-none { padding: 0; }
60
+ .card.--padding-small { padding: var(--bds-space_s); }
61
+ .card.--padding-medium { padding: var(--bds-space_m); }
62
+ .card.--padding-large { padding: var(--bds-space_l); }
63
+
64
+ .card.--text-start { text-align: start; }
65
+ .card.--text-center { text-align: center; }
66
+ .card.--text-end { text-align: end; }
67
+
68
+ .card.--clickable {
69
+ cursor: pointer;
70
+ display: block;
71
+ }
72
+
73
+ .card.--clickable:focus-visible {
74
+ outline: 2px solid var(--color_focus, currentcolor);
75
+ outline-offset: 2px;
76
+ }
77
+
78
+ .card.--clickable:active {
79
+ transform: translateY(0);
80
+ box-shadow: var(--bds-shadow_s);
81
+ }
82
+
83
+ @media (hover: hover) and (pointer: fine) {
84
+ .card.--clickable:hover {
85
+ transform: translateY(-2px);
86
+ box-shadow: var(--bds-shadow_xl);
87
+ }
88
+
89
+ .card.--default:hover { box-shadow: var(--bds-shadow_m); }
90
+ .card.--elevated:hover { box-shadow: var(--bds-shadow_2xl); }
91
+ .card.--outlined:hover { box-shadow: var(--bds-shadow_s); }
92
+ }
93
+ `;
94
+
95
+ static properties = {
96
+ variant: { type: String, reflect: true },
97
+ padding: { type: String, reflect: true },
98
+ textAlign: { type: String, attribute: 'text-align', reflect: true },
99
+ clickable: { type: Boolean, reflect: true },
100
+ ariaLabel: { type: String, attribute: 'aria-label' },
101
+ };
102
+
103
+ declare variant: CardVariant;
104
+ declare padding: CardPadding;
105
+ declare textAlign: CardTextAlign;
106
+ declare clickable: boolean;
107
+ declare ariaLabel: string;
108
+
109
+ constructor() {
110
+ super();
111
+ this.variant = 'default';
112
+ this.padding = 'medium';
113
+ this.textAlign = 'start';
114
+ this.clickable = false;
115
+ this.ariaLabel = '';
116
+ }
117
+
118
+ private _handleClick() {
119
+ this.dispatchEvent(new CustomEvent('bds-click', { bubbles: true, composed: true }));
120
+ }
121
+
122
+ render() {
123
+ const classes = [
124
+ 'card',
125
+ `--${this.variant}`,
126
+ `--padding-${this.padding}`,
127
+ `--text-${this.textAlign}`,
128
+ this.clickable ? '--clickable' : '',
129
+ ].filter(Boolean).join(' ');
130
+
131
+ if (this.clickable) {
132
+ return html`
133
+ <button
134
+ type="button"
135
+ class=${classes}
136
+ @click=${this._handleClick}
137
+ aria-label=${this.ariaLabel || nothing}
138
+ >
139
+ <slot></slot>
140
+ </button>
141
+ `;
142
+ }
143
+
144
+ return html`<div class=${classes}><slot></slot></div>`;
145
+ }
146
+ }
147
+
148
+ customElements.define('bds-card', BdsCard);
149
+
150
+ declare global {
151
+ interface HTMLElementTagNameMap {
152
+ 'bds-card': BdsCard;
153
+ }
154
+ }
@@ -0,0 +1,36 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsDescriptionList } from './bds-description-list';
3
+
4
+ describe('bds-description-list', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-description-list')).toBe(BdsDescriptionList);
7
+ });
8
+
9
+ it('defaults to layout="stacked"', async () => {
10
+ const el = await fixture('<bds-description-list></bds-description-list>');
11
+ expect(el.getAttribute('layout')).toBe('stacked');
12
+ cleanup(el);
13
+ });
14
+
15
+ it('renders a <dl> in shadow DOM', async () => {
16
+ const el = await fixture('<bds-description-list></bds-description-list>');
17
+ expect(el.shadowRoot!.querySelector('dl')).not.toBeNull();
18
+ cleanup(el);
19
+ });
20
+
21
+ it('accepts slotted <dt> and <dd> elements', async () => {
22
+ const el = await fixture('<bds-description-list><dt>Name</dt><dd>Jane</dd></bds-description-list>');
23
+ expect(el.querySelector('dt')!.textContent).toBe('Name');
24
+ expect(el.querySelector('dd')!.textContent).toBe('Jane');
25
+ cleanup(el);
26
+ });
27
+
28
+ it('reflects layout attribute', async () => {
29
+ const el = await fixture('<bds-description-list layout="inline"></bds-description-list>') as BdsDescriptionList;
30
+ expect(el.getAttribute('layout')).toBe('inline');
31
+ el.layout = 'stacked';
32
+ await el.updateComplete;
33
+ expect(el.getAttribute('layout')).toBe('stacked');
34
+ cleanup(el);
35
+ });
36
+ });
@@ -0,0 +1,79 @@
1
+ import { LitElement, css, html } from 'lit';
2
+
3
+ /**
4
+ * `<bds-description-list>` — framework-agnostic Description List custom element.
5
+ *
6
+ * Renders a `<dl>` styled list. Consumers provide `<dt>` and `<dd>` elements
7
+ * as slotted children; this component handles layout and styling.
8
+ *
9
+ * Attributes:
10
+ * layout — "stacked" (default) | "inline"
11
+ *
12
+ * Slots:
13
+ * (default) — `<dt>` and `<dd>` pairs
14
+ *
15
+ * @example
16
+ * <bds-description-list layout="inline">
17
+ * <dt>Name</dt>
18
+ * <dd>Jane Doe</dd>
19
+ * <dt>Email</dt>
20
+ * <dd>jane@example.com</dd>
21
+ * </bds-description-list>
22
+ */
23
+ export class BdsDescriptionList extends LitElement {
24
+ static styles = css`
25
+ :host {
26
+ display: block;
27
+ }
28
+
29
+ .list {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: var(--bds-space_s);
33
+ margin: 0;
34
+ padding: 0;
35
+ font-size: var(--bds-font_size--body);
36
+ color: var(--bds-color_on-bg);
37
+ }
38
+
39
+ /* Style slotted dt/dd elements */
40
+ ::slotted(dt) {
41
+ font-weight: var(--bds-font_weight--semibold);
42
+ color: var(--bds-color_on-bg);
43
+ margin: 0;
44
+ }
45
+
46
+ ::slotted(dd) {
47
+ margin: 0;
48
+ color: var(--bds-color_on-bg);
49
+ }
50
+
51
+ /* Inline layout: pair each dt/dd side by side */
52
+ :host([layout='inline']) .list {
53
+ gap: var(--bds-space_xs);
54
+ }
55
+ `;
56
+
57
+ static properties = {
58
+ layout: { type: String, reflect: true },
59
+ };
60
+
61
+ declare layout: 'stacked' | 'inline';
62
+
63
+ constructor() {
64
+ super();
65
+ this.layout = 'stacked';
66
+ }
67
+
68
+ render() {
69
+ return html`<dl class="list"><slot></slot></dl>`;
70
+ }
71
+ }
72
+
73
+ customElements.define('bds-description-list', BdsDescriptionList);
74
+
75
+ declare global {
76
+ interface HTMLElementTagNameMap {
77
+ 'bds-description-list': BdsDescriptionList;
78
+ }
79
+ }
@@ -0,0 +1,21 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsIconWrapper } from './bds-icon-wrapper';
3
+
4
+ describe('bds-icon-wrapper', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-icon-wrapper')).toBe(BdsIconWrapper);
7
+ });
8
+
9
+ it('renders a wrapper div in shadow DOM', async () => {
10
+ const el = await fixture('<bds-icon-wrapper></bds-icon-wrapper>');
11
+ expect(el.shadowRoot!.querySelector('.wrapper')).not.toBeNull();
12
+ cleanup(el);
13
+ });
14
+
15
+ it('renders slotted content', async () => {
16
+ const el = await fixture('<bds-icon-wrapper><svg aria-hidden="true"></svg></bds-icon-wrapper>');
17
+ const svg = el.querySelector('svg');
18
+ expect(svg).not.toBeNull();
19
+ cleanup(el);
20
+ });
21
+ });
@@ -0,0 +1,68 @@
1
+ import { LitElement, css, html } from 'lit';
2
+
3
+ /**
4
+ * `<bds-icon-wrapper>` — framework-agnostic Icon Wrapper custom element.
5
+ *
6
+ * Displays an icon inside a circular container with background and foreground theming.
7
+ *
8
+ * Attributes:
9
+ * aria-hidden — boolean attribute; set to "true" for decorative icons
10
+ *
11
+ * Slots:
12
+ * (default) — icon content (SVG or img)
13
+ *
14
+ * @example
15
+ * <bds-icon-wrapper aria-hidden="true">
16
+ * <svg>…</svg>
17
+ * </bds-icon-wrapper>
18
+ */
19
+ export class BdsIconWrapper extends LitElement {
20
+ static styles = css`
21
+ :host {
22
+ display: inline-flex;
23
+ }
24
+
25
+ .wrapper {
26
+ inline-size: 2em;
27
+ block-size: 2em;
28
+ font-size: 3em;
29
+ border-radius: 50%;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ 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));
37
+ position: relative;
38
+ transition: var(--bds-animation_transition);
39
+ }
40
+
41
+ .wrapper svg {
42
+ fill: currentcolor;
43
+ }
44
+ `;
45
+
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
+ render() {
58
+ return html`<div class="wrapper"><slot></slot></div>`;
59
+ }
60
+ }
61
+
62
+ customElements.define('bds-icon-wrapper', BdsIconWrapper);
63
+
64
+ declare global {
65
+ interface HTMLElementTagNameMap {
66
+ 'bds-icon-wrapper': BdsIconWrapper;
67
+ }
68
+ }
@@ -0,0 +1,72 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsLink } from './bds-link';
3
+
4
+ describe('bds-link', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-link')).toBe(BdsLink);
7
+ });
8
+
9
+ it('defaults to variant="default"', async () => {
10
+ const el = await fixture('<bds-link href="/test">Link</bds-link>');
11
+ expect(el.getAttribute('variant')).toBe('default');
12
+ cleanup(el);
13
+ });
14
+
15
+ it('renders an <a> with the given href', async () => {
16
+ const el = await fixture('<bds-link href="/about">About</bds-link>');
17
+ const a = el.shadowRoot!.querySelector('a');
18
+ expect(a).not.toBeNull();
19
+ expect(a!.getAttribute('href')).toBe('/about');
20
+ cleanup(el);
21
+ });
22
+
23
+ it('renders slotted content', async () => {
24
+ const el = await fixture('<bds-link href="/">Home</bds-link>');
25
+ expect(el.textContent?.trim()).toBe('Home');
26
+ cleanup(el);
27
+ });
28
+
29
+ it('adds target="_blank" and rel="noreferrer noopener" when external is set', async () => {
30
+ const el = await fixture('<bds-link href="https://example.com" external>Visit</bds-link>');
31
+ const a = el.shadowRoot!.querySelector('a');
32
+ expect(a!.getAttribute('target')).toBe('_blank');
33
+ expect(a!.getAttribute('rel')).toBe('noreferrer noopener');
34
+ cleanup(el);
35
+ });
36
+
37
+ it('renders visually hidden external label when external is set', async () => {
38
+ const el = await fixture('<bds-link href="https://example.com" external>Visit</bds-link>');
39
+ const label = el.shadowRoot!.querySelector('.external-label');
40
+ expect(label).not.toBeNull();
41
+ expect(label!.textContent).toBe('(opens in new tab)');
42
+ cleanup(el);
43
+ });
44
+
45
+ it('uses custom external-label when provided', async () => {
46
+ const el = await fixture('<bds-link href="https://example.com" external external-label="(new window)">Visit</bds-link>');
47
+ const label = el.shadowRoot!.querySelector('.external-label');
48
+ expect(label!.textContent).toBe('(new window)');
49
+ cleanup(el);
50
+ });
51
+
52
+ it('does not render external label when external is not set', async () => {
53
+ const el = await fixture('<bds-link href="/about">About</bds-link>');
54
+ expect(el.shadowRoot!.querySelector('.external-label')).toBeNull();
55
+ cleanup(el);
56
+ });
57
+
58
+ it('applies variant class to the anchor', async () => {
59
+ const el = await fixture('<bds-link href="/test" variant="subtle">Link</bds-link>');
60
+ const a = el.shadowRoot!.querySelector('a');
61
+ expect(a!.classList.contains('--variant_subtle')).toBe(true);
62
+ cleanup(el);
63
+ });
64
+
65
+ it('reflects variant property updates', async () => {
66
+ const el = await fixture('<bds-link href="/test">Link</bds-link>') as BdsLink;
67
+ el.variant = 'standalone';
68
+ await el.updateComplete;
69
+ expect(el.getAttribute('variant')).toBe('standalone');
70
+ cleanup(el);
71
+ });
72
+ });
@@ -0,0 +1,138 @@
1
+ import { LitElement, css, html, nothing } from 'lit';
2
+
3
+ export type LinkVariant = 'default' | 'subtle' | 'standalone';
4
+
5
+ /**
6
+ * `<bds-link>` — framework-agnostic Link custom element.
7
+ *
8
+ * Attributes:
9
+ * href — URL for the anchor
10
+ * target — link target (e.g. "_blank")
11
+ * variant — "default" (default) | "subtle" | "standalone"
12
+ * external — boolean; when set, adds rel="noreferrer noopener" and a
13
+ * visually-hidden label for screen readers
14
+ * external-label — the screen reader text appended for external links
15
+ * (default: "(opens in new tab)")
16
+ *
17
+ * Slots:
18
+ * (default) — link text / content
19
+ *
20
+ * @example
21
+ * <bds-link href="https://example.com" external>Visit site</bds-link>
22
+ */
23
+ export class BdsLink extends LitElement {
24
+ static styles = css`
25
+ :host {
26
+ display: inline;
27
+ }
28
+
29
+ .link {
30
+ color: var(--link_color, var(--bds-color_interactive_on-bg));
31
+ text-decoration: underline;
32
+ text-underline-offset: 0.2em;
33
+ transition: var(--bds-animation_transition);
34
+ cursor: pointer;
35
+ }
36
+
37
+ .link:focus-visible {
38
+ outline: var(--bds-outline_default);
39
+ outline-offset: var(--bds-outline_offset);
40
+ border-radius: var(--bds-border_radius--xs);
41
+ }
42
+
43
+ @media (hover: hover) and (pointer: fine) {
44
+ .link:hover {
45
+ --link_color: var(--link_color-hover, var(--bds-color_blue--strong));
46
+ }
47
+ }
48
+
49
+ .link.--variant_default {
50
+ --link_color: var(--bds-color_interactive_on-bg);
51
+ --link_color-hover: var(--bds-color_blue--strong);
52
+ }
53
+
54
+ .link.--variant_subtle {
55
+ --link_color: var(--bds-color_on-bg);
56
+ --link_color-hover: var(--bds-color_interactive_on-bg);
57
+ }
58
+
59
+ .link.--variant_standalone {
60
+ --link_color: var(--bds-color_interactive_on-bg);
61
+ --link_color-hover: var(--bds-color_blue--strong);
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: var(--bds-space_xxs);
65
+ font-weight: var(--bds-font_weight--semibold);
66
+ text-decoration: none;
67
+ }
68
+
69
+ @media (hover: hover) and (pointer: fine) {
70
+ .link.--variant_standalone:hover {
71
+ text-decoration: underline;
72
+ text-underline-offset: 0.2em;
73
+ }
74
+ }
75
+
76
+ .external-label {
77
+ position: absolute;
78
+ inline-size: 1px;
79
+ block-size: 1px;
80
+ padding: 0;
81
+ margin: -1px;
82
+ overflow: hidden;
83
+ clip: rect(0, 0, 0, 0);
84
+ white-space: nowrap;
85
+ border-width: 0;
86
+ }
87
+ `;
88
+
89
+ static properties = {
90
+ href: { type: String },
91
+ target: { type: String },
92
+ variant: { type: String, reflect: true },
93
+ external: { type: Boolean, reflect: true },
94
+ externalLabel: { type: String, attribute: 'external-label' },
95
+ };
96
+
97
+ declare href: string;
98
+ declare target: string;
99
+ declare variant: LinkVariant;
100
+ declare external: boolean;
101
+ declare externalLabel: string;
102
+
103
+ constructor() {
104
+ super();
105
+ this.href = '';
106
+ this.target = '';
107
+ this.variant = 'default';
108
+ this.external = false;
109
+ this.externalLabel = '(opens in new tab)';
110
+ }
111
+
112
+ render() {
113
+ const rel = this.external ? 'noreferrer noopener' : nothing;
114
+ const target = this.external ? '_blank' : (this.target || nothing);
115
+
116
+ return html`
117
+ <a
118
+ class="link --variant_${this.variant}"
119
+ href=${this.href || nothing}
120
+ target=${target}
121
+ rel=${rel}
122
+ >
123
+ <slot></slot>
124
+ ${this.external
125
+ ? html`<span class="external-label">${this.externalLabel}</span>`
126
+ : nothing}
127
+ </a>
128
+ `;
129
+ }
130
+ }
131
+
132
+ customElements.define('bds-link', BdsLink);
133
+
134
+ declare global {
135
+ interface HTMLElementTagNameMap {
136
+ 'bds-link': BdsLink;
137
+ }
138
+ }
@@ -0,0 +1,38 @@
1
+ import { fixture, cleanup } from '../test/helpers';
2
+ import { BdsLoading } from './bds-loading';
3
+
4
+ describe('bds-loading', () => {
5
+ it('is registered as a custom element', () => {
6
+ expect(customElements.get('bds-loading')).toBe(BdsLoading);
7
+ });
8
+
9
+ it('defaults to size="medium"', async () => {
10
+ const el = await fixture('<bds-loading></bds-loading>');
11
+ expect(el.getAttribute('size')).toBe('medium');
12
+ cleanup(el);
13
+ });
14
+
15
+ it('renders a spinner in shadow DOM', async () => {
16
+ const el = await fixture('<bds-loading></bds-loading>');
17
+ const spinner = el.shadowRoot!.querySelector('.spinner');
18
+ expect(spinner).not.toBeNull();
19
+ cleanup(el);
20
+ });
21
+
22
+ it('spinner has role="status" and aria-label="Loading"', async () => {
23
+ const el = await fixture('<bds-loading></bds-loading>');
24
+ const spinner = el.shadowRoot!.querySelector('.spinner');
25
+ expect(spinner!.getAttribute('role')).toBe('status');
26
+ expect(spinner!.getAttribute('aria-label')).toBe('Loading');
27
+ cleanup(el);
28
+ });
29
+
30
+ it('reflects size attribute', async () => {
31
+ const el = await fixture('<bds-loading size="large"></bds-loading>') as BdsLoading;
32
+ expect(el.size).toBe('large');
33
+ el.size = 'small';
34
+ await el.updateComplete;
35
+ expect(el.getAttribute('size')).toBe('small');
36
+ cleanup(el);
37
+ });
38
+ });
@@ -0,0 +1,76 @@
1
+ import { LitElement, css, html } from 'lit';
2
+
3
+ /**
4
+ * `<bds-loading>` — framework-agnostic Loading spinner custom element.
5
+ *
6
+ * Attributes:
7
+ * size — "small" | "medium" (default) | "large"
8
+ *
9
+ * @example
10
+ * <bds-loading></bds-loading>
11
+ * <bds-loading size="large"></bds-loading>
12
+ */
13
+ export class BdsLoading extends LitElement {
14
+ static styles = css`
15
+ :host {
16
+ display: flex;
17
+ justify-content: center;
18
+ align-items: center;
19
+ }
20
+
21
+ .spinner {
22
+ inline-size: 2.5em;
23
+ block-size: 2.5em;
24
+ border: 4px solid var(--bds-color_bg);
25
+ border-block-start: 4px solid var(--bds-color_interactive);
26
+ border-radius: 50%;
27
+ animation: spin 1s linear infinite;
28
+ }
29
+
30
+ :host([size='small']) .spinner {
31
+ inline-size: 1.5em;
32
+ block-size: 1.5em;
33
+ border-width: 2px;
34
+ }
35
+
36
+ :host([size='large']) .spinner {
37
+ inline-size: 4em;
38
+ block-size: 4em;
39
+ border-width: 6px;
40
+ }
41
+
42
+ @keyframes spin {
43
+ 0% { transform: rotate(0deg); }
44
+ 100% { transform: rotate(360deg); }
45
+ }
46
+
47
+ @media (prefers-reduced-motion: reduce) {
48
+ .spinner {
49
+ animation: none;
50
+ }
51
+ }
52
+ `;
53
+
54
+ static properties = {
55
+ size: { type: String, reflect: true },
56
+ };
57
+
58
+ declare size: 'small' | 'medium' | 'large';
59
+
60
+ constructor() {
61
+ super();
62
+ this.size = 'medium';
63
+ }
64
+
65
+ render() {
66
+ return html`<div class="spinner" role="status" aria-label="Loading"></div>`;
67
+ }
68
+ }
69
+
70
+ customElements.define('bds-loading', BdsLoading);
71
+
72
+ declare global {
73
+ interface HTMLElementTagNameMap {
74
+ 'bds-loading': BdsLoading;
75
+ }
76
+ }