@brandsync/wc 0.0.12 → 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 (310) hide show
  1. package/custom-elements.json +1672 -226
  2. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  3. package/dist/brandsync-wc/p-00bb9bda.entry.js +1 -0
  4. package/dist/brandsync-wc/{p-64e2a7d7.entry.js → p-0847f5c0.entry.js} +1 -1
  5. package/dist/brandsync-wc/p-0ba35c3b.entry.js +1 -0
  6. package/dist/brandsync-wc/{p-2a65aabb.entry.js → p-0f3cb0c4.entry.js} +1 -1
  7. package/dist/brandsync-wc/{p-72a33f88.entry.js → p-10f6f3cd.entry.js} +1 -1
  8. package/dist/brandsync-wc/{p-88a0abee.entry.js → p-111974df.entry.js} +1 -1
  9. package/dist/brandsync-wc/{p-ef8522b5.entry.js → p-11f3fceb.entry.js} +1 -1
  10. package/dist/brandsync-wc/p-171fed0c.entry.js +1 -0
  11. package/dist/brandsync-wc/{p-57fdbb76.entry.js → p-18813680.entry.js} +1 -1
  12. package/dist/brandsync-wc/{p-f04db1b0.entry.js → p-1b7c9928.entry.js} +1 -1
  13. package/dist/brandsync-wc/p-1ce7dd64.entry.js +1 -0
  14. package/dist/brandsync-wc/p-2063a6d6.entry.js +1 -0
  15. package/dist/brandsync-wc/{p-1900f6ce.entry.js → p-20c24179.entry.js} +1 -1
  16. package/dist/brandsync-wc/{p-6e854e92.entry.js → p-321ed4d3.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-0eee5477.entry.js → p-38aad266.entry.js} +1 -1
  18. package/dist/brandsync-wc/{p-1c6fa697.entry.js → p-43e37883.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-8049f9f2.entry.js → p-55a8d4b5.entry.js} +1 -1
  20. package/dist/brandsync-wc/p-59ac2495.entry.js +1 -0
  21. package/dist/brandsync-wc/p-5ae9e60e.entry.js +1 -0
  22. package/dist/brandsync-wc/{p-8b662ee3.entry.js → p-6b469b2d.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-56c66448.entry.js → p-6d85fba4.entry.js} +1 -1
  24. package/dist/brandsync-wc/{p-46ddc8e1.entry.js → p-6e95eb36.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-20dbc6a1.entry.js → p-73217b90.entry.js} +1 -1
  26. package/dist/brandsync-wc/p-752c04c8.entry.js +1 -0
  27. package/dist/brandsync-wc/{p-12ec9e92.entry.js → p-79af762c.entry.js} +1 -1
  28. package/dist/brandsync-wc/p-81d49240.entry.js +1 -0
  29. package/dist/brandsync-wc/{p-3b31f7c7.entry.js → p-91551e7b.entry.js} +1 -1
  30. package/dist/brandsync-wc/p-917a5bbc.entry.js +1 -0
  31. package/dist/brandsync-wc/{p-dd09d335.entry.js → p-9876e83c.entry.js} +1 -1
  32. package/dist/brandsync-wc/{p-c320b6b4.entry.js → p-9bcd99aa.entry.js} +1 -1
  33. package/dist/brandsync-wc/{p-d4e3ca77.entry.js → p-9c4768aa.entry.js} +1 -1
  34. package/dist/brandsync-wc/{p-DST5-cTx.js → p-Do3l4of3.js} +2 -2
  35. package/dist/brandsync-wc/{p-0fa017ce.entry.js → p-aa43d478.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-a5b15061.entry.js → p-c3079ad7.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-23457a21.entry.js → p-c3c383dc.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-b24a980b.entry.js → p-cc79e75f.entry.js} +1 -1
  39. package/dist/brandsync-wc/p-ce7fc368.entry.js +1 -0
  40. package/dist/brandsync-wc/{p-2c51d738.entry.js → p-d3265e70.entry.js} +1 -1
  41. package/dist/brandsync-wc/p-d55bbcec.entry.js +1 -0
  42. package/dist/brandsync-wc/{p-1adc59be.entry.js → p-e93e944b.entry.js} +1 -1
  43. package/dist/brandsync-wc/{p-aba300a9.entry.js → p-eb04c578.entry.js} +1 -1
  44. package/dist/brandsync-wc/p-f0ae2740.entry.js +1 -0
  45. package/dist/brandsync-wc/p-f4f22015.entry.js +1 -0
  46. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  47. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +2 -2
  48. package/dist/cjs/bs-ai-greeting.cjs.entry.js +2 -2
  49. package/dist/cjs/bs-ai-thinking.cjs.entry.js +2 -2
  50. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  51. package/dist/cjs/bs-attachment.cjs.entry.js +1 -1
  52. package/dist/cjs/bs-avatar.cjs.entry.js +60 -0
  53. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  54. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +56 -0
  55. package/dist/cjs/bs-breadcrumb.cjs.entry.js +33 -0
  56. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +49 -0
  57. package/dist/cjs/bs-button-skeleton.cjs.entry.js +2 -2
  58. package/dist/cjs/bs-button.cjs.entry.js +2 -2
  59. package/dist/cjs/bs-card.cjs.entry.js +10 -3
  60. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +2 -2
  61. package/dist/cjs/bs-chatbot-header.cjs.entry.js +2 -2
  62. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +2 -2
  63. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +2 -2
  64. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +2 -2
  65. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +20 -0
  66. package/dist/cjs/bs-checkbox.cjs.entry.js +2 -2
  67. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +2 -2
  68. package/dist/cjs/bs-composer.cjs.entry.js +2 -2
  69. package/dist/cjs/bs-data-table.cjs.entry.js +3 -3
  70. package/dist/cjs/bs-dialog.cjs.entry.js +110 -0
  71. package/dist/cjs/bs-icon-button.cjs.entry.js +2 -2
  72. package/dist/cjs/bs-inline-tab.cjs.entry.js +2 -2
  73. package/dist/cjs/bs-input.cjs.entry.js +24 -12
  74. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  75. package/dist/cjs/{bs-menu_2.cjs.entry.js → bs-menu-item.cjs.entry.js} +2 -15
  76. package/dist/cjs/bs-menu.cjs.entry.js +17 -0
  77. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +3 -3
  78. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +8 -2
  79. package/dist/cjs/bs-navigation-header.cjs.entry.js +2 -2
  80. package/dist/cjs/bs-pagination.cjs.entry.js +85 -0
  81. package/dist/cjs/bs-radio.cjs.entry.js +2 -2
  82. package/dist/cjs/bs-slider.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-snackbar.cjs.entry.js +41 -0
  84. package/dist/cjs/bs-source-link.cjs.entry.js +3 -3
  85. package/dist/cjs/bs-switch.cjs.entry.js +2 -2
  86. package/dist/cjs/bs-tab.cjs.entry.js +2 -2
  87. package/dist/cjs/bs-tabs.cjs.entry.js +2 -2
  88. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  89. package/dist/cjs/{index-B3sdhEGk.js → index-DHVw-IPK.js} +1 -0
  90. package/dist/cjs/loader.cjs.js +2 -2
  91. package/dist/collection/collection-manifest.json +8 -1
  92. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  93. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  94. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  95. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  96. package/dist/collection/components/bs-avatar/bs-avatar.cmp.test.js +54 -0
  97. package/dist/collection/components/bs-avatar/bs-avatar.css +197 -0
  98. package/dist/collection/components/bs-avatar/bs-avatar.js +251 -0
  99. package/dist/collection/components/bs-avatar/bs-avatar.stories.js +67 -0
  100. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.cmp.test.js +62 -0
  101. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.css +93 -0
  102. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.js +130 -0
  103. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.cmp.test.js +118 -0
  104. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.css +125 -0
  105. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.js +192 -0
  106. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.cmp.test.js +58 -0
  107. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.css +18 -0
  108. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +129 -0
  109. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.stories.js +84 -0
  110. package/dist/collection/components/bs-button/bs-button/bs-button.js +1 -1
  111. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +1 -1
  112. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  113. package/dist/collection/components/bs-card/bs-card.cmp.test.js +19 -0
  114. package/dist/collection/components/bs-card/bs-card.css +37 -5
  115. package/dist/collection/components/bs-card/bs-card.js +18 -2
  116. package/dist/collection/components/bs-card/bs-card.stories.js +17 -1
  117. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  118. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  119. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  120. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.css +1 -1
  121. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  122. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  123. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.cmp.test.js +23 -0
  124. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.css +64 -0
  125. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +81 -0
  126. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.stories.js +25 -0
  127. package/dist/collection/components/bs-checkbox/bs-checkbox.js +1 -1
  128. package/dist/collection/components/bs-checkbox/bs-checkbox.stories.js +12 -0
  129. package/dist/collection/components/bs-composer/bs-composer.js +1 -1
  130. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +1 -1
  131. package/dist/collection/components/bs-data-table/bs-data-table.js +2 -2
  132. package/dist/collection/components/{bs-modal/bs-modal.cmp.test.js → bs-dialog/bs-dialog.cmp.test.js} +63 -19
  133. package/dist/collection/components/bs-dialog/bs-dialog.css +130 -0
  134. package/dist/collection/components/bs-dialog/bs-dialog.js +273 -0
  135. package/dist/collection/components/bs-dialog/bs-dialog.stories.js +115 -0
  136. package/dist/collection/components/bs-input/bs-input.cmp.test.js +20 -0
  137. package/dist/collection/components/bs-input/bs-input.css +80 -2
  138. package/dist/collection/components/bs-input/bs-input.js +28 -10
  139. package/dist/collection/components/bs-input/bs-input.stories.js +14 -11
  140. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  141. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  142. package/dist/collection/components/bs-pagination/bs-pagination.cmp.test.js +102 -0
  143. package/dist/collection/components/bs-pagination/bs-pagination.css +120 -0
  144. package/dist/collection/components/bs-pagination/bs-pagination.js +233 -0
  145. package/dist/collection/components/bs-pagination/bs-pagination.stories.js +43 -0
  146. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  147. package/dist/collection/components/bs-slider/bs-slider.js +1 -1
  148. package/dist/collection/components/bs-snackbar/bs-snackbar.cmp.test.js +77 -0
  149. package/dist/collection/components/bs-snackbar/bs-snackbar.css +321 -0
  150. package/dist/collection/components/bs-snackbar/bs-snackbar.js +172 -0
  151. package/dist/collection/components/bs-snackbar/bs-snackbar.stories.js +59 -0
  152. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  153. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  154. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  155. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  156. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  157. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  158. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.cmp.test.js +12 -0
  159. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +34 -6
  160. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.stories.js +74 -2
  161. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.css +5 -5
  162. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  163. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  164. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.stories.js +258 -1
  165. package/dist/components/bs-ai-disclaimer.js +1 -1
  166. package/dist/components/bs-ai-greeting.js +1 -1
  167. package/dist/components/bs-ai-thinking.js +1 -1
  168. package/dist/components/bs-attachment-list.js +1 -1
  169. package/dist/components/bs-attachment.js +1 -1
  170. package/dist/components/{bs-modal.d.ts → bs-avatar.d.ts} +4 -4
  171. package/dist/components/bs-avatar.js +1 -0
  172. package/dist/components/bs-badge.js +1 -1
  173. package/dist/components/bs-breadcrumb-overflow.d.ts +11 -0
  174. package/dist/components/bs-breadcrumb-overflow.js +1 -0
  175. package/dist/components/bs-breadcrumb.d.ts +11 -0
  176. package/dist/components/bs-breadcrumb.js +1 -0
  177. package/dist/components/bs-breadcrumbs.d.ts +11 -0
  178. package/dist/components/bs-breadcrumbs.js +1 -0
  179. package/dist/components/bs-button-skeleton.js +1 -1
  180. package/dist/components/bs-button.js +1 -1
  181. package/dist/components/bs-card.js +1 -1
  182. package/dist/components/bs-chatbot-feedback.js +1 -1
  183. package/dist/components/bs-chatbot-header.js +1 -1
  184. package/dist/components/bs-chatbot-response-action.js +1 -1
  185. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  186. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  187. package/dist/components/bs-checkbox-skeleton.d.ts +11 -0
  188. package/dist/components/bs-checkbox-skeleton.js +1 -0
  189. package/dist/components/bs-checkbox.js +1 -1
  190. package/dist/components/bs-composer-status-banner.js +1 -1
  191. package/dist/components/bs-composer.js +1 -1
  192. package/dist/components/bs-data-table.js +1 -1
  193. package/dist/components/bs-dialog.d.ts +11 -0
  194. package/dist/components/bs-dialog.js +1 -0
  195. package/dist/components/bs-icon-button.js +1 -1
  196. package/dist/components/bs-inline-tab.js +1 -1
  197. package/dist/components/bs-input.js +1 -1
  198. package/dist/components/bs-logo.js +1 -1
  199. package/dist/components/bs-menu-item.js +1 -1
  200. package/dist/components/bs-menu.js +1 -1
  201. package/dist/components/bs-navigation-drawer-item.js +1 -1
  202. package/dist/components/bs-navigation-drawer.js +1 -1
  203. package/dist/components/bs-navigation-header.js +1 -1
  204. package/dist/components/bs-pagination.d.ts +11 -0
  205. package/dist/components/bs-pagination.js +1 -0
  206. package/dist/components/bs-radio.js +1 -1
  207. package/dist/components/bs-slider.js +1 -1
  208. package/dist/components/bs-snackbar.d.ts +11 -0
  209. package/dist/components/bs-snackbar.js +1 -0
  210. package/dist/components/bs-source-link.js +1 -1
  211. package/dist/components/bs-switch.js +1 -1
  212. package/dist/components/bs-tab.js +1 -1
  213. package/dist/components/bs-tabs.js +1 -1
  214. package/dist/components/bs-tooltip.js +1 -1
  215. package/dist/components/index.js +1 -1
  216. package/dist/components/{p-BAOJc0V0.js → p-BFcVSpES.js} +1 -1
  217. package/dist/components/{p-Be1Pfcnm.js → p-BJZYe7M4.js} +1 -1
  218. package/dist/components/{p-CaWqTQBZ.js → p-BKaZWFE1.js} +1 -1
  219. package/dist/components/{p-DivZLd6i.js → p-BtX5URLk.js} +1 -1
  220. package/dist/components/{p-BqYyMGrB.js → p-CgaPcyEJ.js} +1 -1
  221. package/dist/components/{p-xfx69LQx.js → p-qK1XlpTA.js} +1 -1
  222. package/dist/esm/brandsync-wc.js +3 -3
  223. package/dist/esm/bs-ai-disclaimer.entry.js +2 -2
  224. package/dist/esm/bs-ai-greeting.entry.js +2 -2
  225. package/dist/esm/bs-ai-thinking.entry.js +2 -2
  226. package/dist/esm/bs-attachment-list.entry.js +2 -2
  227. package/dist/esm/bs-attachment.entry.js +1 -1
  228. package/dist/esm/bs-avatar.entry.js +58 -0
  229. package/dist/esm/bs-badge.entry.js +1 -1
  230. package/dist/esm/bs-breadcrumb-overflow.entry.js +54 -0
  231. package/dist/esm/bs-breadcrumb.entry.js +31 -0
  232. package/dist/esm/bs-breadcrumbs.entry.js +47 -0
  233. package/dist/esm/bs-button-skeleton.entry.js +2 -2
  234. package/dist/esm/bs-button.entry.js +2 -2
  235. package/dist/esm/bs-card.entry.js +10 -3
  236. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  237. package/dist/esm/bs-chatbot-header.entry.js +2 -2
  238. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  239. package/dist/esm/bs-chatbot-sources-drawer.entry.js +2 -2
  240. package/dist/esm/bs-chatbot-suggestion-button.entry.js +2 -2
  241. package/dist/esm/bs-checkbox-skeleton.entry.js +18 -0
  242. package/dist/esm/bs-checkbox.entry.js +2 -2
  243. package/dist/esm/bs-composer-status-banner.entry.js +2 -2
  244. package/dist/esm/bs-composer.entry.js +2 -2
  245. package/dist/esm/bs-data-table.entry.js +3 -3
  246. package/dist/esm/bs-dialog.entry.js +108 -0
  247. package/dist/esm/bs-icon-button.entry.js +2 -2
  248. package/dist/esm/bs-inline-tab.entry.js +2 -2
  249. package/dist/esm/bs-input.entry.js +24 -12
  250. package/dist/esm/bs-logo.entry.js +1 -1
  251. package/dist/esm/{bs-menu_2.entry.js → bs-menu-item.entry.js} +3 -15
  252. package/dist/esm/bs-menu.entry.js +15 -0
  253. package/dist/esm/bs-navigation-drawer-item.entry.js +3 -3
  254. package/dist/esm/bs-navigation-drawer.entry.js +8 -2
  255. package/dist/esm/bs-navigation-header.entry.js +2 -2
  256. package/dist/esm/bs-pagination.entry.js +83 -0
  257. package/dist/esm/bs-radio.entry.js +2 -2
  258. package/dist/esm/bs-slider.entry.js +2 -2
  259. package/dist/esm/bs-snackbar.entry.js +39 -0
  260. package/dist/esm/bs-source-link.entry.js +3 -3
  261. package/dist/esm/bs-switch.entry.js +2 -2
  262. package/dist/esm/bs-tab.entry.js +2 -2
  263. package/dist/esm/bs-tabs.entry.js +2 -2
  264. package/dist/esm/bs-tooltip.entry.js +2 -2
  265. package/dist/esm/{index-DST5-cTx.js → index-Do3l4of3.js} +1 -1
  266. package/dist/esm/loader.js +3 -3
  267. package/dist/types/components/bs-avatar/bs-avatar.d.ts +67 -0
  268. package/dist/types/components/bs-avatar/bs-avatar.stories.d.ts +20 -0
  269. package/dist/types/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.cmp.test.d.ts +1 -0
  270. package/dist/types/components/bs-breadcrumb/bs-breadcrumb/bs-breadcrumb.d.ts +44 -0
  271. package/dist/types/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.cmp.test.d.ts +1 -0
  272. package/dist/types/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.d.ts +69 -0
  273. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.cmp.test.d.ts +1 -0
  274. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.d.ts +45 -0
  275. package/dist/types/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.stories.d.ts +14 -0
  276. package/dist/types/components/bs-card/bs-card.d.ts +10 -1
  277. package/dist/types/components/bs-card/bs-card.stories.d.ts +1 -0
  278. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.cmp.test.d.ts +1 -0
  279. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.d.ts +36 -0
  280. package/dist/types/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.stories.d.ts +10 -0
  281. package/dist/types/components/bs-checkbox/bs-checkbox.stories.d.ts +1 -0
  282. package/dist/types/components/bs-dialog/bs-dialog.cmp.test.d.ts +1 -0
  283. package/dist/types/components/bs-dialog/bs-dialog.d.ts +74 -0
  284. package/dist/types/components/{bs-modal/bs-modal.stories.d.ts → bs-dialog/bs-dialog.stories.d.ts} +5 -3
  285. package/dist/types/components/bs-input/bs-input.d.ts +8 -1
  286. package/dist/types/components/bs-pagination/bs-pagination.cmp.test.d.ts +1 -0
  287. package/dist/types/components/bs-pagination/bs-pagination.d.ts +51 -0
  288. package/dist/types/components/bs-pagination/bs-pagination.stories.d.ts +14 -0
  289. package/dist/types/components/bs-snackbar/bs-snackbar.cmp.test.d.ts +1 -0
  290. package/dist/types/components/bs-snackbar/bs-snackbar.d.ts +51 -0
  291. package/dist/types/components/bs-snackbar/bs-snackbar.stories.d.ts +16 -0
  292. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.d.ts +13 -5
  293. package/dist/types/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.stories.d.ts +3 -0
  294. package/dist/types/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.stories.d.ts +4 -0
  295. package/dist/types/components.d.ts +1109 -104
  296. package/package.json +1 -1
  297. package/dist/brandsync-wc/p-09aa03d1.entry.js +0 -1
  298. package/dist/brandsync-wc/p-1cf715aa.entry.js +0 -1
  299. package/dist/brandsync-wc/p-266f5dde.entry.js +0 -1
  300. package/dist/brandsync-wc/p-8ded1eb6.entry.js +0 -1
  301. package/dist/brandsync-wc/p-b289450a.entry.js +0 -1
  302. package/dist/brandsync-wc/p-b8a2f882.entry.js +0 -1
  303. package/dist/cjs/bs-modal.cjs.entry.js +0 -69
  304. package/dist/collection/components/bs-modal/bs-modal.css +0 -66
  305. package/dist/collection/components/bs-modal/bs-modal.js +0 -198
  306. package/dist/collection/components/bs-modal/bs-modal.stories.js +0 -38
  307. package/dist/components/bs-modal.js +0 -1
  308. package/dist/esm/bs-modal.entry.js +0 -67
  309. package/dist/types/components/bs-modal/bs-modal.d.ts +0 -45
  310. /package/dist/types/components/{bs-modal/bs-modal.cmp.test.d.ts → bs-avatar/bs-avatar.cmp.test.d.ts} +0 -0
