@brandsync/wc 1.12.1 → 1.14.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 (512) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/CONVENTIONS.md +109 -0
  3. package/REFERENCE.md +1388 -0
  4. package/custom-elements.json +5069 -2575
  5. package/dist/brandsync-wc/brandsync-wc.css +1 -1783
  6. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  7. package/dist/brandsync-wc/{p-83c90489.entry.js → p-00be9a64.entry.js} +1 -1
  8. package/dist/brandsync-wc/{p-b9ccd9d1.entry.js → p-020cb767.entry.js} +1 -1
  9. package/dist/brandsync-wc/p-046a53de.entry.js +1 -0
  10. package/dist/brandsync-wc/p-056608f0.entry.js +1 -0
  11. package/dist/brandsync-wc/p-0cb6fc39.entry.js +1 -0
  12. package/dist/brandsync-wc/p-0e738622.entry.js +1 -0
  13. package/dist/brandsync-wc/{p-e5daa6ca.entry.js → p-10290c41.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-e2556b4e.entry.js → p-144b6ac8.entry.js} +1 -1
  15. package/dist/brandsync-wc/{p-56c37e0a.entry.js → p-16c78ff6.entry.js} +1 -1
  16. package/dist/brandsync-wc/p-1b5cc9b8.entry.js +1 -0
  17. package/dist/brandsync-wc/p-204cc690.entry.js +1 -0
  18. package/dist/brandsync-wc/p-221244a9.entry.js +1 -0
  19. package/dist/brandsync-wc/p-227a5182.entry.js +1 -0
  20. package/dist/brandsync-wc/p-23b56775.entry.js +1 -0
  21. package/dist/brandsync-wc/p-2967240d.entry.js +1 -0
  22. package/dist/brandsync-wc/p-2c1efaa1.entry.js +1 -0
  23. package/dist/brandsync-wc/p-2e68b76e.entry.js +1 -0
  24. package/dist/brandsync-wc/{p-a9169157.entry.js → p-315b510c.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-1978e63c.entry.js → p-31cd66e0.entry.js} +1 -1
  26. package/dist/brandsync-wc/p-3477539c.entry.js +1 -0
  27. package/dist/brandsync-wc/{p-81605b82.entry.js → p-361aef36.entry.js} +1 -1
  28. package/dist/brandsync-wc/{p-89fabf27.entry.js → p-3789c7a5.entry.js} +1 -1
  29. package/dist/brandsync-wc/{p-2497d128.entry.js → p-3dabf202.entry.js} +1 -1
  30. package/dist/brandsync-wc/{p-fc069773.entry.js → p-45cb3e6d.entry.js} +1 -1
  31. package/dist/brandsync-wc/{p-de110ad0.entry.js → p-47b7fe76.entry.js} +1 -1
  32. package/dist/brandsync-wc/{p-2f4e08e1.entry.js → p-47cd19aa.entry.js} +1 -1
  33. package/dist/brandsync-wc/{p-f15d9524.entry.js → p-4b40a596.entry.js} +1 -1
  34. package/dist/brandsync-wc/p-51f40972.entry.js +1 -0
  35. package/dist/brandsync-wc/{p-39a26c64.entry.js → p-617bd76d.entry.js} +1 -1
  36. package/dist/brandsync-wc/p-658532b7.entry.js +1 -0
  37. package/dist/brandsync-wc/{p-617bd13a.entry.js → p-686297f1.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-78f4fcf0.entry.js → p-6ca1e51b.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-52cb2358.entry.js → p-6e923ebc.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-00a0d489.entry.js → p-8048d033.entry.js} +1 -1
  41. package/dist/brandsync-wc/{p-0b2d3b7e.entry.js → p-80700878.entry.js} +1 -1
  42. package/dist/brandsync-wc/{p-2368a92e.entry.js → p-8184d7de.entry.js} +1 -1
  43. package/dist/brandsync-wc/p-833f9dc4.entry.js +1 -0
  44. package/dist/brandsync-wc/p-8390a155.entry.js +1 -0
  45. package/dist/brandsync-wc/{p-fcee0dc4.entry.js → p-89fa7567.entry.js} +1 -1
  46. package/dist/brandsync-wc/{p-7796b93f.entry.js → p-8c9938a5.entry.js} +1 -1
  47. package/dist/brandsync-wc/{p-68fcd4a4.entry.js → p-9125632c.entry.js} +1 -1
  48. package/dist/brandsync-wc/{p-416322bd.entry.js → p-94d435a2.entry.js} +1 -1
  49. package/dist/brandsync-wc/p-9d12b1fb.entry.js +1 -0
  50. package/dist/brandsync-wc/{p-5ba90a13.entry.js → p-9d660c03.entry.js} +1 -1
  51. package/dist/brandsync-wc/p-9fa67924.entry.js +1 -0
  52. package/dist/brandsync-wc/p-D3SkQJpw.js +3 -0
  53. package/dist/brandsync-wc/{p-7f954939.entry.js → p-a28ef52e.entry.js} +1 -1
  54. package/dist/brandsync-wc/p-a2e59aca.entry.js +1 -0
  55. package/dist/brandsync-wc/{p-09435f41.entry.js → p-a5659499.entry.js} +1 -1
  56. package/dist/brandsync-wc/p-b6ac1b50.entry.js +1 -0
  57. package/dist/brandsync-wc/{p-69c0a85d.entry.js → p-b793a0d6.entry.js} +1 -1
  58. package/dist/brandsync-wc/p-bee30626.entry.js +1 -0
  59. package/dist/brandsync-wc/{p-1aab6d07.entry.js → p-c05ee501.entry.js} +1 -1
  60. package/dist/brandsync-wc/p-c488cc8b.entry.js +1 -0
  61. package/dist/brandsync-wc/p-c67bc817.entry.js +1 -0
  62. package/dist/brandsync-wc/{p-247e36ad.entry.js → p-cc1055e6.entry.js} +1 -1
  63. package/dist/brandsync-wc/p-cc25ee67.entry.js +1 -0
  64. package/dist/brandsync-wc/p-ce16f038.entry.js +1 -0
  65. package/dist/brandsync-wc/{p-491b51e6.entry.js → p-d5a6098d.entry.js} +1 -1
  66. package/dist/brandsync-wc/{p-282ddbee.entry.js → p-d892277f.entry.js} +1 -1
  67. package/dist/brandsync-wc/p-dd52209a.entry.js +1 -0
  68. package/dist/brandsync-wc/{p-09bc1923.entry.js → p-df3e7973.entry.js} +1 -1
  69. package/dist/brandsync-wc/p-dfad8c0a.entry.js +1 -0
  70. package/dist/brandsync-wc/p-e0927a9a.entry.js +1 -0
  71. package/dist/brandsync-wc/{p-0ee4126c.entry.js → p-e1b7bea7.entry.js} +1 -1
  72. package/dist/brandsync-wc/{p-0b7c77c1.entry.js → p-e65d286c.entry.js} +1 -1
  73. package/dist/brandsync-wc/{p-f5180578.entry.js → p-e6fc2cd4.entry.js} +1 -1
  74. package/dist/brandsync-wc/p-f271e1d2.entry.js +1 -0
  75. package/dist/brandsync-wc/{p-3f09296a.entry.js → p-f3eca1ce.entry.js} +1 -1
  76. package/dist/brandsync-wc/{p-2177042f.entry.js → p-fa6b9750.entry.js} +1 -1
  77. package/dist/brandsync-wc/{p-78a69a59.entry.js → p-fc76031e.entry.js} +1 -1
  78. package/dist/brandsync-wc/{p-be3dd446.entry.js → p-ffc07eb5.entry.js} +1 -1
  79. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  80. package/dist/cjs/bs-accordion-group.cjs.entry.js +33 -0
  81. package/dist/cjs/bs-accordion.cjs.entry.js +1 -1
  82. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  84. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  85. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  86. package/dist/cjs/bs-attachment.cjs.entry.js +9 -5
  87. package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
  88. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  89. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +1 -1
  90. package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
  91. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +2 -2
  92. package/dist/cjs/bs-button-skeleton.cjs.entry.js +4 -2
  93. package/dist/cjs/bs-button.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-card.cjs.entry.js +1 -1
  95. package/dist/cjs/bs-carousel.cjs.entry.js +1 -1
  96. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +18 -2
  97. package/dist/cjs/bs-chatbot-header.cjs.entry.js +20 -2
  98. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +25 -3
  99. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +4 -2
  100. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +3 -3
  101. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +4 -2
  102. package/dist/cjs/bs-checkbox.cjs.entry.js +1 -1
  103. package/dist/cjs/bs-chip-filter.cjs.entry.js +1 -1
  104. package/dist/cjs/bs-chip-informative.cjs.entry.js +1 -1
  105. package/dist/cjs/bs-chip-input.cjs.entry.js +4 -2
  106. package/dist/cjs/bs-citation-preview.cjs.entry.js +29 -0
  107. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +11 -3
  108. package/dist/cjs/bs-composer.cjs.entry.js +36 -7
  109. package/dist/cjs/bs-cookie-consent.cjs.entry.js +1 -1
  110. package/dist/cjs/bs-data-table.cjs.entry.js +5 -3
  111. package/dist/cjs/bs-datepicker.cjs.entry.js +1 -1
  112. package/dist/cjs/bs-dialog.cjs.entry.js +4 -2
  113. package/dist/cjs/bs-error-page.cjs.entry.js +1 -1
  114. package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
  115. package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
  116. package/dist/cjs/bs-icon-button.cjs.entry.js +1 -1
  117. package/dist/cjs/bs-icon-tile.cjs.entry.js +1 -1
  118. package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
  119. package/dist/cjs/bs-input_3.cjs.entry.js +15 -7
  120. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  121. package/dist/cjs/bs-message-list.cjs.entry.js +71 -0
  122. package/dist/cjs/bs-message.cjs.entry.js +25 -0
  123. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
  124. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +9 -3
  125. package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
  126. package/dist/cjs/bs-onboarding-checklist.cjs.entry.js +1 -1
  127. package/dist/cjs/bs-pagination.cjs.entry.js +6 -2
  128. package/dist/cjs/bs-popover.cjs.entry.js +153 -0
  129. package/dist/cjs/bs-product-tour.cjs.entry.js +1 -1
  130. package/dist/cjs/bs-progress-linear.cjs.entry.js +3 -3
  131. package/dist/cjs/bs-progress.cjs.entry.js +3 -3
  132. package/dist/cjs/bs-qr-code.cjs.entry.js +2 -2
  133. package/dist/cjs/bs-radio.cjs.entry.js +2 -2
  134. package/dist/cjs/bs-session-timeout.cjs.entry.js +2 -2
  135. package/dist/cjs/bs-side-panel.cjs.entry.js +164 -0
  136. package/dist/cjs/bs-skeleton.cjs.entry.js +51 -0
  137. package/dist/cjs/bs-slider.cjs.entry.js +7 -3
  138. package/dist/cjs/bs-snackbar.cjs.entry.js +2 -2
  139. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  140. package/dist/cjs/bs-spinner.cjs.entry.js +24 -0
  141. package/dist/cjs/bs-split-pane.cjs.entry.js +193 -0
  142. package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
  143. package/dist/cjs/bs-stepper.cjs.entry.js +2 -2
  144. package/dist/cjs/bs-switch.cjs.entry.js +2 -2
  145. package/dist/cjs/bs-tab_3.cjs.entry.js +4 -4
  146. package/dist/cjs/bs-timepicker.cjs.entry.js +8 -4
  147. package/dist/cjs/bs-toast.cjs.entry.js +4 -2
  148. package/dist/cjs/bs-tooltip-trigger.cjs.entry.js +46 -0
  149. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  150. package/dist/cjs/bs-whats-new.cjs.entry.js +1 -1
  151. package/dist/cjs/index-BYfMRtlW.js +1863 -0
  152. package/dist/cjs/loader.cjs.js +2 -2
  153. package/dist/collection/collection-manifest.json +10 -0
  154. package/dist/collection/components/bs-accordion-group/bs-accordion-group.cmp.test.js +39 -0
  155. package/dist/collection/components/bs-accordion-group/bs-accordion-group.css +10 -0
  156. package/dist/collection/components/bs-accordion-group/bs-accordion-group.js +86 -0
  157. package/dist/collection/components/bs-accordion-group/bs-accordion-group.stories.js +18 -0
  158. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  159. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  160. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  161. package/dist/collection/components/bs-attachment/bs-attachment.js +48 -4
  162. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  163. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  164. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +23 -1
  165. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.cmp.test.js +10 -0
  166. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +178 -2
  167. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.cmp.test.js +6 -0
  168. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +200 -1
  169. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.cmp.test.js +8 -0
  170. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.css +4 -0
  171. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +223 -1
  172. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +24 -2
  173. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.css +1 -4
  174. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +3 -6
  175. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +23 -1
  176. package/dist/collection/components/bs-chip/bs-chip-input/bs-chip-input.js +23 -1
  177. package/dist/collection/components/bs-citation-preview/bs-citation-preview.cmp.test.js +34 -0
  178. package/dist/collection/components/bs-citation-preview/bs-citation-preview.css +36 -0
  179. package/dist/collection/components/bs-citation-preview/bs-citation-preview.js +154 -0
  180. package/dist/collection/components/bs-citation-preview/bs-citation-preview.stories.js +22 -0
  181. package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +29 -2
  182. package/dist/collection/components/bs-composer/bs-composer.css +16 -0
  183. package/dist/collection/components/bs-composer/bs-composer.js +234 -6
  184. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.js +5 -0
  185. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.css +16 -0
  186. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +49 -1
  187. package/dist/collection/components/bs-data-table/bs-data-table.js +24 -2
  188. package/dist/collection/components/bs-dialog/bs-dialog.js +23 -1
  189. package/dist/collection/components/bs-input/bs-input.js +92 -4
  190. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  191. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  192. package/dist/collection/components/bs-message/bs-message.cmp.test.js +36 -0
  193. package/dist/collection/components/bs-message/bs-message.css +77 -0
  194. package/dist/collection/components/bs-message/bs-message.js +156 -0
  195. package/dist/collection/components/bs-message/bs-message.stories.js +33 -0
  196. package/dist/collection/components/bs-message-list/bs-message-list.cmp.test.js +58 -0
  197. package/dist/collection/components/bs-message-list/bs-message-list.css +40 -0
  198. package/dist/collection/components/bs-message-list/bs-message-list.js +161 -0
  199. package/dist/collection/components/bs-message-list/bs-message-list.stories.js +17 -0
  200. package/dist/collection/components/bs-pagination/bs-pagination.cmp.test.js +5 -0
  201. package/dist/collection/components/bs-pagination/bs-pagination.js +45 -1
  202. package/dist/collection/components/bs-popover/bs-popover.cmp.test.js +107 -0
  203. package/dist/collection/components/bs-popover/bs-popover.css +61 -0
  204. package/dist/collection/components/bs-popover/bs-popover.js +247 -0
  205. package/dist/collection/components/bs-popover/bs-popover.stories.js +26 -0
  206. package/dist/collection/components/bs-progress/bs-progress.js +2 -2
  207. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
  208. package/dist/collection/components/bs-qr-code/bs-qr-code.js +1 -1
  209. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  210. package/dist/collection/components/bs-session-timeout/bs-session-timeout.js +1 -1
  211. package/dist/collection/components/bs-side-panel/bs-side-panel.cmp.test.js +117 -0
  212. package/dist/collection/components/bs-side-panel/bs-side-panel.css +77 -0
  213. package/dist/collection/components/bs-side-panel/bs-side-panel.js +325 -0
  214. package/dist/collection/components/bs-side-panel/bs-side-panel.stories.js +24 -0
  215. package/dist/collection/components/bs-skeleton/bs-skeleton.cmp.test.js +49 -0
  216. package/dist/collection/components/bs-skeleton/bs-skeleton.css +62 -0
  217. package/dist/collection/components/bs-skeleton/bs-skeleton.js +204 -0
  218. package/dist/collection/components/bs-skeleton/bs-skeleton.stories.js +43 -0
  219. package/dist/collection/components/bs-slider/bs-slider.js +46 -2
  220. package/dist/collection/components/bs-snackbar/bs-snackbar.js +1 -1
  221. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  222. package/dist/collection/components/bs-spinner/bs-spinner.cmp.test.js +32 -0
  223. package/dist/collection/components/bs-spinner/bs-spinner.css +61 -0
  224. package/dist/collection/components/bs-spinner/bs-spinner.js +96 -0
  225. package/dist/collection/components/bs-spinner/bs-spinner.stories.js +30 -0
  226. package/dist/collection/components/bs-split-pane/bs-split-pane.cmp.test.js +107 -0
  227. package/dist/collection/components/bs-split-pane/bs-split-pane.css +108 -0
  228. package/dist/collection/components/bs-split-pane/bs-split-pane.js +404 -0
  229. package/dist/collection/components/bs-split-pane/bs-split-pane.stories.js +47 -0
  230. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  231. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
  232. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  233. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  234. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  235. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  236. package/dist/collection/components/bs-timepicker/bs-timepicker.js +48 -4
  237. package/dist/collection/components/bs-toast/bs-toast.js +23 -1
  238. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  239. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.js +73 -0
  240. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.css +52 -0
  241. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.js +140 -0
  242. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.js +21 -0
  243. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +1 -1
  244. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +68 -2
  245. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  246. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  247. package/dist/collection/global/brand-theming.cmp.test.js +44 -0
  248. package/dist/components/bs-accordion-group.d.ts +11 -0
  249. package/dist/components/bs-accordion-group.js +1 -0
  250. package/dist/components/bs-accordion.js +1 -1
  251. package/dist/components/bs-ai-disclaimer.js +1 -1
  252. package/dist/components/bs-ai-greeting.js +1 -1
  253. package/dist/components/bs-ai-thinking.js +1 -1
  254. package/dist/components/bs-attachment-list.js +1 -1
  255. package/dist/components/bs-attachment.js +1 -1
  256. package/dist/components/bs-avatar.js +1 -1
  257. package/dist/components/bs-badge.js +1 -1
  258. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  259. package/dist/components/bs-breadcrumb.js +1 -1
  260. package/dist/components/bs-breadcrumbs.js +1 -1
  261. package/dist/components/bs-button-skeleton.js +1 -1
  262. package/dist/components/bs-button.js +1 -1
  263. package/dist/components/bs-card.js +1 -1
  264. package/dist/components/bs-carousel.js +1 -1
  265. package/dist/components/bs-chatbot-feedback.js +1 -1
  266. package/dist/components/bs-chatbot-header.js +1 -1
  267. package/dist/components/bs-chatbot-response-action.js +1 -1
  268. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  269. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  270. package/dist/components/bs-checkbox-skeleton.js +1 -1
  271. package/dist/components/bs-checkbox.js +1 -1
  272. package/dist/components/bs-chip-filter.js +1 -1
  273. package/dist/components/bs-chip-informative.js +1 -1
  274. package/dist/components/bs-chip-input.js +1 -1
  275. package/dist/components/bs-citation-preview.d.ts +11 -0
  276. package/dist/components/bs-citation-preview.js +1 -0
  277. package/dist/components/bs-composer-status-banner.js +1 -1
  278. package/dist/components/bs-composer.js +1 -1
  279. package/dist/components/bs-cookie-consent.js +1 -1
  280. package/dist/components/bs-data-table.js +1 -1
  281. package/dist/components/bs-datepicker.js +1 -1
  282. package/dist/components/bs-dialog.js +1 -1
  283. package/dist/components/bs-error-page.js +1 -1
  284. package/dist/components/bs-file-upload-item.js +1 -1
  285. package/dist/components/bs-file-upload.js +1 -1
  286. package/dist/components/bs-icon-button.js +1 -1
  287. package/dist/components/bs-icon-tile.js +1 -1
  288. package/dist/components/bs-inline-tab.js +1 -1
  289. package/dist/components/bs-input.js +1 -1
  290. package/dist/components/bs-logo.js +1 -1
  291. package/dist/components/bs-menu-item.js +1 -1
  292. package/dist/components/bs-menu.js +1 -1
  293. package/dist/components/bs-message-list.d.ts +11 -0
  294. package/dist/components/bs-message-list.js +1 -0
  295. package/dist/components/bs-message.d.ts +11 -0
  296. package/dist/components/bs-message.js +1 -0
  297. package/dist/components/bs-navigation-drawer-item.js +1 -1
  298. package/dist/components/bs-navigation-drawer.js +1 -1
  299. package/dist/components/bs-navigation-header.js +1 -1
  300. package/dist/components/bs-onboarding-checklist.js +1 -1
  301. package/dist/components/bs-pagination.js +1 -1
  302. package/dist/components/bs-popover.d.ts +11 -0
  303. package/dist/components/bs-popover.js +1 -0
  304. package/dist/components/bs-product-tour.js +1 -1
  305. package/dist/components/bs-progress-linear.js +1 -1
  306. package/dist/components/bs-progress.js +1 -1
  307. package/dist/components/bs-qr-code.js +1 -1
  308. package/dist/components/bs-radio.js +1 -1
  309. package/dist/components/bs-session-timeout.js +1 -1
  310. package/dist/components/bs-side-panel.d.ts +11 -0
  311. package/dist/components/bs-side-panel.js +1 -0
  312. package/dist/components/bs-skeleton.d.ts +11 -0
  313. package/dist/components/bs-skeleton.js +1 -0
  314. package/dist/components/bs-slider.js +1 -1
  315. package/dist/components/bs-snackbar.js +1 -1
  316. package/dist/components/bs-source-link.js +1 -1
  317. package/dist/components/bs-spinner.d.ts +11 -0
  318. package/dist/components/bs-spinner.js +1 -0
  319. package/dist/components/bs-split-pane.d.ts +11 -0
  320. package/dist/components/bs-split-pane.js +1 -0
  321. package/dist/components/bs-stepper-step.js +1 -1
  322. package/dist/components/bs-stepper.js +1 -1
  323. package/dist/components/bs-switch.js +1 -1
  324. package/dist/components/bs-tab.js +1 -1
  325. package/dist/components/bs-tabs.js +1 -1
  326. package/dist/components/bs-timepicker.js +1 -1
  327. package/dist/components/bs-toast.js +1 -1
  328. package/dist/components/bs-tooltip-trigger.d.ts +11 -0
  329. package/dist/components/bs-tooltip-trigger.js +1 -0
  330. package/dist/components/bs-tooltip.js +1 -1
  331. package/dist/components/bs-whats-new-entry.js +1 -1
  332. package/dist/components/bs-whats-new.js +1 -1
  333. package/dist/components/index.js +1 -1
  334. package/dist/components/p-B2gx7SZk.js +1 -0
  335. package/dist/components/{p-C_j_jDM6.js → p-BESyTlfT.js} +1 -1
  336. package/dist/components/{p-YsHQLXET.js → p-BIW9eUic.js} +1 -1
  337. package/dist/components/{p-Be_Pmccm.js → p-BJR8KVFc.js} +1 -1
  338. package/dist/components/{p-BEEoVNRu.js → p-BTPdjnXT.js} +1 -1
  339. package/dist/components/{p-Be9L4_Fe.js → p-CDYw4Eyj.js} +1 -1
  340. package/dist/components/{p-DuLL7Ouw.js → p-CRtvJlh8.js} +1 -1
  341. package/dist/components/{p-Dr0Qk9Zc.js → p-ChcaPfNL.js} +1 -1
  342. package/dist/components/{p-DE8K7fg0.js → p-CiSEDtbE.js} +1 -1
  343. package/dist/components/{p-CbimDNGY.js → p-CrmEXUwm.js} +1 -1
  344. package/dist/components/{p-zTHlbyH6.js → p-DAwSBMeM.js} +1 -1
  345. package/dist/components/{p-qmS2CBqi.js → p-DYuzgzxI.js} +1 -1
  346. package/dist/components/p-Dm3TqgV_.js +1 -0
  347. package/dist/components/{p-CUfs0ROR.js → p-DpVeeIko.js} +1 -1
  348. package/dist/components/{p-CA31vqjL.js → p-DvNED6Lb.js} +1 -1
  349. package/dist/components/{p-Bl_tVzeq.js → p-HAmR4gM2.js} +1 -1
  350. package/dist/components/p-HzaOqQ0U.js +1 -0
  351. package/dist/components/{p-C8yT2Ucq.js → p-QnTjSed5.js} +1 -1
  352. package/dist/components/{p-CncySD_-.js → p-Rx4bpeYN.js} +1 -1
  353. package/dist/components/p-nC2VxRNo.js +1 -0
  354. package/dist/components/p-zscW5LNR.js +1 -0
  355. package/dist/esm/brandsync-wc.js +3 -3
  356. package/dist/esm/bs-accordion-group.entry.js +31 -0
  357. package/dist/esm/bs-accordion.entry.js +1 -1
  358. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  359. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  360. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  361. package/dist/esm/bs-attachment-list.entry.js +2 -2
  362. package/dist/esm/bs-attachment.entry.js +9 -5
  363. package/dist/esm/bs-avatar.entry.js +1 -1
  364. package/dist/esm/bs-badge.entry.js +1 -1
  365. package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
  366. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  367. package/dist/esm/bs-breadcrumbs.entry.js +2 -2
  368. package/dist/esm/bs-button-skeleton.entry.js +4 -2
  369. package/dist/esm/bs-button.entry.js +1 -1
  370. package/dist/esm/bs-card.entry.js +1 -1
  371. package/dist/esm/bs-carousel.entry.js +1 -1
  372. package/dist/esm/bs-chatbot-feedback.entry.js +18 -2
  373. package/dist/esm/bs-chatbot-header.entry.js +20 -2
  374. package/dist/esm/bs-chatbot-response-action.entry.js +25 -3
  375. package/dist/esm/bs-chatbot-sources-drawer.entry.js +4 -2
  376. package/dist/esm/bs-chatbot-suggestion-button.entry.js +3 -3
  377. package/dist/esm/bs-checkbox-skeleton.entry.js +4 -2
  378. package/dist/esm/bs-checkbox.entry.js +1 -1
  379. package/dist/esm/bs-chip-filter.entry.js +1 -1
  380. package/dist/esm/bs-chip-informative.entry.js +1 -1
  381. package/dist/esm/bs-chip-input.entry.js +4 -2
  382. package/dist/esm/bs-citation-preview.entry.js +27 -0
  383. package/dist/esm/bs-composer-status-banner.entry.js +11 -3
  384. package/dist/esm/bs-composer.entry.js +36 -7
  385. package/dist/esm/bs-cookie-consent.entry.js +1 -1
  386. package/dist/esm/bs-data-table.entry.js +5 -3
  387. package/dist/esm/bs-datepicker.entry.js +1 -1
  388. package/dist/esm/bs-dialog.entry.js +4 -2
  389. package/dist/esm/bs-error-page.entry.js +1 -1
  390. package/dist/esm/bs-file-upload-item.entry.js +1 -1
  391. package/dist/esm/bs-file-upload.entry.js +1 -1
  392. package/dist/esm/bs-icon-button.entry.js +1 -1
  393. package/dist/esm/bs-icon-tile.entry.js +1 -1
  394. package/dist/esm/bs-inline-tab.entry.js +2 -2
  395. package/dist/esm/bs-input_3.entry.js +15 -7
  396. package/dist/esm/bs-logo.entry.js +1 -1
  397. package/dist/esm/bs-message-list.entry.js +69 -0
  398. package/dist/esm/bs-message.entry.js +23 -0
  399. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  400. package/dist/esm/bs-navigation-drawer.entry.js +9 -3
  401. package/dist/esm/bs-navigation-header.entry.js +2 -2
  402. package/dist/esm/bs-onboarding-checklist.entry.js +1 -1
  403. package/dist/esm/bs-pagination.entry.js +6 -2
  404. package/dist/esm/bs-popover.entry.js +151 -0
  405. package/dist/esm/bs-product-tour.entry.js +1 -1
  406. package/dist/esm/bs-progress-linear.entry.js +3 -3
  407. package/dist/esm/bs-progress.entry.js +3 -3
  408. package/dist/esm/bs-qr-code.entry.js +2 -2
  409. package/dist/esm/bs-radio.entry.js +2 -2
  410. package/dist/esm/bs-session-timeout.entry.js +2 -2
  411. package/dist/esm/bs-side-panel.entry.js +162 -0
  412. package/dist/esm/bs-skeleton.entry.js +49 -0
  413. package/dist/esm/bs-slider.entry.js +7 -3
  414. package/dist/esm/bs-snackbar.entry.js +2 -2
  415. package/dist/esm/bs-source-link.entry.js +3 -3
  416. package/dist/esm/bs-spinner.entry.js +22 -0
  417. package/dist/esm/bs-split-pane.entry.js +191 -0
  418. package/dist/esm/bs-stepper-step.entry.js +2 -2
  419. package/dist/esm/bs-stepper.entry.js +2 -2
  420. package/dist/esm/bs-switch.entry.js +2 -2
  421. package/dist/esm/bs-tab_3.entry.js +4 -4
  422. package/dist/esm/bs-timepicker.entry.js +8 -4
  423. package/dist/esm/bs-toast.entry.js +4 -2
  424. package/dist/esm/bs-tooltip-trigger.entry.js +44 -0
  425. package/dist/esm/bs-tooltip.entry.js +2 -2
  426. package/dist/esm/bs-whats-new.entry.js +1 -1
  427. package/dist/esm/index-D3SkQJpw.js +1853 -0
  428. package/dist/esm/loader.js +3 -3
  429. package/dist/types/components/bs-accordion-group/bs-accordion-group.cmp.test.d.ts +1 -0
  430. package/dist/types/components/bs-accordion-group/bs-accordion-group.d.ts +25 -0
  431. package/dist/types/components/bs-accordion-group/bs-accordion-group.stories.d.ts +9 -0
  432. package/dist/types/components/bs-attachment/bs-attachment.d.ts +4 -0
  433. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.d.ts +2 -0
  434. package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.d.ts +16 -0
  435. package/dist/types/components/bs-chatbot-header/bs-chatbot-header.d.ts +19 -0
  436. package/dist/types/components/bs-chatbot-response-action/bs-chatbot-response-action.d.ts +22 -0
  437. package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.d.ts +2 -0
  438. package/dist/types/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.d.ts +2 -5
  439. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.d.ts +2 -0
  440. package/dist/types/components/bs-chip/bs-chip-input/bs-chip-input.d.ts +2 -0
  441. package/dist/types/components/bs-citation-preview/bs-citation-preview.cmp.test.d.ts +1 -0
  442. package/dist/types/components/bs-citation-preview/bs-citation-preview.d.ts +40 -0
  443. package/dist/types/components/bs-citation-preview/bs-citation-preview.stories.d.ts +13 -0
  444. package/dist/types/components/bs-composer/bs-composer.d.ts +25 -1
  445. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.d.ts +5 -0
  446. package/dist/types/components/bs-data-table/bs-data-table.d.ts +2 -0
  447. package/dist/types/components/bs-dialog/bs-dialog.d.ts +2 -0
  448. package/dist/types/components/bs-input/bs-input.d.ts +8 -0
  449. package/dist/types/components/bs-message/bs-message.cmp.test.d.ts +1 -0
  450. package/dist/types/components/bs-message/bs-message.d.ts +49 -0
  451. package/dist/types/components/bs-message/bs-message.stories.d.ts +15 -0
  452. package/dist/types/components/bs-message-list/bs-message-list.cmp.test.d.ts +1 -0
  453. package/dist/types/components/bs-message-list/bs-message-list.d.ts +44 -0
  454. package/dist/types/components/bs-message-list/bs-message-list.stories.d.ts +8 -0
  455. package/dist/types/components/bs-pagination/bs-pagination.d.ts +4 -0
  456. package/dist/types/components/bs-popover/bs-popover.cmp.test.d.ts +1 -0
  457. package/dist/types/components/bs-popover/bs-popover.d.ts +58 -0
  458. package/dist/types/components/bs-popover/bs-popover.stories.d.ts +11 -0
  459. package/dist/types/components/bs-side-panel/bs-side-panel.cmp.test.d.ts +1 -0
  460. package/dist/types/components/bs-side-panel/bs-side-panel.d.ts +67 -0
  461. package/dist/types/components/bs-side-panel/bs-side-panel.stories.d.ts +14 -0
  462. package/dist/types/components/bs-skeleton/bs-skeleton.cmp.test.d.ts +1 -0
  463. package/dist/types/components/bs-skeleton/bs-skeleton.d.ts +44 -0
  464. package/dist/types/components/bs-skeleton/bs-skeleton.stories.d.ts +17 -0
  465. package/dist/types/components/bs-slider/bs-slider.d.ts +4 -0
  466. package/dist/types/components/bs-spinner/bs-spinner.cmp.test.d.ts +1 -0
  467. package/dist/types/components/bs-spinner/bs-spinner.d.ts +32 -0
  468. package/dist/types/components/bs-spinner/bs-spinner.stories.d.ts +12 -0
  469. package/dist/types/components/bs-split-pane/bs-split-pane.cmp.test.d.ts +1 -0
  470. package/dist/types/components/bs-split-pane/bs-split-pane.d.ts +85 -0
  471. package/dist/types/components/bs-split-pane/bs-split-pane.stories.d.ts +15 -0
  472. package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +4 -0
  473. package/dist/types/components/bs-toast/bs-toast.d.ts +2 -0
  474. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.d.ts +1 -0
  475. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.d.ts +35 -0
  476. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.d.ts +10 -0
  477. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.d.ts +6 -0
  478. package/dist/types/components.d.ts +1995 -39
  479. package/dist/types/global/brand-theming.cmp.test.d.ts +1 -0
  480. package/package.json +21 -5
  481. package/reference.d.ts +245 -0
  482. package/reference.json +4284 -0
  483. package/reference.mjs +2 -0
  484. package/tailwind-preset.cjs +36 -0
  485. package/testing/vitest-setup.mjs +41 -0
  486. package/dist/brandsync-wc/p-09cbf05b.entry.js +0 -1
  487. package/dist/brandsync-wc/p-0f8cd2e8.entry.js +0 -1
  488. package/dist/brandsync-wc/p-1261f0b0.entry.js +0 -1
  489. package/dist/brandsync-wc/p-20030f4d.entry.js +0 -1
  490. package/dist/brandsync-wc/p-22f8201a.entry.js +0 -1
  491. package/dist/brandsync-wc/p-34e5feaf.entry.js +0 -1
  492. package/dist/brandsync-wc/p-3a1af63a.entry.js +0 -1
  493. package/dist/brandsync-wc/p-452f9c1c.entry.js +0 -1
  494. package/dist/brandsync-wc/p-6a696161.entry.js +0 -1
  495. package/dist/brandsync-wc/p-6c6cdf77.entry.js +0 -1
  496. package/dist/brandsync-wc/p-6e735e37.entry.js +0 -1
  497. package/dist/brandsync-wc/p-73f214ed.entry.js +0 -1
  498. package/dist/brandsync-wc/p-823ab3b2.entry.js +0 -1
  499. package/dist/brandsync-wc/p-DqQRXQMx.js +0 -3
  500. package/dist/brandsync-wc/p-b84366a7.entry.js +0 -1
  501. package/dist/brandsync-wc/p-b8d2ce91.entry.js +0 -1
  502. package/dist/brandsync-wc/p-b9a4042e.entry.js +0 -1
  503. package/dist/brandsync-wc/p-d754ee13.entry.js +0 -1
  504. package/dist/brandsync-wc/p-d75f3f87.entry.js +0 -1
  505. package/dist/brandsync-wc/p-d8b29a53.entry.js +0 -1
  506. package/dist/brandsync-wc/p-f7d15fbe.entry.js +0 -1
  507. package/dist/cjs/index-tFJjflK5.js +0 -1863
  508. package/dist/components/p-BGW5q5LZ.js +0 -1
  509. package/dist/components/p-BZ3M4lOU.js +0 -1
  510. package/dist/components/p-CVrEuVFo.js +0 -1
  511. package/dist/components/p-CeUK3n7D.js +0 -1
  512. package/dist/esm/index-DqQRXQMx.js +0 -1853
