@brandsync/wc 1.5.4 → 1.7.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 (321) hide show
  1. package/custom-elements.json +1122 -98
  2. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  3. package/dist/brandsync-wc/{p-1b16b6e4.entry.js → p-06e9b45d.entry.js} +1 -1
  4. package/dist/brandsync-wc/p-0d86c22d.entry.js +1 -0
  5. package/dist/brandsync-wc/{p-dc974a34.entry.js → p-13e4966c.entry.js} +1 -1
  6. package/dist/brandsync-wc/{p-42f428b0.entry.js → p-18021c05.entry.js} +1 -1
  7. package/dist/brandsync-wc/{p-1d094352.entry.js → p-1c8160c2.entry.js} +1 -1
  8. package/dist/brandsync-wc/{p-692fd5f0.entry.js → p-21c14465.entry.js} +1 -1
  9. package/dist/brandsync-wc/{p-3145cc00.entry.js → p-2700a63e.entry.js} +1 -1
  10. package/dist/brandsync-wc/{p-6acdf2e1.entry.js → p-27100489.entry.js} +1 -1
  11. package/dist/brandsync-wc/{p-a55a3d87.entry.js → p-2d6955d6.entry.js} +1 -1
  12. package/dist/brandsync-wc/{p-46957b76.entry.js → p-309f920e.entry.js} +1 -1
  13. package/dist/brandsync-wc/{p-899d24f8.entry.js → p-30d6a6d0.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-58969b2b.entry.js → p-387ed85f.entry.js} +1 -1
  15. package/dist/brandsync-wc/{p-27741046.entry.js → p-3eab22a5.entry.js} +1 -1
  16. package/dist/brandsync-wc/{p-da6fa359.entry.js → p-4a1a5d6e.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-a77a5438.entry.js → p-4b0938a5.entry.js} +1 -1
  18. package/dist/brandsync-wc/{p-6b62bf53.entry.js → p-4bff9b4b.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-943fc6b9.entry.js → p-5312b6a5.entry.js} +1 -1
  20. package/dist/brandsync-wc/{p-95e0fb92.entry.js → p-538cc08e.entry.js} +1 -1
  21. package/dist/brandsync-wc/p-55e6438c.entry.js +1 -0
  22. package/dist/brandsync-wc/{p-83bda5f1.entry.js → p-600b5434.entry.js} +1 -1
  23. package/dist/brandsync-wc/p-61db6ce2.entry.js +1 -0
  24. package/dist/brandsync-wc/{p-5ea24f7e.entry.js → p-6754dfa9.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-a34c7553.entry.js → p-70e035ed.entry.js} +1 -1
  26. package/dist/brandsync-wc/{p-1bfc80c3.entry.js → p-77433277.entry.js} +1 -1
  27. package/dist/brandsync-wc/{p-906b4faa.entry.js → p-777a9dbf.entry.js} +1 -1
  28. package/dist/brandsync-wc/p-7ed5670e.entry.js +1 -0
  29. package/dist/brandsync-wc/{p-e92f09b3.entry.js → p-80cf96ff.entry.js} +1 -1
  30. package/dist/brandsync-wc/{p-3e4a9f38.entry.js → p-819a3dae.entry.js} +1 -1
  31. package/dist/brandsync-wc/{p-f4cb1337.entry.js → p-85c70f6d.entry.js} +1 -1
  32. package/dist/brandsync-wc/{p-ac2ccc4b.entry.js → p-8b2ab522.entry.js} +1 -1
  33. package/dist/brandsync-wc/{p-76a37a98.entry.js → p-8b57f606.entry.js} +1 -1
  34. package/dist/brandsync-wc/{p-a96ec9a1.entry.js → p-9c1be2a0.entry.js} +1 -1
  35. package/dist/brandsync-wc/{p-CcPfH1dJ.js → p-DuyFft7h.js} +2 -2
  36. package/dist/brandsync-wc/{p-e9a89ea0.entry.js → p-a36a0e6a.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-eb1c98a5.entry.js → p-a96856fd.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-a64b64f8.entry.js → p-b0634051.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-5f233b4e.entry.js → p-b2dc9886.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-c91eb3eb.entry.js → p-bcee3d60.entry.js} +1 -1
  41. package/dist/brandsync-wc/{p-3f6980bf.entry.js → p-be14f99f.entry.js} +1 -1
  42. package/dist/brandsync-wc/{p-cd90ed34.entry.js → p-c197cc95.entry.js} +1 -1
  43. package/dist/brandsync-wc/{p-8f90e906.entry.js → p-c3a28a89.entry.js} +1 -1
  44. package/dist/brandsync-wc/{p-ba650ca9.entry.js → p-cbaa19ab.entry.js} +1 -1
  45. package/dist/brandsync-wc/{p-d1dfd37d.entry.js → p-d03eba2b.entry.js} +1 -1
  46. package/dist/brandsync-wc/{p-f0a6ff05.entry.js → p-d06543a5.entry.js} +1 -1
  47. package/dist/brandsync-wc/{p-dbd49107.entry.js → p-d25b7b74.entry.js} +1 -1
  48. package/dist/brandsync-wc/{p-69c76966.entry.js → p-e1069ba9.entry.js} +1 -1
  49. package/dist/brandsync-wc/p-e427bbda.entry.js +1 -0
  50. package/dist/brandsync-wc/{p-2c2057f5.entry.js → p-e61efe4d.entry.js} +1 -1
  51. package/dist/brandsync-wc/{p-35850bfe.entry.js → p-f14bda01.entry.js} +1 -1
  52. package/dist/brandsync-wc/{p-fd1acc0f.entry.js → p-f243683f.entry.js} +1 -1
  53. package/dist/brandsync-wc/{p-9d5cf289.entry.js → p-f2ce9a1f.entry.js} +1 -1
  54. package/dist/brandsync-wc/{p-b332fe01.entry.js → p-f518f486.entry.js} +1 -1
  55. package/dist/brandsync-wc/{p-b4211012.entry.js → p-f8f03334.entry.js} +1 -1
  56. package/dist/brandsync-wc/{p-6fd1fb04.entry.js → p-fba01c96.entry.js} +1 -1
  57. package/dist/brandsync-wc/{p-d69e5034.entry.js → p-fde5e9f1.entry.js} +1 -1
  58. package/dist/cjs/brandsync-wc.cjs.js +3 -3
  59. package/dist/cjs/bs-accordion.cjs.entry.js +1 -1
  60. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
  61. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  62. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  63. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  64. package/dist/cjs/bs-attachment.cjs.entry.js +1 -1
  65. package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
  66. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  67. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +1 -1
  68. package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
  69. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +2 -2
  70. package/dist/cjs/bs-button-skeleton.cjs.entry.js +2 -2
  71. package/dist/cjs/bs-button.cjs.entry.js +1 -1
  72. package/dist/cjs/bs-card.cjs.entry.js +1 -1
  73. package/dist/cjs/bs-carousel.cjs.entry.js +196 -0
  74. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +2 -2
  75. package/dist/cjs/bs-chatbot-header.cjs.entry.js +2 -2
  76. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +2 -2
  77. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +2 -2
  78. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +2 -2
  79. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +2 -2
  80. package/dist/cjs/bs-checkbox.cjs.entry.js +2 -2
  81. package/dist/cjs/bs-chip-filter.cjs.entry.js +2 -2
  82. package/dist/cjs/bs-chip-informative.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-chip-input.cjs.entry.js +2 -2
  84. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +2 -2
  85. package/dist/cjs/bs-composer.cjs.entry.js +2 -2
  86. package/dist/cjs/bs-data-table.cjs.entry.js +3 -3
  87. package/dist/cjs/bs-dialog.cjs.entry.js +1 -1
  88. package/dist/cjs/bs-file-upload-item.cjs.entry.js +85 -0
  89. package/dist/cjs/bs-file-upload.cjs.entry.js +110 -0
  90. package/dist/cjs/bs-icon-button.cjs.entry.js +2 -2
  91. package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
  92. package/dist/cjs/bs-input.cjs.entry.js +3 -3
  93. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-menu-item.cjs.entry.js +2 -2
  95. package/dist/cjs/bs-menu.cjs.entry.js +2 -2
  96. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
  97. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +2 -2
  98. package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
  99. package/dist/cjs/bs-pagination.cjs.entry.js +2 -2
  100. package/dist/cjs/bs-progress-linear.cjs.entry.js +8 -3
  101. package/dist/cjs/bs-progress.cjs.entry.js +3 -3
  102. package/dist/cjs/bs-radio.cjs.entry.js +2 -2
  103. package/dist/cjs/bs-slider.cjs.entry.js +2 -2
  104. package/dist/cjs/bs-snackbar.cjs.entry.js +2 -2
  105. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  106. package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
  107. package/dist/cjs/bs-stepper.cjs.entry.js +2 -2
  108. package/dist/cjs/bs-switch.cjs.entry.js +2 -2
  109. package/dist/cjs/bs-tab.cjs.entry.js +2 -2
  110. package/dist/cjs/bs-tabs.cjs.entry.js +2 -2
  111. package/dist/cjs/bs-toast.cjs.entry.js +2 -2
  112. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  113. package/dist/cjs/{index-Bj1mNOtg.js → index-D7e6DfLV.js} +24 -27
  114. package/dist/cjs/loader.cjs.js +2 -2
  115. package/dist/collection/collection-manifest.json +4 -1
  116. package/dist/collection/components/bs-accordion/bs-accordion.cmp.test.js +5 -0
  117. package/dist/collection/components/bs-accordion/bs-accordion.js +1 -1
  118. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  119. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  120. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  121. package/dist/collection/components/bs-attachment/bs-attachment.js +1 -1
  122. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  123. package/dist/collection/components/bs-avatar/bs-avatar.js +2 -2
  124. package/dist/collection/components/bs-badge/bs-badge.js +1 -1
  125. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.js +1 -1
  126. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.js +1 -1
  127. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  128. package/dist/collection/components/bs-button/bs-button/bs-button.js +2 -2
  129. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +3 -3
  130. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  131. package/dist/collection/components/bs-card/bs-card.js +1 -1
  132. package/dist/collection/components/bs-carousel/bs-carousel.cmp.test.js +198 -0
  133. package/dist/collection/components/bs-carousel/bs-carousel.css +107 -0
  134. package/dist/collection/components/bs-carousel/bs-carousel.js +531 -0
  135. package/dist/collection/components/bs-carousel/bs-carousel.stories.js +68 -0
  136. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  137. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  138. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  139. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  140. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  141. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +1 -1
  142. package/dist/collection/components/bs-checkbox/bs-checkbox.js +2 -2
  143. package/dist/collection/components/bs-chip/bs-chip-filter/bs-chip-filter.js +2 -2
  144. package/dist/collection/components/bs-chip/bs-chip-informative/bs-chip-informative.js +3 -3
  145. package/dist/collection/components/bs-chip/bs-chip-input/bs-chip-input.js +2 -2
  146. package/dist/collection/components/bs-composer/bs-composer.js +3 -3
  147. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +2 -2
  148. package/dist/collection/components/bs-data-table/bs-data-table.js +6 -6
  149. package/dist/collection/components/bs-dialog/bs-dialog.js +1 -1
  150. package/dist/collection/components/bs-file-upload/bs-file-upload.cmp.test.js +119 -0
  151. package/dist/collection/components/bs-file-upload/bs-file-upload.css +139 -0
  152. package/dist/collection/components/bs-file-upload/bs-file-upload.js +342 -0
  153. package/dist/collection/components/bs-file-upload/bs-file-upload.stories.js +116 -0
  154. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.cmp.test.js +115 -0
  155. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.css +154 -0
  156. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.js +329 -0
  157. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.stories.js +54 -0
  158. package/dist/collection/components/bs-input/bs-input.js +2 -2
  159. package/dist/collection/components/bs-logo/bs-logo.js +2 -2
  160. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  161. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  162. package/dist/collection/components/bs-pagination/bs-pagination.js +1 -1
  163. package/dist/collection/components/bs-progress/bs-progress.js +5 -5
  164. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +29 -4
  165. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  166. package/dist/collection/components/bs-slider/bs-slider.js +2 -2
  167. package/dist/collection/components/bs-snackbar/bs-snackbar.js +2 -2
  168. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  169. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  170. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +3 -3
  171. package/dist/collection/components/bs-switch/bs-switch.js +2 -2
  172. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  173. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +2 -2
  174. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +3 -3
  175. package/dist/collection/components/bs-toast/bs-toast.js +2 -2
  176. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  177. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +1 -1
  178. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  179. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +2 -2
  180. package/dist/collection/test/helpers/conventions.js +46 -0
  181. package/dist/collection/test/helpers/conventions.unit.test.js +38 -0
  182. package/dist/components/bs-accordion.js +1 -1
  183. package/dist/components/bs-ai-disclaimer.js +1 -1
  184. package/dist/components/bs-ai-greeting.js +1 -1
  185. package/dist/components/bs-ai-thinking.js +1 -1
  186. package/dist/components/bs-attachment-list.js +1 -1
  187. package/dist/components/bs-attachment.js +1 -1
  188. package/dist/components/bs-avatar.js +1 -1
  189. package/dist/components/bs-badge.js +1 -1
  190. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  191. package/dist/components/bs-breadcrumb.js +1 -1
  192. package/dist/components/bs-breadcrumbs.js +1 -1
  193. package/dist/components/bs-button-skeleton.js +1 -1
  194. package/dist/components/bs-button.js +1 -1
  195. package/dist/components/bs-card.js +1 -1
  196. package/dist/components/bs-carousel.d.ts +11 -0
  197. package/dist/components/bs-carousel.js +1 -0
  198. package/dist/components/bs-chatbot-feedback.js +1 -1
  199. package/dist/components/bs-chatbot-header.js +1 -1
  200. package/dist/components/bs-chatbot-response-action.js +1 -1
  201. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  202. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  203. package/dist/components/bs-checkbox-skeleton.js +1 -1
  204. package/dist/components/bs-checkbox.js +1 -1
  205. package/dist/components/bs-chip-filter.js +1 -1
  206. package/dist/components/bs-chip-informative.js +1 -1
  207. package/dist/components/bs-chip-input.js +1 -1
  208. package/dist/components/bs-composer-status-banner.js +1 -1
  209. package/dist/components/bs-composer.js +1 -1
  210. package/dist/components/bs-data-table.js +1 -1
  211. package/dist/components/bs-dialog.js +1 -1
  212. package/dist/components/bs-file-upload-item.d.ts +11 -0
  213. package/dist/components/bs-file-upload-item.js +1 -0
  214. package/dist/components/bs-file-upload.d.ts +11 -0
  215. package/dist/components/bs-file-upload.js +1 -0
  216. package/dist/components/bs-icon-button.js +1 -1
  217. package/dist/components/bs-inline-tab.js +1 -1
  218. package/dist/components/bs-input.js +1 -1
  219. package/dist/components/bs-logo.js +1 -1
  220. package/dist/components/bs-menu-item.js +1 -1
  221. package/dist/components/bs-menu.js +1 -1
  222. package/dist/components/bs-navigation-drawer-item.js +1 -1
  223. package/dist/components/bs-navigation-drawer.js +1 -1
  224. package/dist/components/bs-navigation-header.js +1 -1
  225. package/dist/components/bs-pagination.js +1 -1
  226. package/dist/components/bs-progress-linear.js +1 -1
  227. package/dist/components/bs-progress.js +1 -1
  228. package/dist/components/bs-radio.js +1 -1
  229. package/dist/components/bs-slider.js +1 -1
  230. package/dist/components/bs-snackbar.js +1 -1
  231. package/dist/components/bs-source-link.js +1 -1
  232. package/dist/components/bs-stepper-step.js +1 -1
  233. package/dist/components/bs-stepper.js +1 -1
  234. package/dist/components/bs-switch.js +1 -1
  235. package/dist/components/bs-tab.js +1 -1
  236. package/dist/components/bs-tabs.js +1 -1
  237. package/dist/components/bs-toast.js +1 -1
  238. package/dist/components/bs-tooltip.js +1 -1
  239. package/dist/components/index.js +1 -1
  240. package/dist/components/{p-D4omPSOU.js → p-BaxFLlKS.js} +1 -1
  241. package/dist/components/{p-DwVm6HIb.js → p-BhvV55-6.js} +1 -1
  242. package/dist/components/p-BxFJ74fI.js +1 -0
  243. package/dist/components/{p-Byl-ZwBI.js → p-DI5GgSqL.js} +1 -1
  244. package/dist/components/{p-DOApNIwD.js → p-Dqt-Qp4W.js} +1 -1
  245. package/dist/components/p-Dx8gAOVC.js +1 -0
  246. package/dist/components/{p-Dkv8x1_Z.js → p-LYvoWZt4.js} +1 -1
  247. package/dist/components/{p-CsnFdZ3v.js → p-mnGJPH85.js} +1 -1
  248. package/dist/components/{p-lvnXqw5g.js → p-v4T0qPVn.js} +1 -1
  249. package/dist/esm/brandsync-wc.js +4 -4
  250. package/dist/esm/bs-accordion.entry.js +1 -1
  251. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  252. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  253. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  254. package/dist/esm/bs-attachment-list.entry.js +2 -2
  255. package/dist/esm/bs-attachment.entry.js +1 -1
  256. package/dist/esm/bs-avatar.entry.js +1 -1
  257. package/dist/esm/bs-badge.entry.js +1 -1
  258. package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
  259. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  260. package/dist/esm/bs-breadcrumbs.entry.js +2 -2
  261. package/dist/esm/bs-button-skeleton.entry.js +2 -2
  262. package/dist/esm/bs-button.entry.js +1 -1
  263. package/dist/esm/bs-card.entry.js +1 -1
  264. package/dist/esm/bs-carousel.entry.js +194 -0
  265. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  266. package/dist/esm/bs-chatbot-header.entry.js +2 -2
  267. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  268. package/dist/esm/bs-chatbot-sources-drawer.entry.js +2 -2
  269. package/dist/esm/bs-chatbot-suggestion-button.entry.js +2 -2
  270. package/dist/esm/bs-checkbox-skeleton.entry.js +2 -2
  271. package/dist/esm/bs-checkbox.entry.js +2 -2
  272. package/dist/esm/bs-chip-filter.entry.js +2 -2
  273. package/dist/esm/bs-chip-informative.entry.js +2 -2
  274. package/dist/esm/bs-chip-input.entry.js +2 -2
  275. package/dist/esm/bs-composer-status-banner.entry.js +2 -2
  276. package/dist/esm/bs-composer.entry.js +2 -2
  277. package/dist/esm/bs-data-table.entry.js +3 -3
  278. package/dist/esm/bs-dialog.entry.js +1 -1
  279. package/dist/esm/bs-file-upload-item.entry.js +83 -0
  280. package/dist/esm/bs-file-upload.entry.js +108 -0
  281. package/dist/esm/bs-icon-button.entry.js +2 -2
  282. package/dist/esm/bs-inline-tab.entry.js +2 -2
  283. package/dist/esm/bs-input.entry.js +3 -3
  284. package/dist/esm/bs-logo.entry.js +1 -1
  285. package/dist/esm/bs-menu-item.entry.js +2 -2
  286. package/dist/esm/bs-menu.entry.js +2 -2
  287. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  288. package/dist/esm/bs-navigation-drawer.entry.js +2 -2
  289. package/dist/esm/bs-navigation-header.entry.js +2 -2
  290. package/dist/esm/bs-pagination.entry.js +2 -2
  291. package/dist/esm/bs-progress-linear.entry.js +8 -3
  292. package/dist/esm/bs-progress.entry.js +3 -3
  293. package/dist/esm/bs-radio.entry.js +2 -2
  294. package/dist/esm/bs-slider.entry.js +2 -2
  295. package/dist/esm/bs-snackbar.entry.js +2 -2
  296. package/dist/esm/bs-source-link.entry.js +3 -3
  297. package/dist/esm/bs-stepper-step.entry.js +2 -2
  298. package/dist/esm/bs-stepper.entry.js +2 -2
  299. package/dist/esm/bs-switch.entry.js +2 -2
  300. package/dist/esm/bs-tab.entry.js +2 -2
  301. package/dist/esm/bs-tabs.entry.js +2 -2
  302. package/dist/esm/bs-toast.entry.js +2 -2
  303. package/dist/esm/bs-tooltip.entry.js +2 -2
  304. package/dist/esm/{index-CcPfH1dJ.js → index-DuyFft7h.js} +24 -27
  305. package/dist/esm/loader.js +3 -3
  306. package/dist/types/components/bs-carousel/bs-carousel.cmp.test.d.ts +1 -0
  307. package/dist/types/components/bs-carousel/bs-carousel.d.ts +101 -0
  308. package/dist/types/components/bs-carousel/bs-carousel.stories.d.ts +17 -0
  309. package/dist/types/components/bs-file-upload/bs-file-upload.cmp.test.d.ts +1 -0
  310. package/dist/types/components/bs-file-upload/bs-file-upload.d.ts +59 -0
  311. package/dist/types/components/bs-file-upload/bs-file-upload.stories.d.ts +21 -0
  312. package/dist/types/components/bs-file-upload-item/bs-file-upload-item.cmp.test.d.ts +1 -0
  313. package/dist/types/components/bs-file-upload-item/bs-file-upload-item.d.ts +58 -0
  314. package/dist/types/components/bs-file-upload-item/bs-file-upload-item.stories.d.ts +18 -0
  315. package/dist/types/components/bs-progress-linear/bs-progress-linear.d.ts +5 -0
  316. package/dist/types/components.d.ts +594 -0
  317. package/dist/types/test/helpers/conventions.d.ts +21 -0
  318. package/dist/types/test/helpers/conventions.unit.test.d.ts +1 -0
  319. package/package.json +4 -2
  320. package/dist/brandsync-wc/p-4df71e00.entry.js +0 -1
  321. package/dist/brandsync-wc/p-dadbb3f1.entry.js +0 -1