@@ -86,7 +86,7 @@ export class BsInlineTab {
86
86
  };
87
87
  render() {
88
88
  const iconOnly = this.hasIcon && !this.hasLabel;
89
- return (h("button", { key: 'a0a20d6cb582852ae0276ae2dd91bc5c7708cbfa', type: "button", part: "tab", role: "tab", class: `bs-inline-tab ${this.selected ? 'bs-inline-tab--selected' : ''} ${this.disabled ? 'bs-inline-tab--disabled' : ''} ${iconOnly ? 'bs-inline-tab--icon-only' : ''} ${this.hasIcon ? 'bs-inline-tab--has-icon' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, onClick: this.onClick }, h("span", { key: 'e2fea17db42da65d9ff8ff6d59749572a25c3eb2', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: '4551fc4b092105be399277e42bf343390ae18ff8', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '99de7b930a840f482e0ad2c5e6eaf1b759c6f9ed', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: 'dbedcadbb5b1b51c47d0fa44b8a41f67d6ef4ef0', onSlotchange: this.onLabelSlotchange }))));
89
+ return (h("button", { key: '5e864cce26e8aafa1427dc6095e55e29b1a323a5', type: "button", part: "tab", role: "tab", class: `bs-inline-tab ${this.selected ? 'bs-inline-tab--selected' : ''} ${this.disabled ? 'bs-inline-tab--disabled' : ''} ${iconOnly ? 'bs-inline-tab--icon-only' : ''} ${this.hasIcon ? 'bs-inline-tab--has-icon' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, onClick: this.onClick }, h("span", { key: '7c1284b951d12ce59d5619fe3d2ab9c346ceed0e', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: '3be708db5d08b628046b2c60303a829430dc875d', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '9a8a11172c8c694f3eaa193bffc424e73f712970', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: '089d1858503b4c834e1d3b9bd4763b57fbc2f273', onSlotchange: this.onLabelSlotchange }))));
90
90
  }