@@ -0,0 +1,247 @@
1
+ import { h } from "@stencil/core";
2
+ let popoverId = 0;
3
+ /**
4
+ * A trigger plus a popup panel that opens on trigger click and closes on outside click or Escape.
5
+ *
6
+ * The popup is positioned with CSS (absolute, relative to the host) and flips to the opposite side
7
+ * when it would overflow the viewport; the effective placement is mirrored on the host as
8
+ * `data-placement`. Focus moves into the popup on open and back to the trigger on close. The popup content is slotted, so it is typically a `bs-menu` or a list.
9
+ *
10
+ * ## When to use
11
+ * - A menu, language list or small set of options revealed from a button.
12
+ *
13
+ * ## When not to use
14
+ * - A blocking decision (use `bs-dialog`) or a hover-only hint (use `bs-tooltip-trigger`).
15
+ *
16
+ * @slot trigger - The element that toggles the popup (e.g. a `bs-button`).
17
+ * @slot - Default slot: the popup content.
18
+ * @part trigger - The wrapper around the trigger; carries aria-expanded/aria-haspopup/aria-controls.
19
+ * @part popup - The popup surface.
20
+ * @prop --bs-popover-bg - Popup background. Aliased to `--bs-surface-raised`.
21
+ * @prop --bs-popover-radius - Popup corner radius. Aliased to `--bs-border-radius-100`.
22
+ * @prop --bs-popover-shadow - Popup shadow. Aliased to `--bs-shadow-md`.
23
+ * @prop --bs-popover-offset - Gap between trigger and popup. Aliased to `--bs-spacing-100`.
24
+ * @prop --bs-popover-min-width - Minimum popup width. Aliased to `--bs-scale-1600`.
25
+ * @prop --bs-popover-z-index - Popup stacking order. Aliased to `--bs-z-index-popover`.
26
+ */
27
+ export class BsPopover {
28
+ el;
29
+ /** Whether the popup is shown. */
30
+ open = false;
31
+ /** Where the popup sits relative to the trigger. */
32
+ placement = 'bottom-start';
33
+ /** Emitted when the open state changes through user interaction, with the new value. */
34
+ bsOpenChange;
35
+ popupId = `bs-popover-${++popoverId}`;
36
+ triggerSlot;
37
+ popupEl;
38
+ needsFocusIn = false;
39
+ escaped = false;
40
+ onOpenChange(next) {
41
+ this.detach();
42
+ if (next) {
43
+ document.addEventListener('click', this.onDocClick, true);
44
+ document.addEventListener('keydown', this.onKeyDown);
45
+ window.addEventListener('resize', this.reposition);
46
+ window.addEventListener('scroll', this.reposition, true);
47
+ this.needsFocusIn = true;
48
+ }
49
+ else {
50
+ this.needsFocusIn = false;
51
+ this.el.setAttribute('data-placement', this.placement);
52
+ const active = this.el.shadowRoot?.activeElement || document.activeElement;
53
+ const focusInside = this.el.contains(document.activeElement) && document.activeElement !== this.triggerSlot?.assignedElements()[0] && !this.isInTrigger(document.activeElement);
54
+ if (this.escaped || (focusInside && active))
55
+ this.focusTrigger();
56
+ }
57
+ this.escaped = false;
58
+ }
59
+ onPlacementChange() {
60
+ this.reposition();
61
+ }
62
+ componentWillLoad() {
63
+ this.el.setAttribute('data-placement', this.placement);
64
+ }
65
+ componentDidRender() {
66
+ if (!this.open)
67
+ return;
68
+ this.reposition();
69
+ if (this.needsFocusIn) {
70
+ this.needsFocusIn = false;
71
+ this.focusPopup();
72
+ }
73
+ }
74
+ isInTrigger(node) {
75
+ const first = this.triggerSlot?.assignedElements() ?? [];
76
+ return !!node && first.some(t => t.contains(node));
77
+ }
78
+ /** Effective placement after collision flipping; mirrored on the host as `data-placement`. */
79
+ reposition = () => {
80
+ if (!this.open || !this.popupEl)
81
+ return;
82
+ const [v, h] = this.placement.split('-');
83
+ // Measure from the preferred placement.
84
+ this.el.setAttribute('data-placement', this.placement);
85
+ const trig = this.el.getBoundingClientRect();
86
+ const pop = this.popupEl.getBoundingClientRect();
87
+ const vh = window.innerHeight;
88
+ const vw = window.innerWidth;
89
+ let rv = v;
90
+ let rh = h;
91
+ if (v === 'bottom' && pop.bottom > vh && trig.top >= pop.height)
92
+ rv = 'top';
93
+ else if (v === 'top' && pop.top < 0 && vh - trig.bottom >= pop.height)
94
+ rv = 'bottom';
95
+ if (h === 'start' && pop.right > vw && trig.right >= pop.width)
96
+ rh = 'end';
97
+ else if (h === 'end' && pop.left < 0 && vw - trig.left >= pop.width)
98
+ rh = 'start';
99
+ this.el.setAttribute('data-placement', `${rv}-${rh}`);
100
+ };
101
+ focusPopup() {
102
+ const sel = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
103
+ const slot = this.popupEl?.querySelector('slot');
104
+ const assigned = slot?.assignedElements({ flatten: true }) ?? [];
105
+ for (const a of assigned) {
106
+ const target = a.matches(sel) ? a : a.querySelector(sel);
107
+ if (target) {
108
+ target.focus();
109
+ return;
110
+ }
111
+ }
112
+ this.popupEl?.focus();
113
+ }
114
+ disconnectedCallback() {
115
+ this.detach();
116
+ }
117
+ componentDidLoad() {
118
+ if (this.open)
119
+ this.onOpenChange(true);
120
+ }
121
+ detach() {
122
+ document.removeEventListener('click', this.onDocClick, true);
123
+ document.removeEventListener('keydown', this.onKeyDown);
124
+ window.removeEventListener('resize', this.reposition);
125
+ window.removeEventListener('scroll', this.reposition, true);
126
+ }
127
+ setOpen(next) {
128
+ if (this.open === next)
129
+ return;
130
+ this.open = next;
131
+ this.bsOpenChange.emit(next);
132
+ }
133
+ focusTrigger() {
134
+ const first = this.triggerSlot?.assignedElements()[0];
135
+ first?.focus();
136
+ }
137
+ onTriggerKeyDown = (ev) => {
138
+ if (ev.key === 'ArrowDown' && !this.open) {
139
+ ev.preventDefault();
140
+ this.setOpen(true);
141
+ }
142
+ };
143
+ onTriggerClick = () => this.setOpen(!this.open);
144
+ onDocClick = (ev) => {
145
+ if (!ev.composedPath().includes(this.el))
146
+ this.setOpen(false);
147
+ };
148
+ onKeyDown = (ev) => {
149
+ if (ev.key === 'Escape' && this.open) {
150
+ this.escaped = true;
151
+ this.setOpen(false);
152
+ }
153
+ };
154
+ render() {
155
+ return (h("div", { key: 'e4e96eb40953abdd3f5f9a9169cfe2b9ad87d3b5', class: "bs-popover" }, h("div", { key: '6456d7cb3cba9e243015086095534cad82716711', part: "trigger", class: "bs-popover__trigger", "aria-haspopup": "true", "aria-expanded": String(this.open), "aria-controls": this.popupId, onClick: this.onTriggerClick, onKeyDown: this.onTriggerKeyDown }, h("slot", { key: '1a1d545bf0afc0a59e4f9f7f29bf359cc2264c65', name: "trigger", ref: el => (this.triggerSlot = el) })), h("div", { key: '8a1e1e3ade63f2cba665368f3bd2659ce659ee18', part: "popup", id: this.popupId, class: "bs-popover__popup", tabindex: "-1", hidden: !this.open, ref: el => (this.popupEl = el) }, h("slot", { key: 'abdeeb2105d00487a43f23dd6021c61b533e8139' }))));
156
+ }
157
+ static get is() { return "bs-popover"; }
158
+ static get encapsulation() { return "shadow"; }
159
+ static get originalStyleUrls() {
160
+ return {
161
+ "$": ["bs-popover.css"]
162
+ };
163
+ }
164
+ static get styleUrls() {
165
+ return {
166
+ "$": ["bs-popover.css"]
167
+ };
168
+ }
169
+ static get properties() {
170
+ return {
171
+ "open": {
172
+ "type": "boolean",
173
+ "mutable": true,
174
+ "complexType": {
175
+ "original": "boolean",
176
+ "resolved": "boolean",
177
+ "references": {}
178
+ },
179
+ "required": false,
180
+ "optional": false,
181
+ "docs": {
182
+ "tags": [],
183
+ "text": "Whether the popup is shown."
184
+ },
185
+ "getter": false,
186
+ "setter": false,
187
+ "reflect": true,
188
+ "attribute": "open",
189
+ "defaultValue": "false"
190
+ },
191
+ "placement": {
192
+ "type": "string",
193
+ "mutable": false,
194
+ "complexType": {
195
+ "original": "BsPopoverPlacement",
196
+ "resolved": "\"bottom-end\" | \"bottom-start\" | \"top-end\" | \"top-start\"",
197
+ "references": {
198
+ "BsPopoverPlacement": {
199
+ "location": "local",
200
+ "path": "/home/runner/work/eg-brandsync-storybook/eg-brandsync-storybook/packages/wc/src/components/bs-popover/bs-popover.tsx",
201
+ "id": "src/components/bs-popover/bs-popover.tsx::BsPopoverPlacement"
202
+ }
203
+ }
204
+ },
205
+ "required": false,
206
+ "optional": false,
207
+ "docs": {
208
+ "tags": [],
209
+ "text": "Where the popup sits relative to the trigger."
210
+ },
211
+ "getter": false,
212
+ "setter": false,
213
+ "reflect": true,
214
+ "attribute": "placement",
215
+ "defaultValue": "'bottom-start'"
216
+ }
217
+ };
218
+ }
219
+ static get events() {
220
+ return [{
221
+ "method": "bsOpenChange",
222
+ "name": "bsOpenChange",
223
+ "bubbles": true,
224
+ "cancelable": true,
225
+ "composed": true,
226
+ "docs": {
227
+ "tags": [],
228
+ "text": "Emitted when the open state changes through user interaction, with the new value."
229
+ },
230
+ "complexType": {
231
+ "original": "boolean",
232
+ "resolved": "boolean",
233
+ "references": {}
234
+ }
235
+ }];
236
+ }
237
+ static get elementRef() { return "el"; }
238
+ static get watchers() {
239
+ return [{
240
+ "propName": "open",
241
+ "methodName": "onOpenChange"
242
+ }, {
243
+ "propName": "placement",
244
+ "methodName": "onPlacementChange"
245
+ }];
246
+ }
247
+ }
@@ -0,0 +1,26 @@
1
+ import { html } from "lit";
2
+ import { componentDescription } from "../../stories-utils";
3
+ const meta = {
4
+ title: 'Components/bs-popover',
5
+ parameters: { docs: { description: { component: componentDescription('bs-popover') } } },
6
+ render: args => html `
7
+ <div style="padding: 80px 160px;">
8
+ <bs-popover ?open=${args.open} placement=${args.placement}>
9
+ <bs-button slot="trigger">Language</bs-button>
10
+ <bs-menu>
11
+ <bs-menu-item>English</bs-menu-item>
12
+ <bs-menu-item>Dansk</bs-menu-item>
13
+ </bs-menu>
14
+ </bs-popover>
15
+ </div>
16
+ `,
17
+ argTypes: {
18
+ open: { control: 'boolean' },
19
+ placement: { control: 'select', options: ['bottom-start', 'bottom-end', 'top-start', 'top-end'] },
20
+ },
21
+ args: { open: false, placement: 'bottom-start' },
22
+ };
23
+ export default meta;
24
+ export const Default = {};
25
+ export const Open = { args: { open: true } };
26
+ export const TopEnd = { name: 'Placement top-end', args: { open: true, placement: 'top-end' } };
@@ -69,7 +69,7 @@ export class BsProgress {
69
69
  const isDeterminate = this.type === 'determinate';
70
70
  const value = this.clampedValue;
71
71
  const dashOffset = circumference * (1 - value / 100);
72
- return (h("div", { key: '9d9c371ea92f67811e9ab927d346f2bece833cf5', part: "container", class: "bs-progress" }, h("div", { key: '5753f1db2b3f79a55b2ff7936cdb836f10c29bc3', class: "bs-progress__box", style: { width: `${diameter}px`, height: `${diameter}px` }, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("svg", { class: "bs-progress__ring", width: diameter, height: diameter, viewBox: `0 0 ${diameter} ${diameter}` }, h("circle", { part: "track", class: "bs-progress__track", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none" }), h("circle", { part: "arc", class: "bs-progress__arc", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none", "stroke-linecap": "round", "stroke-dasharray": circumference, "stroke-dashoffset": dashOffset }))) : (
72
+ return (h("div", { key: '2909533f8b4472a7c12c564c3b42b6456d5d1c80', part: "container", class: "bs-progress" }, h("div", { key: '3f41fc7f22d7c9eba13e859330aae4f6230af8ab', class: "bs-progress__box", style: { width: `${diameter}px`, height: `${diameter}px` }, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("svg", { class: "bs-progress__ring", width: diameter, height: diameter, viewBox: `0 0 ${diameter} ${diameter}` }, h("circle", { part: "track", class: "bs-progress__track", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none" }), h("circle", { part: "arc", class: "bs-progress__arc", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none", "stroke-linecap": "round", "stroke-dasharray": circumference, "stroke-dashoffset": dashOffset }))) : (
73
73
  // Figma's indeterminate ring is a fading "comet tail" (transparent -> solid color),
74
74
  // not a flat-colored partial arc -- SVG has no angular/conic gradient primitive, so a
75
75
  // CSS conic-gradient (color varying by angle) + a radial-gradient mask (carving the
@@ -78,7 +78,7 @@ export class BsProgress {
78
78
  h("div", { part: "arc", class: "bs-progress__spinner", style: {
79
79
  '--bs-progress-spinner-stroke-width': `${this.strokeWidth}px`,
80
80
  '--bs-progress-spinner-sweep': `${INDETERMINATE_SWEEP_DEGREES}deg`,
81
- } }))), isDeterminate && this.showLabel && (h("span", { key: '68381d4570b3f4d29d4b671f5069c7f4c02669e7', part: "label", class: `bs-progress__label bs-progress__label--${this.size}` }, value, "%"))));
81
+ } }))), isDeterminate && this.showLabel && (h("span", { key: '417f47612fc45127c4a1832a6cb4122ad16d9579', part: "label", class: `bs-progress__label bs-progress__label--${this.size}` }, value, "%"))));
82
82
  }
