@brandsync/wc 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/custom-elements.json +8335 -4132
  2. package/dist/brandsync-wc/brandsync-wc.css +33 -0
  3. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  4. package/dist/brandsync-wc/{p-9f8852a0.entry.js → p-00a0d489.entry.js} +1 -1
  5. package/dist/brandsync-wc/{p-a5feaad4.entry.js → p-061ddc46.entry.js} +1 -1
  6. package/dist/brandsync-wc/{p-360452c2.entry.js → p-09435f41.entry.js} +1 -1
  7. package/dist/brandsync-wc/{p-dbcbe682.entry.js → p-09bc1923.entry.js} +1 -1
  8. package/dist/brandsync-wc/{p-1f7208cb.entry.js → p-09cbf05b.entry.js} +1 -1
  9. package/dist/brandsync-wc/{p-c99b6a66.entry.js → p-0b2d3b7e.entry.js} +1 -1
  10. package/dist/brandsync-wc/p-0b7c77c1.entry.js +1 -0
  11. package/dist/brandsync-wc/p-0ee4126c.entry.js +1 -0
  12. package/dist/brandsync-wc/{p-5f3cd501.entry.js → p-0f8cd2e8.entry.js} +1 -1
  13. package/dist/brandsync-wc/{p-1c0db4d6.entry.js → p-1261f0b0.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-b2074a32.entry.js → p-1978e63c.entry.js} +1 -1
  15. package/dist/brandsync-wc/p-1aab6d07.entry.js +1 -0
  16. package/dist/brandsync-wc/{p-96ed9386.entry.js → p-20030f4d.entry.js} +1 -1
  17. package/dist/brandsync-wc/p-2177042f.entry.js +1 -0
  18. package/dist/brandsync-wc/{p-a8e2a829.entry.js → p-2368a92e.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-2e958566.entry.js → p-247e36ad.entry.js} +1 -1
  20. package/dist/brandsync-wc/p-2497d128.entry.js +1 -0
  21. package/dist/brandsync-wc/{p-701ebf4a.entry.js → p-282ddbee.entry.js} +1 -1
  22. package/dist/brandsync-wc/{p-763876f5.entry.js → p-2f4e08e1.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-c3f72584.entry.js → p-34e5feaf.entry.js} +1 -1
  24. package/dist/brandsync-wc/{p-ea4e20ef.entry.js → p-39a26c64.entry.js} +1 -1
  25. package/dist/brandsync-wc/p-3a1af63a.entry.js +1 -0
  26. package/dist/brandsync-wc/{p-9f6fe37d.entry.js → p-3f09296a.entry.js} +1 -1
  27. package/dist/brandsync-wc/p-416322bd.entry.js +1 -0
  28. package/dist/brandsync-wc/{p-bbcc47b0.entry.js → p-491b51e6.entry.js} +1 -1
  29. package/dist/brandsync-wc/p-52cb2358.entry.js +1 -0
  30. package/dist/brandsync-wc/{p-daab6b22.entry.js → p-56c37e0a.entry.js} +1 -1
  31. package/dist/brandsync-wc/p-5ba90a13.entry.js +1 -0
  32. package/dist/brandsync-wc/{p-2181378f.entry.js → p-5f27f04d.entry.js} +1 -1
  33. package/dist/brandsync-wc/{p-08c99a60.entry.js → p-617bd13a.entry.js} +1 -1
  34. package/dist/brandsync-wc/p-68fcd4a4.entry.js +1 -0
  35. package/dist/brandsync-wc/{p-9e88f19c.entry.js → p-69c0a85d.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-d3f44cb7.entry.js → p-6a696161.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-32cd69f1.entry.js → p-6c6cdf77.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-041776c0.entry.js → p-6e735e37.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-fc58c663.entry.js → p-73f214ed.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-be2c1740.entry.js → p-7796b93f.entry.js} +1 -1
  41. package/dist/brandsync-wc/p-78a69a59.entry.js +1 -0
  42. package/dist/brandsync-wc/{p-f370b8fa.entry.js → p-78f4fcf0.entry.js} +1 -1
  43. package/dist/brandsync-wc/p-7f954939.entry.js +1 -0
  44. package/dist/brandsync-wc/{p-835a8dc7.entry.js → p-81605b82.entry.js} +1 -1
  45. package/dist/brandsync-wc/{p-a71d2811.entry.js → p-823ab3b2.entry.js} +1 -1
  46. package/dist/brandsync-wc/{p-a92eec48.entry.js → p-89fabf27.entry.js} +1 -1
  47. package/dist/brandsync-wc/{p-AgoOSYvW.js → p-DqQRXQMx.js} +2 -2
  48. package/dist/brandsync-wc/{p-18c3c22c.entry.js → p-a9169157.entry.js} +1 -1
  49. package/dist/brandsync-wc/{p-f89de457.entry.js → p-afb07368.entry.js} +1 -1
  50. package/dist/brandsync-wc/{p-301b2455.entry.js → p-b84366a7.entry.js} +1 -1
  51. package/dist/brandsync-wc/p-b9a4042e.entry.js +1 -0
  52. package/dist/brandsync-wc/{p-275072dd.entry.js → p-b9ccd9d1.entry.js} +1 -1
  53. package/dist/brandsync-wc/{p-61c1a2a3.entry.js → p-be3dd446.entry.js} +1 -1
  54. package/dist/brandsync-wc/{p-d42b1c2b.entry.js → p-c0a92750.entry.js} +1 -1
  55. package/dist/brandsync-wc/{p-8eba7f90.entry.js → p-d754ee13.entry.js} +1 -1
  56. package/dist/brandsync-wc/{p-e9b43754.entry.js → p-d75f3f87.entry.js} +1 -1
  57. package/dist/brandsync-wc/{p-e8a5b8eb.entry.js → p-d8b29a53.entry.js} +1 -1
  58. package/dist/brandsync-wc/p-de110ad0.entry.js +1 -0
  59. package/dist/brandsync-wc/p-e2556b4e.entry.js +1 -0
  60. package/dist/brandsync-wc/{p-af2bf957.entry.js → p-e5daa6ca.entry.js} +1 -1
  61. package/dist/brandsync-wc/{p-0132a2d1.entry.js → p-f15d9524.entry.js} +1 -1
  62. package/dist/brandsync-wc/p-f5180578.entry.js +1 -0
  63. package/dist/brandsync-wc/{p-fd254972.entry.js → p-f7d15fbe.entry.js} +1 -1
  64. package/dist/brandsync-wc/{p-50a251a4.entry.js → p-fc069773.entry.js} +1 -1
  65. package/dist/brandsync-wc/p-fcee0dc4.entry.js +1 -0
  66. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  67. package/dist/cjs/bs-accordion.cjs.entry.js +1 -1
  68. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
  69. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  70. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  71. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  72. package/dist/cjs/bs-attachment.cjs.entry.js +1 -1
  73. package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
  74. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  75. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +1 -1
  76. package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
  77. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +2 -2
  78. package/dist/cjs/bs-button-skeleton.cjs.entry.js +2 -2
  79. package/dist/cjs/bs-button.cjs.entry.js +3 -3
  80. package/dist/cjs/bs-card.cjs.entry.js +3 -3
  81. package/dist/cjs/bs-carousel.cjs.entry.js +1 -1
  82. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-chatbot-header.cjs.entry.js +2 -2
  84. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +2 -2
  85. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +2 -2
  86. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +2 -2
  87. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +2 -2
  88. package/dist/cjs/bs-checkbox.cjs.entry.js +1 -1
  89. package/dist/cjs/bs-chip-filter.cjs.entry.js +1 -1
  90. package/dist/cjs/bs-chip-informative.cjs.entry.js +1 -1
  91. package/dist/cjs/bs-chip-input.cjs.entry.js +1 -1
  92. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +1 -1
  93. package/dist/cjs/bs-composer.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-cookie-consent.cjs.entry.js +186 -0
  95. package/dist/cjs/bs-data-table.cjs.entry.js +1 -1
  96. package/dist/cjs/bs-datepicker.cjs.entry.js +13 -9
  97. package/dist/cjs/bs-dialog.cjs.entry.js +1 -1
  98. package/dist/cjs/bs-error-page.cjs.entry.js +103 -0
  99. package/dist/cjs/bs-file-upload-item.cjs.entry.js +2 -2
  100. package/dist/cjs/bs-file-upload.cjs.entry.js +2 -2
  101. package/dist/cjs/bs-icon-button.cjs.entry.js +2 -2
  102. package/dist/cjs/bs-icon-tile.cjs.entry.js +52 -0
  103. package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
  104. package/dist/cjs/{bs-input_2.cjs.entry.js → bs-input_3.cjs.entry.js} +40 -5
  105. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  106. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
  107. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +3 -3
  108. package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
  109. package/dist/cjs/bs-onboarding-checklist.cjs.entry.js +161 -0
  110. package/dist/cjs/bs-pagination.cjs.entry.js +2 -2
  111. package/dist/cjs/bs-product-tour.cjs.entry.js +78 -0
  112. package/dist/cjs/bs-progress-linear.cjs.entry.js +4 -4
  113. package/dist/cjs/bs-progress.cjs.entry.js +3 -3
  114. package/dist/cjs/bs-qr-code.cjs.entry.js +148 -0
  115. package/dist/cjs/bs-radio.cjs.entry.js +2 -2
  116. package/dist/cjs/bs-session-timeout.cjs.entry.js +215 -0
  117. package/dist/cjs/bs-slider.cjs.entry.js +2 -2
  118. package/dist/cjs/bs-snackbar.cjs.entry.js +9 -3
  119. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  120. package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
  121. package/dist/cjs/bs-stepper.cjs.entry.js +2 -2
  122. package/dist/cjs/bs-switch.cjs.entry.js +2 -2
  123. package/dist/cjs/bs-tab_3.cjs.entry.js +255 -0
  124. package/dist/cjs/bs-timepicker.cjs.entry.js +4 -4
  125. package/dist/cjs/bs-toast.cjs.entry.js +2 -2
  126. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  127. package/dist/cjs/bs-whats-new.cjs.entry.js +144 -0
  128. package/dist/cjs/{index-kk9YXF2S.js → index-tFJjflK5.js} +15 -3
  129. package/dist/cjs/loader.cjs.js +2 -2
  130. package/dist/collection/collection-manifest.json +9 -0
  131. package/dist/collection/components/bs-a11y.cmp.test.js +22 -0
  132. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  133. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  134. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  135. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  136. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  137. package/dist/collection/components/bs-button/bs-button/bs-button.cmp.test.js +28 -0
  138. package/dist/collection/components/bs-button/bs-button/bs-button.css +8 -2
  139. package/dist/collection/components/bs-button/bs-button/bs-button.js +4 -1
  140. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +1 -1
  141. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  142. package/dist/collection/components/bs-card/bs-card.cmp.test.js +48 -0
  143. package/dist/collection/components/bs-card/bs-card.css +37 -16
  144. package/dist/collection/components/bs-card/bs-card.js +2 -2
  145. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  146. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  147. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  148. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  149. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  150. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +1 -1
  151. package/dist/collection/components/bs-cookie-consent/bs-cookie-consent.cmp.test.js +217 -0
  152. package/dist/collection/components/bs-cookie-consent/bs-cookie-consent.css +350 -0
  153. package/dist/collection/components/bs-cookie-consent/bs-cookie-consent.js +668 -0
  154. package/dist/collection/components/bs-cookie-consent/bs-cookie-consent.stories.js +103 -0
  155. package/dist/collection/components/bs-datepicker/bs-datepicker.cmp.test.js +9 -0
  156. package/dist/collection/components/bs-datepicker/bs-datepicker.css +21 -11
  157. package/dist/collection/components/bs-datepicker/bs-datepicker.js +13 -7
  158. package/dist/collection/components/bs-datepicker/bs-datepicker.stories.js +3 -2
  159. package/dist/collection/components/bs-error-page/bs-error-page.cmp.test.js +99 -0
  160. package/dist/collection/components/bs-error-page/bs-error-page.css +105 -0
  161. package/dist/collection/components/bs-error-page/bs-error-page.js +328 -0
  162. package/dist/collection/components/bs-error-page/bs-error-page.stories.js +57 -0
  163. package/dist/collection/components/bs-file-upload/bs-file-upload.js +1 -1
  164. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.js +1 -1
  165. package/dist/collection/components/bs-icon-tile/bs-icon-tile.cmp.test.js +175 -0
  166. package/dist/collection/components/bs-icon-tile/bs-icon-tile.css +112 -0
  167. package/dist/collection/components/bs-icon-tile/bs-icon-tile.js +158 -0
  168. package/dist/collection/components/bs-icon-tile/bs-icon-tile.stories.js +45 -0
  169. package/dist/collection/components/bs-input/bs-input.cmp.test.js +14 -0
  170. package/dist/collection/components/bs-input/bs-input.css +9 -2
  171. package/dist/collection/components/bs-input/bs-input.js +2 -2
  172. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  173. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  174. package/dist/collection/components/bs-onboarding-checklist/bs-onboarding-checklist.cmp.test.js +280 -0
  175. package/dist/collection/components/bs-onboarding-checklist/bs-onboarding-checklist.css +488 -0
  176. package/dist/collection/components/bs-onboarding-checklist/bs-onboarding-checklist.js +674 -0
  177. package/dist/collection/components/bs-onboarding-checklist/bs-onboarding-checklist.stories.js +92 -0
  178. package/dist/collection/components/bs-pagination/bs-pagination.js +1 -1
  179. package/dist/collection/components/bs-product-tour/bs-product-tour.cmp.test.js +116 -0
  180. package/dist/collection/components/bs-product-tour/bs-product-tour.css +265 -0
  181. package/dist/collection/components/bs-product-tour/bs-product-tour.js +391 -0
  182. package/dist/collection/components/bs-product-tour/bs-product-tour.stories.js +68 -0
  183. package/dist/collection/components/bs-progress/bs-progress.js +2 -2
  184. package/dist/collection/components/bs-progress-linear/bs-progress-linear.css +1 -1
  185. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
  186. package/dist/collection/components/bs-qr-code/bs-qr-code.cmp.test.js +152 -0
  187. package/dist/collection/components/bs-qr-code/bs-qr-code.css +307 -0
  188. package/dist/collection/components/bs-qr-code/bs-qr-code.js +767 -0
  189. package/dist/collection/components/bs-qr-code/bs-qr-code.stories.js +99 -0
  190. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  191. package/dist/collection/components/bs-session-timeout/bs-session-timeout.cmp.test.js +202 -0
  192. package/dist/collection/components/bs-session-timeout/bs-session-timeout.css +239 -0
  193. package/dist/collection/components/bs-session-timeout/bs-session-timeout.js +772 -0
  194. package/dist/collection/components/bs-session-timeout/bs-session-timeout.stories.js +88 -0
  195. package/dist/collection/components/bs-slider/bs-slider.js +1 -1
  196. package/dist/collection/components/bs-snackbar/bs-snackbar.cmp.test.js +20 -0
  197. package/dist/collection/components/bs-snackbar/bs-snackbar.css +6 -4
  198. package/dist/collection/components/bs-snackbar/bs-snackbar.js +53 -1
  199. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  200. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  201. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
  202. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  203. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  204. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  205. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  206. package/dist/collection/components/bs-timepicker/bs-timepicker.css +15 -11
  207. package/dist/collection/components/bs-timepicker/bs-timepicker.js +4 -2
  208. package/dist/collection/components/bs-toast/bs-toast.js +1 -1
  209. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  210. package/dist/collection/components/bs-whats-new/bs-whats-new.cmp.test.js +200 -0
  211. package/dist/collection/components/bs-whats-new/bs-whats-new.css +315 -0
  212. package/dist/collection/components/bs-whats-new/bs-whats-new.js +790 -0
  213. package/dist/collection/components/bs-whats-new/bs-whats-new.stories.js +105 -0
  214. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.cmp.test.js +79 -0
  215. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.css +131 -0
  216. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +295 -0
  217. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.stories.js +67 -0
  218. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +2 -2
  219. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  220. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  221. package/dist/components/bs-accordion.js +1 -1
  222. package/dist/components/bs-ai-disclaimer.js +1 -1
  223. package/dist/components/bs-ai-greeting.js +1 -1
  224. package/dist/components/bs-ai-thinking.js +1 -1
  225. package/dist/components/bs-attachment-list.js +1 -1
  226. package/dist/components/bs-attachment.js +1 -1
  227. package/dist/components/bs-avatar.js +1 -1
  228. package/dist/components/bs-badge.js +1 -1
  229. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  230. package/dist/components/bs-breadcrumb.js +1 -1
  231. package/dist/components/bs-breadcrumbs.js +1 -1
  232. package/dist/components/bs-button-skeleton.js +1 -1
  233. package/dist/components/bs-button.js +1 -1
  234. package/dist/components/bs-card.js +1 -1
  235. package/dist/components/bs-carousel.js +1 -1
  236. package/dist/components/bs-chatbot-feedback.js +1 -1
  237. package/dist/components/bs-chatbot-header.js +1 -1
  238. package/dist/components/bs-chatbot-response-action.js +1 -1
  239. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  240. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  241. package/dist/components/bs-checkbox-skeleton.js +1 -1
  242. package/dist/components/bs-checkbox.js +1 -1
  243. package/dist/components/bs-chip-filter.js +1 -1
  244. package/dist/components/bs-chip-informative.js +1 -1
  245. package/dist/components/bs-chip-input.js +1 -1
  246. package/dist/components/bs-composer-status-banner.js +1 -1
  247. package/dist/components/bs-composer.js +1 -1
  248. package/dist/components/bs-cookie-consent.d.ts +11 -0
  249. package/dist/components/bs-cookie-consent.js +1 -0
  250. package/dist/components/bs-data-table.js +1 -1
  251. package/dist/components/bs-datepicker.js +1 -1
  252. package/dist/components/bs-dialog.js +1 -1
  253. package/dist/components/bs-error-page.d.ts +11 -0
  254. package/dist/components/bs-error-page.js +1 -0
  255. package/dist/components/bs-file-upload-item.js +1 -1
  256. package/dist/components/bs-file-upload.js +1 -1
  257. package/dist/components/bs-icon-button.js +1 -1
  258. package/dist/components/bs-icon-tile.d.ts +11 -0
  259. package/dist/components/bs-icon-tile.js +1 -0
  260. package/dist/components/bs-inline-tab.js +1 -1
  261. package/dist/components/bs-input.js +1 -1
  262. package/dist/components/bs-logo.js +1 -1
  263. package/dist/components/bs-menu-item.js +1 -1
  264. package/dist/components/bs-menu.js +1 -1
  265. package/dist/components/bs-navigation-drawer-item.js +1 -1
  266. package/dist/components/bs-navigation-drawer.js +1 -1
  267. package/dist/components/bs-navigation-header.js +1 -1
  268. package/dist/components/bs-onboarding-checklist.d.ts +11 -0
  269. package/dist/components/bs-onboarding-checklist.js +1 -0
  270. package/dist/components/bs-pagination.js +1 -1
  271. package/dist/components/bs-product-tour.d.ts +11 -0
  272. package/dist/components/bs-product-tour.js +1 -0
  273. package/dist/components/bs-progress-linear.js +1 -1
  274. package/dist/components/bs-progress.js +1 -1
  275. package/dist/components/bs-qr-code.d.ts +11 -0
  276. package/dist/components/bs-qr-code.js +1 -0
  277. package/dist/components/bs-radio.js +1 -1
  278. package/dist/components/bs-session-timeout.d.ts +11 -0
  279. package/dist/components/bs-session-timeout.js +1 -0
  280. package/dist/components/bs-slider.js +1 -1
  281. package/dist/components/bs-snackbar.js +1 -1
  282. package/dist/components/bs-source-link.js +1 -1
  283. package/dist/components/bs-stepper-step.js +1 -1
  284. package/dist/components/bs-stepper.js +1 -1
  285. package/dist/components/bs-switch.js +1 -1
  286. package/dist/components/bs-tab.js +1 -1
  287. package/dist/components/bs-tabs.js +1 -1
  288. package/dist/components/bs-timepicker.js +1 -1
  289. package/dist/components/bs-toast.js +1 -1
  290. package/dist/components/bs-tooltip.js +1 -1
  291. package/dist/components/bs-whats-new-entry.d.ts +11 -0
  292. package/dist/components/bs-whats-new-entry.js +1 -0
  293. package/dist/components/bs-whats-new.d.ts +11 -0
  294. package/dist/components/bs-whats-new.js +1 -0
  295. package/dist/components/index.js +1 -1
  296. package/dist/components/{p-R2MlkUzD.js → p-BEEoVNRu.js} +1 -1
  297. package/dist/components/{p-DkIVyFOP.js → p-BZ3M4lOU.js} +1 -1
  298. package/dist/components/{p-Ba860ej1.js → p-B_I4UEMp.js} +1 -1
  299. package/dist/components/{p-ZK8p5zax.js → p-Be9L4_Fe.js} +1 -1
  300. package/dist/components/p-Be_Pmccm.js +1 -0
  301. package/dist/components/{p-CPvqZNO8.js → p-Bl_tVzeq.js} +1 -1
  302. package/dist/components/p-C8yT2Ucq.js +1 -0
  303. package/dist/components/p-CA31vqjL.js +1 -0
  304. package/dist/components/p-CUfs0ROR.js +1 -0
  305. package/dist/components/{p-JYlmcxBn.js → p-CVrEuVFo.js} +1 -1
  306. package/dist/components/{p-B7Icv1ho.js → p-C_j_jDM6.js} +1 -1
  307. package/dist/components/p-CbimDNGY.js +1 -0
  308. package/dist/components/p-CeUK3n7D.js +1 -0
  309. package/dist/components/p-CncySD_-.js +1 -0
  310. package/dist/components/p-DE8K7fg0.js +1 -0
  311. package/dist/components/p-Dr0Qk9Zc.js +1 -0
  312. package/dist/components/p-DuLL7Ouw.js +1 -0
  313. package/dist/components/p-YsHQLXET.js +1 -0
  314. package/dist/components/p-qmS2CBqi.js +1 -0
  315. package/dist/components/{p-BYR_ZC8v.js → p-zTHlbyH6.js} +1 -1
  316. package/dist/esm/brandsync-wc.js +3 -3
  317. package/dist/esm/bs-accordion.entry.js +1 -1
  318. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  319. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  320. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  321. package/dist/esm/bs-attachment-list.entry.js +2 -2
  322. package/dist/esm/bs-attachment.entry.js +1 -1
  323. package/dist/esm/bs-avatar.entry.js +1 -1
  324. package/dist/esm/bs-badge.entry.js +1 -1
  325. package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
  326. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  327. package/dist/esm/bs-breadcrumbs.entry.js +2 -2
  328. package/dist/esm/bs-button-skeleton.entry.js +2 -2
  329. package/dist/esm/bs-button.entry.js +3 -3
  330. package/dist/esm/bs-card.entry.js +3 -3
  331. package/dist/esm/bs-carousel.entry.js +1 -1
  332. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  333. package/dist/esm/bs-chatbot-header.entry.js +2 -2
  334. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  335. package/dist/esm/bs-chatbot-sources-drawer.entry.js +2 -2
  336. package/dist/esm/bs-chatbot-suggestion-button.entry.js +2 -2
  337. package/dist/esm/bs-checkbox-skeleton.entry.js +2 -2
  338. package/dist/esm/bs-checkbox.entry.js +1 -1
  339. package/dist/esm/bs-chip-filter.entry.js +1 -1
  340. package/dist/esm/bs-chip-informative.entry.js +1 -1
  341. package/dist/esm/bs-chip-input.entry.js +1 -1
  342. package/dist/esm/bs-composer-status-banner.entry.js +1 -1
  343. package/dist/esm/bs-composer.entry.js +1 -1
  344. package/dist/esm/bs-cookie-consent.entry.js +184 -0
  345. package/dist/esm/bs-data-table.entry.js +1 -1
  346. package/dist/esm/bs-datepicker.entry.js +13 -9
  347. package/dist/esm/bs-dialog.entry.js +1 -1
  348. package/dist/esm/bs-error-page.entry.js +101 -0
  349. package/dist/esm/bs-file-upload-item.entry.js +2 -2
  350. package/dist/esm/bs-file-upload.entry.js +2 -2
  351. package/dist/esm/bs-icon-button.entry.js +2 -2
  352. package/dist/esm/bs-icon-tile.entry.js +50 -0
  353. package/dist/esm/bs-inline-tab.entry.js +2 -2
  354. package/dist/esm/{bs-input_2.entry.js → bs-input_3.entry.js} +40 -6
  355. package/dist/esm/bs-logo.entry.js +1 -1
  356. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  357. package/dist/esm/bs-navigation-drawer.entry.js +3 -3
  358. package/dist/esm/bs-navigation-header.entry.js +2 -2
  359. package/dist/esm/bs-onboarding-checklist.entry.js +159 -0
  360. package/dist/esm/bs-pagination.entry.js +2 -2
  361. package/dist/esm/bs-product-tour.entry.js +76 -0
  362. package/dist/esm/bs-progress-linear.entry.js +4 -4
  363. package/dist/esm/bs-progress.entry.js +3 -3
  364. package/dist/esm/bs-qr-code.entry.js +146 -0
  365. package/dist/esm/bs-radio.entry.js +2 -2
  366. package/dist/esm/bs-session-timeout.entry.js +213 -0
  367. package/dist/esm/bs-slider.entry.js +2 -2
  368. package/dist/esm/bs-snackbar.entry.js +9 -3
  369. package/dist/esm/bs-source-link.entry.js +3 -3
  370. package/dist/esm/bs-stepper-step.entry.js +2 -2
  371. package/dist/esm/bs-stepper.entry.js +2 -2
  372. package/dist/esm/bs-switch.entry.js +2 -2
  373. package/dist/esm/bs-tab_3.entry.js +251 -0
  374. package/dist/esm/bs-timepicker.entry.js +4 -4
  375. package/dist/esm/bs-toast.entry.js +2 -2
  376. package/dist/esm/bs-tooltip.entry.js +2 -2
  377. package/dist/esm/bs-whats-new.entry.js +142 -0
  378. package/dist/esm/{index-AgoOSYvW.js → index-DqQRXQMx.js} +15 -3
  379. package/dist/esm/loader.js +3 -3
  380. package/dist/types/components/bs-button/bs-button/bs-button.d.ts +3 -0
  381. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.cmp.test.d.ts +1 -0
  382. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.d.ts +136 -0
  383. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.stories.d.ts +16 -0
  384. package/dist/types/components/bs-datepicker/bs-datepicker.d.ts +2 -0
  385. package/dist/types/components/bs-error-page/bs-error-page.cmp.test.d.ts +1 -0
  386. package/dist/types/components/bs-error-page/bs-error-page.d.ts +60 -0
  387. package/dist/types/components/bs-error-page/bs-error-page.stories.d.ts +22 -0
  388. package/dist/types/components/bs-icon-tile/bs-icon-tile.cmp.test.d.ts +1 -0
  389. package/dist/types/components/bs-icon-tile/bs-icon-tile.d.ts +40 -0
  390. package/dist/types/components/bs-icon-tile/bs-icon-tile.stories.d.ts +13 -0
  391. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.cmp.test.d.ts +1 -0
  392. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.d.ts +140 -0
  393. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.stories.d.ts +18 -0
  394. package/dist/types/components/bs-product-tour/bs-product-tour.cmp.test.d.ts +1 -0
  395. package/dist/types/components/bs-product-tour/bs-product-tour.d.ts +78 -0
  396. package/dist/types/components/bs-product-tour/bs-product-tour.stories.d.ts +19 -0
  397. package/dist/types/components/bs-qr-code/bs-qr-code.cmp.test.d.ts +1 -0
  398. package/dist/types/components/bs-qr-code/bs-qr-code.d.ts +124 -0
  399. package/dist/types/components/bs-qr-code/bs-qr-code.stories.d.ts +28 -0
  400. package/dist/types/components/bs-session-timeout/bs-session-timeout.cmp.test.d.ts +1 -0
  401. package/dist/types/components/bs-session-timeout/bs-session-timeout.d.ts +141 -0
  402. package/dist/types/components/bs-session-timeout/bs-session-timeout.stories.d.ts +19 -0
  403. package/dist/types/components/bs-snackbar/bs-snackbar.d.ts +7 -0
  404. package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +2 -0
  405. package/dist/types/components/bs-whats-new/bs-whats-new.cmp.test.d.ts +1 -0
  406. package/dist/types/components/bs-whats-new/bs-whats-new.d.ts +147 -0
  407. package/dist/types/components/bs-whats-new/bs-whats-new.stories.d.ts +14 -0
  408. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.cmp.test.d.ts +1 -0
  409. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.d.ts +53 -0
  410. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.stories.d.ts +18 -0
  411. package/dist/types/components.d.ts +2636 -96
  412. package/package.json +1 -1
  413. package/dist/brandsync-wc/p-1c3a43c7.entry.js +0 -1
  414. package/dist/brandsync-wc/p-1c427ffb.entry.js +0 -1
  415. package/dist/brandsync-wc/p-4f2c4929.entry.js +0 -1
  416. package/dist/brandsync-wc/p-76e1c295.entry.js +0 -1
  417. package/dist/brandsync-wc/p-790db8b3.entry.js +0 -1
  418. package/dist/brandsync-wc/p-796a1860.entry.js +0 -1
  419. package/dist/brandsync-wc/p-806a5347.entry.js +0 -1
  420. package/dist/brandsync-wc/p-addfa0a0.entry.js +0 -1
  421. package/dist/brandsync-wc/p-c9a72416.entry.js +0 -1
  422. package/dist/brandsync-wc/p-f006d962.entry.js +0 -1
  423. package/dist/brandsync-wc/p-f074f94e.entry.js +0 -1
  424. package/dist/cjs/bs-menu.cjs.entry.js +0 -39
  425. package/dist/cjs/bs-tab.cjs.entry.js +0 -88
  426. package/dist/cjs/bs-tabs.cjs.entry.js +0 -133
  427. package/dist/components/p-BTvme8CE.js +0 -1
  428. package/dist/components/p-CpUHnsq9.js +0 -1
  429. package/dist/components/p-jDO25SfF.js +0 -1
  430. package/dist/esm/bs-menu.entry.js +0 -37
  431. package/dist/esm/bs-tab.entry.js +0 -86
  432. package/dist/esm/bs-tabs.entry.js +0 -131
