@brandsync/wc 0.0.11 → 0.1.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 (411) hide show
  1. package/custom-elements.json +5869 -1633
  2. package/dist/brandsync-wc/brandsync-wc.css +20 -0
  3. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  4. package/dist/brandsync-wc/p-00bb9bda.entry.js +1 -0
  5. package/dist/brandsync-wc/{p-8dff4f24.entry.js → p-0847f5c0.entry.js} +1 -1
  6. package/dist/brandsync-wc/p-0ba35c3b.entry.js +1 -0
  7. package/dist/brandsync-wc/{p-073e5fee.entry.js → p-0f3cb0c4.entry.js} +1 -1
  8. package/dist/brandsync-wc/p-10f6f3cd.entry.js +1 -0
  9. package/dist/brandsync-wc/{p-c6d330c3.entry.js → p-111974df.entry.js} +1 -1
  10. package/dist/brandsync-wc/p-11f3fceb.entry.js +1 -0
  11. package/dist/brandsync-wc/p-171fed0c.entry.js +1 -0
  12. package/dist/brandsync-wc/{p-dd224cb3.entry.js → p-18813680.entry.js} +1 -1
  13. package/dist/brandsync-wc/p-1b7c9928.entry.js +1 -0
  14. package/dist/brandsync-wc/p-1ce7dd64.entry.js +1 -0
  15. package/dist/brandsync-wc/p-2063a6d6.entry.js +1 -0
  16. package/dist/brandsync-wc/{p-4ca15322.entry.js → p-20c24179.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-b174403d.entry.js → p-321ed4d3.entry.js} +1 -1
  18. package/dist/brandsync-wc/p-38aad266.entry.js +1 -0
  19. package/dist/brandsync-wc/p-43e37883.entry.js +1 -0
  20. package/dist/brandsync-wc/p-55a8d4b5.entry.js +1 -0
  21. package/dist/brandsync-wc/p-59ac2495.entry.js +1 -0
  22. package/dist/brandsync-wc/p-5ae9e60e.entry.js +1 -0
  23. package/dist/brandsync-wc/p-6b469b2d.entry.js +1 -0
  24. package/dist/brandsync-wc/p-6d85fba4.entry.js +1 -0
  25. package/dist/brandsync-wc/p-6e95eb36.entry.js +1 -0
  26. package/dist/brandsync-wc/{p-84ae4420.entry.js → p-73217b90.entry.js} +1 -1
  27. package/dist/brandsync-wc/p-752c04c8.entry.js +1 -0
  28. package/dist/brandsync-wc/p-79af762c.entry.js +1 -0
  29. package/dist/brandsync-wc/p-81d49240.entry.js +1 -0
  30. package/dist/brandsync-wc/p-91551e7b.entry.js +1 -0
  31. package/dist/brandsync-wc/p-917a5bbc.entry.js +1 -0
  32. package/dist/brandsync-wc/{p-0b858120.entry.js → p-9876e83c.entry.js} +1 -1
  33. package/dist/brandsync-wc/p-9bcd99aa.entry.js +1 -0
  34. package/dist/brandsync-wc/{p-d1dc2ced.entry.js → p-9c4768aa.entry.js} +1 -1
  35. package/dist/brandsync-wc/{p-DP_bvuvB.js → p-Do3l4of3.js} +2 -2
  36. package/dist/brandsync-wc/p-aa43d478.entry.js +1 -0
  37. package/dist/brandsync-wc/p-c3079ad7.entry.js +1 -0
  38. package/dist/brandsync-wc/{p-74a4dd91.entry.js → p-c3c383dc.entry.js} +1 -1
  39. package/dist/brandsync-wc/p-cc79e75f.entry.js +1 -0
  40. package/dist/brandsync-wc/p-ce7fc368.entry.js +1 -0
  41. package/dist/brandsync-wc/{p-030a8ba7.entry.js → p-d3265e70.entry.js} +1 -1
  42. package/dist/brandsync-wc/p-d55bbcec.entry.js +1 -0
  43. package/dist/brandsync-wc/{p-1bf0b2d5.entry.js → p-e93e944b.entry.js} +1 -1
  44. package/dist/brandsync-wc/{p-7a605d98.entry.js → p-eb04c578.entry.js} +1 -1
  45. package/dist/brandsync-wc/{p-3c8fbaa8.entry.js → p-f0ae2740.entry.js} +1 -1
  46. package/dist/brandsync-wc/p-f4f22015.entry.js +1 -0
  47. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  48. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +3 -2
  49. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  50. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  51. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  52. package/dist/cjs/bs-attachment.cjs.entry.js +3 -3
  53. package/dist/cjs/bs-avatar.cjs.entry.js +60 -0
  54. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  55. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +56 -0
  56. package/dist/cjs/bs-breadcrumb.cjs.entry.js +33 -0
  57. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +49 -0
  58. package/dist/cjs/bs-button-skeleton.cjs.entry.js +2 -2
  59. package/dist/cjs/bs-button.cjs.entry.js +3 -3
  60. package/dist/cjs/bs-card.cjs.entry.js +10 -3
  61. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +2 -2
  62. package/dist/cjs/bs-chatbot-header.cjs.entry.js +2 -2
  63. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +2 -2
  64. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +2 -2
  65. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +2 -2
  66. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +20 -0
  67. package/dist/cjs/bs-checkbox.cjs.entry.js +14 -3
  68. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +14 -2
  69. package/dist/cjs/bs-composer.cjs.entry.js +37 -4
  70. package/dist/cjs/bs-data-table.cjs.entry.js +3 -3
  71. package/dist/cjs/bs-dialog.cjs.entry.js +110 -0
  72. package/dist/cjs/bs-icon-button.cjs.entry.js +40 -0
  73. package/dist/cjs/bs-inline-tab.cjs.entry.js +69 -0
  74. package/dist/cjs/bs-input.cjs.entry.js +24 -12
  75. package/dist/cjs/bs-logo.cjs.entry.js +165 -0
  76. package/dist/cjs/{bs-menu_2.cjs.entry.js → bs-menu-item.cjs.entry.js} +2 -15
  77. package/dist/cjs/bs-menu.cjs.entry.js +17 -0
  78. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +104 -0
  79. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +87 -0
  80. package/dist/cjs/bs-navigation-header.cjs.entry.js +44 -0
  81. package/dist/cjs/bs-pagination.cjs.entry.js +85 -0
  82. package/dist/cjs/bs-radio.cjs.entry.js +49 -0
  83. package/dist/cjs/bs-slider.cjs.entry.js +191 -0
  84. package/dist/cjs/bs-snackbar.cjs.entry.js +41 -0
  85. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  86. package/dist/cjs/bs-switch.cjs.entry.js +57 -0
  87. package/dist/cjs/bs-tab.cjs.entry.js +80 -0
  88. package/dist/cjs/bs-tabs.cjs.entry.js +39 -0
  89. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  90. package/dist/cjs/{index-CGrdFg95.js → index-DHVw-IPK.js} +2 -1
  91. package/dist/cjs/loader.cjs.js +2 -2
  92. package/dist/collection/collection-manifest.json +21 -3
  93. package/dist/collection/components/bs-ai-chatbot/bs-ai-chatbot.stories.js +26 -11
  94. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +2 -1
  95. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  96. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  97. package/dist/collection/components/bs-attachment/bs-attachment.css +12 -33
  98. package/dist/collection/components/bs-attachment/bs-attachment.js +4 -10
  99. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  100. package/dist/collection/components/bs-avatar/bs-avatar.cmp.test.js +54 -0
  101. package/dist/collection/components/bs-avatar/bs-avatar.css +197 -0
  102. package/dist/collection/components/bs-avatar/bs-avatar.js +251 -0
  103. package/dist/collection/components/bs-avatar/bs-avatar.stories.js +67 -0
  104. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.cmp.test.js +62 -0
  105. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.css +93 -0
  106. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.js +130 -0
  107. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.cmp.test.js +118 -0
  108. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.css +125 -0
  109. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.js +192 -0
  110. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.cmp.test.js +58 -0
  111. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.css +18 -0
  112. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +129 -0
  113. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.stories.js +84 -0
  114. package/dist/collection/components/bs-button/{bs-button.cmp.test.js → bs-button/bs-button.cmp.test.js} +26 -0
  115. package/dist/collection/components/bs-button/{bs-button.css → bs-button/bs-button.css} +57 -6
  116. package/dist/collection/components/bs-button/{bs-button.js → bs-button/bs-button.js} +10 -5
  117. package/dist/collection/components/bs-button/{bs-button.stories.js → bs-button/bs-button.stories.js} +2 -27
  118. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.cmp.test.js +83 -0
  119. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.css +346 -0
  120. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +185 -0
  121. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.stories.js +74 -0
  122. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +3 -3
  123. package/dist/collection/components/bs-card/bs-card.cmp.test.js +19 -0
  124. package/dist/collection/components/bs-card/bs-card.css +37 -5
  125. package/dist/collection/components/bs-card/bs-card.js +18 -2
  126. package/dist/collection/components/bs-card/bs-card.stories.js +17 -1
  127. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  128. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  129. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  130. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.css +1 -1
  131. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  132. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  133. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.cmp.test.js +23 -0
  134. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.css +64 -0
  135. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +81 -0
  136. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.stories.js +25 -0
  137. package/dist/collection/components/bs-checkbox/bs-checkbox.cmp.test.js +10 -0
  138. package/dist/collection/components/bs-checkbox/bs-checkbox.css +7 -1
  139. package/dist/collection/components/bs-checkbox/bs-checkbox.js +32 -1
  140. package/dist/collection/components/bs-checkbox/bs-checkbox.stories.js +12 -0
  141. package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +48 -7
  142. package/dist/collection/components/bs-composer/bs-composer.css +15 -0
  143. package/dist/collection/components/bs-composer/bs-composer.js +38 -4
  144. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.js +47 -1
  145. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +20 -1
  146. package/dist/collection/components/bs-data-table/bs-data-table.js +2 -2
  147. package/dist/collection/components/{bs-modal/bs-modal.cmp.test.js → bs-dialog/bs-dialog.cmp.test.js} +63 -19
  148. package/dist/collection/components/bs-dialog/bs-dialog.css +130 -0
  149. package/dist/collection/components/bs-dialog/bs-dialog.js +273 -0
  150. package/dist/collection/components/bs-dialog/bs-dialog.stories.js +115 -0
  151. package/dist/collection/components/bs-input/bs-input.cmp.test.js +20 -0
  152. package/dist/collection/components/bs-input/bs-input.css +80 -2
  153. package/dist/collection/components/bs-input/bs-input.js +28 -10
  154. package/dist/collection/components/bs-input/bs-input.stories.js +14 -11
  155. package/dist/collection/components/bs-logo/brandsync-logo-full-dark.js +44 -0
  156. package/dist/collection/components/bs-logo/brandsync-logo-full-light.js +40 -0
  157. package/dist/collection/components/bs-logo/brandsync-logo-mark.js +17 -0
  158. package/dist/collection/components/bs-logo/bs-logo.cmp.test.js +113 -0
  159. package/dist/collection/components/bs-logo/bs-logo.css +79 -0
  160. package/dist/collection/components/bs-logo/bs-logo.js +193 -0
  161. package/dist/collection/components/bs-logo/bs-logo.stories.js +69 -0
  162. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  163. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  164. package/dist/collection/components/bs-pagination/bs-pagination.cmp.test.js +102 -0
  165. package/dist/collection/components/bs-pagination/bs-pagination.css +120 -0
  166. package/dist/collection/components/bs-pagination/bs-pagination.js +233 -0
  167. package/dist/collection/components/bs-pagination/bs-pagination.stories.js +43 -0
  168. package/dist/collection/components/bs-radio/bs-radio.cmp.test.js +76 -0
  169. package/dist/collection/components/bs-radio/bs-radio.css +164 -0
  170. package/dist/collection/components/bs-radio/bs-radio.js +170 -0
  171. package/dist/collection/components/bs-radio/bs-radio.stories.js +56 -0
  172. package/dist/collection/components/bs-slider/bs-slider.cmp.test.js +139 -0
  173. package/dist/collection/components/bs-slider/bs-slider.css +409 -0
  174. package/dist/collection/components/bs-slider/bs-slider.js +499 -0
  175. package/dist/collection/components/bs-slider/bs-slider.stories.js +70 -0
  176. package/dist/collection/components/bs-snackbar/bs-snackbar.cmp.test.js +77 -0
  177. package/dist/collection/components/bs-snackbar/bs-snackbar.css +321 -0
  178. package/dist/collection/components/bs-snackbar/bs-snackbar.js +172 -0
  179. package/dist/collection/components/bs-snackbar/bs-snackbar.stories.js +59 -0
  180. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  181. package/dist/collection/components/bs-switch/bs-switch.cmp.test.js +71 -0
  182. package/dist/collection/components/bs-switch/bs-switch.css +196 -0
  183. package/dist/collection/components/bs-switch/bs-switch.js +185 -0
  184. package/dist/collection/components/bs-switch/bs-switch.stories.js +60 -0
  185. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.cmp.test.js +104 -0
  186. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.css +163 -0
  187. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +192 -0
  188. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.stories.js +95 -0
  189. package/dist/collection/components/bs-tab/bs-tab/bs-tab.cmp.test.js +120 -0
  190. package/dist/collection/components/bs-tab/bs-tab/bs-tab.css +216 -0
  191. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +232 -0
  192. package/dist/collection/components/bs-tab/bs-tab/bs-tab.stories.js +138 -0
  193. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.cmp.test.js +61 -0
  194. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.css +39 -0
  195. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +133 -0
  196. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.stories.js +39 -0
  197. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  198. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.cmp.test.js +143 -0
  199. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.css +257 -0
  200. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +281 -0
  201. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.stories.js +274 -0
  202. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.cmp.test.js +172 -0
  203. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.css +325 -0
  204. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +314 -0
  205. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.stories.js +78 -0
  206. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.cmp.test.js +77 -0
  207. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.css +106 -0
  208. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +188 -0
  209. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.stories.js +446 -0
  210. package/dist/components/bs-ai-disclaimer.js +1 -1
  211. package/dist/components/bs-ai-greeting.js +1 -1
  212. package/dist/components/bs-ai-thinking.js +1 -1
  213. package/dist/components/bs-attachment-list.js +1 -1
  214. package/dist/components/bs-attachment.js +1 -1
  215. package/dist/components/bs-avatar.d.ts +11 -0
  216. package/dist/components/bs-avatar.js +1 -0
  217. package/dist/components/bs-badge.js +1 -1
  218. package/dist/components/bs-breadcrumb-overflow.d.ts +11 -0
  219. package/dist/components/bs-breadcrumb-overflow.js +1 -0
  220. package/dist/components/bs-breadcrumb.d.ts +11 -0
  221. package/dist/components/bs-breadcrumb.js +1 -0
  222. package/dist/components/bs-breadcrumbs.d.ts +11 -0
  223. package/dist/components/bs-breadcrumbs.js +1 -0
  224. package/dist/components/bs-button-skeleton.js +1 -1
  225. package/dist/components/bs-button.js +1 -1
  226. package/dist/components/bs-card.js +1 -1
  227. package/dist/components/bs-chatbot-feedback.js +1 -1
  228. package/dist/components/bs-chatbot-header.js +1 -1
  229. package/dist/components/bs-chatbot-response-action.js +1 -1
  230. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  231. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  232. package/dist/components/bs-checkbox-skeleton.d.ts +11 -0
  233. package/dist/components/bs-checkbox-skeleton.js +1 -0
  234. package/dist/components/bs-checkbox.js +1 -1
  235. package/dist/components/bs-composer-status-banner.js +1 -1
  236. package/dist/components/bs-composer.js +1 -1
  237. package/dist/components/bs-data-table.js +1 -1
  238. package/dist/components/bs-dialog.d.ts +11 -0
  239. package/dist/components/bs-dialog.js +1 -0
  240. package/dist/components/bs-icon-button.d.ts +11 -0
  241. package/dist/components/bs-icon-button.js +1 -0
  242. package/dist/components/bs-inline-tab.d.ts +11 -0
  243. package/dist/components/bs-inline-tab.js +1 -0
  244. package/dist/components/bs-input.js +1 -1
  245. package/dist/components/{bs-modal.d.ts → bs-logo.d.ts} +4 -4
  246. package/dist/components/bs-logo.js +1 -0
  247. package/dist/components/bs-menu-item.js +1 -1
  248. package/dist/components/bs-menu.js +1 -1
  249. package/dist/components/bs-navigation-drawer-item.d.ts +11 -0
  250. package/dist/components/bs-navigation-drawer-item.js +1 -0
  251. package/dist/components/bs-navigation-drawer.d.ts +11 -0
  252. package/dist/components/bs-navigation-drawer.js +1 -0
  253. package/dist/components/bs-navigation-header.d.ts +11 -0
  254. package/dist/components/bs-navigation-header.js +1 -0
  255. package/dist/components/bs-pagination.d.ts +11 -0
  256. package/dist/components/bs-pagination.js +1 -0
  257. package/dist/components/bs-radio.d.ts +11 -0
  258. package/dist/components/bs-radio.js +1 -0
  259. package/dist/components/bs-slider.d.ts +11 -0
  260. package/dist/components/bs-slider.js +1 -0
  261. package/dist/components/bs-snackbar.d.ts +11 -0
  262. package/dist/components/bs-snackbar.js +1 -0
  263. package/dist/components/bs-source-link.js +1 -1
  264. package/dist/components/bs-switch.d.ts +11 -0
  265. package/dist/components/bs-switch.js +1 -0
  266. package/dist/components/bs-tab.d.ts +11 -0
  267. package/dist/components/bs-tab.js +1 -0
  268. package/dist/components/bs-tabs.d.ts +11 -0
  269. package/dist/components/bs-tabs.js +1 -0
  270. package/dist/components/bs-tooltip.js +1 -1
  271. package/dist/components/index.js +1 -1
  272. package/dist/components/p-BFcVSpES.js +1 -0
  273. package/dist/components/{p-D1cYtKyN.js → p-BJZYe7M4.js} +1 -1
  274. package/dist/components/p-BKaZWFE1.js +1 -0
  275. package/dist/components/{p-BUbGEXL7.js → p-BtX5URLk.js} +1 -1
  276. package/dist/components/{p-B9PrXIl_.js → p-CgaPcyEJ.js} +1 -1
  277. package/dist/components/{p-D2HDHZjz.js → p-qK1XlpTA.js} +1 -1
  278. package/dist/esm/brandsync-wc.js +3 -3
  279. package/dist/esm/bs-ai-disclaimer.entry.js +3 -2
  280. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  281. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  282. package/dist/esm/bs-attachment-list.entry.js +2 -2
  283. package/dist/esm/bs-attachment.entry.js +3 -3
  284. package/dist/esm/bs-avatar.entry.js +58 -0
  285. package/dist/esm/bs-badge.entry.js +1 -1
  286. package/dist/esm/bs-breadcrumb-overflow.entry.js +54 -0
  287. package/dist/esm/bs-breadcrumb.entry.js +31 -0
  288. package/dist/esm/bs-breadcrumbs.entry.js +47 -0
  289. package/dist/esm/bs-button-skeleton.entry.js +2 -2
  290. package/dist/esm/bs-button.entry.js +3 -3
  291. package/dist/esm/bs-card.entry.js +10 -3
  292. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  293. package/dist/esm/bs-chatbot-header.entry.js +2 -2
  294. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  295. package/dist/esm/bs-chatbot-sources-drawer.entry.js +2 -2
  296. package/dist/esm/bs-chatbot-suggestion-button.entry.js +2 -2
  297. package/dist/esm/bs-checkbox-skeleton.entry.js +18 -0
  298. package/dist/esm/bs-checkbox.entry.js +14 -3
  299. package/dist/esm/bs-composer-status-banner.entry.js +14 -2
  300. package/dist/esm/bs-composer.entry.js +37 -4
  301. package/dist/esm/bs-data-table.entry.js +3 -3
  302. package/dist/esm/bs-dialog.entry.js +108 -0
  303. package/dist/esm/bs-icon-button.entry.js +38 -0
  304. package/dist/esm/bs-inline-tab.entry.js +67 -0
  305. package/dist/esm/bs-input.entry.js +24 -12
  306. package/dist/esm/bs-logo.entry.js +163 -0
  307. package/dist/esm/{bs-menu_2.entry.js → bs-menu-item.entry.js} +3 -15
  308. package/dist/esm/bs-menu.entry.js +15 -0
  309. package/dist/esm/bs-navigation-drawer-item.entry.js +102 -0
  310. package/dist/esm/bs-navigation-drawer.entry.js +85 -0
  311. package/dist/esm/bs-navigation-header.entry.js +42 -0
  312. package/dist/esm/bs-pagination.entry.js +83 -0
  313. package/dist/esm/bs-radio.entry.js +47 -0
  314. package/dist/esm/bs-slider.entry.js +189 -0
  315. package/dist/esm/bs-snackbar.entry.js +39 -0
  316. package/dist/esm/bs-source-link.entry.js +3 -3
  317. package/dist/esm/bs-switch.entry.js +55 -0
  318. package/dist/esm/bs-tab.entry.js +78 -0
  319. package/dist/esm/bs-tabs.entry.js +37 -0
  320. package/dist/esm/bs-tooltip.entry.js +2 -2
  321. package/dist/esm/{index-DP_bvuvB.js → index-Do3l4of3.js} +2 -2
  322. package/dist/esm/loader.js +3 -3
  323. package/dist/types/components/bs-attachment/bs-attachment.d.ts +3 -9
  324. package/dist/types/components/bs-avatar/bs-avatar.d.ts +67 -0
  325. package/dist/types/components/bs-avatar/bs-avatar.stories.d.ts +20 -0
  326. package/dist/types/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.cmp.test.d.ts +1 -0
  327. package/dist/types/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.d.ts +44 -0
  328. package/dist/types/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.d.ts +69 -0
  329. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.cmp.test.d.ts +1 -0
  330. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.d.ts +45 -0
  331. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.stories.d.ts +14 -0
  332. package/dist/types/components/bs-button/bs-button/bs-button.cmp.test.d.ts +1 -0
  333. package/dist/types/components/bs-button/{bs-button.d.ts → bs-button/bs-button.d.ts} +5 -0
  334. package/dist/types/components/bs-button/{bs-button.stories.d.ts → bs-button/bs-button.stories.d.ts} +0 -2
  335. package/dist/types/components/bs-button/bs-icon-button/bs-icon-button.cmp.test.d.ts +1 -0
  336. package/dist/types/components/bs-button/bs-icon-button/bs-icon-button.d.ts +51 -0
  337. package/dist/types/components/bs-button/bs-icon-button/bs-icon-button.stories.d.ts +16 -0
  338. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.d.ts +1 -1
  339. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.stories.d.ts +1 -1
  340. package/dist/types/components/bs-card/bs-card.d.ts +10 -1
  341. package/dist/types/components/bs-card/bs-card.stories.d.ts +1 -0
  342. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.cmp.test.d.ts +1 -0
  343. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.d.ts +36 -0
  344. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.stories.d.ts +10 -0
  345. package/dist/types/components/bs-checkbox/bs-checkbox.d.ts +11 -0
  346. package/dist/types/components/bs-checkbox/bs-checkbox.stories.d.ts +1 -0
  347. package/dist/types/components/bs-composer/bs-composer.d.ts +26 -2
  348. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.d.ts +14 -0
  349. package/dist/types/components/bs-dialog/bs-dialog.cmp.test.d.ts +1 -0
  350. package/dist/types/components/bs-dialog/bs-dialog.d.ts +74 -0
  351. package/dist/types/components/{bs-modal/bs-modal.stories.d.ts → bs-dialog/bs-dialog.stories.d.ts} +5 -3
  352. package/dist/types/components/bs-input/bs-input.d.ts +8 -1
  353. package/dist/types/components/bs-logo/brandsync-logo-full-dark.d.ts +1 -0
  354. package/dist/types/components/bs-logo/brandsync-logo-full-light.d.ts +1 -0
  355. package/dist/types/components/bs-logo/brandsync-logo-mark.d.ts +1 -0
  356. package/dist/types/components/bs-logo/bs-logo.cmp.test.d.ts +1 -0
  357. package/dist/types/components/bs-logo/bs-logo.d.ts +73 -0
  358. package/dist/types/components/bs-logo/bs-logo.stories.d.ts +17 -0
  359. package/dist/types/components/bs-pagination/bs-pagination.cmp.test.d.ts +1 -0
  360. package/dist/types/components/bs-pagination/bs-pagination.d.ts +51 -0
  361. package/dist/types/components/bs-pagination/bs-pagination.stories.d.ts +14 -0
  362. package/dist/types/components/bs-radio/bs-radio.cmp.test.d.ts +1 -0
  363. package/dist/types/components/bs-radio/bs-radio.d.ts +45 -0
  364. package/dist/types/components/bs-radio/bs-radio.stories.d.ts +16 -0
  365. package/dist/types/components/bs-slider/bs-slider.cmp.test.d.ts +1 -0
  366. package/dist/types/components/bs-slider/bs-slider.d.ts +109 -0
  367. package/dist/types/components/bs-slider/bs-slider.stories.d.ts +24 -0
  368. package/dist/types/components/bs-snackbar/bs-snackbar.cmp.test.d.ts +1 -0
  369. package/dist/types/components/bs-snackbar/bs-snackbar.d.ts +51 -0
  370. package/dist/types/components/bs-snackbar/bs-snackbar.stories.d.ts +16 -0
  371. package/dist/types/components/bs-switch/bs-switch.cmp.test.d.ts +1 -0
  372. package/dist/types/components/bs-switch/bs-switch.d.ts +45 -0
  373. package/dist/types/components/bs-switch/bs-switch.stories.d.ts +17 -0
  374. package/dist/types/components/bs-tab/bs-inline-tab/bs-inline-tab.cmp.test.d.ts +1 -0
  375. package/dist/types/components/bs-tab/bs-inline-tab/bs-inline-tab.d.ts +65 -0
  376. package/dist/types/components/bs-tab/bs-inline-tab/bs-inline-tab.stories.d.ts +22 -0
  377. package/dist/types/components/bs-tab/bs-tab/bs-tab.cmp.test.d.ts +1 -0
  378. package/dist/types/components/bs-tab/bs-tab/bs-tab.d.ts +74 -0
  379. package/dist/types/components/bs-tab/bs-tab/bs-tab.stories.d.ts +30 -0
  380. package/dist/types/components/bs-tab/bs-tabs/bs-tabs.cmp.test.d.ts +1 -0
  381. package/dist/types/components/bs-tab/bs-tabs/bs-tabs.d.ts +45 -0
  382. package/dist/types/components/bs-tab/bs-tabs/bs-tabs.stories.d.ts +13 -0
  383. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.cmp.test.d.ts +1 -0
  384. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.d.ts +104 -0
  385. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.stories.d.ts +19 -0
  386. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.cmp.test.d.ts +1 -0
  387. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.d.ts +103 -0
  388. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.stories.d.ts +20 -0
  389. package/dist/types/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.cmp.test.d.ts +1 -0
  390. package/dist/types/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.d.ts +60 -0
  391. package/dist/types/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.stories.d.ts +25 -0
  392. package/dist/types/components.d.ts +2908 -114
  393. package/package.json +1 -1
  394. package/dist/brandsync-wc/p-2598ca88.entry.js +0 -1
  395. package/dist/brandsync-wc/p-3dd9b814.entry.js +0 -1
  396. package/dist/brandsync-wc/p-41edb0a2.entry.js +0 -1
  397. package/dist/brandsync-wc/p-6254dcbe.entry.js +0 -1
  398. package/dist/brandsync-wc/p-7131d0a1.entry.js +0 -1
  399. package/dist/brandsync-wc/p-8c302968.entry.js +0 -1
  400. package/dist/brandsync-wc/p-8d78171b.entry.js +0 -1
  401. package/dist/brandsync-wc/p-93e44903.entry.js +0 -1
  402. package/dist/brandsync-wc/p-aa45d877.entry.js +0 -1
  403. package/dist/cjs/bs-modal.cjs.entry.js +0 -69
  404. package/dist/collection/components/bs-modal/bs-modal.css +0 -66
  405. package/dist/collection/components/bs-modal/bs-modal.js +0 -198
  406. package/dist/collection/components/bs-modal/bs-modal.stories.js +0 -38
  407. package/dist/components/bs-modal.js +0 -1
  408. package/dist/esm/bs-modal.entry.js +0 -67
  409. package/dist/types/components/bs-modal/bs-modal.d.ts +0 -45
  410. /package/dist/types/components/{bs-button/bs-button.cmp.test.d.ts → bs-avatar/bs-avatar.cmp.test.d.ts} +0 -0
  411. /package/dist/types/components/{bs-modal/bs-modal.cmp.test.d.ts → bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.cmp.test.d.ts} +0 -0
@@ -6,25 +6,51 @@
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
8
  import { BsAttachmentType } from "./components/bs-attachment/bs-attachment";
9
+ import { BsAvatarSize, BsAvatarType } from "./components/bs-avatar/bs-avatar";
9
10
  import { BsBadgeVariant } from "./components/bs-badge/bs-badge";
