@brandsync/wc 1.9.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 (440) hide show
  1. package/custom-elements.json +8864 -3754
  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-107b1c5d.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-7c94e6ae.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-0e39b9cc.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-6bf2f116.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-6fd7dd6a.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-33e44094.entry.js → p-2368a92e.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-29027559.entry.js → p-247e36ad.entry.js} +1 -1
  20. package/dist/brandsync-wc/{p-ae978c9a.entry.js → p-2497d128.entry.js} +1 -1
  21. package/dist/brandsync-wc/{p-fc240aa0.entry.js → p-282ddbee.entry.js} +1 -1
  22. package/dist/brandsync-wc/{p-0eed6813.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-062cfa34.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-3ec74d35.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-a09e157f.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-cfcf3f0a.entry.js → p-69c0a85d.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-9f65f998.entry.js → p-6a696161.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-8ee0153b.entry.js → p-6c6cdf77.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-051d3064.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-27bbed83.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-de7c946d.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-70f64b25.entry.js → p-a9169157.entry.js} +1 -1
  49. package/dist/brandsync-wc/{p-05c7de28.entry.js → p-afb07368.entry.js} +1 -1
  50. package/dist/brandsync-wc/{p-235ae012.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-c0a92750.entry.js +1 -0
  55. package/dist/brandsync-wc/{p-6331de9c.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-3176d1d3.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-4574a707.entry.js → p-e5daa6ca.entry.js} +1 -1
  61. package/dist/brandsync-wc/{p-c4de155c.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-114d2fd8.entry.js → p-f7d15fbe.entry.js} +1 -1
  64. package/dist/brandsync-wc/{p-a0d5a620.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 +414 -0
  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.cjs.entry.js → bs-input_3.cjs.entry.js} +74 -6
  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 +209 -0
  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 +11 -0
  131. package/dist/collection/components/bs-a11y.cmp.test.js +26 -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 +191 -0
  156. package/dist/collection/components/bs-datepicker/bs-datepicker.css +325 -0
  157. package/dist/collection/components/bs-datepicker/bs-datepicker.js +788 -0
  158. package/dist/collection/components/bs-datepicker/bs-datepicker.stories.js +64 -0
  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 +7 -4
  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.cmp.test.js +141 -0
  207. package/dist/collection/components/bs-timepicker/bs-timepicker.css +204 -0
  208. package/dist/collection/components/bs-timepicker/bs-timepicker.js +511 -0
  209. package/dist/collection/components/bs-timepicker/bs-timepicker.stories.js +44 -0
  210. package/dist/collection/components/bs-toast/bs-toast.js +1 -1
  211. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  212. package/dist/collection/components/bs-whats-new/bs-whats-new.cmp.test.js +200 -0
  213. package/dist/collection/components/bs-whats-new/bs-whats-new.css +315 -0
  214. package/dist/collection/components/bs-whats-new/bs-whats-new.js +790 -0
  215. package/dist/collection/components/bs-whats-new/bs-whats-new.stories.js +105 -0
  216. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.cmp.test.js +79 -0
  217. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.css +131 -0
  218. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +295 -0
  219. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.stories.js +67 -0
  220. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +2 -2
  221. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  222. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  223. package/dist/components/bs-accordion.js +1 -1
  224. package/dist/components/bs-ai-disclaimer.js +1 -1
  225. package/dist/components/bs-ai-greeting.js +1 -1
  226. package/dist/components/bs-ai-thinking.js +1 -1
  227. package/dist/components/bs-attachment-list.js +1 -1
  228. package/dist/components/bs-attachment.js +1 -1
  229. package/dist/components/bs-avatar.js +1 -1
  230. package/dist/components/bs-badge.js +1 -1
  231. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  232. package/dist/components/bs-breadcrumb.js +1 -1
  233. package/dist/components/bs-breadcrumbs.js +1 -1
  234. package/dist/components/bs-button-skeleton.js +1 -1
  235. package/dist/components/bs-button.js +1 -1
  236. package/dist/components/bs-card.js +1 -1
  237. package/dist/components/bs-carousel.js +1 -1
  238. package/dist/components/bs-chatbot-feedback.js +1 -1
  239. package/dist/components/bs-chatbot-header.js +1 -1
  240. package/dist/components/bs-chatbot-response-action.js +1 -1
  241. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  242. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  243. package/dist/components/bs-checkbox-skeleton.js +1 -1
  244. package/dist/components/bs-checkbox.js +1 -1
  245. package/dist/components/bs-chip-filter.js +1 -1
  246. package/dist/components/bs-chip-informative.js +1 -1
  247. package/dist/components/bs-chip-input.js +1 -1
  248. package/dist/components/bs-composer-status-banner.js +1 -1
  249. package/dist/components/bs-composer.js +1 -1
  250. package/dist/components/bs-cookie-consent.d.ts +11 -0
  251. package/dist/components/bs-cookie-consent.js +1 -0
  252. package/dist/components/bs-data-table.js +1 -1
  253. package/dist/components/bs-datepicker.d.ts +11 -0
  254. package/dist/components/bs-datepicker.js +1 -0
  255. package/dist/components/bs-dialog.js +1 -1
  256. package/dist/components/bs-error-page.d.ts +11 -0
  257. package/dist/components/bs-error-page.js +1 -0
  258. package/dist/components/bs-file-upload-item.js +1 -1
  259. package/dist/components/bs-file-upload.js +1 -1
  260. package/dist/components/bs-icon-button.js +1 -1
  261. package/dist/components/bs-icon-tile.d.ts +11 -0
  262. package/dist/components/bs-icon-tile.js +1 -0
  263. package/dist/components/bs-inline-tab.js +1 -1
  264. package/dist/components/bs-input.js +1 -1
  265. package/dist/components/bs-logo.js +1 -1
  266. package/dist/components/bs-menu-item.js +1 -1
  267. package/dist/components/bs-menu.js +1 -1
  268. package/dist/components/bs-navigation-drawer-item.js +1 -1
  269. package/dist/components/bs-navigation-drawer.js +1 -1
  270. package/dist/components/bs-navigation-header.js +1 -1
  271. package/dist/components/bs-onboarding-checklist.d.ts +11 -0
  272. package/dist/components/bs-onboarding-checklist.js +1 -0
  273. package/dist/components/bs-pagination.js +1 -1
  274. package/dist/components/bs-product-tour.d.ts +11 -0
  275. package/dist/components/bs-product-tour.js +1 -0
  276. package/dist/components/bs-progress-linear.js +1 -1
  277. package/dist/components/bs-progress.js +1 -1
  278. package/dist/components/bs-qr-code.d.ts +11 -0
  279. package/dist/components/bs-qr-code.js +1 -0
  280. package/dist/components/bs-radio.js +1 -1
  281. package/dist/components/bs-session-timeout.d.ts +11 -0
  282. package/dist/components/bs-session-timeout.js +1 -0
  283. package/dist/components/bs-slider.js +1 -1
  284. package/dist/components/bs-snackbar.js +1 -1
  285. package/dist/components/bs-source-link.js +1 -1
  286. package/dist/components/bs-stepper-step.js +1 -1
  287. package/dist/components/bs-stepper.js +1 -1
  288. package/dist/components/bs-switch.js +1 -1
  289. package/dist/components/bs-tab.js +1 -1
  290. package/dist/components/bs-tabs.js +1 -1
  291. package/dist/components/bs-timepicker.d.ts +11 -0
  292. package/dist/components/bs-timepicker.js +1 -0
  293. package/dist/components/bs-toast.js +1 -1
  294. package/dist/components/bs-tooltip.js +1 -1
  295. package/dist/components/bs-whats-new-entry.d.ts +11 -0
  296. package/dist/components/bs-whats-new-entry.js +1 -0
  297. package/dist/components/bs-whats-new.d.ts +11 -0
  298. package/dist/components/bs-whats-new.js +1 -0
  299. package/dist/components/index.js +1 -1
  300. package/dist/components/{p-R2MlkUzD.js → p-BEEoVNRu.js} +1 -1
  301. package/dist/components/{p-EtXc94lJ.js → p-BZ3M4lOU.js} +1 -1
  302. package/dist/components/p-B_I4UEMp.js +1 -0
  303. package/dist/components/{p-BfEyD6Ku.js → p-Be9L4_Fe.js} +1 -1
  304. package/dist/components/p-Be_Pmccm.js +1 -0
  305. package/dist/components/p-Bl_tVzeq.js +1 -0
  306. package/dist/components/p-C8yT2Ucq.js +1 -0
  307. package/dist/components/p-CA31vqjL.js +1 -0
  308. package/dist/components/p-CUfs0ROR.js +1 -0
  309. package/dist/components/{p-JYlmcxBn.js → p-CVrEuVFo.js} +1 -1
  310. package/dist/components/{p-BA3c9Rom.js → p-C_j_jDM6.js} +1 -1
  311. package/dist/components/p-CbimDNGY.js +1 -0
  312. package/dist/components/{p-Buly0d5G.js → p-CeUK3n7D.js} +1 -1
  313. package/dist/components/p-CncySD_-.js +1 -0
  314. package/dist/components/p-DE8K7fg0.js +1 -0
  315. package/dist/components/p-Dr0Qk9Zc.js +1 -0
  316. package/dist/components/p-DuLL7Ouw.js +1 -0
  317. package/dist/components/p-YsHQLXET.js +1 -0
  318. package/dist/components/p-qmS2CBqi.js +1 -0
  319. package/dist/components/{p-BoeorHNv.js → p-zTHlbyH6.js} +1 -1
  320. package/dist/esm/brandsync-wc.js +3 -3
  321. package/dist/esm/bs-accordion.entry.js +1 -1
  322. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  323. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  324. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  325. package/dist/esm/bs-attachment-list.entry.js +2 -2
  326. package/dist/esm/bs-attachment.entry.js +1 -1
  327. package/dist/esm/bs-avatar.entry.js +1 -1
  328. package/dist/esm/bs-badge.entry.js +1 -1
  329. package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
  330. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  331. package/dist/esm/bs-breadcrumbs.entry.js +2 -2
  332. package/dist/esm/bs-button-skeleton.entry.js +2 -2
  333. package/dist/esm/bs-button.entry.js +3 -3
  334. package/dist/esm/bs-card.entry.js +3 -3
  335. package/dist/esm/bs-carousel.entry.js +1 -1
  336. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  337. package/dist/esm/bs-chatbot-header.entry.js +2 -2
  338. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  339. package/dist/esm/bs-chatbot-sources-drawer.entry.js +2 -2
  340. package/dist/esm/bs-chatbot-suggestion-button.entry.js +2 -2
  341. package/dist/esm/bs-checkbox-skeleton.entry.js +2 -2
  342. package/dist/esm/bs-checkbox.entry.js +1 -1
  343. package/dist/esm/bs-chip-filter.entry.js +1 -1
  344. package/dist/esm/bs-chip-informative.entry.js +1 -1
  345. package/dist/esm/bs-chip-input.entry.js +1 -1
  346. package/dist/esm/bs-composer-status-banner.entry.js +1 -1
  347. package/dist/esm/bs-composer.entry.js +1 -1
  348. package/dist/esm/bs-cookie-consent.entry.js +184 -0
  349. package/dist/esm/bs-data-table.entry.js +1 -1
  350. package/dist/esm/bs-datepicker.entry.js +412 -0
  351. package/dist/esm/bs-dialog.entry.js +1 -1
  352. package/dist/esm/bs-error-page.entry.js +101 -0
  353. package/dist/esm/bs-file-upload-item.entry.js +2 -2
  354. package/dist/esm/bs-file-upload.entry.js +2 -2
  355. package/dist/esm/bs-icon-button.entry.js +2 -2
  356. package/dist/esm/bs-icon-tile.entry.js +50 -0
  357. package/dist/esm/bs-inline-tab.entry.js +2 -2
  358. package/dist/esm/{bs-input.entry.js → bs-input_3.entry.js} +73 -7
  359. package/dist/esm/bs-logo.entry.js +1 -1
  360. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  361. package/dist/esm/bs-navigation-drawer.entry.js +3 -3
  362. package/dist/esm/bs-navigation-header.entry.js +2 -2
  363. package/dist/esm/bs-onboarding-checklist.entry.js +159 -0
  364. package/dist/esm/bs-pagination.entry.js +2 -2
  365. package/dist/esm/bs-product-tour.entry.js +76 -0
  366. package/dist/esm/bs-progress-linear.entry.js +4 -4
  367. package/dist/esm/bs-progress.entry.js +3 -3
  368. package/dist/esm/bs-qr-code.entry.js +146 -0
  369. package/dist/esm/bs-radio.entry.js +2 -2
  370. package/dist/esm/bs-session-timeout.entry.js +213 -0
  371. package/dist/esm/bs-slider.entry.js +2 -2
  372. package/dist/esm/bs-snackbar.entry.js +9 -3
  373. package/dist/esm/bs-source-link.entry.js +3 -3
  374. package/dist/esm/bs-stepper-step.entry.js +2 -2
  375. package/dist/esm/bs-stepper.entry.js +2 -2
  376. package/dist/esm/bs-switch.entry.js +2 -2
  377. package/dist/esm/bs-tab_3.entry.js +251 -0
  378. package/dist/esm/bs-timepicker.entry.js +207 -0
  379. package/dist/esm/bs-toast.entry.js +2 -2
  380. package/dist/esm/bs-tooltip.entry.js +2 -2
  381. package/dist/esm/bs-whats-new.entry.js +142 -0
  382. package/dist/esm/{index-AgoOSYvW.js → index-DqQRXQMx.js} +15 -3
  383. package/dist/esm/loader.js +3 -3
  384. package/dist/types/components/bs-button/bs-button/bs-button.d.ts +3 -0
  385. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.cmp.test.d.ts +1 -0
  386. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.d.ts +136 -0
  387. package/dist/types/components/bs-cookie-consent/bs-cookie-consent.stories.d.ts +16 -0
  388. package/dist/types/components/bs-datepicker/bs-datepicker.cmp.test.d.ts +1 -0
  389. package/dist/types/components/bs-datepicker/bs-datepicker.d.ts +138 -0
  390. package/dist/types/components/bs-datepicker/bs-datepicker.stories.d.ts +20 -0
  391. package/dist/types/components/bs-error-page/bs-error-page.cmp.test.d.ts +1 -0
  392. package/dist/types/components/bs-error-page/bs-error-page.d.ts +60 -0
  393. package/dist/types/components/bs-error-page/bs-error-page.stories.d.ts +22 -0
  394. package/dist/types/components/bs-icon-tile/bs-icon-tile.cmp.test.d.ts +1 -0
  395. package/dist/types/components/bs-icon-tile/bs-icon-tile.d.ts +40 -0
  396. package/dist/types/components/bs-icon-tile/bs-icon-tile.stories.d.ts +13 -0
  397. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.cmp.test.d.ts +1 -0
  398. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.d.ts +140 -0
  399. package/dist/types/components/bs-onboarding-checklist/bs-onboarding-checklist.stories.d.ts +18 -0
  400. package/dist/types/components/bs-product-tour/bs-product-tour.cmp.test.d.ts +1 -0
  401. package/dist/types/components/bs-product-tour/bs-product-tour.d.ts +78 -0
  402. package/dist/types/components/bs-product-tour/bs-product-tour.stories.d.ts +19 -0
  403. package/dist/types/components/bs-qr-code/bs-qr-code.cmp.test.d.ts +1 -0
  404. package/dist/types/components/bs-qr-code/bs-qr-code.d.ts +124 -0
  405. package/dist/types/components/bs-qr-code/bs-qr-code.stories.d.ts +28 -0
  406. package/dist/types/components/bs-session-timeout/bs-session-timeout.cmp.test.d.ts +1 -0
  407. package/dist/types/components/bs-session-timeout/bs-session-timeout.d.ts +141 -0
  408. package/dist/types/components/bs-session-timeout/bs-session-timeout.stories.d.ts +19 -0
  409. package/dist/types/components/bs-snackbar/bs-snackbar.d.ts +7 -0
  410. package/dist/types/components/bs-timepicker/bs-timepicker.cmp.test.d.ts +1 -0
  411. package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +103 -0
  412. package/dist/types/components/bs-timepicker/bs-timepicker.stories.d.ts +14 -0
  413. package/dist/types/components/bs-whats-new/bs-whats-new.cmp.test.d.ts +1 -0
  414. package/dist/types/components/bs-whats-new/bs-whats-new.d.ts +147 -0
  415. package/dist/types/components/bs-whats-new/bs-whats-new.stories.d.ts +14 -0
  416. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.cmp.test.d.ts +1 -0
  417. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.d.ts +53 -0
  418. package/dist/types/components/bs-whats-new-entry/bs-whats-new-entry.stories.d.ts +18 -0
  419. package/dist/types/components.d.ts +3072 -17
  420. package/package.json +1 -1
  421. package/dist/brandsync-wc/p-2891d40b.entry.js +0 -1
  422. package/dist/brandsync-wc/p-36bf37d9.entry.js +0 -1
  423. package/dist/brandsync-wc/p-3b64e3cd.entry.js +0 -1
  424. package/dist/brandsync-wc/p-4e5dcaff.entry.js +0 -1
  425. package/dist/brandsync-wc/p-7b00dd36.entry.js +0 -1
  426. package/dist/brandsync-wc/p-c10d2529.entry.js +0 -1
  427. package/dist/brandsync-wc/p-f006d962.entry.js +0 -1
  428. package/dist/brandsync-wc/p-f074f94e.entry.js +0 -1
  429. package/dist/brandsync-wc/p-f7d47c17.entry.js +0 -1
  430. package/dist/brandsync-wc/p-fddc7bd1.entry.js +0 -1
  431. package/dist/cjs/bs-menu-item.cjs.entry.js +0 -34
  432. package/dist/cjs/bs-menu.cjs.entry.js +0 -39
  433. package/dist/cjs/bs-tab.cjs.entry.js +0 -88
  434. package/dist/cjs/bs-tabs.cjs.entry.js +0 -133
  435. package/dist/components/p-CpUHnsq9.js +0 -1
  436. package/dist/components/p-wei0Ija2.js +0 -1
  437. package/dist/esm/bs-menu-item.entry.js +0 -32
  438. package/dist/esm/bs-menu.entry.js +0 -37
  439. package/dist/esm/bs-tab.entry.js +0 -86
  440. package/dist/esm/bs-tabs.entry.js +0 -131
@@ -0,0 +1,103 @@
1
+ import { html } from "lit";
2
+ import { ifDefined } from "lit/directives/if-defined.js";
3
+ import { componentDescription, propDescription } from "../../stories-utils";
4
+ const PREFERENCE_CATEGORIES = [
5
+ {
6
+ id: 'necessary',
7
+ label: 'Strictly necessary',
8
+ description: 'Needed for sign-in, security and to keep the service running. These cannot be turned off.',
9
+ required: true,
10
+ cookies: [
11
+ 'Session cookie — keeps you signed in as you move between pages.',
12
+ 'Security cookie — helps prevent fraud and unauthorized access.',
13
+ 'Consent cookie — remembers your cookie consent choices.',
14
+ ],
15
+ },
16
+ {
17
+ id: 'preferences',
18
+ label: 'Preferences',
19
+ description: 'Remember your language, theme and table layouts on this device.',
20
+ enabled: true,
21
+ cookies: ['Language cookie — remembers your language.', 'Theme cookie — remembers light or dark mode.', 'Layout cookie — remembers your table columns.'],
22
+ },
23
+ {
24
+ id: 'analytics',
25
+ label: 'Analytics',
26
+ description: 'Help us understand which features are used so we can improve them. Data is anonymised.',
27
+ cookies: ['Usage cookie — counts visits to each page.', 'Feature cookie — records which features are used.', 'Performance cookie — measures how fast pages load.'],
28
+ },
29
+ {
30
+ id: 'marketing',
31
+ label: 'Marketing',
32
+ description: 'Show relevant EG products on other websites.',
33
+ cookies: ['Campaign cookie — links a visit to a campaign.', 'Audience cookie — groups visitors by interest.', 'Retargeting cookie — shows our ads elsewhere.'],
34
+ },
35
+ ];
36
+ const meta = {
37
+ title: 'Components/bs-cookie-consent',
38
+ parameters: { docs: { description: { component: componentDescription('bs-cookie-consent') } } },
39
+ decorators: [story => html `<div style="padding: 16px; background: var(--bs-color-neutral-container);">${story()}</div>`],
40
+ render: args => html `
41
+ <bs-cookie-consent
42
+ type=${args.type}
43
+ heading=${ifDefined(args.heading || undefined)}
44
+ description=${ifDefined(args.description || undefined)}
45
+ policy-url=${ifDefined(args.policyUrl || undefined)}
46
+ .categories=${PREFERENCE_CATEGORIES}
47
+ @bsAccept=${(ev) => console.log('bsAccept', ev.detail)}
48
+ @bsReject=${(ev) => console.log('bsReject', ev.detail)}
49
+ @bsCustomise=${() => console.log('bsCustomise')}
50
+ @bsSave=${(ev) => console.log('bsSave', ev.detail)}
51
+ @bsChoice=${(ev) => console.log('bsChoice', ev.detail)}
52
+ @bsClose=${() => console.log('bsClose')}
53
+ @bsManage=${() => console.log('bsManage')}
54
+ ></bs-cookie-consent>
55
+ `,
56
+ argTypes: {
57
+ type: { control: 'inline-radio', options: ['banner', 'card', 'preferences', 'saved'], description: propDescription('bs-cookie-consent', 'type') },
58
+ heading: { control: 'text', description: propDescription('bs-cookie-consent', 'heading') },
59
+ description: { control: 'text', description: propDescription('bs-cookie-consent', 'description') },
60
+ policyUrl: { control: 'text', description: propDescription('bs-cookie-consent', 'policyUrl') },
61
+ },
62
+ args: { type: 'banner', heading: '', description: '', policyUrl: '#cookie-policy' },
63
+ };
64
+ export default meta;
65
+ export const Banner = {};
66
+ export const BannerNarrow = {
67
+ name: 'Banner (narrow container)',
68
+ render: args => html `
69
+ <div style="width: 332px;">
70
+ <bs-cookie-consent type="banner" policy-url=${args.policyUrl}></bs-cookie-consent>
71
+ </div>
72
+ `,
73
+ };
74
+ export const CompactCard = {
75
+ name: 'Compact card',
76
+ args: { type: 'card' },
77
+ };
78
+ export const PreferencesDialog = {
79
+ name: 'Preferences dialog',
80
+ args: { type: 'preferences' },
81
+ };
82
+ export const SavedConfirmation = {
83
+ name: 'Saved confirmation',
84
+ args: { type: 'saved' },
85
+ };
86
+ // The flow: banner -> Customise -> preferences -> Save -> saved confirmation -> Change -> preferences.
87
+ export const Flow = {
88
+ render: () => html `
89
+ <div id="flow">
90
+ <bs-cookie-consent
91
+ type="banner"
92
+ policy-url="#cookie-policy"
93
+ .categories=${PREFERENCE_CATEGORIES}
94
+ @bsCustomise=${(e) => (e.currentTarget.setAttribute('type', 'preferences'))}
95
+ @bsAccept=${(e) => (e.currentTarget.setAttribute('type', 'saved'))}
96
+ @bsReject=${(e) => (e.currentTarget.setAttribute('type', 'saved'))}
97
+ @bsSave=${(e) => (e.currentTarget.setAttribute('type', 'saved'))}
98
+ @bsClose=${(e) => (e.currentTarget.setAttribute('type', 'banner'))}
99
+ @bsManage=${(e) => (e.currentTarget.setAttribute('type', 'preferences'))}
100
+ ></bs-cookie-consent>
101
+ </div>
102
+ `,
103
+ };
@@ -0,0 +1,191 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const sr = (root) => root.shadowRoot;
3
+ const days = (root) => Array.from(root.shadowRoot.querySelectorAll('[part~="day"]'));
4
+ const day = (root, iso) => root.shadowRoot.querySelector(`[data-date="${iso}"]`);
5
+ describe('bs-datepicker', () => {
6
+ it('renders a 6-row grid starting on Sunday, matching the Figma (September 2026)', async () => {
7
+ const { root } = await render(h("bs-datepicker", { value: "2026-09-16" }));
8
+ const cells = days(root);
9
+ expect(cells.length).toBe(42);
10
+ // Sept 1 2026 is a Tuesday, so the grid leads with Sunday 30 August.
11
+ expect(cells[0].dataset.date).toBe('2026-08-30');
12
+ expect(cells[41].dataset.date).toBe('2026-10-10');
13
+ const weekdays = Array.from(root.shadowRoot.querySelectorAll('[part="weekday"]')).map(e => e.textContent);
14
+ expect(weekdays).toEqual(['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']);
15
+ });
16
+ it('can start the week on Monday', async () => {
17
+ const { root } = await render(h("bs-datepicker", { value: "2026-09-16", firstDayOfWeek: 1 }));
18
+ expect(days(root)[0].dataset.date).toBe('2026-08-31');
19
+ expect(root.shadowRoot.querySelector('[part="weekday"]').textContent).toBe('Mon');
20
+ });
21
+ it('shows the selected date in the title and marks it selected', async () => {
22
+ const { root } = await render(h("bs-datepicker", { value: "2026-09-16" }));
23
+ expect(root.shadowRoot.querySelector('[part="title"]').textContent).toBe('16 September 2026');
24
+ expect(day(root, '2026-09-16').getAttribute('part')).toContain('selected');
25
+ });
26
+ it('marks days from adjacent months as outside', async () => {
27
+ const { root } = await render(h("bs-datepicker", { value: "2026-09-16" }));
28
+ expect(day(root, '2026-08-31').getAttribute('part')).toContain('outside');
29
+ expect(day(root, '2026-09-01').getAttribute('part')).not.toContain('outside');
30
+ });
31
+ it('selects a day on click, updates value and emits bsChange', async () => {
32
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
33
+ const events = [];
34
+ root.addEventListener('bsChange', (e) => events.push(e.detail));
35
+ day(root, '2026-09-20').click();
36
+ await waitForChanges();
37
+ expect(root.value).toBe('2026-09-20');
38
+ expect(events).toEqual([{ value: '2026-09-20' }]);
39
+ });
40
+ it('does not emit when value is set programmatically, and jumps to that month', async () => {
41
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
42
+ let fired = 0;
43
+ root.addEventListener('bsChange', () => fired++);
44
+ root.value = '2027-01-05';
45
+ await waitForChanges();
46
+ expect(fired).toBe(0);
47
+ expect(day(root, '2027-01-05').getAttribute('part')).toContain('selected');
48
+ });
49
+ it('navigates months with the prev/next buttons', async () => {
50
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
51
+ root.shadowRoot.querySelector('[part="next"]').click();
52
+ await waitForChanges();
53
+ expect(day(root, '2026-10-15')).not.toBeNull();
54
+ expect(day(root, '2026-10-15').getAttribute('part')).not.toContain('outside');
55
+ root.shadowRoot.querySelector('[part="prev"]').click();
56
+ root.shadowRoot.querySelector('[part="prev"]').click();
57
+ await waitForChanges();
58
+ expect(day(root, '2026-08-15').getAttribute('part')).not.toContain('outside');
59
+ });
60
+ it('disables days outside min/max and ignores clicks on them', async () => {
61
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16", min: "2026-09-10", max: "2026-09-20" }));
62
+ expect(day(root, '2026-09-09')).toHaveAttribute('disabled');
63
+ expect(day(root, '2026-09-21')).toHaveAttribute('disabled');
64
+ expect(day(root, '2026-09-10')).not.toHaveAttribute('disabled');
65
+ day(root, '2026-09-09').click();
66
+ await waitForChanges();
67
+ expect(root.value).toBe('2026-09-16');
68
+ });
69
+ it('keeps a single tab stop (roving tabindex) and moves focus with the arrow keys', async () => {
70
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
71
+ expect(days(root).filter(d => d.tabIndex === 0).map(d => d.dataset.date)).toEqual(['2026-09-16']);
72
+ day(root, '2026-09-16').dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
73
+ await waitForChanges();
74
+ expect(days(root).filter(d => d.tabIndex === 0).map(d => d.dataset.date)).toEqual(['2026-09-23']);
75
+ });
76
+ it('PageDown moves a month and clamps the day (Jan 31 -> Feb 28)', async () => {
77
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2027-01-31" }));
78
+ day(root, '2027-01-31').dispatchEvent(new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true }));
79
+ await waitForChanges();
80
+ expect(days(root).filter(d => d.tabIndex === 0).map(d => d.dataset.date)).toEqual(['2027-02-28']);
81
+ });
82
+ describe('month/year dropdowns', () => {
83
+ const triggers = (root) => root.shadowRoot.querySelectorAll('bs-input');
84
+ const items = (root) => Array.from(root.shadowRoot.querySelectorAll('[part="menu"] bs-menu-item'));
85
+ it('renders a dropdown trigger per field showing the current month and year', async () => {
86
+ const { root } = await render(h("bs-datepicker", { value: "2026-09-16" }));
87
+ const t = triggers(root);
88
+ expect(t.length).toBe(2);
89
+ expect(t[0].type).toBe('dropdown');
90
+ expect(t[0].value).toBe('September');
91
+ expect(t[1].value).toBe('2026');
92
+ expect(root.shadowRoot.querySelector('[part="menu"]')).toBeNull();
93
+ });
94
+ it('opens a list of all 12 months with a checkmark on the current one', async () => {
95
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
96
+ triggers(root)[0].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
97
+ await waitForChanges();
98
+ const list = items(root);
99
+ expect(list.length).toBe(12);
100
+ const checked = list.filter(i => i.querySelector('svg'));
101
+ expect(checked.length).toBe(1);
102
+ expect(checked[0].textContent).toBe('September');
103
+ });
104
+ it('opens scrolled so the current month is in view (centred)', async () => {
105
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
106
+ triggers(root)[0].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
107
+ await waitForChanges();
108
+ await new Promise(r => setTimeout(r, 300));
109
+ const menu = sr(root).querySelector('.bs-datepicker__menu');
110
+ expect(menu.scrollTop).toBeGreaterThan(100);
111
+ });
112
+ it('picking a month changes the displayed month and closes the list', async () => {
113
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
114
+ triggers(root)[0].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
115
+ await waitForChanges();
116
+ items(root)[5].dispatchEvent(new CustomEvent('bsSelect'));
117
+ await waitForChanges();
118
+ expect(root.shadowRoot.querySelector('[part="menu"]')).toBeNull();
119
+ expect(triggers(root)[0].value).toBe('June');
120
+ expect(day(root, '2026-06-15').getAttribute('part')).not.toContain('outside');
121
+ // Browsing doesn't change the selection.
122
+ expect(root.value).toBe('2026-09-16');
123
+ });
124
+ it('picking a year changes the displayed year', async () => {
125
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
126
+ triggers(root)[1].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
127
+ await waitForChanges();
128
+ const target = items(root).find(i => i.textContent === '2028');
129
+ target.dispatchEvent(new CustomEvent('bsSelect'));
130
+ await waitForChanges();
131
+ expect(triggers(root)[1].value).toBe('2028');
132
+ expect(day(root, '2028-09-15')).not.toBeNull();
133
+ });
134
+ it('limits the year list to min/max', async () => {
135
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16", min: "2025-01-01", max: "2027-12-31" }));
136
+ triggers(root)[1].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
137
+ await waitForChanges();
138
+ expect(items(root).map(i => i.textContent)).toEqual(['2025', '2026', '2027']);
139
+ });
140
+ it('closes on Escape', async () => {
141
+ const { root, waitForChanges } = await render(h("bs-datepicker", { value: "2026-09-16" }));
142
+ triggers(root)[0].dispatchEvent(new CustomEvent('bsOpen', { detail: true }));
143
+ await waitForChanges();
144
+ root.shadowRoot.querySelector('.bs-datepicker__dropdown').dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
145
+ await waitForChanges();
146
+ expect(root.shadowRoot.querySelector('[part="menu"]')).toBeNull();
147
+ });
148
+ });
149
+ describe('range', () => {
150
+ it('renders start/end fields instead of dropdowns, and highlights the days between', async () => {
151
+ const { root } = await render(h("bs-datepicker", { range: true, start: "2026-09-11", end: "2026-09-16" }));
152
+ const fields = root.shadowRoot.querySelectorAll('bs-input');
153
+ expect(fields.length).toBe(2);
154
+ expect(fields[0].label).toBe('Start date');
155
+ expect(fields[0].value).toBe('11 Sept 2026');
156
+ const inRange = Array.from(root.shadowRoot.querySelectorAll('[part~="in-range"]')).map(e => e.dataset.date);
157
+ expect(inRange).toEqual(['2026-09-12', '2026-09-13', '2026-09-14', '2026-09-15']);
158
+ expect(day(root, '2026-09-11').getAttribute('part')).toContain('selected');
159
+ expect(day(root, '2026-09-16').getAttribute('part')).toContain('selected');
160
+ });
161
+ it('two clicks pick a range: first emits an open range, second completes it', async () => {
162
+ const { root, waitForChanges } = await render(h("bs-datepicker", { range: true, start: "2026-09-01", end: "2026-09-02" }));
163
+ const events = [];
164
+ root.addEventListener('bsChange', (e) => events.push(e.detail));
165
+ day(root, '2026-09-10').click();
166
+ await waitForChanges();
167
+ day(root, '2026-09-15').click();
168
+ await waitForChanges();
169
+ expect(events).toEqual([
170
+ { start: '2026-09-10', end: '' },
171
+ { start: '2026-09-10', end: '2026-09-15' },
172
+ ]);
173
+ expect(root.start).toBe('2026-09-10');
174
+ expect(root.end).toBe('2026-09-15');
175
+ });
176
+ it('a click before the start restarts the range instead of reversing it', async () => {
177
+ const { root, waitForChanges } = await render(h("bs-datepicker", { range: true, start: "2026-09-11" }));
178
+ day(root, '2026-09-05').click();
179
+ await waitForChanges();
180
+ expect(root.start).toBe('2026-09-05');
181
+ expect(root.end).toBe('');
182
+ });
183
+ it('a click after a completed range starts a new one', async () => {
184
+ const { root, waitForChanges } = await render(h("bs-datepicker", { range: true, start: "2026-09-11", end: "2026-09-16" }));
185
+ day(root, '2026-09-20').click();
186
+ await waitForChanges();
187
+ expect(root.start).toBe('2026-09-20');
188
+ expect(root.end).toBe('');
189
+ });
190
+ });
191
+ });
@@ -0,0 +1,325 @@
1
+ /**
2
+ * @prop --bs-datepicker-width: Width of the card. 364px, exact match to Figma.
3
+ * @prop --bs-datepicker-bg: Card background. Aliased to --bs-paper-bg-raised (the `bs-card` raised surface).
4
+ * @prop --bs-datepicker-radius: Card corner radius. Aliased to --bs-border-radius-150.
5
+ * @prop --bs-datepicker-padding: Card padding. Aliased to --bs-spacing-200.
6
+ * @prop --bs-datepicker-gap: Vertical gap between the header, nav and grid. Aliased to --bs-spacing-150.
7
+ * @prop --bs-datepicker-shadow: Card shadow. Aliased to --bs-shadow-md.
8
+ * @prop --bs-datepicker-menu-max-height: Max height of the month/year dropdown list before it scrolls. 280px.
9
+ * @prop --bs-datepicker-band-bridge: Horizontal overlap that joins adjacent range-band cells across the column gap. Aliased to --bs-spacing-50 (keep equal to the gap between days).
10
+ * @prop --bs-datepicker-day-size: Width/height of each day button. Aliased to --bs-spacing-550 (44px).
11
+ * @prop --bs-datepicker-day-radius: Corner radius of each day button. Aliased to --bs-border-radius-100.
12
+ * @prop --bs-datepicker-day-gap: Gap between day rows. Aliased to --bs-spacing-50.
13
+ * @prop --bs-datepicker-font-size: Day and title font size. Aliased to --bs-font-size-md.
14
+ * @prop --bs-datepicker-line-height: Day and title line height. Aliased to --bs-line-height-body-md.
15
+ * @prop --bs-datepicker-weekday-font-size: Weekday header font size. Aliased to --bs-font-size-sm.
16
+ * @prop --bs-datepicker-weekday-line-height: Weekday header line height. Aliased to --bs-line-height-body-sm.
17
+ * @prop --bs-datepicker-color: Day number color. Aliased to --bs-text-default.
18
+ * @prop --bs-datepicker-color-muted: Color of days from the adjacent months. Aliased to --bs-text-muted.
19
+ * @prop --bs-datepicker-color-weekday: Weekday header color. Aliased to --bs-text-secondary.
20
+ * @prop --bs-datepicker-color-disabled: Color of disabled days. Aliased to --bs-text-on-disabled.
21
+ * @prop --bs-datepicker-hover: Background of an unselected day on hover. Aliased to --bs-surface-hover.
22
+ * @prop --bs-datepicker-pressed: Background of an unselected day when pressed. Aliased to --bs-surface-pressed.
23
+ * @prop --bs-datepicker-focus-bg: Background of an unselected day when focused. Aliased to --bs-surface-focus.
24
+ * @prop --bs-datepicker-selected-bg: Background of a selected day. Aliased to --bs-color-primary-default.
25
+ * @prop --bs-datepicker-selected-bg-hover: Background of a selected day on hover. Aliased to --bs-color-primary-hover.
26
+ * @prop --bs-datepicker-selected-bg-pressed: Background of a selected day when pressed. Aliased to --bs-color-primary-pressed.
27
+ * @prop --bs-datepicker-selected-bg-focus: Background of a selected day when focused. Aliased to --bs-color-primary-focused.
28
+ * @prop --bs-datepicker-selected-bg-disabled: Background of a selected day when disabled. Aliased to --bs-surface-action-disabled.
29
+ * @prop --bs-datepicker-selected-color: Text color of a selected day. Aliased to --bs-text-on-action.
30
+ * @prop --bs-datepicker-range-bg: Background of the band between range start and end. Aliased to --bs-color-primary-container.
31
+ * @prop --bs-datepicker-today-border: Outline color marking today. Aliased to --bs-border-primary.
32
+ * @prop --bs-datepicker-focus-ring-color: Focus ring color. Aliased to --bs-border-neutral-focus.
33
+ */
34
+ :host {
35
+ display: inline-block;
36
+
37
+ --bs-datepicker-width: 364px;
38
+ --bs-datepicker-bg: var(--bs-paper-bg-raised);
39
+ --bs-datepicker-radius: var(--bs-border-radius-150);
40
+ --bs-datepicker-padding: var(--bs-spacing-200);
41
+ --bs-datepicker-gap: var(--bs-spacing-150);
42
+ --bs-datepicker-shadow: var(--bs-shadow-md);
43
+
44
+ --bs-datepicker-menu-max-height: 280px;
45
+ --bs-datepicker-day-size: var(--bs-spacing-550);
46
+ --bs-datepicker-day-radius: var(--bs-border-radius-100);
47
+ --bs-datepicker-day-gap: var(--bs-spacing-50);
48
+ --bs-datepicker-band-bridge: var(--bs-spacing-50);
49
+
50
+ --bs-datepicker-font-size: var(--bs-font-size-md);
51
+ --bs-datepicker-line-height: var(--bs-line-height-body-md);
52
+ --bs-datepicker-weekday-font-size: var(--bs-font-size-sm);
53
+ --bs-datepicker-weekday-line-height: var(--bs-line-height-body-sm);
54
+
55
+ --bs-datepicker-color: var(--bs-text-default);
56
+ --bs-datepicker-color-muted: var(--bs-text-muted);
57
+ --bs-datepicker-color-weekday: var(--bs-text-secondary);
58
+ --bs-datepicker-color-disabled: var(--bs-text-on-disabled);
59
+
60
+ --bs-datepicker-hover: var(--bs-surface-hover);
61
+ --bs-datepicker-pressed: var(--bs-surface-pressed);
62
+ --bs-datepicker-focus-bg: var(--bs-surface-focus);
63
+ --bs-datepicker-selected-bg: var(--bs-color-primary-default);
64
+ --bs-datepicker-selected-bg-hover: var(--bs-color-primary-hover);
65
+ --bs-datepicker-selected-bg-pressed: var(--bs-color-primary-pressed);
66
+ --bs-datepicker-selected-bg-focus: var(--bs-color-primary-focused);
67
+ --bs-datepicker-selected-bg-disabled: var(--bs-surface-action-disabled);
68
+ --bs-datepicker-selected-color: var(--bs-text-on-action);
69
+ --bs-datepicker-range-bg: var(--bs-color-primary-container);
70
+ --bs-datepicker-today-border: var(--bs-border-primary);
71
+ --bs-datepicker-focus-ring-color: var(--bs-border-neutral-focus);
72
+ }
73
+
74
+ .bs-datepicker {
75
+ width: var(--bs-datepicker-width);
76
+ max-width: 100%;
77
+ color: var(--bs-datepicker-color);
78
+ font-size: var(--bs-datepicker-font-size);
79
+ /* bs-card supplies the surface. `visible` so the month/year list can hang over the edge. */
80
+ --bs-card-bg: var(--bs-datepicker-bg);
81
+ --bs-card-radius: var(--bs-datepicker-radius);
82
+ --bs-card-padding: var(--bs-datepicker-padding);
83
+ --bs-card-shadow: var(--bs-datepicker-shadow);
84
+ --bs-card-overflow: visible;
85
+ }
86
+
87
+ .bs-datepicker__body {
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: var(--bs-datepicker-gap);
91
+ }
92
+
93
+ .bs-datepicker__header {
94
+ display: flex;
95
+ align-items: flex-start;
96
+ gap: var(--bs-spacing-100);
97
+ }
98
+
99
+ .bs-datepicker__header--range > bs-input {
100
+ /* Figma: the Start/End date labels are 16px semibold (bs-input's own default is 14px medium). */
101
+ --bs-input-label-font-size: var(--bs-font-size-md);
102
+ --bs-input-label-font-weight: var(--bs-font-weight-semibold);
103
+ --bs-input-label-line-height: calc(var(--bs-line-height-body-md) * 1px);
104
+ }
105
+
106
+ .bs-datepicker__header > bs-input {
107
+ flex: 1 1 0;
108
+ min-width: 0;
109
+ }
110
+
111
+ /* The Figma design has no visible label on the month/year dropdowns; bs-input only names its
112
+ field through its label, so keep the label for assistive tech and hide it visually. */
113
+ .bs-datepicker__select::part(label) {
114
+ position: absolute;
115
+ width: 1px;
116
+ height: 1px;
117
+ margin: -1px;
118
+ overflow: hidden;
119
+ clip-path: inset(50%);
120
+ white-space: nowrap;
121
+ }
122
+
123
+ .bs-datepicker__dropdown {
124
+ position: relative;
125
+ flex: 1 1 0;
126
+ min-width: 0;
127
+ }
128
+
129
+ .bs-datepicker__dropdown bs-input {
130
+ width: 100%;
131
+ }
132
+
133
+ /* The scroll box owns the shadow and rounding, so the inner list's own shadow is turned off
134
+ (it would be clipped by the scroll box anyway). */
135
+ .bs-datepicker__menu {
136
+ position: absolute;
137
+ top: calc(100% + var(--bs-spacing-50));
138
+ inset-inline: 0;
139
+ z-index: 2;
140
+ max-height: var(--bs-datepicker-menu-max-height);
141
+ overflow-y: auto;
142
+ border-radius: var(--bs-border-radius-100);
143
+ background: var(--bs-surface-raised);
144
+ box-shadow: var(--bs-shadow-md);
145
+ --bs-menu-shadow: none;
146
+ }
147
+
148
+ .bs-datepicker__menu bs-menu-item {
149
+ --bs-menu-item-color: var(--bs-datepicker-color);
150
+ }
151
+
152
+ .bs-datepicker__menu bs-menu-item::part(label) {
153
+ flex: 1;
154
+ text-align: start;
155
+ }
156
+
157
+ .bs-datepicker__option {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: space-between;
161
+ gap: var(--bs-spacing-100);
162
+ }
163
+
164
+ .bs-datepicker__option svg {
165
+ width: 20px;
166
+ height: 20px;
167
+ flex: none;
168
+ }
169
+
170
+ .bs-datepicker__nav {
171
+ display: flex;
172
+ align-items: center;
173
+ justify-content: space-between;
174
+ }
175
+
176
+ .bs-datepicker__title {
177
+ font-weight: var(--bs-font-weight-semibold);
178
+ line-height: calc(var(--bs-datepicker-line-height) * 1px);
179
+ }
180
+
181
+ .bs-datepicker__nav-button {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ width: var(--bs-spacing-600);
186
+ height: var(--bs-spacing-600);
187
+ padding: 0;
188
+ border: none;
189
+ border-radius: var(--bs-datepicker-day-radius);
190
+ background: transparent;
191
+ color: var(--bs-icon-default);
192
+ cursor: pointer;
193
+ }
194
+
195
+ .bs-datepicker__nav-button svg {
196
+ width: 24px;
197
+ height: 24px;
198
+ }
199
+
200
+ .bs-datepicker__nav-button:hover {
201
+ background: var(--bs-datepicker-hover);
202
+ }
203
+
204
+ .bs-datepicker__grid {
205
+ display: flex;
206
+ flex-direction: column;
207
+ gap: var(--bs-datepicker-day-gap);
208
+ }
209
+
210
+ .bs-datepicker__row {
211
+ display: grid;
212
+ grid-template-columns: repeat(7, var(--bs-datepicker-day-size));
213
+ justify-content: space-between;
214
+ }
215
+
216
+ .bs-datepicker__weekday {
217
+ display: flex;
218
+ align-items: center;
219
+ justify-content: center;
220
+ height: var(--bs-datepicker-day-size);
221
+ color: var(--bs-datepicker-color-weekday);
222
+ font-size: var(--bs-datepicker-weekday-font-size);
223
+ font-weight: var(--bs-font-weight-semibold);
224
+ line-height: calc(var(--bs-datepicker-weekday-line-height) * 1px);
225
+ }
226
+
227
+ .bs-datepicker__cell {
228
+ display: flex;
229
+ justify-content: center;
230
+ }
231
+
232
+ /* The range band is painted on the cells so it runs unbroken behind the in-between days; a
233
+ cell's shadow bridges the gap to the next in-range cell in the same week. The two end days are
234
+ not part of it (Figma), and its ends are rounded like a day button. */
235
+ .bs-datepicker__cell--in-range {
236
+ background: var(--bs-datepicker-range-bg);
237
+ box-shadow: calc(var(--bs-datepicker-band-bridge) + 1px) 0 0 var(--bs-datepicker-range-bg);
238
+ }
239
+
240
+ .bs-datepicker__cell--band-start {
241
+ border-start-start-radius: var(--bs-datepicker-day-radius);
242
+ border-end-start-radius: var(--bs-datepicker-day-radius);
243
+ }
244
+
245
+ .bs-datepicker__cell--band-end {
246
+ border-start-end-radius: var(--bs-datepicker-day-radius);
247
+ border-end-end-radius: var(--bs-datepicker-day-radius);
248
+ box-shadow: none;
249
+ }
250
+
251
+ .bs-datepicker__day {
252
+ width: var(--bs-datepicker-day-size);
253
+ height: var(--bs-datepicker-day-size);
254
+ padding: 0;
255
+ border: none;
256
+ border-radius: var(--bs-datepicker-day-radius);
257
+ background: transparent;
258
+ color: var(--bs-datepicker-color);
259
+ font-family: inherit;
260
+ font-size: var(--bs-datepicker-font-size);
261
+ line-height: calc(var(--bs-datepicker-line-height) * 1px);
262
+ cursor: pointer;
263
+ }
264
+
265
+ .bs-datepicker__day--outside {
266
+ color: var(--bs-datepicker-color-muted);
267
+ }
268
+
269
+ .bs-datepicker__day--today {
270
+ box-shadow: inset 0 0 0 1px var(--bs-datepicker-today-border);
271
+ }
272
+
273
+ .bs-datepicker__day:not(:disabled):hover {
274
+ background: var(--bs-datepicker-hover);
275
+ }
276
+
277
+ .bs-datepicker__day:not(:disabled):active {
278
+ background: var(--bs-datepicker-pressed);
279
+ }
280
+
281
+ /* An in-range day already sits on the range band; hovering it keeps that colour (Figma "In-range,
282
+ Hovered"). */
283
+ .bs-datepicker__day--in-range:not(:disabled):hover,
284
+ .bs-datepicker__day--in-range:not(:disabled):active {
285
+ background: var(--bs-datepicker-range-bg);
286
+ }
287
+
288
+ .bs-datepicker__day--selected,
289
+ .bs-datepicker__day--selected.bs-datepicker__day--outside {
290
+ background: var(--bs-datepicker-selected-bg);
291
+ color: var(--bs-datepicker-selected-color);
292
+ }
293
+
294
+ .bs-datepicker__day--selected:not(:disabled):hover {
295
+ background: var(--bs-datepicker-selected-bg-hover);
296
+ }
297
+
298
+ .bs-datepicker__day--selected:not(:disabled):active {
299
+ background: var(--bs-datepicker-selected-bg-pressed);
300
+ }
301
+
302
+ .bs-datepicker__day:disabled {
303
+ color: var(--bs-datepicker-color-disabled);
304
+ cursor: not-allowed;
305
+ }
306
+
307
+ .bs-datepicker__day--selected:disabled {
308
+ background: var(--bs-datepicker-selected-bg-disabled);
309
+ }
310
+
311
+ /* Figma focus state: a state-colored fill plus a 2px ring sitting flush against the day's edge. */
312
+ .bs-datepicker__day:focus-visible {
313
+ background: var(--bs-datepicker-focus-bg);
314
+ outline: 2px solid var(--bs-datepicker-focus-ring-color);
315
+ outline-offset: 0;
316
+ }
317
+
318
+ .bs-datepicker__day--selected:focus-visible {
319
+ background: var(--bs-datepicker-selected-bg-focus);
320
+ }
321
+
322
+ .bs-datepicker__nav-button:focus-visible {
323
+ outline: 2px solid var(--bs-datepicker-focus-ring-color);
324
+ outline-offset: 2px;
325
+ }