@@ -0,0 +1,217 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const sr = (root) => root.shadowRoot;
3
+ const part = (root, p) => sr(root).querySelector(`[part~="${p}"]`);
4
+ const text = (el) => (el?.textContent ?? '').trim();
5
+ const wait = (ms) => new Promise(r => setTimeout(r, ms));
6
+ describe('bs-cookie-consent', () => {
7
+ it('defaults to the banner, built on bs-card, with heading, text and the three actions', async () => {
8
+ const { root } = await render(h("bs-cookie-consent", null));
9
+ expect(root).toEqualAttribute('type', 'banner');
10
+ expect(part(root, 'container').tagName).toBe('BS-CARD');
11
+ expect(text(part(root, 'heading'))).toBe('Your cookie choices');
12
+ expect(text(part(root, 'customise'))).toBe('Customise');
13
+ expect(text(part(root, 'reject'))).toBe('Reject optional');
14
+ expect(text(part(root, 'accept'))).toBe('Accept all');
15
+ });
16
+ it('is a labelled region', async () => {
17
+ const { root } = await render(h("bs-cookie-consent", null));
18
+ expect(part(root, 'container')).toEqualAttribute('role', 'region');
19
+ expect(part(root, 'container')).toEqualAttribute('aria-labelledby', 'heading');
20
+ expect(sr(root).getElementById('heading')).not.toBeNull();
21
+ });
22
+ it('shows the policy link only when policyUrl is set', async () => {
23
+ const a = await render(h("bs-cookie-consent", null));
24
+ expect(part(a.root, 'policy')).toBeNull();
25
+ const b = await render(h("bs-cookie-consent", { policyUrl: "/cookies" }));
26
+ const link = part(b.root, 'policy');
27
+ expect(link.getAttribute('href')).toBe('/cookies');
28
+ expect(text(link)).toBe('Read the cookie policy');
29
+ });
30
+ it('renders the heading at the requested level, clamped to 1-6', async () => {
31
+ const tags = [];
32
+ for (const level of [1, 2, 3, 9]) {
33
+ const { root } = await render(h("bs-cookie-consent", { headingLevel: level }));
34
+ tags.push(part(root, 'heading').tagName);
35
+ }
36
+ expect(tags).toEqual(['H1', 'H2', 'H3', 'H6']);
37
+ });
38
+ it('gives Reject optional the same size as Accept all (fair choice)', async () => {
39
+ const { root } = await render(h("bs-cookie-consent", null));
40
+ const a = part(root, 'accept').getBoundingClientRect();
41
+ const r = part(root, 'reject').getBoundingClientRect();
42
+ expect(r.height).toBe(a.height);
43
+ expect(r.width).toBe(a.width);
44
+ });
45
+ describe('events', () => {
46
+ it('Accept all, Reject optional and Customise', async () => {
47
+ const { root, waitForChanges } = await render(h("bs-cookie-consent", null));
48
+ const events = [];
49
+ root.addEventListener('bsAccept', (e) => events.push(['accept', e.detail]));
50
+ root.addEventListener('bsReject', (e) => events.push(['reject', e.detail]));
51
+ root.addEventListener('bsCustomise', () => events.push('customise'));
52
+ part(root, 'customise').click();
53
+ part(root, 'reject').click();
54
+ part(root, 'accept').click();
55
+ await waitForChanges();
56
+ expect(events).toEqual([
57
+ 'customise',
58
+ ['reject', { choices: { necessary: true, preferences: false, analytics: false, marketing: false } }],
59
+ ['accept', { choices: { necessary: true, preferences: true, analytics: true, marketing: true } }],
60
+ ]);
61
+ });
62
+ });
63
+ describe('banner responsiveness', () => {
64
+ const rects = async (width) => {
65
+ const { root } = await render(h("div", { style: { width: `${width}px` } }, h("bs-cookie-consent", null)));
66
+ await wait(100);
67
+ const el = root.querySelector('bs-cookie-consent');
68
+ return { content: part(el, 'heading').getBoundingClientRect(), accept: part(el, 'accept').getBoundingClientRect(), customise: part(el, 'customise').getBoundingClientRect() };
69
+ };
70
+ it('lays the actions out beside the copy in a wide container', async () => {
71
+ const r = await rects(1200);
72
+ expect(r.accept.top).toBeLessThan(r.content.bottom + 40);
73
+ expect(r.customise.left).toBeLessThan(r.accept.left);
74
+ });
75
+ it('stacks full-width buttons, Accept all first, in a narrow container', async () => {
76
+ const r = await rects(332);
77
+ expect(r.accept.top).toBeLessThan(r.customise.top);
78
+ expect(r.accept.width).toBeGreaterThan(280);
79
+ });
80
+ });
81
+ describe('card', () => {
82
+ it('is the compact form: 420px, header with tile, a divider and Customise on the left', async () => {
83
+ const { root: wrap } = await render(h("div", { style: { width: '800px' } }, h("bs-cookie-consent", { type: "card", policyUrl: "/c" })));
84
+ const root = wrap.querySelector('bs-cookie-consent');
85
+ expect(part(root, 'container').getBoundingClientRect().width).toBe(420);
86
+ expect(text(part(root, 'heading'))).toBe('Cookies on this site');
87
+ expect(part(root, 'art').size).toBe('md');
88
+ expect(part(root, 'customise').getBoundingClientRect().left).toBeLessThan(part(root, 'reject').getBoundingClientRect().left);
89
+ });
90
+ });
91
+ describe('preferences', () => {
92
+ const cats = (root) => Array.from(sr(root).querySelectorAll('[part~="category"]'));
93
+ it('is 560px wide with the four default categories, a close button and the three footer actions', async () => {
94
+ const { root: wrap } = await render(h("div", { style: { width: '800px' } }, h("bs-cookie-consent", { type: "preferences" })));
95
+ const root = wrap.querySelector('bs-cookie-consent');
96
+ expect(part(root, 'container').getBoundingClientRect().width).toBe(560);
97
+ expect(text(part(root, 'heading'))).toBe('Cookie preferences');
98
+ expect(cats(root).map(c => text(c.querySelector('.bs-cookie-consent__category-name')))).toEqual(['Strictly necessary', 'Preferences', 'Analytics', 'Marketing']);
99
+ expect(part(root, 'close')).not.toBeNull();
100
+ expect(text(part(root, 'reject'))).toBe('Reject optional');
101
+ expect(text(part(root, 'accept'))).toBe('Accept all');
102
+ expect(text(part(root, 'save'))).toBe('Save choices');
103
+ });
104
+ it('matches the Figma spacing: with a cookie list under every category and the first expanded, the dialog is 834px tall', async () => {
105
+ const three = ['a — one.', 'b — two.', 'c — three.'];
106
+ const { root: wrap } = await render(h("div", { style: { width: '800px' } }, h("bs-cookie-consent", { type: "preferences", categories: [
107
+ { id: 'n', label: 'Strictly necessary', description: 'Needed for sign-in, security and to keep the service running. These cannot be turned off.', required: true, cookies: three },
108
+ { id: 'p', label: 'Preferences', description: 'Remember your language, theme and table layouts on this device.', enabled: true, cookies: three },
109
+ { id: 'a', label: 'Analytics', description: 'Help us understand which features are used so we can improve them. Data is anonymised.', cookies: three },
110
+ { id: 'm', label: 'Marketing', description: 'Show relevant EG products on other websites.', cookies: three },
111
+ ] })));
112
+ const root = wrap.querySelector('bs-cookie-consent');
113
+ sr(root).querySelector('button.bs-cookie-consent__disclosure').click();
114
+ await wait(300);
115
+ expect(Math.abs(part(root, 'container').getBoundingClientRect().height - 834)).toBeLessThanOrEqual(1);
116
+ // Each divider is an 8px row with the 1px line centred in it.
117
+ expect(sr(root).querySelector('.bs-cookie-consent__rule').getBoundingClientRect().height).toBe(8);
118
+ });
119
+ it('shows "Always on" for required categories and a named switch for the rest', async () => {
120
+ const { root } = await render(h("bs-cookie-consent", { type: "preferences" }));
121
+ const [necessary, preferences] = cats(root);
122
+ expect(text(necessary.querySelector('bs-chip-informative'))).toBe('Always on');
123
+ expect(necessary.querySelector('bs-switch')).toBeNull();
124
+ const sw = preferences.querySelector('bs-switch');
125
+ expect(sw.ariaLabel).toBe('Preferences');
126
+ expect(sw.checked).toBe(true);
127
+ expect(cats(root)[2].querySelector('bs-switch').checked).toBe(false);
128
+ });
129
+ it('expands and collapses the cookie list, with aria-expanded', async () => {
130
+ const { root, waitForChanges } = await render(h("bs-cookie-consent", { type: "preferences" }));
131
+ const toggle = () => sr(root).querySelector('button.bs-cookie-consent__disclosure');
132
+ expect(text(toggle())).toBe('See 3 cookies');
133
+ expect(toggle()).toEqualAttribute('aria-expanded', 'false');
134
+ expect(sr(root).querySelector('ol')).toBeNull();
135
+ toggle().click();
136
+ await waitForChanges();
137
+ expect(toggle()).toEqualAttribute('aria-expanded', 'true');
138
+ expect(Array.from(sr(root).querySelectorAll('ol li')).map(text)).toHaveLength(3);
139
+ toggle().click();
140
+ await waitForChanges();
141
+ expect(sr(root).querySelector('ol')).toBeNull();
142
+ });
143
+ it('emits bsChoice when a switch is toggled, and bsSave with the current choices', async () => {
144
+ const { root, waitForChanges } = await render(h("bs-cookie-consent", { type: "preferences" }));
145
+ const events = [];
146
+ root.addEventListener('bsChoice', (e) => events.push(['choice', e.detail]));
147
+ root.addEventListener('bsSave', (e) => events.push(['save', e.detail]));
148
+ cats(root)[2].querySelector('bs-switch').dispatchEvent(new CustomEvent('bsChange', { detail: true }));
149
+ await waitForChanges();
150
+ part(root, 'save').click();
151
+ await waitForChanges();
152
+ expect(events).toEqual([
153
+ ['choice', { id: 'analytics', enabled: true }],
154
+ ['save', { choices: { necessary: true, preferences: true, analytics: true, marketing: false } }],
155
+ ]);
156
+ });
157
+ it('takes custom categories, with their cookies and initial state', async () => {
158
+ const { root } = await render(h("bs-cookie-consent", { type: "preferences", categories: [
159
+ { id: 'necessary', label: 'Needed', required: true },
160
+ { id: 'stats', label: 'Statistics', enabled: true, cookies: ['a', 'b'] },
161
+ ] }));
162
+ expect(cats(root)).toHaveLength(2);
163
+ expect(text(sr(root).querySelector('button.bs-cookie-consent__disclosure'))).toBe('See 2 cookies');
164
+ let detail;
165
+ root.addEventListener('bsSave', (e) => (detail = e.detail));
166
+ part(root, 'save').click();
167
+ expect(detail).toEqual({ choices: { necessary: true, stats: true } });
168
+ });
169
+ it('Accept all / Reject optional report the right choices for custom categories', async () => {
170
+ const { root } = await render(h("bs-cookie-consent", { type: "preferences", categories: [{ id: 'n', label: 'N', required: true }, { id: 'x', label: 'X' }] }));
171
+ const got = [];
172
+ root.addEventListener('bsAccept', (e) => got.push(e.detail));
173
+ root.addEventListener('bsReject', (e) => got.push(e.detail));
174
+ part(root, 'accept').click();
175
+ part(root, 'reject').click();
176
+ expect(got).toEqual([{ choices: { n: true, x: true } }, { choices: { n: true, x: false } }]);
177
+ });
178
+ it('emits bsClose', async () => {
179
+ const { root, waitForChanges } = await render(h("bs-cookie-consent", { type: "preferences" }));
180
+ let closed = 0;
181
+ root.addEventListener('bsClose', () => closed++);
182
+ part(root, 'close').click();
183
+ await waitForChanges();
184
+ expect(closed).toBe(1);
185
+ });
186
+ it('is a labelled group', async () => {
187
+ const { root } = await render(h("bs-cookie-consent", { type: "preferences" }));
188
+ expect(part(root, 'container')).toEqualAttribute('role', 'group');
189
+ });
190
+ });
191
+ describe('saved', () => {
192
+ it('is a snackbar with the message, a Change action and no close button', async () => {
193
+ const { root, waitForChanges } = await render(h("bs-cookie-consent", { type: "saved" }));
194
+ const bar = part(root, 'container');
195
+ expect(bar.tagName).toBe('BS-SNACKBAR');
196
+ expect(bar.textContent).toContain('Cookie choices saved');
197
+ expect(bar.shadowRoot.querySelector('[part="close"]')).toBeNull();
198
+ let managed = 0;
199
+ root.addEventListener('bsManage', () => managed++);
200
+ bar.shadowRoot.querySelector('[part="action"]').click();
201
+ await waitForChanges();
202
+ expect(managed).toBe(1);
203
+ expect(bar.shadowRoot.querySelector('[part="action"]').textContent).toContain('Change');
204
+ // Figma: 32px check icon, and a 44px Change action.
205
+ expect(bar.shadowRoot.querySelector('[part="icon"]').getBoundingClientRect().width).toBe(32);
206
+ expect(bar.shadowRoot.querySelector('[part="action"]').getBoundingClientRect().height).toBe(44);
207
+ });
208
+ it('is 660x64 with the message on one line, as in the Figma', async () => {
209
+ const { root: wrap } = await render(h("div", { style: { width: '700px' } }, h("bs-cookie-consent", { type: "saved", description: "Cookie choices saved. Change them any time under Settings \u203A Privacy." })));
210
+ await wait(200);
211
+ const bar = wrap.querySelector('bs-cookie-consent').shadowRoot.querySelector('[part="container"]');
212
+ const box = bar.getBoundingClientRect();
213
+ expect(box.width).toBe(660);
214
+ expect(box.height).toBe(64);
215
+ });
216
+ });
217
+ });
@@ -0,0 +1,350 @@
1
+ /**
2
+ * @prop --bs-cookie-consent-width: Width of the `card` (420px), `preferences` (560px) and `saved` (660px) forms. The `banner` always fills its container. Never wider than the container.
3
+ * @prop --bs-cookie-consent-bg: Card background. Aliased to --bs-paper-bg-base (the `bs-card` base surface).
4
+ * @prop --bs-cookie-consent-radius: Card corner radius. Aliased to --bs-border-radius-150 (12px).
5
+ * @prop --bs-cookie-consent-padding: Card padding. Aliased to --bs-spacing-200 (16px).
6
+ * @prop --bs-cookie-consent-shadow: Card shadow. 0 8px 8px --bs-elevation-higher (Figma).
7
+ * @prop --bs-cookie-consent-color: Heading colour. Aliased to --bs-text-default.
8
+ * @prop --bs-cookie-consent-color-secondary: Paragraph colour. Aliased to --bs-text-secondary.
9
+ * @prop --bs-cookie-consent-link: Policy link text colour. Aliased to --bs-text-link.
10
+ * @prop --bs-cookie-consent-link-underline: Policy link underline colour. Aliased to --bs-border-info.
11
+ * @prop --bs-cookie-consent-rule: Divider colour. Aliased to --bs-border-default.
12
+ * @prop --bs-cookie-consent-banner-breakpoint: Documentation only -- the `banner` stacks into a column below a container width of 720px (CSS can't read a custom property in a container query).
13
+ */
14
+ :host {
15
+ display: block;
16
+ /* The banner reacts to its own width, not the viewport's: it may sit in a narrow panel. */
17
+ container-type: inline-size;
18
+ max-width: 100%;
19
+
20
+ --bs-cookie-consent-width: 420px;
21
+ --bs-cookie-consent-bg: var(--bs-paper-bg-base);
22
+ --bs-cookie-consent-radius: var(--bs-border-radius-150);
23
+ --bs-cookie-consent-padding: var(--bs-spacing-200);
24
+ --bs-cookie-consent-shadow: 0 8px 8px var(--bs-elevation-higher);
25
+ --bs-cookie-consent-color: var(--bs-text-default);
26
+ --bs-cookie-consent-color-secondary: var(--bs-text-secondary);
27
+ --bs-cookie-consent-link: var(--bs-text-link);
28
+ --bs-cookie-consent-link-underline: var(--bs-border-info);
29
+ --bs-cookie-consent-rule: var(--bs-border-default);
30
+ }
31
+
32
+ :host([type='card']) {
33
+ width: var(--bs-cookie-consent-width);
34
+ }
35
+
36
+ :host([type='preferences']) {
37
+ --bs-cookie-consent-width: 560px;
38
+ width: var(--bs-cookie-consent-width);
39
+ }
40
+
41
+ :host([type='saved']) {
42
+ --bs-cookie-consent-width: 660px;
43
+ width: var(--bs-cookie-consent-width);
44
+ }
45
+
46
+ /* bs-card supplies the surface; this only sets how it looks here. */
47
+ .bs-cookie-consent--banner,
48
+ .bs-cookie-consent--card,
49
+ .bs-cookie-consent--preferences {
50
+ --bs-card-bg: var(--bs-cookie-consent-bg);
51
+ --bs-card-radius: var(--bs-cookie-consent-radius);
52
+ --bs-card-padding: var(--bs-cookie-consent-padding);
53
+ --bs-card-shadow: var(--bs-cookie-consent-shadow);
54
+ color: var(--bs-cookie-consent-color);
55
+ }
56
+
57
+ .bs-cookie-consent p {
58
+ margin: 0;
59
+ }
60
+
61
+ .bs-cookie-consent__glyph,
62
+ ::slotted([slot='icon']) {
63
+ width: var(--bs-cookie-consent-glyph-size, 24px);
64
+ height: var(--bs-cookie-consent-glyph-size, 24px);
65
+ }
66
+
67
+ bs-icon-tile[size='md'] {
68
+ --bs-cookie-consent-glyph-size: 16px;
69
+ }
70
+
71
+ .bs-cookie-consent__heading {
72
+ margin: 0;
73
+ font-size: var(--bs-font-size-2xl);
74
+ font-weight: var(--bs-font-weight-bold);
75
+ line-height: 32px;
76
+ }
77
+
78
+ .bs-cookie-consent__description {
79
+ color: var(--bs-cookie-consent-color-secondary);
80
+ font-size: var(--bs-font-size-md);
81
+ line-height: 24px;
82
+ }
83
+
84
+ .bs-cookie-consent__policy {
85
+ align-self: flex-start;
86
+ border-bottom: 1px solid var(--bs-cookie-consent-link-underline);
87
+ color: var(--bs-cookie-consent-link);
88
+ font-size: var(--bs-font-size-sm);
89
+ line-height: 20px;
90
+ text-decoration: none;
91
+ }
92
+
93
+ .bs-cookie-consent__policy:focus-visible {
94
+ outline: 2px solid var(--bs-border-neutral-focus);
95
+ outline-offset: 2px;
96
+ }
97
+
98
+ .bs-cookie-consent__rule {
99
+ height: 8px;
100
+ background: linear-gradient(var(--bs-cookie-consent-rule), var(--bs-cookie-consent-rule)) center / 100% 1px no-repeat;
101
+ }
102
+
103
+ .bs-cookie-consent__spacer {
104
+ flex: 1 1 0;
105
+ }
106
+
107
+ /* --- buttons -------------------------------------------------------------------------------- */
108
+ .bs-cookie-consent__actions bs-button {
109
+ --bs-button-height-md: var(--bs-spacing-550);
110
+ }
111
+
112
+ .bs-cookie-consent__text-button {
113
+ --bs-button-subtle-color: var(--bs-text-action);
114
+ }
115
+
116
+ /* Figma gives the buttons fixed widths; minimums here, so a longer (translated) label can still grow. */
117
+ .bs-cookie-consent__actions--banner bs-button {
118
+ min-width: 140px;
119
+ }
120
+
121
+ .bs-cookie-consent__actions bs-button[part='reject'] {
122
+ min-width: 140px;
123
+ }
124
+
125
+ .bs-cookie-consent__actions bs-button[part='accept'] {
126
+ min-width: 103px;
127
+ }
128
+
129
+ .bs-cookie-consent__actions--banner bs-button[part='accept'] {
130
+ min-width: 140px;
131
+ }
132
+
133
+ .bs-cookie-consent__actions bs-button[part='save'] {
134
+ min-width: 127px;
135
+ }
136
+
137
+ .bs-cookie-consent__actions bs-button[part='customise'] {
138
+ min-width: 109px;
139
+ }
140
+
141
+ .bs-cookie-consent__actions--banner bs-button[part='customise'] {
142
+ min-width: 140px;
143
+ }
144
+
145
+ /* --- banner --------------------------------------------------------------------------------- */
146
+ .bs-cookie-consent__banner {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: var(--bs-spacing-200);
150
+ }
151
+
152
+ .bs-cookie-consent__banner-content {
153
+ display: flex;
154
+ align-items: flex-start;
155
+ gap: var(--bs-spacing-200);
156
+ flex: 1 1 0;
157
+ min-width: 0;
158
+ }
159
+
160
+ bs-icon-tile {
161
+ flex: none;
162
+ }
163
+
164
+ .bs-cookie-consent__copy {
165
+ display: flex;
166
+ flex-direction: column;
167
+ align-items: flex-start;
168
+ gap: var(--bs-spacing-100);
169
+ min-width: 0;
170
+ }
171
+
172
+ .bs-cookie-consent__actions {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: var(--bs-spacing-100);
176
+ }
177
+
178
+ .bs-cookie-consent__actions--banner {
179
+ flex: none;
180
+ justify-content: flex-end;
181
+ }
182
+
183
+ /* Narrow container: the actions drop under the copy, full width, Accept all first. */
184
+ @container (max-width: 719px) {
185
+ .bs-cookie-consent__banner {
186
+ flex-direction: column;
187
+ align-items: stretch;
188
+ }
189
+
190
+ .bs-cookie-consent__banner-content {
191
+ flex-direction: column;
192
+ gap: var(--bs-spacing-150);
193
+ }
194
+
195
+ .bs-cookie-consent__actions--banner {
196
+ flex-direction: column-reverse;
197
+ align-items: stretch;
198
+ }
199
+
200
+ .bs-cookie-consent__actions--banner bs-button {
201
+ --bs-button-width: 100%;
202
+ }
203
+ }
204
+
205
+ /* --- card ----------------------------------------------------------------------------------- */
206
+ .bs-cookie-consent__card {
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: var(--bs-spacing-100);
210
+ }
211
+
212
+ /* Figma: the dialog's rows are 12px apart (spacing/150), and each divider is an 8px-tall row with a 1px
213
+ line centred in it -- so 12px of space, 4px of row, the line, 4px of row, 12px of space. */
214
+ .bs-cookie-consent__prefs {
215
+ display: flex;
216
+ flex-direction: column;
217
+ gap: var(--bs-spacing-150);
218
+ }
219
+
220
+ .bs-cookie-consent__card .bs-cookie-consent__policy {
221
+ margin-bottom: 0;
222
+ }
223
+
224
+ .bs-cookie-consent__head {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 10px;
228
+ }
229
+
230
+ .bs-cookie-consent--preferences .bs-cookie-consent__head {
231
+ gap: var(--bs-spacing-100);
232
+ }
233
+
234
+ .bs-cookie-consent__head .bs-cookie-consent__heading {
235
+ min-width: 0;
236
+ }
237
+
238
+ .bs-cookie-consent__head bs-icon-button svg {
239
+ width: 20px;
240
+ height: 20px;
241
+ }
242
+
243
+ .bs-cookie-consent__actions--card,
244
+ .bs-cookie-consent__actions--prefs {
245
+ gap: var(--bs-spacing-100);
246
+ }
247
+
248
+ .bs-cookie-consent__actions--card {
249
+ align-items: flex-end;
250
+ justify-content: space-between;
251
+ }
252
+
253
+ /* --- preferences ---------------------------------------------------------------------------- */
254
+ .bs-cookie-consent__category {
255
+ display: flex;
256
+ flex-direction: column;
257
+ gap: 6px;
258
+ }
259
+
260
+ /* Figma: only the first category (strictly necessary) has vertical padding. */
261
+ .bs-cookie-consent__prefs > .bs-cookie-consent__description + .bs-cookie-consent__category {
262
+ padding: 6px 0;
263
+ }
264
+
265
+ .bs-cookie-consent__category-head {
266
+ display: flex;
267
+ align-items: center;
268
+ justify-content: space-between;
269
+ gap: var(--bs-spacing-100);
270
+ }
271
+
272
+ /* Figma: a row with a switch is as tall as the 48px switch box; the "Always on" row isn't. */
273
+ .bs-cookie-consent__category-head--switch {
274
+ min-height: 48px;
275
+ }
276
+
277
+ /* Figma: with a switch, the header row and the description sit flush (the 48px switch box already supplies the
278
+ air); the "Always on" category keeps its 6px gap. */
279
+ .bs-cookie-consent__category-head--switch + .bs-cookie-consent__category-text {
280
+ margin-top: -6px;
281
+ }
282
+
283
+ .bs-cookie-consent__category-name {
284
+ font-size: var(--bs-font-size-sm);
285
+ font-weight: var(--bs-font-weight-semibold);
286
+ line-height: 20px;
287
+ }
288
+
289
+ .bs-cookie-consent__category-text {
290
+ color: var(--bs-cookie-consent-color-secondary);
291
+ font-size: var(--bs-font-size-sm);
292
+ line-height: 20px;
293
+ }
294
+
295
+ .bs-cookie-consent__disclosure {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: var(--bs-spacing-100);
299
+ min-height: 32px;
300
+ padding: 0;
301
+ border: none;
302
+ background: transparent;
303
+ color: var(--bs-text-action);
304
+ font-family: inherit;
305
+ font-size: var(--bs-font-size-md);
306
+ font-weight: var(--bs-font-weight-semibold);
307
+ line-height: 24px;
308
+ cursor: pointer;
309
+ }
310
+
311
+ .bs-cookie-consent__disclosure svg {
312
+ width: 24px;
313
+ height: 24px;
314
+ }
315
+
316
+ .bs-cookie-consent__disclosure:focus-visible {
317
+ outline: 2px solid var(--bs-border-neutral-focus);
318
+ outline-offset: 2px;
319
+ border-radius: var(--bs-border-radius-50);
320
+ }
321
+
322
+ .bs-cookie-consent__cookie-list {
323
+ margin: 0;
324
+ padding-inline-start: 21px;
325
+ color: var(--bs-cookie-consent-color-secondary);
326
+ font-size: var(--bs-font-size-sm);
327
+ line-height: 20px;
328
+ }
329
+
330
+ /* --- saved ---------------------------------------------------------------------------------- */
331
+ .bs-cookie-consent--saved {
332
+ display: block;
333
+ /* Figma: a 32px check circle (bs-snackbar's default is 24px), which makes the bar 64px tall. */
334
+ --bs-snackbar-icon-size: 32px;
335
+ /* Figma: the Change action sits right against the message with no gap, so the message gets the room it
336
+ needs to stay on one line. It keeps the snackbar's own 8px right padding so the button's hover/pressed
337
+ background doesn't touch the bar's edge. */
338
+ --bs-snackbar-gap: 0px;
339
+ }
340
+
341
+ /* Figma: the Change action is plain text in the snackbar's own text colour (white on the dark bar). The
342
+ outlined blue button bs-snackbar uses by default would be unreadable on it. */
343
+ .bs-cookie-consent--saved::part(action) {
344
+ --bs-button-subtle-color: var(--bs-snackbar-text-default);
345
+ --bs-button-subtle-hover: color-mix(in srgb, var(--bs-snackbar-text-default) 16%, transparent);
346
+ --bs-button-subtle-pressed: color-mix(in srgb, var(--bs-snackbar-text-default) 24%, transparent);
347
+ /* Figma: the Change action is 44px high (bs-button's sm is 40px) and medium weight. */
348
+ --bs-button-height-sm: var(--bs-spacing-550);
349
+ --bs-button-padding-x-sm: var(--bs-spacing-200);
350
+ }