91
91
  static get is() { return "bs-inline-tab"; }
92
92
  static get encapsulation() { return "shadow"; }
@@ -99,7 +99,7 @@ export class BsTab {
99
99
  const iconOnly = this.hasIcon && !this.hasLabel;
100
100
  const vertical = this.hasIcon && this.hasLabel && this.iconPosition === 'top';
101
101
  const showBadge = this.hasBadge && !iconOnly && !vertical;
102
- return (h("button", { key: 'de1416c9ee8414405513dd4b9a828d7a3d0ae330', type: "button", part: "tab", role: "tab", class: `bs-tab ${this.selected ? 'bs-tab--selected' : ''} ${this.disabled ? 'bs-tab--disabled' : ''} ${iconOnly ? 'bs-tab--icon-only' : ''} ${vertical ? 'bs-tab--vertical' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, onClick: this.onClick }, h("span", { key: 'd884d90267fac3ec8fc9e9bcd8b9cefc5153b47e', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: '2194a3d72bafda2d0f830e4f9f5a6a92d08c5aa3', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '181abd3f489648a7bf53a11b77bed47c56b2fd94', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: '683020efc34ea270b700b5034631a549796510f1', onSlotchange: this.onLabelSlotchange })), h("span", { key: '02dfede0c88b1b2f805128ce11a5134fd4c83b6d', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: 'e712da5b095aa9e3c6c8b7f8fa0bee86c0ef7b20', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: 'a743816f44a8c0cb08dbe518ae521bf05d5c5a08', part: "indicator", class: "bs-tab__indicator" })));
102
+ return (h("button", { key: 'f546b2a1795c272666671e0b103382921e417763', type: "button", part: "tab", role: "tab", class: `bs-tab ${this.selected ? 'bs-tab--selected' : ''} ${this.disabled ? 'bs-tab--disabled' : ''} ${iconOnly ? 'bs-tab--icon-only' : ''} ${vertical ? 'bs-tab--vertical' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, onClick: this.onClick }, h("span", { key: 'e9818e0796ed9be7df02c07ae535e265f99543c5', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: '550d7967e028e781509c1017e13d485bac304387', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '10939082cb36c48a98fe7783914880385d213ba8', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: 'a2e6cd4f0afbf3ffc3f1ca5c19746cab26d5f6fb', onSlotchange: this.onLabelSlotchange })), h("span", { key: '7a7fca9d63bb63b03b2db1b100c92c2090e45e36', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: '1eb43aabca6e01d777e506fb546ad76ce9527eee', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: '8e9426213e4bc2d60a01b0cdbaeb15d42c0e6269', part: "indicator", class: "bs-tab__indicator" })));
103
103
  }
104
104
  static get is() { return "bs-tab"; }
105
105
  static get encapsulation() { return "shadow"; }
@@ -50,7 +50,7 @@ export class BsTabs {
50
50
  }
51
51
  render() {
52
52
  const vertical = this.orientation === 'vertical';
53
- return (h("div", { key: '55006a332bf4d3b955f5c76cf2cfadf483affb4b', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: '0b0d1ec94485389d4bb6b4000384e337991060bd' })));
53
+ return (h("div", { key: '5d107ad84063bddd35155523a9c51aa905c93d27', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: '9dbd0e4d77c0735920875c141789a331c2bbe1f9' })));
54
54
  }
55
55
  static get is() { return "bs-tabs"; }
56
56
  static get encapsulation() { return "shadow"; }
