@brandsync/wc 1.12.1 → 1.13.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 (499) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CONVENTIONS.md +109 -0
  3. package/REFERENCE.md +1357 -0
  4. package/custom-elements.json +2628 -338
  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-282ddbee.entry.js → p-07966676.entry.js} +1 -1
  11. package/dist/brandsync-wc/p-0cb6fc39.entry.js +1 -0
  12. package/dist/brandsync-wc/{p-2497d128.entry.js → p-0e940ee1.entry.js} +1 -1
  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-1b5cc9b8.entry.js +1 -0
  16. package/dist/brandsync-wc/p-23b56775.entry.js +1 -0
  17. package/dist/brandsync-wc/{p-a9169157.entry.js → p-23cc532f.entry.js} +1 -1
  18. package/dist/brandsync-wc/{p-81605b82.entry.js → p-361aef36.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-89fabf27.entry.js → p-3789c7a5.entry.js} +1 -1
  20. package/dist/brandsync-wc/p-3f6682f8.entry.js +1 -0
  21. package/dist/brandsync-wc/{p-f5180578.entry.js → p-4054a944.entry.js} +1 -1
  22. package/dist/brandsync-wc/{p-fc069773.entry.js → p-45cb3e6d.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-de110ad0.entry.js → p-47b7fe76.entry.js} +1 -1
  24. package/dist/brandsync-wc/{p-2f4e08e1.entry.js → p-47cd19aa.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-3a1af63a.entry.js → p-4bbc4809.entry.js} +1 -1
  26. package/dist/brandsync-wc/{p-247e36ad.entry.js → p-4ea435a6.entry.js} +1 -1
  27. package/dist/brandsync-wc/{p-56c37e0a.entry.js → p-4ea9b6a1.entry.js} +1 -1
  28. package/dist/brandsync-wc/{p-1978e63c.entry.js → p-53362609.entry.js} +1 -1
  29. package/dist/brandsync-wc/p-658532b7.entry.js +1 -0
  30. package/dist/brandsync-wc/p-68f0be29.entry.js +1 -0
  31. package/dist/brandsync-wc/{p-09bc1923.entry.js → p-694fe468.entry.js} +1 -1
  32. package/dist/brandsync-wc/{p-78f4fcf0.entry.js → p-6ca1e51b.entry.js} +1 -1
  33. package/dist/brandsync-wc/{p-52cb2358.entry.js → p-6e923ebc.entry.js} +1 -1
  34. package/dist/brandsync-wc/p-7e24dbd7.entry.js +1 -0
  35. package/dist/brandsync-wc/{p-00a0d489.entry.js → p-8048d033.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-2368a92e.entry.js → p-8184d7de.entry.js} +1 -1
  37. package/dist/brandsync-wc/p-8390a155.entry.js +1 -0
  38. package/dist/brandsync-wc/{p-0b2d3b7e.entry.js → p-86028548.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-fcee0dc4.entry.js → p-89fa7567.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-7796b93f.entry.js → p-8c9938a5.entry.js} +1 -1
  41. package/dist/brandsync-wc/{p-68fcd4a4.entry.js → p-9125632c.entry.js} +1 -1
  42. package/dist/brandsync-wc/{p-416322bd.entry.js → p-94d435a2.entry.js} +1 -1
  43. package/dist/brandsync-wc/{p-69c0a85d.entry.js → p-95f034fc.entry.js} +1 -1
  44. package/dist/brandsync-wc/p-9b58c0c5.entry.js +1 -0
  45. package/dist/brandsync-wc/{p-39a26c64.entry.js → p-9cf8274a.entry.js} +1 -1
  46. package/dist/brandsync-wc/p-9d12b1fb.entry.js +1 -0
  47. package/dist/brandsync-wc/{p-5ba90a13.entry.js → p-9d660c03.entry.js} +1 -1
  48. package/dist/brandsync-wc/p-D3SkQJpw.js +3 -0
  49. package/dist/brandsync-wc/{p-7f954939.entry.js → p-a28ef52e.entry.js} +1 -1
  50. package/dist/brandsync-wc/{p-09435f41.entry.js → p-a5659499.entry.js} +1 -1
  51. package/dist/brandsync-wc/p-ab07c9b5.entry.js +1 -0
  52. package/dist/brandsync-wc/p-b0b2e525.entry.js +1 -0
  53. package/dist/brandsync-wc/p-b6ac1b50.entry.js +1 -0
  54. package/dist/brandsync-wc/p-bee30626.entry.js +1 -0
  55. package/dist/brandsync-wc/p-bf8bd386.entry.js +1 -0
  56. package/dist/brandsync-wc/{p-1aab6d07.entry.js → p-c05ee501.entry.js} +1 -1
  57. package/dist/brandsync-wc/p-c3da3080.entry.js +1 -0
  58. package/dist/brandsync-wc/p-c679b631.entry.js +1 -0
  59. package/dist/brandsync-wc/p-cceb8484.entry.js +1 -0
  60. package/dist/brandsync-wc/p-cd53bba9.entry.js +1 -0
  61. package/dist/brandsync-wc/p-ce16f038.entry.js +1 -0
  62. package/dist/brandsync-wc/{p-491b51e6.entry.js → p-d5a6098d.entry.js} +1 -1
  63. package/dist/brandsync-wc/{p-f15d9524.entry.js → p-d64cae57.entry.js} +1 -1
  64. package/dist/brandsync-wc/p-dfad8c0a.entry.js +1 -0
  65. package/dist/brandsync-wc/p-e0504a4b.entry.js +1 -0
  66. package/dist/brandsync-wc/{p-0ee4126c.entry.js → p-e1b7bea7.entry.js} +1 -1
  67. package/dist/brandsync-wc/{p-0b7c77c1.entry.js → p-e65d286c.entry.js} +1 -1
  68. package/dist/brandsync-wc/p-ed5c2d97.entry.js +1 -0
  69. package/dist/brandsync-wc/p-f134a502.entry.js +1 -0
  70. package/dist/brandsync-wc/p-f271e1d2.entry.js +1 -0
  71. package/dist/brandsync-wc/{p-3f09296a.entry.js → p-f3eca1ce.entry.js} +1 -1
  72. package/dist/brandsync-wc/{p-617bd13a.entry.js → p-f8d47004.entry.js} +1 -1
  73. package/dist/brandsync-wc/p-fa34fe20.entry.js +1 -0
  74. package/dist/brandsync-wc/{p-2177042f.entry.js → p-fa6b9750.entry.js} +1 -1
  75. package/dist/brandsync-wc/p-fb4d0093.entry.js +1 -0
  76. package/dist/brandsync-wc/{p-78a69a59.entry.js → p-fc76031e.entry.js} +1 -1
  77. package/dist/brandsync-wc/{p-be3dd446.entry.js → p-ffc07eb5.entry.js} +1 -1
  78. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  79. package/dist/cjs/bs-accordion-group.cjs.entry.js +33 -0
  80. package/dist/cjs/bs-accordion.cjs.entry.js +1 -1
  81. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
  82. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  84. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  85. package/dist/cjs/bs-attachment.cjs.entry.js +9 -5
  86. package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
  87. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  88. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +1 -1
  89. package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
  90. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +2 -2
  91. package/dist/cjs/bs-button-skeleton.cjs.entry.js +4 -2
  92. package/dist/cjs/bs-button.cjs.entry.js +1 -1
  93. package/dist/cjs/bs-card.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-carousel.cjs.entry.js +1 -1
  95. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +18 -2
  96. package/dist/cjs/bs-chatbot-header.cjs.entry.js +20 -2
  97. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +25 -3
  98. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +4 -2
  99. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +3 -3
  100. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +4 -2
  101. package/dist/cjs/bs-checkbox.cjs.entry.js +1 -1
  102. package/dist/cjs/bs-chip-filter.cjs.entry.js +1 -1
  103. package/dist/cjs/bs-chip-informative.cjs.entry.js +1 -1
  104. package/dist/cjs/bs-chip-input.cjs.entry.js +4 -2
  105. package/dist/cjs/bs-citation-preview.cjs.entry.js +29 -0
  106. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +11 -3
  107. package/dist/cjs/bs-composer.cjs.entry.js +36 -7
  108. package/dist/cjs/bs-cookie-consent.cjs.entry.js +1 -1
  109. package/dist/cjs/bs-data-table.cjs.entry.js +5 -3
  110. package/dist/cjs/bs-datepicker.cjs.entry.js +1 -1
  111. package/dist/cjs/bs-dialog.cjs.entry.js +4 -2
  112. package/dist/cjs/bs-error-page.cjs.entry.js +1 -1
  113. package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
  114. package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
  115. package/dist/cjs/bs-icon-button.cjs.entry.js +1 -1
  116. package/dist/cjs/bs-icon-tile.cjs.entry.js +1 -1
  117. package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
  118. package/dist/cjs/bs-input_3.cjs.entry.js +15 -7
  119. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  120. package/dist/cjs/bs-message-list.cjs.entry.js +71 -0
  121. package/dist/cjs/bs-message.cjs.entry.js +25 -0
  122. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
  123. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +9 -3
  124. package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
  125. package/dist/cjs/bs-onboarding-checklist.cjs.entry.js +1 -1
  126. package/dist/cjs/bs-pagination.cjs.entry.js +6 -2
  127. package/dist/cjs/bs-popover.cjs.entry.js +153 -0
  128. package/dist/cjs/bs-product-tour.cjs.entry.js +1 -1
  129. package/dist/cjs/bs-progress-linear.cjs.entry.js +3 -3
  130. package/dist/cjs/bs-progress.cjs.entry.js +3 -3
  131. package/dist/cjs/bs-qr-code.cjs.entry.js +2 -2
  132. package/dist/cjs/bs-radio.cjs.entry.js +2 -2
  133. package/dist/cjs/bs-session-timeout.cjs.entry.js +2 -2
  134. package/dist/cjs/bs-side-panel.cjs.entry.js +164 -0
  135. package/dist/cjs/bs-skeleton.cjs.entry.js +51 -0
  136. package/dist/cjs/bs-slider.cjs.entry.js +7 -3
  137. package/dist/cjs/bs-snackbar.cjs.entry.js +2 -2
  138. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  139. package/dist/cjs/bs-spinner.cjs.entry.js +24 -0
  140. package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
  141. package/dist/cjs/bs-stepper.cjs.entry.js +2 -2
  142. package/dist/cjs/bs-switch.cjs.entry.js +2 -2
  143. package/dist/cjs/bs-tab_3.cjs.entry.js +4 -4
  144. package/dist/cjs/bs-timepicker.cjs.entry.js +8 -4
  145. package/dist/cjs/bs-toast.cjs.entry.js +4 -2
  146. package/dist/cjs/bs-tooltip-trigger.cjs.entry.js +46 -0
  147. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  148. package/dist/cjs/bs-whats-new.cjs.entry.js +1 -1
  149. package/dist/cjs/index-BYfMRtlW.js +1863 -0
  150. package/dist/cjs/loader.cjs.js +2 -2
  151. package/dist/collection/collection-manifest.json +9 -0
  152. package/dist/collection/components/bs-accordion-group/bs-accordion-group.cmp.test.js +39 -0
  153. package/dist/collection/components/bs-accordion-group/bs-accordion-group.css +10 -0
  154. package/dist/collection/components/bs-accordion-group/bs-accordion-group.js +86 -0
  155. package/dist/collection/components/bs-accordion-group/bs-accordion-group.stories.js +18 -0
  156. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  157. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  158. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  159. package/dist/collection/components/bs-attachment/bs-attachment.js +48 -4
  160. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  161. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  162. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +23 -1
  163. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.cmp.test.js +10 -0
  164. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +178 -2
  165. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.cmp.test.js +6 -0
  166. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +200 -1
  167. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.cmp.test.js +8 -0
  168. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.css +4 -0
  169. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +223 -1
  170. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +24 -2
  171. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.css +1 -4
  172. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +3 -6
  173. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +23 -1
  174. package/dist/collection/components/bs-chip/bs-chip-input/bs-chip-input.js +23 -1
  175. package/dist/collection/components/bs-citation-preview/bs-citation-preview.cmp.test.js +34 -0
  176. package/dist/collection/components/bs-citation-preview/bs-citation-preview.css +36 -0
  177. package/dist/collection/components/bs-citation-preview/bs-citation-preview.js +154 -0
  178. package/dist/collection/components/bs-citation-preview/bs-citation-preview.stories.js +22 -0
  179. package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +29 -2
  180. package/dist/collection/components/bs-composer/bs-composer.css +16 -0
  181. package/dist/collection/components/bs-composer/bs-composer.js +234 -6
  182. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.js +5 -0
  183. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.css +16 -0
  184. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +49 -1
  185. package/dist/collection/components/bs-data-table/bs-data-table.js +24 -2
  186. package/dist/collection/components/bs-dialog/bs-dialog.js +23 -1
  187. package/dist/collection/components/bs-input/bs-input.js +92 -4
  188. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  189. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  190. package/dist/collection/components/bs-message/bs-message.cmp.test.js +36 -0
  191. package/dist/collection/components/bs-message/bs-message.css +77 -0
  192. package/dist/collection/components/bs-message/bs-message.js +156 -0
  193. package/dist/collection/components/bs-message/bs-message.stories.js +33 -0
  194. package/dist/collection/components/bs-message-list/bs-message-list.cmp.test.js +58 -0
  195. package/dist/collection/components/bs-message-list/bs-message-list.css +40 -0
  196. package/dist/collection/components/bs-message-list/bs-message-list.js +161 -0
  197. package/dist/collection/components/bs-message-list/bs-message-list.stories.js +17 -0
  198. package/dist/collection/components/bs-pagination/bs-pagination.cmp.test.js +5 -0
  199. package/dist/collection/components/bs-pagination/bs-pagination.js +45 -1
  200. package/dist/collection/components/bs-popover/bs-popover.cmp.test.js +107 -0
  201. package/dist/collection/components/bs-popover/bs-popover.css +61 -0
  202. package/dist/collection/components/bs-popover/bs-popover.js +247 -0
  203. package/dist/collection/components/bs-popover/bs-popover.stories.js +26 -0
  204. package/dist/collection/components/bs-progress/bs-progress.js +2 -2
  205. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
  206. package/dist/collection/components/bs-qr-code/bs-qr-code.js +1 -1
  207. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  208. package/dist/collection/components/bs-session-timeout/bs-session-timeout.js +1 -1
  209. package/dist/collection/components/bs-side-panel/bs-side-panel.cmp.test.js +117 -0
  210. package/dist/collection/components/bs-side-panel/bs-side-panel.css +77 -0
  211. package/dist/collection/components/bs-side-panel/bs-side-panel.js +325 -0
  212. package/dist/collection/components/bs-side-panel/bs-side-panel.stories.js +24 -0
  213. package/dist/collection/components/bs-skeleton/bs-skeleton.cmp.test.js +49 -0
  214. package/dist/collection/components/bs-skeleton/bs-skeleton.css +62 -0
  215. package/dist/collection/components/bs-skeleton/bs-skeleton.js +204 -0
  216. package/dist/collection/components/bs-skeleton/bs-skeleton.stories.js +43 -0
  217. package/dist/collection/components/bs-slider/bs-slider.js +46 -2
  218. package/dist/collection/components/bs-snackbar/bs-snackbar.js +1 -1
  219. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  220. package/dist/collection/components/bs-spinner/bs-spinner.cmp.test.js +32 -0
  221. package/dist/collection/components/bs-spinner/bs-spinner.css +61 -0
  222. package/dist/collection/components/bs-spinner/bs-spinner.js +96 -0
  223. package/dist/collection/components/bs-spinner/bs-spinner.stories.js +30 -0
  224. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  225. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
  226. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  227. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  228. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  229. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  230. package/dist/collection/components/bs-timepicker/bs-timepicker.js +48 -4
  231. package/dist/collection/components/bs-toast/bs-toast.js +23 -1
  232. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  233. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.js +73 -0
  234. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.css +52 -0
  235. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.js +140 -0
  236. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.js +21 -0
  237. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +1 -1
  238. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +68 -2
  239. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  240. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  241. package/dist/collection/global/brand-theming.cmp.test.js +44 -0
  242. package/dist/components/bs-accordion-group.d.ts +11 -0
  243. package/dist/components/bs-accordion-group.js +1 -0
  244. package/dist/components/bs-accordion.js +1 -1
  245. package/dist/components/bs-ai-disclaimer.js +1 -1
  246. package/dist/components/bs-ai-greeting.js +1 -1
  247. package/dist/components/bs-ai-thinking.js +1 -1
  248. package/dist/components/bs-attachment-list.js +1 -1
  249. package/dist/components/bs-attachment.js +1 -1
  250. package/dist/components/bs-avatar.js +1 -1
  251. package/dist/components/bs-badge.js +1 -1
  252. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  253. package/dist/components/bs-breadcrumb.js +1 -1
  254. package/dist/components/bs-breadcrumbs.js +1 -1
  255. package/dist/components/bs-button-skeleton.js +1 -1
  256. package/dist/components/bs-button.js +1 -1
  257. package/dist/components/bs-card.js +1 -1
  258. package/dist/components/bs-carousel.js +1 -1
  259. package/dist/components/bs-chatbot-feedback.js +1 -1
  260. package/dist/components/bs-chatbot-header.js +1 -1
  261. package/dist/components/bs-chatbot-response-action.js +1 -1
  262. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  263. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  264. package/dist/components/bs-checkbox-skeleton.js +1 -1
  265. package/dist/components/bs-checkbox.js +1 -1
  266. package/dist/components/bs-chip-filter.js +1 -1
  267. package/dist/components/bs-chip-informative.js +1 -1
  268. package/dist/components/bs-chip-input.js +1 -1
  269. package/dist/components/bs-citation-preview.d.ts +11 -0
  270. package/dist/components/bs-citation-preview.js +1 -0
  271. package/dist/components/bs-composer-status-banner.js +1 -1
  272. package/dist/components/bs-composer.js +1 -1
  273. package/dist/components/bs-cookie-consent.js +1 -1
  274. package/dist/components/bs-data-table.js +1 -1
  275. package/dist/components/bs-datepicker.js +1 -1
  276. package/dist/components/bs-dialog.js +1 -1
  277. package/dist/components/bs-error-page.js +1 -1
  278. package/dist/components/bs-file-upload-item.js +1 -1
  279. package/dist/components/bs-file-upload.js +1 -1
  280. package/dist/components/bs-icon-button.js +1 -1
  281. package/dist/components/bs-icon-tile.js +1 -1
  282. package/dist/components/bs-inline-tab.js +1 -1
  283. package/dist/components/bs-input.js +1 -1
  284. package/dist/components/bs-logo.js +1 -1
  285. package/dist/components/bs-menu-item.js +1 -1
  286. package/dist/components/bs-menu.js +1 -1
  287. package/dist/components/bs-message-list.d.ts +11 -0
  288. package/dist/components/bs-message-list.js +1 -0
  289. package/dist/components/bs-message.d.ts +11 -0
  290. package/dist/components/bs-message.js +1 -0
  291. package/dist/components/bs-navigation-drawer-item.js +1 -1
  292. package/dist/components/bs-navigation-drawer.js +1 -1
  293. package/dist/components/bs-navigation-header.js +1 -1
  294. package/dist/components/bs-onboarding-checklist.js +1 -1
  295. package/dist/components/bs-pagination.js +1 -1
  296. package/dist/components/bs-popover.d.ts +11 -0
  297. package/dist/components/bs-popover.js +1 -0
  298. package/dist/components/bs-product-tour.js +1 -1
  299. package/dist/components/bs-progress-linear.js +1 -1
  300. package/dist/components/bs-progress.js +1 -1
  301. package/dist/components/bs-qr-code.js +1 -1
  302. package/dist/components/bs-radio.js +1 -1
  303. package/dist/components/bs-session-timeout.js +1 -1
  304. package/dist/components/bs-side-panel.d.ts +11 -0
  305. package/dist/components/bs-side-panel.js +1 -0
  306. package/dist/components/bs-skeleton.d.ts +11 -0
  307. package/dist/components/bs-skeleton.js +1 -0
  308. package/dist/components/bs-slider.js +1 -1
  309. package/dist/components/bs-snackbar.js +1 -1
  310. package/dist/components/bs-source-link.js +1 -1
  311. package/dist/components/bs-spinner.d.ts +11 -0
  312. package/dist/components/bs-spinner.js +1 -0
  313. package/dist/components/bs-stepper-step.js +1 -1
  314. package/dist/components/bs-stepper.js +1 -1
  315. package/dist/components/bs-switch.js +1 -1
  316. package/dist/components/bs-tab.js +1 -1
  317. package/dist/components/bs-tabs.js +1 -1
  318. package/dist/components/bs-timepicker.js +1 -1
  319. package/dist/components/bs-toast.js +1 -1
  320. package/dist/components/bs-tooltip-trigger.d.ts +11 -0
  321. package/dist/components/bs-tooltip-trigger.js +1 -0
  322. package/dist/components/bs-tooltip.js +1 -1
  323. package/dist/components/bs-whats-new-entry.js +1 -1
  324. package/dist/components/bs-whats-new.js +1 -1
  325. package/dist/components/index.js +1 -1
  326. package/dist/components/p-B2gx7SZk.js +1 -0
  327. package/dist/components/{p-BEEoVNRu.js → p-BTPdjnXT.js} +1 -1
  328. package/dist/components/{p-Be9L4_Fe.js → p-BVhF8cZQ.js} +1 -1
  329. package/dist/components/{p-C_j_jDM6.js → p-Bfq5YVOv.js} +1 -1
  330. package/dist/components/{p-DE8K7fg0.js → p-C2NR1v3p.js} +1 -1
  331. package/dist/components/{p-YsHQLXET.js → p-C9jIMBG3.js} +1 -1
  332. package/dist/components/{p-DuLL7Ouw.js → p-CRtvJlh8.js} +1 -1
  333. package/dist/components/{p-Dr0Qk9Zc.js → p-ChcaPfNL.js} +1 -1
  334. package/dist/components/{p-CbimDNGY.js → p-CrmEXUwm.js} +1 -1
  335. package/dist/components/p-Cu-aeY9t.js +1 -0
  336. package/dist/components/{p-zTHlbyH6.js → p-DAwSBMeM.js} +1 -1
  337. package/dist/components/{p-qmS2CBqi.js → p-DYuzgzxI.js} +1 -1
  338. package/dist/components/p-DfzrJKwN.js +1 -0
  339. package/dist/components/{p-CUfs0ROR.js → p-DpVeeIko.js} +1 -1
  340. package/dist/components/p-DqXI9V2A.js +1 -0
  341. package/dist/components/p-Dqg8l1y6.js +1 -0
  342. package/dist/components/{p-CA31vqjL.js → p-DvNED6Lb.js} +1 -1
  343. package/dist/components/{p-C8yT2Ucq.js → p-QnTjSed5.js} +1 -1
  344. package/dist/components/{p-CncySD_-.js → p-Rx4bpeYN.js} +1 -1
  345. package/dist/components/{p-Be_Pmccm.js → p-owdeCW0M.js} +1 -1
  346. package/dist/components/{p-Bl_tVzeq.js → p-uHvS81XA.js} +1 -1
  347. package/dist/esm/brandsync-wc.js +3 -3
  348. package/dist/esm/bs-accordion-group.entry.js +31 -0
  349. package/dist/esm/bs-accordion.entry.js +1 -1
  350. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  351. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  352. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  353. package/dist/esm/bs-attachment-list.entry.js +2 -2
  354. package/dist/esm/bs-attachment.entry.js +9 -5
  355. package/dist/esm/bs-avatar.entry.js +1 -1
  356. package/dist/esm/bs-badge.entry.js +1 -1
  357. package/dist/esm/bs-breadcrumb-overflow.entry.js +1 -1
  358. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  359. package/dist/esm/bs-breadcrumbs.entry.js +2 -2
  360. package/dist/esm/bs-button-skeleton.entry.js +4 -2
  361. package/dist/esm/bs-button.entry.js +1 -1
  362. package/dist/esm/bs-card.entry.js +1 -1
  363. package/dist/esm/bs-carousel.entry.js +1 -1
  364. package/dist/esm/bs-chatbot-feedback.entry.js +18 -2
  365. package/dist/esm/bs-chatbot-header.entry.js +20 -2
  366. package/dist/esm/bs-chatbot-response-action.entry.js +25 -3
  367. package/dist/esm/bs-chatbot-sources-drawer.entry.js +4 -2
  368. package/dist/esm/bs-chatbot-suggestion-button.entry.js +3 -3
  369. package/dist/esm/bs-checkbox-skeleton.entry.js +4 -2
  370. package/dist/esm/bs-checkbox.entry.js +1 -1
  371. package/dist/esm/bs-chip-filter.entry.js +1 -1
  372. package/dist/esm/bs-chip-informative.entry.js +1 -1
  373. package/dist/esm/bs-chip-input.entry.js +4 -2
  374. package/dist/esm/bs-citation-preview.entry.js +27 -0
  375. package/dist/esm/bs-composer-status-banner.entry.js +11 -3
  376. package/dist/esm/bs-composer.entry.js +36 -7
  377. package/dist/esm/bs-cookie-consent.entry.js +1 -1
  378. package/dist/esm/bs-data-table.entry.js +5 -3
  379. package/dist/esm/bs-datepicker.entry.js +1 -1
  380. package/dist/esm/bs-dialog.entry.js +4 -2
  381. package/dist/esm/bs-error-page.entry.js +1 -1
  382. package/dist/esm/bs-file-upload-item.entry.js +1 -1
  383. package/dist/esm/bs-file-upload.entry.js +1 -1
  384. package/dist/esm/bs-icon-button.entry.js +1 -1
  385. package/dist/esm/bs-icon-tile.entry.js +1 -1
  386. package/dist/esm/bs-inline-tab.entry.js +2 -2
  387. package/dist/esm/bs-input_3.entry.js +15 -7
  388. package/dist/esm/bs-logo.entry.js +1 -1
  389. package/dist/esm/bs-message-list.entry.js +69 -0
  390. package/dist/esm/bs-message.entry.js +23 -0
  391. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  392. package/dist/esm/bs-navigation-drawer.entry.js +9 -3
  393. package/dist/esm/bs-navigation-header.entry.js +2 -2
  394. package/dist/esm/bs-onboarding-checklist.entry.js +1 -1
  395. package/dist/esm/bs-pagination.entry.js +6 -2
  396. package/dist/esm/bs-popover.entry.js +151 -0
  397. package/dist/esm/bs-product-tour.entry.js +1 -1
  398. package/dist/esm/bs-progress-linear.entry.js +3 -3
  399. package/dist/esm/bs-progress.entry.js +3 -3
  400. package/dist/esm/bs-qr-code.entry.js +2 -2
  401. package/dist/esm/bs-radio.entry.js +2 -2
  402. package/dist/esm/bs-session-timeout.entry.js +2 -2
  403. package/dist/esm/bs-side-panel.entry.js +162 -0
  404. package/dist/esm/bs-skeleton.entry.js +49 -0
  405. package/dist/esm/bs-slider.entry.js +7 -3
  406. package/dist/esm/bs-snackbar.entry.js +2 -2
  407. package/dist/esm/bs-source-link.entry.js +3 -3
  408. package/dist/esm/bs-spinner.entry.js +22 -0
  409. package/dist/esm/bs-stepper-step.entry.js +2 -2
  410. package/dist/esm/bs-stepper.entry.js +2 -2
  411. package/dist/esm/bs-switch.entry.js +2 -2
  412. package/dist/esm/bs-tab_3.entry.js +4 -4
  413. package/dist/esm/bs-timepicker.entry.js +8 -4
  414. package/dist/esm/bs-toast.entry.js +4 -2
  415. package/dist/esm/bs-tooltip-trigger.entry.js +44 -0
  416. package/dist/esm/bs-tooltip.entry.js +2 -2
  417. package/dist/esm/bs-whats-new.entry.js +1 -1
  418. package/dist/esm/index-D3SkQJpw.js +1853 -0
  419. package/dist/esm/loader.js +3 -3
  420. package/dist/types/components/bs-accordion-group/bs-accordion-group.cmp.test.d.ts +1 -0
  421. package/dist/types/components/bs-accordion-group/bs-accordion-group.d.ts +25 -0
  422. package/dist/types/components/bs-accordion-group/bs-accordion-group.stories.d.ts +9 -0
  423. package/dist/types/components/bs-attachment/bs-attachment.d.ts +4 -0
  424. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.d.ts +2 -0
  425. package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.d.ts +16 -0
  426. package/dist/types/components/bs-chatbot-header/bs-chatbot-header.d.ts +19 -0
  427. package/dist/types/components/bs-chatbot-response-action/bs-chatbot-response-action.d.ts +22 -0
  428. package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.d.ts +2 -0
  429. package/dist/types/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.d.ts +2 -5
  430. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.d.ts +2 -0
  431. package/dist/types/components/bs-chip/bs-chip-input/bs-chip-input.d.ts +2 -0
  432. package/dist/types/components/bs-citation-preview/bs-citation-preview.cmp.test.d.ts +1 -0
  433. package/dist/types/components/bs-citation-preview/bs-citation-preview.d.ts +40 -0
  434. package/dist/types/components/bs-citation-preview/bs-citation-preview.stories.d.ts +13 -0
  435. package/dist/types/components/bs-composer/bs-composer.d.ts +25 -1
  436. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.d.ts +5 -0
  437. package/dist/types/components/bs-data-table/bs-data-table.d.ts +2 -0
  438. package/dist/types/components/bs-dialog/bs-dialog.d.ts +2 -0
  439. package/dist/types/components/bs-input/bs-input.d.ts +8 -0
  440. package/dist/types/components/bs-message/bs-message.cmp.test.d.ts +1 -0
  441. package/dist/types/components/bs-message/bs-message.d.ts +49 -0
  442. package/dist/types/components/bs-message/bs-message.stories.d.ts +15 -0
  443. package/dist/types/components/bs-message-list/bs-message-list.cmp.test.d.ts +1 -0
  444. package/dist/types/components/bs-message-list/bs-message-list.d.ts +44 -0
  445. package/dist/types/components/bs-message-list/bs-message-list.stories.d.ts +8 -0
  446. package/dist/types/components/bs-pagination/bs-pagination.d.ts +4 -0
  447. package/dist/types/components/bs-popover/bs-popover.cmp.test.d.ts +1 -0
  448. package/dist/types/components/bs-popover/bs-popover.d.ts +58 -0
  449. package/dist/types/components/bs-popover/bs-popover.stories.d.ts +11 -0
  450. package/dist/types/components/bs-side-panel/bs-side-panel.cmp.test.d.ts +1 -0
  451. package/dist/types/components/bs-side-panel/bs-side-panel.d.ts +67 -0
  452. package/dist/types/components/bs-side-panel/bs-side-panel.stories.d.ts +14 -0
  453. package/dist/types/components/bs-skeleton/bs-skeleton.cmp.test.d.ts +1 -0
  454. package/dist/types/components/bs-skeleton/bs-skeleton.d.ts +44 -0
  455. package/dist/types/components/bs-skeleton/bs-skeleton.stories.d.ts +17 -0
  456. package/dist/types/components/bs-slider/bs-slider.d.ts +4 -0
  457. package/dist/types/components/bs-spinner/bs-spinner.cmp.test.d.ts +1 -0
  458. package/dist/types/components/bs-spinner/bs-spinner.d.ts +32 -0
  459. package/dist/types/components/bs-spinner/bs-spinner.stories.d.ts +12 -0
  460. package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +4 -0
  461. package/dist/types/components/bs-toast/bs-toast.d.ts +2 -0
  462. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.cmp.test.d.ts +1 -0
  463. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.d.ts +35 -0
  464. package/dist/types/components/bs-tooltip-trigger/bs-tooltip-trigger.stories.d.ts +10 -0
  465. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.d.ts +6 -0
  466. package/dist/types/components.d.ts +1778 -38
  467. package/dist/types/global/brand-theming.cmp.test.d.ts +1 -0
  468. package/package.json +21 -5
  469. package/reference.d.ts +242 -0
  470. package/reference.json +4176 -0
  471. package/reference.mjs +2 -0
  472. package/tailwind-preset.cjs +36 -0
  473. package/testing/vitest-setup.mjs +41 -0
  474. package/dist/brandsync-wc/p-09cbf05b.entry.js +0 -1
  475. package/dist/brandsync-wc/p-0f8cd2e8.entry.js +0 -1
  476. package/dist/brandsync-wc/p-1261f0b0.entry.js +0 -1
  477. package/dist/brandsync-wc/p-20030f4d.entry.js +0 -1
  478. package/dist/brandsync-wc/p-22f8201a.entry.js +0 -1
  479. package/dist/brandsync-wc/p-34e5feaf.entry.js +0 -1
  480. package/dist/brandsync-wc/p-452f9c1c.entry.js +0 -1
  481. package/dist/brandsync-wc/p-6a696161.entry.js +0 -1
  482. package/dist/brandsync-wc/p-6c6cdf77.entry.js +0 -1
  483. package/dist/brandsync-wc/p-6e735e37.entry.js +0 -1
  484. package/dist/brandsync-wc/p-73f214ed.entry.js +0 -1
  485. package/dist/brandsync-wc/p-823ab3b2.entry.js +0 -1
  486. package/dist/brandsync-wc/p-DqQRXQMx.js +0 -3
  487. package/dist/brandsync-wc/p-b84366a7.entry.js +0 -1
  488. package/dist/brandsync-wc/p-b8d2ce91.entry.js +0 -1
  489. package/dist/brandsync-wc/p-b9a4042e.entry.js +0 -1
  490. package/dist/brandsync-wc/p-d754ee13.entry.js +0 -1
  491. package/dist/brandsync-wc/p-d75f3f87.entry.js +0 -1
  492. package/dist/brandsync-wc/p-d8b29a53.entry.js +0 -1
  493. package/dist/brandsync-wc/p-f7d15fbe.entry.js +0 -1
  494. package/dist/cjs/index-tFJjflK5.js +0 -1863
  495. package/dist/components/p-BGW5q5LZ.js +0 -1
  496. package/dist/components/p-BZ3M4lOU.js +0 -1
  497. package/dist/components/p-CVrEuVFo.js +0 -1
  498. package/dist/components/p-CeUK3n7D.js +0 -1
  499. package/dist/esm/index-DqQRXQMx.js +0 -1853