@@ -58,7 +58,7 @@ export class BsAttachmentList {
58
58
  this.canScrollRight = row.scrollWidth - row.clientWidth - row.scrollLeft > 1;
59
59
  };
60
60
  render() {
61
- return (h("div", { key: '5508a6c6185bf836d4b30e7341f29f80ba06f2c3', class: "bs-attachment-list" }, h("div", { key: 'c8652402e683f80aee373adad7ad41590dd7fbaf', part: "row", class: "bs-attachment-list__row", ref: el => (this.row = el), onScroll: this.onScroll, role: "group", "aria-label": this.ariaLabel, tabIndex: 0 }, h("slot", { key: 'fb838b763b7047419d072c2c9f2cbe81046041e4', onSlotchange: this.onSlotchange })), this.canScrollRight && h("div", { key: 'faaf4be7542539a32675fb2046b26840e539d509', part: "fade", class: "bs-attachment-list__fade", "aria-hidden": "true" })));
61
+ return (h("div", { key: '2e265dcc82737c0b129be0196f68c0ec1a745789', class: "bs-attachment-list" }, h("div", { key: 'b148b3743237126437344dc1680c6c64c311f89a', part: "row", class: "bs-attachment-list__row", ref: el => (this.row = el), onScroll: this.onScroll, role: "group", "aria-label": this.ariaLabel, tabIndex: 0 }, h("slot", { key: 'db30b9615067b73db4c048991745055742be759f', onSlotchange: this.onSlotchange })), this.canScrollRight && h("div", { key: '989a64c7dc6e8cb99036a779b0eefc02b4706dc6', part: "fade", class: "bs-attachment-list__fade", "aria-hidden": "true" })));
62
62
  }
