@brandsync/wc 1.14.0 → 1.16.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 (402) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/REFERENCE.md +159 -0
  3. package/custom-elements.json +1739 -196
  4. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  5. package/dist/brandsync-wc/{p-e0927a9a.entry.js → p-0159f0da.entry.js} +1 -1
  6. package/dist/brandsync-wc/p-0228a584.entry.js +1 -0
  7. package/dist/brandsync-wc/{p-9d660c03.entry.js → p-0f97fe35.entry.js} +1 -1
  8. package/dist/brandsync-wc/{p-31cd66e0.entry.js → p-15f4c343.entry.js} +1 -1
  9. package/dist/brandsync-wc/{p-b6ac1b50.entry.js → p-1ca8b01e.entry.js} +1 -1
  10. package/dist/brandsync-wc/{p-47cd19aa.entry.js → p-23379d7c.entry.js} +1 -1
  11. package/dist/brandsync-wc/{p-16c78ff6.entry.js → p-298158da.entry.js} +1 -1
  12. package/dist/brandsync-wc/{p-b793a0d6.entry.js → p-2e285364.entry.js} +1 -1
  13. package/dist/brandsync-wc/{p-204cc690.entry.js → p-3488c4fc.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-e1b7bea7.entry.js → p-34b0c048.entry.js} +1 -1
  15. package/dist/brandsync-wc/p-36fe783a.entry.js +1 -0
  16. package/dist/brandsync-wc/{p-8184d7de.entry.js → p-38ac9aad.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-c488cc8b.entry.js → p-38fe9d07.entry.js} +1 -1
  18. package/dist/brandsync-wc/{p-6e923ebc.entry.js → p-401b3d3d.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-2c1efaa1.entry.js → p-42b79d95.entry.js} +1 -1
  20. package/dist/brandsync-wc/p-45986ad4.entry.js +1 -0
  21. package/dist/brandsync-wc/{p-227a5182.entry.js → p-4ca40386.entry.js} +1 -1
  22. package/dist/brandsync-wc/{p-9125632c.entry.js → p-4ed00786.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-80700878.entry.js → p-521d0fc2.entry.js} +1 -1
  24. package/dist/brandsync-wc/{p-bee30626.entry.js → p-538d5b58.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-9fa67924.entry.js → p-54f9529f.entry.js} +1 -1
  26. package/dist/brandsync-wc/{p-1b5cc9b8.entry.js → p-5a45ef51.entry.js} +1 -1
  27. package/dist/brandsync-wc/{p-ce16f038.entry.js → p-5ed1f45e.entry.js} +1 -1
  28. package/dist/brandsync-wc/{p-10290c41.entry.js → p-65fa1b21.entry.js} +1 -1
  29. package/dist/brandsync-wc/{p-df3e7973.entry.js → p-67629178.entry.js} +1 -1
  30. package/dist/brandsync-wc/{p-e6fc2cd4.entry.js → p-6cb21302.entry.js} +1 -1
  31. package/dist/brandsync-wc/{p-3477539c.entry.js → p-76748795.entry.js} +1 -1
  32. package/dist/brandsync-wc/p-769c5b4a.entry.js +1 -0
  33. package/dist/brandsync-wc/p-7b3518b8.entry.js +1 -0
  34. package/dist/brandsync-wc/p-7dc59e0b.entry.js +1 -0
  35. package/dist/brandsync-wc/{p-658532b7.entry.js → p-86774165.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-cc1055e6.entry.js → p-89ea6366.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-4b40a596.entry.js → p-912629c6.entry.js} +1 -1
  38. package/dist/brandsync-wc/p-949a4270.entry.js +1 -0
  39. package/dist/brandsync-wc/{p-c67bc817.entry.js → p-9beeb30c.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-d892277f.entry.js → p-a12691d8.entry.js} +1 -1
  41. package/dist/brandsync-wc/{p-315b510c.entry.js → p-a56bc608.entry.js} +1 -1
  42. package/dist/brandsync-wc/{p-2967240d.entry.js → p-abfa43f5.entry.js} +1 -1
  43. package/dist/brandsync-wc/{p-686297f1.entry.js → p-b6081bba.entry.js} +1 -1
  44. package/dist/brandsync-wc/{p-833f9dc4.entry.js → p-b663ee67.entry.js} +1 -1
  45. package/dist/brandsync-wc/{p-dd52209a.entry.js → p-b67a0c8f.entry.js} +1 -1
  46. package/dist/brandsync-wc/{p-fa6b9750.entry.js → p-b9c9bcba.entry.js} +1 -1
  47. package/dist/brandsync-wc/{p-617bd76d.entry.js → p-baa3d37a.entry.js} +1 -1
  48. package/dist/brandsync-wc/p-c25553bc.entry.js +1 -0
  49. package/dist/brandsync-wc/{p-45cb3e6d.entry.js → p-c85fe37b.entry.js} +1 -1
  50. package/dist/brandsync-wc/{p-2e68b76e.entry.js → p-cc4c8c1d.entry.js} +1 -1
  51. package/dist/brandsync-wc/{p-056608f0.entry.js → p-cf287ff1.entry.js} +1 -1
  52. package/dist/brandsync-wc/{p-cc25ee67.entry.js → p-d165a742.entry.js} +1 -1
  53. package/dist/brandsync-wc/{p-51f40972.entry.js → p-d81c4f58.entry.js} +1 -1
  54. package/dist/brandsync-wc/{p-94d435a2.entry.js → p-dcacee29.entry.js} +1 -1
  55. package/dist/brandsync-wc/{p-3dabf202.entry.js → p-e5f50e93.entry.js} +1 -1
  56. package/dist/brandsync-wc/{p-221244a9.entry.js → p-e72dd05e.entry.js} +1 -1
  57. package/dist/brandsync-wc/p-e9afb553.entry.js +1 -0
  58. package/dist/brandsync-wc/{p-0cb6fc39.entry.js → p-e9b6b30f.entry.js} +1 -1
  59. package/dist/brandsync-wc/{p-a2e59aca.entry.js → p-ed71eb02.entry.js} +1 -1
  60. package/dist/brandsync-wc/{p-e65d286c.entry.js → p-f0be9125.entry.js} +1 -1
  61. package/dist/brandsync-wc/p-f3cc961b.entry.js +1 -0
  62. package/dist/brandsync-wc/{p-6ca1e51b.entry.js → p-f4d1d56e.entry.js} +1 -1
  63. package/dist/cjs/brandsync-wc.cjs.js +1 -1
  64. package/dist/cjs/bs-accordion-group.cjs.entry.js +1 -1
  65. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +1 -1
  66. package/dist/cjs/bs-ai-greeting.cjs.entry.js +1 -1
  67. package/dist/cjs/bs-ai-thinking.cjs.entry.js +1 -1
  68. package/dist/cjs/bs-app-shell.cjs.entry.js +19 -0
  69. package/dist/cjs/bs-attachment-list.cjs.entry.js +1 -1
  70. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +1 -1
  71. package/dist/cjs/bs-button-skeleton.cjs.entry.js +1 -1
  72. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +1 -1
  73. package/dist/cjs/bs-chatbot-header.cjs.entry.js +1 -1
  74. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +1 -1
  75. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +1 -1
  76. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +1 -1
  77. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +1 -1
  78. package/dist/cjs/bs-citation-preview.cjs.entry.js +1 -1
  79. package/dist/cjs/bs-container.cjs.entry.js +23 -0
  80. package/dist/cjs/bs-data-table.cjs.entry.js +2 -2
  81. package/dist/cjs/bs-datepicker.cjs.entry.js +1 -1
  82. package/dist/cjs/bs-divider.cjs.entry.js +29 -0
  83. package/dist/cjs/bs-error-page.cjs.entry.js +1 -1
  84. package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
  85. package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
  86. package/dist/cjs/bs-grid.cjs.entry.js +55 -0
  87. package/dist/cjs/bs-icon-button.cjs.entry.js +1 -1
  88. package/dist/cjs/bs-icon-tile.cjs.entry.js +2 -2
  89. package/dist/cjs/bs-inline-tab.cjs.entry.js +1 -1
  90. package/dist/cjs/bs-input_3.cjs.entry.js +4 -4
  91. package/dist/cjs/bs-list-item.cjs.entry.js +66 -0
  92. package/dist/cjs/bs-list.cjs.entry.js +103 -0
  93. package/dist/cjs/bs-message-list.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-message.cjs.entry.js +1 -1
  95. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +1 -1
  96. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +2 -2
  97. package/dist/cjs/bs-navigation-header.cjs.entry.js +1 -1
  98. package/dist/cjs/bs-pagination.cjs.entry.js +1 -1
  99. package/dist/cjs/bs-popover.cjs.entry.js +1 -1
  100. package/dist/cjs/bs-progress-linear.cjs.entry.js +2 -2
  101. package/dist/cjs/bs-progress.cjs.entry.js +2 -2
  102. package/dist/cjs/bs-qr-code.cjs.entry.js +1 -1
  103. package/dist/cjs/bs-radio.cjs.entry.js +1 -1
  104. package/dist/cjs/bs-session-timeout.cjs.entry.js +1 -1
  105. package/dist/cjs/bs-skeleton.cjs.entry.js +1 -1
  106. package/dist/cjs/bs-slider.cjs.entry.js +1 -1
  107. package/dist/cjs/bs-snackbar.cjs.entry.js +1 -1
  108. package/dist/cjs/bs-source-link.cjs.entry.js +2 -2
  109. package/dist/cjs/bs-spinner.cjs.entry.js +1 -1
  110. package/dist/cjs/bs-split-pane.cjs.entry.js +1 -1
  111. package/dist/cjs/bs-stack.cjs.entry.js +81 -0
  112. package/dist/cjs/bs-stepper-step.cjs.entry.js +1 -1
  113. package/dist/cjs/bs-stepper.cjs.entry.js +1 -1
  114. package/dist/cjs/bs-switch.cjs.entry.js +1 -1
  115. package/dist/cjs/bs-tab_3.cjs.entry.js +3 -3
  116. package/dist/cjs/bs-timepicker.cjs.entry.js +2 -2
  117. package/dist/cjs/bs-toast.cjs.entry.js +1 -1
  118. package/dist/cjs/bs-tooltip-trigger.cjs.entry.js +1 -1
  119. package/dist/cjs/bs-tooltip.cjs.entry.js +1 -1
  120. package/dist/cjs/bs-tree-item.cjs.entry.js +94 -0
  121. package/dist/cjs/bs-tree.cjs.entry.js +197 -0
  122. package/dist/cjs/loader.cjs.js +1 -1
  123. package/dist/collection/collection-manifest.json +9 -0
  124. package/dist/collection/components/bs-accordion-group/bs-accordion-group.js +1 -1
  125. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  126. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  127. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  128. package/dist/collection/components/bs-app-shell/bs-app-shell.cmp.test.js +71 -0
  129. package/dist/collection/components/bs-app-shell/bs-app-shell.css +58 -0
  130. package/dist/collection/components/bs-app-shell/bs-app-shell.js +79 -0
  131. package/dist/collection/components/bs-app-shell/bs-app-shell.stories.js +34 -0
  132. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  133. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  134. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +1 -1
  135. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  136. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  137. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  138. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  139. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  140. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  141. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +1 -1
  142. package/dist/collection/components/bs-citation-preview/bs-citation-preview.js +1 -1
  143. package/dist/collection/components/bs-container/bs-container.cmp.test.js +59 -0
  144. package/dist/collection/components/bs-container/bs-container.css +16 -0
  145. package/dist/collection/components/bs-container/bs-container.js +88 -0
  146. package/dist/collection/components/bs-container/bs-container.stories.js +24 -0
  147. package/dist/collection/components/bs-data-table/bs-data-table.js +2 -2
  148. package/dist/collection/components/bs-datepicker/bs-datepicker.js +1 -1
  149. package/dist/collection/components/bs-divider/bs-divider.cmp.test.js +47 -0
  150. package/dist/collection/components/bs-divider/bs-divider.css +47 -0
  151. package/dist/collection/components/bs-divider/bs-divider.js +147 -0
  152. package/dist/collection/components/bs-divider/bs-divider.stories.js +32 -0
  153. package/dist/collection/components/bs-error-page/bs-error-page.js +1 -1
  154. package/dist/collection/components/bs-file-upload/bs-file-upload.js +1 -1
  155. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.js +1 -1
  156. package/dist/collection/components/bs-grid/bs-grid.cmp.test.js +58 -0
  157. package/dist/collection/components/bs-grid/bs-grid.css +10 -0
  158. package/dist/collection/components/bs-grid/bs-grid.js +208 -0
  159. package/dist/collection/components/bs-grid/bs-grid.stories.js +38 -0
  160. package/dist/collection/components/bs-icon-tile/bs-icon-tile.js +2 -2
  161. package/dist/collection/components/bs-input/bs-input.js +2 -2
  162. package/dist/collection/components/bs-list/bs-list.cmp.test.js +99 -0
  163. package/dist/collection/components/bs-list/bs-list.css +15 -0
  164. package/dist/collection/components/bs-list/bs-list.js +241 -0
  165. package/dist/collection/components/bs-list/bs-list.stories.js +43 -0
  166. package/dist/collection/components/bs-list-item/bs-list-item.cmp.test.js +137 -0
  167. package/dist/collection/components/bs-list-item/bs-list-item.css +139 -0
  168. package/dist/collection/components/bs-list-item/bs-list-item.js +343 -0
  169. package/dist/collection/components/bs-list-item/bs-list-item.stories.js +86 -0
  170. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  171. package/dist/collection/components/bs-menu-item/bs-menu-item.cmp.test.js +6 -0
  172. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  173. package/dist/collection/components/bs-message/bs-message.js +1 -1
  174. package/dist/collection/components/bs-message-list/bs-message-list.js +1 -1
  175. package/dist/collection/components/bs-pagination/bs-pagination.js +1 -1
  176. package/dist/collection/components/bs-popover/bs-popover.js +1 -1
  177. package/dist/collection/components/bs-progress/bs-progress.js +2 -2
  178. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
  179. package/dist/collection/components/bs-qr-code/bs-qr-code.js +1 -1
  180. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  181. package/dist/collection/components/bs-session-timeout/bs-session-timeout.js +1 -1
  182. package/dist/collection/components/bs-skeleton/bs-skeleton.js +1 -1
  183. package/dist/collection/components/bs-slider/bs-slider.js +1 -1
  184. package/dist/collection/components/bs-snackbar/bs-snackbar.js +1 -1
  185. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  186. package/dist/collection/components/bs-spinner/bs-spinner.js +1 -1
  187. package/dist/collection/components/bs-split-pane/bs-split-pane.js +1 -1
  188. package/dist/collection/components/bs-stack/bs-stack.cmp.test.js +113 -0
  189. package/dist/collection/components/bs-stack/bs-stack.css +22 -0
  190. package/dist/collection/components/bs-stack/bs-stack.js +252 -0
  191. package/dist/collection/components/bs-stack/bs-stack.stories.js +36 -0
  192. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  193. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
  194. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  195. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  196. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  197. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  198. package/dist/collection/components/bs-timepicker/bs-timepicker.js +2 -2
  199. package/dist/collection/components/bs-toast/bs-toast.js +1 -1
  200. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  201. package/dist/collection/components/bs-tooltip-trigger/bs-tooltip-trigger.js +1 -1
  202. package/dist/collection/components/bs-tree/bs-tree.cmp.test.js +166 -0
  203. package/dist/collection/components/bs-tree/bs-tree.css +8 -0
  204. package/dist/collection/components/bs-tree/bs-tree.js +354 -0
  205. package/dist/collection/components/bs-tree/bs-tree.stories.js +34 -0
  206. package/dist/collection/components/bs-tree-item/bs-tree-item.cmp.test.js +187 -0
  207. package/dist/collection/components/bs-tree-item/bs-tree-item.css +161 -0
  208. package/dist/collection/components/bs-tree-item/bs-tree-item.js +305 -0
  209. package/dist/collection/components/bs-tree-item/bs-tree-item.stories.js +54 -0
  210. package/dist/collection/components/bs-whats-new-entry/bs-whats-new-entry.js +1 -1
  211. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +2 -2
  212. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  213. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  214. package/dist/components/bs-accordion-group.js +1 -1
  215. package/dist/components/bs-ai-disclaimer.js +1 -1
  216. package/dist/components/bs-ai-greeting.js +1 -1
  217. package/dist/components/bs-ai-thinking.js +1 -1
  218. package/dist/components/bs-app-shell.d.ts +11 -0
  219. package/dist/components/bs-app-shell.js +1 -0
  220. package/dist/components/bs-attachment-list.js +1 -1
  221. package/dist/components/bs-attachment.js +1 -1
  222. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  223. package/dist/components/bs-breadcrumbs.js +1 -1
  224. package/dist/components/bs-button-skeleton.js +1 -1
  225. package/dist/components/bs-carousel.js +1 -1
  226. package/dist/components/bs-chatbot-feedback.js +1 -1
  227. package/dist/components/bs-chatbot-header.js +1 -1
  228. package/dist/components/bs-chatbot-response-action.js +1 -1
  229. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  230. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  231. package/dist/components/bs-checkbox-skeleton.js +1 -1
  232. package/dist/components/bs-citation-preview.js +1 -1
  233. package/dist/components/bs-container.d.ts +11 -0
  234. package/dist/components/bs-container.js +1 -0
  235. package/dist/components/bs-cookie-consent.js +1 -1
  236. package/dist/components/bs-data-table.js +1 -1
  237. package/dist/components/bs-datepicker.js +1 -1
  238. package/dist/components/bs-dialog.js +1 -1
  239. package/dist/components/bs-divider.d.ts +11 -0
  240. package/dist/components/bs-divider.js +1 -0
  241. package/dist/components/bs-error-page.js +1 -1
  242. package/dist/components/bs-file-upload-item.js +1 -1
  243. package/dist/components/bs-file-upload.js +1 -1
  244. package/dist/components/bs-grid.d.ts +11 -0
  245. package/dist/components/bs-grid.js +1 -0
  246. package/dist/components/bs-icon-button.js +1 -1
  247. package/dist/components/bs-icon-tile.js +1 -1
  248. package/dist/components/bs-inline-tab.js +1 -1
  249. package/dist/components/bs-input.js +1 -1
  250. package/dist/components/bs-list-item.d.ts +11 -0
  251. package/dist/components/bs-list-item.js +1 -0
  252. package/dist/components/bs-list.d.ts +11 -0
  253. package/dist/components/bs-list.js +1 -0
  254. package/dist/components/bs-menu-item.js +1 -1
  255. package/dist/components/bs-menu.js +1 -1
  256. package/dist/components/bs-message-list.js +1 -1
  257. package/dist/components/bs-message.js +1 -1
  258. package/dist/components/bs-navigation-drawer-item.js +1 -1
  259. package/dist/components/bs-navigation-drawer.js +1 -1
  260. package/dist/components/bs-navigation-header.js +1 -1
  261. package/dist/components/bs-onboarding-checklist.js +1 -1
  262. package/dist/components/bs-pagination.js +1 -1
  263. package/dist/components/bs-popover.js +1 -1
  264. package/dist/components/bs-product-tour.js +1 -1
  265. package/dist/components/bs-progress-linear.js +1 -1
  266. package/dist/components/bs-progress.js +1 -1
  267. package/dist/components/bs-qr-code.js +1 -1
  268. package/dist/components/bs-radio.js +1 -1
  269. package/dist/components/bs-session-timeout.js +1 -1
  270. package/dist/components/bs-side-panel.js +1 -1
  271. package/dist/components/bs-skeleton.js +1 -1
  272. package/dist/components/bs-slider.js +1 -1
  273. package/dist/components/bs-snackbar.js +1 -1
  274. package/dist/components/bs-source-link.js +1 -1
  275. package/dist/components/bs-spinner.js +1 -1
  276. package/dist/components/bs-split-pane.js +1 -1
  277. package/dist/components/bs-stack.d.ts +11 -0
  278. package/dist/components/bs-stack.js +1 -0
  279. package/dist/components/bs-stepper-step.js +1 -1
  280. package/dist/components/bs-stepper.js +1 -1
  281. package/dist/components/bs-switch.js +1 -1
  282. package/dist/components/bs-tab.js +1 -1
  283. package/dist/components/bs-tabs.js +1 -1
  284. package/dist/components/bs-timepicker.js +1 -1
  285. package/dist/components/bs-toast.js +1 -1
  286. package/dist/components/bs-tooltip-trigger.js +1 -1
  287. package/dist/components/bs-tooltip.js +1 -1
  288. package/dist/components/bs-tree-item.d.ts +11 -0
  289. package/dist/components/bs-tree-item.js +1 -0
  290. package/dist/components/bs-tree.d.ts +11 -0
  291. package/dist/components/bs-tree.js +1 -0
  292. package/dist/components/bs-whats-new-entry.js +1 -1
  293. package/dist/components/bs-whats-new.js +1 -1
  294. package/dist/components/{p-CrmEXUwm.js → p-B128GX8H.js} +1 -1
  295. package/dist/components/{p-Rx4bpeYN.js → p-B80vOwH6.js} +1 -1
  296. package/dist/components/p-BaJEv6rL.js +1 -0
  297. package/dist/components/{p-BESyTlfT.js → p-Bb1-2M8K.js} +1 -1
  298. package/dist/components/{p-nC2VxRNo.js → p-BdkE4auv.js} +1 -1
  299. package/dist/components/{p-BIW9eUic.js → p-BsbtyRJV.js} +1 -1
  300. package/dist/components/{p-BJR8KVFc.js → p-ByLUtXxO.js} +1 -1
  301. package/dist/components/p-C7RZ6qZC.js +1 -0
  302. package/dist/components/{p-HzaOqQ0U.js → p-C93ymWm7.js} +1 -1
  303. package/dist/components/{p-DpVeeIko.js → p-CK7fiES5.js} +1 -1
  304. package/dist/components/{p-QnTjSed5.js → p-CQjSDdH7.js} +1 -1
  305. package/dist/components/{p-HAmR4gM2.js → p-D0KM1R2i.js} +1 -1
  306. package/dist/components/{p-CDYw4Eyj.js → p-DFKc3lLA.js} +1 -1
  307. package/dist/components/{p-DAwSBMeM.js → p-GTDI4Ibw.js} +1 -1
  308. package/dist/components/{p-Dm3TqgV_.js → p-J9cxcDhY.js} +1 -1
  309. package/dist/components/{p-CiSEDtbE.js → p-kDJsWjTN.js} +1 -1
  310. package/dist/esm/brandsync-wc.js +1 -1
  311. package/dist/esm/bs-accordion-group.entry.js +1 -1
  312. package/dist/esm/bs-ai-disclaimer.entry.js +1 -1
  313. package/dist/esm/bs-ai-greeting.entry.js +1 -1
  314. package/dist/esm/bs-ai-thinking.entry.js +1 -1
  315. package/dist/esm/bs-app-shell.entry.js +17 -0
  316. package/dist/esm/bs-attachment-list.entry.js +1 -1
  317. package/dist/esm/bs-breadcrumbs.entry.js +1 -1
  318. package/dist/esm/bs-button-skeleton.entry.js +1 -1
  319. package/dist/esm/bs-chatbot-feedback.entry.js +1 -1
  320. package/dist/esm/bs-chatbot-header.entry.js +1 -1
  321. package/dist/esm/bs-chatbot-response-action.entry.js +1 -1
  322. package/dist/esm/bs-chatbot-sources-drawer.entry.js +1 -1
  323. package/dist/esm/bs-chatbot-suggestion-button.entry.js +1 -1
  324. package/dist/esm/bs-checkbox-skeleton.entry.js +1 -1
  325. package/dist/esm/bs-citation-preview.entry.js +1 -1
  326. package/dist/esm/bs-container.entry.js +21 -0
  327. package/dist/esm/bs-data-table.entry.js +2 -2
  328. package/dist/esm/bs-datepicker.entry.js +1 -1
  329. package/dist/esm/bs-divider.entry.js +27 -0
  330. package/dist/esm/bs-error-page.entry.js +1 -1
  331. package/dist/esm/bs-file-upload-item.entry.js +1 -1
  332. package/dist/esm/bs-file-upload.entry.js +1 -1
  333. package/dist/esm/bs-grid.entry.js +53 -0
  334. package/dist/esm/bs-icon-button.entry.js +1 -1
  335. package/dist/esm/bs-icon-tile.entry.js +2 -2
  336. package/dist/esm/bs-inline-tab.entry.js +1 -1
  337. package/dist/esm/bs-input_3.entry.js +4 -4
  338. package/dist/esm/bs-list-item.entry.js +64 -0
  339. package/dist/esm/bs-list.entry.js +101 -0
  340. package/dist/esm/bs-message-list.entry.js +1 -1
  341. package/dist/esm/bs-message.entry.js +1 -1
  342. package/dist/esm/bs-navigation-drawer-item.entry.js +1 -1
  343. package/dist/esm/bs-navigation-drawer.entry.js +2 -2
  344. package/dist/esm/bs-navigation-header.entry.js +1 -1
  345. package/dist/esm/bs-pagination.entry.js +1 -1
  346. package/dist/esm/bs-popover.entry.js +1 -1
  347. package/dist/esm/bs-progress-linear.entry.js +2 -2
  348. package/dist/esm/bs-progress.entry.js +2 -2
  349. package/dist/esm/bs-qr-code.entry.js +1 -1
  350. package/dist/esm/bs-radio.entry.js +1 -1
  351. package/dist/esm/bs-session-timeout.entry.js +1 -1
  352. package/dist/esm/bs-skeleton.entry.js +1 -1
  353. package/dist/esm/bs-slider.entry.js +1 -1
  354. package/dist/esm/bs-snackbar.entry.js +1 -1
  355. package/dist/esm/bs-source-link.entry.js +2 -2
  356. package/dist/esm/bs-spinner.entry.js +1 -1
  357. package/dist/esm/bs-split-pane.entry.js +1 -1
  358. package/dist/esm/bs-stack.entry.js +79 -0
  359. package/dist/esm/bs-stepper-step.entry.js +1 -1
  360. package/dist/esm/bs-stepper.entry.js +1 -1
  361. package/dist/esm/bs-switch.entry.js +1 -1
  362. package/dist/esm/bs-tab_3.entry.js +3 -3
  363. package/dist/esm/bs-timepicker.entry.js +2 -2
  364. package/dist/esm/bs-toast.entry.js +1 -1
  365. package/dist/esm/bs-tooltip-trigger.entry.js +1 -1
  366. package/dist/esm/bs-tooltip.entry.js +1 -1
  367. package/dist/esm/bs-tree-item.entry.js +92 -0
  368. package/dist/esm/bs-tree.entry.js +195 -0
  369. package/dist/esm/loader.js +1 -1
  370. package/dist/types/components/bs-app-shell/bs-app-shell.cmp.test.d.ts +1 -0
  371. package/dist/types/components/bs-app-shell/bs-app-shell.d.ts +40 -0
  372. package/dist/types/components/bs-app-shell/bs-app-shell.stories.d.ts +11 -0
  373. package/dist/types/components/bs-container/bs-container.cmp.test.d.ts +1 -0
  374. package/dist/types/components/bs-container/bs-container.d.ts +22 -0
  375. package/dist/types/components/bs-container/bs-container.stories.d.ts +15 -0
  376. package/dist/types/components/bs-divider/bs-divider.cmp.test.d.ts +1 -0
  377. package/dist/types/components/bs-divider/bs-divider.d.ts +29 -0
  378. package/dist/types/components/bs-divider/bs-divider.stories.d.ts +16 -0
  379. package/dist/types/components/bs-grid/bs-grid.cmp.test.d.ts +1 -0
  380. package/dist/types/components/bs-grid/bs-grid.d.ts +43 -0
  381. package/dist/types/components/bs-grid/bs-grid.stories.d.ts +18 -0
  382. package/dist/types/components/bs-list/bs-list.cmp.test.d.ts +1 -0
  383. package/dist/types/components/bs-list/bs-list.d.ts +42 -0
  384. package/dist/types/components/bs-list/bs-list.stories.d.ts +13 -0
  385. package/dist/types/components/bs-list-item/bs-list-item.cmp.test.d.ts +1 -0
  386. package/dist/types/components/bs-list-item/bs-list-item.d.ts +85 -0
  387. package/dist/types/components/bs-list-item/bs-list-item.stories.d.ts +22 -0
  388. package/dist/types/components/bs-stack/bs-stack.cmp.test.d.ts +1 -0
  389. package/dist/types/components/bs-stack/bs-stack.d.ts +46 -0
  390. package/dist/types/components/bs-stack/bs-stack.stories.d.ts +18 -0
  391. package/dist/types/components/bs-tree/bs-tree.cmp.test.d.ts +1 -0
  392. package/dist/types/components/bs-tree/bs-tree.d.ts +53 -0
  393. package/dist/types/components/bs-tree/bs-tree.stories.d.ts +11 -0
  394. package/dist/types/components/bs-tree-item/bs-tree-item.cmp.test.d.ts +1 -0
  395. package/dist/types/components/bs-tree-item/bs-tree-item.d.ts +60 -0
  396. package/dist/types/components/bs-tree-item/bs-tree-item.stories.d.ts +19 -0
  397. package/dist/types/components.d.ts +1257 -0
  398. package/package.json +1 -1
  399. package/reference.d.ts +27 -0
  400. package/reference.json +428 -0
  401. package/dist/brandsync-wc/p-0e738622.entry.js +0 -1
  402. package/dist/components/p-zscW5LNR.js +0 -1