@@ -42,7 +42,7 @@ export class BsTooltip {
42
42
  */
43
43
  placement = 'top';
44
44
  render() {
45
- return (h("div", { key: '64951f06f070f2d3b10796d09f2c97ef7cf098fa', class: "bs-tooltip" }, h("span", { key: 'b9ff6d99eb95aea33949f211aa80c29220a3e199', part: "arrow", class: "bs-tooltip__arrow" }), h("div", { key: '3b559c7952b42011f45bd59177dbdf3194b84b92', part: "bubble", class: "bs-tooltip__bubble" }, h("slot", { key: '54b278e8ee7c98360b9aaaea300e0631d8bfb8dd' }))));
45
+ return (h("div", { key: '715de45f88b8228c415b70045067232a9d859f96', class: "bs-tooltip" }, h("span", { key: '1fb4350dbe0b36fe18cb34d0ed3e120ad3f863d0', part: "arrow", class: "bs-tooltip__arrow" }), h("div", { key: '78132e1f37d311355fdd4a7bb3a0d5f8ad2c9e97', part: "bubble", class: "bs-tooltip__bubble" }, h("slot", { key: '31316481f106d69e1d08423eb7432e3b16ffdfaa' }))));
46
46
  }
47
47
  static get is() { return "bs-tooltip"; }
48
48
  static get encapsulation() { return "shadow"; }
@@ -128,4 +128,16 @@ describe('bs-navigation-drawer', () => {
128
128
  logos.forEach(logo => expect(logo.background).toBe('dark'));
129
129
  });
130
130
  });
131
+ describe('showLogo', () => {
132
+ it('renders both internal bs-logo elements by default', async () => {
133
+ const { root } = await render(h("bs-navigation-drawer", null));
134
+ expect(root.shadowRoot.querySelectorAll('bs-logo')).toHaveLength(2);
135
+ expect(root.shadowRoot.querySelector('[part="logo"]')).not.toBeNull();
136
+ });
137
+ it('renders no bs-logo elements at all when showLogo is false', async () => {
138
+ const { root } = await render(h("bs-navigation-drawer", { showLogo: false }));
139
+ expect(root.shadowRoot.querySelectorAll('bs-logo')).toHaveLength(0);
140
+ expect(root.shadowRoot.querySelector('[part="logo"]')).toBeNull();
141
+ });
142
+ });
131
143
  });
@@ -6,7 +6,8 @@ import { h } from "@stencil/core";
6
6
  * ## When to use
7
7
  * - The primary in-app navigation, shown alongside `bs-navigation-header` (typically that
8
8
  * header's `with-navigation-drawer` alignment, which omits its own logo since this component
9
- * already renders one).
9
+ * already renders one -- or the reverse pairing, this drawer's own `showLogo={false}` alongside
10
+ * a header that keeps its logo instead, see that prop's own docs).
10
11
  *
11
12
  * ## When not to use
12
13
  * - The top navigation bar itself -- use `bs-navigation-header` instead.
@@ -41,10 +42,11 @@ import { h } from "@stencil/core";
41
42
  * @slot - Default slot: the scrollable list of nav items, typically one or more
42
43
  * `bs-navigation-drawer-item` elements.
43
44
  * @part logo - The wrapper around the BrandSync brand mark. Two of these exist in the shadow DOM