63
63
  static get is() { return "bs-attachment-list"; }
64
64
  static get encapsulation() { return "shadow"; }
@@ -96,7 +96,7 @@ export class BsAvatar {
96
96
  "references": {
97
97
  "BsAvatarType": {
98
98
  "location": "local",
99
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-avatar/bs-avatar.tsx",
99
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-avatar/bs-avatar.tsx",
100
100
  "id": "src/components/bs-avatar/bs-avatar.tsx::BsAvatarType"
101
101
  }
102
102
  }
@@ -122,7 +122,7 @@ export class BsAvatar {
122
122
  "references": {
123
123
  "BsAvatarSize": {
124
124
  "location": "local",
125
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-avatar/bs-avatar.tsx",
125
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-avatar/bs-avatar.tsx",
126
126
  "id": "src/components/bs-avatar/bs-avatar.tsx::BsAvatarSize"
127
127
  }
128
128
  }
@@ -42,7 +42,7 @@ export class BsBadge {
42
42
  "references": {
43
43
  "BsBadgeVariant": {
44
44
  "location": "local",
45
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-badge/bs-badge.tsx",
45
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-badge/bs-badge.tsx",
46
46
  "id": "src/components/bs-badge/bs-badge.tsx::BsBadgeVariant"
47
47
  }
48
48
  }
@@ -107,7 +107,7 @@ export class BsBreadcrumb {
107
107
  "references": {
108
108
  "BsBreadcrumbSize": {
109
109
  "location": "local",
110
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.tsx",
110
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.tsx",
111
111
  "id": "src/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.tsx::BsBreadcrumbSize"
112
112
  }
113
113
  }
@@ -102,7 +102,7 @@ export class BsBreadcrumbOverflow {
102
102
  "references": {
103
103
  "BsBreadcrumbOverflowItem": {
104
104
  "location": "local",
105
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.tsx",
105
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.tsx",
106
106
  "id": "src/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.tsx::BsBreadcrumbOverflowItem"
107
107
  }
108
108
  }
@@ -54,7 +54,7 @@ export class BsBreadcrumbs {
54
54
  });
55
55
  }
56
56
  render() {
57
- return (h("nav", { key: '5ff4734b3de9444f7347443acdc0dcea94bb43a1', "aria-label": this.label }, h("ol", { key: '0aebf74594c40b9268576cf1ccdb872dc3866ab3', part: "list", class: "bs-breadcrumbs__list" }, h("slot", { key: '998f3aeb715ef1fdf4e602cb50e612f9125832af', onSlotchange: this.onSlotChange }))));
57
+ return (h("nav", { key: '14bf783e0dc34d1f8368bde48499e684b1410b94', "aria-label": this.label }, h("ol", { key: 'feef69a5164f6d7dad670e56cdbd7912aff96c2c', part: "list", class: "bs-breadcrumbs__list" }, h("slot", { key: 'b616fc5fcf0181025be6e5570b7d0fa10cae146e', onSlotchange: this.onSlotChange }))));
58
58
  }
59
59
  static get is() { return "bs-breadcrumbs"; }
60
60
  static get encapsulation() { return "shadow"; }
@@ -131,7 +131,7 @@ export class BsButton {
131
131
  "references": {
132
132
  "BsButtonVariant": {
133
133
  "location": "local",
134
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-button/bs-button/bs-button.tsx",
134
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-button/bs-button/bs-button.tsx",
135
135
  "id": "src/components/bs-button/bs-button/bs-button.tsx::BsButtonVariant"
136
136
  }
137
137
  }
@@ -157,7 +157,7 @@ export class BsButton {
157
157
  "references": {
158
158
  "BsButtonSize": {
159
159
  "location": "local",
160
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-button/bs-button/bs-button.tsx",
160
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-button/bs-button/bs-button.tsx",
161
161
  "id": "src/components/bs-button/bs-button/bs-button.tsx::BsButtonSize"
162
162
  }
163
163
  }
@@ -50,7 +50,7 @@ export class BsIconButton {
50
50
  */
51
51
  ariaLabel = null;
52
52
  render() {
53
- return (h("button", { key: '86ddd0f1ff23372e205035ac1273a6b90a779855', class: `bs-icon-button bs-icon-button--${this.variant} bs-icon-button--${this.size}`, type: this.type, disabled: this.disabled, "aria-label": this.ariaLabel }, h("span", { key: 'f45944557ce068283c394e6a48fbc0f56087fbd9', part: "icon", class: "bs-icon-button__icon" }, h("slot", { key: 'ed067830c7f465099edbf40401b0e3ec6fb1e1c9' }))));
53
+ return (h("button", { key: '0721387caf111462e6ae846647ba1c48363158aa', class: `bs-icon-button bs-icon-button--${this.variant} bs-icon-button--${this.size}`, type: this.type, disabled: this.disabled, "aria-label": this.ariaLabel }, h("span", { key: '8c69f815b6ca603cfcfab34e3530f4c783da0ee7', part: "icon", class: "bs-icon-button__icon" }, h("slot", { key: '8533f8ecfae182d6bd7d7e0dd6af328015948864' }))));
54
54
  }
55
55
  static get is() { return "bs-icon-button"; }
56
56
  static get encapsulation() { return "shadow"; }
@@ -76,7 +76,7 @@ export class BsIconButton {
76
76
  "references": {
77
77
  "BsIconButtonVariant": {
78
78
  "location": "local",
79
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-button/bs-icon-button/bs-icon-button.tsx",
79
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-button/bs-icon-button/bs-icon-button.tsx",
80
80
  "id": "src/components/bs-button/bs-icon-button/bs-icon-button.tsx::BsIconButtonVariant"
81
81
  }
82
82
  }
@@ -102,7 +102,7 @@ export class BsIconButton {
102
102
  "references": {
103
103
  "BsIconButtonSize": {
104
104
  "location": "local",
105
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-button/bs-icon-button/bs-icon-button.tsx",
105
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-button/bs-icon-button/bs-icon-button.tsx",
106
106
  "id": "src/components/bs-button/bs-icon-button/bs-icon-button.tsx::BsIconButtonSize"
107
107
  }
108
108
  }
@@ -25,7 +25,7 @@ export class BsButtonSkeleton {
25
25
  /** Sizing scale, matching the `bs-button` size it stands in for. */
26
26
  size = 'md';
27
27
  render() {
28
- return h("span", { key: 'bc4e9d282c745bfacede27fbeae7dfc8ea5d7aed', part: "container", class: `bs-button-skeleton bs-button-skeleton--${this.size}`, role: "status", "aria-label": "Loading" });
28
+ return h("span", { key: '1b7d442c2522cd4591862c6d72ee9bc491570518', part: "container", class: `bs-button-skeleton bs-button-skeleton--${this.size}`, role: "status", "aria-label": "Loading" });
29
29
  }
30
30
  static get is() { return "bs-button-skeleton"; }
31
31
  static get encapsulation() { return "shadow"; }
@@ -59,7 +59,7 @@ export class BsCard {
59
59
  "references": {
60
60
  "BsCardSurface": {
61
61
  "location": "local",
62
- "path": "/home/runner/work/Brandsync-webcomponents/Brandsync-webcomponents/packages/wc/src/components/bs-card/bs-card.tsx",
62
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-card/bs-card.tsx",
63
63
  "id": "src/components/bs-card/bs-card.tsx::BsCardSurface"
64
64
  }
65
65
  }
@@ -0,0 +1,198 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ import { afterEach, beforeEach, vi } from "vitest";
3
+ import { userEvent } from "vitest/browser";
4
+ import { assertShadowParts, runAxeCheck } from "../../test/helpers/conventions";
5
+ const slides = (n) => Array.from({ length: n }, (_, i) => h("div", null, "Slide ", i + 1));
6
+ const visible = (root) => Array.from(root.children).filter(c => !c.hidden).map(c => c.textContent);
7
+ // Autoplay deliberately holds while the pointer is over the carousel (WCAG pause-on-hover). The test
8
+ // browser keeps ONE pointer for the whole run, so an earlier test that hovered something near the top
9
+ // of the page leaves it resting where the next carousel renders -- which then holds autoplay and
10
+ // never advances (this is exactly what failed on the CI runner while passing locally). Park the
11
+ // pointer in the opposite corner before each autoplay test so they don't depend on test order.
12
+ const parkPointer = async () => {
13
+ const dot = document.createElement('div');
14
+ dot.style.cssText = 'position:fixed;right:0;bottom:0;width:8px;height:8px';
15
+ document.body.appendChild(dot);
16
+ await userEvent.hover(dot);
17
+ dot.remove();
18
+ };
19
+ // Autoplay also starts paused for users who prefer reduced motion; make that independent of the
20
+ // machine running the tests.
21
+ const stubReducedMotion = (reduce) => vi.spyOn(window, 'matchMedia').mockImplementation((query) => ({
22
+ matches: reduce && query.includes('prefers-reduced-motion'),
23
+ media: query,
24
+ onchange: null,
25
+ addListener: () => undefined,
26
+ removeListener: () => undefined,
27
+ addEventListener: () => undefined,
28
+ removeEventListener: () => undefined,
29
+ dispatchEvent: () => false,
30
+ }));
31
+ // Resolves with the page of the next bsPageChange. Rejects with the carousel's state if none comes in
32
+ // time, so a failure says WHY autoplay held (hovered/focused/paused) instead of just "timed out".
33
+ const nextPage = (el, timeout = 5000) => new Promise((resolve, reject) => {
34
+ const timer = setTimeout(() => {
35
+ const host = el;
36
+ const live = el.shadowRoot?.querySelector('[part="slides"]')?.getAttribute('aria-live');
37
+ reject(new Error(`no bsPageChange within the timeout (paused=${host.paused}, :hover=${el.matches(':hover')}, ` +
38
+ `:focus-within=${el.matches(':focus-within')}, aria-live=${live})`));
39
+ }, timeout);
40
+ el.addEventListener('bsPageChange', (e) => {
41
+ clearTimeout(timer);
42
+ resolve(e.detail);
43
+ }, { once: true });
44
+ });
45
+ const btn = (el) => el?.shadowRoot?.querySelector('button');
46
+ describe('bs-carousel', () => {
47
+ it('has no axe-core violations (dots and numbers)', async () => {
48
+ for (const tracker of ['dots', 'numbers']) {
49
+ const { root } = await render(h("bs-carousel", { tracker: tracker, autoplay: true, label: "Featured" }, slides(9)));
50
+ await runAxeCheck(root);
51
+ }
52
+ });
53
+ it('exposes its documented shadow parts', async () => {
54
+ const { root } = await render(h("bs-carousel", { autoplay: true }, slides(9)));
55
+ assertShadowParts(root.shadowRoot, ['carousel', 'slides', 'tracker', 'prev', 'next', 'dots', 'dot', 'current', 'pause']);
56
+ });
57
+ it('shows slidesPerView slides per page and hides the rest', async () => {
58
+ const { root } = await render(h("bs-carousel", null, slides(7)));
59
+ expect(visible(root)).toEqual(['Slide 1', 'Slide 2', 'Slide 3']);
60
+ });
61
+ it('slidesPerView=1 shows one slide per page', async () => {
62
+ const { root } = await render(h("bs-carousel", { slidesPerView: 1 }, slides(3)));
63
+ expect(visible(root)).toEqual(['Slide 1']);
64
+ });
65
+ it('labels the region and each slide, without overriding existing labels', async () => {
66
+ const { root } = await render(h("bs-carousel", { label: "News" }, h("div", { "aria-label": "Custom" }, "A"), h("div", null, "B")));
67
+ const region = root.shadowRoot.querySelector('[part="carousel"]');
68
+ expect(region).toEqualAttribute('role', 'region');
69
+ expect(region).toEqualAttribute('aria-roledescription', 'carousel');
70
+ expect(region).toEqualAttribute('aria-label', 'News');
71
+ expect(root.children[0].getAttribute('aria-label')).toBe('Custom');
72
+ expect(root.children[1].getAttribute('aria-label')).toBe('2 of 2');
73
+ expect(root.children[1].getAttribute('aria-roledescription')).toBe('slide');
74
+ });
75
+ describe('dots tracker', () => {
76
+ it('renders one dot per page with the current one active', async () => {
77
+ const { root } = await render(h("bs-carousel", null, slides(12)));
78
+ const dots = root.shadowRoot.querySelectorAll('[part~="dot"]');
79
+ expect(dots.length).toBe(4);
80
+ expect(dots[0].getAttribute('part')).toContain('current');
81
+ expect(root.shadowRoot.querySelectorAll('[part~="current"]').length).toBe(1);
82
+ });
83
+ it('next/previous move the page, emit bsPageChange, and disable at the ends', async () => {
84
+ const { root, waitForChanges, spyOnEvent } = await render(h("bs-carousel", null, slides(9)));
85
+ const spy = spyOnEvent('bsPageChange');
86
+ const prev = root.shadowRoot.querySelector('[part="prev"]');
87
+ const next = root.shadowRoot.querySelector('[part="next"]');
88
+ expect(prev.disabled).toBe(true);
89
+ btn(next).click();
90
+ await waitForChanges();
91
+ expect(visible(root)).toEqual(['Slide 4', 'Slide 5', 'Slide 6']);
92
+ expect(root.currentPage).toBe(2);
93
+ expect(spy).toHaveReceivedEventDetail(2);
94
+ btn(next).click();
95
+ await waitForChanges();
96
+ expect(next.disabled).toBe(true);
97
+ btn(prev).click();
98
+ await waitForChanges();
99
+ expect(root.currentPage).toBe(2);
100
+ });
101
+ });
102
+ describe('numbers tracker', () => {
103
+ it('renders a bs-pagination with one number per page and navigates on click', async () => {
104
+ const { root, waitForChanges, spyOnEvent } = await render(h("bs-carousel", { tracker: "numbers" }, slides(15)));
105
+ const spy = spyOnEvent('bsPageChange');
106
+ const pagination = root.shadowRoot.querySelector('bs-pagination');
107
+ expect(pagination.totalPages).toBe(5);
108
+ pagination.shadowRoot.querySelectorAll('.bs-pagination__page')[2].click();
109
+ await waitForChanges();
110
+ expect(root.currentPage).toBe(3);
111
+ expect(visible(root)).toEqual(['Slide 7', 'Slide 8', 'Slide 9']);
112
+ expect(spy).toHaveReceivedEventTimes(1);
113
+ expect(spy).toHaveReceivedEventDetail(3);
114
+ });
115
+ });
116
+ it('hides the tracker when there is only one page', async () => {
117
+ const { root } = await render(h("bs-carousel", null, slides(3)));
118
+ expect(root.shadowRoot.querySelector('[part="tracker"]')).toBeNull();
119
+ });
120
+ it('clamps an out-of-range currentPage', async () => {
121
+ const { root, waitForChanges } = await render(h("bs-carousel", { currentPage: 99 }, slides(9)));
122
+ await waitForChanges();
123
+ expect(root.currentPage).toBe(3);
124
+ expect(visible(root)).toEqual(['Slide 7', 'Slide 8', 'Slide 9']);
125
+ });
126
+ it('reacts to slides being added', async () => {
127
+ const { root, waitForChanges } = await render(h("bs-carousel", null, slides(3)));
128
+ for (let i = 4; i <= 7; i++) {
129
+ const d = document.createElement('div');
130
+ d.textContent = `Slide ${i}`;
131
+ root.appendChild(d);
132
+ }
133
+ await waitForChanges();
134
+ expect(root.shadowRoot.querySelectorAll('[part~="dot"]').length).toBe(3);
135
+ });
136
+ describe('autoplay', () => {
137
+ beforeEach(async () => {
138
+ stubReducedMotion(false);
139
+ await parkPointer();
140
+ });
141
+ afterEach(() => {
142
+ vi.restoreAllMocks();
143
+ });
144
+ it('renders no Pause button unless autoplay is set', async () => {
145
+ const { root } = await render(h("bs-carousel", null, slides(9)));
146
+ expect(root.shadowRoot.querySelector('[part="pause"]')).toBeNull();
147
+ });
148
+ it('auto-advances, looping from the last page to the first', async () => {
149
+ const { root } = await render(h("bs-carousel", { autoplay: true, interval: 250 }, slides(6)));
150
+ expect(await nextPage(root)).toBe(2);
151
+ expect(await nextPage(root)).toBe(1);
152
+ });
153
+ it('starts paused (showing Play) for users who prefer reduced motion, and does not advance', async () => {
154
+ stubReducedMotion(true);
155
+ const { root, waitForChanges } = await render(h("bs-carousel", { autoplay: true, interval: 250 }, slides(6)));
156
+ await waitForChanges();
157
+ expect(root.paused).toBe(true);
158
+ expect(root.shadowRoot.querySelector('[part="pause"]').textContent).toContain('Play');
159
+ await new Promise(r => setTimeout(r, 700));
160
+ expect(root.currentPage).toBe(1);
161
+ });
162
+ it('holds auto-advance while the pointer is over the carousel', async () => {
163
+ const { root, waitForChanges } = await render(h("bs-carousel", { autoplay: true, interval: 250 }, slides(6)));
164
+ await waitForChanges();
165
+ root.dispatchEvent(new MouseEvent('mouseenter'));
166
+ await waitForChanges();
167
+ expect(root.shadowRoot.querySelector('[part="slides"]').getAttribute('aria-live')).toBe('polite');
168
+ await new Promise(r => setTimeout(r, 700));
169
+ expect(root.currentPage).toBe(1);
170
+ root.dispatchEvent(new MouseEvent('mouseleave'));
171
+ expect(await nextPage(root)).toBe(2);
172
+ });
173
+ it('Pause stops auto-advance, flips to Play, and emits bsPauseChange', async () => {
174
+ const { root, waitForChanges, spyOnEvent } = await render(h("bs-carousel", { autoplay: true, interval: 1000 }, slides(9)));
175
+ const spy = spyOnEvent('bsPauseChange');
176
+ const pause = root.shadowRoot.querySelector('[part="pause"]');
177
+ expect(pause.textContent).toContain('Pause');
178
+ btn(pause).click();
179
+ await waitForChanges();
180
+ expect(root.paused).toBe(true);
181
+ expect(pause.textContent).toContain('Play');
182
+ expect(spy).toHaveReceivedEventDetail(true);
183
+ // Longer than one interval: had it not stopped, it would have advanced by now.
184
+ await new Promise(r => setTimeout(r, 1300));
185
+ expect(root.currentPage).toBe(1);
186
+ });
187
+ it('holds auto-advance while focus is inside, and announces politely only when not rotating', async () => {
188
+ const { root, waitForChanges } = await render(h("bs-carousel", { autoplay: true, interval: 1000 }, slides(9)));
189
+ const live = () => root.shadowRoot.querySelector('[part="slides"]').getAttribute('aria-live');
190
+ expect(live()).toBe('off');
191
+ root.dispatchEvent(new FocusEvent('focusin'));
192
+ await waitForChanges();
193
+ expect(live()).toBe('polite');
194
+ await new Promise(r => setTimeout(r, 1300));
195
+ expect(root.currentPage).toBe(1);
196
+ });
197
+ });
198
+ });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @prop --bs-carousel-gap: Gap between visible slides. Aliased to --bs-spacing-200.
3
+ * @prop --bs-carousel-tracker-offset: Vertical gap between the slides and the tracker row. Aliased to --bs-spacing-200.
4
+ * @prop --bs-carousel-tracker-gap: Gap between the items of the tracker row (previous, dots, next, Pause). Aliased to --bs-spacing-50.
5
+ * @prop --bs-carousel-dot-size: Width/height of an inactive dot; the active dot is twice as wide. Aliased to --bs-spacing-100 (8px, exact match to Figma).
6
+ * @prop --bs-carousel-dot-radius: Corner radius of a dot. Aliased to --bs-border-radius-full.
7
+ * @prop --bs-carousel-dot-color: Fill of an inactive dot. Aliased to --bs-surface-container.
8
+ * @prop --bs-carousel-dot-active-color: Fill of the active dot. Aliased to --bs-color-primary-default.
9
+ * @prop --bs-carousel-dots-gap: Gap between dots. Aliased to --bs-spacing-50.
10
+ */
11
+ :host {
12
+ display: block;
13
+
14
+ --bs-carousel-gap: var(--bs-spacing-200);
15
+ --bs-carousel-tracker-offset: var(--bs-spacing-200);
16
+ --bs-carousel-tracker-gap: var(--bs-spacing-50);
17
+
18
+ --bs-carousel-dot-size: var(--bs-spacing-100);
19
+ --bs-carousel-dot-radius: var(--bs-border-radius-full);
20
+ --bs-carousel-dot-color: var(--bs-surface-container);
21
+ --bs-carousel-dot-active-color: var(--bs-color-primary-default);
22
+ --bs-carousel-dots-gap: var(--bs-spacing-50);
23
+ }
24
+
25
+ .bs-carousel {
26
+ display: flex;
27
+ flex-direction: column;
28
+ align-items: center;
29
+ gap: var(--bs-carousel-tracker-offset);
30
+ }
31
+
32
+ .bs-carousel__slides {
33
+ display: flex;
34
+ align-items: flex-start;
35
+ gap: var(--bs-carousel-gap);
36
+ width: 100%;
37
+ }
38
+
39
+ /* Each slide takes an equal share of the row for the configured slidesPerView (set inline by the
40
+ component -- an internal variable, not a customization point). */
41
+ .bs-carousel__slides ::slotted(*) {
42
+ flex: 0 0
43
+ calc(
44
+ (100% - (var(--bs-carousel-slides-per-view) - 1) * var(--bs-carousel-gap)) / var(--bs-carousel-slides-per-view)
45
+ );
46
+ min-width: 0;
47
+ box-sizing: border-box;
48
+ }
49
+
50
+ /* Off-page slides carry the `hidden` attribute; a slide's own :host { display } would otherwise
51
+ override the UA's [hidden] rule. */
52
+ .bs-carousel__slides ::slotted([hidden]) {
53
+ display: none !important;
54
+ }
55
+
56
+ .bs-carousel__tracker {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: var(--bs-carousel-tracker-gap);
60
+ }
61
+
62
+ .bs-carousel__nav {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: var(--bs-carousel-tracker-gap);
66
+ }
67
+
68
+ .bs-carousel__dots {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--bs-carousel-dots-gap);
72
+ }
73
+
74
+ .bs-carousel__dot {
75
+ display: block;
76
+ width: var(--bs-carousel-dot-size);
77
+ height: var(--bs-carousel-dot-size);
78
+ border-radius: var(--bs-carousel-dot-radius);
79
+ background: var(--bs-carousel-dot-color);
80
+ }
81
+
82
+ .bs-carousel__dot--active {
83
+ width: calc(var(--bs-carousel-dot-size) * 2);
84
+ background: var(--bs-carousel-dot-active-color);
85
+ }
86
+
87
+ /* Figma colors the previous/next chevrons with the default icon color (--bs-icon-default, #21262e),
88
+ one step darker than bs-icon-button's subtle variant (--bs-icon-neutral-default). Re-pointing that
89
+ token on these buttons only keeps the alias-to-a-token rule without touching bs-icon-button. */
90
+ .bs-carousel__nav bs-icon-button {
91
+ --bs-icon-neutral-default: var(--bs-icon-default);
92
+ }
93
+
94
+ /* In RTL the previous button sits on the right, so its chevron must point right (and vice versa). */
95
+ :host(:dir(rtl)) .bs-carousel__chevron {
96
+ transform: scaleX(-1);
97
+ }
98
+
99
+ @media (forced-colors: active) {
100
+ .bs-carousel__dot {
101
+ forced-color-adjust: none;
102
+ background: GrayText;
103
+ }
104
+ .bs-carousel__dot--active {
105
+ background: Highlight;
106
+ }
107
+ }