10
- import { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button";
11
- import { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button";
11
+ import { BsBreadcrumbSize } from "./components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb";
12
+ import { BsBreadcrumbOverflowItem } from "./components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow";
13
+ import { BsBreadcrumbSize as BsBreadcrumbSize1 } from "./components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb";
14
+ import { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button/bs-button";
15
+ import { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button/bs-button";
12
16
  import { BsCardSurface } from "./components/bs-card/bs-card";
13
17
  import { BsCheckboxSize } from "./components/bs-checkbox/bs-checkbox";
18
+ import { BsCheckboxSize as BsCheckboxSize1 } from "./components/bs-checkbox/bs-checkbox";
14
19
  import { BsComposerState, BsComposerVariant } from "./components/bs-composer/bs-composer";
15
20
  import { BsComposerStatusBannerType } from "./components/bs-composer-status-banner/bs-composer-status-banner";
16
21
  import { BsDataTableColumn, BsDataTableRow } from "./components/bs-data-table/bs-data-table";
17
- import { BsModalSize } from "./components/bs-modal/bs-modal";
22
+ import { BsDialogSize } from "./components/bs-dialog/bs-dialog";
23
+ import { BsIconButtonSize, BsIconButtonVariant } from "./components/bs-button/bs-icon-button/bs-icon-button";
24
+ import { BsLogoBackground, BsLogoVariant } from "./components/bs-logo/bs-logo";
25
+ import { BsNavigationHeaderAlignment } from "./components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header";
26
+ import { BsSliderType } from "./components/bs-slider/bs-slider";
27
+ import { BsSnackbarVariant } from "./components/bs-snackbar/bs-snackbar";
28
+ import { BsSwitchSize } from "./components/bs-switch/bs-switch";
29
+ import { BsTabIconPosition } from "./components/bs-tab/bs-tab/bs-tab";
30
+ import { BsTabsOrientation, BsTabsType } from "./components/bs-tab/bs-tabs/bs-tabs";
18
31
  export { BsAttachmentType } from "./components/bs-attachment/bs-attachment";
32
+ export { BsAvatarSize, BsAvatarType } from "./components/bs-avatar/bs-avatar";
19
33
  export { BsBadgeVariant } from "./components/bs-badge/bs-badge";
20
- export { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button";
21
- export { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button";
34
+ export { BsBreadcrumbSize } from "./components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb";
35
+ export { BsBreadcrumbOverflowItem } from "./components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow";
36
+ export { BsBreadcrumbSize as BsBreadcrumbSize1 } from "./components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb";
37
+ export { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button/bs-button";
38
+ export { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button/bs-button";
22
39
  export { BsCardSurface } from "./components/bs-card/bs-card";
23
40
  export { BsCheckboxSize } from "./components/bs-checkbox/bs-checkbox";
41
+ export { BsCheckboxSize as BsCheckboxSize1 } from "./components/bs-checkbox/bs-checkbox";
24
42
  export { BsComposerState, BsComposerVariant } from "./components/bs-composer/bs-composer";
25
43
  export { BsComposerStatusBannerType } from "./components/bs-composer-status-banner/bs-composer-status-banner";
26
44
  export { BsDataTableColumn, BsDataTableRow } from "./components/bs-data-table/bs-data-table";
27
- export { BsModalSize } from "./components/bs-modal/bs-modal";
45
+ export { BsDialogSize } from "./components/bs-dialog/bs-dialog";
46
+ export { BsIconButtonSize, BsIconButtonVariant } from "./components/bs-button/bs-icon-button/bs-icon-button";
47
+ export { BsLogoBackground, BsLogoVariant } from "./components/bs-logo/bs-logo";
48
+ export { BsNavigationHeaderAlignment } from "./components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header";
49
+ export { BsSliderType } from "./components/bs-slider/bs-slider";
50
+ export { BsSnackbarVariant } from "./components/bs-snackbar/bs-snackbar";
51
+ export { BsSwitchSize } from "./components/bs-switch/bs-switch";
52
+ export { BsTabIconPosition } from "./components/bs-tab/bs-tab/bs-tab";
53
+ export { BsTabsOrientation, BsTabsType } from "./components/bs-tab/bs-tabs/bs-tabs";
28
54
  export namespace Components {
29
55
  /**
30
56
  * A centered caption disclaimer for Genie AI surfaces, e.g. "AI can make mistakes. Please verify
@@ -114,7 +140,9 @@ export namespace Components {
114
140
  /**
115
141
  * A single file attachment preview for `bs-composer` -- an image thumbnail, or a filename card
116
142
  * with a colored file-type badge (PDF/Document), with an optional upload-in-progress spinner and
117
- * a hover/focus-revealed remove button.
143
+ * a hover/focus-revealed remove button (a `bs-icon-button` with `size="xs"` `variant="neutral"` --
144
+ * the same 16x16px compact tier `bs-icon-button` documents as meant for exactly this kind of
145
+ * chip/tag "remove" control).
118
146
  * ## When to use
119
147
  * - Rendered by the consuming app for each file a user has attached to a Genie AI chat message,
120
148
  * typically alongside or inside `bs-composer`.
@@ -131,14 +159,6 @@ export namespace Components {
131
159
  * @prop --bs-attachment-badge-bg-pdf - PDF badge background. Aliased to `--bs-badge-bg-error`.
132
160
  * @prop --bs-attachment-badge-bg-document - Document badge background. Aliased to
133
161
  * `--bs-badge-bg-info`.
134
- * @prop --bs-attachment-remove-bg - Remove button (neutral icon button) default background.
135
- * Aliased to `--bs-button-neutral-container`.
136
- * @prop --bs-attachment-remove-hover - Remove button hover background. Aliased to
137
- * `--bs-button-neutral-hover`.
138
- * @prop --bs-attachment-remove-pressed - Remove button active/pressed background. Aliased to
139
- * `--bs-button-neutral-pressed`.
140
- * @prop --bs-attachment-remove-focus - Remove button focus outline color. Aliased to
141
- * `--bs-border-neutral-focus`.
142
162
  */
143
163
  interface BsAttachment {
144
164
  /**
@@ -198,6 +218,62 @@ export namespace Components {
198
218
  */
199
219
  "ariaLabel": string | null;
200
220
  }
221
+ /**
222
+ * A circular representation of a person or entity -- a photo, initials, or (as a fallback when
223
+ * neither is available) a generic user-silhouette icon.
224
+ * ## When to use
225
+ * - Representing a specific user or account: in a header, a comment, a member list, etc.
226
+ * - `type="initials"` when a photo isn't available but a name is (e.g. "Sam Lee" -> "SL").
227
+ * - `type="icon"` (the default) as the generic fallback when neither a photo nor a name/initials
228
+ * is available yet.
229
+ * ## When not to use
230
+ * - A company/brand logo -- use `bs-logo` instead.
231
+ * This component is decorative/informational by default, not an interactive control -- it renders
232
+ * a plain `<span>`/`<img>`, not a `<button>`. Figma's own component set includes hover/focused/
233
+ * pressed states (e.g. for an account-switcher trigger use case), which this implements as real
234
+ * `:hover`/`:focus-visible`/`:active` CSS on the host itself -- so wrapping this in your own
235
+ * `<button>`, or setting `tabindex` and a click handler on the `<bs-avatar>` element directly, gets
236
+ * the matching visual treatment for free with no extra wiring. Left genuinely non-interactive
237
+ * (no implicit role/tabindex of its own) so it doesn't misrepresent a purely decorative avatar
238
+ * (e.g. next to a comment) as a control when it isn't one.
239
+ */
240
+ interface BsAvatar {
241
+ /**
242
+ * `type="image"` only: accessible alt text for the photo, set directly on the real `<img>` this renders -- a person's photo is meaningful content, not decorative, so pass something real (e.g. their name). Falls back to `alt=""` (decorative to assistive tech) when unset, rather than omitting the attribute entirely, but don't rely on that fallback. Ignored for `icon`/`initials` -- see `ariaLabel` for those instead.
243
+ * @default null
244
+ */
245
+ "alt": string | null;
246
+ /**
247
+ * `type="icon"`/`"initials"` only: accessible name for the avatar, set as `aria-label` on the `role="img"` wrapper this renders (neither is a real `<img>`, so there's no native `alt` to set). Setting a plain `aria-label` attribute on the `<bs-avatar>` host does NOT work for this -- that attribute stays on the light-DOM host and never crosses into the shadow DOM, so the actual `role="img"` element stays nameless. Same pattern as `bs-checkbox`'s identical `ariaLabel` prop. Ignored for `image` -- see `alt` for that instead.
248
+ * @default null
249
+ */
250
+ "ariaLabel": string | null;
251
+ /**
252
+ * Applies the disabled treatment (50% opacity) and suppresses the hover/focus/pressed CSS states -- this doesn't set a native `disabled` attribute (this component renders no native form control), it's purely a visual/interaction-state flag for when a consuming app has wrapped this in its own disabled control. Reflected so the `:host([disabled])` CSS selector that drives all of the above still matches when a consumer sets the JS property directly (`el.disabled = true`) rather than the HTML attribute.
253
+ * @default false
254
+ */
255
+ "disabled": boolean;
256
+ /**
257
+ * `type="initials"` only: the initials text to display (e.g. `"SL"` for "Sam Lee"). Ignored for `icon`/`image`.
258
+ * @default null
259
+ */
260
+ "initials": string | null;
261
+ /**
262
+ * Sizing scale -- `xs` (24px) through `xxl` (128px), matching Figma's own six-step scale.
263
+ * @default 'md'
264
+ */
265
+ "size": BsAvatarSize;
266
+ /**
267
+ * `type="image"` only: the photo URL. This component does not fetch it itself -- network calls, loading/error states, and caching are the consuming app's responsibility, same convention as `bs-logo`'s own `src` prop. Ignored for `icon`/`initials`.
268
+ * @default null
269
+ */
270
+ "src": string | null;
271
+ /**
272
+ * What to render inside the circle. `icon` (default) is the generic fallback for when neither a photo nor initials are available yet.
273
+ * @default 'icon'
274
+ */
275
+ "type": BsAvatarType;
276
+ }
201
277
  /**
202
278
  * A small status or category pill, usually paired with a label or list item.
203
279
  * ## When to use
@@ -214,6 +290,109 @@ export namespace Components {
214
290
  */
215
291
  "variant": BsBadgeVariant;
216
292
  }
293
+ /**
294
+ * A single crumb within a `<bs-breadcrumbs>` trail: a leading separator icon plus either a link,
295
+ * plain text, or the current-page label, depending on `current`/`href`.
296
+ * Rendering follows the W3C ARIA Authoring Practices breadcrumb pattern
297
+ * (https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/): the current page is marked
298
+ * `aria-current="page"` and is never a link -- this holds even when `href` is also set, unlike
299
+ * Carbon Design System's `cds-breadcrumb-item`, which allows a link on the current item.
300
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
301
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
302
+ * accessibility tree needs this explicit role to preserve the list's semantics.
303
+ * ## When to use
304
+ * - As one crumb inside a `<bs-breadcrumbs>` trail.
305
+ * ## When not to use
306
+ * - Standalone, outside a `<bs-breadcrumbs>` wrapper -- its `<ol>`/`<nav>` context and
307
+ * first-child-aware separator hiding depend on that parent structure.
308
+ */
309
+ interface BsBreadcrumb {
310
+ /**
311
+ * Whether this crumb is the current page. Renders as plain (non-link) text marked `aria-current="page"`, reflected as an attribute so consumers/CSS can target `bs-breadcrumb[current]`.
312
+ * @default false
313
+ */
314
+ "current": boolean;
315
+ /**
316
+ * Destination for a non-current crumb. Ignored when `current` is true -- the current page is never a link, even if `href` is set (see the class JSDoc).
317
+ */
318
+ "href"?: string;
319
+ /**
320
+ * Size variant. Normally set automatically by a parent `<bs-breadcrumbs size="...">` -- the container propagates its own `size` as a JS property to every slotted `bs-breadcrumb`/ `bs-breadcrumb-overflow` child (see `bs-breadcrumbs.tsx`'s `propagateSize`), since CSS custom properties can't carry an enum that switches rules on their own. Can also be set directly on a standalone crumb. `sm` scales down font-size/line-height only -- the separator icon's pixel size is unchanged, since Figma didn't specify a `sm` icon size and guessing one risked drifting off-brand. Reflected so consumers/CSS can target `bs-breadcrumb[size="sm"]`.
321
+ * @default 'md'
322
+ */
323
+ "size": BsBreadcrumbSize;
324
+ }
325
+ /**
326
+ * A manually-placed collapsed-items disclosure for a `<bs-breadcrumbs>` trail: a leading separator
327
+ * plus an icon-only ellipsis button that reveals a `bs-menu` popup listing every hidden crumb.
328
+ * `items` is JS-property-only -- must be set as a JS property (`el.items = [...]`), not an HTML
329
+ * attribute, since attributes can only carry strings. See CONVENTIONS.md.
330
+ * Unlike an earlier `bs-breadcrumbs`-owned automatic `maxItems` collapse, this component does no
331
+ * collapsing logic itself -- the consumer decides which crumbs to hide and places this element
332
+ * wherever they want the disclosure, exactly matching Carbon Design System's own approach (Carbon
333
+ * doesn't auto-collapse breadcrumbs either; a consumer there manually decides what's visible).
334
+ * Hidden items with an `href` render as real `<a href>` rows inside the popup, not `bs-menu-item`
335
+ * (which renders a `<button>`) -- this matters because consuming apps commonly use client-side
336
+ * routers that intercept clicks on real `<a>` tags to do `preventDefault` + push-state navigation.
337
+ * Rendering hidden links any other way (e.g. `window.location`) would silently break client-side
338
+ * routing for hidden crumbs while working fine for visible ones. Hidden items without an `href`
339
+ * render as plain non-interactive text, matching how `bs-breadcrumb` itself handles link vs.
340
+ * no-link crumbs.
341
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
342
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
343
+ * accessibility tree needs this explicit role to preserve the list's semantics.
344
+ * ## When to use
345
+ * - Inside a `<bs-breadcrumbs>` trail, wherever the consumer wants an interactive disclosure for
346
+ * crumbs they've chosen not to render directly.
347
+ * ## When not to use
348
+ * - As an automatic collapsing mechanism -- there is none; the consumer decides what's hidden.
349
+ */
350
+ interface BsBreadcrumbOverflow {
351
+ /**
352
+ * Array prop -- must be set as a JS property (`el.items = [...]`), not an HTML attribute, since attributes can only carry strings. See CONVENTIONS.md. The hidden crumbs reachable via this disclosure -- no collapsing logic here, the consumer decides what goes in this list.
353
+ * @default []
354
+ */
355
+ "items": BsBreadcrumbOverflowItem[];
356
+ /**
357
+ * Accessible name (`aria-label`) for the icon-only ellipsis trigger button.
358
+ * @default 'Show hidden breadcrumbs'
359
+ */
360
+ "overflowLabel": string;
361
+ /**
362
+ * Size variant. Normally set automatically by a parent `<bs-breadcrumbs size="...">` -- see `bs-breadcrumb`'s identical `size` prop doc comment for why this is propagated as a JS property rather than inherited via CSS. Scales the popup rows' font-size/line-height only; the separator/ellipsis icons' pixel sizes are unchanged. Reflected so consumers/CSS can target `bs-breadcrumb-overflow[size="sm"]`.
363
+ * @default 'md'
364
+ */
365
+ "size": BsBreadcrumbSize1;
366
+ }
367
+ /**
368
+ * A breadcrumb trail container: a real `<nav>` landmark wrapping an `<ol>`, meant to be populated
369
+ * with slotted `<bs-breadcrumb>` (and, where the consumer wants a collapsed-items disclosure,
370
+ * `<bs-breadcrumb-overflow>`) children -- same composition-over-configuration architecture as
371
+ * Carbon Design System's `cds-breadcrumb`/`cds-breadcrumb-item`/`cds-breadcrumb-link`.
372
+ * This component is intentionally thin: it owns only the `<nav>` landmark and list semantics.
373
+ * Unlike an earlier `items`-array-driven design, there is no automatic collapsing here -- exactly
374
+ * like Carbon, the consumer decides what's visible and manually places a `<bs-breadcrumb-overflow>`
375
+ * wherever they want a collapsed-items disclosure. See `bs-breadcrumbs.mdx` for the consolidated
376
+ * docs covering all three components in this feature area.
377
+ * ## When to use
378
+ * - Showing a user's current location within a hierarchical page structure, with a path back to
379
+ * its ancestors.
380
+ * ## When not to use
381
+ * - Primary in-app navigation -- use `bs-navigation-drawer`/`bs-navigation-header` instead.
382
+ * - A flat set of unrelated pages with no hierarchy -- breadcrumbs imply ancestry, not just history.
383
+ */
384
+ interface BsBreadcrumbs {
385
+ /**
386
+ * Accessible name for the `<nav>` landmark, via `aria-label`. Same pattern as `bs-navigation-drawer`'s `heading` prop.
387
+ * @default 'Breadcrumb'
388
+ */
389
+ "label": string;
390
+ /**
391
+ * Size variant, propagated as a JS property to every slotted `bs-breadcrumb`/ `bs-breadcrumb-overflow` child -- this container has no visual sizing of its own (font/spacing live on the item components, see `bs-breadcrumb.tsx`'s identical `size` prop), so propagation is the only way setting `size` here reaches every crumb. CSS custom properties can't carry an enum that switches rules on their own, which is why this is pushed via JS property instead of CSS inheritance -- same reasoning as `bs-tabs` setting `selected` directly on its slotted `bs-tab`/`bs-inline-tab` children. Re-propagated on `size` changes and whenever the slotted children change (e.g. a crumb added later).
392
+ * @default 'md'
393
+ */
394
+ "size": BsBreadcrumbSize1;
395
+ }
217
396
  /**
218
397
  * A clickable action element for the single most important action in a given context.
219
398
  * ## When to use
@@ -233,6 +412,11 @@ export namespace Components {
233
412
  * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
234
413
  * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
235
414
  * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
415
+ * @prop --bs-button-neutral-border - Border color, `variant="neutral"`, default/disabled. Aliased to `--bs-border-neutral-container`.
416
+ * @prop --bs-button-neutral-border-hover - Border color, `variant="neutral"`, hover. Aliased to `--bs-border-neutral-container-hover`.
417
+ * @prop --bs-button-neutral-border-pressed - Border color, `variant="neutral"`, pressed. Aliased to `--bs-border-neutral-container-pressed`.
418
+ * @prop --bs-button-padding-x-icon-side - Horizontal padding on an edge that's adjacent to a leading/trailing icon (tighter than the plain text-only edge). Aliased to `--bs-spacing-150`.
419
+ * @prop --bs-button-padding-x-label-side - Horizontal padding on the opposite edge, when an icon on the other side needs compensating extra space to keep the button optically balanced. Aliased to `--bs-spacing-250`.
236
420
  */
237
421
  interface BsButton {
238
422
  /**
@@ -530,6 +714,11 @@ export namespace Components {
530
714
  * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
531
715
  */
532
716
  interface BsCheckbox {
717
+ /**
718
+ * Accessible name for the checkbox. Required whenever the default (label) slot is empty (e.g. a bare "select row" checkbox in a table) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-checkbox>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser, so the actual focusable element (the native `<input>` inside) stays nameless. This prop exists specifically to bridge that gap -- same pattern as `bs-button`'s and `bs-tab`'s identical `ariaLabel` prop, both of which explicitly bind it onto their own internal focusable element for the same reason.
719
+ * @default null
720
+ */
721
+ "ariaLabel": string | null;
533
722
  /**
534
723
  * Whether the checkbox is checked. Mutable so clicking the label/input toggles it directly. When `indeterminate` is also true, `indeterminate` wins visually (shows the minus icon) regardless of this value -- same as native checkboxes.
535
724
  * @default false
@@ -556,6 +745,36 @@ export namespace Components {
556
745
  */
557
746
  "size": BsCheckboxSize;
558
747
  }
748
+ /**
749
+ * A shape-matched loading placeholder for `bs-checkbox`, shown while the real label text isn't
750
+ * known yet (e.g. still being fetched from an API). Renders a small square (matching the
751
+ * checkbox's own box) beside a text-bar placeholder (standing in for the label), both pulsing
752
+ * together, sized to match `bs-checkbox`'s `sm`/`md`/`lg` box dimensions so layout doesn't shift
753
+ * once the real checkbox renders.
754
+ * ## When to use
755
+ * - In place of a `bs-checkbox` whose label/checked state depends on data that hasn't loaded yet.
756
+ * ## When not to use
757
+ * - While a checkbox's own change handler is running (e.g. a save request in flight) -- render the
758
+ * real `bs-checkbox` itself; this component is not a saving-in-progress spinner.
759
+ * @prop --bs-checkbox-skeleton-size-sm - Box width/height at `size="sm"`. Aliased to
760
+ * `--bs-spacing-200`, mirroring `bs-checkbox`'s own `--bs-checkbox-size-sm` -- not read directly
761
+ * from it, since these are two separate shadow roots.
762
+ * @prop --bs-checkbox-skeleton-size-md - Box width/height at `size="md"`. Aliased to
763
+ * `--bs-spacing-250`.
764
+ * @prop --bs-checkbox-skeleton-size-lg - Box width/height at `size="lg"`. Aliased to
765
+ * `--bs-spacing-300`.
766
+ * @prop --bs-checkbox-skeleton-gap - Gap between the box and label placeholders. Aliased to
767
+ * `--bs-spacing-100`, mirroring `bs-checkbox`'s own `--bs-checkbox-gap`.
768
+ * @prop --bs-checkbox-skeleton-label-width - Width of the label placeholder bar. Defaults to
769
+ * `96px`.
770
+ */
771
+ interface BsCheckboxSkeleton {
772
+ /**
773
+ * Sizing scale, matching the `bs-checkbox` size it stands in for. Defaults to `lg`, the same (unusual) default `bs-checkbox` itself uses.
774
+ * @default 'lg'
775
+ */
776
+ "size": BsCheckboxSize1;
777
+ }
559
778
  /**
560
779
  * A chat composer input for Genie AI-style conversational interfaces: a text field
561
780
  * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
@@ -587,6 +806,7 @@ export namespace Components {
587
806
  * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
588
807
  * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
589
808
  * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
809
+ * @prop --bs-composer-input-max-lines - How many lines the text field grows to before scrolling internally instead of growing further. Aliased to `10`.
590
810
  */
591
811
  interface BsComposer {
592
812
  /**
@@ -604,7 +824,7 @@ export namespace Components {
604
824
  */
605
825
  "state": BsComposerState;
606
826
  /**
607
- * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead.
827
+ * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead. The field is a `<textarea>` (not a single-line `<input>`) that grows with its content, up to `--bs-composer-input-max-lines` (10 by default) -- beyond that it scrolls internally instead of growing further. Setting `value` as a prop (not just typing) also re-triggers the resize, so e.g. programmatically clearing the field after submit correctly shrinks it back down.
608
828
  * @default ''
609
829
  */
610
830
  "value": string;
@@ -625,6 +845,12 @@ export namespace Components {
625
845
  * ## When not to use
626
846
  * - A toast/snackbar notification unrelated to the composer -- this component is not
627
847
  * self-dismissing and has no positioning of its own (it's a static block, not an overlay).
848
+ * ## Accessibility
849
+ * Sets `role="status"` for `type="info"`/`type="neutral"` and `role="alert"` for
850
+ * `type="error"`/`type="warning"` on its own root element automatically -- no opt-in prop needed.
851
+ * Both roles carry implicit ARIA live-region semantics (`status` is polite, `alert` is assertive),
852
+ * so a screen reader announces the message as soon as this banner is inserted into the DOM,
853
+ * without a consumer having to remember to add `role`/`aria-live` themselves.
628
854
  * @prop --bs-composer-status-banner-radius - Corner radius of the top-left/top-right corners
629
855
  * (bottom corners are square, so this sits flush above `bs-composer`). Aliased to
630
856
  * `--bs-border-radius-150`.
@@ -739,6 +965,124 @@ export namespace Components {
739
965
  */
740
966
  "sortDirection": 'asc' | 'desc';
741
967
  }
968
+ /**
969
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
970
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
971
+ * ## When to use
972
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
973
+ * - A short, focused task that doesn't warrant navigating to a new page.
974
+ * ## When not to use
975
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
976
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
977
+ * dialog that just gets taller and taller.
978
+ * Two additional slots cover the Figma "Dialog" component's other states: `image` (a hero image
979
+ * across the top, close button floats over it instead of sitting in the header row) and `icon`
980
+ * (only rendered when `centered` is set, e.g. a success checkmark above a centered heading). The
981
+ * close button "floats" (absolute-positioned, top-right of the dialog, with its own background)
982
+ * whenever `centered` is true or the `image` slot has content -- otherwise it's the plain inline
983
+ * button in the header row next to the heading, same as before this addition.
984
+ */
985
+ interface BsDialog {
986
+ /**
987
+ * Switches to the Figma "Icon Centered" layout: heading/body text centered, the `icon` slot rendered above the heading, and the close button floating top-right of the dialog instead of inline in the header row. Doesn't hide a slotted `image` if one is also provided -- Figma's spec doesn't show the two combined, so this is unspecified rather than actively blocked. Reflected so consumers/CSS can target `bs-dialog[centered]`.
988
+ * @default false
989
+ */
990
+ "centered": boolean;
991
+ "heading"?: string;
992
+ /**
993
+ * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
994
+ * @default false
995
+ */
996
+ "open": boolean;
997
+ /**
998
+ * @default 'md'
999
+ */
1000
+ "size": BsDialogSize;
1001
+ }
1002
+ /**
1003
+ * A clickable, icon-only action element -- the icon-only sibling of `bs-button`, sharing the same
1004
+ * 8 visual variants and color language, but ALWAYS rendering just a single icon, never a label.
1005
+ * ## When to use
1006
+ * - A compact action where the icon alone is unambiguous (e.g. a close/dismiss control, a toolbar
1007
+ * action) and adding a text label would take up more space than the context allows.
1008
+ * - The same variant guidance as `bs-button` applies: `primary` for the single most important
1009
+ * action, `neutral`/`subtle`/`outlined` for lower-emphasis alternatives, `error` reserved for
1010
+ * destructive/irreversible actions (never `neutral`, per BrandSync guidance), `success`/
1011
+ * `warning`/`info` only when the action's own outcome is predictable and clearly communicated.
1012
+ * ## When not to use
1013
+ * - When the action isn't self-evident from the icon alone -- use `bs-button` with a visible label
1014
+ * instead, don't rely on a tooltip to compensate for an unclear icon.
1015
+ * - For navigation between pages -- use a link/nav component instead.
1016
+ * Because this component is always icon-only, `ariaLabel` is required for every real usage (not
1017
+ * just conditionally, unlike `bs-button`) -- there's no visible label text to fall back on for an
1018
+ * accessible name.
1019
+ */
1020
+ interface BsIconButton {
1021
+ /**
1022
+ * Accessible name for the button. Required -- this component is always icon-only, so there's no visible label text for screen readers to fall back on. Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically.
1023
+ * @default null
1024
+ */
1025
+ "ariaLabel": string | null;
1026
+ /**
1027
+ * Disables the button and applies the disabled token set.
1028
+ * @default false
1029
+ */
1030
+ "disabled": boolean;
1031
+ /**
1032
+ * Sizing scale. `xs` (16px, an 8px icon) is a distinct, much smaller tier meant for compact chip/tag "remove" controls, not just a smaller toolbar button -- verified against a separate Figma redline (EG BrandSync UI Kit v1.5, node 20731:18427) from the one `sm`/`md`/`lg` were built against.
1033
+ * @default 'md'
1034
+ */
1035
+ "size": BsIconButtonSize;
1036
+ /**
1037
+ * Native `<button>` type.
1038
+ * @default 'button'
1039
+ */
1040
+ "type": 'button' | 'submit' | 'reset';
1041
+ /**
1042
+ * Visual style. Maps to the same semantic token families as `bs-button`'s `variant`. `error` is for destructive/irreversible actions per BrandSync guidance, not a stronger emphasis alternative to `primary`.
1043
+ * @default 'primary'
1044
+ */
1045
+ "variant": BsIconButtonVariant;
1046
+ }
1047
+ /**
1048
+ * A pill-shaped tab button -- an optional leading icon plus a text label, rendered as a real
1049
+ * `<button>` so it participates correctly in tab order and native click/keyboard activation.
1050
+ * Unlike `bs-tab`'s underline indicator, selection here is communicated entirely by the pill's
1051
+ * background fill color -- there is no separate indicator element.
1052
+ * ## When to use
1053
+ * - As one button within a segmented-control-style tab bar, where exactly one tab is
1054
+ * selected/active at a time.
1055
+ * ## When not to use
1056
+ * - As a standalone action button -- use `bs-button` instead, `bs-inline-tab`'s visual language
1057
+ * (muted pill until selected/hovered) only makes sense as part of a set.
1058
+ * `selected` is NOT self-toggling -- clicking a `bs-inline-tab` only emits `bsSelect`, it does not
1059
+ * set its own `selected` prop, and it does not unselect any sibling tabs. Wrap your
1060
+ * `<bs-inline-tab>` elements in `<bs-tabs type="bs-inline-tab">` -- it owns `role="tablist"` and
1061
+ * coordinates selection (listening for `bsSelect` and setting `selected`/`false` across siblings)
1062
+ * for you. Using `bs-inline-tab` standalone, outside a `<bs-tabs>` wrapper, still means `selected`
1063
+ * doesn't self-toggle and `role="tablist"` isn't provided automatically -- a consumer doing that
1064
+ * would still need to coordinate `selected` and supply `role="tablist"` manually, same as
1065
+ * `bs-tab.mdx`/`bs-radio.mdx` document for their own components. See `bs-inline-tab.mdx`'s
1066
+ * Accessibility section for the full requirement, including `role="tabpanel"` on the corresponding
1067
+ * content panels.
1068
+ */
1069
+ interface BsInlineTab {
1070
+ /**
1071
+ * Accessible name for the tab. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the tab does -- without it, an icon-only tab has no discernible name at all (axe-core flags this as a critical `button-name` violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically, same as `bs-tab`'s identical prop.
1072
+ * @default null
1073
+ */
1074
+ "ariaLabel": string | null;
1075
+ /**
1076
+ * Disables the tab: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents clicking from emitting `bsSelect`.
1077
+ * @default false
1078
+ */
1079
+ "disabled": boolean;
1080
+ /**
1081
+ * Whether this tab is the currently active one. NOT mutable and NOT self-toggling -- see the "Known gap" note in the class JSDoc. Still reflected as an attribute so consumers/CSS can target `bs-inline-tab[selected]`.
1082
+ * @default false
1083
+ */
1084
+ "selected": boolean;
1085
+ }
742
1086
  /**
743
1087
  * A single-line text field with an optional label, description, and error state. Also covers a
744
1088
  * range of related "field" shapes (number stepper, password reveal, date, dropdown trigger,
@@ -849,6 +1193,52 @@ export namespace Components {
849
1193
  */
850
1194
  "value": string;
851
1195
  }
1196
+ /**
1197
+ * The BrandSync brand mark, as its own standalone component -- shared by `bs-navigation-header`
1198
+ * and `bs-navigation-drawer`, which used to each render their own duplicated copy of this SVG
1199
+ * (the drawer's collapsed state even faked an icon-only look by clipping the full wordmark asset
1200
+ * down to a narrowed box, rather than using a real icon-only asset).
1201
+ * ## When to use
1202
+ * - Anywhere the BrandSync logo/icon needs to render: a navigation header, a nav drawer, etc.
1203
+ * ## When not to use
1204
+ * - The Genie AI chat panel's own brand mark -- that's a different logo (`bs-chatbot-header`'s
1205
+ * own inline Genie asset), not this one.
1206
+ * `variant` mirrors Figma's "Logo" component set (node 10909:30421) `Device` property
1207
+ * ("Desktop" / "Tab and mobile"), which was originally meant to distinguish the full lockup from
1208
+ * the icon-only mark at different responsive breakpoints -- renamed here to
1209
+ * `variant: 'full' | 'mark'` since that's what it actually controls (how much of the logo
1210
+ * renders), not literally a device/breakpoint switch.
1211
+ * `variant="custom"` is not a Figma variant at all -- it's an escape hatch for a consuming app
1212
+ * that needs to show a DIFFERENT product's logo in the same slot (e.g. a white-labeled deployment,
1213
+ * or a logo fetched at runtime from a service like brand.dev), via `src`/`alt`, instead of the
1214
+ * built-in BrandSync assets. This component deliberately does NOT fetch that image itself --
1215
+ * network calls, loading/error states, and caching are the consuming app's responsibility, same as
1216
+ * every other component in this library (e.g. `bs-attachment` takes `imageSrc` rather than fetching
1217
+ * an image on its own). `background` has no effect on `variant="custom"` -- a consumer's own image
1218
+ * is already designed for whatever surface it's placed on.
1219
+ */
1220
+ interface BsLogo {
1221
+ /**
1222
+ * `variant="custom"` only: accessible alt text for the image -- a product logo is meaningful content (whose brand is this?), not decorative, so set this to something real (e.g. the product/company name). Falls back to `alt=""` (marking the image decorative to assistive tech) when unset, rather than omitting the `alt` attribute entirely -- an `<img>` with no `alt` attribute at all is a harder accessibility failure than one explicitly marked decorative, but an empty fallback is still worse than a real name, so don't rely on it. Ignored for `full`/`mark` (those already carry their own fixed `aria-label="BrandSync"`).
1223
+ * @default null
1224
+ */
1225
+ "alt": string | null;
1226
+ /**
1227
+ * Which pre-built asset to use for `variant="full"` -- Figma ships a genuinely separate, differently-drawn dark-background asset (every wordmark path filled solid white, and the icon's outer shape a single solid-white path instead of the light version's two-path white-fill-plus-border-ring), not a CSS currentColor swap of identical paths. `"auto"` (default) renders both assets and lets CSS pick one via `--bs-logo-asset-light-display`/`--bs-logo-asset-dark-display` (defined in `src/global/base.css`, flipped by the same `[data-theme="dark"]` attribute every other `--bs-*` token already reacts to) -- so the logo just follows the ambient theme with no wiring needed, the same way a consuming app's own dark mode already re-themes every other part of this library via ordinary CSS custom property inheritance. Set `"light"`/`"dark"` explicitly to pin one regardless of the ambient theme -- e.g. a dark sidebar that isn't otherwise dark-themed. Has no effect on `variant="mark"`: Figma's component set only has one real designed instance of the icon-only mark (`Device="Tab and mobile"`, `Background="Default"`) -- there's no separate dark version of it, so the mark renders identically regardless of this prop.
1228
+ * @default 'auto'
1229
+ */
1230
+ "background": BsLogoBackground;
1231
+ /**
1232
+ * `variant="custom"` only: the image URL to render (e.g. a URL your app already fetched from a logo API). Ignored for `full`/`mark`.
1233
+ * @default null
1234
+ */
1235
+ "src": string | null;
1236
+ /**
1237
+ * How much of the logo to render. `full` is the icon + "EG BrandSync" wordmark (190.977x44 natural size); `mark` is just the icon (44x44 natural size), no wordmark; `custom` renders a consumer-supplied image via `src`/`alt` instead of a built-in BrandSync asset -- see the class doc above.
1238
+ * @default 'full'
1239
+ */
1240
+ "variant": BsLogoVariant;
1241
+ }
852
1242
  /**
853
1243
  * A generic dropdown/popup menu container: a rounded, elevated list of items (typically
854
1244
  * `bs-menu-item` elements).
@@ -896,27 +1286,352 @@ export namespace Components {
896
1286
  "disabled": boolean;
897
1287
  }
898
1288
  /**
899
- * An overlay dialog that interrupts the current flow for a focused task or confirmation.
900
- * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
1289
+ * A left-side persistent navigation sidebar: the BrandSync logo, a "Main Menu" title with a
1290
+ * collapse toggle, a reserved slot for a search field, and a scrollable list of nav items.
901
1291
  * ## When to use
902
- * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
903
- * - A short, focused task that doesn't warrant navigating to a new page.
1292
+ * - The primary in-app navigation, shown alongside `bs-navigation-header` (typically that
1293
+ * header's `with-navigation-drawer` alignment, which omits its own logo since this component
1294
+ * already renders one -- or the reverse pairing, this drawer's own `showLogo={false}` alongside
1295
+ * a header that keeps its logo instead, see that prop's own docs).
904
1296
  * ## When not to use
905
- * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
906
- * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
907
- * modal that just gets taller and taller.
1297
+ * - The top navigation bar itself -- use `bs-navigation-header` instead.
1298
+ * This component renders a real `<nav>` landmark (no explicit `role` needed -- `<nav>` already
1299
+ * carries the implicit `navigation` role), labeled via `aria-label={heading}` so the landmark
1300
+ * still has a name even when collapsed (see below).
1301
+ * `collapsed` narrows the drawer to a 96px icon-only rail, per Figma node 8028:135374
1302
+ * ("Type=Collapsed"): the title text disappears, the logo swaps from the full "EG BrandSync"
1303
+ * wordmark (`bs-logo variant="full"`) to the real icon-only mark (`bs-logo variant="mark"` -- a
1304
+ * second, properly-designed asset, not a CSS crop of the full one) via CSS visibility toggling on
1305
+ * both, the same `:host([collapsed])` attribute-selector pattern already used for the
1306
+ * `search`/`search-trigger` swap below, the `search` slot is replaced by a compact built-in
1307
+ * search-trigger button (this component can't meaningfully shrink arbitrary slotted search-field
1308
+ * content down to icon size itself, so it emits `bsSearchClick` instead -- e.g. to open a full
1309
+ * search overlay), and every top-level
1310
+ * `bs-navigation-drawer-item`'s layout switches from icon-beside-label to icon-above-caption.
1311
+ * That last part is real prop propagation, not a CSS trick: this component keeps each direct-child
1312
+ * item's own `collapsed` prop in sync with its own (see `syncItemsCollapsed` below), the same
1313
+ * direct-children-prop-sync approach `bs-tabs` already uses for coordinating `selected` across its
1314
+ * `bs-tab` children. Clicking the toggle self-toggles `collapsed` (simple local UI state, not
1315
+ * something needing cross-component coordination -- closer to `bs-switch`'s self-toggling
1316
+ * `checked` than `bs-tab`'s non-self-toggling `selected`) and emits `bsCollapse` with the new
1317
+ * value. The toggle's own caret icon does NOT rotate when collapsed -- Figma's collapsed mock
1318
+ * reuses the identical left-pointing "CaretLeft" asset unchanged, confirmed by directly inspecting
1319
+ * that state, so this deliberately does not add the same "flip on toggle" idiom the drawer item's
1320
+ * own disclosure chevron does (that one really is an unconfirmed addition; this one was checked).
908
1321
  */
909
- interface BsModal {
910
- "heading"?: string;
1322
+ interface BsNavigationDrawer {
911
1323
  /**
912
- * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
1324
+ * Narrows the drawer to a 96px icon-only rail (Figma node 8028:135374). Mutable and reflected -- clicking the collapse toggle toggles this directly (self-toggling, see the class doc above for why), and this component keeps every direct-child `bs-navigation-drawer-item`'s own `collapsed` prop synced to match (see `syncItemsCollapsed`).
913
1325
  * @default false
914
1326
  */
915
- "open": boolean;
1327
+ "collapsed": boolean;
916
1328
  /**
917
- * @default 'md'
1329
+ * Whether this drawer can be collapsed at all. `false` renders no collapse toggle/chevron -- a "fixed" side nav (Carbon's terminology: a `Fixed Side Nav` never collapses, as opposed to a rail-capable one) that's always fully expanded. `collapsed` is ignored while this is `false`.
1330
+ * @default true
1331
+ */
1332
+ "collapsible": boolean;
1333
+ /**
1334
+ * Heading text shown next to the collapse toggle, and used as the `<nav>` landmark's `aria-label` (so the landmark keeps a name even when `collapsed` hides the visible text).
1335
+ * @default 'Main Menu'
1336
+ */
1337
+ "heading": string;
1338
+ /**
1339
+ * Forwarded straight to both internal `bs-logo` elements' own `background` prop. Defaults to `"auto"`, which follows the ambient `[data-theme="dark"]` state automatically (see `bs-logo`'s own docs) -- so if this drawer ends up on a dark surface via the normal theming mechanism, the logo switches to its dedicated dark-background asset with no wiring needed. Set `"light"`/`"dark"` explicitly only if you've overridden `--bs-navigation-drawer-bg` to something dark yourself *without* setting `[data-theme="dark"]`, and need to pin the logo regardless of theme. Has no visible effect on the `variant="mark"` logo shown while `collapsed` (see `bs-logo`'s own docs -- there's only one real designed mark asset, it's background-agnostic).
1340
+ * @default 'auto'
1341
+ */
1342
+ "logoBackground": 'auto' | 'light' | 'dark';
1343
+ /**
1344
+ * Whether to render the BrandSync logo at all. Defaults to `true`. This drawer is normally the one that owns the logo when paired with a `bs-navigation-header` (that header's own `with-navigation-drawer` alignment omits its logo for exactly this reason) -- but the reverse pairing works too: a header that keeps its own logo (`alignment="default"`) paired with this drawer set to `showLogo={false}`, so the brand mark only ever appears once.
1345
+ * @default true
918
1346
  */
919
- "size": BsModalSize;
1347
+ "showLogo": boolean;
1348
+ }
1349
+ /**
1350
+ * A single row within a `bs-navigation-drawer`'s item list -- either a plain leaf nav item, or an
1351
+ * `expandable` group header that discloses nested `bs-navigation-drawer-item` children.
1352
+ * ## When to use
1353
+ * - Every row inside a `bs-navigation-drawer`'s default slot.
1354
+ * ## When not to use
1355
+ * - A standalone action outside a navigation drawer -- use `bs-button`/`bs-menu-item` instead.
1356
+ * Click behavior is mutually exclusive, based on `expandable`:
1357
+ * - `expandable = false` (a plain leaf item): clicking only emits `bsSelect`. `selected` is NOT
1358
+ * self-toggling -- same non-self-toggling precedent as `bs-tab`'s `selected` (see `bs-tab.tsx`'s
1359
+ * class doc): coordinating which sibling row is selected needs cross-item state a
1360
+ * consumer/wrapper owns, not something this component can reason about on its own.
1361
+ * - `expandable = true` (a group header, never shown with a `selected` tint): clicking toggles
1362
+ * `this.expanded` directly and emits `bsToggle` with the new value, and does NOT emit
1363
+ * `bsSelect`. This IS self-toggling, unlike `selected` above -- it's simple local disclosure
1364
+ * state with no cross-item coordination needed, closer to `bs-switch`'s self-toggling `checked`
1365
+ * than `bs-tab`'s non-self-toggling `selected`.
1366
+ * Nesting: put child `<bs-navigation-drawer-item nested>` elements inside a parent
1367
+ * `<bs-navigation-drawer-item expandable>` with `slot="children"`. The parent shows/hides that
1368
+ * slot's content based on its own `expanded` prop, via a pure-CSS attribute selector (no JS
1369
+ * visibility toggling needed, since `expanded` is reflected).
1370
+ * `collapsed` switches this row from its normal icon-beside-label row layout to a compact
1371
+ * icon-above-caption column (per Figma node 8028:135374, the drawer's "Type=Collapsed" state) --
1372
+ * you don't need to set this yourself on every item: a parent `bs-navigation-drawer` keeps its own
1373
+ * top-level items' `collapsed` prop in sync with its own `collapsed` state automatically (see
1374
+ * `bs-navigation-drawer.tsx`'s `syncItemsCollapsed`, the same direct-children-prop-sync approach
1375
+ * `bs-tabs` uses for coordinating `selected` across its own `bs-tab` children). It's still a public
1376
+ * prop so a standalone item (or this component's own stories) can be demoed without the parent.
1377
+ */
1378
+ interface BsNavigationDrawerItem {
1379
+ /**
1380
+ * Optional accessible name override. Not required for `collapsed` rows -- unlike an icon-only button, the label caption stays visible (just restyled smaller, under the icon) in that mode per Figma, so the button's default accessible-name computation (its own text content) already works. Set this if you want a fuller/different name than the visible caption (e.g. truncated captions, or matching `bs-switch`/`bs-slider`'s `ariaLabel` convention for consistency).
1381
+ * @default null
1382
+ */
1383
+ "ariaLabel": string | null;
1384
+ /**
1385
+ * Switches this row to the compact icon-above-caption column layout used when its parent `bs-navigation-drawer` is `collapsed` (see the class doc above). Reflected so `bs-navigation-drawer-item[collapsed]` is CSS-targetable. Also forces `expandable` rows' chevron and `children` slot to stay hidden regardless of `expanded` -- Figma's collapsed rail never shows a nested tree.
1386
+ * @default false
1387
+ */
1388
+ "collapsed": boolean;
1389
+ /**
1390
+ * Renders this row as a disclosure/group header (trailing chevron, self-toggling `expanded`, `bsToggle` instead of `bsSelect` on click) instead of a plain navigable leaf item. See the class doc above for the full click-behavior split.
1391
+ * @default false
1392
+ */
1393
+ "expandable": boolean;
1394
+ /**
1395
+ * Whether an `expandable` row's `children` slot is shown. Mutable and reflected -- clicking an `expandable` row toggles this directly (self-toggling, unlike `selected` above), and CSS shows/hides the `children` slot wrapper based on the reflected attribute. Ignored when `expandable` is false.
1396
+ * @default false
1397
+ */
1398
+ "expanded": boolean;
1399
+ /**
1400
+ * Marks this as a child row nested under an `expandable` parent (via `slot="children"`) -- deepens the left indent and stops reserving `icon` slot space entirely (Figma's nested rows never have icons).
1401
+ * @default false
1402
+ */
1403
+ "nested": boolean;
1404
+ /**
1405
+ * Tints the row's background/text to indicate it's the current destination. NOT self-toggling -- see the class doc above for why. Ignored (never applied) when `expandable` is true. Reflected so consumers/CSS can target `bs-navigation-drawer-item[selected]`.
1406
+ * @default false
1407
+ */
1408
+ "selected": boolean;
1409
+ }
1410
+ /**
1411
+ * The top-level navigation bar for a page: the BrandSync logo plus two consumer-provided slots
1412
+ * for menu/action content (e.g. `bs-button`/`bs-icon-button` elements).
1413
+ * ## When to use
1414
+ * - The persistent top bar of an application, above the page content.
1415
+ * ## When not to use
1416
+ * - The header of a Genie AI chat panel -- use `bs-chatbot-header` instead, which is purpose-built
1417
+ * for that narrower layout and its own fixed action buttons.
1418
+ * `alignment` controls both whether the logo renders and how the two slots are laid out:
1419
+ * - `default` (default): logo on the left, `left` slot content immediately after it, `right` slot
1420
+ * content pushed to the far right.
1421
+ * - `center`: logo and `right` slot both grow equally (`flex: 1`), which centers the `left` slot
1422
+ * content in the middle of the bar.
1423
+ * - `with-navigation-drawer`: no logo at all (this variant assumes a nav-drawer toggle is the
1424
+ * leftmost thing on the page instead) -- `left` slot content starts at the bar's own left edge,
1425
+ * `right` slot content pushed to the far right.
1426
+ */
1427
+ interface BsNavigationHeader {
1428
+ /**
1429
+ * Controls whether the logo renders and how the `left`/`right` slots are laid out -- see the class doc above for the three variants' exact behavior.
1430
+ * @default 'default'
1431
+ */
1432
+ "alignment": BsNavigationHeaderAlignment;
1433
+ /**
1434
+ * Accessible label for the header landmark, useful when a page has more than one `<header>` (e.g. this one plus a page-specific sub-header) and screen reader users need to tell them apart in the landmarks list.
1435
+ * @default null
1436
+ */
1437
+ "ariaLabel": string | null;
1438
+ /**
1439
+ * Forwarded straight to the internal `bs-logo`'s own `background` prop. Defaults to `"auto"`, which follows the ambient `[data-theme="dark"]` state automatically (see `bs-logo`'s own docs) -- so if this bar ends up on a dark surface via the normal theming mechanism, the logo switches to its dedicated dark-background asset with no wiring needed. Set `"light"`/`"dark"` explicitly only if you've overridden `--bs-navigation-header-bg` to something dark yourself *without* setting `[data-theme="dark"]`, and need to pin the logo regardless of theme.
1440
+ * @default 'auto'
1441
+ */
1442
+ "logoBackground": 'auto' | 'light' | 'dark';
1443
+ /**
1444
+ * Fragment/URL to jump to when the "Skip to main content" link is activated (e.g. `#main-content`, matching an id on your page's main landmark). Unset by default -- the link is opt-in rather than pointing at a guessed default id, since a skip link to a target that doesn't exist on the consumer's page is worse than no skip link at all (it silently does nothing when activated). Set this to the same id your page's `<main>` (or equivalent) already has to enable it.
1445
+ * @default null
1446
+ */
1447
+ "skipToContentHref": string | null;
1448
+ /**
1449
+ * Link text for the skip-to-content link. Only rendered when `skipToContentHref` is set.
1450
+ * @default 'Skip to main content'
1451
+ */
1452
+ "skipToContentLabel": string;
1453
+ }
1454
+ /**
1455
+ * A numbered page control -- previous/next chevrons, page-number buttons, and `...` overflow for
1456
+ * large page counts. Matches the Figma "Pagination" component's "Default" type (the classic
1457
+ * numbered pagination); its other type ("jumper" -- a rows-per-page dropdown plus a page-jump
1458
+ * input) is a structurally different composite widget and isn't covered by this component.
1459
+ * `totalPages`/`currentPage` drive everything -- this computes which page numbers to show and
1460
+ * where to collapse into `...` itself, the consumer never builds the button list by hand.
1461
+ * ## When to use
1462
+ * - Paging through a large, ordered result set (a table, a search results list) where jumping
1463
+ * directly to a specific page number is useful.
1464
+ * ## When not to use
1465
+ * - Infinite-scroll or "load more" patterns -- those don't have a fixed, addressable page number.
1466
+ * - A huge page count where users realistically only ever go forward/back one page at a time --
1467
+ * plain prev/next controls (no numbers) are simpler there.
1468
+ */
1469
+ interface BsPagination {
1470
+ /**
1471
+ * The active page (1-indexed). Mutable + reflected so clicking a page button updates it directly, the same way `bs-modal`'s `open` self-manages, while `bsPageChange` still fires for the consumer to react to (e.g. fetching that page's data).
1472
+ * @default 1
1473
+ */
1474
+ "currentPage": number;
1475
+ /**
1476
+ * Accessible name for the next-page button.
1477
+ * @default 'Next page'
1478
+ */
1479
+ "nextLabel": string;
1480
+ /**
1481
+ * Accessible name for the previous-page button.
1482
+ * @default 'Previous page'
1483
+ */
1484
+ "previousLabel": string;
1485
+ /**
1486
+ * How many page numbers to show on each side of the current page before collapsing the rest into `...`. `1` (the default) reproduces the Figma spec's example exactly (page 1 of 12 shows `1 2 3 ... 12`).
1487
+ * @default 1
1488
+ */
1489
+ "siblingCount": number;
1490
+ /**
1491
+ * Total number of pages. Must be a positive integer -- there's always at least one page.
1492
+ * @default 1
1493
+ */
1494
+ "totalPages": number;
1495
+ }
1496
+ /**
1497
+ * A single radio button with its label, for one mutually-exclusive choice within a group.
1498
+ * ## When to use
1499
+ * - One option within a set of mutually-exclusive choices, where all options should stay visible
1500
+ * (a radio group).
1501
+ * ## When not to use
1502
+ * - An independent, non-exclusive binary choice, or one item in a set of independent choices --
1503
+ * use `bs-checkbox` instead.
1504
+ * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
1505
+ */
1506
+ interface BsRadio {
1507
+ /**
1508
+ * Whether the radio is checked. Mutable so clicking the label/input sets it directly.
1509
+ * @default false
1510
+ */
1511
+ "checked": boolean;
1512
+ /**
1513
+ * Disables the radio: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents toggling.
1514
+ * @default false
1515
+ */
1516
+ "disabled": boolean;
1517
+ /**
1518
+ * The native radio input's `name` attribute. Passed straight through to the native input inside. NOTE: because each `bs-radio` renders its own shadow root, native `<input type="radio">` mutual-exclusion grouping (which the HTML spec scopes to a single DOM tree) does NOT extend across separate `bs-radio` instances sharing the same `name` -- checking one will not natively uncheck another. Within a single instance this still behaves like a normal radio input. See bs-radio.mdx's Accessibility section for this known gap; consumers building a group currently need to manage mutual exclusivity themselves (e.g. via `bsChange`) until a `bs-radio-group` wrapper exists.
1519
+ */
1520
+ "name": string;
1521
+ /**
1522
+ * The native radio input's `value` attribute -- read from `event.target.value`, or used when wiring the group up to a form.
1523
+ */
1524
+ "value": string;
1525
+ }
1526
+ /**
1527
+ * A slider for picking a single numeric value (`type="default"`), a value snapped to evenly
1528
+ * spaced ticks (`type="segmented"`), or a min/max pair (`type="range"`) from within a bounded
1529
+ * `min`/`max` range.
1530
+ * ## When to use
1531
+ * - A numeric value that's easiest to reason about relative to its bounds (volume, brightness,
1532
+ * a price range) rather than typed digit-by-digit.
1533
+ * - `type="segmented"` when only a fixed number of discrete stops make sense (e.g. a 5-star
1534
+ * rating-like scale) but a visual track is still preferable to discrete buttons.
1535
+ * - `type="range"` for picking a min/max pair (e.g. a price range filter) with two thumbs.
1536
+ * ## When not to use
1537
+ * - A precise value where mis-dragging by a pixel matters more than the at-a-glance bounds --
1538
+ * use `bs-input[type="number"]` instead.
1539
+ * - A small, fixed set of mutually exclusive choices -- use a radio group instead.
1540
+ */
1541
+ interface BsSlider {
1542
+ /**
1543
+ * Accessible name for the slider's native range input(s). Required whenever `showLabel` is `false` (a bare track with no visible "Label" text) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-slider>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser. Same pattern/reasoning as `bs-switch`'s and `bs-checkbox`'s identical `ariaLabel` prop. For `type="range"`, this labels the lower-bound thumb; the upper-bound thumb gets `"${ariaLabel} end"` (or `"End value"` when `ariaLabel` is unset).
1544
+ * @default null
1545
+ */
1546
+ "ariaLabel": string | null;
1547
+ /**
1548
+ * Disables the slider: sets the native `disabled` attribute on the range input(s), suppresses hover/focus/drag styling and the value tooltip, and prevents interaction.
1549
+ * @default false
1550
+ */
1551
+ "disabled": boolean;
1552
+ /**
1553
+ * Label text shown above the track when `showLabel` is set.
1554
+ * @default 'Label'
1555
+ */
1556
+ "label": string;
1557
+ /**
1558
+ * Maximum selectable value, for all `type`s.
1559
+ * @default 100
1560
+ */
1561
+ "max": number;
1562
+ /**
1563
+ * Minimum selectable value, for all `type`s.
1564
+ * @default 0
1565
+ */
1566
+ "min": number;
1567
+ /**
1568
+ * Number of equal divisions marked by tick lines along the track, for `type="segmented"` only. The first tick (at the very start of the track) is rendered with `opacity: 0` to keep the tick spacing math consistent while not visually doubling up with the track's own start edge -- this matches the design spec, not a bug.
1569
+ * @default 10
1570
+ */
1571
+ "segments": number;
1572
+ /**
1573
+ * Shows/hides the "Label" text and editable percentage field(s) above the track, and the static min/max bound labels flanking it. When `false`, only the bare track (and its knob/knobs) renders.
1574
+ * @default true
1575
+ */
1576
+ "showLabel": boolean;
1577
+ /**
1578
+ * Step size between selectable values. For `type="segmented"`, the effective step is derived from `(max - min) / segments` instead, so the thumb always snaps to a tick.
1579
+ * @default 1
1580
+ */
1581
+ "step": number;
1582
+ /**
1583
+ * Which slider shape to render. `range` uses two thumbs (`valueStart`/`valueEnd`); `default` and `segmented` use one thumb (`value`). `segmented` additionally draws `segments` tick marks along the track.
1584
+ * @default 'default'
1585
+ */
1586
+ "type": BsSliderType;
1587
+ /**
1588
+ * Current value for `type="default"`/`type="segmented"`. Ignored for `type="range"` -- use `valueStart`/`valueEnd` instead. Mutable so dragging the thumb updates it directly.
1589
+ * @default 0
1590
+ */
1591
+ "value": number;
1592
+ /**
1593
+ * Upper thumb's value for `type="range"`. Defaults to `max` when unset. Mutable so dragging the thumb updates it directly.
1594
+ */
1595
+ "valueEnd"?: number;
1596
+ /**
1597
+ * Lower thumb's value for `type="range"`. Defaults to `min` when unset. Mutable so dragging the thumb updates it directly.
1598
+ */
1599
+ "valueStart"?: number;
1600
+ }
1601
+ /**
1602
+ * A transient status bar for confirming the result of an action (e.g. "Files uploaded
1603
+ * successfully.") -- an icon (or loading spinner), a message, an optional action, and a close
1604
+ * button.
1605
+ * This component only renders the bar itself -- it doesn't manage its own visibility, timing, or
1606
+ * stacking. A consumer (typically a small "toast manager" utility) creates one per message and
1607
+ * removes it from the DOM again, whether on a timer or on `bsDismiss`. Figma's spec doesn't show
1608
+ * auto-dismiss timing at all (it's a static visual spec), so this deliberately doesn't invent one.
1609
+ * The icon is always the same checkmark glyph across every `variant`, just recolored -- matching
1610
+ * the Figma spec exactly, even though a checkmark for `variant="error"` reads a little oddly
1611
+ * semantically. Worth revisiting with severity-specific icons (warning triangle, error circle,
1612
+ * etc.) if the design updates to specify them.
1613
+ * ## When to use
1614
+ * - Confirming the outcome of an action that just happened (save succeeded, upload failed) without
1615
+ * interrupting the user's flow.
1616
+ * ## When not to use
1617
+ * - For a response that requires the user to make a decision before continuing -- use `bs-dialog`.
1618
+ * - For persistent, always-visible status -- a snackbar is inherently transient.
1619
+ */
1620
+ interface BsSnackbar {
1621
+ /**
1622
+ * Label for the optional action button (e.g. "Undo", "Retry"). Omit this prop entirely to render no action button at all -- its presence, not a boolean flag, is what shows it.
1623
+ */
1624
+ "actionLabel"?: string;
1625
+ /**
1626
+ * Replaces the checkmark icon with a spinning loading indicator, for a message describing in-progress work (e.g. "Uploading files...") rather than a completed result.
1627
+ * @default false
1628
+ */
1629
+ "loading": boolean;
1630
+ /**
1631
+ * Color/semantic variant. `default` is the neutral (dark, inverse-surface) bar Figma shows as the baseline; `info`/`warning`/`success`/`error` use their matching container/text tokens.
1632
+ * @default 'default'
1633
+ */
1634
+ "variant": BsSnackbarVariant;
920
1635
  }
921
1636
  /**
922
1637
  * A single citation row inside `bs-chatbot-sources-drawer` -- a file icon + filename on the first
@@ -956,16 +1671,117 @@ export namespace Components {
956
1671
  /**
957
1672
  * The system/app the document came from (e.g. "HoltePortalen").
958
1673
  */
959
- "sourceName"?: string;
1674
+ "sourceName"?: string;
1675
+ /**
1676
+ * `target` used when `href` is set.
1677
+ * @default '_blank'
1678
+ */
1679
+ "target": string;
1680
+ /**
1681
+ * The document's version label (e.g. "v3.2"). Omit if the source has no version.
1682
+ */
1683
+ "version"?: string;
1684
+ }
1685
+ /**
1686
+ * A toggle switch for an on/off setting that takes effect immediately (no explicit form
1687
+ * submission required).
1688
+ * ## When to use
1689
+ * - A binary setting that applies right away (e.g. "Enable notifications", "Dark mode").
1690
+ * ## When not to use
1691
+ * - A binary choice that's part of a form submitted later, or one item within a group of
1692
+ * independent choices -- use `bs-checkbox` instead.
1693
+ * - A single mutually-exclusive choice from a set -- use a radio group instead.
1694
+ */
1695
+ interface BsSwitch {
1696
+ /**
1697
+ * Accessible name for the switch. Required whenever the default (label) slot is empty (e.g. a bare "enabled" switch in a table row) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-switch>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser, so the actual focusable element (the native `<input>` inside) stays nameless. This prop exists specifically to bridge that gap -- same pattern as `bs-button`'s and `bs-checkbox`'s identical `ariaLabel` prop, both of which explicitly bind it onto their own internal focusable element for the same reason.
1698
+ * @default null
1699
+ */
1700
+ "ariaLabel": string | null;
1701
+ /**
1702
+ * Whether the switch is on. Mutable so clicking the label/input toggles it directly, and reflected so consumers can target `bs-switch[checked]` via CSS.
1703
+ * @default false
1704
+ */
1705
+ "checked": boolean;
1706
+ /**
1707
+ * Disables the switch: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents toggling.
1708
+ * @default false
1709
+ */
1710
+ "disabled": boolean;
1711
+ /**
1712
+ * Sizing scale. Controls the track's width/height and the knob's diameter.
1713
+ * @default 'lg'
1714
+ */
1715
+ "size": BsSwitchSize;
1716
+ }
1717
+ /**
1718
+ * A single tab button -- an optional icon plus a text label, rendered as a real `<button>` so it
1719
+ * participates correctly in tab order and native click/keyboard activation.
1720
+ * ## When to use
1721
+ * - As one button within a tab bar, where exactly one tab is selected/active at a time.
1722
+ * ## When not to use
1723
+ * - As a standalone action button -- use `bs-button` instead, `bs-tab`'s visual language (muted
1724
+ * until selected/hovered, underline indicator) only makes sense as part of a set.
1725
+ * `selected` is NOT self-toggling -- clicking a `bs-tab` only emits `bsSelect`, it does not set its
1726
+ * own `selected` prop, and it does not unselect any sibling tabs. Wrap your `<bs-tab>` elements in
1727
+ * `<bs-tabs type="bs-tab">` -- it owns `role="tablist"` and coordinates selection (listening for
1728
+ * `bsSelect` and setting `selected`/`false` across siblings) for you. Using `bs-tab` standalone,
1729
+ * outside a `<bs-tabs>` wrapper, still means `selected` doesn't self-toggle and `role="tablist"`
1730
+ * isn't provided automatically -- a consumer doing that would still need to coordinate `selected`
1731
+ * and supply `role="tablist"` manually, same as `bs-radio.mdx` documents for `bs-radio`'s missing
1732
+ * `bs-radio-group`. See `bs-tab.mdx`'s Accessibility section for the full requirement, including
1733
+ * `role="tabpanel"` on the corresponding content panels.
1734
+ */
1735
+ interface BsTab {
1736
+ /**
1737
+ * Accessible name for the tab. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the tab does -- without it, an icon-only tab has no discernible name at all (axe-core flags this as a critical `button-name` violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically, same as `bs-button`'s identical prop.
1738
+ * @default null
1739
+ */
1740
+ "ariaLabel": string | null;
1741
+ /**
1742
+ * Disables the tab: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents clicking from emitting `bsSelect`.
1743
+ * @default false
1744
+ */
1745
+ "disabled": boolean;
1746
+ /**
1747
+ * Where the icon sits relative to the label, when both `icon` and the default slot are populated. Ignored for icon-only/text-only layouts.
1748
+ * @default 'start'
1749
+ */
1750
+ "iconPosition": BsTabIconPosition;
1751
+ /**
1752
+ * Whether this tab is the currently active one. NOT mutable and NOT self-toggling -- see the "Known gap" note in the class JSDoc. Still reflected as an attribute so consumers/CSS can target `bs-tab[selected]`.
1753
+ * @default false
1754
+ */
1755
+ "selected": boolean;
1756
+ }
1757
+ /**
1758
+ * A tab-group wrapper: owns `role="tablist"` and coordinates selection across its slotted
1759
+ * `<bs-tab>` or `<bs-inline-tab>` children, so consumers no longer have to hand-roll this.
1760
+ * `bs-tab.mdx`/`bs-inline-tab.mdx` previously documented this coordination -- listening for
1761
+ * `bsSelect` and setting `selected`/`false` on siblings, plus supplying `role="tablist"` on
1762
+ * whatever element groups the tabs -- as a "Known gap"/manual consumer responsibility. This
1763
+ * component is that wrapper: it renders the `role="tablist"` element and listens for `bsSelect`
1764
+ * itself. Using `<bs-tab>`/`<bs-inline-tab>` standalone, outside a `<bs-tabs>` wrapper, still means
1765
+ * `selected` doesn't self-toggle -- a consumer doing that would still need to coordinate `selected`
1766
+ * manually -- but that's no longer the first recommended path.
1767
+ * ## When to use
1768
+ * - Wrapping a set of `<bs-tab>` (underline style) or `<bs-inline-tab>` (pill style) elements that
1769
+ * should behave as a single-selection tab bar.
1770
+ * ## When not to use
1771
+ * - For a single, standalone tab button not participating in a group -- use `bs-tab`/`bs-inline-tab`
1772
+ * directly.
1773
+ */
1774
+ interface BsTabs {
960
1775
  /**
961
- * `target` used when `href` is set.
962
- * @default '_blank'
1776
+ * Layout direction of the tab bar itself. Sets `aria-orientation` on the internal wrapper and switches `flex-direction`.
1777
+ * @default 'horizontal'
963
1778
  */
964
- "target": string;
1779
+ "orientation": BsTabsOrientation;
965
1780
  /**
966
- * The document's version label (e.g. "v3.2"). Omit if the source has no version.
1781
+ * Which tab-button family this group wraps. Governs the wrapper's own visual treatment (gap-only for `bs-tab`, a filled pill bar for `bs-inline-tab`). Not reflected as an attribute -- nothing external needs to target it via CSS attribute selector, it only drives internal class names.
1782
+ * @default 'bs-tab'
967
1783
  */
968
- "version"?: string;
1784
+ "type": BsTabsType;
969
1785
  }
970
1786
  /**
971
1787
  * A dark tooltip bubble with a pointer arrow, used to surface a short hint of extra information
@@ -1042,6 +1858,14 @@ export interface BsDataTableCustomEvent<T> extends CustomEvent<T> {
1042
1858
  detail: T;
1043
1859
  target: HTMLBsDataTableElement;
1044
1860
  }
1861
+ export interface BsDialogCustomEvent<T> extends CustomEvent<T> {
1862
+ detail: T;
1863
+ target: HTMLBsDialogElement;
1864
+ }
1865
+ export interface BsInlineTabCustomEvent<T> extends CustomEvent<T> {
1866
+ detail: T;
1867
+ target: HTMLBsInlineTabElement;
1868
+ }
1045
1869
  export interface BsInputCustomEvent<T> extends CustomEvent<T> {
1046
1870
  detail: T;
1047
1871
  target: HTMLBsInputElement;
@@ -1050,14 +1874,42 @@ export interface BsMenuItemCustomEvent<T> extends CustomEvent<T> {
1050
1874
  detail: T;
1051
1875
  target: HTMLBsMenuItemElement;
1052
1876
  }
1053
- export interface BsModalCustomEvent<T> extends CustomEvent<T> {
1877
+ export interface BsNavigationDrawerCustomEvent<T> extends CustomEvent<T> {
1054
1878
  detail: T;
1055
- target: HTMLBsModalElement;
1879
+ target: HTMLBsNavigationDrawerElement;
1880
+ }
1881
+ export interface BsNavigationDrawerItemCustomEvent<T> extends CustomEvent<T> {
1882
+ detail: T;
1883
+ target: HTMLBsNavigationDrawerItemElement;
1884
+ }
1885
+ export interface BsPaginationCustomEvent<T> extends CustomEvent<T> {
1886
+ detail: T;
1887
+ target: HTMLBsPaginationElement;
1888
+ }
1889
+ export interface BsRadioCustomEvent<T> extends CustomEvent<T> {
1890
+ detail: T;
1891
+ target: HTMLBsRadioElement;
1892
+ }
1893
+ export interface BsSliderCustomEvent<T> extends CustomEvent<T> {
1894
+ detail: T;
1895
+ target: HTMLBsSliderElement;
1896
+ }
1897
+ export interface BsSnackbarCustomEvent<T> extends CustomEvent<T> {
1898
+ detail: T;
1899
+ target: HTMLBsSnackbarElement;
1056
1900
  }
1057
1901
  export interface BsSourceLinkCustomEvent<T> extends CustomEvent<T> {
1058
1902
  detail: T;
1059
1903
  target: HTMLBsSourceLinkElement;
1060
1904
  }
1905
+ export interface BsSwitchCustomEvent<T> extends CustomEvent<T> {
1906
+ detail: T;
1907
+ target: HTMLBsSwitchElement;
1908
+ }
1909
+ export interface BsTabCustomEvent<T> extends CustomEvent<T> {
1910
+ detail: T;
1911
+ target: HTMLBsTabElement;
1912
+ }
1061
1913
  declare global {
1062
1914
  /**
1063
1915
  * A centered caption disclaimer for Genie AI surfaces, e.g. "AI can make mistakes. Please verify
@@ -1148,7 +2000,9 @@ declare global {
1148
2000
  /**
1149
2001
  * A single file attachment preview for `bs-composer` -- an image thumbnail, or a filename card
1150
2002
  * with a colored file-type badge (PDF/Document), with an optional upload-in-progress spinner and
1151
- * a hover/focus-revealed remove button.
2003
+ * a hover/focus-revealed remove button (a `bs-icon-button` with `size="xs"` `variant="neutral"` --
2004
+ * the same 16x16px compact tier `bs-icon-button` documents as meant for exactly this kind of
2005
+ * chip/tag "remove" control).
1152
2006
  * ## When to use
1153
2007
  * - Rendered by the consuming app for each file a user has attached to a Genie AI chat message,
1154
2008
  * typically alongside or inside `bs-composer`.
@@ -1165,14 +2019,6 @@ declare global {
1165
2019
  * @prop --bs-attachment-badge-bg-pdf - PDF badge background. Aliased to `--bs-badge-bg-error`.
1166
2020
  * @prop --bs-attachment-badge-bg-document - Document badge background. Aliased to
1167
2021
  * `--bs-badge-bg-info`.
1168
- * @prop --bs-attachment-remove-bg - Remove button (neutral icon button) default background.
1169
- * Aliased to `--bs-button-neutral-container`.
1170
- * @prop --bs-attachment-remove-hover - Remove button hover background. Aliased to
1171
- * `--bs-button-neutral-hover`.
1172
- * @prop --bs-attachment-remove-pressed - Remove button active/pressed background. Aliased to
1173
- * `--bs-button-neutral-pressed`.
1174
- * @prop --bs-attachment-remove-focus - Remove button focus outline color. Aliased to
1175
- * `--bs-border-neutral-focus`.
1176
2022
  */
1177
2023
  interface HTMLBsAttachmentElement extends Components.BsAttachment, HTMLStencilElement {
1178
2024
  addEventListener<K extends keyof HTMLBsAttachmentElementEventMap>(type: K, listener: (this: HTMLBsAttachmentElement, ev: BsAttachmentCustomEvent<HTMLBsAttachmentElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
@@ -1214,6 +2060,31 @@ declare global {
1214
2060
  prototype: HTMLBsAttachmentListElement;
1215
2061
  new (): HTMLBsAttachmentListElement;
1216
2062
  };
2063
+ /**
2064
+ * A circular representation of a person or entity -- a photo, initials, or (as a fallback when
2065
+ * neither is available) a generic user-silhouette icon.
2066
+ * ## When to use
2067
+ * - Representing a specific user or account: in a header, a comment, a member list, etc.
2068
+ * - `type="initials"` when a photo isn't available but a name is (e.g. "Sam Lee" -> "SL").
2069
+ * - `type="icon"` (the default) as the generic fallback when neither a photo nor a name/initials
2070
+ * is available yet.
2071
+ * ## When not to use
2072
+ * - A company/brand logo -- use `bs-logo` instead.
2073
+ * This component is decorative/informational by default, not an interactive control -- it renders
2074
+ * a plain `<span>`/`<img>`, not a `<button>`. Figma's own component set includes hover/focused/
2075
+ * pressed states (e.g. for an account-switcher trigger use case), which this implements as real
2076
+ * `:hover`/`:focus-visible`/`:active` CSS on the host itself -- so wrapping this in your own
2077
+ * `<button>`, or setting `tabindex` and a click handler on the `<bs-avatar>` element directly, gets
2078
+ * the matching visual treatment for free with no extra wiring. Left genuinely non-interactive
2079
+ * (no implicit role/tabindex of its own) so it doesn't misrepresent a purely decorative avatar
2080
+ * (e.g. next to a comment) as a control when it isn't one.
2081
+ */
2082
+ interface HTMLBsAvatarElement extends Components.BsAvatar, HTMLStencilElement {
2083
+ }
2084
+ var HTMLBsAvatarElement: {
2085
+ prototype: HTMLBsAvatarElement;
2086
+ new (): HTMLBsAvatarElement;
2087
+ };
1217
2088
  /**
1218
2089
  * A small status or category pill, usually paired with a label or list item.
1219
2090
  * ## When to use
@@ -1229,6 +2100,82 @@ declare global {
1229
2100
  prototype: HTMLBsBadgeElement;
1230
2101
  new (): HTMLBsBadgeElement;
1231
2102
  };
2103
+ /**
2104
+ * A single crumb within a `<bs-breadcrumbs>` trail: a leading separator icon plus either a link,
2105
+ * plain text, or the current-page label, depending on `current`/`href`.
2106
+ * Rendering follows the W3C ARIA Authoring Practices breadcrumb pattern
2107
+ * (https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/): the current page is marked
2108
+ * `aria-current="page"` and is never a link -- this holds even when `href` is also set, unlike
2109
+ * Carbon Design System's `cds-breadcrumb-item`, which allows a link on the current item.
2110
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
2111
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
2112
+ * accessibility tree needs this explicit role to preserve the list's semantics.
2113
+ * ## When to use
2114
+ * - As one crumb inside a `<bs-breadcrumbs>` trail.
2115
+ * ## When not to use
2116
+ * - Standalone, outside a `<bs-breadcrumbs>` wrapper -- its `<ol>`/`<nav>` context and
2117
+ * first-child-aware separator hiding depend on that parent structure.
2118
+ */
2119
+ interface HTMLBsBreadcrumbElement extends Components.BsBreadcrumb, HTMLStencilElement {
2120
+ }
2121
+ var HTMLBsBreadcrumbElement: {
2122
+ prototype: HTMLBsBreadcrumbElement;
2123
+ new (): HTMLBsBreadcrumbElement;
2124
+ };
2125
+ /**
2126
+ * A manually-placed collapsed-items disclosure for a `<bs-breadcrumbs>` trail: a leading separator
2127
+ * plus an icon-only ellipsis button that reveals a `bs-menu` popup listing every hidden crumb.
2128
+ * `items` is JS-property-only -- must be set as a JS property (`el.items = [...]`), not an HTML
2129
+ * attribute, since attributes can only carry strings. See CONVENTIONS.md.
2130
+ * Unlike an earlier `bs-breadcrumbs`-owned automatic `maxItems` collapse, this component does no
2131
+ * collapsing logic itself -- the consumer decides which crumbs to hide and places this element
2132
+ * wherever they want the disclosure, exactly matching Carbon Design System's own approach (Carbon
2133
+ * doesn't auto-collapse breadcrumbs either; a consumer there manually decides what's visible).
2134
+ * Hidden items with an `href` render as real `<a href>` rows inside the popup, not `bs-menu-item`
2135
+ * (which renders a `<button>`) -- this matters because consuming apps commonly use client-side
2136
+ * routers that intercept clicks on real `<a>` tags to do `preventDefault` + push-state navigation.
2137
+ * Rendering hidden links any other way (e.g. `window.location`) would silently break client-side
2138
+ * routing for hidden crumbs while working fine for visible ones. Hidden items without an `href`
2139
+ * render as plain non-interactive text, matching how `bs-breadcrumb` itself handles link vs.
2140
+ * no-link crumbs.
2141
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
2142
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
2143
+ * accessibility tree needs this explicit role to preserve the list's semantics.
2144
+ * ## When to use
2145
+ * - Inside a `<bs-breadcrumbs>` trail, wherever the consumer wants an interactive disclosure for
2146
+ * crumbs they've chosen not to render directly.
2147
+ * ## When not to use
2148
+ * - As an automatic collapsing mechanism -- there is none; the consumer decides what's hidden.
2149
+ */
2150
+ interface HTMLBsBreadcrumbOverflowElement extends Components.BsBreadcrumbOverflow, HTMLStencilElement {
2151
+ }
2152
+ var HTMLBsBreadcrumbOverflowElement: {
2153
+ prototype: HTMLBsBreadcrumbOverflowElement;
2154
+ new (): HTMLBsBreadcrumbOverflowElement;
2155
+ };
2156
+ /**
2157
+ * A breadcrumb trail container: a real `<nav>` landmark wrapping an `<ol>`, meant to be populated
2158
+ * with slotted `<bs-breadcrumb>` (and, where the consumer wants a collapsed-items disclosure,
2159
+ * `<bs-breadcrumb-overflow>`) children -- same composition-over-configuration architecture as
2160
+ * Carbon Design System's `cds-breadcrumb`/`cds-breadcrumb-item`/`cds-breadcrumb-link`.
2161
+ * This component is intentionally thin: it owns only the `<nav>` landmark and list semantics.
2162
+ * Unlike an earlier `items`-array-driven design, there is no automatic collapsing here -- exactly
2163
+ * like Carbon, the consumer decides what's visible and manually places a `<bs-breadcrumb-overflow>`
2164
+ * wherever they want a collapsed-items disclosure. See `bs-breadcrumbs.mdx` for the consolidated
2165
+ * docs covering all three components in this feature area.
2166
+ * ## When to use
2167
+ * - Showing a user's current location within a hierarchical page structure, with a path back to
2168
+ * its ancestors.
2169
+ * ## When not to use
2170
+ * - Primary in-app navigation -- use `bs-navigation-drawer`/`bs-navigation-header` instead.
2171
+ * - A flat set of unrelated pages with no hierarchy -- breadcrumbs imply ancestry, not just history.
2172
+ */
2173
+ interface HTMLBsBreadcrumbsElement extends Components.BsBreadcrumbs, HTMLStencilElement {
2174
+ }
2175
+ var HTMLBsBreadcrumbsElement: {
2176
+ prototype: HTMLBsBreadcrumbsElement;
2177
+ new (): HTMLBsBreadcrumbsElement;
2178
+ };
1232
2179
  /**
1233
2180
  * A clickable action element for the single most important action in a given context.
1234
2181
  * ## When to use
@@ -1248,6 +2195,11 @@ declare global {
1248
2195
  * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
1249
2196
  * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
1250
2197
  * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
2198
+ * @prop --bs-button-neutral-border - Border color, `variant="neutral"`, default/disabled. Aliased to `--bs-border-neutral-container`.
2199
+ * @prop --bs-button-neutral-border-hover - Border color, `variant="neutral"`, hover. Aliased to `--bs-border-neutral-container-hover`.
2200
+ * @prop --bs-button-neutral-border-pressed - Border color, `variant="neutral"`, pressed. Aliased to `--bs-border-neutral-container-pressed`.
2201
+ * @prop --bs-button-padding-x-icon-side - Horizontal padding on an edge that's adjacent to a leading/trailing icon (tighter than the plain text-only edge). Aliased to `--bs-spacing-150`.
2202
+ * @prop --bs-button-padding-x-label-side - Horizontal padding on the opposite edge, when an icon on the other side needs compensating extra space to keep the button optically balanced. Aliased to `--bs-spacing-250`.
1251
2203
  */
1252
2204
  interface HTMLBsButtonElement extends Components.BsButton, HTMLStencilElement {
1253
2205
  }
@@ -1569,6 +2521,35 @@ declare global {
1569
2521
  prototype: HTMLBsCheckboxElement;
1570
2522
  new (): HTMLBsCheckboxElement;
1571
2523
  };
2524
+ /**
2525
+ * A shape-matched loading placeholder for `bs-checkbox`, shown while the real label text isn't
2526
+ * known yet (e.g. still being fetched from an API). Renders a small square (matching the
2527
+ * checkbox's own box) beside a text-bar placeholder (standing in for the label), both pulsing
2528
+ * together, sized to match `bs-checkbox`'s `sm`/`md`/`lg` box dimensions so layout doesn't shift
2529
+ * once the real checkbox renders.
2530
+ * ## When to use
2531
+ * - In place of a `bs-checkbox` whose label/checked state depends on data that hasn't loaded yet.
2532
+ * ## When not to use
2533
+ * - While a checkbox's own change handler is running (e.g. a save request in flight) -- render the
2534
+ * real `bs-checkbox` itself; this component is not a saving-in-progress spinner.
2535
+ * @prop --bs-checkbox-skeleton-size-sm - Box width/height at `size="sm"`. Aliased to
2536
+ * `--bs-spacing-200`, mirroring `bs-checkbox`'s own `--bs-checkbox-size-sm` -- not read directly
2537
+ * from it, since these are two separate shadow roots.
2538
+ * @prop --bs-checkbox-skeleton-size-md - Box width/height at `size="md"`. Aliased to
2539
+ * `--bs-spacing-250`.
2540
+ * @prop --bs-checkbox-skeleton-size-lg - Box width/height at `size="lg"`. Aliased to
2541
+ * `--bs-spacing-300`.
2542
+ * @prop --bs-checkbox-skeleton-gap - Gap between the box and label placeholders. Aliased to
2543
+ * `--bs-spacing-100`, mirroring `bs-checkbox`'s own `--bs-checkbox-gap`.
2544
+ * @prop --bs-checkbox-skeleton-label-width - Width of the label placeholder bar. Defaults to
2545
+ * `96px`.
2546
+ */
2547
+ interface HTMLBsCheckboxSkeletonElement extends Components.BsCheckboxSkeleton, HTMLStencilElement {
2548
+ }
2549
+ var HTMLBsCheckboxSkeletonElement: {
2550
+ prototype: HTMLBsCheckboxSkeletonElement;
2551
+ new (): HTMLBsCheckboxSkeletonElement;
2552
+ };
1572
2553
  interface HTMLBsComposerElementEventMap {
1573
2554
  "bsInput": string;
1574
2555
  "bsSubmit": void;
@@ -1608,6 +2589,7 @@ declare global {
1608
2589
  * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
1609
2590
  * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
1610
2591
  * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
2592
+ * @prop --bs-composer-input-max-lines - How many lines the text field grows to before scrolling internally instead of growing further. Aliased to `10`.
1611
2593
  */
1612
2594
  interface HTMLBsComposerElement extends Components.BsComposer, HTMLStencilElement {
1613
2595
  addEventListener<K extends keyof HTMLBsComposerElementEventMap>(type: K, listener: (this: HTMLBsComposerElement, ev: BsComposerCustomEvent<HTMLBsComposerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
@@ -1638,6 +2620,12 @@ declare global {
1638
2620
  * ## When not to use
1639
2621
  * - A toast/snackbar notification unrelated to the composer -- this component is not
1640
2622
  * self-dismissing and has no positioning of its own (it's a static block, not an overlay).
2623
+ * ## Accessibility
2624
+ * Sets `role="status"` for `type="info"`/`type="neutral"` and `role="alert"` for
2625
+ * `type="error"`/`type="warning"` on its own root element automatically -- no opt-in prop needed.
2626
+ * Both roles carry implicit ARIA live-region semantics (`status` is polite, `alert` is assertive),
2627
+ * so a screen reader announces the message as soon as this banner is inserted into the DOM,
2628
+ * without a consumer having to remember to add `role`/`aria-live` themselves.
1641
2629
  * @prop --bs-composer-status-banner-radius - Corner radius of the top-left/top-right corners
1642
2630
  * (bottom corners are square, so this sits flush above `bs-composer`). Aliased to
1643
2631
  * `--bs-border-radius-150`.
@@ -1727,6 +2715,103 @@ declare global {
1727
2715
  prototype: HTMLBsDataTableElement;
1728
2716
  new (): HTMLBsDataTableElement;
1729
2717
  };
2718
+ interface HTMLBsDialogElementEventMap {
2719
+ "bsClose": void;
2720
+ }
2721
+ /**
2722
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
2723
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
2724
+ * ## When to use
2725
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
2726
+ * - A short, focused task that doesn't warrant navigating to a new page.
2727
+ * ## When not to use
2728
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
2729
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
2730
+ * dialog that just gets taller and taller.
2731
+ * Two additional slots cover the Figma "Dialog" component's other states: `image` (a hero image
2732
+ * across the top, close button floats over it instead of sitting in the header row) and `icon`
2733
+ * (only rendered when `centered` is set, e.g. a success checkmark above a centered heading). The
2734
+ * close button "floats" (absolute-positioned, top-right of the dialog, with its own background)
2735
+ * whenever `centered` is true or the `image` slot has content -- otherwise it's the plain inline
2736
+ * button in the header row next to the heading, same as before this addition.
2737
+ */
2738
+ interface HTMLBsDialogElement extends Components.BsDialog, HTMLStencilElement {
2739
+ addEventListener<K extends keyof HTMLBsDialogElementEventMap>(type: K, listener: (this: HTMLBsDialogElement, ev: BsDialogCustomEvent<HTMLBsDialogElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2740
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2741
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2742
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2743
+ removeEventListener<K extends keyof HTMLBsDialogElementEventMap>(type: K, listener: (this: HTMLBsDialogElement, ev: BsDialogCustomEvent<HTMLBsDialogElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2744
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2745
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2746
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2747
+ }
2748
+ var HTMLBsDialogElement: {
2749
+ prototype: HTMLBsDialogElement;
2750
+ new (): HTMLBsDialogElement;
2751
+ };
2752
+ /**
2753
+ * A clickable, icon-only action element -- the icon-only sibling of `bs-button`, sharing the same
2754
+ * 8 visual variants and color language, but ALWAYS rendering just a single icon, never a label.
2755
+ * ## When to use
2756
+ * - A compact action where the icon alone is unambiguous (e.g. a close/dismiss control, a toolbar
2757
+ * action) and adding a text label would take up more space than the context allows.
2758
+ * - The same variant guidance as `bs-button` applies: `primary` for the single most important
2759
+ * action, `neutral`/`subtle`/`outlined` for lower-emphasis alternatives, `error` reserved for
2760
+ * destructive/irreversible actions (never `neutral`, per BrandSync guidance), `success`/
2761
+ * `warning`/`info` only when the action's own outcome is predictable and clearly communicated.
2762
+ * ## When not to use
2763
+ * - When the action isn't self-evident from the icon alone -- use `bs-button` with a visible label
2764
+ * instead, don't rely on a tooltip to compensate for an unclear icon.
2765
+ * - For navigation between pages -- use a link/nav component instead.
2766
+ * Because this component is always icon-only, `ariaLabel` is required for every real usage (not
2767
+ * just conditionally, unlike `bs-button`) -- there's no visible label text to fall back on for an
2768
+ * accessible name.
2769
+ */
2770
+ interface HTMLBsIconButtonElement extends Components.BsIconButton, HTMLStencilElement {
2771
+ }
2772
+ var HTMLBsIconButtonElement: {
2773
+ prototype: HTMLBsIconButtonElement;
2774
+ new (): HTMLBsIconButtonElement;
2775
+ };
2776
+ interface HTMLBsInlineTabElementEventMap {
2777
+ "bsSelect": void;
2778
+ }
2779
+ /**
2780
+ * A pill-shaped tab button -- an optional leading icon plus a text label, rendered as a real
2781
+ * `<button>` so it participates correctly in tab order and native click/keyboard activation.
2782
+ * Unlike `bs-tab`'s underline indicator, selection here is communicated entirely by the pill's
2783
+ * background fill color -- there is no separate indicator element.
2784
+ * ## When to use
2785
+ * - As one button within a segmented-control-style tab bar, where exactly one tab is
2786
+ * selected/active at a time.
2787
+ * ## When not to use
2788
+ * - As a standalone action button -- use `bs-button` instead, `bs-inline-tab`'s visual language
2789
+ * (muted pill until selected/hovered) only makes sense as part of a set.
2790
+ * `selected` is NOT self-toggling -- clicking a `bs-inline-tab` only emits `bsSelect`, it does not
2791
+ * set its own `selected` prop, and it does not unselect any sibling tabs. Wrap your
2792
+ * `<bs-inline-tab>` elements in `<bs-tabs type="bs-inline-tab">` -- it owns `role="tablist"` and
2793
+ * coordinates selection (listening for `bsSelect` and setting `selected`/`false` across siblings)
2794
+ * for you. Using `bs-inline-tab` standalone, outside a `<bs-tabs>` wrapper, still means `selected`
2795
+ * doesn't self-toggle and `role="tablist"` isn't provided automatically -- a consumer doing that
2796
+ * would still need to coordinate `selected` and supply `role="tablist"` manually, same as
2797
+ * `bs-tab.mdx`/`bs-radio.mdx` document for their own components. See `bs-inline-tab.mdx`'s
2798
+ * Accessibility section for the full requirement, including `role="tabpanel"` on the corresponding
2799
+ * content panels.
2800
+ */
2801
+ interface HTMLBsInlineTabElement extends Components.BsInlineTab, HTMLStencilElement {
2802
+ addEventListener<K extends keyof HTMLBsInlineTabElementEventMap>(type: K, listener: (this: HTMLBsInlineTabElement, ev: BsInlineTabCustomEvent<HTMLBsInlineTabElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2803
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2804
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2805
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2806
+ removeEventListener<K extends keyof HTMLBsInlineTabElementEventMap>(type: K, listener: (this: HTMLBsInlineTabElement, ev: BsInlineTabCustomEvent<HTMLBsInlineTabElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2807
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2808
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2809
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2810
+ }
2811
+ var HTMLBsInlineTabElement: {
2812
+ prototype: HTMLBsInlineTabElement;
2813
+ new (): HTMLBsInlineTabElement;
2814
+ };
1730
2815
  interface HTMLBsInputElementEventMap {
1731
2816
  "bsInput": string;
1732
2817
  "bsChange": string;
@@ -1766,6 +2851,36 @@ declare global {
1766
2851
  prototype: HTMLBsInputElement;
1767
2852
  new (): HTMLBsInputElement;
1768
2853
  };
2854
+ /**
2855
+ * The BrandSync brand mark, as its own standalone component -- shared by `bs-navigation-header`
2856
+ * and `bs-navigation-drawer`, which used to each render their own duplicated copy of this SVG
2857
+ * (the drawer's collapsed state even faked an icon-only look by clipping the full wordmark asset
2858
+ * down to a narrowed box, rather than using a real icon-only asset).
2859
+ * ## When to use
2860
+ * - Anywhere the BrandSync logo/icon needs to render: a navigation header, a nav drawer, etc.
2861
+ * ## When not to use
2862
+ * - The Genie AI chat panel's own brand mark -- that's a different logo (`bs-chatbot-header`'s
2863
+ * own inline Genie asset), not this one.
2864
+ * `variant` mirrors Figma's "Logo" component set (node 10909:30421) `Device` property
2865
+ * ("Desktop" / "Tab and mobile"), which was originally meant to distinguish the full lockup from
2866
+ * the icon-only mark at different responsive breakpoints -- renamed here to
2867
+ * `variant: 'full' | 'mark'` since that's what it actually controls (how much of the logo
2868
+ * renders), not literally a device/breakpoint switch.
2869
+ * `variant="custom"` is not a Figma variant at all -- it's an escape hatch for a consuming app
2870
+ * that needs to show a DIFFERENT product's logo in the same slot (e.g. a white-labeled deployment,
2871
+ * or a logo fetched at runtime from a service like brand.dev), via `src`/`alt`, instead of the
2872
+ * built-in BrandSync assets. This component deliberately does NOT fetch that image itself --
2873
+ * network calls, loading/error states, and caching are the consuming app's responsibility, same as
2874
+ * every other component in this library (e.g. `bs-attachment` takes `imageSrc` rather than fetching
2875
+ * an image on its own). `background` has no effect on `variant="custom"` -- a consumer's own image
2876
+ * is already designed for whatever surface it's placed on.
2877
+ */
2878
+ interface HTMLBsLogoElement extends Components.BsLogo, HTMLStencilElement {
2879
+ }
2880
+ var HTMLBsLogoElement: {
2881
+ prototype: HTMLBsLogoElement;
2882
+ new (): HTMLBsLogoElement;
2883
+ };
1769
2884
  /**
1770
2885
  * A generic dropdown/popup menu container: a rounded, elevated list of items (typically
1771
2886
  * `bs-menu-item` elements).
@@ -1826,33 +2941,256 @@ declare global {
1826
2941
  prototype: HTMLBsMenuItemElement;
1827
2942
  new (): HTMLBsMenuItemElement;
1828
2943
  };
1829
- interface HTMLBsModalElementEventMap {
1830
- "bsClose": void;
2944
+ interface HTMLBsNavigationDrawerElementEventMap {
2945
+ "bsCollapse": boolean;
2946
+ "bsSearchClick": void;
1831
2947
  }
1832
2948
  /**
1833
- * An overlay dialog that interrupts the current flow for a focused task or confirmation.
1834
- * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
2949
+ * A left-side persistent navigation sidebar: the BrandSync logo, a "Main Menu" title with a
2950
+ * collapse toggle, a reserved slot for a search field, and a scrollable list of nav items.
1835
2951
  * ## When to use
1836
- * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
1837
- * - A short, focused task that doesn't warrant navigating to a new page.
2952
+ * - The primary in-app navigation, shown alongside `bs-navigation-header` (typically that
2953
+ * header's `with-navigation-drawer` alignment, which omits its own logo since this component
2954
+ * already renders one -- or the reverse pairing, this drawer's own `showLogo={false}` alongside
2955
+ * a header that keeps its logo instead, see that prop's own docs).
1838
2956
  * ## When not to use
1839
- * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
1840
- * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
1841
- * modal that just gets taller and taller.
2957
+ * - The top navigation bar itself -- use `bs-navigation-header` instead.
2958
+ * This component renders a real `<nav>` landmark (no explicit `role` needed -- `<nav>` already
2959
+ * carries the implicit `navigation` role), labeled via `aria-label={heading}` so the landmark
2960
+ * still has a name even when collapsed (see below).
2961
+ * `collapsed` narrows the drawer to a 96px icon-only rail, per Figma node 8028:135374
2962
+ * ("Type=Collapsed"): the title text disappears, the logo swaps from the full "EG BrandSync"
2963
+ * wordmark (`bs-logo variant="full"`) to the real icon-only mark (`bs-logo variant="mark"` -- a
2964
+ * second, properly-designed asset, not a CSS crop of the full one) via CSS visibility toggling on
2965
+ * both, the same `:host([collapsed])` attribute-selector pattern already used for the
2966
+ * `search`/`search-trigger` swap below, the `search` slot is replaced by a compact built-in
2967
+ * search-trigger button (this component can't meaningfully shrink arbitrary slotted search-field
2968
+ * content down to icon size itself, so it emits `bsSearchClick` instead -- e.g. to open a full
2969
+ * search overlay), and every top-level
2970
+ * `bs-navigation-drawer-item`'s layout switches from icon-beside-label to icon-above-caption.
2971
+ * That last part is real prop propagation, not a CSS trick: this component keeps each direct-child
2972
+ * item's own `collapsed` prop in sync with its own (see `syncItemsCollapsed` below), the same
2973
+ * direct-children-prop-sync approach `bs-tabs` already uses for coordinating `selected` across its
2974
+ * `bs-tab` children. Clicking the toggle self-toggles `collapsed` (simple local UI state, not
2975
+ * something needing cross-component coordination -- closer to `bs-switch`'s self-toggling
2976
+ * `checked` than `bs-tab`'s non-self-toggling `selected`) and emits `bsCollapse` with the new
2977
+ * value. The toggle's own caret icon does NOT rotate when collapsed -- Figma's collapsed mock
2978
+ * reuses the identical left-pointing "CaretLeft" asset unchanged, confirmed by directly inspecting
2979
+ * that state, so this deliberately does not add the same "flip on toggle" idiom the drawer item's
2980
+ * own disclosure chevron does (that one really is an unconfirmed addition; this one was checked).
2981
+ */
2982
+ interface HTMLBsNavigationDrawerElement extends Components.BsNavigationDrawer, HTMLStencilElement {
2983
+ addEventListener<K extends keyof HTMLBsNavigationDrawerElementEventMap>(type: K, listener: (this: HTMLBsNavigationDrawerElement, ev: BsNavigationDrawerCustomEvent<HTMLBsNavigationDrawerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2984
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2985
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2986
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2987
+ removeEventListener<K extends keyof HTMLBsNavigationDrawerElementEventMap>(type: K, listener: (this: HTMLBsNavigationDrawerElement, ev: BsNavigationDrawerCustomEvent<HTMLBsNavigationDrawerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2988
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2989
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2990
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2991
+ }
2992
+ var HTMLBsNavigationDrawerElement: {
2993
+ prototype: HTMLBsNavigationDrawerElement;
2994
+ new (): HTMLBsNavigationDrawerElement;
2995
+ };
2996
+ interface HTMLBsNavigationDrawerItemElementEventMap {
2997
+ "bsSelect": void;
2998
+ "bsToggle": boolean;
2999
+ }
3000
+ /**
3001
+ * A single row within a `bs-navigation-drawer`'s item list -- either a plain leaf nav item, or an
3002
+ * `expandable` group header that discloses nested `bs-navigation-drawer-item` children.
3003
+ * ## When to use
3004
+ * - Every row inside a `bs-navigation-drawer`'s default slot.
3005
+ * ## When not to use
3006
+ * - A standalone action outside a navigation drawer -- use `bs-button`/`bs-menu-item` instead.
3007
+ * Click behavior is mutually exclusive, based on `expandable`:
3008
+ * - `expandable = false` (a plain leaf item): clicking only emits `bsSelect`. `selected` is NOT
3009
+ * self-toggling -- same non-self-toggling precedent as `bs-tab`'s `selected` (see `bs-tab.tsx`'s
3010
+ * class doc): coordinating which sibling row is selected needs cross-item state a
3011
+ * consumer/wrapper owns, not something this component can reason about on its own.
3012
+ * - `expandable = true` (a group header, never shown with a `selected` tint): clicking toggles
3013
+ * `this.expanded` directly and emits `bsToggle` with the new value, and does NOT emit
3014
+ * `bsSelect`. This IS self-toggling, unlike `selected` above -- it's simple local disclosure
3015
+ * state with no cross-item coordination needed, closer to `bs-switch`'s self-toggling `checked`
3016
+ * than `bs-tab`'s non-self-toggling `selected`.
3017
+ * Nesting: put child `<bs-navigation-drawer-item nested>` elements inside a parent
3018
+ * `<bs-navigation-drawer-item expandable>` with `slot="children"`. The parent shows/hides that
3019
+ * slot's content based on its own `expanded` prop, via a pure-CSS attribute selector (no JS
3020
+ * visibility toggling needed, since `expanded` is reflected).
3021
+ * `collapsed` switches this row from its normal icon-beside-label row layout to a compact
3022
+ * icon-above-caption column (per Figma node 8028:135374, the drawer's "Type=Collapsed" state) --
3023
+ * you don't need to set this yourself on every item: a parent `bs-navigation-drawer` keeps its own
3024
+ * top-level items' `collapsed` prop in sync with its own `collapsed` state automatically (see
3025
+ * `bs-navigation-drawer.tsx`'s `syncItemsCollapsed`, the same direct-children-prop-sync approach
3026
+ * `bs-tabs` uses for coordinating `selected` across its own `bs-tab` children). It's still a public
3027
+ * prop so a standalone item (or this component's own stories) can be demoed without the parent.
1842
3028
  */
1843
- interface HTMLBsModalElement extends Components.BsModal, HTMLStencilElement {
1844
- addEventListener<K extends keyof HTMLBsModalElementEventMap>(type: K, listener: (this: HTMLBsModalElement, ev: BsModalCustomEvent<HTMLBsModalElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3029
+ interface HTMLBsNavigationDrawerItemElement extends Components.BsNavigationDrawerItem, HTMLStencilElement {
3030
+ addEventListener<K extends keyof HTMLBsNavigationDrawerItemElementEventMap>(type: K, listener: (this: HTMLBsNavigationDrawerItemElement, ev: BsNavigationDrawerItemCustomEvent<HTMLBsNavigationDrawerItemElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
1845
3031
  addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1846
3032
  addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1847
3033
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1848
- removeEventListener<K extends keyof HTMLBsModalElementEventMap>(type: K, listener: (this: HTMLBsModalElement, ev: BsModalCustomEvent<HTMLBsModalElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3034
+ removeEventListener<K extends keyof HTMLBsNavigationDrawerItemElementEventMap>(type: K, listener: (this: HTMLBsNavigationDrawerItemElement, ev: BsNavigationDrawerItemCustomEvent<HTMLBsNavigationDrawerItemElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1849
3035
  removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1850
3036
  removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1851
3037
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1852
3038
  }
1853
- var HTMLBsModalElement: {
1854
- prototype: HTMLBsModalElement;
1855
- new (): HTMLBsModalElement;
3039
+ var HTMLBsNavigationDrawerItemElement: {
3040
+ prototype: HTMLBsNavigationDrawerItemElement;
3041
+ new (): HTMLBsNavigationDrawerItemElement;
3042
+ };
3043
+ /**
3044
+ * The top-level navigation bar for a page: the BrandSync logo plus two consumer-provided slots
3045
+ * for menu/action content (e.g. `bs-button`/`bs-icon-button` elements).
3046
+ * ## When to use
3047
+ * - The persistent top bar of an application, above the page content.
3048
+ * ## When not to use
3049
+ * - The header of a Genie AI chat panel -- use `bs-chatbot-header` instead, which is purpose-built
3050
+ * for that narrower layout and its own fixed action buttons.
3051
+ * `alignment` controls both whether the logo renders and how the two slots are laid out:
3052
+ * - `default` (default): logo on the left, `left` slot content immediately after it, `right` slot
3053
+ * content pushed to the far right.
3054
+ * - `center`: logo and `right` slot both grow equally (`flex: 1`), which centers the `left` slot
3055
+ * content in the middle of the bar.
3056
+ * - `with-navigation-drawer`: no logo at all (this variant assumes a nav-drawer toggle is the
3057
+ * leftmost thing on the page instead) -- `left` slot content starts at the bar's own left edge,
3058
+ * `right` slot content pushed to the far right.
3059
+ */
3060
+ interface HTMLBsNavigationHeaderElement extends Components.BsNavigationHeader, HTMLStencilElement {
3061
+ }
3062
+ var HTMLBsNavigationHeaderElement: {
3063
+ prototype: HTMLBsNavigationHeaderElement;
3064
+ new (): HTMLBsNavigationHeaderElement;
3065
+ };
3066
+ interface HTMLBsPaginationElementEventMap {
3067
+ "bsPageChange": number;
3068
+ }
3069
+ /**
3070
+ * A numbered page control -- previous/next chevrons, page-number buttons, and `...` overflow for
3071
+ * large page counts. Matches the Figma "Pagination" component's "Default" type (the classic
3072
+ * numbered pagination); its other type ("jumper" -- a rows-per-page dropdown plus a page-jump
3073
+ * input) is a structurally different composite widget and isn't covered by this component.
3074
+ * `totalPages`/`currentPage` drive everything -- this computes which page numbers to show and
3075
+ * where to collapse into `...` itself, the consumer never builds the button list by hand.
3076
+ * ## When to use
3077
+ * - Paging through a large, ordered result set (a table, a search results list) where jumping
3078
+ * directly to a specific page number is useful.
3079
+ * ## When not to use
3080
+ * - Infinite-scroll or "load more" patterns -- those don't have a fixed, addressable page number.
3081
+ * - A huge page count where users realistically only ever go forward/back one page at a time --
3082
+ * plain prev/next controls (no numbers) are simpler there.
3083
+ */
3084
+ interface HTMLBsPaginationElement extends Components.BsPagination, HTMLStencilElement {
3085
+ addEventListener<K extends keyof HTMLBsPaginationElementEventMap>(type: K, listener: (this: HTMLBsPaginationElement, ev: BsPaginationCustomEvent<HTMLBsPaginationElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3086
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3087
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3088
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3089
+ removeEventListener<K extends keyof HTMLBsPaginationElementEventMap>(type: K, listener: (this: HTMLBsPaginationElement, ev: BsPaginationCustomEvent<HTMLBsPaginationElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3090
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3091
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3092
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3093
+ }
3094
+ var HTMLBsPaginationElement: {
3095
+ prototype: HTMLBsPaginationElement;
3096
+ new (): HTMLBsPaginationElement;
3097
+ };
3098
+ interface HTMLBsRadioElementEventMap {
3099
+ "bsChange": string;
3100
+ }
3101
+ /**
3102
+ * A single radio button with its label, for one mutually-exclusive choice within a group.
3103
+ * ## When to use
3104
+ * - One option within a set of mutually-exclusive choices, where all options should stay visible
3105
+ * (a radio group).
3106
+ * ## When not to use
3107
+ * - An independent, non-exclusive binary choice, or one item in a set of independent choices --
3108
+ * use `bs-checkbox` instead.
3109
+ * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
3110
+ */
3111
+ interface HTMLBsRadioElement extends Components.BsRadio, HTMLStencilElement {
3112
+ addEventListener<K extends keyof HTMLBsRadioElementEventMap>(type: K, listener: (this: HTMLBsRadioElement, ev: BsRadioCustomEvent<HTMLBsRadioElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3113
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3114
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3115
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3116
+ removeEventListener<K extends keyof HTMLBsRadioElementEventMap>(type: K, listener: (this: HTMLBsRadioElement, ev: BsRadioCustomEvent<HTMLBsRadioElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3117
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3118
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3119
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3120
+ }
3121
+ var HTMLBsRadioElement: {
3122
+ prototype: HTMLBsRadioElement;
3123
+ new (): HTMLBsRadioElement;
3124
+ };
3125
+ interface HTMLBsSliderElementEventMap {
3126
+ "bsChange": number;
3127
+ "bsRangeChange": { start: number; end: number };
3128
+ }
3129
+ /**
3130
+ * A slider for picking a single numeric value (`type="default"`), a value snapped to evenly
3131
+ * spaced ticks (`type="segmented"`), or a min/max pair (`type="range"`) from within a bounded
3132
+ * `min`/`max` range.
3133
+ * ## When to use
3134
+ * - A numeric value that's easiest to reason about relative to its bounds (volume, brightness,
3135
+ * a price range) rather than typed digit-by-digit.
3136
+ * - `type="segmented"` when only a fixed number of discrete stops make sense (e.g. a 5-star
3137
+ * rating-like scale) but a visual track is still preferable to discrete buttons.
3138
+ * - `type="range"` for picking a min/max pair (e.g. a price range filter) with two thumbs.
3139
+ * ## When not to use
3140
+ * - A precise value where mis-dragging by a pixel matters more than the at-a-glance bounds --
3141
+ * use `bs-input[type="number"]` instead.
3142
+ * - A small, fixed set of mutually exclusive choices -- use a radio group instead.
3143
+ */
3144
+ interface HTMLBsSliderElement extends Components.BsSlider, HTMLStencilElement {
3145
+ addEventListener<K extends keyof HTMLBsSliderElementEventMap>(type: K, listener: (this: HTMLBsSliderElement, ev: BsSliderCustomEvent<HTMLBsSliderElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3146
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3147
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3148
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3149
+ removeEventListener<K extends keyof HTMLBsSliderElementEventMap>(type: K, listener: (this: HTMLBsSliderElement, ev: BsSliderCustomEvent<HTMLBsSliderElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3150
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3151
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3152
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3153
+ }
3154
+ var HTMLBsSliderElement: {
3155
+ prototype: HTMLBsSliderElement;
3156
+ new (): HTMLBsSliderElement;
3157
+ };
3158
+ interface HTMLBsSnackbarElementEventMap {
3159
+ "bsAction": void;
3160
+ "bsDismiss": void;
3161
+ }
3162
+ /**
3163
+ * A transient status bar for confirming the result of an action (e.g. "Files uploaded
3164
+ * successfully.") -- an icon (or loading spinner), a message, an optional action, and a close
3165
+ * button.
3166
+ * This component only renders the bar itself -- it doesn't manage its own visibility, timing, or
3167
+ * stacking. A consumer (typically a small "toast manager" utility) creates one per message and
3168
+ * removes it from the DOM again, whether on a timer or on `bsDismiss`. Figma's spec doesn't show
3169
+ * auto-dismiss timing at all (it's a static visual spec), so this deliberately doesn't invent one.
3170
+ * The icon is always the same checkmark glyph across every `variant`, just recolored -- matching
3171
+ * the Figma spec exactly, even though a checkmark for `variant="error"` reads a little oddly
3172
+ * semantically. Worth revisiting with severity-specific icons (warning triangle, error circle,
3173
+ * etc.) if the design updates to specify them.
3174
+ * ## When to use
3175
+ * - Confirming the outcome of an action that just happened (save succeeded, upload failed) without
3176
+ * interrupting the user's flow.
3177
+ * ## When not to use
3178
+ * - For a response that requires the user to make a decision before continuing -- use `bs-dialog`.
3179
+ * - For persistent, always-visible status -- a snackbar is inherently transient.
3180
+ */
3181
+ interface HTMLBsSnackbarElement extends Components.BsSnackbar, HTMLStencilElement {
3182
+ addEventListener<K extends keyof HTMLBsSnackbarElementEventMap>(type: K, listener: (this: HTMLBsSnackbarElement, ev: BsSnackbarCustomEvent<HTMLBsSnackbarElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3183
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3184
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3185
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3186
+ removeEventListener<K extends keyof HTMLBsSnackbarElementEventMap>(type: K, listener: (this: HTMLBsSnackbarElement, ev: BsSnackbarCustomEvent<HTMLBsSnackbarElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3187
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3188
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3189
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3190
+ }
3191
+ var HTMLBsSnackbarElement: {
3192
+ prototype: HTMLBsSnackbarElement;
3193
+ new (): HTMLBsSnackbarElement;
1856
3194
  };
1857
3195
  interface HTMLBsSourceLinkElementEventMap {
1858
3196
  "bsOpen": void;
@@ -1896,6 +3234,91 @@ declare global {
1896
3234
  prototype: HTMLBsSourceLinkElement;
1897
3235
  new (): HTMLBsSourceLinkElement;
1898
3236
  };
3237
+ interface HTMLBsSwitchElementEventMap {
3238
+ "bsChange": boolean;
3239
+ }
3240
+ /**
3241
+ * A toggle switch for an on/off setting that takes effect immediately (no explicit form
3242
+ * submission required).
3243
+ * ## When to use
3244
+ * - A binary setting that applies right away (e.g. "Enable notifications", "Dark mode").
3245
+ * ## When not to use
3246
+ * - A binary choice that's part of a form submitted later, or one item within a group of
3247
+ * independent choices -- use `bs-checkbox` instead.
3248
+ * - A single mutually-exclusive choice from a set -- use a radio group instead.
3249
+ */
3250
+ interface HTMLBsSwitchElement extends Components.BsSwitch, HTMLStencilElement {
3251
+ addEventListener<K extends keyof HTMLBsSwitchElementEventMap>(type: K, listener: (this: HTMLBsSwitchElement, ev: BsSwitchCustomEvent<HTMLBsSwitchElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3252
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3253
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3254
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3255
+ removeEventListener<K extends keyof HTMLBsSwitchElementEventMap>(type: K, listener: (this: HTMLBsSwitchElement, ev: BsSwitchCustomEvent<HTMLBsSwitchElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3256
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3257
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3258
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3259
+ }
3260
+ var HTMLBsSwitchElement: {
3261
+ prototype: HTMLBsSwitchElement;
3262
+ new (): HTMLBsSwitchElement;
3263
+ };
3264
+ interface HTMLBsTabElementEventMap {
3265
+ "bsSelect": void;
3266
+ }
3267
+ /**
3268
+ * A single tab button -- an optional icon plus a text label, rendered as a real `<button>` so it
3269
+ * participates correctly in tab order and native click/keyboard activation.
3270
+ * ## When to use
3271
+ * - As one button within a tab bar, where exactly one tab is selected/active at a time.
3272
+ * ## When not to use
3273
+ * - As a standalone action button -- use `bs-button` instead, `bs-tab`'s visual language (muted
3274
+ * until selected/hovered, underline indicator) only makes sense as part of a set.
3275
+ * `selected` is NOT self-toggling -- clicking a `bs-tab` only emits `bsSelect`, it does not set its
3276
+ * own `selected` prop, and it does not unselect any sibling tabs. Wrap your `<bs-tab>` elements in
3277
+ * `<bs-tabs type="bs-tab">` -- it owns `role="tablist"` and coordinates selection (listening for
3278
+ * `bsSelect` and setting `selected`/`false` across siblings) for you. Using `bs-tab` standalone,
3279
+ * outside a `<bs-tabs>` wrapper, still means `selected` doesn't self-toggle and `role="tablist"`
3280
+ * isn't provided automatically -- a consumer doing that would still need to coordinate `selected`
3281
+ * and supply `role="tablist"` manually, same as `bs-radio.mdx` documents for `bs-radio`'s missing
3282
+ * `bs-radio-group`. See `bs-tab.mdx`'s Accessibility section for the full requirement, including
3283
+ * `role="tabpanel"` on the corresponding content panels.
3284
+ */
3285
+ interface HTMLBsTabElement extends Components.BsTab, HTMLStencilElement {
3286
+ addEventListener<K extends keyof HTMLBsTabElementEventMap>(type: K, listener: (this: HTMLBsTabElement, ev: BsTabCustomEvent<HTMLBsTabElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3287
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3288
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
3289
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
3290
+ removeEventListener<K extends keyof HTMLBsTabElementEventMap>(type: K, listener: (this: HTMLBsTabElement, ev: BsTabCustomEvent<HTMLBsTabElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3291
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3292
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
3293
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
3294
+ }
3295
+ var HTMLBsTabElement: {
3296
+ prototype: HTMLBsTabElement;
3297
+ new (): HTMLBsTabElement;
3298
+ };
3299
+ /**
3300
+ * A tab-group wrapper: owns `role="tablist"` and coordinates selection across its slotted
3301
+ * `<bs-tab>` or `<bs-inline-tab>` children, so consumers no longer have to hand-roll this.
3302
+ * `bs-tab.mdx`/`bs-inline-tab.mdx` previously documented this coordination -- listening for
3303
+ * `bsSelect` and setting `selected`/`false` on siblings, plus supplying `role="tablist"` on
3304
+ * whatever element groups the tabs -- as a "Known gap"/manual consumer responsibility. This
3305
+ * component is that wrapper: it renders the `role="tablist"` element and listens for `bsSelect`
3306
+ * itself. Using `<bs-tab>`/`<bs-inline-tab>` standalone, outside a `<bs-tabs>` wrapper, still means
3307
+ * `selected` doesn't self-toggle -- a consumer doing that would still need to coordinate `selected`
3308
+ * manually -- but that's no longer the first recommended path.
3309
+ * ## When to use
3310
+ * - Wrapping a set of `<bs-tab>` (underline style) or `<bs-inline-tab>` (pill style) elements that
3311
+ * should behave as a single-selection tab bar.
3312
+ * ## When not to use
3313
+ * - For a single, standalone tab button not participating in a group -- use `bs-tab`/`bs-inline-tab`
3314
+ * directly.
3315
+ */
3316
+ interface HTMLBsTabsElement extends Components.BsTabs, HTMLStencilElement {
3317
+ }
3318
+ var HTMLBsTabsElement: {
3319
+ prototype: HTMLBsTabsElement;
3320
+ new (): HTMLBsTabsElement;
3321
+ };
1899
3322
  /**
1900
3323
  * A dark tooltip bubble with a pointer arrow, used to surface a short hint of extra information
1901
3324
  * next to a trigger element.
@@ -1935,7 +3358,11 @@ declare global {
1935
3358
  "bs-ai-thinking": HTMLBsAiThinkingElement;
1936
3359
  "bs-attachment": HTMLBsAttachmentElement;
1937
3360
  "bs-attachment-list": HTMLBsAttachmentListElement;
3361
+ "bs-avatar": HTMLBsAvatarElement;
1938
3362
  "bs-badge": HTMLBsBadgeElement;
3363
+ "bs-breadcrumb": HTMLBsBreadcrumbElement;
3364
+ "bs-breadcrumb-overflow": HTMLBsBreadcrumbOverflowElement;
3365
+ "bs-breadcrumbs": HTMLBsBreadcrumbsElement;
1939
3366
  "bs-button": HTMLBsButtonElement;
1940
3367
  "bs-button-skeleton": HTMLBsButtonSkeletonElement;
1941
3368
  "bs-card": HTMLBsCardElement;
@@ -1945,14 +3372,28 @@ declare global {
1945
3372
  "bs-chatbot-sources-drawer": HTMLBsChatbotSourcesDrawerElement;
1946
3373
  "bs-chatbot-suggestion-button": HTMLBsChatbotSuggestionButtonElement;
1947
3374
  "bs-checkbox": HTMLBsCheckboxElement;
3375
+ "bs-checkbox-skeleton": HTMLBsCheckboxSkeletonElement;
1948
3376
  "bs-composer": HTMLBsComposerElement;
1949
3377
  "bs-composer-status-banner": HTMLBsComposerStatusBannerElement;
1950
3378
  "bs-data-table": HTMLBsDataTableElement;
3379
+ "bs-dialog": HTMLBsDialogElement;
3380
+ "bs-icon-button": HTMLBsIconButtonElement;
3381
+ "bs-inline-tab": HTMLBsInlineTabElement;
1951
3382
  "bs-input": HTMLBsInputElement;
3383
+ "bs-logo": HTMLBsLogoElement;
1952
3384
  "bs-menu": HTMLBsMenuElement;
1953
3385
  "bs-menu-item": HTMLBsMenuItemElement;
1954
- "bs-modal": HTMLBsModalElement;
3386
+ "bs-navigation-drawer": HTMLBsNavigationDrawerElement;
3387
+ "bs-navigation-drawer-item": HTMLBsNavigationDrawerItemElement;
3388
+ "bs-navigation-header": HTMLBsNavigationHeaderElement;
3389
+ "bs-pagination": HTMLBsPaginationElement;
3390
+ "bs-radio": HTMLBsRadioElement;
3391
+ "bs-slider": HTMLBsSliderElement;
3392
+ "bs-snackbar": HTMLBsSnackbarElement;
1955
3393
  "bs-source-link": HTMLBsSourceLinkElement;
3394
+ "bs-switch": HTMLBsSwitchElement;
3395
+ "bs-tab": HTMLBsTabElement;
3396
+ "bs-tabs": HTMLBsTabsElement;
1956
3397
  "bs-tooltip": HTMLBsTooltipElement;
1957
3398
  }
1958
3399
  }
@@ -2045,7 +3486,9 @@ declare namespace LocalJSX {
2045
3486
  /**
2046
3487
  * A single file attachment preview for `bs-composer` -- an image thumbnail, or a filename card
2047
3488
  * with a colored file-type badge (PDF/Document), with an optional upload-in-progress spinner and
2048
- * a hover/focus-revealed remove button.
3489
+ * a hover/focus-revealed remove button (a `bs-icon-button` with `size="xs"` `variant="neutral"` --
3490
+ * the same 16x16px compact tier `bs-icon-button` documents as meant for exactly this kind of
3491
+ * chip/tag "remove" control).
2049
3492
  * ## When to use
2050
3493
  * - Rendered by the consuming app for each file a user has attached to a Genie AI chat message,
2051
3494
  * typically alongside or inside `bs-composer`.
@@ -2062,14 +3505,6 @@ declare namespace LocalJSX {
2062
3505
  * @prop --bs-attachment-badge-bg-pdf - PDF badge background. Aliased to `--bs-badge-bg-error`.
2063
3506
  * @prop --bs-attachment-badge-bg-document - Document badge background. Aliased to
2064
3507
  * `--bs-badge-bg-info`.
2065
- * @prop --bs-attachment-remove-bg - Remove button (neutral icon button) default background.
2066
- * Aliased to `--bs-button-neutral-container`.
2067
- * @prop --bs-attachment-remove-hover - Remove button hover background. Aliased to
2068
- * `--bs-button-neutral-hover`.
2069
- * @prop --bs-attachment-remove-pressed - Remove button active/pressed background. Aliased to
2070
- * `--bs-button-neutral-pressed`.
2071
- * @prop --bs-attachment-remove-focus - Remove button focus outline color. Aliased to
2072
- * `--bs-border-neutral-focus`.
2073
3508
  */
2074
3509
  interface BsAttachment {
2075
3510
  /**
@@ -2128,10 +3563,66 @@ declare namespace LocalJSX {
2128
3563
  */
2129
3564
  interface BsAttachmentList {
2130
3565
  /**
2131
- * Accessible name for the scrollable region.
2132
- * @default 'Attachments'
3566
+ * Accessible name for the scrollable region.
3567
+ * @default 'Attachments'
3568
+ */
3569
+ "ariaLabel"?: string | null;
3570
+ }
3571
+ /**
3572
+ * A circular representation of a person or entity -- a photo, initials, or (as a fallback when
3573
+ * neither is available) a generic user-silhouette icon.
3574
+ * ## When to use
3575
+ * - Representing a specific user or account: in a header, a comment, a member list, etc.
3576
+ * - `type="initials"` when a photo isn't available but a name is (e.g. "Sam Lee" -> "SL").
3577
+ * - `type="icon"` (the default) as the generic fallback when neither a photo nor a name/initials
3578
+ * is available yet.
3579
+ * ## When not to use
3580
+ * - A company/brand logo -- use `bs-logo` instead.
3581
+ * This component is decorative/informational by default, not an interactive control -- it renders
3582
+ * a plain `<span>`/`<img>`, not a `<button>`. Figma's own component set includes hover/focused/
3583
+ * pressed states (e.g. for an account-switcher trigger use case), which this implements as real
3584
+ * `:hover`/`:focus-visible`/`:active` CSS on the host itself -- so wrapping this in your own
3585
+ * `<button>`, or setting `tabindex` and a click handler on the `<bs-avatar>` element directly, gets
3586
+ * the matching visual treatment for free with no extra wiring. Left genuinely non-interactive
3587
+ * (no implicit role/tabindex of its own) so it doesn't misrepresent a purely decorative avatar
3588
+ * (e.g. next to a comment) as a control when it isn't one.
3589
+ */
3590
+ interface BsAvatar {
3591
+ /**
3592
+ * `type="image"` only: accessible alt text for the photo, set directly on the real `<img>` this renders -- a person's photo is meaningful content, not decorative, so pass something real (e.g. their name). Falls back to `alt=""` (decorative to assistive tech) when unset, rather than omitting the attribute entirely, but don't rely on that fallback. Ignored for `icon`/`initials` -- see `ariaLabel` for those instead.
3593
+ * @default null
3594
+ */
3595
+ "alt"?: string | null;
3596
+ /**
3597
+ * `type="icon"`/`"initials"` only: accessible name for the avatar, set as `aria-label` on the `role="img"` wrapper this renders (neither is a real `<img>`, so there's no native `alt` to set). Setting a plain `aria-label` attribute on the `<bs-avatar>` host does NOT work for this -- that attribute stays on the light-DOM host and never crosses into the shadow DOM, so the actual `role="img"` element stays nameless. Same pattern as `bs-checkbox`'s identical `ariaLabel` prop. Ignored for `image` -- see `alt` for that instead.
3598
+ * @default null
3599
+ */
3600
+ "ariaLabel"?: string | null;
3601
+ /**
3602
+ * Applies the disabled treatment (50% opacity) and suppresses the hover/focus/pressed CSS states -- this doesn't set a native `disabled` attribute (this component renders no native form control), it's purely a visual/interaction-state flag for when a consuming app has wrapped this in its own disabled control. Reflected so the `:host([disabled])` CSS selector that drives all of the above still matches when a consumer sets the JS property directly (`el.disabled = true`) rather than the HTML attribute.
3603
+ * @default false
3604
+ */
3605
+ "disabled"?: boolean;
3606
+ /**
3607
+ * `type="initials"` only: the initials text to display (e.g. `"SL"` for "Sam Lee"). Ignored for `icon`/`image`.
3608
+ * @default null
3609
+ */
3610
+ "initials"?: string | null;
3611
+ /**
3612
+ * Sizing scale -- `xs` (24px) through `xxl` (128px), matching Figma's own six-step scale.
3613
+ * @default 'md'
3614
+ */
3615
+ "size"?: BsAvatarSize;
3616
+ /**
3617
+ * `type="image"` only: the photo URL. This component does not fetch it itself -- network calls, loading/error states, and caching are the consuming app's responsibility, same convention as `bs-logo`'s own `src` prop. Ignored for `icon`/`initials`.
3618
+ * @default null
3619
+ */
3620
+ "src"?: string | null;
3621
+ /**
3622
+ * What to render inside the circle. `icon` (default) is the generic fallback for when neither a photo nor initials are available yet.
3623
+ * @default 'icon'
2133
3624
  */
2134
- "ariaLabel"?: string | null;
3625
+ "type"?: BsAvatarType;
2135
3626
  }
2136
3627
  /**
2137
3628
  * A small status or category pill, usually paired with a label or list item.
@@ -2149,6 +3640,109 @@ declare namespace LocalJSX {
2149
3640
  */
2150
3641
  "variant"?: BsBadgeVariant;
2151
3642
  }
3643
+ /**
3644
+ * A single crumb within a `<bs-breadcrumbs>` trail: a leading separator icon plus either a link,
3645
+ * plain text, or the current-page label, depending on `current`/`href`.
3646
+ * Rendering follows the W3C ARIA Authoring Practices breadcrumb pattern
3647
+ * (https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/): the current page is marked
3648
+ * `aria-current="page"` and is never a link -- this holds even when `href` is also set, unlike
3649
+ * Carbon Design System's `cds-breadcrumb-item`, which allows a link on the current item.
3650
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
3651
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
3652
+ * accessibility tree needs this explicit role to preserve the list's semantics.
3653
+ * ## When to use
3654
+ * - As one crumb inside a `<bs-breadcrumbs>` trail.
3655
+ * ## When not to use
3656
+ * - Standalone, outside a `<bs-breadcrumbs>` wrapper -- its `<ol>`/`<nav>` context and
3657
+ * first-child-aware separator hiding depend on that parent structure.
3658
+ */
3659
+ interface BsBreadcrumb {
3660
+ /**
3661
+ * Whether this crumb is the current page. Renders as plain (non-link) text marked `aria-current="page"`, reflected as an attribute so consumers/CSS can target `bs-breadcrumb[current]`.
3662
+ * @default false
3663
+ */
3664
+ "current"?: boolean;
3665
+ /**
3666
+ * Destination for a non-current crumb. Ignored when `current` is true -- the current page is never a link, even if `href` is set (see the class JSDoc).
3667
+ */
3668
+ "href"?: string;
3669
+ /**
3670
+ * Size variant. Normally set automatically by a parent `<bs-breadcrumbs size="...">` -- the container propagates its own `size` as a JS property to every slotted `bs-breadcrumb`/ `bs-breadcrumb-overflow` child (see `bs-breadcrumbs.tsx`'s `propagateSize`), since CSS custom properties can't carry an enum that switches rules on their own. Can also be set directly on a standalone crumb. `sm` scales down font-size/line-height only -- the separator icon's pixel size is unchanged, since Figma didn't specify a `sm` icon size and guessing one risked drifting off-brand. Reflected so consumers/CSS can target `bs-breadcrumb[size="sm"]`.
3671
+ * @default 'md'
3672
+ */
3673
+ "size"?: BsBreadcrumbSize;
3674
+ }
3675
+ /**
3676
+ * A manually-placed collapsed-items disclosure for a `<bs-breadcrumbs>` trail: a leading separator
3677
+ * plus an icon-only ellipsis button that reveals a `bs-menu` popup listing every hidden crumb.
3678
+ * `items` is JS-property-only -- must be set as a JS property (`el.items = [...]`), not an HTML
3679
+ * attribute, since attributes can only carry strings. See CONVENTIONS.md.
3680
+ * Unlike an earlier `bs-breadcrumbs`-owned automatic `maxItems` collapse, this component does no
3681
+ * collapsing logic itself -- the consumer decides which crumbs to hide and places this element
3682
+ * wherever they want the disclosure, exactly matching Carbon Design System's own approach (Carbon
3683
+ * doesn't auto-collapse breadcrumbs either; a consumer there manually decides what's visible).
3684
+ * Hidden items with an `href` render as real `<a href>` rows inside the popup, not `bs-menu-item`
3685
+ * (which renders a `<button>`) -- this matters because consuming apps commonly use client-side
3686
+ * routers that intercept clicks on real `<a>` tags to do `preventDefault` + push-state navigation.
3687
+ * Rendering hidden links any other way (e.g. `window.location`) would silently break client-side
3688
+ * routing for hidden crumbs while working fine for visible ones. Hidden items without an `href`
3689
+ * render as plain non-interactive text, matching how `bs-breadcrumb` itself handles link vs.
3690
+ * no-link crumbs.
3691
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
3692
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
3693
+ * accessibility tree needs this explicit role to preserve the list's semantics.
3694
+ * ## When to use
3695
+ * - Inside a `<bs-breadcrumbs>` trail, wherever the consumer wants an interactive disclosure for
3696
+ * crumbs they've chosen not to render directly.
3697
+ * ## When not to use
3698
+ * - As an automatic collapsing mechanism -- there is none; the consumer decides what's hidden.
3699
+ */
3700
+ interface BsBreadcrumbOverflow {
3701
+ /**
3702
+ * Array prop -- must be set as a JS property (`el.items = [...]`), not an HTML attribute, since attributes can only carry strings. See CONVENTIONS.md. The hidden crumbs reachable via this disclosure -- no collapsing logic here, the consumer decides what goes in this list.
3703
+ * @default []
3704
+ */
3705
+ "items"?: BsBreadcrumbOverflowItem[];
3706
+ /**
3707
+ * Accessible name (`aria-label`) for the icon-only ellipsis trigger button.
3708
+ * @default 'Show hidden breadcrumbs'
3709
+ */
3710
+ "overflowLabel"?: string;
3711
+ /**
3712
+ * Size variant. Normally set automatically by a parent `<bs-breadcrumbs size="...">` -- see `bs-breadcrumb`'s identical `size` prop doc comment for why this is propagated as a JS property rather than inherited via CSS. Scales the popup rows' font-size/line-height only; the separator/ellipsis icons' pixel sizes are unchanged. Reflected so consumers/CSS can target `bs-breadcrumb-overflow[size="sm"]`.
3713
+ * @default 'md'
3714
+ */
3715
+ "size"?: BsBreadcrumbSize1;
3716
+ }
3717
+ /**
3718
+ * A breadcrumb trail container: a real `<nav>` landmark wrapping an `<ol>`, meant to be populated
3719
+ * with slotted `<bs-breadcrumb>` (and, where the consumer wants a collapsed-items disclosure,
3720
+ * `<bs-breadcrumb-overflow>`) children -- same composition-over-configuration architecture as
3721
+ * Carbon Design System's `cds-breadcrumb`/`cds-breadcrumb-item`/`cds-breadcrumb-link`.
3722
+ * This component is intentionally thin: it owns only the `<nav>` landmark and list semantics.
3723
+ * Unlike an earlier `items`-array-driven design, there is no automatic collapsing here -- exactly
3724
+ * like Carbon, the consumer decides what's visible and manually places a `<bs-breadcrumb-overflow>`
3725
+ * wherever they want a collapsed-items disclosure. See `bs-breadcrumbs.mdx` for the consolidated
3726
+ * docs covering all three components in this feature area.
3727
+ * ## When to use
3728
+ * - Showing a user's current location within a hierarchical page structure, with a path back to
3729
+ * its ancestors.
3730
+ * ## When not to use
3731
+ * - Primary in-app navigation -- use `bs-navigation-drawer`/`bs-navigation-header` instead.
3732
+ * - A flat set of unrelated pages with no hierarchy -- breadcrumbs imply ancestry, not just history.
3733
+ */
3734
+ interface BsBreadcrumbs {
3735
+ /**
3736
+ * Accessible name for the `<nav>` landmark, via `aria-label`. Same pattern as `bs-navigation-drawer`'s `heading` prop.
3737
+ * @default 'Breadcrumb'
3738
+ */
3739
+ "label"?: string;
3740
+ /**
3741
+ * Size variant, propagated as a JS property to every slotted `bs-breadcrumb`/ `bs-breadcrumb-overflow` child -- this container has no visual sizing of its own (font/spacing live on the item components, see `bs-breadcrumb.tsx`'s identical `size` prop), so propagation is the only way setting `size` here reaches every crumb. CSS custom properties can't carry an enum that switches rules on their own, which is why this is pushed via JS property instead of CSS inheritance -- same reasoning as `bs-tabs` setting `selected` directly on its slotted `bs-tab`/`bs-inline-tab` children. Re-propagated on `size` changes and whenever the slotted children change (e.g. a crumb added later).
3742
+ * @default 'md'
3743
+ */
3744
+ "size"?: BsBreadcrumbSize1;
3745
+ }
2152
3746
  /**
2153
3747
  * A clickable action element for the single most important action in a given context.
2154
3748
  * ## When to use
@@ -2168,6 +3762,11 @@ declare namespace LocalJSX {
2168
3762
  * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
2169
3763
  * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
2170
3764
  * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
3765
+ * @prop --bs-button-neutral-border - Border color, `variant="neutral"`, default/disabled. Aliased to `--bs-border-neutral-container`.
3766
+ * @prop --bs-button-neutral-border-hover - Border color, `variant="neutral"`, hover. Aliased to `--bs-border-neutral-container-hover`.
3767
+ * @prop --bs-button-neutral-border-pressed - Border color, `variant="neutral"`, pressed. Aliased to `--bs-border-neutral-container-pressed`.
3768
+ * @prop --bs-button-padding-x-icon-side - Horizontal padding on an edge that's adjacent to a leading/trailing icon (tighter than the plain text-only edge). Aliased to `--bs-spacing-150`.
3769
+ * @prop --bs-button-padding-x-label-side - Horizontal padding on the opposite edge, when an icon on the other side needs compensating extra space to keep the button optically balanced. Aliased to `--bs-spacing-250`.
2171
3770
  */
2172
3771
  interface BsButton {
2173
3772
  /**
@@ -2533,6 +4132,11 @@ declare namespace LocalJSX {
2533
4132
  * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
2534
4133
  */
2535
4134
  interface BsCheckbox {
4135
+ /**
4136
+ * Accessible name for the checkbox. Required whenever the default (label) slot is empty (e.g. a bare "select row" checkbox in a table) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-checkbox>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser, so the actual focusable element (the native `<input>` inside) stays nameless. This prop exists specifically to bridge that gap -- same pattern as `bs-button`'s and `bs-tab`'s identical `ariaLabel` prop, both of which explicitly bind it onto their own internal focusable element for the same reason.
4137
+ * @default null
4138
+ */
4139
+ "ariaLabel"?: string | null;
2536
4140
  /**
2537
4141
  * Whether the checkbox is checked. Mutable so clicking the label/input toggles it directly. When `indeterminate` is also true, `indeterminate` wins visually (shows the minus icon) regardless of this value -- same as native checkboxes.
2538
4142
  * @default false
@@ -2563,6 +4167,36 @@ declare namespace LocalJSX {
2563
4167
  */
2564
4168
  "size"?: BsCheckboxSize;
2565
4169
  }
4170
+ /**
4171
+ * A shape-matched loading placeholder for `bs-checkbox`, shown while the real label text isn't
4172
+ * known yet (e.g. still being fetched from an API). Renders a small square (matching the
4173
+ * checkbox's own box) beside a text-bar placeholder (standing in for the label), both pulsing
4174
+ * together, sized to match `bs-checkbox`'s `sm`/`md`/`lg` box dimensions so layout doesn't shift
4175
+ * once the real checkbox renders.
4176
+ * ## When to use
4177
+ * - In place of a `bs-checkbox` whose label/checked state depends on data that hasn't loaded yet.
4178
+ * ## When not to use
4179
+ * - While a checkbox's own change handler is running (e.g. a save request in flight) -- render the
4180
+ * real `bs-checkbox` itself; this component is not a saving-in-progress spinner.
4181
+ * @prop --bs-checkbox-skeleton-size-sm - Box width/height at `size="sm"`. Aliased to
4182
+ * `--bs-spacing-200`, mirroring `bs-checkbox`'s own `--bs-checkbox-size-sm` -- not read directly
4183
+ * from it, since these are two separate shadow roots.
4184
+ * @prop --bs-checkbox-skeleton-size-md - Box width/height at `size="md"`. Aliased to
4185
+ * `--bs-spacing-250`.
4186
+ * @prop --bs-checkbox-skeleton-size-lg - Box width/height at `size="lg"`. Aliased to
4187
+ * `--bs-spacing-300`.
4188
+ * @prop --bs-checkbox-skeleton-gap - Gap between the box and label placeholders. Aliased to
4189
+ * `--bs-spacing-100`, mirroring `bs-checkbox`'s own `--bs-checkbox-gap`.
4190
+ * @prop --bs-checkbox-skeleton-label-width - Width of the label placeholder bar. Defaults to
4191
+ * `96px`.
4192
+ */
4193
+ interface BsCheckboxSkeleton {
4194
+ /**
4195
+ * Sizing scale, matching the `bs-checkbox` size it stands in for. Defaults to `lg`, the same (unusual) default `bs-checkbox` itself uses.
4196
+ * @default 'lg'
4197
+ */
4198
+ "size"?: BsCheckboxSize1;
4199
+ }
2566
4200
  /**
2567
4201
  * A chat composer input for Genie AI-style conversational interfaces: a text field
2568
4202
  * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
@@ -2594,6 +4228,7 @@ declare namespace LocalJSX {
2594
4228
  * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
2595
4229
  * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
2596
4230
  * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
4231
+ * @prop --bs-composer-input-max-lines - How many lines the text field grows to before scrolling internally instead of growing further. Aliased to `10`.
2597
4232
  */
2598
4233
  interface BsComposer {
2599
4234
  /**
@@ -2635,7 +4270,7 @@ declare namespace LocalJSX {
2635
4270
  */
2636
4271
  "state"?: BsComposerState;
2637
4272
  /**
2638
- * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead.
4273
+ * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead. The field is a `<textarea>` (not a single-line `<input>`) that grows with its content, up to `--bs-composer-input-max-lines` (10 by default) -- beyond that it scrolls internally instead of growing further. Setting `value` as a prop (not just typing) also re-triggers the resize, so e.g. programmatically clearing the field after submit correctly shrinks it back down.
2639
4274
  * @default ''
2640
4275
  */
2641
4276
  "value"?: string;
@@ -2656,6 +4291,12 @@ declare namespace LocalJSX {
2656
4291
  * ## When not to use
2657
4292
  * - A toast/snackbar notification unrelated to the composer -- this component is not
2658
4293
  * self-dismissing and has no positioning of its own (it's a static block, not an overlay).
4294
+ * ## Accessibility
4295
+ * Sets `role="status"` for `type="info"`/`type="neutral"` and `role="alert"` for
4296
+ * `type="error"`/`type="warning"` on its own root element automatically -- no opt-in prop needed.
4297
+ * Both roles carry implicit ARIA live-region semantics (`status` is polite, `alert` is assertive),
4298
+ * so a screen reader announces the message as soon as this banner is inserted into the DOM,
4299
+ * without a consumer having to remember to add `role`/`aria-live` themselves.
2659
4300
  * @prop --bs-composer-status-banner-radius - Corner radius of the top-left/top-right corners
2660
4301
  * (bottom corners are square, so this sits flush above `bs-composer`). Aliased to
2661
4302
  * `--bs-border-radius-150`.
@@ -2780,6 +4421,129 @@ declare namespace LocalJSX {
2780
4421
  */
2781
4422
  "sortDirection"?: 'asc' | 'desc';
2782
4423
  }
4424
+ /**
4425
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
4426
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
4427
+ * ## When to use
4428
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
4429
+ * - A short, focused task that doesn't warrant navigating to a new page.
4430
+ * ## When not to use
4431
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
4432
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
4433
+ * dialog that just gets taller and taller.
4434
+ * Two additional slots cover the Figma "Dialog" component's other states: `image` (a hero image
4435
+ * across the top, close button floats over it instead of sitting in the header row) and `icon`
4436
+ * (only rendered when `centered` is set, e.g. a success checkmark above a centered heading). The
4437
+ * close button "floats" (absolute-positioned, top-right of the dialog, with its own background)
4438
+ * whenever `centered` is true or the `image` slot has content -- otherwise it's the plain inline
4439
+ * button in the header row next to the heading, same as before this addition.
4440
+ */
4441
+ interface BsDialog {
4442
+ /**
4443
+ * Switches to the Figma "Icon Centered" layout: heading/body text centered, the `icon` slot rendered above the heading, and the close button floating top-right of the dialog instead of inline in the header row. Doesn't hide a slotted `image` if one is also provided -- Figma's spec doesn't show the two combined, so this is unspecified rather than actively blocked. Reflected so consumers/CSS can target `bs-dialog[centered]`.
4444
+ * @default false
4445
+ */
4446
+ "centered"?: boolean;
4447
+ "heading"?: string;
4448
+ "onBsClose"?: (event: BsDialogCustomEvent<void>) => void;
4449
+ /**
4450
+ * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
4451
+ * @default false
4452
+ */
4453
+ "open"?: boolean;
4454
+ /**
4455
+ * @default 'md'
4456
+ */
4457
+ "size"?: BsDialogSize;
4458
+ }
4459
+ /**
4460
+ * A clickable, icon-only action element -- the icon-only sibling of `bs-button`, sharing the same
4461
+ * 8 visual variants and color language, but ALWAYS rendering just a single icon, never a label.
4462
+ * ## When to use
4463
+ * - A compact action where the icon alone is unambiguous (e.g. a close/dismiss control, a toolbar
4464
+ * action) and adding a text label would take up more space than the context allows.
4465
+ * - The same variant guidance as `bs-button` applies: `primary` for the single most important
4466
+ * action, `neutral`/`subtle`/`outlined` for lower-emphasis alternatives, `error` reserved for
4467
+ * destructive/irreversible actions (never `neutral`, per BrandSync guidance), `success`/
4468
+ * `warning`/`info` only when the action's own outcome is predictable and clearly communicated.
4469
+ * ## When not to use
4470
+ * - When the action isn't self-evident from the icon alone -- use `bs-button` with a visible label
4471
+ * instead, don't rely on a tooltip to compensate for an unclear icon.
4472
+ * - For navigation between pages -- use a link/nav component instead.
4473
+ * Because this component is always icon-only, `ariaLabel` is required for every real usage (not
4474
+ * just conditionally, unlike `bs-button`) -- there's no visible label text to fall back on for an
4475
+ * accessible name.
4476
+ */
4477
+ interface BsIconButton {
4478
+ /**
4479
+ * Accessible name for the button. Required -- this component is always icon-only, so there's no visible label text for screen readers to fall back on. Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically.
4480
+ * @default null
4481
+ */
4482
+ "ariaLabel"?: string | null;
4483
+ /**
4484
+ * Disables the button and applies the disabled token set.
4485
+ * @default false
4486
+ */
4487
+ "disabled"?: boolean;
4488
+ /**
4489
+ * Sizing scale. `xs` (16px, an 8px icon) is a distinct, much smaller tier meant for compact chip/tag "remove" controls, not just a smaller toolbar button -- verified against a separate Figma redline (EG BrandSync UI Kit v1.5, node 20731:18427) from the one `sm`/`md`/`lg` were built against.
4490
+ * @default 'md'
4491
+ */
4492
+ "size"?: BsIconButtonSize;
4493
+ /**
4494
+ * Native `<button>` type.
4495
+ * @default 'button'
4496
+ */
4497
+ "type"?: 'button' | 'submit' | 'reset';
4498
+ /**
4499
+ * Visual style. Maps to the same semantic token families as `bs-button`'s `variant`. `error` is for destructive/irreversible actions per BrandSync guidance, not a stronger emphasis alternative to `primary`.
4500
+ * @default 'primary'
4501
+ */
4502
+ "variant"?: BsIconButtonVariant;
4503
+ }
4504
+ /**
4505
+ * A pill-shaped tab button -- an optional leading icon plus a text label, rendered as a real
4506
+ * `<button>` so it participates correctly in tab order and native click/keyboard activation.
4507
+ * Unlike `bs-tab`'s underline indicator, selection here is communicated entirely by the pill's
4508
+ * background fill color -- there is no separate indicator element.
4509
+ * ## When to use
4510
+ * - As one button within a segmented-control-style tab bar, where exactly one tab is
4511
+ * selected/active at a time.
4512
+ * ## When not to use
4513
+ * - As a standalone action button -- use `bs-button` instead, `bs-inline-tab`'s visual language
4514
+ * (muted pill until selected/hovered) only makes sense as part of a set.
4515
+ * `selected` is NOT self-toggling -- clicking a `bs-inline-tab` only emits `bsSelect`, it does not
4516
+ * set its own `selected` prop, and it does not unselect any sibling tabs. Wrap your
4517
+ * `<bs-inline-tab>` elements in `<bs-tabs type="bs-inline-tab">` -- it owns `role="tablist"` and
4518
+ * coordinates selection (listening for `bsSelect` and setting `selected`/`false` across siblings)
4519
+ * for you. Using `bs-inline-tab` standalone, outside a `<bs-tabs>` wrapper, still means `selected`
4520
+ * doesn't self-toggle and `role="tablist"` isn't provided automatically -- a consumer doing that
4521
+ * would still need to coordinate `selected` and supply `role="tablist"` manually, same as
4522
+ * `bs-tab.mdx`/`bs-radio.mdx` document for their own components. See `bs-inline-tab.mdx`'s
4523
+ * Accessibility section for the full requirement, including `role="tabpanel"` on the corresponding
4524
+ * content panels.
4525
+ */
4526
+ interface BsInlineTab {
4527
+ /**
4528
+ * Accessible name for the tab. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the tab does -- without it, an icon-only tab has no discernible name at all (axe-core flags this as a critical `button-name` violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically, same as `bs-tab`'s identical prop.
4529
+ * @default null
4530
+ */
4531
+ "ariaLabel"?: string | null;
4532
+ /**
4533
+ * Disables the tab: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents clicking from emitting `bsSelect`.
4534
+ * @default false
4535
+ */
4536
+ "disabled"?: boolean;
4537
+ /**
4538
+ * Fires when the tab is clicked. Does not toggle `selected` itself -- see the class JSDoc.
4539
+ */
4540
+ "onBsSelect"?: (event: BsInlineTabCustomEvent<void>) => void;
4541
+ /**
4542
+ * Whether this tab is the currently active one. NOT mutable and NOT self-toggling -- see the "Known gap" note in the class JSDoc. Still reflected as an attribute so consumers/CSS can target `bs-inline-tab[selected]`.
4543
+ * @default false
4544
+ */
4545
+ "selected"?: boolean;
4546
+ }
2783
4547
  /**
2784
4548
  * A single-line text field with an optional label, description, and error state. Also covers a
2785
4549
  * range of related "field" shapes (number stepper, password reveal, date, dropdown trigger,
@@ -2912,6 +4676,52 @@ declare namespace LocalJSX {
2912
4676
  */
2913
4677
  "value"?: string;
2914
4678
  }
4679
+ /**
4680
+ * The BrandSync brand mark, as its own standalone component -- shared by `bs-navigation-header`
4681
+ * and `bs-navigation-drawer`, which used to each render their own duplicated copy of this SVG
4682
+ * (the drawer's collapsed state even faked an icon-only look by clipping the full wordmark asset
4683
+ * down to a narrowed box, rather than using a real icon-only asset).
4684
+ * ## When to use
4685
+ * - Anywhere the BrandSync logo/icon needs to render: a navigation header, a nav drawer, etc.
4686
+ * ## When not to use
4687
+ * - The Genie AI chat panel's own brand mark -- that's a different logo (`bs-chatbot-header`'s
4688
+ * own inline Genie asset), not this one.
4689
+ * `variant` mirrors Figma's "Logo" component set (node 10909:30421) `Device` property
4690
+ * ("Desktop" / "Tab and mobile"), which was originally meant to distinguish the full lockup from
4691
+ * the icon-only mark at different responsive breakpoints -- renamed here to
4692
+ * `variant: 'full' | 'mark'` since that's what it actually controls (how much of the logo
4693
+ * renders), not literally a device/breakpoint switch.
4694
+ * `variant="custom"` is not a Figma variant at all -- it's an escape hatch for a consuming app
4695
+ * that needs to show a DIFFERENT product's logo in the same slot (e.g. a white-labeled deployment,
4696
+ * or a logo fetched at runtime from a service like brand.dev), via `src`/`alt`, instead of the
4697
+ * built-in BrandSync assets. This component deliberately does NOT fetch that image itself --
4698
+ * network calls, loading/error states, and caching are the consuming app's responsibility, same as
4699
+ * every other component in this library (e.g. `bs-attachment` takes `imageSrc` rather than fetching
4700
+ * an image on its own). `background` has no effect on `variant="custom"` -- a consumer's own image
4701
+ * is already designed for whatever surface it's placed on.
4702
+ */
4703
+ interface BsLogo {
4704
+ /**
4705
+ * `variant="custom"` only: accessible alt text for the image -- a product logo is meaningful content (whose brand is this?), not decorative, so set this to something real (e.g. the product/company name). Falls back to `alt=""` (marking the image decorative to assistive tech) when unset, rather than omitting the `alt` attribute entirely -- an `<img>` with no `alt` attribute at all is a harder accessibility failure than one explicitly marked decorative, but an empty fallback is still worse than a real name, so don't rely on it. Ignored for `full`/`mark` (those already carry their own fixed `aria-label="BrandSync"`).
4706
+ * @default null
4707
+ */
4708
+ "alt"?: string | null;
4709
+ /**
4710
+ * Which pre-built asset to use for `variant="full"` -- Figma ships a genuinely separate, differently-drawn dark-background asset (every wordmark path filled solid white, and the icon's outer shape a single solid-white path instead of the light version's two-path white-fill-plus-border-ring), not a CSS currentColor swap of identical paths. `"auto"` (default) renders both assets and lets CSS pick one via `--bs-logo-asset-light-display`/`--bs-logo-asset-dark-display` (defined in `src/global/base.css`, flipped by the same `[data-theme="dark"]` attribute every other `--bs-*` token already reacts to) -- so the logo just follows the ambient theme with no wiring needed, the same way a consuming app's own dark mode already re-themes every other part of this library via ordinary CSS custom property inheritance. Set `"light"`/`"dark"` explicitly to pin one regardless of the ambient theme -- e.g. a dark sidebar that isn't otherwise dark-themed. Has no effect on `variant="mark"`: Figma's component set only has one real designed instance of the icon-only mark (`Device="Tab and mobile"`, `Background="Default"`) -- there's no separate dark version of it, so the mark renders identically regardless of this prop.
4711
+ * @default 'auto'
4712
+ */
4713
+ "background"?: BsLogoBackground;
4714
+ /**
4715
+ * `variant="custom"` only: the image URL to render (e.g. a URL your app already fetched from a logo API). Ignored for `full`/`mark`.
4716
+ * @default null
4717
+ */
4718
+ "src"?: string | null;
4719
+ /**
4720
+ * How much of the logo to render. `full` is the icon + "EG BrandSync" wordmark (190.977x44 natural size); `mark` is just the icon (44x44 natural size), no wordmark; `custom` renders a consumer-supplied image via `src`/`alt` instead of a built-in BrandSync asset -- see the class doc above.
4721
+ * @default 'full'
4722
+ */
4723
+ "variant"?: BsLogoVariant;
4724
+ }
2915
4725
  /**
2916
4726
  * A generic dropdown/popup menu container: a rounded, elevated list of items (typically
2917
4727
  * `bs-menu-item` elements).
@@ -2951,40 +4761,404 @@ declare namespace LocalJSX {
2951
4761
  * @prop --bs-menu-item-font-size - Aliased to `--bs-font-size-md`.
2952
4762
  * @prop --bs-menu-item-line-height - Aliased to `--bs-line-height-body-md`.
2953
4763
  */
2954
- interface BsMenuItem {
4764
+ interface BsMenuItem {
4765
+ /**
4766
+ * Disables the item: no hover/pressed/focus styling, no pointer cursor, not reachable by keyboard tabbing, and clicking it does not emit `bsSelect`.
4767
+ * @default false
4768
+ */
4769
+ "disabled"?: boolean;
4770
+ /**
4771
+ * Fires when the item is clicked.
4772
+ */
4773
+ "onBsSelect"?: (event: BsMenuItemCustomEvent<void>) => void;
4774
+ }
4775
+ /**
4776
+ * A left-side persistent navigation sidebar: the BrandSync logo, a "Main Menu" title with a
4777
+ * collapse toggle, a reserved slot for a search field, and a scrollable list of nav items.
4778
+ * ## When to use
4779
+ * - The primary in-app navigation, shown alongside `bs-navigation-header` (typically that
4780
+ * header's `with-navigation-drawer` alignment, which omits its own logo since this component
4781
+ * already renders one -- or the reverse pairing, this drawer's own `showLogo={false}` alongside
4782
+ * a header that keeps its logo instead, see that prop's own docs).
4783
+ * ## When not to use
4784
+ * - The top navigation bar itself -- use `bs-navigation-header` instead.
4785
+ * This component renders a real `<nav>` landmark (no explicit `role` needed -- `<nav>` already
4786
+ * carries the implicit `navigation` role), labeled via `aria-label={heading}` so the landmark
4787
+ * still has a name even when collapsed (see below).
4788
+ * `collapsed` narrows the drawer to a 96px icon-only rail, per Figma node 8028:135374
4789
+ * ("Type=Collapsed"): the title text disappears, the logo swaps from the full "EG BrandSync"
4790
+ * wordmark (`bs-logo variant="full"`) to the real icon-only mark (`bs-logo variant="mark"` -- a
4791
+ * second, properly-designed asset, not a CSS crop of the full one) via CSS visibility toggling on
4792
+ * both, the same `:host([collapsed])` attribute-selector pattern already used for the
4793
+ * `search`/`search-trigger` swap below, the `search` slot is replaced by a compact built-in
4794
+ * search-trigger button (this component can't meaningfully shrink arbitrary slotted search-field
4795
+ * content down to icon size itself, so it emits `bsSearchClick` instead -- e.g. to open a full
4796
+ * search overlay), and every top-level
4797
+ * `bs-navigation-drawer-item`'s layout switches from icon-beside-label to icon-above-caption.
4798
+ * That last part is real prop propagation, not a CSS trick: this component keeps each direct-child
4799
+ * item's own `collapsed` prop in sync with its own (see `syncItemsCollapsed` below), the same
4800
+ * direct-children-prop-sync approach `bs-tabs` already uses for coordinating `selected` across its
4801
+ * `bs-tab` children. Clicking the toggle self-toggles `collapsed` (simple local UI state, not
4802
+ * something needing cross-component coordination -- closer to `bs-switch`'s self-toggling
4803
+ * `checked` than `bs-tab`'s non-self-toggling `selected`) and emits `bsCollapse` with the new
4804
+ * value. The toggle's own caret icon does NOT rotate when collapsed -- Figma's collapsed mock
4805
+ * reuses the identical left-pointing "CaretLeft" asset unchanged, confirmed by directly inspecting
4806
+ * that state, so this deliberately does not add the same "flip on toggle" idiom the drawer item's
4807
+ * own disclosure chevron does (that one really is an unconfirmed addition; this one was checked).
4808
+ */
4809
+ interface BsNavigationDrawer {
4810
+ /**
4811
+ * Narrows the drawer to a 96px icon-only rail (Figma node 8028:135374). Mutable and reflected -- clicking the collapse toggle toggles this directly (self-toggling, see the class doc above for why), and this component keeps every direct-child `bs-navigation-drawer-item`'s own `collapsed` prop synced to match (see `syncItemsCollapsed`).
4812
+ * @default false
4813
+ */
4814
+ "collapsed"?: boolean;
4815
+ /**
4816
+ * Whether this drawer can be collapsed at all. `false` renders no collapse toggle/chevron -- a "fixed" side nav (Carbon's terminology: a `Fixed Side Nav` never collapses, as opposed to a rail-capable one) that's always fully expanded. `collapsed` is ignored while this is `false`.
4817
+ * @default true
4818
+ */
4819
+ "collapsible"?: boolean;
4820
+ /**
4821
+ * Heading text shown next to the collapse toggle, and used as the `<nav>` landmark's `aria-label` (so the landmark keeps a name even when `collapsed` hides the visible text).
4822
+ * @default 'Main Menu'
4823
+ */
4824
+ "heading"?: string;
4825
+ /**
4826
+ * Forwarded straight to both internal `bs-logo` elements' own `background` prop. Defaults to `"auto"`, which follows the ambient `[data-theme="dark"]` state automatically (see `bs-logo`'s own docs) -- so if this drawer ends up on a dark surface via the normal theming mechanism, the logo switches to its dedicated dark-background asset with no wiring needed. Set `"light"`/`"dark"` explicitly only if you've overridden `--bs-navigation-drawer-bg` to something dark yourself *without* setting `[data-theme="dark"]`, and need to pin the logo regardless of theme. Has no visible effect on the `variant="mark"` logo shown while `collapsed` (see `bs-logo`'s own docs -- there's only one real designed mark asset, it's background-agnostic).
4827
+ * @default 'auto'
4828
+ */
4829
+ "logoBackground"?: 'auto' | 'light' | 'dark';
4830
+ /**
4831
+ * Fires with the new `collapsed` value when the collapse toggle button is clicked.
4832
+ */
4833
+ "onBsCollapse"?: (event: BsNavigationDrawerCustomEvent<boolean>) => void;
4834
+ /**
4835
+ * Fires when the compact search-trigger button (shown instead of the `search` slot while `collapsed`) is clicked -- e.g. to open a full search overlay. This component has no visibility into what the `search` slot actually contains, so it can't drive a real search itself once shrunk to icon size.
4836
+ */
4837
+ "onBsSearchClick"?: (event: BsNavigationDrawerCustomEvent<void>) => void;
4838
+ /**
4839
+ * Whether to render the BrandSync logo at all. Defaults to `true`. This drawer is normally the one that owns the logo when paired with a `bs-navigation-header` (that header's own `with-navigation-drawer` alignment omits its logo for exactly this reason) -- but the reverse pairing works too: a header that keeps its own logo (`alignment="default"`) paired with this drawer set to `showLogo={false}`, so the brand mark only ever appears once.
4840
+ * @default true
4841
+ */
4842
+ "showLogo"?: boolean;
4843
+ }
4844
+ /**
4845
+ * A single row within a `bs-navigation-drawer`'s item list -- either a plain leaf nav item, or an
4846
+ * `expandable` group header that discloses nested `bs-navigation-drawer-item` children.
4847
+ * ## When to use
4848
+ * - Every row inside a `bs-navigation-drawer`'s default slot.
4849
+ * ## When not to use
4850
+ * - A standalone action outside a navigation drawer -- use `bs-button`/`bs-menu-item` instead.
4851
+ * Click behavior is mutually exclusive, based on `expandable`:
4852
+ * - `expandable = false` (a plain leaf item): clicking only emits `bsSelect`. `selected` is NOT
4853
+ * self-toggling -- same non-self-toggling precedent as `bs-tab`'s `selected` (see `bs-tab.tsx`'s
4854
+ * class doc): coordinating which sibling row is selected needs cross-item state a
4855
+ * consumer/wrapper owns, not something this component can reason about on its own.
4856
+ * - `expandable = true` (a group header, never shown with a `selected` tint): clicking toggles
4857
+ * `this.expanded` directly and emits `bsToggle` with the new value, and does NOT emit
4858
+ * `bsSelect`. This IS self-toggling, unlike `selected` above -- it's simple local disclosure
4859
+ * state with no cross-item coordination needed, closer to `bs-switch`'s self-toggling `checked`
4860
+ * than `bs-tab`'s non-self-toggling `selected`.
4861
+ * Nesting: put child `<bs-navigation-drawer-item nested>` elements inside a parent
4862
+ * `<bs-navigation-drawer-item expandable>` with `slot="children"`. The parent shows/hides that
4863
+ * slot's content based on its own `expanded` prop, via a pure-CSS attribute selector (no JS
4864
+ * visibility toggling needed, since `expanded` is reflected).
4865
+ * `collapsed` switches this row from its normal icon-beside-label row layout to a compact
4866
+ * icon-above-caption column (per Figma node 8028:135374, the drawer's "Type=Collapsed" state) --
4867
+ * you don't need to set this yourself on every item: a parent `bs-navigation-drawer` keeps its own
4868
+ * top-level items' `collapsed` prop in sync with its own `collapsed` state automatically (see
4869
+ * `bs-navigation-drawer.tsx`'s `syncItemsCollapsed`, the same direct-children-prop-sync approach
4870
+ * `bs-tabs` uses for coordinating `selected` across its own `bs-tab` children). It's still a public
4871
+ * prop so a standalone item (or this component's own stories) can be demoed without the parent.
4872
+ */
4873
+ interface BsNavigationDrawerItem {
4874
+ /**
4875
+ * Optional accessible name override. Not required for `collapsed` rows -- unlike an icon-only button, the label caption stays visible (just restyled smaller, under the icon) in that mode per Figma, so the button's default accessible-name computation (its own text content) already works. Set this if you want a fuller/different name than the visible caption (e.g. truncated captions, or matching `bs-switch`/`bs-slider`'s `ariaLabel` convention for consistency).
4876
+ * @default null
4877
+ */
4878
+ "ariaLabel"?: string | null;
4879
+ /**
4880
+ * Switches this row to the compact icon-above-caption column layout used when its parent `bs-navigation-drawer` is `collapsed` (see the class doc above). Reflected so `bs-navigation-drawer-item[collapsed]` is CSS-targetable. Also forces `expandable` rows' chevron and `children` slot to stay hidden regardless of `expanded` -- Figma's collapsed rail never shows a nested tree.
4881
+ * @default false
4882
+ */
4883
+ "collapsed"?: boolean;
4884
+ /**
4885
+ * Renders this row as a disclosure/group header (trailing chevron, self-toggling `expanded`, `bsToggle` instead of `bsSelect` on click) instead of a plain navigable leaf item. See the class doc above for the full click-behavior split.
4886
+ * @default false
4887
+ */
4888
+ "expandable"?: boolean;
4889
+ /**
4890
+ * Whether an `expandable` row's `children` slot is shown. Mutable and reflected -- clicking an `expandable` row toggles this directly (self-toggling, unlike `selected` above), and CSS shows/hides the `children` slot wrapper based on the reflected attribute. Ignored when `expandable` is false.
4891
+ * @default false
4892
+ */
4893
+ "expanded"?: boolean;
4894
+ /**
4895
+ * Marks this as a child row nested under an `expandable` parent (via `slot="children"`) -- deepens the left indent and stops reserving `icon` slot space entirely (Figma's nested rows never have icons).
4896
+ * @default false
4897
+ */
4898
+ "nested"?: boolean;
4899
+ /**
4900
+ * Fires on click, only when `expandable` is false. See the class doc above.
4901
+ */
4902
+ "onBsSelect"?: (event: BsNavigationDrawerItemCustomEvent<void>) => void;
4903
+ /**
4904
+ * Fires with the new `expanded` value on click, only when `expandable` is true. See the class doc above.
4905
+ */
4906
+ "onBsToggle"?: (event: BsNavigationDrawerItemCustomEvent<boolean>) => void;
4907
+ /**
4908
+ * Tints the row's background/text to indicate it's the current destination. NOT self-toggling -- see the class doc above for why. Ignored (never applied) when `expandable` is true. Reflected so consumers/CSS can target `bs-navigation-drawer-item[selected]`.
4909
+ * @default false
4910
+ */
4911
+ "selected"?: boolean;
4912
+ }
4913
+ /**
4914
+ * The top-level navigation bar for a page: the BrandSync logo plus two consumer-provided slots
4915
+ * for menu/action content (e.g. `bs-button`/`bs-icon-button` elements).
4916
+ * ## When to use
4917
+ * - The persistent top bar of an application, above the page content.
4918
+ * ## When not to use
4919
+ * - The header of a Genie AI chat panel -- use `bs-chatbot-header` instead, which is purpose-built
4920
+ * for that narrower layout and its own fixed action buttons.
4921
+ * `alignment` controls both whether the logo renders and how the two slots are laid out:
4922
+ * - `default` (default): logo on the left, `left` slot content immediately after it, `right` slot
4923
+ * content pushed to the far right.
4924
+ * - `center`: logo and `right` slot both grow equally (`flex: 1`), which centers the `left` slot
4925
+ * content in the middle of the bar.
4926
+ * - `with-navigation-drawer`: no logo at all (this variant assumes a nav-drawer toggle is the
4927
+ * leftmost thing on the page instead) -- `left` slot content starts at the bar's own left edge,
4928
+ * `right` slot content pushed to the far right.
4929
+ */
4930
+ interface BsNavigationHeader {
4931
+ /**
4932
+ * Controls whether the logo renders and how the `left`/`right` slots are laid out -- see the class doc above for the three variants' exact behavior.
4933
+ * @default 'default'
4934
+ */
4935
+ "alignment"?: BsNavigationHeaderAlignment;
4936
+ /**
4937
+ * Accessible label for the header landmark, useful when a page has more than one `<header>` (e.g. this one plus a page-specific sub-header) and screen reader users need to tell them apart in the landmarks list.
4938
+ * @default null
4939
+ */
4940
+ "ariaLabel"?: string | null;
4941
+ /**
4942
+ * Forwarded straight to the internal `bs-logo`'s own `background` prop. Defaults to `"auto"`, which follows the ambient `[data-theme="dark"]` state automatically (see `bs-logo`'s own docs) -- so if this bar ends up on a dark surface via the normal theming mechanism, the logo switches to its dedicated dark-background asset with no wiring needed. Set `"light"`/`"dark"` explicitly only if you've overridden `--bs-navigation-header-bg` to something dark yourself *without* setting `[data-theme="dark"]`, and need to pin the logo regardless of theme.
4943
+ * @default 'auto'
4944
+ */
4945
+ "logoBackground"?: 'auto' | 'light' | 'dark';
4946
+ /**
4947
+ * Fragment/URL to jump to when the "Skip to main content" link is activated (e.g. `#main-content`, matching an id on your page's main landmark). Unset by default -- the link is opt-in rather than pointing at a guessed default id, since a skip link to a target that doesn't exist on the consumer's page is worse than no skip link at all (it silently does nothing when activated). Set this to the same id your page's `<main>` (or equivalent) already has to enable it.
4948
+ * @default null
4949
+ */
4950
+ "skipToContentHref"?: string | null;
4951
+ /**
4952
+ * Link text for the skip-to-content link. Only rendered when `skipToContentHref` is set.
4953
+ * @default 'Skip to main content'
4954
+ */
4955
+ "skipToContentLabel"?: string;
4956
+ }
4957
+ /**
4958
+ * A numbered page control -- previous/next chevrons, page-number buttons, and `...` overflow for
4959
+ * large page counts. Matches the Figma "Pagination" component's "Default" type (the classic
4960
+ * numbered pagination); its other type ("jumper" -- a rows-per-page dropdown plus a page-jump
4961
+ * input) is a structurally different composite widget and isn't covered by this component.
4962
+ * `totalPages`/`currentPage` drive everything -- this computes which page numbers to show and
4963
+ * where to collapse into `...` itself, the consumer never builds the button list by hand.
4964
+ * ## When to use
4965
+ * - Paging through a large, ordered result set (a table, a search results list) where jumping
4966
+ * directly to a specific page number is useful.
4967
+ * ## When not to use
4968
+ * - Infinite-scroll or "load more" patterns -- those don't have a fixed, addressable page number.
4969
+ * - A huge page count where users realistically only ever go forward/back one page at a time --
4970
+ * plain prev/next controls (no numbers) are simpler there.
4971
+ */
4972
+ interface BsPagination {
4973
+ /**
4974
+ * The active page (1-indexed). Mutable + reflected so clicking a page button updates it directly, the same way `bs-modal`'s `open` self-manages, while `bsPageChange` still fires for the consumer to react to (e.g. fetching that page's data).
4975
+ * @default 1
4976
+ */
4977
+ "currentPage"?: number;
4978
+ /**
4979
+ * Accessible name for the next-page button.
4980
+ * @default 'Next page'
4981
+ */
4982
+ "nextLabel"?: string;
4983
+ /**
4984
+ * Fires whenever the active page changes as a result of the user clicking a page/prev/next button -- not when `currentPage` is set programmatically from outside.
4985
+ */
4986
+ "onBsPageChange"?: (event: BsPaginationCustomEvent<number>) => void;
4987
+ /**
4988
+ * Accessible name for the previous-page button.
4989
+ * @default 'Previous page'
4990
+ */
4991
+ "previousLabel"?: string;
4992
+ /**
4993
+ * How many page numbers to show on each side of the current page before collapsing the rest into `...`. `1` (the default) reproduces the Figma spec's example exactly (page 1 of 12 shows `1 2 3 ... 12`).
4994
+ * @default 1
4995
+ */
4996
+ "siblingCount"?: number;
4997
+ /**
4998
+ * Total number of pages. Must be a positive integer -- there's always at least one page.
4999
+ * @default 1
5000
+ */
5001
+ "totalPages"?: number;
5002
+ }
5003
+ /**
5004
+ * A single radio button with its label, for one mutually-exclusive choice within a group.
5005
+ * ## When to use
5006
+ * - One option within a set of mutually-exclusive choices, where all options should stay visible
5007
+ * (a radio group).
5008
+ * ## When not to use
5009
+ * - An independent, non-exclusive binary choice, or one item in a set of independent choices --
5010
+ * use `bs-checkbox` instead.
5011
+ * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
5012
+ */
5013
+ interface BsRadio {
5014
+ /**
5015
+ * Whether the radio is checked. Mutable so clicking the label/input sets it directly.
5016
+ * @default false
5017
+ */
5018
+ "checked"?: boolean;
5019
+ /**
5020
+ * Disables the radio: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents toggling.
5021
+ * @default false
5022
+ */
5023
+ "disabled"?: boolean;
5024
+ /**
5025
+ * The native radio input's `name` attribute. Passed straight through to the native input inside. NOTE: because each `bs-radio` renders its own shadow root, native `<input type="radio">` mutual-exclusion grouping (which the HTML spec scopes to a single DOM tree) does NOT extend across separate `bs-radio` instances sharing the same `name` -- checking one will not natively uncheck another. Within a single instance this still behaves like a normal radio input. See bs-radio.mdx's Accessibility section for this known gap; consumers building a group currently need to manage mutual exclusivity themselves (e.g. via `bsChange`) until a `bs-radio-group` wrapper exists.
5026
+ */
5027
+ "name"?: string;
5028
+ /**
5029
+ * Emitted with this radio's own `value` when it becomes checked via user interaction. Since native same-`name` grouping doesn't cross shadow-root boundaries (see the `name` prop's doc), a consumer wiring up a group of `bs-radio`s must itself set `checked = false` on the others in response to this event -- there's no automatic un-checking to rely on here.
5030
+ */
5031
+ "onBsChange"?: (event: BsRadioCustomEvent<string>) => void;
5032
+ /**
5033
+ * The native radio input's `value` attribute -- read from `event.target.value`, or used when wiring the group up to a form.
5034
+ */
5035
+ "value"?: string;
5036
+ }
5037
+ /**
5038
+ * A slider for picking a single numeric value (`type="default"`), a value snapped to evenly
5039
+ * spaced ticks (`type="segmented"`), or a min/max pair (`type="range"`) from within a bounded
5040
+ * `min`/`max` range.
5041
+ * ## When to use
5042
+ * - A numeric value that's easiest to reason about relative to its bounds (volume, brightness,
5043
+ * a price range) rather than typed digit-by-digit.
5044
+ * - `type="segmented"` when only a fixed number of discrete stops make sense (e.g. a 5-star
5045
+ * rating-like scale) but a visual track is still preferable to discrete buttons.
5046
+ * - `type="range"` for picking a min/max pair (e.g. a price range filter) with two thumbs.
5047
+ * ## When not to use
5048
+ * - A precise value where mis-dragging by a pixel matters more than the at-a-glance bounds --
5049
+ * use `bs-input[type="number"]` instead.
5050
+ * - A small, fixed set of mutually exclusive choices -- use a radio group instead.
5051
+ */
5052
+ interface BsSlider {
2955
5053
  /**
2956
- * Disables the item: no hover/pressed/focus styling, no pointer cursor, not reachable by keyboard tabbing, and clicking it does not emit `bsSelect`.
5054
+ * Accessible name for the slider's native range input(s). Required whenever `showLabel` is `false` (a bare track with no visible "Label" text) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-slider>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser. Same pattern/reasoning as `bs-switch`'s and `bs-checkbox`'s identical `ariaLabel` prop. For `type="range"`, this labels the lower-bound thumb; the upper-bound thumb gets `"${ariaLabel} end"` (or `"End value"` when `ariaLabel` is unset).
5055
+ * @default null
5056
+ */
5057
+ "ariaLabel"?: string | null;
5058
+ /**
5059
+ * Disables the slider: sets the native `disabled` attribute on the range input(s), suppresses hover/focus/drag styling and the value tooltip, and prevents interaction.
2957
5060
  * @default false
2958
5061
  */
2959
5062
  "disabled"?: boolean;
2960
5063
  /**
2961
- * Fires when the item is clicked.
5064
+ * Label text shown above the track when `showLabel` is set.
5065
+ * @default 'Label'
2962
5066
  */
2963
- "onBsSelect"?: (event: BsMenuItemCustomEvent<void>) => void;
5067
+ "label"?: string;
5068
+ /**
5069
+ * Maximum selectable value, for all `type`s.
5070
+ * @default 100
5071
+ */
5072
+ "max"?: number;
5073
+ /**
5074
+ * Minimum selectable value, for all `type`s.
5075
+ * @default 0
5076
+ */
5077
+ "min"?: number;
5078
+ /**
5079
+ * Emitted when `value` changes via user interaction (dragging the thumb, or committing the value field), with the new value. Only fires for `type="default"`/`type="segmented"`.
5080
+ */
5081
+ "onBsChange"?: (event: BsSliderCustomEvent<number>) => void;
5082
+ /**
5083
+ * Emitted when `valueStart`/`valueEnd` changes via user interaction, with both current values. Only fires for `type="range"`.
5084
+ */
5085
+ "onBsRangeChange"?: (event: BsSliderCustomEvent<{ start: number; end: number }>) => void;
5086
+ /**
5087
+ * Number of equal divisions marked by tick lines along the track, for `type="segmented"` only. The first tick (at the very start of the track) is rendered with `opacity: 0` to keep the tick spacing math consistent while not visually doubling up with the track's own start edge -- this matches the design spec, not a bug.
5088
+ * @default 10
5089
+ */
5090
+ "segments"?: number;
5091
+ /**
5092
+ * Shows/hides the "Label" text and editable percentage field(s) above the track, and the static min/max bound labels flanking it. When `false`, only the bare track (and its knob/knobs) renders.
5093
+ * @default true
5094
+ */
5095
+ "showLabel"?: boolean;
5096
+ /**
5097
+ * Step size between selectable values. For `type="segmented"`, the effective step is derived from `(max - min) / segments` instead, so the thumb always snaps to a tick.
5098
+ * @default 1
5099
+ */
5100
+ "step"?: number;
5101
+ /**
5102
+ * Which slider shape to render. `range` uses two thumbs (`valueStart`/`valueEnd`); `default` and `segmented` use one thumb (`value`). `segmented` additionally draws `segments` tick marks along the track.
5103
+ * @default 'default'
5104
+ */
5105
+ "type"?: BsSliderType;
5106
+ /**
5107
+ * Current value for `type="default"`/`type="segmented"`. Ignored for `type="range"` -- use `valueStart`/`valueEnd` instead. Mutable so dragging the thumb updates it directly.
5108
+ * @default 0
5109
+ */
5110
+ "value"?: number;
5111
+ /**
5112
+ * Upper thumb's value for `type="range"`. Defaults to `max` when unset. Mutable so dragging the thumb updates it directly.
5113
+ */
5114
+ "valueEnd"?: number;
5115
+ /**
5116
+ * Lower thumb's value for `type="range"`. Defaults to `min` when unset. Mutable so dragging the thumb updates it directly.
5117
+ */
5118
+ "valueStart"?: number;
2964
5119
  }
2965
5120
  /**
2966
- * An overlay dialog that interrupts the current flow for a focused task or confirmation.
2967
- * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
5121
+ * A transient status bar for confirming the result of an action (e.g. "Files uploaded
5122
+ * successfully.") -- an icon (or loading spinner), a message, an optional action, and a close
5123
+ * button.
5124
+ * This component only renders the bar itself -- it doesn't manage its own visibility, timing, or
5125
+ * stacking. A consumer (typically a small "toast manager" utility) creates one per message and
5126
+ * removes it from the DOM again, whether on a timer or on `bsDismiss`. Figma's spec doesn't show
5127
+ * auto-dismiss timing at all (it's a static visual spec), so this deliberately doesn't invent one.
5128
+ * The icon is always the same checkmark glyph across every `variant`, just recolored -- matching
5129
+ * the Figma spec exactly, even though a checkmark for `variant="error"` reads a little oddly
5130
+ * semantically. Worth revisiting with severity-specific icons (warning triangle, error circle,
5131
+ * etc.) if the design updates to specify them.
2968
5132
  * ## When to use
2969
- * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
2970
- * - A short, focused task that doesn't warrant navigating to a new page.
5133
+ * - Confirming the outcome of an action that just happened (save succeeded, upload failed) without
5134
+ * interrupting the user's flow.
2971
5135
  * ## When not to use
2972
- * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
2973
- * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
2974
- * modal that just gets taller and taller.
5136
+ * - For a response that requires the user to make a decision before continuing -- use `bs-dialog`.
5137
+ * - For persistent, always-visible status -- a snackbar is inherently transient.
2975
5138
  */
2976
- interface BsModal {
2977
- "heading"?: string;
2978
- "onBsClose"?: (event: BsModalCustomEvent<void>) => void;
5139
+ interface BsSnackbar {
2979
5140
  /**
2980
- * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
5141
+ * Label for the optional action button (e.g. "Undo", "Retry"). Omit this prop entirely to render no action button at all -- its presence, not a boolean flag, is what shows it.
5142
+ */
5143
+ "actionLabel"?: string;
5144
+ /**
5145
+ * Replaces the checkmark icon with a spinning loading indicator, for a message describing in-progress work (e.g. "Uploading files...") rather than a completed result.
2981
5146
  * @default false
2982
5147
  */
2983
- "open"?: boolean;
5148
+ "loading"?: boolean;
2984
5149
  /**
2985
- * @default 'md'
5150
+ * Fires when the action button is clicked. Ignored/never fires if `actionLabel` isn't set.
5151
+ */
5152
+ "onBsAction"?: (event: BsSnackbarCustomEvent<void>) => void;
5153
+ /**
5154
+ * Fires when the close button is clicked. This component doesn't remove itself from the DOM -- the consumer is expected to do that (or hide it) in response to this event.
5155
+ */
5156
+ "onBsDismiss"?: (event: BsSnackbarCustomEvent<void>) => void;
5157
+ /**
5158
+ * Color/semantic variant. `default` is the neutral (dark, inverse-surface) bar Figma shows as the baseline; `info`/`warning`/`success`/`error` use their matching container/text tokens.
5159
+ * @default 'default'
2986
5160
  */
2987
- "size"?: BsModalSize;
5161
+ "variant"?: BsSnackbarVariant;
2988
5162
  }
2989
5163
  /**
2990
5164
  * A single citation row inside `bs-chatbot-sources-drawer` -- a file icon + filename on the first
@@ -3039,6 +5213,115 @@ declare namespace LocalJSX {
3039
5213
  */
3040
5214
  "version"?: string;
3041
5215
  }
5216
+ /**
5217
+ * A toggle switch for an on/off setting that takes effect immediately (no explicit form
5218
+ * submission required).
5219
+ * ## When to use
5220
+ * - A binary setting that applies right away (e.g. "Enable notifications", "Dark mode").
5221
+ * ## When not to use
5222
+ * - A binary choice that's part of a form submitted later, or one item within a group of
5223
+ * independent choices -- use `bs-checkbox` instead.
5224
+ * - A single mutually-exclusive choice from a set -- use a radio group instead.
5225
+ */
5226
+ interface BsSwitch {
5227
+ /**
5228
+ * Accessible name for the switch. Required whenever the default (label) slot is empty (e.g. a bare "enabled" switch in a table row) -- without it, the internal native `<input>` has no accessible name at all. Setting `aria-label` directly on the `<bs-switch>` host does NOT work for this: that attribute stays on the light-DOM host and is never forwarded into the shadow DOM by the browser, so the actual focusable element (the native `<input>` inside) stays nameless. This prop exists specifically to bridge that gap -- same pattern as `bs-button`'s and `bs-checkbox`'s identical `ariaLabel` prop, both of which explicitly bind it onto their own internal focusable element for the same reason.
5229
+ * @default null
5230
+ */
5231
+ "ariaLabel"?: string | null;
5232
+ /**
5233
+ * Whether the switch is on. Mutable so clicking the label/input toggles it directly, and reflected so consumers can target `bs-switch[checked]` via CSS.
5234
+ * @default false
5235
+ */
5236
+ "checked"?: boolean;
5237
+ /**
5238
+ * Disables the switch: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents toggling.
5239
+ * @default false
5240
+ */
5241
+ "disabled"?: boolean;
5242
+ /**
5243
+ * Emitted when the checked state changes via user interaction, with the new `checked` value.
5244
+ */
5245
+ "onBsChange"?: (event: BsSwitchCustomEvent<boolean>) => void;
5246
+ /**
5247
+ * Sizing scale. Controls the track's width/height and the knob's diameter.
5248
+ * @default 'lg'
5249
+ */
5250
+ "size"?: BsSwitchSize;
5251
+ }
5252
+ /**
5253
+ * A single tab button -- an optional icon plus a text label, rendered as a real `<button>` so it
5254
+ * participates correctly in tab order and native click/keyboard activation.
5255
+ * ## When to use
5256
+ * - As one button within a tab bar, where exactly one tab is selected/active at a time.
5257
+ * ## When not to use
5258
+ * - As a standalone action button -- use `bs-button` instead, `bs-tab`'s visual language (muted
5259
+ * until selected/hovered, underline indicator) only makes sense as part of a set.
5260
+ * `selected` is NOT self-toggling -- clicking a `bs-tab` only emits `bsSelect`, it does not set its
5261
+ * own `selected` prop, and it does not unselect any sibling tabs. Wrap your `<bs-tab>` elements in
5262
+ * `<bs-tabs type="bs-tab">` -- it owns `role="tablist"` and coordinates selection (listening for
5263
+ * `bsSelect` and setting `selected`/`false` across siblings) for you. Using `bs-tab` standalone,
5264
+ * outside a `<bs-tabs>` wrapper, still means `selected` doesn't self-toggle and `role="tablist"`
5265
+ * isn't provided automatically -- a consumer doing that would still need to coordinate `selected`
5266
+ * and supply `role="tablist"` manually, same as `bs-radio.mdx` documents for `bs-radio`'s missing
5267
+ * `bs-radio-group`. See `bs-tab.mdx`'s Accessibility section for the full requirement, including
5268
+ * `role="tabpanel"` on the corresponding content panels.
5269
+ */
5270
+ interface BsTab {
5271
+ /**
5272
+ * Accessible name for the tab. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the tab does -- without it, an icon-only tab has no discernible name at all (axe-core flags this as a critical `button-name` violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically, same as `bs-button`'s identical prop.
5273
+ * @default null
5274
+ */
5275
+ "ariaLabel"?: string | null;
5276
+ /**
5277
+ * Disables the tab: sets the native `disabled` attribute, suppresses hover/focus styling, and prevents clicking from emitting `bsSelect`.
5278
+ * @default false
5279
+ */
5280
+ "disabled"?: boolean;
5281
+ /**
5282
+ * Where the icon sits relative to the label, when both `icon` and the default slot are populated. Ignored for icon-only/text-only layouts.
5283
+ * @default 'start'
5284
+ */
5285
+ "iconPosition"?: BsTabIconPosition;
5286
+ /**
5287
+ * Fires when the tab is clicked. Does not toggle `selected` itself -- see the class JSDoc.
5288
+ */
5289
+ "onBsSelect"?: (event: BsTabCustomEvent<void>) => void;
5290
+ /**
5291
+ * Whether this tab is the currently active one. NOT mutable and NOT self-toggling -- see the "Known gap" note in the class JSDoc. Still reflected as an attribute so consumers/CSS can target `bs-tab[selected]`.
5292
+ * @default false
5293
+ */
5294
+ "selected"?: boolean;
5295
+ }
5296
+ /**
5297
+ * A tab-group wrapper: owns `role="tablist"` and coordinates selection across its slotted
5298
+ * `<bs-tab>` or `<bs-inline-tab>` children, so consumers no longer have to hand-roll this.
5299
+ * `bs-tab.mdx`/`bs-inline-tab.mdx` previously documented this coordination -- listening for
5300
+ * `bsSelect` and setting `selected`/`false` on siblings, plus supplying `role="tablist"` on
5301
+ * whatever element groups the tabs -- as a "Known gap"/manual consumer responsibility. This
5302
+ * component is that wrapper: it renders the `role="tablist"` element and listens for `bsSelect`
5303
+ * itself. Using `<bs-tab>`/`<bs-inline-tab>` standalone, outside a `<bs-tabs>` wrapper, still means
5304
+ * `selected` doesn't self-toggle -- a consumer doing that would still need to coordinate `selected`
5305
+ * manually -- but that's no longer the first recommended path.
5306
+ * ## When to use
5307
+ * - Wrapping a set of `<bs-tab>` (underline style) or `<bs-inline-tab>` (pill style) elements that
5308
+ * should behave as a single-selection tab bar.
5309
+ * ## When not to use
5310
+ * - For a single, standalone tab button not participating in a group -- use `bs-tab`/`bs-inline-tab`
5311
+ * directly.
5312
+ */
5313
+ interface BsTabs {
5314
+ /**
5315
+ * Layout direction of the tab bar itself. Sets `aria-orientation` on the internal wrapper and switches `flex-direction`.
5316
+ * @default 'horizontal'
5317
+ */
5318
+ "orientation"?: BsTabsOrientation;
5319
+ /**
5320
+ * Which tab-button family this group wraps. Governs the wrapper's own visual treatment (gap-only for `bs-tab`, a filled pill bar for `bs-inline-tab`). Not reflected as an attribute -- nothing external needs to target it via CSS attribute selector, it only drives internal class names.
5321
+ * @default 'bs-tab'
5322
+ */
5323
+ "type"?: BsTabsType;
5324
+ }
3042
5325
  /**
3043
5326
  * A dark tooltip bubble with a pointer arrow, used to surface a short hint of extra information
3044
5327
  * next to a trigger element.
@@ -3092,9 +5375,31 @@ declare namespace LocalJSX {
3092
5375
  interface BsAttachmentListAttributes {
3093
5376
  "ariaLabel": string | null;
3094
5377
  }
5378
+ interface BsAvatarAttributes {
5379
+ "type": BsAvatarType;
5380
+ "size": BsAvatarSize;
5381
+ "initials": string | null;
5382
+ "src": string | null;
5383
+ "alt": string | null;
5384
+ "ariaLabel": string | null;
5385
+ "disabled": boolean;
5386
+ }
3095
5387
  interface BsBadgeAttributes {
3096
5388
  "variant": BsBadgeVariant;
3097
5389
  }
5390
+ interface BsBreadcrumbAttributes {
5391
+ "href": string;
5392
+ "current": boolean;
5393
+ "size": BsBreadcrumbSize;
5394
+ }
5395
+ interface BsBreadcrumbOverflowAttributes {
5396
+ "overflowLabel": string;
5397
+ "size": BsBreadcrumbSize;
5398
+ }
5399
+ interface BsBreadcrumbsAttributes {
5400
+ "label": string;
5401
+ "size": BsBreadcrumbSize;
5402
+ }
3098
5403
  interface BsButtonAttributes {
3099
5404
  "variant": BsButtonVariant;
3100
5405
  "size": BsButtonSize;
@@ -3136,6 +5441,10 @@ declare namespace LocalJSX {
3136
5441
  "indeterminate": boolean;
3137
5442
  "disabled": boolean;
3138
5443
  "error": boolean;
5444
+ "ariaLabel": string | null;
5445
+ }
5446
+ interface BsCheckboxSkeletonAttributes {
5447
+ "size": BsCheckboxSize;
3139
5448
  }
3140
5449
  interface BsComposerAttributes {
3141
5450
  "variant": BsComposerVariant;
@@ -3157,6 +5466,24 @@ declare namespace LocalJSX {
3157
5466
  "sortDirection": 'asc' | 'desc';
3158
5467
  "selectable": boolean;
3159
5468
  }
5469
+ interface BsDialogAttributes {
5470
+ "open": boolean;
5471
+ "heading": string;
5472
+ "size": BsDialogSize;
5473
+ "centered": boolean;
5474
+ }
5475
+ interface BsIconButtonAttributes {
5476
+ "variant": BsIconButtonVariant;
5477
+ "size": BsIconButtonSize;
5478
+ "disabled": boolean;
5479
+ "type": 'button' | 'submit' | 'reset';
5480
+ "ariaLabel": string | null;
5481
+ }
5482
+ interface BsInlineTabAttributes {
5483
+ "selected": boolean;
5484
+ "disabled": boolean;
5485
+ "ariaLabel": string | null;
5486
+ }
3160
5487
  interface BsInputAttributes {
3161
5488
  "value": string;
3162
5489
  "type": | 'text'
@@ -3187,13 +5514,68 @@ declare namespace LocalJSX {
3187
5514
  "length": number;
3188
5515
  "open": boolean;
3189
5516
  }
5517
+ interface BsLogoAttributes {
5518
+ "variant": BsLogoVariant;
5519
+ "background": BsLogoBackground;
5520
+ "src": string | null;
5521
+ "alt": string | null;
5522
+ }
3190
5523
  interface BsMenuItemAttributes {
3191
5524
  "disabled": boolean;
3192
5525
  }
3193
- interface BsModalAttributes {
3194
- "open": boolean;
5526
+ interface BsNavigationDrawerAttributes {
3195
5527
  "heading": string;
3196
- "size": BsModalSize;
5528
+ "collapsible": boolean;
5529
+ "collapsed": boolean;
5530
+ "logoBackground": 'auto' | 'light' | 'dark';
5531
+ "showLogo": boolean;
5532
+ }
5533
+ interface BsNavigationDrawerItemAttributes {
5534
+ "selected": boolean;
5535
+ "expandable": boolean;
5536
+ "expanded": boolean;
5537
+ "nested": boolean;
5538
+ "ariaLabel": string | null;
5539
+ "collapsed": boolean;
5540
+ }
5541
+ interface BsNavigationHeaderAttributes {
5542
+ "alignment": BsNavigationHeaderAlignment;
5543
+ "ariaLabel": string | null;
5544
+ "skipToContentHref": string | null;
5545
+ "skipToContentLabel": string;
5546
+ "logoBackground": 'auto' | 'light' | 'dark';
5547
+ }
5548
+ interface BsPaginationAttributes {
5549
+ "totalPages": number;
5550
+ "currentPage": number;
5551
+ "siblingCount": number;
5552
+ "previousLabel": string;
5553
+ "nextLabel": string;
5554
+ }
5555
+ interface BsRadioAttributes {
5556
+ "name": string;
5557
+ "value": string;
5558
+ "checked": boolean;
5559
+ "disabled": boolean;
5560
+ }
5561
+ interface BsSliderAttributes {
5562
+ "type": BsSliderType;
5563
+ "showLabel": boolean;
5564
+ "label": string;
5565
+ "min": number;
5566
+ "max": number;
5567
+ "step": number;
5568
+ "value": number;
5569
+ "valueStart": number;
5570
+ "valueEnd": number;
5571
+ "segments": number;
5572
+ "disabled": boolean;
5573
+ "ariaLabel": string | null;
5574
+ }
5575
+ interface BsSnackbarAttributes {
5576
+ "variant": BsSnackbarVariant;
5577
+ "loading": boolean;
5578
+ "actionLabel": string;
3197
5579
  }
3198
5580
  interface BsSourceLinkAttributes {
3199
5581
  "fileName": string;
@@ -3202,6 +5584,22 @@ declare namespace LocalJSX {
3202
5584
  "href": string;
3203
5585
  "target": string;
3204
5586
  }
5587
+ interface BsSwitchAttributes {
5588
+ "size": BsSwitchSize;
5589
+ "checked": boolean;
5590
+ "disabled": boolean;
5591
+ "ariaLabel": string | null;
5592
+ }
5593
+ interface BsTabAttributes {
5594
+ "selected": boolean;
5595
+ "disabled": boolean;
5596
+ "iconPosition": BsTabIconPosition;
5597
+ "ariaLabel": string | null;
5598
+ }
5599
+ interface BsTabsAttributes {
5600
+ "type": BsTabsType;
5601
+ "orientation": BsTabsOrientation;
5602
+ }
3205
5603
  interface BsTooltipAttributes {
3206
5604
  "placement": 'top';
3207
5605
  }
@@ -3212,7 +5610,11 @@ declare namespace LocalJSX {
3212
5610
  "bs-ai-thinking": Omit<BsAiThinking, keyof BsAiThinkingAttributes> & { [K in keyof BsAiThinking & keyof BsAiThinkingAttributes]?: BsAiThinking[K] } & { [K in keyof BsAiThinking & keyof BsAiThinkingAttributes as `attr:${K}`]?: BsAiThinkingAttributes[K] } & { [K in keyof BsAiThinking & keyof BsAiThinkingAttributes as `prop:${K}`]?: BsAiThinking[K] };
3213
5611
  "bs-attachment": Omit<BsAttachment, keyof BsAttachmentAttributes> & { [K in keyof BsAttachment & keyof BsAttachmentAttributes]?: BsAttachment[K] } & { [K in keyof BsAttachment & keyof BsAttachmentAttributes as `attr:${K}`]?: BsAttachmentAttributes[K] } & { [K in keyof BsAttachment & keyof BsAttachmentAttributes as `prop:${K}`]?: BsAttachment[K] };
3214
5612
  "bs-attachment-list": Omit<BsAttachmentList, keyof BsAttachmentListAttributes> & { [K in keyof BsAttachmentList & keyof BsAttachmentListAttributes]?: BsAttachmentList[K] } & { [K in keyof BsAttachmentList & keyof BsAttachmentListAttributes as `attr:${K}`]?: BsAttachmentListAttributes[K] } & { [K in keyof BsAttachmentList & keyof BsAttachmentListAttributes as `prop:${K}`]?: BsAttachmentList[K] };
5613
+ "bs-avatar": Omit<BsAvatar, keyof BsAvatarAttributes> & { [K in keyof BsAvatar & keyof BsAvatarAttributes]?: BsAvatar[K] } & { [K in keyof BsAvatar & keyof BsAvatarAttributes as `attr:${K}`]?: BsAvatarAttributes[K] } & { [K in keyof BsAvatar & keyof BsAvatarAttributes as `prop:${K}`]?: BsAvatar[K] };
3215
5614
  "bs-badge": Omit<BsBadge, keyof BsBadgeAttributes> & { [K in keyof BsBadge & keyof BsBadgeAttributes]?: BsBadge[K] } & { [K in keyof BsBadge & keyof BsBadgeAttributes as `attr:${K}`]?: BsBadgeAttributes[K] } & { [K in keyof BsBadge & keyof BsBadgeAttributes as `prop:${K}`]?: BsBadge[K] };
5615
+ "bs-breadcrumb": Omit<BsBreadcrumb, keyof BsBreadcrumbAttributes> & { [K in keyof BsBreadcrumb & keyof BsBreadcrumbAttributes]?: BsBreadcrumb[K] } & { [K in keyof BsBreadcrumb & keyof BsBreadcrumbAttributes as `attr:${K}`]?: BsBreadcrumbAttributes[K] } & { [K in keyof BsBreadcrumb & keyof BsBreadcrumbAttributes as `prop:${K}`]?: BsBreadcrumb[K] };
5616
+ "bs-breadcrumb-overflow": Omit<BsBreadcrumbOverflow, keyof BsBreadcrumbOverflowAttributes> & { [K in keyof BsBreadcrumbOverflow & keyof BsBreadcrumbOverflowAttributes]?: BsBreadcrumbOverflow[K] } & { [K in keyof BsBreadcrumbOverflow & keyof BsBreadcrumbOverflowAttributes as `attr:${K}`]?: BsBreadcrumbOverflowAttributes[K] } & { [K in keyof BsBreadcrumbOverflow & keyof BsBreadcrumbOverflowAttributes as `prop:${K}`]?: BsBreadcrumbOverflow[K] };
5617
+ "bs-breadcrumbs": Omit<BsBreadcrumbs, keyof BsBreadcrumbsAttributes> & { [K in keyof BsBreadcrumbs & keyof BsBreadcrumbsAttributes]?: BsBreadcrumbs[K] } & { [K in keyof BsBreadcrumbs & keyof BsBreadcrumbsAttributes as `attr:${K}`]?: BsBreadcrumbsAttributes[K] } & { [K in keyof BsBreadcrumbs & keyof BsBreadcrumbsAttributes as `prop:${K}`]?: BsBreadcrumbs[K] };
3216
5618
  "bs-button": Omit<BsButton, keyof BsButtonAttributes> & { [K in keyof BsButton & keyof BsButtonAttributes]?: BsButton[K] } & { [K in keyof BsButton & keyof BsButtonAttributes as `attr:${K}`]?: BsButtonAttributes[K] } & { [K in keyof BsButton & keyof BsButtonAttributes as `prop:${K}`]?: BsButton[K] };
3217
5619
  "bs-button-skeleton": Omit<BsButtonSkeleton, keyof BsButtonSkeletonAttributes> & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes]?: BsButtonSkeleton[K] } & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes as `attr:${K}`]?: BsButtonSkeletonAttributes[K] } & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes as `prop:${K}`]?: BsButtonSkeleton[K] };
3218
5620
  "bs-card": Omit<BsCard, keyof BsCardAttributes> & { [K in keyof BsCard & keyof BsCardAttributes]?: BsCard[K] } & { [K in keyof BsCard & keyof BsCardAttributes as `attr:${K}`]?: BsCardAttributes[K] } & { [K in keyof BsCard & keyof BsCardAttributes as `prop:${K}`]?: BsCard[K] };
@@ -3222,14 +5624,28 @@ declare namespace LocalJSX {
3222
5624
  "bs-chatbot-sources-drawer": Omit<BsChatbotSourcesDrawer, keyof BsChatbotSourcesDrawerAttributes> & { [K in keyof BsChatbotSourcesDrawer & keyof BsChatbotSourcesDrawerAttributes]?: BsChatbotSourcesDrawer[K] } & { [K in keyof BsChatbotSourcesDrawer & keyof BsChatbotSourcesDrawerAttributes as `attr:${K}`]?: BsChatbotSourcesDrawerAttributes[K] } & { [K in keyof BsChatbotSourcesDrawer & keyof BsChatbotSourcesDrawerAttributes as `prop:${K}`]?: BsChatbotSourcesDrawer[K] };
3223
5625
  "bs-chatbot-suggestion-button": Omit<BsChatbotSuggestionButton, keyof BsChatbotSuggestionButtonAttributes> & { [K in keyof BsChatbotSuggestionButton & keyof BsChatbotSuggestionButtonAttributes]?: BsChatbotSuggestionButton[K] } & { [K in keyof BsChatbotSuggestionButton & keyof BsChatbotSuggestionButtonAttributes as `attr:${K}`]?: BsChatbotSuggestionButtonAttributes[K] } & { [K in keyof BsChatbotSuggestionButton & keyof BsChatbotSuggestionButtonAttributes as `prop:${K}`]?: BsChatbotSuggestionButton[K] };
3224
5626
  "bs-checkbox": Omit<BsCheckbox, keyof BsCheckboxAttributes> & { [K in keyof BsCheckbox & keyof BsCheckboxAttributes]?: BsCheckbox[K] } & { [K in keyof BsCheckbox & keyof BsCheckboxAttributes as `attr:${K}`]?: BsCheckboxAttributes[K] } & { [K in keyof BsCheckbox & keyof BsCheckboxAttributes as `prop:${K}`]?: BsCheckbox[K] };
5627
+ "bs-checkbox-skeleton": Omit<BsCheckboxSkeleton, keyof BsCheckboxSkeletonAttributes> & { [K in keyof BsCheckboxSkeleton & keyof BsCheckboxSkeletonAttributes]?: BsCheckboxSkeleton[K] } & { [K in keyof BsCheckboxSkeleton & keyof BsCheckboxSkeletonAttributes as `attr:${K}`]?: BsCheckboxSkeletonAttributes[K] } & { [K in keyof BsCheckboxSkeleton & keyof BsCheckboxSkeletonAttributes as `prop:${K}`]?: BsCheckboxSkeleton[K] };
3225
5628
  "bs-composer": Omit<BsComposer, keyof BsComposerAttributes> & { [K in keyof BsComposer & keyof BsComposerAttributes]?: BsComposer[K] } & { [K in keyof BsComposer & keyof BsComposerAttributes as `attr:${K}`]?: BsComposerAttributes[K] } & { [K in keyof BsComposer & keyof BsComposerAttributes as `prop:${K}`]?: BsComposer[K] };
3226
5629
  "bs-composer-status-banner": Omit<BsComposerStatusBanner, keyof BsComposerStatusBannerAttributes> & { [K in keyof BsComposerStatusBanner & keyof BsComposerStatusBannerAttributes]?: BsComposerStatusBanner[K] } & { [K in keyof BsComposerStatusBanner & keyof BsComposerStatusBannerAttributes as `attr:${K}`]?: BsComposerStatusBannerAttributes[K] } & { [K in keyof BsComposerStatusBanner & keyof BsComposerStatusBannerAttributes as `prop:${K}`]?: BsComposerStatusBanner[K] };
3227
5630
  "bs-data-table": Omit<BsDataTable, keyof BsDataTableAttributes> & { [K in keyof BsDataTable & keyof BsDataTableAttributes]?: BsDataTable[K] } & { [K in keyof BsDataTable & keyof BsDataTableAttributes as `attr:${K}`]?: BsDataTableAttributes[K] } & { [K in keyof BsDataTable & keyof BsDataTableAttributes as `prop:${K}`]?: BsDataTable[K] };
5631
+ "bs-dialog": Omit<BsDialog, keyof BsDialogAttributes> & { [K in keyof BsDialog & keyof BsDialogAttributes]?: BsDialog[K] } & { [K in keyof BsDialog & keyof BsDialogAttributes as `attr:${K}`]?: BsDialogAttributes[K] } & { [K in keyof BsDialog & keyof BsDialogAttributes as `prop:${K}`]?: BsDialog[K] };
5632
+ "bs-icon-button": Omit<BsIconButton, keyof BsIconButtonAttributes> & { [K in keyof BsIconButton & keyof BsIconButtonAttributes]?: BsIconButton[K] } & { [K in keyof BsIconButton & keyof BsIconButtonAttributes as `attr:${K}`]?: BsIconButtonAttributes[K] } & { [K in keyof BsIconButton & keyof BsIconButtonAttributes as `prop:${K}`]?: BsIconButton[K] };
5633
+ "bs-inline-tab": Omit<BsInlineTab, keyof BsInlineTabAttributes> & { [K in keyof BsInlineTab & keyof BsInlineTabAttributes]?: BsInlineTab[K] } & { [K in keyof BsInlineTab & keyof BsInlineTabAttributes as `attr:${K}`]?: BsInlineTabAttributes[K] } & { [K in keyof BsInlineTab & keyof BsInlineTabAttributes as `prop:${K}`]?: BsInlineTab[K] };
3228
5634
  "bs-input": Omit<BsInput, keyof BsInputAttributes> & { [K in keyof BsInput & keyof BsInputAttributes]?: BsInput[K] } & { [K in keyof BsInput & keyof BsInputAttributes as `attr:${K}`]?: BsInputAttributes[K] } & { [K in keyof BsInput & keyof BsInputAttributes as `prop:${K}`]?: BsInput[K] };
5635
+ "bs-logo": Omit<BsLogo, keyof BsLogoAttributes> & { [K in keyof BsLogo & keyof BsLogoAttributes]?: BsLogo[K] } & { [K in keyof BsLogo & keyof BsLogoAttributes as `attr:${K}`]?: BsLogoAttributes[K] } & { [K in keyof BsLogo & keyof BsLogoAttributes as `prop:${K}`]?: BsLogo[K] };
3229
5636
  "bs-menu": BsMenu;
3230
5637
  "bs-menu-item": Omit<BsMenuItem, keyof BsMenuItemAttributes> & { [K in keyof BsMenuItem & keyof BsMenuItemAttributes]?: BsMenuItem[K] } & { [K in keyof BsMenuItem & keyof BsMenuItemAttributes as `attr:${K}`]?: BsMenuItemAttributes[K] } & { [K in keyof BsMenuItem & keyof BsMenuItemAttributes as `prop:${K}`]?: BsMenuItem[K] };
3231
- "bs-modal": Omit<BsModal, keyof BsModalAttributes> & { [K in keyof BsModal & keyof BsModalAttributes]?: BsModal[K] } & { [K in keyof BsModal & keyof BsModalAttributes as `attr:${K}`]?: BsModalAttributes[K] } & { [K in keyof BsModal & keyof BsModalAttributes as `prop:${K}`]?: BsModal[K] };
5638
+ "bs-navigation-drawer": Omit<BsNavigationDrawer, keyof BsNavigationDrawerAttributes> & { [K in keyof BsNavigationDrawer & keyof BsNavigationDrawerAttributes]?: BsNavigationDrawer[K] } & { [K in keyof BsNavigationDrawer & keyof BsNavigationDrawerAttributes as `attr:${K}`]?: BsNavigationDrawerAttributes[K] } & { [K in keyof BsNavigationDrawer & keyof BsNavigationDrawerAttributes as `prop:${K}`]?: BsNavigationDrawer[K] };
5639
+ "bs-navigation-drawer-item": Omit<BsNavigationDrawerItem, keyof BsNavigationDrawerItemAttributes> & { [K in keyof BsNavigationDrawerItem & keyof BsNavigationDrawerItemAttributes]?: BsNavigationDrawerItem[K] } & { [K in keyof BsNavigationDrawerItem & keyof BsNavigationDrawerItemAttributes as `attr:${K}`]?: BsNavigationDrawerItemAttributes[K] } & { [K in keyof BsNavigationDrawerItem & keyof BsNavigationDrawerItemAttributes as `prop:${K}`]?: BsNavigationDrawerItem[K] };
5640
+ "bs-navigation-header": Omit<BsNavigationHeader, keyof BsNavigationHeaderAttributes> & { [K in keyof BsNavigationHeader & keyof BsNavigationHeaderAttributes]?: BsNavigationHeader[K] } & { [K in keyof BsNavigationHeader & keyof BsNavigationHeaderAttributes as `attr:${K}`]?: BsNavigationHeaderAttributes[K] } & { [K in keyof BsNavigationHeader & keyof BsNavigationHeaderAttributes as `prop:${K}`]?: BsNavigationHeader[K] };
5641
+ "bs-pagination": Omit<BsPagination, keyof BsPaginationAttributes> & { [K in keyof BsPagination & keyof BsPaginationAttributes]?: BsPagination[K] } & { [K in keyof BsPagination & keyof BsPaginationAttributes as `attr:${K}`]?: BsPaginationAttributes[K] } & { [K in keyof BsPagination & keyof BsPaginationAttributes as `prop:${K}`]?: BsPagination[K] };
5642
+ "bs-radio": Omit<BsRadio, keyof BsRadioAttributes> & { [K in keyof BsRadio & keyof BsRadioAttributes]?: BsRadio[K] } & { [K in keyof BsRadio & keyof BsRadioAttributes as `attr:${K}`]?: BsRadioAttributes[K] } & { [K in keyof BsRadio & keyof BsRadioAttributes as `prop:${K}`]?: BsRadio[K] };
5643
+ "bs-slider": Omit<BsSlider, keyof BsSliderAttributes> & { [K in keyof BsSlider & keyof BsSliderAttributes]?: BsSlider[K] } & { [K in keyof BsSlider & keyof BsSliderAttributes as `attr:${K}`]?: BsSliderAttributes[K] } & { [K in keyof BsSlider & keyof BsSliderAttributes as `prop:${K}`]?: BsSlider[K] };
5644
+ "bs-snackbar": Omit<BsSnackbar, keyof BsSnackbarAttributes> & { [K in keyof BsSnackbar & keyof BsSnackbarAttributes]?: BsSnackbar[K] } & { [K in keyof BsSnackbar & keyof BsSnackbarAttributes as `attr:${K}`]?: BsSnackbarAttributes[K] } & { [K in keyof BsSnackbar & keyof BsSnackbarAttributes as `prop:${K}`]?: BsSnackbar[K] };
3232
5645
  "bs-source-link": Omit<BsSourceLink, keyof BsSourceLinkAttributes> & { [K in keyof BsSourceLink & keyof BsSourceLinkAttributes]?: BsSourceLink[K] } & { [K in keyof BsSourceLink & keyof BsSourceLinkAttributes as `attr:${K}`]?: BsSourceLinkAttributes[K] } & { [K in keyof BsSourceLink & keyof BsSourceLinkAttributes as `prop:${K}`]?: BsSourceLink[K] };
5646
+ "bs-switch": Omit<BsSwitch, keyof BsSwitchAttributes> & { [K in keyof BsSwitch & keyof BsSwitchAttributes]?: BsSwitch[K] } & { [K in keyof BsSwitch & keyof BsSwitchAttributes as `attr:${K}`]?: BsSwitchAttributes[K] } & { [K in keyof BsSwitch & keyof BsSwitchAttributes as `prop:${K}`]?: BsSwitch[K] };
5647
+ "bs-tab": Omit<BsTab, keyof BsTabAttributes> & { [K in keyof BsTab & keyof BsTabAttributes]?: BsTab[K] } & { [K in keyof BsTab & keyof BsTabAttributes as `attr:${K}`]?: BsTabAttributes[K] } & { [K in keyof BsTab & keyof BsTabAttributes as `prop:${K}`]?: BsTab[K] };
5648
+ "bs-tabs": Omit<BsTabs, keyof BsTabsAttributes> & { [K in keyof BsTabs & keyof BsTabsAttributes]?: BsTabs[K] } & { [K in keyof BsTabs & keyof BsTabsAttributes as `attr:${K}`]?: BsTabsAttributes[K] } & { [K in keyof BsTabs & keyof BsTabsAttributes as `prop:${K}`]?: BsTabs[K] };
3233
5649
  "bs-tooltip": Omit<BsTooltip, keyof BsTooltipAttributes> & { [K in keyof BsTooltip & keyof BsTooltipAttributes]?: BsTooltip[K] } & { [K in keyof BsTooltip & keyof BsTooltipAttributes as `attr:${K}`]?: BsTooltipAttributes[K] } & { [K in keyof BsTooltip & keyof BsTooltipAttributes as `prop:${K}`]?: BsTooltip[K] };
3234
5650
  }
3235
5651
  }
@@ -3308,7 +5724,9 @@ declare module "@stencil/core" {
3308
5724
  /**
3309
5725
  * A single file attachment preview for `bs-composer` -- an image thumbnail, or a filename card
3310
5726
  * with a colored file-type badge (PDF/Document), with an optional upload-in-progress spinner and
3311
- * a hover/focus-revealed remove button.
5727
+ * a hover/focus-revealed remove button (a `bs-icon-button` with `size="xs"` `variant="neutral"` --
5728
+ * the same 16x16px compact tier `bs-icon-button` documents as meant for exactly this kind of
5729
+ * chip/tag "remove" control).
3312
5730
  * ## When to use
3313
5731
  * - Rendered by the consuming app for each file a user has attached to a Genie AI chat message,
3314
5732
  * typically alongside or inside `bs-composer`.
@@ -3325,14 +5743,6 @@ declare module "@stencil/core" {
3325
5743
  * @prop --bs-attachment-badge-bg-pdf - PDF badge background. Aliased to `--bs-badge-bg-error`.
3326
5744
  * @prop --bs-attachment-badge-bg-document - Document badge background. Aliased to
3327
5745
  * `--bs-badge-bg-info`.
3328
- * @prop --bs-attachment-remove-bg - Remove button (neutral icon button) default background.
3329
- * Aliased to `--bs-button-neutral-container`.
3330
- * @prop --bs-attachment-remove-hover - Remove button hover background. Aliased to
3331
- * `--bs-button-neutral-hover`.
3332
- * @prop --bs-attachment-remove-pressed - Remove button active/pressed background. Aliased to
3333
- * `--bs-button-neutral-pressed`.
3334
- * @prop --bs-attachment-remove-focus - Remove button focus outline color. Aliased to
3335
- * `--bs-border-neutral-focus`.
3336
5746
  */
3337
5747
  "bs-attachment": LocalJSX.IntrinsicElements["bs-attachment"] & JSXBase.HTMLAttributes<HTMLBsAttachmentElement>;
3338
5748
  /**
@@ -3356,6 +5766,26 @@ declare module "@stencil/core" {
3356
5766
  * hover/focus once the row is scrollable. Aliased to `--bs-neutral-300`.
3357
5767
  */
3358
5768
  "bs-attachment-list": LocalJSX.IntrinsicElements["bs-attachment-list"] & JSXBase.HTMLAttributes<HTMLBsAttachmentListElement>;
5769
+ /**
5770
+ * A circular representation of a person or entity -- a photo, initials, or (as a fallback when
5771
+ * neither is available) a generic user-silhouette icon.
5772
+ * ## When to use
5773
+ * - Representing a specific user or account: in a header, a comment, a member list, etc.
5774
+ * - `type="initials"` when a photo isn't available but a name is (e.g. "Sam Lee" -> "SL").
5775
+ * - `type="icon"` (the default) as the generic fallback when neither a photo nor a name/initials
5776
+ * is available yet.
5777
+ * ## When not to use
5778
+ * - A company/brand logo -- use `bs-logo` instead.
5779
+ * This component is decorative/informational by default, not an interactive control -- it renders
5780
+ * a plain `<span>`/`<img>`, not a `<button>`. Figma's own component set includes hover/focused/
5781
+ * pressed states (e.g. for an account-switcher trigger use case), which this implements as real
5782
+ * `:hover`/`:focus-visible`/`:active` CSS on the host itself -- so wrapping this in your own
5783
+ * `<button>`, or setting `tabindex` and a click handler on the `<bs-avatar>` element directly, gets
5784
+ * the matching visual treatment for free with no extra wiring. Left genuinely non-interactive
5785
+ * (no implicit role/tabindex of its own) so it doesn't misrepresent a purely decorative avatar
5786
+ * (e.g. next to a comment) as a control when it isn't one.
5787
+ */
5788
+ "bs-avatar": LocalJSX.IntrinsicElements["bs-avatar"] & JSXBase.HTMLAttributes<HTMLBsAvatarElement>;
3359
5789
  /**
3360
5790
  * A small status or category pill, usually paired with a label or list item.
3361
5791
  * ## When to use
@@ -3366,6 +5796,67 @@ declare module "@stencil/core" {
3366
5796
  * - For long text — badges are sized for one or two words.
3367
5797
  */
3368
5798
  "bs-badge": LocalJSX.IntrinsicElements["bs-badge"] & JSXBase.HTMLAttributes<HTMLBsBadgeElement>;
5799
+ /**
5800
+ * A single crumb within a `<bs-breadcrumbs>` trail: a leading separator icon plus either a link,
5801
+ * plain text, or the current-page label, depending on `current`/`href`.
5802
+ * Rendering follows the W3C ARIA Authoring Practices breadcrumb pattern
5803
+ * (https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/): the current page is marked
5804
+ * `aria-current="page"` and is never a link -- this holds even when `href` is also set, unlike
5805
+ * Carbon Design System's `cds-breadcrumb-item`, which allows a link on the current item.
5806
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
5807
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
5808
+ * accessibility tree needs this explicit role to preserve the list's semantics.
5809
+ * ## When to use
5810
+ * - As one crumb inside a `<bs-breadcrumbs>` trail.
5811
+ * ## When not to use
5812
+ * - Standalone, outside a `<bs-breadcrumbs>` wrapper -- its `<ol>`/`<nav>` context and
5813
+ * first-child-aware separator hiding depend on that parent structure.
5814
+ */
5815
+ "bs-breadcrumb": LocalJSX.IntrinsicElements["bs-breadcrumb"] & JSXBase.HTMLAttributes<HTMLBsBreadcrumbElement>;
5816
+ /**
5817
+ * A manually-placed collapsed-items disclosure for a `<bs-breadcrumbs>` trail: a leading separator
5818
+ * plus an icon-only ellipsis button that reveals a `bs-menu` popup listing every hidden crumb.
5819
+ * `items` is JS-property-only -- must be set as a JS property (`el.items = [...]`), not an HTML
5820
+ * attribute, since attributes can only carry strings. See CONVENTIONS.md.
5821
+ * Unlike an earlier `bs-breadcrumbs`-owned automatic `maxItems` collapse, this component does no
5822
+ * collapsing logic itself -- the consumer decides which crumbs to hide and places this element
5823
+ * wherever they want the disclosure, exactly matching Carbon Design System's own approach (Carbon
5824
+ * doesn't auto-collapse breadcrumbs either; a consumer there manually decides what's visible).
5825
+ * Hidden items with an `href` render as real `<a href>` rows inside the popup, not `bs-menu-item`
5826
+ * (which renders a `<button>`) -- this matters because consuming apps commonly use client-side
5827
+ * routers that intercept clicks on real `<a>` tags to do `preventDefault` + push-state navigation.
5828
+ * Rendering hidden links any other way (e.g. `window.location`) would silently break client-side
5829
+ * routing for hidden crumbs while working fine for visible ones. Hidden items without an `href`
5830
+ * render as plain non-interactive text, matching how `bs-breadcrumb` itself handles link vs.
5831
+ * no-link crumbs.
5832
+ * Sets `role="listitem"` on the host, mirroring Carbon's own `CDSBreadcrumbItem.connectedCallback()`
5833
+ * -- since this is a custom-element child of a real `<ol>` rather than a real `<li>`, the
5834
+ * accessibility tree needs this explicit role to preserve the list's semantics.
5835
+ * ## When to use
5836
+ * - Inside a `<bs-breadcrumbs>` trail, wherever the consumer wants an interactive disclosure for
5837
+ * crumbs they've chosen not to render directly.
5838
+ * ## When not to use
5839
+ * - As an automatic collapsing mechanism -- there is none; the consumer decides what's hidden.
5840
+ */
5841
+ "bs-breadcrumb-overflow": LocalJSX.IntrinsicElements["bs-breadcrumb-overflow"] & JSXBase.HTMLAttributes<HTMLBsBreadcrumbOverflowElement>;
5842
+ /**
5843
+ * A breadcrumb trail container: a real `<nav>` landmark wrapping an `<ol>`, meant to be populated
5844
+ * with slotted `<bs-breadcrumb>` (and, where the consumer wants a collapsed-items disclosure,
5845
+ * `<bs-breadcrumb-overflow>`) children -- same composition-over-configuration architecture as
5846
+ * Carbon Design System's `cds-breadcrumb`/`cds-breadcrumb-item`/`cds-breadcrumb-link`.
5847
+ * This component is intentionally thin: it owns only the `<nav>` landmark and list semantics.
5848
+ * Unlike an earlier `items`-array-driven design, there is no automatic collapsing here -- exactly
5849
+ * like Carbon, the consumer decides what's visible and manually places a `<bs-breadcrumb-overflow>`
5850
+ * wherever they want a collapsed-items disclosure. See `bs-breadcrumbs.mdx` for the consolidated
5851
+ * docs covering all three components in this feature area.
5852
+ * ## When to use
5853
+ * - Showing a user's current location within a hierarchical page structure, with a path back to
5854
+ * its ancestors.
5855
+ * ## When not to use
5856
+ * - Primary in-app navigation -- use `bs-navigation-drawer`/`bs-navigation-header` instead.
5857
+ * - A flat set of unrelated pages with no hierarchy -- breadcrumbs imply ancestry, not just history.
5858
+ */
5859
+ "bs-breadcrumbs": LocalJSX.IntrinsicElements["bs-breadcrumbs"] & JSXBase.HTMLAttributes<HTMLBsBreadcrumbsElement>;
3369
5860
  /**
3370
5861
  * A clickable action element for the single most important action in a given context.
3371
5862
  * ## When to use
@@ -3385,6 +5876,11 @@ declare module "@stencil/core" {
3385
5876
  * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
3386
5877
  * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
3387
5878
  * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
5879
+ * @prop --bs-button-neutral-border - Border color, `variant="neutral"`, default/disabled. Aliased to `--bs-border-neutral-container`.
5880
+ * @prop --bs-button-neutral-border-hover - Border color, `variant="neutral"`, hover. Aliased to `--bs-border-neutral-container-hover`.
5881
+ * @prop --bs-button-neutral-border-pressed - Border color, `variant="neutral"`, pressed. Aliased to `--bs-border-neutral-container-pressed`.
5882
+ * @prop --bs-button-padding-x-icon-side - Horizontal padding on an edge that's adjacent to a leading/trailing icon (tighter than the plain text-only edge). Aliased to `--bs-spacing-150`.
5883
+ * @prop --bs-button-padding-x-label-side - Horizontal padding on the opposite edge, when an icon on the other side needs compensating extra space to keep the button optically balanced. Aliased to `--bs-spacing-250`.
3388
5884
  */
3389
5885
  "bs-button": LocalJSX.IntrinsicElements["bs-button"] & JSXBase.HTMLAttributes<HTMLBsButtonElement>;
3390
5886
  /**
@@ -3583,6 +6079,30 @@ declare module "@stencil/core" {
3583
6079
  * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
3584
6080
  */
3585
6081
  "bs-checkbox": LocalJSX.IntrinsicElements["bs-checkbox"] & JSXBase.HTMLAttributes<HTMLBsCheckboxElement>;
6082
+ /**
6083
+ * A shape-matched loading placeholder for `bs-checkbox`, shown while the real label text isn't
6084
+ * known yet (e.g. still being fetched from an API). Renders a small square (matching the
6085
+ * checkbox's own box) beside a text-bar placeholder (standing in for the label), both pulsing
6086
+ * together, sized to match `bs-checkbox`'s `sm`/`md`/`lg` box dimensions so layout doesn't shift
6087
+ * once the real checkbox renders.
6088
+ * ## When to use
6089
+ * - In place of a `bs-checkbox` whose label/checked state depends on data that hasn't loaded yet.
6090
+ * ## When not to use
6091
+ * - While a checkbox's own change handler is running (e.g. a save request in flight) -- render the
6092
+ * real `bs-checkbox` itself; this component is not a saving-in-progress spinner.
6093
+ * @prop --bs-checkbox-skeleton-size-sm - Box width/height at `size="sm"`. Aliased to
6094
+ * `--bs-spacing-200`, mirroring `bs-checkbox`'s own `--bs-checkbox-size-sm` -- not read directly
6095
+ * from it, since these are two separate shadow roots.
6096
+ * @prop --bs-checkbox-skeleton-size-md - Box width/height at `size="md"`. Aliased to
6097
+ * `--bs-spacing-250`.
6098
+ * @prop --bs-checkbox-skeleton-size-lg - Box width/height at `size="lg"`. Aliased to
6099
+ * `--bs-spacing-300`.
6100
+ * @prop --bs-checkbox-skeleton-gap - Gap between the box and label placeholders. Aliased to
6101
+ * `--bs-spacing-100`, mirroring `bs-checkbox`'s own `--bs-checkbox-gap`.
6102
+ * @prop --bs-checkbox-skeleton-label-width - Width of the label placeholder bar. Defaults to
6103
+ * `96px`.
6104
+ */
6105
+ "bs-checkbox-skeleton": LocalJSX.IntrinsicElements["bs-checkbox-skeleton"] & JSXBase.HTMLAttributes<HTMLBsCheckboxSkeletonElement>;
3586
6106
  /**
3587
6107
  * A chat composer input for Genie AI-style conversational interfaces: a text field
3588
6108
  * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
@@ -3614,6 +6134,7 @@ declare module "@stencil/core" {
3614
6134
  * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
3615
6135
  * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
3616
6136
  * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
6137
+ * @prop --bs-composer-input-max-lines - How many lines the text field grows to before scrolling internally instead of growing further. Aliased to `10`.
3617
6138
  */
3618
6139
  "bs-composer": LocalJSX.IntrinsicElements["bs-composer"] & JSXBase.HTMLAttributes<HTMLBsComposerElement>;
3619
6140
  /**
@@ -3627,6 +6148,12 @@ declare module "@stencil/core" {
3627
6148
  * ## When not to use
3628
6149
  * - A toast/snackbar notification unrelated to the composer -- this component is not
3629
6150
  * self-dismissing and has no positioning of its own (it's a static block, not an overlay).
6151
+ * ## Accessibility
6152
+ * Sets `role="status"` for `type="info"`/`type="neutral"` and `role="alert"` for
6153
+ * `type="error"`/`type="warning"` on its own root element automatically -- no opt-in prop needed.
6154
+ * Both roles carry implicit ARIA live-region semantics (`status` is polite, `alert` is assertive),
6155
+ * so a screen reader announces the message as soon as this banner is inserted into the DOM,
6156
+ * without a consumer having to remember to add `role`/`aria-live` themselves.
3630
6157
  * @prop --bs-composer-status-banner-radius - Corner radius of the top-left/top-right corners
3631
6158
  * (bottom corners are square, so this sits flush above `bs-composer`). Aliased to
3632
6159
  * `--bs-border-radius-150`.
@@ -3686,6 +6213,66 @@ declare module "@stencil/core" {
3686
6213
  * - Deeply nested/hierarchical data — this component renders one flat row per record.
3687
6214
  */
3688
6215
  "bs-data-table": LocalJSX.IntrinsicElements["bs-data-table"] & JSXBase.HTMLAttributes<HTMLBsDataTableElement>;
6216
+ /**
6217
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
6218
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
6219
+ * ## When to use
6220
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
6221
+ * - A short, focused task that doesn't warrant navigating to a new page.
6222
+ * ## When not to use
6223
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
6224
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
6225
+ * dialog that just gets taller and taller.
6226
+ * Two additional slots cover the Figma "Dialog" component's other states: `image` (a hero image
6227
+ * across the top, close button floats over it instead of sitting in the header row) and `icon`
6228
+ * (only rendered when `centered` is set, e.g. a success checkmark above a centered heading). The
6229
+ * close button "floats" (absolute-positioned, top-right of the dialog, with its own background)
6230
+ * whenever `centered` is true or the `image` slot has content -- otherwise it's the plain inline
6231
+ * button in the header row next to the heading, same as before this addition.
6232
+ */
6233
+ "bs-dialog": LocalJSX.IntrinsicElements["bs-dialog"] & JSXBase.HTMLAttributes<HTMLBsDialogElement>;
6234
+ /**
6235
+ * A clickable, icon-only action element -- the icon-only sibling of `bs-button`, sharing the same
6236
+ * 8 visual variants and color language, but ALWAYS rendering just a single icon, never a label.
6237
+ * ## When to use
6238
+ * - A compact action where the icon alone is unambiguous (e.g. a close/dismiss control, a toolbar
6239
+ * action) and adding a text label would take up more space than the context allows.
6240
+ * - The same variant guidance as `bs-button` applies: `primary` for the single most important
6241
+ * action, `neutral`/`subtle`/`outlined` for lower-emphasis alternatives, `error` reserved for
6242
+ * destructive/irreversible actions (never `neutral`, per BrandSync guidance), `success`/
6243
+ * `warning`/`info` only when the action's own outcome is predictable and clearly communicated.
6244
+ * ## When not to use
6245
+ * - When the action isn't self-evident from the icon alone -- use `bs-button` with a visible label
6246
+ * instead, don't rely on a tooltip to compensate for an unclear icon.
6247
+ * - For navigation between pages -- use a link/nav component instead.
6248
+ * Because this component is always icon-only, `ariaLabel` is required for every real usage (not
6249
+ * just conditionally, unlike `bs-button`) -- there's no visible label text to fall back on for an
6250
+ * accessible name.
6251
+ */
6252
+ "bs-icon-button": LocalJSX.IntrinsicElements["bs-icon-button"] & JSXBase.HTMLAttributes<HTMLBsIconButtonElement>;
6253
+ /**
6254
+ * A pill-shaped tab button -- an optional leading icon plus a text label, rendered as a real
6255
+ * `<button>` so it participates correctly in tab order and native click/keyboard activation.
6256
+ * Unlike `bs-tab`'s underline indicator, selection here is communicated entirely by the pill's
6257
+ * background fill color -- there is no separate indicator element.
6258
+ * ## When to use
6259
+ * - As one button within a segmented-control-style tab bar, where exactly one tab is
6260
+ * selected/active at a time.
6261
+ * ## When not to use
6262
+ * - As a standalone action button -- use `bs-button` instead, `bs-inline-tab`'s visual language
6263
+ * (muted pill until selected/hovered) only makes sense as part of a set.
6264
+ * `selected` is NOT self-toggling -- clicking a `bs-inline-tab` only emits `bsSelect`, it does not
6265
+ * set its own `selected` prop, and it does not unselect any sibling tabs. Wrap your
6266
+ * `<bs-inline-tab>` elements in `<bs-tabs type="bs-inline-tab">` -- it owns `role="tablist"` and
6267
+ * coordinates selection (listening for `bsSelect` and setting `selected`/`false` across siblings)
6268
+ * for you. Using `bs-inline-tab` standalone, outside a `<bs-tabs>` wrapper, still means `selected`
6269
+ * doesn't self-toggle and `role="tablist"` isn't provided automatically -- a consumer doing that
6270
+ * would still need to coordinate `selected` and supply `role="tablist"` manually, same as
6271
+ * `bs-tab.mdx`/`bs-radio.mdx` document for their own components. See `bs-inline-tab.mdx`'s
6272
+ * Accessibility section for the full requirement, including `role="tabpanel"` on the corresponding
6273
+ * content panels.
6274
+ */
6275
+ "bs-inline-tab": LocalJSX.IntrinsicElements["bs-inline-tab"] & JSXBase.HTMLAttributes<HTMLBsInlineTabElement>;
3689
6276
  /**
3690
6277
  * A single-line text field with an optional label, description, and error state. Also covers a
3691
6278
  * range of related "field" shapes (number stepper, password reveal, date, dropdown trigger,
@@ -3703,6 +6290,31 @@ declare module "@stencil/core" {
3703
6290
  * options list at all (freeform chip entry).
3704
6291
  */
3705
6292
  "bs-input": LocalJSX.IntrinsicElements["bs-input"] & JSXBase.HTMLAttributes<HTMLBsInputElement>;
6293
+ /**
6294
+ * The BrandSync brand mark, as its own standalone component -- shared by `bs-navigation-header`
6295
+ * and `bs-navigation-drawer`, which used to each render their own duplicated copy of this SVG
6296
+ * (the drawer's collapsed state even faked an icon-only look by clipping the full wordmark asset
6297
+ * down to a narrowed box, rather than using a real icon-only asset).
6298
+ * ## When to use
6299
+ * - Anywhere the BrandSync logo/icon needs to render: a navigation header, a nav drawer, etc.
6300
+ * ## When not to use
6301
+ * - The Genie AI chat panel's own brand mark -- that's a different logo (`bs-chatbot-header`'s
6302
+ * own inline Genie asset), not this one.
6303
+ * `variant` mirrors Figma's "Logo" component set (node 10909:30421) `Device` property
6304
+ * ("Desktop" / "Tab and mobile"), which was originally meant to distinguish the full lockup from
6305
+ * the icon-only mark at different responsive breakpoints -- renamed here to
6306
+ * `variant: 'full' | 'mark'` since that's what it actually controls (how much of the logo
6307
+ * renders), not literally a device/breakpoint switch.
6308
+ * `variant="custom"` is not a Figma variant at all -- it's an escape hatch for a consuming app
6309
+ * that needs to show a DIFFERENT product's logo in the same slot (e.g. a white-labeled deployment,
6310
+ * or a logo fetched at runtime from a service like brand.dev), via `src`/`alt`, instead of the
6311
+ * built-in BrandSync assets. This component deliberately does NOT fetch that image itself --
6312
+ * network calls, loading/error states, and caching are the consuming app's responsibility, same as
6313
+ * every other component in this library (e.g. `bs-attachment` takes `imageSrc` rather than fetching
6314
+ * an image on its own). `background` has no effect on `variant="custom"` -- a consumer's own image
6315
+ * is already designed for whatever surface it's placed on.
6316
+ */
6317
+ "bs-logo": LocalJSX.IntrinsicElements["bs-logo"] & JSXBase.HTMLAttributes<HTMLBsLogoElement>;
3706
6318
  /**
3707
6319
  * A generic dropdown/popup menu container: a rounded, elevated list of items (typically
3708
6320
  * `bs-menu-item` elements).
@@ -3743,17 +6355,151 @@ declare module "@stencil/core" {
3743
6355
  */
3744
6356
  "bs-menu-item": LocalJSX.IntrinsicElements["bs-menu-item"] & JSXBase.HTMLAttributes<HTMLBsMenuItemElement>;
3745
6357
  /**
3746
- * An overlay dialog that interrupts the current flow for a focused task or confirmation.
3747
- * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
6358
+ * A left-side persistent navigation sidebar: the BrandSync logo, a "Main Menu" title with a
6359
+ * collapse toggle, a reserved slot for a search field, and a scrollable list of nav items.
3748
6360
  * ## When to use
3749
- * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
3750
- * - A short, focused task that doesn't warrant navigating to a new page.
6361
+ * - The primary in-app navigation, shown alongside `bs-navigation-header` (typically that
6362
+ * header's `with-navigation-drawer` alignment, which omits its own logo since this component
6363
+ * already renders one -- or the reverse pairing, this drawer's own `showLogo={false}` alongside
6364
+ * a header that keeps its logo instead, see that prop's own docs).
3751
6365
  * ## When not to use
3752
- * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
3753
- * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
3754
- * modal that just gets taller and taller.
6366
+ * - The top navigation bar itself -- use `bs-navigation-header` instead.
6367
+ * This component renders a real `<nav>` landmark (no explicit `role` needed -- `<nav>` already
6368
+ * carries the implicit `navigation` role), labeled via `aria-label={heading}` so the landmark
6369
+ * still has a name even when collapsed (see below).
6370
+ * `collapsed` narrows the drawer to a 96px icon-only rail, per Figma node 8028:135374
6371
+ * ("Type=Collapsed"): the title text disappears, the logo swaps from the full "EG BrandSync"
6372
+ * wordmark (`bs-logo variant="full"`) to the real icon-only mark (`bs-logo variant="mark"` -- a
6373
+ * second, properly-designed asset, not a CSS crop of the full one) via CSS visibility toggling on
6374
+ * both, the same `:host([collapsed])` attribute-selector pattern already used for the
6375
+ * `search`/`search-trigger` swap below, the `search` slot is replaced by a compact built-in
6376
+ * search-trigger button (this component can't meaningfully shrink arbitrary slotted search-field
6377
+ * content down to icon size itself, so it emits `bsSearchClick` instead -- e.g. to open a full
6378
+ * search overlay), and every top-level
6379
+ * `bs-navigation-drawer-item`'s layout switches from icon-beside-label to icon-above-caption.
6380
+ * That last part is real prop propagation, not a CSS trick: this component keeps each direct-child
6381
+ * item's own `collapsed` prop in sync with its own (see `syncItemsCollapsed` below), the same
6382
+ * direct-children-prop-sync approach `bs-tabs` already uses for coordinating `selected` across its
6383
+ * `bs-tab` children. Clicking the toggle self-toggles `collapsed` (simple local UI state, not
6384
+ * something needing cross-component coordination -- closer to `bs-switch`'s self-toggling
6385
+ * `checked` than `bs-tab`'s non-self-toggling `selected`) and emits `bsCollapse` with the new
6386
+ * value. The toggle's own caret icon does NOT rotate when collapsed -- Figma's collapsed mock
6387
+ * reuses the identical left-pointing "CaretLeft" asset unchanged, confirmed by directly inspecting
6388
+ * that state, so this deliberately does not add the same "flip on toggle" idiom the drawer item's
6389
+ * own disclosure chevron does (that one really is an unconfirmed addition; this one was checked).
6390
+ */
6391
+ "bs-navigation-drawer": LocalJSX.IntrinsicElements["bs-navigation-drawer"] & JSXBase.HTMLAttributes<HTMLBsNavigationDrawerElement>;
6392
+ /**
6393
+ * A single row within a `bs-navigation-drawer`'s item list -- either a plain leaf nav item, or an
6394
+ * `expandable` group header that discloses nested `bs-navigation-drawer-item` children.
6395
+ * ## When to use
6396
+ * - Every row inside a `bs-navigation-drawer`'s default slot.
6397
+ * ## When not to use
6398
+ * - A standalone action outside a navigation drawer -- use `bs-button`/`bs-menu-item` instead.
6399
+ * Click behavior is mutually exclusive, based on `expandable`:
6400
+ * - `expandable = false` (a plain leaf item): clicking only emits `bsSelect`. `selected` is NOT
6401
+ * self-toggling -- same non-self-toggling precedent as `bs-tab`'s `selected` (see `bs-tab.tsx`'s
6402
+ * class doc): coordinating which sibling row is selected needs cross-item state a
6403
+ * consumer/wrapper owns, not something this component can reason about on its own.
6404
+ * - `expandable = true` (a group header, never shown with a `selected` tint): clicking toggles
6405
+ * `this.expanded` directly and emits `bsToggle` with the new value, and does NOT emit
6406
+ * `bsSelect`. This IS self-toggling, unlike `selected` above -- it's simple local disclosure
6407
+ * state with no cross-item coordination needed, closer to `bs-switch`'s self-toggling `checked`
6408
+ * than `bs-tab`'s non-self-toggling `selected`.
6409
+ * Nesting: put child `<bs-navigation-drawer-item nested>` elements inside a parent
6410
+ * `<bs-navigation-drawer-item expandable>` with `slot="children"`. The parent shows/hides that
6411
+ * slot's content based on its own `expanded` prop, via a pure-CSS attribute selector (no JS
6412
+ * visibility toggling needed, since `expanded` is reflected).
6413
+ * `collapsed` switches this row from its normal icon-beside-label row layout to a compact
6414
+ * icon-above-caption column (per Figma node 8028:135374, the drawer's "Type=Collapsed" state) --
6415
+ * you don't need to set this yourself on every item: a parent `bs-navigation-drawer` keeps its own
6416
+ * top-level items' `collapsed` prop in sync with its own `collapsed` state automatically (see
6417
+ * `bs-navigation-drawer.tsx`'s `syncItemsCollapsed`, the same direct-children-prop-sync approach
6418
+ * `bs-tabs` uses for coordinating `selected` across its own `bs-tab` children). It's still a public
6419
+ * prop so a standalone item (or this component's own stories) can be demoed without the parent.
6420
+ */
6421
+ "bs-navigation-drawer-item": LocalJSX.IntrinsicElements["bs-navigation-drawer-item"] & JSXBase.HTMLAttributes<HTMLBsNavigationDrawerItemElement>;
6422
+ /**
6423
+ * The top-level navigation bar for a page: the BrandSync logo plus two consumer-provided slots
6424
+ * for menu/action content (e.g. `bs-button`/`bs-icon-button` elements).
6425
+ * ## When to use
6426
+ * - The persistent top bar of an application, above the page content.
6427
+ * ## When not to use
6428
+ * - The header of a Genie AI chat panel -- use `bs-chatbot-header` instead, which is purpose-built
6429
+ * for that narrower layout and its own fixed action buttons.
6430
+ * `alignment` controls both whether the logo renders and how the two slots are laid out:
6431
+ * - `default` (default): logo on the left, `left` slot content immediately after it, `right` slot
6432
+ * content pushed to the far right.
6433
+ * - `center`: logo and `right` slot both grow equally (`flex: 1`), which centers the `left` slot
6434
+ * content in the middle of the bar.
6435
+ * - `with-navigation-drawer`: no logo at all (this variant assumes a nav-drawer toggle is the
6436
+ * leftmost thing on the page instead) -- `left` slot content starts at the bar's own left edge,
6437
+ * `right` slot content pushed to the far right.
6438
+ */
6439
+ "bs-navigation-header": LocalJSX.IntrinsicElements["bs-navigation-header"] & JSXBase.HTMLAttributes<HTMLBsNavigationHeaderElement>;
6440
+ /**
6441
+ * A numbered page control -- previous/next chevrons, page-number buttons, and `...` overflow for
6442
+ * large page counts. Matches the Figma "Pagination" component's "Default" type (the classic
6443
+ * numbered pagination); its other type ("jumper" -- a rows-per-page dropdown plus a page-jump
6444
+ * input) is a structurally different composite widget and isn't covered by this component.
6445
+ * `totalPages`/`currentPage` drive everything -- this computes which page numbers to show and
6446
+ * where to collapse into `...` itself, the consumer never builds the button list by hand.
6447
+ * ## When to use
6448
+ * - Paging through a large, ordered result set (a table, a search results list) where jumping
6449
+ * directly to a specific page number is useful.
6450
+ * ## When not to use
6451
+ * - Infinite-scroll or "load more" patterns -- those don't have a fixed, addressable page number.
6452
+ * - A huge page count where users realistically only ever go forward/back one page at a time --
6453
+ * plain prev/next controls (no numbers) are simpler there.
6454
+ */
6455
+ "bs-pagination": LocalJSX.IntrinsicElements["bs-pagination"] & JSXBase.HTMLAttributes<HTMLBsPaginationElement>;
6456
+ /**
6457
+ * A single radio button with its label, for one mutually-exclusive choice within a group.
6458
+ * ## When to use
6459
+ * - One option within a set of mutually-exclusive choices, where all options should stay visible
6460
+ * (a radio group).
6461
+ * ## When not to use
6462
+ * - An independent, non-exclusive binary choice, or one item in a set of independent choices --
6463
+ * use `bs-checkbox` instead.
6464
+ * - An on/off setting that takes effect immediately (no explicit form submission) -- use `bs-switch`.
6465
+ */
6466
+ "bs-radio": LocalJSX.IntrinsicElements["bs-radio"] & JSXBase.HTMLAttributes<HTMLBsRadioElement>;
6467
+ /**
6468
+ * A slider for picking a single numeric value (`type="default"`), a value snapped to evenly
6469
+ * spaced ticks (`type="segmented"`), or a min/max pair (`type="range"`) from within a bounded
6470
+ * `min`/`max` range.
6471
+ * ## When to use
6472
+ * - A numeric value that's easiest to reason about relative to its bounds (volume, brightness,
6473
+ * a price range) rather than typed digit-by-digit.
6474
+ * - `type="segmented"` when only a fixed number of discrete stops make sense (e.g. a 5-star
6475
+ * rating-like scale) but a visual track is still preferable to discrete buttons.
6476
+ * - `type="range"` for picking a min/max pair (e.g. a price range filter) with two thumbs.
6477
+ * ## When not to use
6478
+ * - A precise value where mis-dragging by a pixel matters more than the at-a-glance bounds --
6479
+ * use `bs-input[type="number"]` instead.
6480
+ * - A small, fixed set of mutually exclusive choices -- use a radio group instead.
6481
+ */
6482
+ "bs-slider": LocalJSX.IntrinsicElements["bs-slider"] & JSXBase.HTMLAttributes<HTMLBsSliderElement>;
6483
+ /**
6484
+ * A transient status bar for confirming the result of an action (e.g. "Files uploaded
6485
+ * successfully.") -- an icon (or loading spinner), a message, an optional action, and a close
6486
+ * button.
6487
+ * This component only renders the bar itself -- it doesn't manage its own visibility, timing, or
6488
+ * stacking. A consumer (typically a small "toast manager" utility) creates one per message and
6489
+ * removes it from the DOM again, whether on a timer or on `bsDismiss`. Figma's spec doesn't show
6490
+ * auto-dismiss timing at all (it's a static visual spec), so this deliberately doesn't invent one.
6491
+ * The icon is always the same checkmark glyph across every `variant`, just recolored -- matching
6492
+ * the Figma spec exactly, even though a checkmark for `variant="error"` reads a little oddly
6493
+ * semantically. Worth revisiting with severity-specific icons (warning triangle, error circle,
6494
+ * etc.) if the design updates to specify them.
6495
+ * ## When to use
6496
+ * - Confirming the outcome of an action that just happened (save succeeded, upload failed) without
6497
+ * interrupting the user's flow.
6498
+ * ## When not to use
6499
+ * - For a response that requires the user to make a decision before continuing -- use `bs-dialog`.
6500
+ * - For persistent, always-visible status -- a snackbar is inherently transient.
3755
6501
  */
3756
- "bs-modal": LocalJSX.IntrinsicElements["bs-modal"] & JSXBase.HTMLAttributes<HTMLBsModalElement>;
6502
+ "bs-snackbar": LocalJSX.IntrinsicElements["bs-snackbar"] & JSXBase.HTMLAttributes<HTMLBsSnackbarElement>;
3757
6503
  /**
3758
6504
  * A single citation row inside `bs-chatbot-sources-drawer` -- a file icon + filename on the first
3759
6505
  * line, the originating system and version on the second, and a trailing "open" arrow.
@@ -3780,6 +6526,54 @@ declare module "@stencil/core" {
3780
6526
  * `--bs-text-secondary`.
3781
6527
  */
3782
6528
  "bs-source-link": LocalJSX.IntrinsicElements["bs-source-link"] & JSXBase.HTMLAttributes<HTMLBsSourceLinkElement>;
6529
+ /**
6530
+ * A toggle switch for an on/off setting that takes effect immediately (no explicit form
6531
+ * submission required).
6532
+ * ## When to use
6533
+ * - A binary setting that applies right away (e.g. "Enable notifications", "Dark mode").
6534
+ * ## When not to use
6535
+ * - A binary choice that's part of a form submitted later, or one item within a group of
6536
+ * independent choices -- use `bs-checkbox` instead.
6537
+ * - A single mutually-exclusive choice from a set -- use a radio group instead.
6538
+ */
6539
+ "bs-switch": LocalJSX.IntrinsicElements["bs-switch"] & JSXBase.HTMLAttributes<HTMLBsSwitchElement>;
6540
+ /**
6541
+ * A single tab button -- an optional icon plus a text label, rendered as a real `<button>` so it
6542
+ * participates correctly in tab order and native click/keyboard activation.
6543
+ * ## When to use
6544
+ * - As one button within a tab bar, where exactly one tab is selected/active at a time.
6545
+ * ## When not to use
6546
+ * - As a standalone action button -- use `bs-button` instead, `bs-tab`'s visual language (muted
6547
+ * until selected/hovered, underline indicator) only makes sense as part of a set.
6548
+ * `selected` is NOT self-toggling -- clicking a `bs-tab` only emits `bsSelect`, it does not set its
6549
+ * own `selected` prop, and it does not unselect any sibling tabs. Wrap your `<bs-tab>` elements in
6550
+ * `<bs-tabs type="bs-tab">` -- it owns `role="tablist"` and coordinates selection (listening for
6551
+ * `bsSelect` and setting `selected`/`false` across siblings) for you. Using `bs-tab` standalone,
6552
+ * outside a `<bs-tabs>` wrapper, still means `selected` doesn't self-toggle and `role="tablist"`
6553
+ * isn't provided automatically -- a consumer doing that would still need to coordinate `selected`
6554
+ * and supply `role="tablist"` manually, same as `bs-radio.mdx` documents for `bs-radio`'s missing
6555
+ * `bs-radio-group`. See `bs-tab.mdx`'s Accessibility section for the full requirement, including
6556
+ * `role="tabpanel"` on the corresponding content panels.
6557
+ */
6558
+ "bs-tab": LocalJSX.IntrinsicElements["bs-tab"] & JSXBase.HTMLAttributes<HTMLBsTabElement>;
6559
+ /**
6560
+ * A tab-group wrapper: owns `role="tablist"` and coordinates selection across its slotted
6561
+ * `<bs-tab>` or `<bs-inline-tab>` children, so consumers no longer have to hand-roll this.
6562
+ * `bs-tab.mdx`/`bs-inline-tab.mdx` previously documented this coordination -- listening for
6563
+ * `bsSelect` and setting `selected`/`false` on siblings, plus supplying `role="tablist"` on
6564
+ * whatever element groups the tabs -- as a "Known gap"/manual consumer responsibility. This
6565
+ * component is that wrapper: it renders the `role="tablist"` element and listens for `bsSelect`
6566
+ * itself. Using `<bs-tab>`/`<bs-inline-tab>` standalone, outside a `<bs-tabs>` wrapper, still means
6567
+ * `selected` doesn't self-toggle -- a consumer doing that would still need to coordinate `selected`
6568
+ * manually -- but that's no longer the first recommended path.
6569
+ * ## When to use
6570
+ * - Wrapping a set of `<bs-tab>` (underline style) or `<bs-inline-tab>` (pill style) elements that
6571
+ * should behave as a single-selection tab bar.
6572
+ * ## When not to use
6573
+ * - For a single, standalone tab button not participating in a group -- use `bs-tab`/`bs-inline-tab`
6574
+ * directly.
6575
+ */
6576
+ "bs-tabs": LocalJSX.IntrinsicElements["bs-tabs"] & JSXBase.HTMLAttributes<HTMLBsTabsElement>;
3783
6577
  /**
3784
6578
  * A dark tooltip bubble with a pointer arrow, used to surface a short hint of extra information
3785
6579
  * next to a trigger element.