83
83
  static get is() { return "bs-progress"; }
84
84
  static get encapsulation() { return "shadow"; }
@@ -51,13 +51,13 @@ export class BsProgressLinear {
51
51
  render() {
52
52
  const isDeterminate = this.type === 'determinate';
53
53
  const value = this.clampedValue;
54
- return (h("div", { key: '783f94f3ea320d9a8169c1d253037ae3631179e1', part: "container", class: "bs-progress-linear" }, h("div", { key: '9b5e0c1f0a641683bf9e763b2e3ede0b814f26cf', part: "track", class: `bs-progress-linear__track bs-progress-linear__track--${this.size}`, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("div", { part: "fill", class: "bs-progress-linear__fill", style: { width: `${value}%` } })) : (
54
+ return (h("div", { key: 'abdae797c319d17404ea15adf1b312c0f19e0ed9', part: "container", class: "bs-progress-linear" }, h("div", { key: 'ec250c3d5d93c6d6fd4c20d57ea7e7177dac2b91', part: "track", class: `bs-progress-linear__track bs-progress-linear__track--${this.size}`, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("div", { part: "fill", class: "bs-progress-linear__fill", style: { width: `${value}%` } })) : (
55
55
  // Figma's indeterminate bar is a soft "comet" gradient segment (transparent -> blue ->
56
56
  // transparent) sliding left-to-right across the track's full width in a loop -- the
57
57
  // same fade concept as bs-progress's indeterminate ring's conic-gradient comet tail,
58
58
  // but along a straight line via a linear-gradient + `transform: translateX(...)`
59
59
  // keyframe animation instead of a rotating conic-gradient.
60
- h("div", { part: "fill", class: "bs-progress-linear__fill bs-progress-linear__fill--indeterminate" }))), this.showLabel && this.hasLabelContent && (h("span", { key: 'bb81cebfe79bb6e722fe0fb3cd561318a5f06ac6', part: "label", class: "bs-progress-linear__label" }, h("slot", { key: 'df04863716047f5b1fa4c70f20744ac25713840b' })))));
60
+ h("div", { part: "fill", class: "bs-progress-linear__fill bs-progress-linear__fill--indeterminate" }))), this.showLabel && this.hasLabelContent && (h("span", { key: 'd7fd99b0b5666b83cd597086a2643a919b9b9d5c', part: "label", class: "bs-progress-linear__label" }, h("slot", { key: '81adeaf185aa995907b317b960fffa4b684404e4' })))));
61
61
  }
62
62
  // The default slot's assigned content lives in the host's light DOM regardless of whether a
63
63
  // <slot> is currently rendered in the shadow tree, so this can be computed directly from the
@@ -168,7 +168,7 @@ export class BsQrCode {
168
168
  const buttonSize = this.size === 'sm' ? 'sm' : 'md';
169
169
  // Figma shows the unavailable actions as filled-disabled (grey) rather than a faded outline,
170
170
  // which is what bs-button's disabled primary looks like.
171
- return (h("bs-card", { key: '9224eadd42ddc8b59466a301ce72bf0311e00edd', part: "container", class: "bs-qr-code", surface: "base" }, this.closable && (h("bs-icon-button", { key: '1fd99ef2996a876ea8fe5ae237128c8059bfccbf', part: "close", class: "bs-qr-code__close", variant: "subtle", size: "sm", ariaLabel: this.closeLabel, onClick: () => this.bsClose.emit() }, h("svg", { key: 'e38bde58cd6532c3ca56b2920a42dfc157517484', viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", "stroke-width": "1.6", "stroke-linecap": "round", "aria-hidden": "true" }, h("path", { key: '6d6c93934c724a1cc0b8b66bdfd129650b1f9024', d: "M5 5L15 15M15 5L5 15" })))), h("div", { key: 'b8f2478eeb88a2d273f61f819679cb752e894a5a', class: "bs-qr-code__body" }, h("div", { key: '7e51f3bd0cde05566bb33c4fbe2478795ff3fe26', part: "head", class: "bs-qr-code__head" }, h("p", { key: '1d0956f6fc3e0f0658b5934a140e56ef25ae1f6b', part: "title", class: "bs-qr-code__title" }, this.heading), this.description && (h("p", { key: 'f43da3546accd752a856e1202baaff0043142ce4', part: "description", class: "bs-qr-code__description" }, this.description))), h("div", { key: '3b8dcdbb35c20e71f9c9e41ad4e2ae939e8dc0e7', part: "qr", class: "bs-qr-code__qr" }, h("div", { key: '3c86af5e70b746b2dc8ce9c7adf58649314a985d', part: "code", class: "bs-qr-code__code" }, h("slot", { key: '32d0dc8670a6045220b9546731ae5aef48d355df', name: "code" }, this.renderMatrix()), h("div", { key: 'ffba953b953bef8a8765955a5db4b9fba1e2cec8', part: "logo", class: { 'bs-qr-code__logo': true, 'bs-qr-code__logo--visible': this.hasLogo } }, h("slot", { key: 'b6e213f3a624cf8a6cf0b344c6ffc7b1f2c1be34', name: "logo", onSlotchange: (ev) => (this.hasLogo = ev.target.assignedNodes().length > 0) }))), this.renderOverlay()), this.type === 'payment' && this.amount && (h("div", { key: '56155722b1cf13d21850bae43e4323ddc0ed8635', part: "amount", class: "bs-qr-code__amount" }, this.amountLabel && h("p", { key: 'd1f90a299ef1f8d5c896a31147612ceef4485339', class: "bs-qr-code__amount-label" }, this.amountLabel), h("p", { key: '40ef657d7bc01e58089bf55044fb0ef8556386ba', class: "bs-qr-code__amount-value" }, this.amount))), this.type === 'default' && this.url && (h("div", { key: '5d7a7d2537752948631098567c732582e9e34d92', part: "url", class: "bs-qr-code__url" }, this.url)), this.expiry && (h("bs-chip-informative", { key: 'e040513edd4c24d60e41c4e09ed0b97be11e24b3', part: "expiry", size: "md" }, h(TimerIcon, { key: '0c1b8052bed0bddd2e84bc3ca9929008f781213c', slot: "icon" }), this.expiry)), showActions && (h("div", { key: 'f30073c9b79df1aec27f361d5b94e92c8aa8f7fc', part: "actions", class: "bs-qr-code__actions" }, !this.hideDownload && (h("bs-button", { key: '12b6b333efed74dfb76360441838de2a872f3c4b', part: "download", variant: interactive ? 'outlined' : 'primary', size: buttonSize, disabled: !interactive, onClick: () => interactive && this.bsDownload.emit() }, h(DownloadIcon, { key: '3c831e241288ccce97fb77a3d42c0c3de58e6734', slot: "icon" }), this.downloadLabel)), !this.hideCopy && (h("bs-button", { key: '260deebae80a52c700dc2532883a706363da0caa', part: "copy", variant: interactive ? 'outlined' : 'primary', size: buttonSize, disabled: !interactive, onClick: () => interactive && this.onCopy() }, h(CopyIcon, { key: '8a09b1b4a06d492449f563aa73c2b2191fb29680', slot: "icon" }), this.copyLabel)))))));
171
+ return (h("bs-card", { key: '01dc0befd273aecce2437e98987fa6a76555a65c', part: "container", class: "bs-qr-code", surface: "base" }, this.closable && (h("bs-icon-button", { key: 'b611e446cbaa4267f7cfcb6e1baa1352e316994c', part: "close", class: "bs-qr-code__close", variant: "subtle", size: "sm", ariaLabel: this.closeLabel, onClick: () => this.bsClose.emit() }, h("svg", { key: 'c3af9b06190a8d98e80a1ba5aa32a614cf706ef8', viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", "stroke-width": "1.6", "stroke-linecap": "round", "aria-hidden": "true" }, h("path", { key: 'bc86434823fabb3375bd2aa7c8382b33ed94e293', d: "M5 5L15 15M15 5L5 15" })))), h("div", { key: '95520bbba236876975ca8097f923162c9af84505', class: "bs-qr-code__body" }, h("div", { key: '1c5ab32fd408dfb874914848daf611d5ede8fc15', part: "head", class: "bs-qr-code__head" }, h("p", { key: '765b6700e9d73ad9858e7dfed25adba98d9f37a4', part: "title", class: "bs-qr-code__title" }, this.heading), this.description && (h("p", { key: '9994b60173dfdce115ab249122f29d17f8e530da', part: "description", class: "bs-qr-code__description" }, this.description))), h("div", { key: '9a32be6fa563ff3ed7f7825ce793cd1521989dbe', part: "qr", class: "bs-qr-code__qr" }, h("div", { key: '9aa3199f1d5dac68eb4b3d8c6e490199964715ab', part: "code", class: "bs-qr-code__code" }, h("slot", { key: 'e859ada22ca6dad597fb2d3c239662a51b43b39c', name: "code" }, this.renderMatrix()), h("div", { key: '49023d47353f7eac10d46d7be68be8691be50455', part: "logo", class: { 'bs-qr-code__logo': true, 'bs-qr-code__logo--visible': this.hasLogo } }, h("slot", { key: '53125aeb2c4891ca790268f9ef5ee3ba37cae5f0', name: "logo", onSlotchange: (ev) => (this.hasLogo = ev.target.assignedNodes().length > 0) }))), this.renderOverlay()), this.type === 'payment' && this.amount && (h("div", { key: '2714b2a6513da5442809292f78b31141ee77ce81', part: "amount", class: "bs-qr-code__amount" }, this.amountLabel && h("p", { key: '51573f23cf8d2c3a0b7e3df2a9ff212f18c92539', class: "bs-qr-code__amount-label" }, this.amountLabel), h("p", { key: 'dc7c005152c216ababde9282c385856e8d6b3b57', class: "bs-qr-code__amount-value" }, this.amount))), this.type === 'default' && this.url && (h("div", { key: 'a3f3c4d1ceea0ba079ca204a1acd5447551f86f4', part: "url", class: "bs-qr-code__url" }, this.url)), this.expiry && (h("bs-chip-informative", { key: '39d95354200ccf4cfbfc9dc3c15da200955fa2f5', part: "expiry", size: "md" }, h(TimerIcon, { key: '7244fd36a173052caf4db2e4f0f2ad05f3569341', slot: "icon" }), this.expiry)), showActions && (h("div", { key: 'f6c808132c0ca1d8af27b8aedf5cc5f86a3ba7e8', part: "actions", class: "bs-qr-code__actions" }, !this.hideDownload && (h("bs-button", { key: 'ff50126a297987518e4e174c08db438560671d95', part: "download", variant: interactive ? 'outlined' : 'primary', size: buttonSize, disabled: !interactive, onClick: () => interactive && this.bsDownload.emit() }, h(DownloadIcon, { key: 'e7c982907553a6607b3c941c77a4f88876c71c85', slot: "icon" }), this.downloadLabel)), !this.hideCopy && (h("bs-button", { key: 'bc603f4ba0a2bfa12112806b2eb2a04ccec60568', part: "copy", variant: interactive ? 'outlined' : 'primary', size: buttonSize, disabled: !interactive, onClick: () => interactive && this.onCopy() }, h(CopyIcon, { key: '35e27d196c9475f5b0be1dd0e389b699d08ec7db', slot: "icon" }), this.copyLabel)))))));
172
172
  }
173
173
  static get is() { return "bs-qr-code"; }
174
174
  static get encapsulation() { return "shadow"; }
@@ -104,7 +104,7 @@ export class BsRadio {
104
104
  }
105
105
  };
106
106
  render() {
107
- return (h("label", { key: '62ae7bf3a50e1b0b6af17208685a5c7ffe6f5e5e', class: `bs-radio ${this.disabled ? 'bs-radio--disabled' : ''}` }, h("input", { key: '01b09c6a36c9765875d34abb96772554990ce095', class: "bs-radio__input", type: "radio", name: this.name, value: this.value, checked: this.checked, disabled: this.disabled, tabIndex: this.checked || !this.groupHasChecked ? 0 : -1, onKeyDown: this.onKeyDown, onChange: this.onChange }), h("span", { key: 'd56c108212d17d617e7abadc6189fd4b86dba233', class: "bs-radio__hit-area" }, h("span", { key: '63df5b0139573c1a7cbf64cf1c2e15009aeae8e2', class: "bs-radio__state-layer" }, h("span", { key: '43c32995245eba557d41a8c9a65ba9716d4a9766', part: "circle", class: `bs-radio__circle ${this.checked ? 'bs-radio__circle--selected' : ''}` }, this.checked && h("span", { key: '6ef4edf491bcaeac94b639abf5ef497e98cb8119', part: "dot", class: "bs-radio__dot" })))), h("span", { key: '60a21c23fdca6d92cbaad1bf69bd3c3c8441d24f', part: "label", class: "bs-radio__label" }, h("slot", { key: 'a920122f7b88b07ef743735e50f9ad71042be308' }))));
107
+ return (h("label", { key: '5c69e7244183b1116d44e50079371d0bf29ac058', class: `bs-radio ${this.disabled ? 'bs-radio--disabled' : ''}` }, h("input", { key: 'f40a114f0e9fcb21ff0e7bb02876ded6979b7727', class: "bs-radio__input", type: "radio", name: this.name, value: this.value, checked: this.checked, disabled: this.disabled, tabIndex: this.checked || !this.groupHasChecked ? 0 : -1, onKeyDown: this.onKeyDown, onChange: this.onChange }), h("span", { key: '4cca356fd757d34f24ec5d8a8a3a2517da004409', class: "bs-radio__hit-area" }, h("span", { key: '6beda905b88e822335ebf67a64eba5df86beb4a9', class: "bs-radio__state-layer" }, h("span", { key: '28e63967c2ad046f694c2097d2aec35f4ebcf843', part: "circle", class: `bs-radio__circle ${this.checked ? 'bs-radio__circle--selected' : ''}` }, this.checked && h("span", { key: 'cda8ba5bf3f5bf99564e6f0f1af115803e33f6c0', part: "dot", class: "bs-radio__dot" })))), h("span", { key: 'df59f8b97fb54cc037732a22412ec64464df8bdc', part: "label", class: "bs-radio__label" }, h("slot", { key: '154be3de3d6fe5aa0cb8fd7d806c28956a21e87d' }))));
108
108
  }
109
109
  static get is() { return "bs-radio"; }
110
110
  static get encapsulation() { return "shadow"; }
@@ -196,7 +196,7 @@ export class BsSessionTimeout {
196
196
  const description = this.description ?? d.description;
197
197
  const primary = this.primaryLabel ?? d.primary;
198
198
  const secondary = this.secondaryLabel ?? d.secondary;
199
- return (h("bs-card", { key: '45a056eabc2f536128ee6adbc6104d76793301f4', part: "container", class: "bs-session-timeout", surface: "base", role: "region", "aria-labelledby": "heading" }, h("div", { key: '035795cb4b5b0252212270236f048e3216d5d401', class: "bs-session-timeout__body" }, !this.hideIcon && (h("bs-icon-tile", { key: '857db99f58d07483d3c7dadd95e5951a645d0c59', part: "art", intent: d.intent, size: "lg" }, h("slot", { key: '41504daf4751677d9b1df0d211e719d8f441f5b2', name: "icon" }, d.glyph()))), this.renderHeading(heading, description), this.type === 'warning' && this.renderWarning(), this.type === 'warning' && this.savedMessage && (h("p", { key: '8ba10b3921db4b3cedbeb3d45bddfb89425bbdbb', part: "saved", class: "bs-session-timeout__saved" }, h(InfoIcon, { key: '44ea938fca553c67ae23628833471ceb98e63b06' }), h("span", { key: '672ebc96828437ffbc67711082fd7018611153b7' }, this.savedMessage))), this.type === 'signed-out' && this.renderAccount(), this.type === 'confirm-identity' && this.renderConfirm(), this.type === 'warning' && (primary || secondary) && (h("div", { key: '94221156fe30010bd0fbe4fb0146c95feceab50f', part: "actions", class: "bs-session-timeout__actions" }, secondary && (h("bs-button", { key: '09b14d30bc185a4644902e52100f0493da6109a0', part: "secondary", variant: "outlined", onClick: () => this.bsSecondary.emit() }, secondary)), primary && (h("bs-button", { key: 'be381ed4be453efd306b28da3e1f4b7f0740c024', part: "primary", variant: "primary", onClick: () => this.bsPrimary.emit() }, primary)))), this.type === 'signed-out' && (primary || secondary) && (h("div", { key: '6b3b3622809165f70d83c68db409e2373ea1008e', part: "actions", class: "bs-session-timeout__actions bs-session-timeout__actions--stacked" }, primary && (h("bs-button", { key: 'f03d85c00ce0c18e14e26d2b4332ddb987b93f9e', part: "primary", class: "bs-session-timeout__block-button", variant: "primary", onClick: () => this.bsPrimary.emit() }, primary)), secondary && (h("bs-button", { key: 'a9bf95d13955110f7f36561b9acc3c89a5862de5', part: "secondary", class: "bs-session-timeout__text-button", variant: "subtle", size: "lg", onClick: () => this.bsSecondary.emit() }, secondary)))), h("div", { key: '69ada1eed62f93587b2c2f45aa1d3ea933ba682f', class: "bs-session-timeout__sr-only", role: "status", "aria-live": "polite" }, this.announcement))));
199
+ return (h("bs-card", { key: 'a59288c1e524507781d37b23493224c299ca697a', part: "container", class: "bs-session-timeout", surface: "base", role: "region", "aria-labelledby": "heading" }, h("div", { key: 'adde8ef701bc24337fe42998c9f3af0fd3b817bf', class: "bs-session-timeout__body" }, !this.hideIcon && (h("bs-icon-tile", { key: 'a3d1f87b2fcd29a319be7e119bf76c800b343e48', part: "art", intent: d.intent, size: "lg" }, h("slot", { key: '42b9193378bf88f0ea2f4e3ac48a0ff58545d21b', name: "icon" }, d.glyph()))), this.renderHeading(heading, description), this.type === 'warning' && this.renderWarning(), this.type === 'warning' && this.savedMessage && (h("p", { key: 'ed78d1c152d3edcf0db93c7bb8b6d744ae8283c5', part: "saved", class: "bs-session-timeout__saved" }, h(InfoIcon, { key: '7992c624db71b1471ea62b82f5d8c90d438d7ee1' }), h("span", { key: 'a4cdc8e871083a685de65d3e785800ff6af1452e' }, this.savedMessage))), this.type === 'signed-out' && this.renderAccount(), this.type === 'confirm-identity' && this.renderConfirm(), this.type === 'warning' && (primary || secondary) && (h("div", { key: '756f8e8cddd87c273273621d69796be30a9daa3e', part: "actions", class: "bs-session-timeout__actions" }, secondary && (h("bs-button", { key: '525c02f57453d82e5e2105b1f28d8f7ca8e8e1bc', part: "secondary", variant: "outlined", onClick: () => this.bsSecondary.emit() }, secondary)), primary && (h("bs-button", { key: 'daaf10a97c4306a657fce5ec827a067659a2b2d7', part: "primary", variant: "primary", onClick: () => this.bsPrimary.emit() }, primary)))), this.type === 'signed-out' && (primary || secondary) && (h("div", { key: 'f1b52edae2419a8e66b08a681d2f2b917383c90e', part: "actions", class: "bs-session-timeout__actions bs-session-timeout__actions--stacked" }, primary && (h("bs-button", { key: '145f8f09b939c82eef01068bc0e849fc7f63b957', part: "primary", class: "bs-session-timeout__block-button", variant: "primary", onClick: () => this.bsPrimary.emit() }, primary)), secondary && (h("bs-button", { key: '897e5342fe89966702d2af457f9038b60e8929ec', part: "secondary", class: "bs-session-timeout__text-button", variant: "subtle", size: "lg", onClick: () => this.bsSecondary.emit() }, secondary)))), h("div", { key: 'b3f242f4a8b00b52975ed66d9a72ebc98997cf29', class: "bs-session-timeout__sr-only", role: "status", "aria-live": "polite" }, this.announcement))));
200
200
  }
201
201
  static get is() { return "bs-session-timeout"; }
202
202
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,117 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ describe('bs-side-panel', () => {
3
+ it('renders nothing when closed', async () => {
4
+ const { root } = await render(h("bs-side-panel", { heading: "History" }, "Body"));
5
+ expect(root.shadowRoot.querySelector('[role="dialog"]')).toBeNull();
6
+ });
7
+ it('renders a labelled dialog when open', async () => {
8
+ const { root } = await render(h("bs-side-panel", { open: true, heading: "History" }, "Body"));
9
+ const dialog = root.shadowRoot.querySelector('[role="dialog"]');
10
+ const heading = root.shadowRoot.querySelector('[part="heading"]');
11
+ expect(dialog.getAttribute('aria-labelledby')).toBe(heading.id);
12
+ expect(heading).toHaveTextContent('History');
13
+ });
14
+ it('closes on Escape and emits bsClose', async () => {
15
+ const { root, waitForChanges, spyOnEvent } = await render(h("bs-side-panel", { open: true, heading: "History" }, "Body"));
16
+ const spy = spyOnEvent('bsClose');
17
+ root.shadowRoot.querySelector('[role="dialog"]').dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true, composed: true }));
18
+ await waitForChanges();
19
+ expect(spy).toHaveReceivedEvent();
20
+ expect(root.open).toBe(false);
21
+ });
22
+ it('closes via the close button, using closeLabel', async () => {
23
+ const { root, waitForChanges, spyOnEvent } = await render(h("bs-side-panel", { open: true, heading: "H", closeLabel: "Dismiss" }, "Body"));
24
+ const spy = spyOnEvent('bsClose');
25
+ const btn = root.shadowRoot.querySelector('bs-icon-button');
26
+ expect(btn.getAttribute('aria-label') ?? btn.ariaLabel).toBe('Dismiss');
27
+ btn.click();
28
+ await waitForChanges();
29
+ expect(spy).toHaveReceivedEvent();
30
+ expect(root.open).toBe(false);
31
+ });
32
+ it('only renders the overlay when requested, and overlay click closes', async () => {
33
+ const { root, waitForChanges } = await render(h("bs-side-panel", { open: true, overlay: true, heading: "H" }, "Body"));
34
+ const overlay = root.shadowRoot.querySelector('[part="overlay"]');
35
+ expect(overlay).not.toBeNull();
36
+ overlay.click();
37
+ await waitForChanges();
38
+ expect(root.open).toBe(false);
39
+ });
40
+ it('has no overlay by default and reflects side', async () => {
41
+ const { root } = await render(h("bs-side-panel", { open: true, side: "start", heading: "H" }));
42
+ expect(root.shadowRoot.querySelector('[part="overlay"]')).toBeNull();
43
+ expect(root).toEqualAttribute('side', 'start');
44
+ });
45
+ it('moves focus in on open and restores it on close', async () => {
46
+ const outer = document.createElement('button');
47
+ document.body.appendChild(outer);
48
+ outer.focus();
49
+ const { root, waitForChanges } = await render(h("bs-side-panel", { heading: "H" }, "Body"));
50
+ outer.focus();
51
+ root.open = true;
52
+ await waitForChanges();
53
+ expect(document.activeElement).toBe(root);
54
+ expect(root.shadowRoot.activeElement).toBe(root.shadowRoot.querySelector('[role="dialog"]'));
55
+ root.open = false;
56
+ await waitForChanges();
57
+ expect(document.activeElement).toBe(outer);
58
+ outer.remove();
59
+ });
60
+ it('sets aria-modal on the dialog', async () => {
61
+ const { root } = await render(h("bs-side-panel", { open: true, heading: "H" }));
62
+ expect(root.shadowRoot.querySelector('[role="dialog"]')).toEqualAttribute('aria-modal', 'true');
63
+ });
64
+ it('traps Tab and Shift+Tab through slotted content', async () => {
65
+ const { root, waitForChanges } = await render(h("bs-side-panel", { open: true, heading: "H" }, h("button", { id: "a" }, "A"), h("button", { id: "b" }, "B")));
66
+ await waitForChanges();
67
+ const a = root.querySelector('#a');
68
+ const b = root.querySelector('#b');
69
+ const key = (target, shiftKey = false) => {
70
+ const ev = new KeyboardEvent('keydown', { key: 'Tab', shiftKey, bubbles: true, composed: true, cancelable: true });
71
+ target.dispatchEvent(ev);
72
+ return ev;
73
+ };
74
+ b.focus();
75
+ expect(key(b).defaultPrevented).toBe(true);
76
+ // Forward from the last focusable wraps to the first (the header close button).
77
+ expect(root.shadowRoot.activeElement).not.toBeNull();
78
+ expect(document.activeElement).toBe(root);
79
+ a.focus();
80
+ expect(key(a, true).defaultPrevented).toBe(false);
81
+ // Shift+Tab from the first focusable (close button) wraps to the last slotted element.
82
+ const close = root.shadowRoot.querySelector('bs-icon-button');
83
+ close.focus();
84
+ expect(key(close, true).defaultPrevented).toBe(true);
85
+ expect(document.activeElement).toBe(b);
86
+ });
87
+ it('makes siblings inert with overlay and restores prior state', async () => {
88
+ const plain = document.createElement('div');
89
+ const already = document.createElement('div');
90
+ already.inert = true;
91
+ const { root, waitForChanges } = await render(h("bs-side-panel", { heading: "H", overlay: true }));
92
+ document.body.append(plain, already);
93
+ root.open = true;
94
+ await waitForChanges();
95
+ expect(plain.inert).toBe(true);
96
+ expect(root.inert).toBe(false);
97
+ root.open = false;
98
+ await waitForChanges();
99
+ expect(plain.inert).toBe(false);
100
+ expect(already.inert).toBe(true);
101
+ plain.remove();
102
+ already.remove();
103
+ });
104
+ it('does not set inert without overlay, and restores on disconnect', async () => {
105
+ const plain = document.createElement('div');
106
+ const { root, waitForChanges } = await render(h("bs-side-panel", { heading: "H", open: true }));
107
+ document.body.append(plain);
108
+ await waitForChanges();
109
+ expect(plain.inert).toBe(false);
110
+ root.overlay = true;
111
+ await waitForChanges();
112
+ expect(plain.inert).toBe(true);
113
+ root.remove();
114
+ expect(plain.inert).toBe(false);
115
+ plain.remove();
116
+ });
117
+ });
@@ -0,0 +1,77 @@
1
+ :host {
2
+ --bs-side-panel-bg: var(--bs-surface-raised);
3
+ --bs-side-panel-width: calc(var(--bs-scale-1600) * 3);
4
+ --bs-side-panel-padding: var(--bs-spacing-200);
5
+ --bs-side-panel-shadow: var(--bs-shadow-md);
6
+ --bs-side-panel-overlay-bg: var(--bs-surface-overlay);
7
+ --bs-side-panel-color: var(--bs-text-default);
8
+ --bs-side-panel-z-index: var(--bs-z-index-modal);
9
+ }
10
+
11
+ .bs-side-panel {
12
+ position: fixed;
13
+ inset: 0;
14
+ z-index: var(--bs-side-panel-z-index);
15
+ pointer-events: none;
16
+ }
17
+
18
+ .bs-side-panel__overlay {
19
+ position: absolute;
20
+ inset: 0;
21
+ background: var(--bs-side-panel-overlay-bg);
22
+ pointer-events: auto;
23
+ }
24
+
25
+ .bs-side-panel__panel {
26
+ position: absolute;
27
+ top: 0;
28
+ bottom: 0;
29
+ display: flex;
30
+ flex-direction: column;
31
+ box-sizing: border-box;
32
+ width: var(--bs-side-panel-width);
33
+ max-width: 100%;
34
+ background: var(--bs-side-panel-bg);
35
+ color: var(--bs-side-panel-color);
36
+ box-shadow: var(--bs-side-panel-shadow);
37
+ pointer-events: auto;
38
+ outline: none;
39
+ }
40
+
41
+ .bs-side-panel--start .bs-side-panel__panel {
42
+ left: 0;
43
+ }
44
+
45
+ .bs-side-panel--end .bs-side-panel__panel {
46
+ right: 0;
47
+ }
48
+
49
+ .bs-side-panel__header {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: space-between;
53
+ gap: var(--bs-spacing-100);
54
+ padding: var(--bs-side-panel-padding);
55
+ }
56
+
57
+ .bs-side-panel__heading {
58
+ margin: 0;
59
+ font-size: var(--bs-font-size-lg);
60
+ font-weight: var(--bs-font-weight-semibold);
61
+ }
62
+
63
+ .bs-side-panel__actions {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: var(--bs-spacing-100);
67
+ }
68
+
69
+ .bs-side-panel__body {
70
+ flex: 1;
71
+ overflow-y: auto;
72
+ padding: 0 var(--bs-side-panel-padding);
73
+ }
74
+
75
+ .bs-side-panel__footer {
76
+ padding: var(--bs-side-panel-padding);
77
+ }