44
- * at once (one wrapping a `bs-logo variant="full"`, one wrapping a `bs-logo variant="mark"`),
45
- * both carrying this same part name (the same "multiple elements, one shared part name"
46
- * approach `bs-attachment`'s `star` part uses) -- only one is visible at a time, toggled by
47
- * plain CSS on `collapsed` (see above), so `::part(logo)` always reaches whichever is showing.
45
+ * at once while `showLogo` is `true` (one wrapping a `bs-logo variant="full"`, one wrapping a
46
+ * `bs-logo variant="mark"`), both carrying this same part name (the same "multiple elements, one
47
+ * shared part name" approach `bs-attachment`'s `star` part uses) -- only one is visible at a
48
+ * time, toggled by plain CSS on `collapsed` (see above), so `::part(logo)` always reaches
49
+ * whichever is showing. Neither renders at all while `showLogo` is `false`.
48
50
  * @part title - The "Main Menu" heading text wrapper.
49
51
  * @part collapse - The collapse toggle button.
50
52
  * @part search - The wrapper around the `search` slot.
@@ -84,6 +86,12 @@ export class BsNavigationDrawer {
84
86
  * `collapsed` (see `bs-logo`'s own docs -- there's only one real designed mark asset, it's
85
87
  * background-agnostic). */
86
88
  logoBackground = 'auto';
89
+ /** Whether to render the BrandSync logo at all. Defaults to `true`. This drawer is normally the
90
+ * one that owns the logo when paired with a `bs-navigation-header` (that header's own
91
+ * `with-navigation-drawer` alignment omits its logo for exactly this reason) -- but the reverse
92
+ * pairing works too: a header that keeps its own logo (`alignment="default"`) paired with this
93
+ * drawer set to `showLogo={false}`, so the brand mark only ever appears once. */
94
+ showLogo = true;
87
95
  onCollapsedChange(collapsed) {
88
96
  this.syncItemsCollapsed(collapsed);
89
97
  }
@@ -109,7 +117,7 @@ export class BsNavigationDrawer {
109
117
  this.bsSearchClick.emit();
110
118
  };
111
119
  render() {
112
- return (h("nav", { key: '643a802cfef5b124603056ca409c67e5e9fa0561', class: "bs-navigation-drawer", "aria-label": this.heading }, h("div", { key: '31384937f95737b961aa4f1cb0b535fc78c8fcfd', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--full" }, h("bs-logo", { key: '834c8a1a031072803815085036ea6b8a744012a2', variant: "full", background: this.logoBackground })), h("div", { key: '50b877188cea0fce86959517f1e14eb4f6869923', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--mark" }, h("bs-logo", { key: '64b66e3e221d9641026009e0b7b0a0bbdf7b946a', variant: "mark", background: this.logoBackground })), h("div", { key: 'a7634d178a491940cb43ceca3dd93aa83539a316', class: "bs-navigation-drawer__title-row" }, h("span", { key: 'fc018e4474f3a38f96538be9064da6b472193b3f', part: "title", class: "bs-navigation-drawer__title" }, this.heading), this.collapsible && (h("button", { key: '516e28aba1e037b74ac616fbc8f293c0cef9da1a', type: "button", part: "collapse", class: "bs-navigation-drawer__collapse", "aria-label": this.collapsed ? 'Expand' : 'Collapse', "aria-pressed": this.collapsed ? 'true' : 'false', onClick: this.onCollapseClick }, h(CaretLeftIcon, { key: 'fba23fed9c12283360bd89dddee6248ec45c98fb' })))), h("div", { key: '29279ec0051d495810f177a194f8dc6f3c649f90', part: "search", class: "bs-navigation-drawer__search" }, h("slot", { key: '6eef2761d887ddc776132327c8343626071fc3b3', name: "search" })), h("button", { key: '4ee9e0ca46ca85b17394466b452cba29c0e528cc', type: "button", part: "search-trigger", class: "bs-navigation-drawer__search-trigger", "aria-label": "Search", onClick: this.onSearchTriggerClick }, h(SearchIcon, { key: '844c581c6ea6c496718866150e24415f746daa36' })), h("div", { key: '3f7f3c6bb4eae12aa87c732fbc4da6d5b3a87e40', part: "items", class: "bs-navigation-drawer__items" }, h("slot", { key: '20833d282601ea298a39ead5b928155e2db33a97' }))));
120
+ return (h("nav", { key: '0b6979dbab9e8b0bfcd1a4bdceead7b87c8d2b88', class: "bs-navigation-drawer", "aria-label": this.heading }, this.showLogo && (h("div", { key: 'f7b4b0238118d95f48a60da815738673db41da9f', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--full" }, h("bs-logo", { key: '9d40a85424f2931b251eb1e90991f3fa6b6eaccf', variant: "full", background: this.logoBackground }))), this.showLogo && (h("div", { key: '77250a1f5f66e7fcd981bfd6494ee38722a7406f', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--mark" }, h("bs-logo", { key: '0365624f3796b1c44af10488e8a3cab93e296169', variant: "mark", background: this.logoBackground }))), h("div", { key: '4c5b0de2a90df7f6462fac6d6b79abb62829293e', class: "bs-navigation-drawer__title-row" }, h("span", { key: 'f9507d3c31687abcaa99340ca4e413f8d47559bc', part: "title", class: "bs-navigation-drawer__title" }, this.heading), this.collapsible && (h("button", { key: 'f07c9f1f04d0b3e745273d8f61b3c1af02a5bc08', type: "button", part: "collapse", class: "bs-navigation-drawer__collapse", "aria-label": this.collapsed ? 'Expand' : 'Collapse', "aria-pressed": this.collapsed ? 'true' : 'false', onClick: this.onCollapseClick }, h(CaretLeftIcon, { key: '9731cf6bd727b753c99b5969059997a6800ec3a4' })))), h("div", { key: '7b1cc15eb095988451c32e4ba429fa5f36a5bbb8', part: "search", class: "bs-navigation-drawer__search" }, h("slot", { key: '1cf0fa19d789ea44ef29a9a3fbc7852ea012045e', name: "search" })), h("button", { key: '9a7c7bf69a7ef92144e60641279fbaca47395d4f', type: "button", part: "search-trigger", class: "bs-navigation-drawer__search-trigger", "aria-label": "Search", onClick: this.onSearchTriggerClick }, h(SearchIcon, { key: '6c55207e0b45a07c2be7aa350c07bbab4018696b' })), h("div", { key: 'e22497a133d16a622ef68ff5de4796eaa96a25fb', part: "items", class: "bs-navigation-drawer__items" }, h("slot", { key: '465d9447ef355558ffd0d79306abd9a9204517a1' }))));
113
121
  }
114
122
  static get is() { return "bs-navigation-drawer"; }
115
123
  static get encapsulation() { return "shadow"; }
@@ -204,6 +212,26 @@ export class BsNavigationDrawer {
204
212
  "reflect": false,
205
213
  "attribute": "logo-background",
206
214
  "defaultValue": "'auto'"
215
+ },
216
+ "showLogo": {
217
+ "type": "boolean",
218
+ "mutable": false,
219
+ "complexType": {
220
+ "original": "boolean",
221
+ "resolved": "boolean",
222
+ "references": {}
223
+ },
224
+ "required": false,
225
+ "optional": false,
226
+ "docs": {
227
+ "tags": [],
228
+ "text": "Whether to render the BrandSync logo at all. Defaults to `true`. This drawer is normally the\none that owns the logo when paired with a `bs-navigation-header` (that header's own\n`with-navigation-drawer` alignment omits its logo for exactly this reason) -- but the reverse\npairing works too: a header that keeps its own logo (`alignment=\"default\"`) paired with this\ndrawer set to `showLogo={false}`, so the brand mark only ever appears once."
229
+ },
230
+ "getter": false,
231
+ "setter": false,
232
+ "reflect": false,
233
+ "attribute": "show-logo",
234
+ "defaultValue": "true"
207
235
  }
208
236
  };
209
237
  }
@@ -87,6 +87,40 @@ const ITEMS_WITH_DIVIDER = html `
87
87
  <bs-navigation-drawer-item slot="children" nested>Switch</bs-navigation-drawer-item>
88
88
  </bs-navigation-drawer-item>
89
89
  `;
90
+ // A longer, deeper item list than the other demo lists above -- more top-level groups, more
91
+ // nested children per group, and every group expanded at once -- for demonstrating this
92
+ // component's own scroll behavior (a fixed-height drawer with a naturally-taller-than-viewport
93
+ // item list) rather than a distinct "large" item size/prop, which bs-navigation-drawer-item
94
+ // doesn't have.
95
+ const LARGE_ITEMS = html `
96
+ <bs-navigation-drawer-item selected ariaLabel="Introduction">${accessibilityIcon} Introduction</bs-navigation-drawer-item>
97
+ <bs-navigation-drawer-item ariaLabel="Accessibility">${bookIcon} Accessibility</bs-navigation-drawer-item>
98
+ <bs-navigation-drawer-item expandable expanded ariaLabel="Foundation">
99
+ ${gridIcon} Foundation
100
+ <bs-navigation-drawer-item slot="children" nested>Colors</bs-navigation-drawer-item>
101
+ <bs-navigation-drawer-item slot="children" nested>Typography</bs-navigation-drawer-item>
102
+ <bs-navigation-drawer-item slot="children" nested>Spacing</bs-navigation-drawer-item>
103
+ <bs-navigation-drawer-item slot="children" nested>Elevation</bs-navigation-drawer-item>
104
+ <bs-navigation-drawer-item slot="children" nested>Iconography</bs-navigation-drawer-item>
105
+ </bs-navigation-drawer-item>
106
+ <bs-navigation-drawer-item expandable expanded ariaLabel="Components">
107
+ ${gridIcon} Components
108
+ <bs-navigation-drawer-item slot="children" nested>Button</bs-navigation-drawer-item>
109
+ <bs-navigation-drawer-item slot="children" nested>Checkbox</bs-navigation-drawer-item>
110
+ <bs-navigation-drawer-item slot="children" nested>Switch</bs-navigation-drawer-item>
111
+ <bs-navigation-drawer-item slot="children" nested>Radio</bs-navigation-drawer-item>
112
+ <bs-navigation-drawer-item slot="children" nested>Slider</bs-navigation-drawer-item>
113
+ <bs-navigation-drawer-item slot="children" nested>Modal</bs-navigation-drawer-item>
114
+ <bs-navigation-drawer-item slot="children" nested>Tooltip</bs-navigation-drawer-item>
115
+ </bs-navigation-drawer-item>
116
+ <bs-navigation-drawer-item expandable expanded ariaLabel="Patterns">
117
+ ${gridIcon} Patterns
118
+ <bs-navigation-drawer-item slot="children" nested>Dashboard</bs-navigation-drawer-item>
119
+ <bs-navigation-drawer-item slot="children" nested>Filter Table</bs-navigation-drawer-item>
120
+ <bs-navigation-drawer-item slot="children" nested>Empty State</bs-navigation-drawer-item>
121
+ </bs-navigation-drawer-item>
122
+ <bs-navigation-drawer-item ariaLabel="Settings">${bookIcon} Settings</bs-navigation-drawer-item>
123
+ `;
90
124
  const meta = {
91
125
  title: 'UI Shell/bs-navigation-drawer/bs-navigation-drawer',
92
126
  parameters: { docs: { description: { component: componentDescription('bs-navigation-drawer') } }, layout: 'fullscreen' },
@@ -101,7 +135,12 @@ const meta = {
101
135
  // bug found and fixed in bs-slider's showLabel earlier this session.
102
136
  render: args => html `
103
137
  <div style="height: 100vh; display: flex;">
104
- <bs-navigation-drawer heading=${args.heading} collapsible=${args.collapsible} logo-background=${args.logoBackground}>
138
+ <bs-navigation-drawer
139
+ heading=${args.heading}
140
+ collapsible=${args.collapsible}
141
+ logo-background=${args.logoBackground}
142
+ show-logo=${args.showLogo}
143
+ >
105
144
  <bs-input slot="search" type="search" placeholder="Search"></bs-input>
106
145
  ${ITEMS_NO_ICONS}
107
146
  </bs-navigation-drawer>
@@ -111,11 +150,13 @@ const meta = {
111
150
  heading: { control: 'text', description: propDescription('bs-navigation-drawer', 'heading') },
112
151
  collapsible: { control: 'boolean', description: propDescription('bs-navigation-drawer', 'collapsible') },
113
152
  logoBackground: { control: 'select', options: ['auto', 'light', 'dark'], description: propDescription('bs-navigation-drawer', 'logoBackground') },
153
+ showLogo: { control: 'boolean', description: propDescription('bs-navigation-drawer', 'showLogo') },
114
154
  },
115
155
  args: {
116
156
  heading: 'Main Menu',
117
157
  collapsible: false,
118
158
  logoBackground: 'auto',
159
+ showLogo: true,
119
160
  },
120
161
  };
121
162
  export default meta;
@@ -148,7 +189,7 @@ export const FixedSideNavWithIcons = {
148
189
  `,
149
190
  };
150
191
  export const Collapsed = {
151
- name: 'Collapsed',
192
+ name: 'Side Nav Rail',
152
193
  // Click the collapse toggle (the caret button next to the heading) to see it expand back --
153
194
  // `collapsed` is mutable/self-toggling, so this works with no extra story wiring.
154
195
  render: args => html `
@@ -160,6 +201,26 @@ export const Collapsed = {
160
201
  </div>
161
202
  `,
162
203
  };
204
+ export const CollapsedWithHeader = {
205
+ name: 'Side Nav Rail with Header',
206
+ // The rail (collapsed) drawer composed alongside bs-navigation-header, forming the same
207
+ // app-shell layout as bs-navigation-header's own "with Side Nav" stories, but with the drawer
208
+ // starting in its collapsed/icon-only rail state instead of fully expanded.
209
+ render: args => html `
210
+ <div style="height: 100vh; display: flex; flex-direction: column;">
211
+ <bs-navigation-header alignment="with-navigation-drawer"></bs-navigation-header>
212
+ <div style="flex: 1; min-height: 0; display: flex;">
213
+ <bs-navigation-drawer heading=${args.heading} collapsed>
214
+ <bs-input slot="search" type="search" placeholder="Search"></bs-input>
215
+ ${ITEMS}
216
+ </bs-navigation-drawer>
217
+ <main style="flex: 1; min-width: 0; overflow: auto; padding: var(--bs-spacing-400); font-family: sans-serif; color: var(--bs-text-muted);">
218
+ Page content
219
+ </main>
220
+ </div>
221
+ </div>
222
+ `,
223
+ };
163
224
  export const Dark = {
164
225
  name: 'Fixed Side Nav (Dark)',
165
226
  // `data-theme="dark"` is set on a wrapper scoped to just this story, NOT via a globals override
@@ -200,3 +261,14 @@ export const EmptyItems = {
200
261
  </div>
201
262
  `,
202
263
  };
264
+ export const LargeItemList = {
265
+ name: 'Side Nav with Large Side Nav Items',
266
+ render: args => html `
267
+ <div style="height: 100vh; display: flex;">
268
+ <bs-navigation-drawer heading=${args.heading} collapsible=${args.collapsible}>
269
+ <bs-input slot="search" type="search" placeholder="Search"></bs-input>
270
+ ${LARGE_ITEMS}
271
+ </bs-navigation-drawer>
272
+ </div>
273
+ `,
274
+ };
@@ -51,7 +51,10 @@
51
51
  * --bs-spacing-100 (8px, all sides -- Figma node 8028:135374's "Container").
52
52
  * @prop --bs-navigation-drawer-item-collapsed-icon-padding-x: Left/right padding of the small
53
53
  * rounded chip behind a `collapsed` row's icon (the `selected` tint applies to just this chip,
54
- * not the full column). Aliased to --bs-spacing-100.
54
+ * not the full column). Aliased to --bs-spacing-300 -- widened from the original
55
+ * Figma-node-8028:135374 value (--bs-spacing-100) at the user's request after seeing the chip
56
+ * rendered too narrow relative to the rail's own width. Not a Figma re-measurement -- a
57
+ * deliberate deviation, same as bs-logo's icon-to-wordmark gap earlier this session.
55
58
  * @prop --bs-navigation-drawer-item-collapsed-icon-padding-y: Top/bottom padding of that chip.
56
59
  * Aliased to --bs-spacing-50.
57
60
  * @prop --bs-navigation-drawer-item-collapsed-font-size: Caption font size when `collapsed`.
@@ -88,15 +91,12 @@
88
91
 
89
92
  --bs-navigation-drawer-item-collapsed-gap: var(--bs-spacing-100);
90
93
  --bs-navigation-drawer-item-collapsed-padding: var(--bs-spacing-100);
91
- --bs-navigation-drawer-item-collapsed-icon-padding-x: var(--bs-spacing-100);
94
+ --bs-navigation-drawer-item-collapsed-icon-padding-x: var(--bs-spacing-300);
92
95
  --bs-navigation-drawer-item-collapsed-icon-padding-y: var(--bs-spacing-50);
93
96
  --bs-navigation-drawer-item-collapsed-font-size: var(--bs-fontsize-caption-sm);
94
97
  --bs-navigation-drawer-item-collapsed-line-height: var(--bs-line-height-caption-sm);
95
98
  }
96
99
 
97
- /* Purely a JSX-single-root-node wrapper (see bs-navigation-drawer-item.tsx's render() comment) --
98
- display: contents removes it from layout/box generation entirely, so it doesn't affect the
99
- button/children-wrapper stacking at all. */
100
100
  .bs-navigation-drawer-item__root {
101
101
  display: contents;
102
102
  }
@@ -131,7 +131,7 @@ export class BsNavigationDrawerItem {
131
131
  // incorrectly also toggle this parent row on every child click. Both are wrapped in a
132
132
  // `display: contents` container so render() still returns a single root node (this codebase's
133
133
  // convention, e.g. bs-input.tsx) without that wrapper affecting layout at all.
134
- return (h("div", { key: '56087157f61114bbc3eda6ea4ed9c953c6776e7a', class: "bs-navigation-drawer-item__root" }, h("button", { key: '9d7bc98cdcccb4724a7d388209e98c66140d509d', type: "button", part: "item", class: rowClasses, "aria-expanded": this.expandable ? String(this.expanded) : undefined, "aria-label": this.ariaLabel ?? undefined, onClick: this.onClick }, !this.nested && (h("span", { key: 'b071e6437b1394002e3494e533e199399b077d09', part: "icon", class: `bs-navigation-drawer-item__icon ${this.hasIcon ? 'bs-navigation-drawer-item__icon--has-content' : ''}` }, h("slot", { key: 'bacc7cf8105454457bd90ca563fd93ab202477af', name: "icon", onSlotchange: this.onIconSlotchange }))), h("span", { key: '373e0875b1a68f5c02fe0473a1ff9a322d2dd9eb', part: "label", class: "bs-navigation-drawer-item__label" }, h("slot", { key: '0ba908c6abe37b35a72bd4e99491e828a7b27661' })), this.expandable && (h("span", { key: '025af7ea24428581f3a7e89642d09638ebeb1734', part: "chevron", class: `bs-navigation-drawer-item__chevron ${this.expanded ? 'bs-navigation-drawer-item__chevron--expanded' : ''}` }, h(ChevronDownIcon, { key: '270f60521effe7a06d4720caa6392a6a76cf5d94' })))), this.expandable && (h("span", { key: '4108f797246cc31029c9a7379d6da6a70ec0dba8', part: "children", class: "bs-navigation-drawer-item__children" }, h("slot", { key: 'b09f6e81f28fff754f46d2e750fa791e63f8cfe3', name: "children" })))));
134
+ return (h("div", { key: '6fd089698cd27459fc10a2806fba5a792dbfec2b', class: "bs-navigation-drawer-item__root" }, h("button", { key: '5c4448c9f16dfe9356ce069a5f069db9ed084f3b', type: "button", part: "item", class: rowClasses, "aria-expanded": this.expandable ? String(this.expanded) : undefined, "aria-label": this.ariaLabel ?? undefined, onClick: this.onClick }, !this.nested && (h("span", { key: 'bcfd23ef22e33ed6dcb3ec70b8263a4dccb14914', part: "icon", class: `bs-navigation-drawer-item__icon ${this.hasIcon ? 'bs-navigation-drawer-item__icon--has-content' : ''}` }, h("slot", { key: '170f97cc6ca93bf5e9e336b7c39c3d3bb02adca8', name: "icon", onSlotchange: this.onIconSlotchange }))), h("span", { key: 'abbc25976aa21e94e503497430d2be0895fd8987', part: "label", class: "bs-navigation-drawer-item__label" }, h("slot", { key: '0b9e12703c42e326634bb5adb49f1994b9c19754' })), this.expandable && (h("span", { key: '25e2a8517451cced2993390cd194420d57ee5489', part: "chevron", class: `bs-navigation-drawer-item__chevron ${this.expanded ? 'bs-navigation-drawer-item__chevron--expanded' : ''}` }, h(ChevronDownIcon, { key: '7b15770e5a071f8f49b06d811dbe1925ff9b5054' })))), this.expandable && (h("span", { key: '861ac7d088e527486c43f80a933e796c05980bc0', part: "children", class: "bs-navigation-drawer-item__children" }, h("slot", { key: 'fc673a4f19b0aee8c4c3d9d718cb239746e04221', name: "children" })))));
135
135
  }
136
136
  static get is() { return "bs-navigation-drawer-item"; }
137
137
  static get encapsulation() { return "shadow"; }
@@ -61,7 +61,7 @@ export class BsNavigationHeader {
61
61
  render() {
62
62
  const showLogo = this.alignment !== 'with-navigation-drawer';
63
63
  const rootClasses = `bs-navigation-header bs-navigation-header--${this.alignment}`;
64
- return (h("header", { key: 'e106c295d18a32638e8b2e8179264da30c6343fd', class: rootClasses, "aria-label": this.ariaLabel ?? undefined }, this.skipToContentHref && (h("a", { key: '9b0aa4f626e2ac17fd02ff35f63861be5cca0a4c', part: "skip-link", class: "bs-navigation-header__skip-link", href: this.skipToContentHref }, this.skipToContentLabel)), showLogo && (h("bs-logo", { key: '079ebb7b6077307cb84dacf5504eeca259c265df', part: "logo", class: "bs-navigation-header__logo", variant: "full", background: this.logoBackground })), h("div", { key: '79fb735078a3d2b200811c4c055b881fb17feb54', part: "left", class: "bs-navigation-header__left" }, h("slot", { key: '8c72405a0adeb158bd6427e9c6afb77950cb1de2', name: "left" })), h("div", { key: '81941860e7e9b2780cc02b3ca9a13c0f0cde00bd', part: "right", class: "bs-navigation-header__right" }, h("slot", { key: 'ceb361449083be06404b862e22d461daa56cd8ca', name: "right" }))));
64
+ return (h("header", { key: '7edb19100328942a082a3f35b0b6202effacd9df', class: rootClasses, "aria-label": this.ariaLabel ?? undefined }, this.skipToContentHref && (h("a", { key: 'db181c2823ae10bad5769c4578f8d560769330b8', part: "skip-link", class: "bs-navigation-header__skip-link", href: this.skipToContentHref }, this.skipToContentLabel)), showLogo && (h("bs-logo", { key: '618b592c7d37bfb9f1882e98153277bc833d15ea', part: "logo", class: "bs-navigation-header__logo", variant: "full", background: this.logoBackground })), h("div", { key: '2f2d14ec0b410d6ad6ef9cbcf6aebe1336d25f89', part: "left", class: "bs-navigation-header__left" }, h("slot", { key: 'cad41138dd5411480eaccebef01f5d8ddc20ef6c', name: "left" })), h("div", { key: '59d65743ae936910e889d9d74b25896d5e4b61dd', part: "right", class: "bs-navigation-header__right" }, h("slot", { key: '21b7aeff58441efdd504b0bbabc3fa96e99906e5', name: "right" }))));
65
65
  }
66
66
  static get is() { return "bs-navigation-header"; }
67
67
  static get encapsulation() { return "shadow"; }
@@ -20,6 +20,43 @@ const bellIcon = html `
20
20
  <path d="M6.5 13.5C6.5 14.3284 7.17157 15 8 15C8.82843 15 9.5 14.3284 9.5 13.5" stroke="currentColor" stroke-width="1.5" />
21
21
  </svg>
22
22
  `;
23
+ const switcherIcon = html `
24
+ <svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
25
+ <rect x="2" y="2" width="4.5" height="4.5" rx="1" stroke="currentColor" stroke-width="1.5" />
26
+ <rect x="9.5" y="2" width="4.5" height="4.5" rx="1" stroke="currentColor" stroke-width="1.5" />
27
+ <rect x="2" y="9.5" width="4.5" height="4.5" rx="1" stroke="currentColor" stroke-width="1.5" />
28
+ <rect x="9.5" y="9.5" width="4.5" height="4.5" rx="1" stroke="currentColor" stroke-width="1.5" />
29
+ </svg>
30
+ `;
31
+ // appShell()'s own item icons -- same slot="icon"/viewBox="0 0 24 24"/stroke-width="1.5" convention
32
+ // as bs-navigation-drawer.stories.ts's own bookIcon/gridIcon/accessibilityIcon (not reused directly
33
+ // -- that's a different file/module, and these are semantically matched to "Dashboard"/"Reports"/
34
+ // "Settings" specifically rather than the Foundation/Components docs-nav labels those were drawn
35
+ // for).
36
+ const dashboardIcon = html `
37
+ <svg slot="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
38
+ <rect x="3.5" y="3.5" width="8" height="8" rx="1" stroke="currentColor" stroke-width="1.5" />
39
+ <rect x="13.5" y="3.5" width="7" height="4" rx="1" stroke="currentColor" stroke-width="1.5" />
40
+ <rect x="13.5" y="9.5" width="7" height="8.5" rx="1" stroke="currentColor" stroke-width="1.5" />
41
+ <rect x="3.5" y="13.5" width="8" height="4.5" rx="1" stroke="currentColor" stroke-width="1.5" />
42
+ </svg>
43
+ `;
44
+ const reportsIcon = html `
45
+ <svg slot="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
46
+ <path d="M4 20V10M4 20H20M10 20V6M16 20V13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
47
+ </svg>
48
+ `;
49
+ const settingsIcon = html `
50
+ <svg slot="icon" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
51
+ <circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="1.5" />
52
+ <path
53
+ d="M12 2.5V5M12 19V21.5M4.22 4.22L5.94 5.94M18.06 18.06L19.78 19.78M2.5 12H5M19 12H21.5M4.22 19.78L5.94 18.06M18.06 5.94L19.78 4.22"
54
+ stroke="currentColor"
55
+ stroke-width="1.5"
56
+ stroke-linecap="round"
57
+ />
58
+ </svg>
59
+ `;
23
60
  const LEFT_SLOT_BUTTONS = html `
24
61
  <bs-button variant="subtle" size="sm">Products</bs-button>
25
62
  <bs-button variant="subtle" size="sm">Solutions</bs-button>
@@ -66,17 +103,188 @@ const RIGHT_SLOT = html `
66
103
  visibility: visible;
67
104
  transition-delay: var(--bs-duration-slow);
68
105
  }
106
+ /* bs-badge's default shape is a pill sized for label text (32px tall, 16px side padding) --
107
+ too large for a compact unread-count overlay. Restyled via its own ::part(container) (the
108
+ sanctioned external-customization surface for shadow-DOM parts, per CONVENTIONS.md), not a
109
+ new component or a fork of bs-badge -- same component, same "error" color variant, just a
110
+ tighter shape for this corner-badge placement, matching the "Numeric" badge shape shown in
111
+ the Brandsync design system's own Badge spec.
112
+ Absolutely positioned relative to the shared tooltip wrapper above so it doesn't shift icon
113
+ layout. bs-icon-button size="sm" is a 40px hit area around a 16px icon glyph (12px of
114
+ padding on each side), so top/right are offset from the WRAPPER's own corner, not the
115
+ button's -- centering the badge on the visible bell glyph's corner (12px inset, minus half
116
+ the badge's own 16px) instead of the button's much larger outer edge, which left it looking
117
+ like a disconnected, oversized blob floating in the button's padding. */
118
+ .story-nav-header-badge {
119
+ /* bs-badge's "error" variant reads --bs-badge-bg-error-container/--bs-badge-text-error --
120
+ the subtle/light error style. A notification count needs the solid, high-contrast look
121
+ instead, and the vendored tokens already define exactly that pairing
122
+ (--bs-badge-bg-error, --text-inverse) -- this just points the two custom properties
123
+ bs-badge.css actually reads at those solid values instead, for this one instance. */
124
+ --bs-badge-bg-error-container: var(--bs-badge-bg-error);
125
+ --bs-badge-text-error: var(--bs-text-inverse);
126
+ }
127
+ .story-nav-header-badge::part(container) {
128
+ position: absolute;
129
+ top: 4px;
130
+ right: 4px;
131
+ height: var(--bs-font-size-md);
132
+ min-width: var(--bs-font-size-md);
133
+ padding: 0 3px;
134
+ font-size: var(--bs-font-size-2xs);
135
+ line-height: var(--bs-font-size-md);
136
+ border: 2px solid var(--bs-surface-base);
137
+ box-sizing: border-box;
138
+ }
69
139
  </style>
70
140
  <span class="story-nav-header-tooltip-wrapper">
71
141
  <bs-icon-button size="sm" variant="subtle" aria-label="Search">${searchIcon}</bs-icon-button>
72
142
  <bs-tooltip class="story-nav-header-tooltip" placement="top" aria-hidden="true">Search</bs-tooltip>
73
143
  </span>
74
144
  <span class="story-nav-header-tooltip-wrapper">
75
- <bs-icon-button size="sm" variant="subtle" aria-label="Notifications">${bellIcon}</bs-icon-button>
145
+ <bs-icon-button size="sm" variant="subtle" aria-label="Notifications, 4 unread">${bellIcon}</bs-icon-button>
146
+ <bs-badge class="story-nav-header-badge" variant="error" aria-hidden="true">4</bs-badge>
76
147
  <bs-tooltip class="story-nav-header-tooltip" placement="top" aria-hidden="true">Notifications</bs-tooltip>
77
148
  </span>
78
149
  <bs-button variant="primary" size="sm">Sign in</bs-button>
79
150
  `;
151
+ // "Switcher" here means a workspace/account switcher panel that slides in from the right edge of
152
+ // the viewport when its trigger icon is clicked -- not a real bs-* component (no generic
153
+ // slide-in-from-right panel exists in this library yet; bs-dialog is a centered dialog, not this),
154
+ // so this is plain story-only markup: a fixed-position aside toggled via a direct classList
155
+ // change on click, not lit's own reactive re-render (a Storybook `render` function re-runs on
156
+ // args changes, not on arbitrary DOM events, so state that needs to survive a click has to live in
157
+ // the DOM itself here, the same way the tooltip hover states above are pure CSS rather than JS
158
+ // state).
159
+ const SWITCHER_PANEL = html `
160
+ <style>
161
+ .story-switcher-backdrop {
162
+ position: fixed;
163
+ inset: 0;
164
+ background: rgb(0 0 0 / 32%);
165
+ opacity: 0;
166
+ visibility: hidden;
167
+ transition:
168
+ opacity var(--bs-duration-default) var(--bs-easing-standard),
169
+ visibility var(--bs-duration-default) var(--bs-easing-standard);
170
+ z-index: 10;
171
+ }
172
+ .story-switcher-panel {
173
+ position: fixed;
174
+ top: 0;
175
+ right: 0;
176
+ bottom: 0;
177
+ width: 320px;
178
+ max-width: 100%;
179
+ background: var(--bs-surface-base);
180
+ box-shadow: var(--bs-shadow-lg, 0 8px 24px rgb(0 0 0 / 20%));
181
+ transform: translateX(100%);
182
+ transition: transform var(--bs-duration-default) var(--bs-easing-standard);
183
+ z-index: 11;
184
+ display: flex;
185
+ flex-direction: column;
186
+ padding: var(--bs-spacing-300);
187
+ gap: var(--bs-spacing-200);
188
+ box-sizing: border-box;
189
+ }
190
+ .story-switcher-backdrop.story-switcher--open {
191
+ opacity: 1;
192
+ visibility: visible;
193
+ }
194
+ .story-switcher-panel.story-switcher--open {
195
+ transform: translateX(0);
196
+ }
197
+ .story-switcher-heading {
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: space-between;
201
+ font-family: var(--bs-typography-font-family-heading);
202
+ font-weight: var(--bs-font-weight-bold);
203
+ font-size: var(--bs-font-size-md);
204
+ color: var(--bs-text-default);
205
+ }
206
+ .story-switcher-list {
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: var(--bs-spacing-100);
210
+ }
211
+ </style>
212
+ <div class="story-switcher-backdrop" @click=${(e) => toggleSwitcher(e, false)}></div>
213
+ <aside class="story-switcher-panel" aria-label="Switch workspace">
214
+ <div class="story-switcher-heading">
215
+ Switch workspace
216
+ <bs-icon-button size="sm" variant="subtle" aria-label="Close" @click=${(e) => toggleSwitcher(e, false)}>
217
+ <svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
218
+ <path d="M3 3L13 13M13 3L3 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
219
+ </svg>
220
+ </bs-icon-button>
221
+ </div>
222
+ <div class="story-switcher-list">
223
+ <bs-button variant="subtle">Acme Corp</bs-button>
224
+ <bs-button variant="subtle">Acme Corp -- Staging</bs-button>
225
+ <bs-button variant="subtle">Personal Workspace</bs-button>
226
+ </div>
227
+ </aside>
228
+ `;
229
+ // Shared by both the backdrop and every open/close trigger -- walks up to the common app-shell
230
+ // wrapper so this works regardless of which story renders it in, then toggles both halves in
231
+ // lockstep (only the panel needs the open class for its slide-in transform, but the backdrop
232
+ // needs its own visibility toggle too since a transparent-but-still-fixed backdrop would
233
+ // otherwise keep eating clicks).
234
+ function toggleSwitcher(e, open) {
235
+ const root = e.currentTarget.closest('.story-nav-header-shell, body') ?? document.body;
236
+ root.querySelector('.story-switcher-backdrop')?.classList.toggle('story-switcher--open', open);
237
+ root.querySelector('.story-switcher-panel')?.classList.toggle('story-switcher--open', open);
238
+ }
239
+ const RIGHT_SLOT_WITH_SWITCHER = html `
240
+ ${RIGHT_SLOT}
241
+ <span class="story-nav-header-tooltip-wrapper">
242
+ <bs-icon-button size="sm" variant="subtle" aria-label="Switch workspace" @click=${(e) => toggleSwitcher(e, true)}>
243
+ ${switcherIcon}
244
+ </bs-icon-button>
245
+ <bs-tooltip class="story-nav-header-tooltip" placement="top" aria-hidden="true">Switch workspace</bs-tooltip>
246
+ </span>
247
+ ${SWITCHER_PANEL}
248
+ `;
249
+ // Shared by the "with Side Nav" stories below -- a real app-shell layout, not just the header in
250
+ // isolation: this header spans the FULL viewport width across the top (a plain flex column), with
251
+ // a row below it holding the full-height bs-navigation-drawer on the left and the content area
252
+ // filling the rest. The drawer is left at its default `collapsible=true` here (no attribute set at
253
+ // all) so its own collapse toggle renders and actually works in these demos, same as any other
254
+ // real page using both components together.
255
+ //
256
+ // `?collapsed=` -- lit's boolean directive, NOT plain `collapsed=` interpolation. This ONLY sets
257
+ // the drawer's *initial* collapsed state; once mounted, the drawer's own mutable `collapsed` prop
258
+ // takes over (clicking its toggle flips it directly, per that component's own docs), independent
259
+ // of this story's args. bs-navigation-drawer.css's collapsed styling is a plain CSS
260
+ // attribute-presence selector (`:host([collapsed])`), which matches on the attribute merely
261
+ // EXISTING, regardless of its value -- plain interpolation stringifies `false` to the literal
262
+ // attribute `collapsed="false"`, which is still *present*, so the drawer rendered as its 96px
263
+ // collapsed rail even when passed `false` (no visible title/search/items), until this was caught.
264
+ // The boolean directive is the only one of the two forms that actually omits the attribute for a
265
+ // falsy value.
266
+ //
267
+ // `drawerShowLogo` defaults `true` and maps to `show-logo`, which -- unlike `collapsed` above -- is
268
+ // a plain JS conditional in bs-navigation-drawer.tsx's render(), not a CSS presence selector, so
269
+ // plain interpolation (not the `?attr=` boolean directive) is the correct form here instead.
270
+ function appShell(headerContent, drawerCollapsed = false, drawerShowLogo = true) {
271
+ return html `
272
+ <div class="story-nav-header-shell" style="height: 100vh; display: flex; flex-direction: column;">
273
+ ${headerContent}
274
+ <div style="flex: 1; min-height: 0; display: flex;">
275
+ <bs-navigation-drawer heading="Main Menu" ?collapsed=${drawerCollapsed} show-logo=${drawerShowLogo}>
276
+ <bs-input slot="search" type="search" placeholder="Search"></bs-input>
277
+ <bs-navigation-drawer-item selected>${dashboardIcon} Dashboard</bs-navigation-drawer-item>
278
+ <bs-navigation-drawer-item>${reportsIcon} Reports</bs-navigation-drawer-item>
279
+ <bs-navigation-drawer-item>${settingsIcon} Settings</bs-navigation-drawer-item>
280
+ </bs-navigation-drawer>
281
+ <main style="flex: 1; min-width: 0; overflow: auto; padding: var(--bs-spacing-400); font-family: sans-serif; color: var(--bs-text-muted);">
282
+ Page content
283
+ </main>
284
+ </div>
285
+ </div>
286
+ `;
287
+ }
80
288
  const meta = {
81
289
  title: 'UI Shell/bs-navigation-header',
82
290
  parameters: { docs: { description: { component: componentDescription('bs-navigation-header') } }, layout: 'fullscreen' },
@@ -187,3 +395,52 @@ export const HeaderBaseWithSkipLink = {
187
395
  </div>
188
396
  `,
189
397
  };
398
+ export const HeaderBaseWithActionsAndSwitcher = {
399
+ name: 'Header Base with Actions and Switcher',
400
+ // Click the grid icon (the rightmost action, next to Notifications) to open the "switcher"
401
+ // panel -- a workspace/account switcher that slides in from the right edge of the viewport. See
402
+ // RIGHT_SLOT_WITH_SWITCHER's own comment for why this is plain story markup rather than a new
403
+ // library component.
404
+ render: args => html `
405
+ <bs-navigation-header alignment=${args.alignment}>
406
+ <div slot="left" style="display: contents;">${leftSlotContent(args.leftContentType)}</div>
407
+ <div slot="right" style="display: contents;">${RIGHT_SLOT_WITH_SWITCHER}</div>
408
+ </bs-navigation-header>
409
+ `,
410
+ };
411
+ export const HeaderBaseWithSideNav = {
412
+ name: 'Header Base with Side Nav',
413
+ // The real app-shell composition: this header (alignment="with-navigation-drawer", so it
414
+ // doesn't render its own logo -- the drawer's logo already covers that) alongside a full,
415
+ // expanded bs-navigation-drawer. Bare header otherwise (no left/right slot content) to isolate
416
+ // just the layout; see "Header Base with Navigation, Actions and Side Nav" below for the fully
417
+ // populated version.
418
+ args: { alignment: 'with-navigation-drawer' },
419
+ render: args => appShell(html `<bs-navigation-header alignment=${args.alignment}></bs-navigation-header>`),
420
+ };
421
+ export const HeaderBaseWithNavigationActionsAndSideNav = {
422
+ name: 'Header Base with Navigation, Actions and Side Nav',
423
+ // Same app-shell composition as "Header Base with Side Nav", but with the header's own
424
+ // left/right slots populated too -- the fully-assembled real-world shape of this layout.
425
+ args: { alignment: 'with-navigation-drawer' },
426
+ render: args => appShell(html `
427
+ <bs-navigation-header alignment=${args.alignment}>
428
+ <div slot="left" style="display: contents;">${leftSlotContent(args.leftContentType)}</div>
429
+ <div slot="right" style="display: contents;">${RIGHT_SLOT}</div>
430
+ </bs-navigation-header>
431
+ `),
432
+ };
433
+ export const HeaderBaseWithSideNavHeaderLogo = {
434
+ name: 'Header Base with Side Nav (Header Owns Logo)',
435
+ // The inverse pairing from the two stories above: this header keeps its OWN logo
436
+ // (alignment="default", not "with-navigation-drawer") and the drawer's is turned off instead
437
+ // (bs-navigation-drawer's showLogo={false}) -- so the brand mark still only ever appears once,
438
+ // just on the other side of the pairing. Useful when the header, not the drawer, is the piece
439
+ // that should carry brand identity in a given app's shell.
440
+ args: { alignment: 'default' },
441
+ render: args => appShell(html `
442
+ <bs-navigation-header alignment=${args.alignment}>
443
+ <div slot="right" style="display: contents;">${RIGHT_SLOT}</div>
444
+ </bs-navigation-header>
445
+ `, false, false),
446
+ };