@@ -0,0 +1,187 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ import { userEvent } from "vitest/browser";
3
+ import { assertShadowParts, runAxeCheck } from "../../test/helpers/conventions";
4
+ const tree = () => (h("bs-tree", { ariaLabel: "Files" }, h("bs-tree-item", { label: "src", value: "src", expanded: true }, h("bs-tree-item", { label: "components", value: "components", expanded: true }, h("bs-tree-item", { label: "button.tsx", value: "button" })), h("bs-tree-item", { label: "index.ts", value: "index" }))));
5
+ const byValue = (root, v) => Array.from(root.querySelectorAll('bs-tree-item')).find(i => i.value === v);
6
+ const pill = (item) => item.shadowRoot.querySelector('[part="container"]');
7
+ const bgOf = (el) => getComputedStyle(el).backgroundColor;
8
+ const probe = (token) => {
9
+ const p = document.createElement('div');
10
+ p.style.background = `var(${token})`;
11
+ document.body.appendChild(p);
12
+ const c = getComputedStyle(p).backgroundColor;
13
+ p.remove();
14
+ return c;
15
+ };
16
+ describe('bs-tree-item', () => {
17
+ it('computes level, indent and row geometry', async () => {
18
+ const { root } = await render(tree());
19
+ const [l1, l2, l3] = ['src', 'components', 'button'].map(v => byValue(root, v));
20
+ expect(l1).toEqualAttribute('aria-level', '1');
21
+ expect(l2).toEqualAttribute('aria-level', '2');
22
+ expect(l3).toEqualAttribute('aria-level', '3');
23
+ const host = l1.getBoundingClientRect();
24
+ [l1, l2, l3].forEach((item, i) => {
25
+ const row = item.shadowRoot.querySelector('.bs-tree-item__row');
26
+ expect(row.getBoundingClientRect().height).toBe(48);
27
+ expect(getComputedStyle(row).paddingInlineStart).toBe(`${i * 40}px`);
28
+ const p = pill(item);
29
+ expect(p.getBoundingClientRect().left - host.left).toBe(i * 40);
30
+ expect(getComputedStyle(p).paddingLeft).toBe('4px');
31
+ expect(getComputedStyle(p).borderTopLeftRadius).toBe('8px');
32
+ });
33
+ });
34
+ it('parent has caret + 12px gap, 8px icon gap; leaf has no caret', async () => {
35
+ const { root } = await render(tree());
36
+ const parent = byValue(root, 'src');
37
+ const leaf = byValue(root, 'index');
38
+ expect(getComputedStyle(pill(parent)).columnGap).toBe('12px');
39
+ const content = parent.shadowRoot.querySelector('.bs-tree-item__content');
40
+ expect(getComputedStyle(content).columnGap).toBe('8px');
41
+ expect(parent.shadowRoot.querySelector('[part="caret"]')).not.toBeNull();
42
+ expect(leaf.shadowRoot.querySelector('[part="caret"]')).toBeNull();
43
+ expect(pill(leaf).querySelector('[part="icon"]').getBoundingClientRect().left - pill(leaf).getBoundingClientRect().left).toBe(4);
44
+ assertShadowParts(parent.shadowRoot, ['container', 'caret', 'icon', 'label', 'group']);
45
+ });
46
+ it('rotates the caret when open, and aria-expanded only on parents', async () => {
47
+ const { root, waitForChanges } = await render(h("bs-tree-item", { label: "Docs" }, h("bs-tree-item", { label: "a" })));
48
+ const item = root;
49
+ await waitForChanges();
50
+ const caret = item.shadowRoot.querySelector('[part="caret"]');
51
+ expect(item).toEqualAttribute('aria-expanded', 'false');
52
+ expect(getComputedStyle(caret).transform).toBe('none');
53
+ item.expanded = true;
54
+ await waitForChanges();
55
+ expect(item).toEqualAttribute('aria-expanded', 'true');
56
+ expect(getComputedStyle(caret).transform).not.toBe('none');
57
+ const child = item.querySelector('bs-tree-item');
58
+ expect(child.hasAttribute('aria-expanded')).toBe(false);
59
+ });
60
+ it('only renders children (group) while expanded', async () => {
61
+ const { root, waitForChanges } = await render(h("bs-tree-item", { label: "Docs" }, h("bs-tree-item", { label: "a" })));
62
+ const item = root;
63
+ const child = item.querySelector('bs-tree-item');
64
+ await waitForChanges();
65
+ expect(item.shadowRoot.querySelector('[role="group"]')).toBeNull();
66
+ expect(child.getBoundingClientRect().height).toBe(0);
67
+ item.expanded = true;
68
+ await waitForChanges();
69
+ expect(item.shadowRoot.querySelector('[role="group"]')).not.toBeNull();
70
+ expect(child.getBoundingClientRect().height).toBe(48);
71
+ });
72
+ it('emits bsToggle from the caret without selecting, and bsSelect from the row', async () => {
73
+ const { root, waitForChanges } = await render(h("bs-tree-item", { label: "Docs", value: "docs" }, h("bs-tree-item", { label: "a" })));
74
+ const item = root;
75
+ await waitForChanges();
76
+ const toggles = [];
77
+ const selects = [];
78
+ item.addEventListener('bsToggle', e => toggles.push(e.detail));
79
+ item.addEventListener('bsSelect', e => selects.push(e.detail));
80
+ item.shadowRoot.querySelector('[part="caret"]').click();
81
+ await waitForChanges();
82
+ expect(toggles).toEqual([true]);
83
+ expect(selects).toEqual([]);
84
+ expect(item.expanded).toBe(true);
85
+ pill(item).click();
86
+ expect(selects).toEqual(['docs']);
87
+ expect(toggles).toEqual([true]);
88
+ });
89
+ it('showIcon=false hides the icon and the icon slot overrides the default', async () => {
90
+ const { root, waitForChanges } = await render(h("div", null, h("bs-tree-item", { id: "a", label: "A", showIcon: false }), h("bs-tree-item", { id: "b", label: "B" }, h("span", { slot: "icon", id: "custom" }, "*"))));
91
+ await waitForChanges();
92
+ const a = root.querySelector('#a');
93
+ const b = root.querySelector('#b');
94
+ expect(a.shadowRoot.querySelector('[part="icon"]')).toBeNull();
95
+ const slot = b.shadowRoot.querySelector('slot[name="icon"]');
96
+ expect(slot.assignedElements()[0].id).toBe('custom');
97
+ });
98
+ it('label slot overrides the label', async () => {
99
+ const { root, waitForChanges } = await render(h("bs-tree-item", { label: "Plain" }, h("b", { slot: "label" }, "Rich")));
100
+ await waitForChanges();
101
+ const slot = root.shadowRoot.querySelector('slot[name="label"]');
102
+ expect(slot.assignedElements()[0].textContent).toBe('Rich');
103
+ });
104
+ it('pill background per state matches the token', async () => {
105
+ const { root, waitForChanges } = await render(h("div", null, h("bs-tree-item", { id: "n", label: "n" }), h("bs-tree-item", { id: "s", label: "s", selected: true })));
106
+ await waitForChanges();
107
+ const n = root.querySelector('#n');
108
+ const s = root.querySelector('#s');
109
+ // The shared browser keeps its pointer where an earlier test left it, which can leave a row
110
+ // hovered (and mid-fade); move it away and let transitions finish before reading backgrounds.
111
+ await userEvent.unhover(pill(n));
112
+ await new Promise(r => setTimeout(r, 250));
113
+ expect(bgOf(pill(n))).toBe('rgba(0, 0, 0, 0)');
114
+ expect(bgOf(pill(s))).toBe(probe('--bs-surface-selected'));
115
+ // Hover via a real pointer move.
116
+ await userEvent.hover(pill(n));
117
+ expect(bgOf(pill(n))).toBe(probe('--bs-surface-hover'));
118
+ await userEvent.hover(pill(s));
119
+ expect(bgOf(pill(s))).toBe(probe('--bs-surface-selected-hover'));
120
+ });
121
+ it('shows the focus surface and a 2px ring on keyboard focus', async () => {
122
+ const { root, waitForChanges } = await render(h("div", null, h("bs-tree-item", { id: "n", label: "n" }), h("bs-tree-item", { id: "s", label: "s", selected: true })));
123
+ await waitForChanges();
124
+ const n = root.querySelector('#n');
125
+ const s = root.querySelector('#s');
126
+ await userEvent.tab();
127
+ expect(document.activeElement).toBe(n);
128
+ const cs = getComputedStyle(pill(n));
129
+ expect(cs.outlineWidth).toBe('2px');
130
+ expect(cs.outlineStyle).toBe('solid');
131
+ expect(cs.outlineColor).toBe(probe('--bs-border-primary-hover'));
132
+ expect(cs.outlineOffset).toBe('0px');
133
+ expect(cs.backgroundColor).toBe(probe('--bs-surface-focus'));
134
+ await userEvent.tab();
135
+ expect(document.activeElement).toBe(s);
136
+ expect(bgOf(pill(s))).toBe(probe('--bs-surface-selected-focus'));
137
+ });
138
+ it('disabled: not focusable, ignores clicks, dimmed text', async () => {
139
+ const { root, waitForChanges } = await render(h("div", null, h("bs-tree-item", { id: "d", label: "d", disabled: true }, h("bs-tree-item", { label: "x" })), h("bs-tree-item", { id: "e", label: "e" })));
140
+ await waitForChanges();
141
+ const d = root.querySelector('#d');
142
+ const e = root.querySelector('#e');
143
+ expect(d).toEqualAttribute('aria-disabled', 'true');
144
+ expect(d.hasAttribute('tabindex')).toBe(false);
145
+ let selects = 0;
146
+ d.addEventListener('bsSelect', () => selects++);
147
+ pill(d).click();
148
+ d.shadowRoot.querySelector('[part="caret"]').click();
149
+ await waitForChanges();
150
+ expect(selects).toBe(0);
151
+ expect(d.expanded).toBe(false);
152
+ await userEvent.tab();
153
+ expect(document.activeElement).toBe(e);
154
+ expect(getComputedStyle(d).color).toBe(probe('--bs-text-on-disabled').replace(/^/, ''));
155
+ expect(getComputedStyle(pill(d)).cursor).toBe('default');
156
+ await userEvent.hover(pill(d));
157
+ expect(bgOf(pill(d))).toBe('rgba(0, 0, 0, 0)');
158
+ });
159
+ it('text colour follows the theme (dark mode)', async () => {
160
+ const { root, waitForChanges } = await render(h("bs-tree-item", { label: "Theme" }));
161
+ await waitForChanges();
162
+ const item = root;
163
+ const light = getComputedStyle(item).color;
164
+ const html = document.documentElement;
165
+ const prev = html.getAttribute('data-theme');
166
+ html.setAttribute('data-theme', 'dark');
167
+ try {
168
+ const dark = getComputedStyle(item).color;
169
+ const p = document.createElement('span');
170
+ p.style.color = 'var(--bs-text-default)';
171
+ document.body.appendChild(p);
172
+ expect(dark).toBe(getComputedStyle(p).color);
173
+ p.remove();
174
+ expect(dark).not.toBe(light);
175
+ }
176
+ finally {
177
+ if (prev === null)
178
+ html.removeAttribute('data-theme');
179
+ else
180
+ html.setAttribute('data-theme', prev);
181
+ }
182
+ });
183
+ it('has no axe violations', async () => {
184
+ const { root } = await render(tree());
185
+ await runAxeCheck(root);
186
+ });
187
+ });
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @prop --bs-tree-item-height: Row height (48px). Aliased to --bs-spacing-600.
3
+ * @prop --bs-tree-item-indent: Extra indent per nesting level. Set directly in px (no 40px spacing token), matching Figma.
4
+ * @prop --bs-tree-item-radius: Pill corner radius. Aliased to --bs-border-radius-100.
5
+ * @prop --bs-tree-item-padding-x: Pill horizontal padding. Aliased to --bs-spacing-50.
6
+ * @prop --bs-tree-item-caret-gap: Gap between the caret and the icon/label group. Aliased to --bs-spacing-150.
7
+ * @prop --bs-tree-item-content-gap: Gap between the icon and the label. Aliased to --bs-spacing-100.
8
+ * @prop --bs-tree-item-font-size: Label font size. Aliased to --bs-font-size-md.
9
+ * @prop --bs-tree-item-line-height: Label line height (unitless px number). Aliased to --bs-line-height-body-md.
10
+ * @prop --bs-tree-item-text: Label colour. Aliased to --bs-text-default.
11
+ * @prop --bs-tree-item-icon: Icon and caret colour. Aliased to --bs-icon-default.
12
+ * @prop --bs-tree-item-bg-selected: Pill background, selected. Aliased to --bs-surface-selected.
13
+ * @prop --bs-tree-item-bg-hover: Pill background, hovered. Aliased to --bs-surface-hover.
14
+ * @prop --bs-tree-item-bg-pressed: Pill background, pressed. Aliased to --bs-surface-pressed.
15
+ * @prop --bs-tree-item-bg-focus: Pill background, keyboard-focused. Aliased to --bs-surface-focus.
16
+ * @prop --bs-tree-item-bg-selected-hover: Pill background, selected and hovered. Aliased to --bs-surface-selected-hover.
17
+ * @prop --bs-tree-item-bg-selected-pressed: Pill background, selected and pressed. Aliased to --bs-surface-selected-pressed.
18
+ * @prop --bs-tree-item-bg-selected-focus: Pill background, selected and keyboard-focused. Aliased to --bs-surface-selected-focus.
19
+ * @prop --bs-tree-item-focus-ring: Focus ring colour. Aliased to --bs-border-primary-hover.
20
+ * @prop --bs-tree-item-text-disabled: Label colour, disabled. Aliased to --bs-text-on-disabled.
21
+ * @prop --bs-tree-item-icon-disabled: Icon and caret colour, disabled. Aliased to --bs-icon-disabled.
22
+ */
23
+ :host {
24
+ display: block;
25
+ outline: none;
26
+
27
+ --bs-tree-item-height: var(--bs-spacing-600);
28
+ --bs-tree-item-indent: 40px;
29
+ --bs-tree-item-radius: var(--bs-border-radius-100);
30
+ --bs-tree-item-padding-x: var(--bs-spacing-50);
31
+ --bs-tree-item-caret-gap: var(--bs-spacing-150);
32
+ --bs-tree-item-content-gap: var(--bs-spacing-100);
33
+ --bs-tree-item-font-size: var(--bs-font-size-md);
34
+ --bs-tree-item-line-height: var(--bs-line-height-body-md);
35
+ --bs-tree-item-text: var(--bs-text-default);
36
+ --bs-tree-item-icon: var(--bs-icon-default);
37
+ --bs-tree-item-bg-selected: var(--bs-surface-selected);
38
+ --bs-tree-item-bg-hover: var(--bs-surface-hover);
39
+ --bs-tree-item-bg-pressed: var(--bs-surface-pressed);
40
+ --bs-tree-item-bg-focus: var(--bs-surface-focus);
41
+ --bs-tree-item-bg-selected-hover: var(--bs-surface-selected-hover);
42
+ --bs-tree-item-bg-selected-pressed: var(--bs-surface-selected-pressed);
43
+ --bs-tree-item-bg-selected-focus: var(--bs-surface-selected-focus);
44
+ --bs-tree-item-focus-ring: var(--bs-border-primary-hover);
45
+ --bs-tree-item-text-disabled: var(--bs-text-on-disabled);
46
+ --bs-tree-item-icon-disabled: var(--bs-icon-disabled);
47
+
48
+ /* Text colour on the host so slotted label/icon content inherits it (light and dark). */
49
+ color: var(--bs-tree-item-text);
50
+ font-family: inherit;
51
+ }
52
+
53
+ :host([disabled]) {
54
+ color: var(--bs-tree-item-text-disabled);
55
+ }
56
+
57
+ .bs-tree-item__row {
58
+ box-sizing: border-box;
59
+ width: 100%;
60
+ height: var(--bs-tree-item-height);
61
+ display: flex;
62
+ padding-inline-start: calc((var(--bs-tree-item-level, 1) - 1) * var(--bs-tree-item-indent));
63
+ }
64
+
65
+ .bs-tree-item__container {
66
+ box-sizing: border-box;
67
+ flex: 1;
68
+ min-width: 0;
69
+ height: 100%;
70
+ display: flex;
71
+ align-items: center;
72
+ gap: var(--bs-tree-item-caret-gap);
73
+ padding-inline: var(--bs-tree-item-padding-x);
74
+ border-radius: var(--bs-tree-item-radius);
75
+ background: transparent;
76
+ cursor: pointer;
77
+ }
78
+
79
+ .bs-tree-item__container--selected {
80
+ background: var(--bs-tree-item-bg-selected);
81
+ }
82
+
83
+ .bs-tree-item__container:not(.bs-tree-item__container--disabled):hover {
84
+ background: var(--bs-tree-item-bg-hover);
85
+ }
86
+ .bs-tree-item__container--selected:not(.bs-tree-item__container--disabled):hover {
87
+ background: var(--bs-tree-item-bg-selected-hover);
88
+ }
89
+ .bs-tree-item__container:not(.bs-tree-item__container--disabled):active {
90
+ background: var(--bs-tree-item-bg-pressed);
91
+ }
92
+ .bs-tree-item__container--selected:not(.bs-tree-item__container--disabled):active {
93
+ background: var(--bs-tree-item-bg-selected-pressed);
94
+ }
95
+
96
+ /* Keyboard focus lives on the host; the ring is an outline on the pill (offset 0 = drawn just
97
+ outside it, following the pill's radius), so nothing clips it. */
98
+ :host(:focus-visible) .bs-tree-item__container {
99
+ background: var(--bs-tree-item-bg-focus);
100
+ outline: 2px solid var(--bs-tree-item-focus-ring);
101
+ outline-offset: 0;
102
+ }
103
+ :host(:focus-visible) .bs-tree-item__container--selected {
104
+ background: var(--bs-tree-item-bg-selected-focus);
105
+ }
106
+
107
+ .bs-tree-item__container--disabled {
108
+ cursor: default;
109
+ }
110
+
111
+ .bs-tree-item__caret {
112
+ display: flex;
113
+ flex: none;
114
+ width: 24px;
115
+ height: 24px;
116
+ color: var(--bs-tree-item-icon);
117
+ transition: transform 150ms ease;
118
+ }
119
+ .bs-tree-item__caret--open {
120
+ transform: rotate(90deg);
121
+ }
122
+ .bs-tree-item__caret svg,
123
+ .bs-tree-item__icon svg {
124
+ width: 24px;
125
+ height: 24px;
126
+ }
127
+
128
+ .bs-tree-item__content {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: var(--bs-tree-item-content-gap);
132
+ min-width: 0;
133
+ }
134
+
135
+ .bs-tree-item__icon {
136
+ display: flex;
137
+ flex: none;
138
+ width: 24px;
139
+ height: 24px;
140
+ color: var(--bs-tree-item-icon);
141
+ }
142
+
143
+ .bs-tree-item__label {
144
+ min-width: 0;
145
+ font-size: var(--bs-tree-item-font-size);
146
+ line-height: calc(var(--bs-tree-item-line-height) * 1px);
147
+ font-weight: var(--bs-font-weight-regular);
148
+ color: inherit;
149
+ word-break: break-word;
150
+ }
151
+
152
+ .bs-tree-item__container--disabled .bs-tree-item__caret,
153
+ .bs-tree-item__container--disabled .bs-tree-item__icon {
154
+ color: var(--bs-tree-item-icon-disabled);
155
+ }
156
+
157
+ @media (prefers-reduced-motion: reduce) {
158
+ .bs-tree-item__caret {
159
+ transition: none;
160
+ }
161
+ }
@@ -0,0 +1,305 @@
1
+ import { Host, h } from "@stencil/core";
2
+ /**
3
+ * A single row of a `bs-tree`. An item that contains child `bs-tree-item` elements is a parent
4
+ * (it gets an expand/collapse caret and a folder icon); an item without children is a leaf (no
5
+ * caret, file icon).
6
+ *
7
+ * The host carries `role="treeitem"` and the `aria-*` state; the owning `bs-tree` manages the
8
+ * roving `tabindex`, selection and keyboard navigation. Nesting depth is computed automatically
9
+ * from the number of ancestor `bs-tree-item` elements and exposed as `aria-level` -- it is not a
10
+ * prop. Clicking the row selects it; clicking the caret (or pressing Right/Left in a tree) toggles
11
+ * expansion -- the two are deliberately separate.
12
+ *
13
+ * Built from: inline SVG icons only (no existing `bs-*` component covers a tree row).
14
+ *
15
+ * @slot - Default slot: child `bs-tree-item` elements (the subtree). Only rendered, inside a
16
+ * `role="group"` wrapper, while the item is expanded; collapsed children are not accessible.
17
+ * @slot label - Overrides the `label` text.
18
+ * @slot icon - Overrides the default folder / file icon. Only used when `showIcon` is `true`.
19
+ * @part container - The highlighted row pill (carries the hover / selected / focus states).
20
+ * @part caret - The expand/collapse caret (parents only).
21
+ * @part icon - The icon wrapper.
22
+ * @part label - The label wrapper.
23
+ * @part group - The `role="group"` wrapper around the child items (while expanded).
24
+ */
25
+ export class BsTreeItem {
26
+ el;
27
+ /** The row's text. Use the `label` slot for rich content. */
28
+ label = '';
29
+ /** Whether the child items are shown. Only meaningful for parents. Mutable: the caret, the
30
+ * keyboard and the owning tree toggle it. Reflected. */
31
+ expanded = false;
32
+ /** Marks the row as selected. Owned by the tree (single selection, synced with its `value`).
33
+ * Reflected. */
34
+ selected = false;
35
+ /** Disables the row: not focusable, ignores clicks, dimmed. Reflected. */
36
+ disabled = false;
37
+ /** Shows the leading icon (default folder / file, or the `icon` slot). */
38
+ showIcon = true;
39
+ /** Identifier used in events and for the tree's `value`. Falls back to `label` when empty. */
40
+ value = '';
41
+ /** Emitted when the user toggles expansion (caret click or keyboard), with the new `expanded`
42
+ * value. Not emitted when `expanded` is set from code. */
43
+ bsToggle;
44
+ /** Emitted (bubbling, composed) when the user activates the row, with the item's value. The
45
+ * owning `bs-tree` listens and updates the selection. */
46
+ bsSelect;
47
+ level = 1;
48
+ hasChildren = false;
49
+ observer;
50
+ connectedCallback() {
51
+ this.computeLevel();
52
+ this.computeHasChildren();
53
+ this.observer = new MutationObserver(() => this.computeHasChildren());
54
+ this.observer.observe(this.el, { childList: true });
55
+ }
56
+ disconnectedCallback() {
57
+ this.observer?.disconnect();
58
+ }
59
+ computeLevel() {
60
+ let level = 1;
61
+ let p = this.el.parentElement;
62
+ while (p) {
63
+ if (p.tagName === 'BS-TREE-ITEM')
64
+ level++;
65
+ p = p.parentElement;
66
+ }
67
+ this.level = level;
68
+ }
69
+ computeHasChildren() {
70
+ this.hasChildren = Array.from(this.el.children).some(c => c.tagName === 'BS-TREE-ITEM');
71
+ }
72
+ /** Sets `expanded` as a user action: updates the prop and emits `bsToggle`. No-op for leaves,
73
+ * disabled items, or when the value would not change. */
74
+ async setExpanded(next) {
75
+ if (this.disabled || !this.hasChildren || this.expanded === next)
76
+ return;
77
+ this.expanded = next;
78
+ this.bsToggle.emit(next);
79
+ }
80
+ onCaretClick = (e) => {
81
+ e.stopPropagation();
82
+ if (this.disabled)
83
+ return;
84
+ this.setExpanded(!this.expanded);
85
+ };
86
+ onRowClick = () => {
87
+ if (this.disabled)
88
+ return;
89
+ this.bsSelect.emit(this.value || this.label);
90
+ };
91
+ render() {
92
+ const isParent = this.hasChildren;
93
+ const managed = !!this.el.closest('bs-tree');
94
+ const showChildren = isParent && this.expanded;
95
+ return (h(Host, { key: 'e0c36ce76f0250f77cd920f0e4ce4f713d5298a3', role: "treeitem", "aria-level": String(this.level), "aria-expanded": isParent ? String(this.expanded) : null, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : null, ...(managed || this.disabled ? {} : { tabindex: '0' }) }, h("div", { key: '6b79b70c4688ebce60d70d42b387b106b42ae950', class: "bs-tree-item__row", style: { '--bs-tree-item-level': String(this.level) } }, h("div", { key: '65bf594501088b7510393ad07ecde34f0e4f2287', part: "container", class: {
96
+ 'bs-tree-item__container': true,
97
+ 'bs-tree-item__container--selected': this.selected,
98
+ 'bs-tree-item__container--disabled': this.disabled,
99
+ }, onClick: this.onRowClick }, isParent && (h("span", { key: 'cfadf7e6d433b61c79055a872311f6dd5758e8df', part: "caret", class: { 'bs-tree-item__caret': true, 'bs-tree-item__caret--open': this.expanded }, "aria-hidden": "true", onClick: this.onCaretClick }, h(CaretRightIcon, { key: '079088e9abcdb46dc95480b4abe8d51f1b0f8095' }))), h("span", { key: 'b3fcebd0cc01f6e00d59b7901fc9ca7c2c50b2f9', class: "bs-tree-item__content" }, this.showIcon && (h("span", { key: '490160aea2ccbd3101c1a46b44615ead36318361', part: "icon", class: "bs-tree-item__icon", "aria-hidden": "true" }, h("slot", { key: '9dd058da6a37117a5496fa28c6be1443304157ce', name: "icon" }, isParent ? h(FolderIcon, null) : h(FileIcon, null)))), h("span", { key: '40e2a4a618ebf6e661e2208c0cfa4c0c44c1d66d', part: "label", class: "bs-tree-item__label" }, h("slot", { key: 'b1999984ebb958ffa3a46c281f3dde023374f4e4', name: "label" }, this.label))))), showChildren && (h("div", { key: 'b6e68b2c00ee98d89c8c6103f58580075b7a67ba', part: "group", class: "bs-tree-item__group", role: "group" }, h("slot", { key: '24e53e0558b6a73f1d12f8dab3f661988dff1d85' })))));
100
+ }
101
+ static get is() { return "bs-tree-item"; }
102
+ static get encapsulation() { return "shadow"; }
103
+ static get originalStyleUrls() {
104
+ return {
105
+ "$": ["bs-tree-item.css"]
106
+ };
107
+ }
108
+ static get styleUrls() {
109
+ return {
110
+ "$": ["bs-tree-item.css"]
111
+ };
112
+ }
113
+ static get properties() {
114
+ return {
115
+ "label": {
116
+ "type": "string",
117
+ "mutable": false,
118
+ "complexType": {
119
+ "original": "string",
120
+ "resolved": "string",
121
+ "references": {}
122
+ },
123
+ "required": false,
124
+ "optional": false,
125
+ "docs": {
126
+ "tags": [],
127
+ "text": "The row's text. Use the `label` slot for rich content."
128
+ },
129
+ "getter": false,
130
+ "setter": false,
131
+ "reflect": false,
132
+ "attribute": "label",
133
+ "defaultValue": "''"
134
+ },
135
+ "expanded": {
136
+ "type": "boolean",
137
+ "mutable": true,
138
+ "complexType": {
139
+ "original": "boolean",
140
+ "resolved": "boolean",
141
+ "references": {}
142
+ },
143
+ "required": false,
144
+ "optional": false,
145
+ "docs": {
146
+ "tags": [],
147
+ "text": "Whether the child items are shown. Only meaningful for parents. Mutable: the caret, the\nkeyboard and the owning tree toggle it. Reflected."
148
+ },
149
+ "getter": false,
150
+ "setter": false,
151
+ "reflect": true,
152
+ "attribute": "expanded",
153
+ "defaultValue": "false"
154
+ },
155
+ "selected": {
156
+ "type": "boolean",
157
+ "mutable": false,
158
+ "complexType": {
159
+ "original": "boolean",
160
+ "resolved": "boolean",
161
+ "references": {}
162
+ },
163
+ "required": false,
164
+ "optional": false,
165
+ "docs": {
166
+ "tags": [],
167
+ "text": "Marks the row as selected. Owned by the tree (single selection, synced with its `value`).\nReflected."
168
+ },
169
+ "getter": false,
170
+ "setter": false,
171
+ "reflect": true,
172
+ "attribute": "selected",
173
+ "defaultValue": "false"
174
+ },
175
+ "disabled": {
176
+ "type": "boolean",
177
+ "mutable": false,
178
+ "complexType": {
179
+ "original": "boolean",
180
+ "resolved": "boolean",
181
+ "references": {}
182
+ },
183
+ "required": false,
184
+ "optional": false,
185
+ "docs": {
186
+ "tags": [],
187
+ "text": "Disables the row: not focusable, ignores clicks, dimmed. Reflected."
188
+ },
189
+ "getter": false,
190
+ "setter": false,
191
+ "reflect": true,
192
+ "attribute": "disabled",
193
+ "defaultValue": "false"
194
+ },
195
+ "showIcon": {
196
+ "type": "boolean",
197
+ "mutable": false,
198
+ "complexType": {
199
+ "original": "boolean",
200
+ "resolved": "boolean",
201
+ "references": {}
202
+ },
203
+ "required": false,
204
+ "optional": false,
205
+ "docs": {
206
+ "tags": [],
207
+ "text": "Shows the leading icon (default folder / file, or the `icon` slot)."
208
+ },
209
+ "getter": false,
210
+ "setter": false,
211
+ "reflect": false,
212
+ "attribute": "show-icon",
213
+ "defaultValue": "true"
214
+ },
215
+ "value": {
216
+ "type": "string",
217
+ "mutable": false,
218
+ "complexType": {
219
+ "original": "string",
220
+ "resolved": "string",
221
+ "references": {}
222
+ },
223
+ "required": false,
224
+ "optional": false,
225
+ "docs": {
226
+ "tags": [],
227
+ "text": "Identifier used in events and for the tree's `value`. Falls back to `label` when empty."
228
+ },
229
+ "getter": false,
230
+ "setter": false,
231
+ "reflect": false,
232
+ "attribute": "value",
233
+ "defaultValue": "''"
234
+ }
235
+ };
236
+ }
237
+ static get states() {
238
+ return {
239
+ "level": {},
240
+ "hasChildren": {}
241
+ };
242
+ }
243
+ static get events() {
244
+ return [{
245
+ "method": "bsToggle",
246
+ "name": "bsToggle",
247
+ "bubbles": true,
248
+ "cancelable": true,
249
+ "composed": true,
250
+ "docs": {
251
+ "tags": [],
252
+ "text": "Emitted when the user toggles expansion (caret click or keyboard), with the new `expanded`\nvalue. Not emitted when `expanded` is set from code."
253
+ },
254
+ "complexType": {
255
+ "original": "boolean",
256
+ "resolved": "boolean",
257
+ "references": {}
258
+ }
259
+ }, {
260
+ "method": "bsSelect",
261
+ "name": "bsSelect",
262
+ "bubbles": true,
263
+ "cancelable": true,
264
+ "composed": true,
265
+ "docs": {
266
+ "tags": [],
267
+ "text": "Emitted (bubbling, composed) when the user activates the row, with the item's value. The\nowning `bs-tree` listens and updates the selection."
268
+ },
269
+ "complexType": {
270
+ "original": "string",
271
+ "resolved": "string",
272
+ "references": {}
273
+ }
274
+ }];
275
+ }
276
+ static get methods() {
277
+ return {
278
+ "setExpanded": {
279
+ "complexType": {
280
+ "signature": "(next: boolean) => Promise<void>",
281
+ "parameters": [{
282
+ "name": "next",
283
+ "type": "boolean",
284
+ "docs": ""
285
+ }],
286
+ "references": {
287
+ "Promise": {
288
+ "location": "global",
289
+ "id": "global::Promise"
290
+ }
291
+ },
292
+ "return": "Promise<void>"
293
+ },
294
+ "docs": {
295
+ "text": "Sets `expanded` as a user action: updates the prop and emits `bsToggle`. No-op for leaves,\ndisabled items, or when the value would not change.",
296
+ "tags": []
297
+ }
298
+ }
299
+ };
300
+ }
301
+ static get elementRef() { return "el"; }
302
+ }
303
+ const CaretRightIcon = () => (h("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M9.75 6L15.75 12L9.75 18", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" })));
304
+ const FolderIcon = () => (h("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M3.75 6.75C3.75 5.92 4.42 5.25 5.25 5.25H9.4C9.8 5.25 10.18 5.41 10.46 5.69L11.54 6.77C11.82 7.05 12.2 7.21 12.6 7.21H18.75C19.58 7.21 20.25 7.88 20.25 8.71V17.25C20.25 18.08 19.58 18.75 18.75 18.75H5.25C4.42 18.75 3.75 18.08 3.75 17.25V6.75Z", stroke: "currentColor", "stroke-width": "1.5", "stroke-linejoin": "round" })));
305
+ const FileIcon = () => (h("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M13.5 3.75H7.5C6.67 3.75 6 4.42 6 5.25V18.75C6 19.58 6.67 20.25 7.5 20.25H16.5C17.33 20.25 18 19.58 18 18.75V8.25L13.5 3.75Z", stroke: "currentColor", "stroke-width": "1.5", "stroke-linejoin": "round" }), h("path", { d: "M13.5 3.75V8.25H18", stroke: "currentColor", "stroke-width": "1.5", "stroke-linejoin": "round" }), h("path", { d: "M9 12.75H15M9 15.75H15", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round" })));