@@ -0,0 +1,33 @@
1
+ import { html } from "lit";
2
+ import { componentDescription, propDescription } from "../../stories-utils";
3
+ const meta = {
4
+ title: 'Genie AI Components/bs-message',
5
+ parameters: { docs: { description: { component: componentDescription('bs-message') } } },
6
+ render: args => html `
7
+ <bs-message role=${args.role} timestamp=${args.timestamp} datetime=${args.datetime} status=${args.status}>
8
+ Here is a short answer to your question.
9
+ </bs-message>
10
+ `,
11
+ argTypes: {
12
+ role: { control: 'inline-radio', options: ['user', 'assistant'], description: propDescription('bs-message', 'role') },
13
+ timestamp: { control: 'text', description: propDescription('bs-message', 'timestamp') },
14
+ datetime: { control: 'text', description: propDescription('bs-message', 'datetime') },
15
+ status: { control: 'inline-radio', options: ['default', 'error', 'pending'], description: propDescription('bs-message', 'status') },
16
+ },
17
+ args: { role: 'assistant', timestamp: '10:42', datetime: '2026-01-01T10:42:00Z', status: 'default' },
18
+ };
19
+ export default meta;
20
+ export const Default = {};
21
+ export const User = { args: { role: 'user' } };
22
+ export const Pending = { args: { role: 'user', status: 'pending' } };
23
+ export const ErrorState = { name: 'Error', args: { role: 'user', status: 'error' } };
24
+ export const WithAvatarAndFooter = {
25
+ name: 'With avatar and footer',
26
+ render: args => html `
27
+ <bs-message role=${args.role} timestamp=${args.timestamp}>
28
+ <bs-avatar slot="avatar"></bs-avatar>
29
+ Here is a short answer to your question.
30
+ <bs-chatbot-response-action slot="footer"></bs-chatbot-response-action>
31
+ </bs-message>
32
+ `,
33
+ };
@@ -0,0 +1,58 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const nextMutation = () => new Promise(r => setTimeout(r, 0));
3
+ const tall = () => h("div", { style: { height: '300px' } });
4
+ const renderList = (extra = {}) => render(h("bs-message-list", { style: { display: 'block', height: '200px' }, ...extra }, tall(), tall()));
5
+ const viewportOf = (root) => root.shadowRoot.querySelector('.bs-message-list__viewport');
6
+ const scrollTo = (el, top) => {
7
+ el.scrollTop = top;
8
+ el.dispatchEvent(new Event('scroll'));
9
+ };
10
+ const appendMessage = async (root, waitForChanges) => {
11
+ root.appendChild(document.createElement('bs-message'));
12
+ await nextMutation();
13
+ await waitForChanges();
14
+ };
15
+ describe('bs-message-list', () => {
16
+ it('renders a polite log region', async () => {
17
+ const { root } = await renderList();
18
+ expect(root.shadowRoot.querySelector('[role="log"]')).toEqualAttribute('aria-live', 'polite');
19
+ });
20
+ it('does not show the scroll button initially', async () => {
21
+ const { root } = await renderList();
22
+ expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
23
+ });
24
+ it('shows the scroll button when new content arrives while scrolled up', async () => {
25
+ const { root, waitForChanges } = await renderList();
26
+ scrollTo(viewportOf(root), 0);
27
+ await appendMessage(root, waitForChanges);
28
+ const btn = root.shadowRoot.querySelector('[part="scroll-to-latest"]');
29
+ expect(btn).not.toBeNull();
30
+ expect(btn.ariaLabel).toBe('Scroll to latest message');
31
+ });
32
+ it('does not show the button when the user is near the bottom', async () => {
33
+ const { root, waitForChanges } = await renderList();
34
+ const viewport = viewportOf(root);
35
+ scrollTo(viewport, viewport.scrollHeight);
36
+ await appendMessage(root, waitForChanges);
37
+ expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
38
+ });
39
+ it('uses a custom scrollToLatestLabel', async () => {
40
+ const { root, waitForChanges } = await renderList({ 'scroll-to-latest-label': 'Jump down' });
41
+ scrollTo(viewportOf(root), 0);
42
+ await appendMessage(root, waitForChanges);
43
+ const btn = root.shadowRoot.querySelector('[part="scroll-to-latest"]');
44
+ expect(btn.ariaLabel).toBe('Jump down');
45
+ });
46
+ it('scrollToLatest() scrolls, hides the button and emits bsScrollToLatest', async () => {
47
+ const { root, waitForChanges, spyOnEvent } = await renderList();
48
+ const spy = spyOnEvent('bsScrollToLatest');
49
+ const viewport = viewportOf(root);
50
+ scrollTo(viewport, 0);
51
+ await appendMessage(root, waitForChanges);
52
+ await root.scrollToLatest();
53
+ await waitForChanges();
54
+ expect(viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight).toBeLessThanOrEqual(1);
55
+ expect(spy).toHaveReceivedEventTimes(1);
56
+ expect(root.shadowRoot.querySelector('[part="scroll-to-latest"]')).toBeNull();
57
+ });
58
+ });
@@ -0,0 +1,40 @@
1
+ :host {
2
+ display: block;
3
+ position: relative;
4
+ min-height: 0;
5
+ --bs-message-list-gap: var(--bs-spacing-200);
6
+ --bs-message-list-padding: var(--bs-spacing-200);
7
+ --bs-message-list-button-offset: var(--bs-spacing-200);
8
+ }
9
+
10
+ .bs-message-list {
11
+ position: relative;
12
+ height: 100%;
13
+ }
14
+
15
+ .bs-message-list__viewport {
16
+ box-sizing: border-box;
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--bs-message-list-gap);
20
+ height: 100%;
21
+ padding: var(--bs-message-list-padding);
22
+ overflow-y: auto;
23
+ }
24
+
25
+ /* Messages keep their natural height and the viewport scrolls, instead of flex-shrinking them. */
26
+ ::slotted(*) {
27
+ flex-shrink: 0;
28
+ }
29
+
30
+ .bs-message-list__viewport:focus-visible {
31
+ outline: 2px solid var(--bs-border-neutral-focus);
32
+ outline-offset: -2px;
33
+ }
34
+
35
+ .bs-message-list__scroll {
36
+ position: absolute;
37
+ inset-block-end: var(--bs-message-list-button-offset);
38
+ inset-inline-start: 50%;
39
+ transform: translateX(-50%);
40
+ }
@@ -0,0 +1,161 @@
1
+ import { h } from "@stencil/core";
2
+ /** Distance (px) from the bottom within which the list counts as "at the bottom". */
3
+ const NEAR_BOTTOM_THRESHOLD = 48;
4
+ /**
5
+ * Scrollable chat transcript container (`role="log"`, `aria-live="polite"`) for `bs-message`
6
+ * children. It keeps itself pinned to the newest message while the user is near the bottom; when
7
+ * the user has scrolled up and new content arrives, it shows a "scroll to latest" button instead
8
+ * of yanking the viewport.
9
+ *
10
+ * Composed from: `bs-icon-button` (the scroll-to-latest control).
11
+ *
12
+ * ## When to use
13
+ * - Holding the messages of a chat conversation.
14
+ *
15
+ * ## When not to use
16
+ * - For generic scrollable lists -- this is built around append-at-the-bottom transcripts.
17
+ *
18
+ * @slot - `bs-message` elements.
19
+ * @part viewport - The scrollable region.
20
+ * @part scroll-to-latest - The scroll-to-latest `bs-icon-button`.
21
+ * @prop --bs-message-list-gap - Gap between messages. Aliased to `--bs-spacing-200`.
22
+ * @prop --bs-message-list-padding - Padding inside the scroll area. Aliased to `--bs-spacing-200`.
23
+ * @prop --bs-message-list-button-offset - Distance of the scroll-to-latest button from the bottom edge. Aliased to `--bs-spacing-200`.
24
+ */
25
+ export class BsMessageList {
26
+ host;
27
+ /** Accessible name of the scroll-to-latest button. */
28
+ scrollToLatestLabel = 'Scroll to latest message';
29
+ /** True while the user is scrolled away from the bottom and new content has arrived. */
30
+ showScrollButton = false;
31
+ /** Fires when the scroll-to-latest button is activated or `scrollToLatest()` is called. */
32
+ bsScrollToLatest;
33
+ viewport;
34
+ observer;
35
+ stickToBottom = true;
36
+ /** Scrolls to the newest message and re-enables auto-follow. */
37
+ async scrollToLatest() {
38
+ this.scrollToBottom();
39
+ this.stickToBottom = true;
40
+ this.showScrollButton = false;
41
+ this.bsScrollToLatest.emit();
42
+ }
43
+ connectedCallback() {
44
+ this.observer = new MutationObserver(this.onMutation);
45
+ this.observer.observe(this.host, { childList: true, subtree: true, characterData: true });
46
+ }
47
+ disconnectedCallback() {
48
+ this.observer?.disconnect();
49
+ this.observer = undefined;
50
+ }
51
+ componentDidLoad() {
52
+ this.scrollToBottom();
53
+ }
54
+ isNearBottom() {
55
+ const v = this.viewport;
56
+ if (!v)
57
+ return true;
58
+ return v.scrollHeight - v.scrollTop - v.clientHeight <= NEAR_BOTTOM_THRESHOLD;
59
+ }
60
+ scrollToBottom() {
61
+ if (this.viewport)
62
+ this.viewport.scrollTop = this.viewport.scrollHeight;
63
+ }
64
+ onScroll = () => {
65
+ this.stickToBottom = this.isNearBottom();
66
+ if (this.stickToBottom)
67
+ this.showScrollButton = false;
68
+ };
69
+ onMutation = () => {
70
+ if (this.stickToBottom) {
71
+ this.scrollToBottom();
72
+ }
73
+ else {
74
+ this.showScrollButton = true;
75
+ }
76
+ };
77
+ render() {
78
+ return (h("div", { key: '3298d4991c4c335e7efcff0e363a8c097452c832', class: "bs-message-list" }, h("div", { key: '7ad06a6bce1ae78b1a0779172d479c9f46a08e9b', part: "viewport", class: "bs-message-list__viewport", role: "log", "aria-live": "polite", tabindex: "0", ref: el => (this.viewport = el), onScroll: this.onScroll }, h("slot", { key: '274329a2ffa9207023177bca19a44d029150511c' })), this.showScrollButton && (h("bs-icon-button", { key: '7aff39c002edca1724ab94add005431f7e453b57', part: "scroll-to-latest", class: "bs-message-list__scroll", variant: "neutral", ariaLabel: this.scrollToLatestLabel, onClick: () => this.scrollToLatest() }, h("svg", { key: '85d406797de8e14957f078fa9ca3e9f5947c2586', width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true" }, h("path", { key: '4dd14212d3c5501ab6be3aae51e1cc80f143bf8a', d: "M8 3v10M3.5 8.5L8 13l4.5-4.5", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }))))));
79
+ }
80
+ static get is() { return "bs-message-list"; }
81
+ static get encapsulation() { return "shadow"; }
82
+ static get originalStyleUrls() {
83
+ return {
84
+ "$": ["bs-message-list.css"]
85
+ };
86
+ }
87
+ static get styleUrls() {
88
+ return {
89
+ "$": ["bs-message-list.css"]
90
+ };
91
+ }
92
+ static get properties() {
93
+ return {
94
+ "scrollToLatestLabel": {
95
+ "type": "string",
96
+ "mutable": false,
97
+ "complexType": {
98
+ "original": "string",
99
+ "resolved": "string",
100
+ "references": {}
101
+ },
102
+ "required": false,
103
+ "optional": false,
104
+ "docs": {
105
+ "tags": [],
106
+ "text": "Accessible name of the scroll-to-latest button."
107
+ },
108
+ "getter": false,
109
+ "setter": false,
110
+ "reflect": false,
111
+ "attribute": "scroll-to-latest-label",
112
+ "defaultValue": "'Scroll to latest message'"
113
+ }
114
+ };
115
+ }
116
+ static get states() {
117
+ return {
118
+ "showScrollButton": {}
119
+ };
120
+ }
121
+ static get events() {
122
+ return [{
123
+ "method": "bsScrollToLatest",
124
+ "name": "bsScrollToLatest",
125
+ "bubbles": true,
126
+ "cancelable": true,
127
+ "composed": true,
128
+ "docs": {
129
+ "tags": [],
130
+ "text": "Fires when the scroll-to-latest button is activated or `scrollToLatest()` is called."
131
+ },
132
+ "complexType": {
133
+ "original": "void",
134
+ "resolved": "void",
135
+ "references": {}
136
+ }
137
+ }];
138
+ }
139
+ static get methods() {
140
+ return {
141
+ "scrollToLatest": {
142
+ "complexType": {
143
+ "signature": "() => Promise<void>",
144
+ "parameters": [],
145
+ "references": {
146
+ "Promise": {
147
+ "location": "global",
148
+ "id": "global::Promise"
149
+ }
150
+ },
151
+ "return": "Promise<void>"
152
+ },
153
+ "docs": {
154
+ "text": "Scrolls to the newest message and re-enables auto-follow.",
155
+ "tags": []
156
+ }
157
+ }
158
+ };
159
+ }
160
+ static get elementRef() { return "host"; }
161
+ }
@@ -0,0 +1,17 @@
1
+ import { html } from "lit";
2
+ import { componentDescription, propDescription } from "../../stories-utils";
3
+ const meta = {
4
+ title: 'Genie AI Components/bs-message-list',
5
+ parameters: { docs: { description: { component: componentDescription('bs-message-list') } } },
6
+ render: args => html `
7
+ <bs-message-list scroll-to-latest-label=${args.scrollToLatestLabel} style="height: 320px; border: 1px solid var(--bs-border-default);">
8
+ ${Array.from({ length: 12 }, (_, i) => html `<bs-message role=${i % 2 ? 'assistant' : 'user'} timestamp="10:${String(i).padStart(2, '0')}">Message number ${i + 1}</bs-message>`)}
9
+ </bs-message-list>
10
+ `,
11
+ argTypes: {
12
+ scrollToLatestLabel: { control: 'text', description: propDescription('bs-message-list', 'scrollToLatestLabel') },
13
+ },
14
+ args: { scrollToLatestLabel: 'Scroll to latest message' },
15
+ };
16
+ export default meta;
17
+ export const Default = {};
@@ -99,4 +99,9 @@ describe('bs-pagination', () => {
99
99
  expect(root.shadowRoot.querySelector('[part="prev"]')).toEqualAttribute('aria-label', 'Go back');
100
100
  expect(root.shadowRoot.querySelector('[part="next"]')).toEqualAttribute('aria-label', 'Go forward');
101
101
  });
102
+ it('applies navLabel and pageLabel overrides', async () => {
103
+ const { root } = await render(h("bs-pagination", { totalPages: 5, navLabel: "Sidenummerering", pageLabel: "G\u00E5 til side" }));
104
+ expect(root.shadowRoot.querySelector('nav')).toEqualAttribute('aria-label', 'Sidenummerering');
105
+ expect(root.shadowRoot.querySelector('[aria-label="Gå til side 2"]')).not.toBeNull();
106
+ });
102
107
  });
@@ -36,6 +36,10 @@ export class BsPagination {
36
36
  * into `...`. `1` (the default) reproduces the Figma spec's example exactly (page 1 of 12 shows
37
37
  * `1 2 3 ... 12`). */
38
38
  siblingCount = 1;
39
+ /** Accessible name of the pagination landmark. */
40
+ navLabel = 'Pagination';
41
+ /** Prefix of each page button's accessible name ("Go to page 3"). */
42
+ pageLabel = 'Go to page';
39
43
  /** Accessible name for the previous-page button. */
40
44
  previousLabel = 'Previous page';
41
45
  /** Accessible name for the next-page button. */
@@ -87,7 +91,7 @@ export class BsPagination {
87
91
  }
88
92
  render() {
89
93
  const pageList = this.getPageList();
90
- return (h("nav", { key: 'd0fec9b9d17ddc5b338ed77c4e97a7006d7e665e', "aria-label": "Pagination" }, h("ul", { key: '82fff342952ea13a84f97e549039edd18a8b6626', part: "list", class: "bs-pagination__list" }, h("li", { key: '124c33b04fe0dcdef83f8ff9c4d539518c7557d7', part: "item", class: "bs-pagination__item" }, h("button", { key: '4d702cb7cdeb7df86c4844b313943cf8d8c607d5', part: "prev", type: "button", class: "bs-pagination__control", "aria-label": this.previousLabel, disabled: this.currentPage <= 1, onClick: () => this.goToPage(this.currentPage - 1) }, h(ChevronLeftIcon, { key: '6c747a6bcdf0a9a4a2dfb8260ff85ad95eb1acdf' }))), pageList.map((item, index) => item === 'ellipsis' ? (h("li", { part: "item", class: "bs-pagination__item", key: `ellipsis-${index}` }, h("span", { part: "ellipsis", class: "bs-pagination__ellipsis", "aria-hidden": "true" }, h(EllipsisIcon, null)))) : (h("li", { part: "item", class: "bs-pagination__item", key: item }, h("button", { part: item === this.currentPage ? 'page current' : 'page', type: "button", class: `bs-pagination__control bs-pagination__page ${item === this.currentPage ? 'bs-pagination__page--current' : ''}`, "aria-label": `Go to page ${item}`, "aria-current": item === this.currentPage ? 'page' : undefined, onClick: () => this.goToPage(item) }, item)))), h("li", { key: '987698c1f798053e6f9e7ac63373c04e68868d0f', part: "item", class: "bs-pagination__item" }, h("button", { key: '95220bdb47507697a0742dbfad4fa0d37d7b4d55', part: "next", type: "button", class: "bs-pagination__control", "aria-label": this.nextLabel, disabled: this.currentPage >= this.safeTotalPages, onClick: () => this.goToPage(this.currentPage + 1) }, h(ChevronRightIcon, { key: 'd6bdac44109e11fa11c2f7d32ed732c5364e6513' }))))));
94
+ return (h("nav", { key: 'e5a681ef3a6ad9256b7d86bca4848f07f45bd68c', "aria-label": this.navLabel }, h("ul", { key: '6e7c8b544db575ac9681d56f2a328e63965f6f8e', part: "list", class: "bs-pagination__list" }, h("li", { key: 'd9d899eaa3ab46136a8d8f0d7807ff47142241a7', part: "item", class: "bs-pagination__item" }, h("button", { key: '534929e47bac4665187919708832743de124769f', part: "prev", type: "button", class: "bs-pagination__control", "aria-label": this.previousLabel, disabled: this.currentPage <= 1, onClick: () => this.goToPage(this.currentPage - 1) }, h(ChevronLeftIcon, { key: 'badb293c1e204d4a6d95773ec841a9ea187d7461' }))), pageList.map((item, index) => item === 'ellipsis' ? (h("li", { part: "item", class: "bs-pagination__item", key: `ellipsis-${index}` }, h("span", { part: "ellipsis", class: "bs-pagination__ellipsis", "aria-hidden": "true" }, h(EllipsisIcon, null)))) : (h("li", { part: "item", class: "bs-pagination__item", key: item }, h("button", { part: item === this.currentPage ? 'page current' : 'page', type: "button", class: `bs-pagination__control bs-pagination__page ${item === this.currentPage ? 'bs-pagination__page--current' : ''}`, "aria-label": `${this.pageLabel} ${item}`, "aria-current": item === this.currentPage ? 'page' : undefined, onClick: () => this.goToPage(item) }, item)))), h("li", { key: 'b0b053124a350cf380b2e4482d658bdd3b990312', part: "item", class: "bs-pagination__item" }, h("button", { key: '9c1fa207fd0d1989e19da1e3e55c057b3ba17cb6', part: "next", type: "button", class: "bs-pagination__control", "aria-label": this.nextLabel, disabled: this.currentPage >= this.safeTotalPages, onClick: () => this.goToPage(this.currentPage + 1) }, h(ChevronRightIcon, { key: '437791d5fe13908ce80632783bdce7afc660876c' }))))));
91
95
  }
92
96
  static get is() { return "bs-pagination"; }
93
97
  static get encapsulation() { return "shadow"; }
@@ -163,6 +167,46 @@ export class BsPagination {
163
167
  "attribute": "sibling-count",
164
168
  "defaultValue": "1"
165
169
  },
170
+ "navLabel": {
171
+ "type": "string",
172
+ "mutable": false,
173
+ "complexType": {
174
+ "original": "string",
175
+ "resolved": "string",
176
+ "references": {}
177
+ },
178
+ "required": false,
179
+ "optional": false,
180
+ "docs": {
181
+ "tags": [],
182
+ "text": "Accessible name of the pagination landmark."
183
+ },
184
+ "getter": false,
185
+ "setter": false,
186
+ "reflect": false,
187
+ "attribute": "nav-label",
188
+ "defaultValue": "'Pagination'"
189
+ },
190
+ "pageLabel": {
191
+ "type": "string",
192
+ "mutable": false,
193
+ "complexType": {
194
+ "original": "string",
195
+ "resolved": "string",
196
+ "references": {}
197
+ },
198
+ "required": false,
199
+ "optional": false,
200
+ "docs": {
201
+ "tags": [],
202
+ "text": "Prefix of each page button's accessible name (\"Go to page 3\")."
203
+ },
204
+ "getter": false,
205
+ "setter": false,
206
+ "reflect": false,
207
+ "attribute": "page-label",
208
+ "defaultValue": "'Go to page'"
209
+ },
166
210
  "previousLabel": {
167
211
  "type": "string",
168
212
  "mutable": false,
@@ -0,0 +1,107 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const setup = () => render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", null, "Content")));
3
+ describe('bs-popover', () => {
4
+ it('is closed by default with aria wiring on the trigger wrapper', async () => {
5
+ const { root } = await setup();
6
+ const trigger = root.shadowRoot.querySelector('[part="trigger"]');
7
+ const popup = root.shadowRoot.querySelector('[part="popup"]');
8
+ expect(trigger).toEqualAttribute('aria-expanded', 'false');
9
+ expect(trigger).toEqualAttribute('aria-haspopup', 'true');
10
+ expect(trigger.getAttribute('aria-controls')).toBe(popup.id);
11
+ expect(popup.hasAttribute('hidden')).toBe(true);
12
+ });
13
+ it('toggles on trigger click and emits bsOpenChange', async () => {
14
+ const { root, waitForChanges, spyOnEvent } = await setup();
15
+ const spy = spyOnEvent('bsOpenChange');
16
+ const trigger = root.shadowRoot.querySelector('[part="trigger"]');
17
+ trigger.click();
18
+ await waitForChanges();
19
+ expect(root.open).toBe(true);
20
+ expect(root).toHaveAttribute('open');
21
+ expect(trigger).toEqualAttribute('aria-expanded', 'true');
22
+ expect(spy).toHaveReceivedEventDetail(true);
23
+ trigger.click();
24
+ await waitForChanges();
25
+ expect(root.open).toBe(false);
26
+ });
27
+ it('closes on outside click', async () => {
28
+ const { root, waitForChanges } = await setup();
29
+ root.open = true;
30
+ await waitForChanges();
31
+ document.body.click();
32
+ await waitForChanges();
33
+ expect(root.open).toBe(false);
34
+ });
35
+ it('stays open when clicking inside the popup', async () => {
36
+ const { root, waitForChanges } = await setup();
37
+ root.open = true;
38
+ await waitForChanges();
39
+ root.querySelector('div').click();
40
+ await waitForChanges();
41
+ expect(root.open).toBe(true);
42
+ });
43
+ it('closes on Escape and returns focus to the trigger', async () => {
44
+ const { root, waitForChanges } = await setup();
45
+ root.open = true;
46
+ await waitForChanges();
47
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
48
+ await waitForChanges();
49
+ expect(root.open).toBe(false);
50
+ expect(document.activeElement).toBe(root.querySelector('button'));
51
+ });
52
+ it('defaults placement to bottom-start', async () => {
53
+ const { root } = await setup();
54
+ expect(root.placement).toBe('bottom-start');
55
+ });
56
+ it('moves focus to the first focusable element in the popup on open', async () => {
57
+ const { root, waitForChanges } = await render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", null, h("button", { id: "first" }, "One"))));
58
+ root.open = true;
59
+ await waitForChanges();
60
+ expect(document.activeElement).toBe(root.querySelector('#first'));
61
+ root.open = false;
62
+ await waitForChanges();
63
+ expect(document.activeElement).toBe(root.querySelector('button[slot="trigger"]'));
64
+ });
65
+ it('focuses the popup container when nothing inside is focusable', async () => {
66
+ const { root, waitForChanges } = await setup();
67
+ root.open = true;
68
+ await waitForChanges();
69
+ expect(root.shadowRoot.activeElement).toBe(root.shadowRoot.querySelector('[part="popup"]'));
70
+ });
71
+ it('opens and focuses on ArrowDown from the trigger', async () => {
72
+ const { root, waitForChanges } = await render(h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("button", { id: "item" }, "Item")));
73
+ const trigger = root.shadowRoot.querySelector('[part="trigger"]');
74
+ const ev = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true });
75
+ trigger.dispatchEvent(ev);
76
+ await waitForChanges();
77
+ expect(ev.defaultPrevented).toBe(true);
78
+ expect(root.open).toBe(true);
79
+ expect(document.activeElement).toBe(root.querySelector('#item'));
80
+ });
81
+ it('reflects data-placement and keeps the preferred side when there is room', async () => {
82
+ const { root, waitForChanges } = await render(h("div", { style: { paddingTop: '200px', paddingLeft: '200px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '50px', width: '100px' } }, "Content"))));
83
+ const pop = root.querySelector('bs-popover');
84
+ pop.open = true;
85
+ await waitForChanges();
86
+ expect(pop.getAttribute('data-placement')).toBe('bottom-start');
87
+ });
88
+ it('flips to top when the popup would overflow the bottom of the viewport', async () => {
89
+ const { root, waitForChanges } = await render(h("div", { style: { position: 'fixed', left: '20px', bottom: '10px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '150px', width: '100px' } }, "Content"))));
90
+ const pop = root.querySelector('bs-popover');
91
+ pop.open = true;
92
+ await waitForChanges();
93
+ expect(pop.getAttribute('data-placement')).toBe('top-start');
94
+ const rect = pop.shadowRoot.querySelector('[part="popup"]').getBoundingClientRect();
95
+ expect(rect.bottom).toBeLessThanOrEqual(window.innerHeight);
96
+ });
97
+ it('flips to end alignment when overflowing the right edge, and re-measures on resize', async () => {
98
+ const { root, waitForChanges } = await render(h("div", { style: { position: 'fixed', right: '10px', top: '20px' } }, h("bs-popover", null, h("button", { slot: "trigger" }, "Open"), h("div", { style: { height: '40px', width: '300px' } }, "Content"))));
99
+ const pop = root.querySelector('bs-popover');
100
+ pop.open = true;
101
+ await waitForChanges();
102
+ expect(pop.getAttribute('data-placement')).toBe('bottom-end');
103
+ window.dispatchEvent(new Event('resize'));
104
+ await waitForChanges();
105
+ expect(pop.getAttribute('data-placement')).toBe('bottom-end');
106
+ });
107
+ });
@@ -0,0 +1,61 @@
1
+ :host {
2
+ display: inline-block;
3
+ position: relative;
4
+ --bs-popover-bg: var(--bs-surface-raised);
5
+ --bs-popover-radius: var(--bs-border-radius-100);
6
+ --bs-popover-shadow: var(--bs-shadow-md);
7
+ --bs-popover-offset: var(--bs-spacing-100);
8
+ --bs-popover-min-width: var(--bs-scale-1600);
9
+ --bs-popover-z-index: var(--bs-z-index-popover);
10
+ }
11
+
12
+ .bs-popover__trigger {
13
+ display: inline-block;
14
+ }
15
+
16
+ .bs-popover__popup {
17
+ position: absolute;
18
+ z-index: var(--bs-popover-z-index);
19
+ min-width: var(--bs-popover-min-width);
20
+ background: var(--bs-popover-bg);
21
+ border-radius: var(--bs-popover-radius);
22
+ box-shadow: var(--bs-popover-shadow);
23
+ top: calc(100% + var(--bs-popover-offset));
24
+ left: 0;
25
+ }
26
+
27
+ .bs-popover__popup {
28
+ outline: none;
29
+ }
30
+
31
+ .bs-popover__popup[hidden] {
32
+ display: none;
33
+ }
34
+
35
+ :host([data-placement='bottom-start']) .bs-popover__popup {
36
+ top: calc(100% + var(--bs-popover-offset));
37
+ bottom: auto;
38
+ left: 0;
39
+ right: auto;
40
+ }
41
+
42
+ :host([data-placement='bottom-end']) .bs-popover__popup {
43
+ top: calc(100% + var(--bs-popover-offset));
44
+ bottom: auto;
45
+ left: auto;
46
+ right: 0;
47
+ }
48
+
49
+ :host([data-placement='top-start']) .bs-popover__popup {
50
+ top: auto;
51
+ left: 0;
52
+ right: auto;
53
+ bottom: calc(100% + var(--bs-popover-offset));
54
+ }
55
+
56
+ :host([data-placement='top-end']) .bs-popover__popup {
57
+ top: auto;
58
+ left: auto;
59
+ right: 0;
60
+ bottom: calc(100% + var(--bs-popover-offset));
61
+ }