@brandsync/wc 1.7.0 → 1.8.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 (314) hide show
  1. package/custom-elements.json +201 -13
  2. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  3. package/dist/brandsync-wc/{p-387ed85f.entry.js → p-002d258d.entry.js} +1 -1
  4. package/dist/brandsync-wc/{p-819a3dae.entry.js → p-03b08508.entry.js} +1 -1
  5. package/dist/brandsync-wc/{p-fde5e9f1.entry.js → p-051d3064.entry.js} +1 -1
  6. package/dist/brandsync-wc/{p-f243683f.entry.js → p-05c7de28.entry.js} +1 -1
  7. package/dist/brandsync-wc/{p-2d6955d6.entry.js → p-062cfa34.entry.js} +1 -1
  8. package/dist/brandsync-wc/p-0e39b9cc.entry.js +1 -0
  9. package/dist/brandsync-wc/{p-538cc08e.entry.js → p-114d2fd8.entry.js} +1 -1
  10. package/dist/brandsync-wc/{p-70e035ed.entry.js → p-153da845.entry.js} +1 -1
  11. package/dist/brandsync-wc/{p-6754dfa9.entry.js → p-1c0db4d6.entry.js} +1 -1
  12. package/dist/brandsync-wc/{p-4a1a5d6e.entry.js → p-1f7208cb.entry.js} +1 -1
  13. package/dist/brandsync-wc/{p-d06543a5.entry.js → p-235ae012.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-2700a63e.entry.js → p-275072dd.entry.js} +1 -1
  15. package/dist/brandsync-wc/p-2891d40b.entry.js +1 -0
  16. package/dist/brandsync-wc/p-29027559.entry.js +1 -0
  17. package/dist/brandsync-wc/p-2e7a1082.entry.js +1 -0
  18. package/dist/brandsync-wc/{p-a36a0e6a.entry.js → p-3176d1d3.entry.js} +1 -1
  19. package/dist/brandsync-wc/{p-0d86c22d.entry.js → p-33e44094.entry.js} +1 -1
  20. package/dist/brandsync-wc/{p-e427bbda.entry.js → p-360452c2.entry.js} +1 -1
  21. package/dist/brandsync-wc/p-3ec74d35.entry.js +1 -0
  22. package/dist/brandsync-wc/p-4574a707.entry.js +1 -0
  23. package/dist/brandsync-wc/p-4e5dcaff.entry.js +1 -0
  24. package/dist/brandsync-wc/p-612cf79c.entry.js +1 -0
  25. package/dist/brandsync-wc/{p-61db6ce2.entry.js → p-61c1a2a3.entry.js} +1 -1
  26. package/dist/brandsync-wc/{p-85c70f6d.entry.js → p-6331de9c.entry.js} +1 -1
  27. package/dist/brandsync-wc/{p-d03eba2b.entry.js → p-652d4068.entry.js} +1 -1
  28. package/dist/brandsync-wc/{p-9c1be2a0.entry.js → p-6bf2f116.entry.js} +1 -1
  29. package/dist/brandsync-wc/{p-c3a28a89.entry.js → p-70f64b25.entry.js} +1 -1
  30. package/dist/brandsync-wc/{p-06e9b45d.entry.js → p-7b00dd36.entry.js} +1 -1
  31. package/dist/brandsync-wc/{p-13e4966c.entry.js → p-7c94e6ae.entry.js} +1 -1
  32. package/dist/brandsync-wc/p-835a8dc7.entry.js +1 -0
  33. package/dist/brandsync-wc/{p-77433277.entry.js → p-8ee0153b.entry.js} +1 -1
  34. package/dist/brandsync-wc/{p-e1069ba9.entry.js → p-9f65f998.entry.js} +1 -1
  35. package/dist/brandsync-wc/{p-b2dc9886.entry.js → p-9f8852a0.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-DuyFft7h.js → p-AgoOSYvW.js} +2 -2
  37. package/dist/brandsync-wc/{p-fba01c96.entry.js → p-a09e157f.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-55e6438c.entry.js → p-a0d5a620.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-8b2ab522.entry.js → p-a5feaad4.entry.js} +1 -1
  40. package/dist/brandsync-wc/{p-cbaa19ab.entry.js → p-a92eec48.entry.js} +1 -1
  41. package/dist/brandsync-wc/{p-3eab22a5.entry.js → p-ae978c9a.entry.js} +1 -1
  42. package/dist/brandsync-wc/{p-f2ce9a1f.entry.js → p-bbcc47b0.entry.js} +1 -1
  43. package/dist/brandsync-wc/{p-30d6a6d0.entry.js → p-bc69a96c.entry.js} +1 -1
  44. package/dist/brandsync-wc/{p-80cf96ff.entry.js → p-be2c1740.entry.js} +1 -1
  45. package/dist/brandsync-wc/p-bf53ad52.entry.js +1 -0
  46. package/dist/brandsync-wc/p-c10d2529.entry.js +1 -0
  47. package/dist/brandsync-wc/{p-8b57f606.entry.js → p-c4de155c.entry.js} +1 -1
  48. package/dist/brandsync-wc/p-c7f4c114.entry.js +1 -0
  49. package/dist/brandsync-wc/{p-c197cc95.entry.js → p-cfcf3f0a.entry.js} +1 -1
  50. package/dist/brandsync-wc/{p-f8f03334.entry.js → p-de7c946d.entry.js} +1 -1
  51. package/dist/brandsync-wc/{p-600b5434.entry.js → p-e9b43754.entry.js} +1 -1
  52. package/dist/brandsync-wc/{p-d25b7b74.entry.js → p-ee7da23d.entry.js} +1 -1
  53. package/dist/brandsync-wc/{p-4bff9b4b.entry.js → p-f006d962.entry.js} +1 -1
  54. package/dist/brandsync-wc/p-f074f94e.entry.js +1 -0
  55. package/dist/brandsync-wc/{p-7ed5670e.entry.js → p-f7d47c17.entry.js} +1 -1
  56. package/dist/brandsync-wc/{p-f518f486.entry.js → p-fc58c663.entry.js} +1 -1
  57. package/dist/brandsync-wc/{p-be14f99f.entry.js → p-fddc7bd1.entry.js} +1 -1
  58. package/dist/cjs/brandsync-wc.cjs.js +2 -2
  59. package/dist/cjs/bs-accordion.cjs.entry.js +2 -2
  60. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +1 -1
  61. package/dist/cjs/bs-ai-greeting.cjs.entry.js +1 -1
  62. package/dist/cjs/bs-ai-thinking.cjs.entry.js +1 -1
  63. package/dist/cjs/bs-attachment-list.cjs.entry.js +2 -2
  64. package/dist/cjs/bs-attachment.cjs.entry.js +2 -2
  65. package/dist/cjs/bs-avatar.cjs.entry.js +1 -1
  66. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  67. package/dist/cjs/bs-breadcrumb-overflow.cjs.entry.js +2 -2
  68. package/dist/cjs/bs-breadcrumb.cjs.entry.js +1 -1
  69. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +1 -1
  70. package/dist/cjs/bs-button-skeleton.cjs.entry.js +1 -1
  71. package/dist/cjs/bs-button.cjs.entry.js +23 -4
  72. package/dist/cjs/bs-card.cjs.entry.js +2 -2
  73. package/dist/cjs/bs-carousel.cjs.entry.js +1 -1
  74. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +2 -2
  75. package/dist/cjs/bs-chatbot-header.cjs.entry.js +1 -1
  76. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +2 -2
  77. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +1 -1
  78. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +1 -1
  79. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +1 -1
  80. package/dist/cjs/bs-checkbox.cjs.entry.js +48 -3
  81. package/dist/cjs/bs-chip-filter.cjs.entry.js +2 -2
  82. package/dist/cjs/bs-chip-informative.cjs.entry.js +2 -2
  83. package/dist/cjs/bs-chip-input.cjs.entry.js +2 -2
  84. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +1 -1
  85. package/dist/cjs/bs-composer.cjs.entry.js +1 -1
  86. package/dist/cjs/bs-data-table.cjs.entry.js +2 -2
  87. package/dist/cjs/bs-dialog.cjs.entry.js +2 -2
  88. package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
  89. package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
  90. package/dist/cjs/bs-icon-button.cjs.entry.js +22 -3
  91. package/dist/cjs/bs-inline-tab.cjs.entry.js +7 -3
  92. package/dist/cjs/bs-input.cjs.entry.js +69 -5
  93. package/dist/cjs/bs-logo.cjs.entry.js +1 -1
  94. package/dist/cjs/bs-menu-item.cjs.entry.js +1 -1
  95. package/dist/cjs/bs-menu.cjs.entry.js +25 -3
  96. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +2 -2
  97. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +2 -2
  98. package/dist/cjs/bs-navigation-header.cjs.entry.js +1 -1
  99. package/dist/cjs/bs-pagination.cjs.entry.js +1 -1
  100. package/dist/cjs/bs-progress-linear.cjs.entry.js +1 -1
  101. package/dist/cjs/bs-progress.cjs.entry.js +8 -3
  102. package/dist/cjs/bs-radio.cjs.entry.js +81 -12
  103. package/dist/cjs/bs-slider.cjs.entry.js +54 -2
  104. package/dist/cjs/bs-snackbar.cjs.entry.js +1 -1
  105. package/dist/cjs/bs-source-link.cjs.entry.js +2 -2
  106. package/dist/cjs/bs-stepper-step.cjs.entry.js +2 -2
  107. package/dist/cjs/bs-stepper.cjs.entry.js +3 -2
  108. package/dist/cjs/bs-switch.cjs.entry.js +36 -3
  109. package/dist/cjs/bs-tab.cjs.entry.js +7 -3
  110. package/dist/cjs/bs-tabs.cjs.entry.js +51 -2
  111. package/dist/cjs/bs-toast.cjs.entry.js +1 -1
  112. package/dist/cjs/bs-tooltip.cjs.entry.js +2 -2
  113. package/dist/cjs/{index-D7e6DfLV.js → index-kk9YXF2S.js} +43 -5
  114. package/dist/cjs/loader.cjs.js +2 -2
  115. package/dist/collection/components/bs-a11y.cmp.test.js +54 -0
  116. package/dist/collection/components/bs-accordion/bs-accordion.css +5 -5
  117. package/dist/collection/components/bs-attachment/bs-attachment.css +1 -1
  118. package/dist/collection/components/bs-attachment-list/bs-attachment-list.css +1 -1
  119. package/dist/collection/components/bs-breadcrumb/bs-breadcrumb-overflow/bs-breadcrumb-overflow.css +1 -1
  120. package/dist/collection/components/bs-button/bs-button/bs-button.css +17 -10
  121. package/dist/collection/components/bs-button/bs-button/bs-button.js +16 -3
  122. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +16 -3
  123. package/dist/collection/components/bs-card/bs-card.css +4 -0
  124. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.css +1 -1
  125. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.css +3 -3
  126. package/dist/collection/components/bs-checkbox/bs-checkbox.css +8 -1
  127. package/dist/collection/components/bs-checkbox/bs-checkbox.js +100 -2
  128. package/dist/collection/components/bs-chip/bs-chip-filter/bs-chip-filter.css +4 -4
  129. package/dist/collection/components/bs-chip/bs-chip-informative/bs-chip-informative.css +4 -4
  130. package/dist/collection/components/bs-chip/bs-chip-input/bs-chip-input.css +5 -5
  131. package/dist/collection/components/bs-data-table/bs-data-table.css +1 -1
  132. package/dist/collection/components/bs-dialog/bs-dialog.css +5 -1
  133. package/dist/collection/components/bs-form-association.cmp.test.js +172 -0
  134. package/dist/collection/components/bs-input/bs-input.css +10 -4
  135. package/dist/collection/components/bs-input/bs-input.js +82 -4
  136. package/dist/collection/components/bs-keyboard-nav.cmp.test.js +100 -0
  137. package/dist/collection/components/bs-menu/bs-menu.css +4 -0
  138. package/dist/collection/components/bs-menu/bs-menu.js +33 -1
  139. package/dist/collection/components/bs-progress/bs-progress.js +27 -2
  140. package/dist/collection/components/bs-radio/bs-radio.cmp.test.js +4 -10
  141. package/dist/collection/components/bs-radio/bs-radio.css +7 -1
  142. package/dist/collection/components/bs-radio/bs-radio.js +92 -14
  143. package/dist/collection/components/bs-radio/bs-radio.stories.js +1 -10
  144. package/dist/collection/components/bs-slider/bs-slider.js +68 -2
  145. package/dist/collection/components/bs-source-link/bs-source-link.css +2 -2
  146. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +3 -2
  147. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.css +3 -3
  148. package/dist/collection/components/bs-switch/bs-switch.css +10 -1
  149. package/dist/collection/components/bs-switch/bs-switch.js +69 -2
  150. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.css +2 -2
  151. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +24 -1
  152. package/dist/collection/components/bs-tab/bs-tab/bs-tab.css +2 -2
  153. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +24 -1
  154. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +57 -1
  155. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  156. package/dist/collection/components/forms/forms.stories.js +63 -0
  157. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +1 -1
  158. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  159. package/dist/components/bs-accordion.js +1 -1
  160. package/dist/components/bs-ai-disclaimer.js +1 -1
  161. package/dist/components/bs-ai-greeting.js +1 -1
  162. package/dist/components/bs-ai-thinking.js +1 -1
  163. package/dist/components/bs-attachment-list.js +1 -1
  164. package/dist/components/bs-attachment.js +1 -1
  165. package/dist/components/bs-avatar.js +1 -1
  166. package/dist/components/bs-badge.js +1 -1
  167. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  168. package/dist/components/bs-breadcrumb.js +1 -1
  169. package/dist/components/bs-breadcrumbs.js +1 -1
  170. package/dist/components/bs-button-skeleton.js +1 -1
  171. package/dist/components/bs-button.js +1 -1
  172. package/dist/components/bs-card.js +1 -1
  173. package/dist/components/bs-carousel.js +1 -1
  174. package/dist/components/bs-chatbot-feedback.js +1 -1
  175. package/dist/components/bs-chatbot-header.js +1 -1
  176. package/dist/components/bs-chatbot-response-action.js +1 -1
  177. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  178. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  179. package/dist/components/bs-checkbox-skeleton.js +1 -1
  180. package/dist/components/bs-checkbox.js +1 -1
  181. package/dist/components/bs-chip-filter.js +1 -1
  182. package/dist/components/bs-chip-informative.js +1 -1
  183. package/dist/components/bs-chip-input.js +1 -1
  184. package/dist/components/bs-composer-status-banner.js +1 -1
  185. package/dist/components/bs-composer.js +1 -1
  186. package/dist/components/bs-data-table.js +1 -1
  187. package/dist/components/bs-dialog.js +1 -1
  188. package/dist/components/bs-file-upload-item.js +1 -1
  189. package/dist/components/bs-file-upload.js +1 -1
  190. package/dist/components/bs-icon-button.js +1 -1
  191. package/dist/components/bs-inline-tab.js +1 -1
  192. package/dist/components/bs-input.js +1 -1
  193. package/dist/components/bs-logo.js +1 -1
  194. package/dist/components/bs-menu-item.js +1 -1
  195. package/dist/components/bs-menu.js +1 -1
  196. package/dist/components/bs-navigation-drawer-item.js +1 -1
  197. package/dist/components/bs-navigation-drawer.js +1 -1
  198. package/dist/components/bs-navigation-header.js +1 -1
  199. package/dist/components/bs-pagination.js +1 -1
  200. package/dist/components/bs-progress-linear.js +1 -1
  201. package/dist/components/bs-progress.js +1 -1
  202. package/dist/components/bs-radio.js +1 -1
  203. package/dist/components/bs-slider.js +1 -1
  204. package/dist/components/bs-snackbar.js +1 -1
  205. package/dist/components/bs-source-link.js +1 -1
  206. package/dist/components/bs-stepper-step.js +1 -1
  207. package/dist/components/bs-stepper.js +1 -1
  208. package/dist/components/bs-switch.js +1 -1
  209. package/dist/components/bs-tab.js +1 -1
  210. package/dist/components/bs-tabs.js +1 -1
  211. package/dist/components/bs-toast.js +1 -1
  212. package/dist/components/bs-tooltip.js +1 -1
  213. package/dist/components/index.js +1 -1
  214. package/dist/components/{p-LYvoWZt4.js → p-BA3c9Rom.js} +1 -1
  215. package/dist/components/{p-Dqt-Qp4W.js → p-BfEyD6Ku.js} +1 -1
  216. package/dist/components/p-BkHYJIyj.js +1 -0
  217. package/dist/components/p-Buly0d5G.js +1 -0
  218. package/dist/components/p-CpUHnsq9.js +1 -0
  219. package/dist/components/{p-BxFJ74fI.js → p-EtXc94lJ.js} +1 -1
  220. package/dist/components/{p-mnGJPH85.js → p-JYlmcxBn.js} +1 -1
  221. package/dist/components/{p-BhvV55-6.js → p-R2MlkUzD.js} +1 -1
  222. package/dist/components/{p-Dx8gAOVC.js → p-wei0Ija2.js} +1 -1
  223. package/dist/esm/brandsync-wc.js +3 -3
  224. package/dist/esm/bs-accordion.entry.js +2 -2
  225. package/dist/esm/bs-ai-disclaimer.entry.js +1 -1
  226. package/dist/esm/bs-ai-greeting.entry.js +1 -1
  227. package/dist/esm/bs-ai-thinking.entry.js +1 -1
  228. package/dist/esm/bs-attachment-list.entry.js +2 -2
  229. package/dist/esm/bs-attachment.entry.js +2 -2
  230. package/dist/esm/bs-avatar.entry.js +1 -1
  231. package/dist/esm/bs-badge.entry.js +1 -1
  232. package/dist/esm/bs-breadcrumb-overflow.entry.js +2 -2
  233. package/dist/esm/bs-breadcrumb.entry.js +1 -1
  234. package/dist/esm/bs-breadcrumbs.entry.js +1 -1
  235. package/dist/esm/bs-button-skeleton.entry.js +1 -1
  236. package/dist/esm/bs-button.entry.js +23 -4
  237. package/dist/esm/bs-card.entry.js +2 -2
  238. package/dist/esm/bs-carousel.entry.js +1 -1
  239. package/dist/esm/bs-chatbot-feedback.entry.js +2 -2
  240. package/dist/esm/bs-chatbot-header.entry.js +1 -1
  241. package/dist/esm/bs-chatbot-response-action.entry.js +2 -2
  242. package/dist/esm/bs-chatbot-sources-drawer.entry.js +1 -1
  243. package/dist/esm/bs-chatbot-suggestion-button.entry.js +1 -1
  244. package/dist/esm/bs-checkbox-skeleton.entry.js +1 -1
  245. package/dist/esm/bs-checkbox.entry.js +48 -3
  246. package/dist/esm/bs-chip-filter.entry.js +2 -2
  247. package/dist/esm/bs-chip-informative.entry.js +2 -2
  248. package/dist/esm/bs-chip-input.entry.js +2 -2
  249. package/dist/esm/bs-composer-status-banner.entry.js +1 -1
  250. package/dist/esm/bs-composer.entry.js +1 -1
  251. package/dist/esm/bs-data-table.entry.js +2 -2
  252. package/dist/esm/bs-dialog.entry.js +2 -2
  253. package/dist/esm/bs-file-upload-item.entry.js +1 -1
  254. package/dist/esm/bs-file-upload.entry.js +1 -1
  255. package/dist/esm/bs-icon-button.entry.js +22 -3
  256. package/dist/esm/bs-inline-tab.entry.js +7 -3
  257. package/dist/esm/bs-input.entry.js +69 -5
  258. package/dist/esm/bs-logo.entry.js +1 -1
  259. package/dist/esm/bs-menu-item.entry.js +1 -1
  260. package/dist/esm/bs-menu.entry.js +25 -3
  261. package/dist/esm/bs-navigation-drawer-item.entry.js +2 -2
  262. package/dist/esm/bs-navigation-drawer.entry.js +2 -2
  263. package/dist/esm/bs-navigation-header.entry.js +1 -1
  264. package/dist/esm/bs-pagination.entry.js +1 -1
  265. package/dist/esm/bs-progress-linear.entry.js +1 -1
  266. package/dist/esm/bs-progress.entry.js +8 -3
  267. package/dist/esm/bs-radio.entry.js +81 -12
  268. package/dist/esm/bs-slider.entry.js +54 -2
  269. package/dist/esm/bs-snackbar.entry.js +1 -1
  270. package/dist/esm/bs-source-link.entry.js +2 -2
  271. package/dist/esm/bs-stepper-step.entry.js +2 -2
  272. package/dist/esm/bs-stepper.entry.js +3 -2
  273. package/dist/esm/bs-switch.entry.js +36 -3
  274. package/dist/esm/bs-tab.entry.js +7 -3
  275. package/dist/esm/bs-tabs.entry.js +51 -2
  276. package/dist/esm/bs-toast.entry.js +1 -1
  277. package/dist/esm/bs-tooltip.entry.js +2 -2
  278. package/dist/esm/{index-DuyFft7h.js → index-AgoOSYvW.js} +43 -5
  279. package/dist/esm/loader.js +3 -3
  280. package/dist/types/components/bs-a11y.cmp.test.d.ts +1 -0
  281. package/dist/types/components/bs-button/bs-button/bs-button.d.ts +4 -1
  282. package/dist/types/components/bs-button/bs-icon-button/bs-icon-button.d.ts +4 -1
  283. package/dist/types/components/bs-checkbox/bs-checkbox.d.ts +12 -0
  284. package/dist/types/components/bs-form-association.cmp.test.d.ts +1 -0
  285. package/dist/types/components/bs-input/bs-input.d.ts +12 -0
  286. package/dist/types/components/bs-keyboard-nav.cmp.test.d.ts +1 -0
  287. package/dist/types/components/bs-menu/bs-menu.d.ts +4 -0
  288. package/dist/types/components/bs-progress/bs-progress.d.ts +5 -0
  289. package/dist/types/components/bs-radio/bs-radio.d.ts +23 -9
  290. package/dist/types/components/bs-slider/bs-slider.d.ts +9 -0
  291. package/dist/types/components/bs-switch/bs-switch.d.ts +10 -0
  292. package/dist/types/components/bs-tab/bs-inline-tab/bs-inline-tab.d.ts +4 -0
  293. package/dist/types/components/bs-tab/bs-tab/bs-tab.d.ts +4 -0
  294. package/dist/types/components/bs-tab/bs-tabs/bs-tabs.d.ts +7 -0
  295. package/dist/types/components/forms/forms.stories.d.ts +6 -0
  296. package/dist/types/components.d.ts +141 -7
  297. package/package.json +1 -1
  298. package/readme.md +14 -0
  299. package/dist/brandsync-wc/p-18021c05.entry.js +0 -1
  300. package/dist/brandsync-wc/p-1c8160c2.entry.js +0 -1
  301. package/dist/brandsync-wc/p-21c14465.entry.js +0 -1
  302. package/dist/brandsync-wc/p-27100489.entry.js +0 -1
  303. package/dist/brandsync-wc/p-309f920e.entry.js +0 -1
  304. package/dist/brandsync-wc/p-4b0938a5.entry.js +0 -1
  305. package/dist/brandsync-wc/p-5312b6a5.entry.js +0 -1
  306. package/dist/brandsync-wc/p-777a9dbf.entry.js +0 -1
  307. package/dist/brandsync-wc/p-a96856fd.entry.js +0 -1
  308. package/dist/brandsync-wc/p-b0634051.entry.js +0 -1
  309. package/dist/brandsync-wc/p-bcee3d60.entry.js +0 -1
  310. package/dist/brandsync-wc/p-e61efe4d.entry.js +0 -1
  311. package/dist/brandsync-wc/p-f14bda01.entry.js +0 -1
  312. package/dist/components/p-BaxFLlKS.js +0 -1
  313. package/dist/components/p-DI5GgSqL.js +0 -1
  314. package/dist/components/p-v4T0qPVn.js +0 -1
@@ -32,6 +32,9 @@ export class BsSlider {
32
32
  * and `segmented` use one thumb (`value`). `segmented` additionally draws `segments` tick marks
33
33
  * along the track. */
34
34
  type = 'default';
35
+ /** The `name` the value is submitted under in a surrounding `<form>`'s `FormData`. `type="range"`
36
+ * submits two entries under this name: the start value, then the end value. */
37
+ name;
35
38
  /** Shows/hides the "Label" text and editable percentage field(s) above the track, and the
36
39
  * static min/max bound labels flanking it. When `false`, only the bare track (and its
37
40
  * knob/knobs) renders. */
@@ -78,6 +81,33 @@ export class BsSlider {
78
81
  /** Emitted when `valueStart`/`valueEnd` changes via user interaction, with both current values.
79
82
  * Only fires for `type="range"`. */
80
83
  bsRangeChange;
84
+ internals;
85
+ initial = { value: 0, valueStart: undefined, valueEnd: undefined };
86
+ componentWillLoad() {
87
+ this.initial = { value: this.value, valueStart: this.valueStart, valueEnd: this.valueEnd };
88
+ this.syncFormValue();
89
+ }
90
+ syncFormValue() {
91
+ if (!this.internals?.setFormValue)
92
+ return;
93
+ if (this.type === 'range') {
94
+ const data = new FormData();
95
+ if (this.name) {
96
+ data.append(this.name, String(this.effectiveValueStart));
97
+ data.append(this.name, String(this.effectiveValueEnd));
98
+ }
99
+ this.internals.setFormValue(data);
100
+ }
101
+ else {
102
+ this.internals.setFormValue(String(this.value));
103
+ }
104
+ }
105
+ /** Called by the browser when the surrounding `<form>` is reset. */
106
+ formResetCallback() {
107
+ this.value = this.initial.value;
108
+ this.valueStart = this.initial.valueStart;
109
+ this.valueEnd = this.initial.valueEnd;
110
+ }
81
111
  get effectiveValueStart() {
82
112
  return this.valueStart ?? this.min;
83
113
  }
@@ -199,11 +229,12 @@ export class BsSlider {
199
229
  render() {
200
230
  const isRange = this.type === 'range';
201
231
  const rootClasses = ['bs-slider', this.disabled ? 'bs-slider--disabled' : ''].filter(Boolean).join(' ');
202
- return (h("div", { key: '602cadcb8377457bc5911161b238c612545592b4', class: rootClasses }, this.showLabel && (h("div", { key: '02b4d3d785665b4563dd04708a5926e116c8f5d7', class: "bs-slider__header" }, h("span", { key: '6a1ddf9c9a50b823231c779610fcbd2cef944701', id: "bs-slider-label", part: "label", class: "bs-slider__label" }, this.label), isRange ? (h("span", { class: "bs-slider__value-fields" }, this.renderPercentField(this.percent(this.effectiveValueStart), this.onStartPercentFieldChange, this.ariaLabel ?? 'Start value'), h("span", { class: "bs-slider__separator" }, "\u2013"), this.renderPercentField(this.percent(this.effectiveValueEnd), this.onEndPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} end` : 'End value'))) : (this.renderPercentField(this.percent(this.value), this.onPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} value` : 'Value')))), h("div", { key: '841a41446845737e38d88ca122ec5c626da5ba53', class: "bs-slider__row" }, this.showLabel && (h("span", { key: 'a978c0bf50a02ae281925ecd2a21d4aec6458be8', part: "bound", class: "bs-slider__bound" }, this.min)), isRange ? this.renderRangeThumbs() : this.renderSingleThumb(), this.showLabel && (h("span", { key: 'beb8e6ffb9113c9e6d1185f67db27fd77e6eec4c', part: "bound", class: "bs-slider__bound" }, this.max)))));
232
+ return (h("div", { key: 'f2db9b3d88d97f4183227dca165e4943586100b7', class: rootClasses }, this.showLabel && (h("div", { key: 'b5898da538670e481c1e0c0120f8ac67fec49ffe', class: "bs-slider__header" }, h("span", { key: '3f0257ee85b18fdce7a51825f9e3005b7c8c8985', id: "bs-slider-label", part: "label", class: "bs-slider__label" }, this.label), isRange ? (h("span", { class: "bs-slider__value-fields" }, this.renderPercentField(this.percent(this.effectiveValueStart), this.onStartPercentFieldChange, this.ariaLabel ?? 'Start value'), h("span", { class: "bs-slider__separator" }, "\u2013"), this.renderPercentField(this.percent(this.effectiveValueEnd), this.onEndPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} end` : 'End value'))) : (this.renderPercentField(this.percent(this.value), this.onPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} value` : 'Value')))), h("div", { key: '74adbfd1c596cb0de4bf484cd2ffbc2f283d9074', class: "bs-slider__row" }, this.showLabel && (h("span", { key: '334f03095f5246d4156e7853a1b9d3ddcb594f0a', part: "bound", class: "bs-slider__bound" }, this.min)), isRange ? this.renderRangeThumbs() : this.renderSingleThumb(), this.showLabel && (h("span", { key: '5173a19292bd029121cf9412a2087383700ec61b', part: "bound", class: "bs-slider__bound" }, this.max)))));
203
233
  }
204
234
  static get is() { return "bs-slider"; }
205
235
  static get encapsulation() { return "shadow"; }
206
236
  static get delegatesFocus() { return true; }
237
+ static get formAssociated() { return true; }
207
238
  static get originalStyleUrls() {
208
239
  return {
209
240
  "$": ["bs-slider.css"]
@@ -242,6 +273,25 @@ export class BsSlider {
242
273
  "attribute": "type",
243
274
  "defaultValue": "'default'"
244
275
  },
276
+ "name": {
277
+ "type": "string",
278
+ "mutable": false,
279
+ "complexType": {
280
+ "original": "string",
281
+ "resolved": "string",
282
+ "references": {}
283
+ },
284
+ "required": false,
285
+ "optional": true,
286
+ "docs": {
287
+ "tags": [],
288
+ "text": "The `name` the value is submitted under in a surrounding `<form>`'s `FormData`. `type=\"range\"`\nsubmits two entries under this name: the start value, then the end value."
289
+ },
290
+ "getter": false,
291
+ "setter": false,
292
+ "reflect": true,
293
+ "attribute": "name"
294
+ },
245
295
  "showLabel": {
246
296
  "type": "boolean",
247
297
  "mutable": false,
@@ -436,7 +486,7 @@ export class BsSlider {
436
486
  },
437
487
  "getter": false,
438
488
  "setter": false,
439
- "reflect": false,
489
+ "reflect": true,
440
490
  "attribute": "disabled",
441
491
  "defaultValue": "false"
442
492
  },
@@ -496,4 +546,20 @@ export class BsSlider {
496
546
  }];
497
547
  }
498
548
  static get elementRef() { return "el"; }
549
+ static get watchers() {
550
+ return [{
551
+ "propName": "value",
552
+ "methodName": "syncFormValue"
553
+ }, {
554
+ "propName": "valueStart",
555
+ "methodName": "syncFormValue"
556
+ }, {
557
+ "propName": "valueEnd",
558
+ "methodName": "syncFormValue"
559
+ }, {
560
+ "propName": "type",
561
+ "methodName": "syncFormValue"
562
+ }];
563
+ }
564
+ static get attachInternalsMemberName() { return "internals"; }
499
565
  }
@@ -24,7 +24,7 @@
24
24
  border: none;
25
25
  border-radius: var(--bs-source-link-radius);
26
26
  font-family: inherit;
27
- text-align: left;
27
+ text-align: start;
28
28
  text-decoration: none;
29
29
  cursor: pointer;
30
30
  transition: background-color var(--bs-duration-fast) var(--bs-easing-standard);
@@ -84,7 +84,7 @@
84
84
  display: flex;
85
85
  align-items: center;
86
86
  gap: var(--bs-spacing-50);
87
- padding-left: 22px;
87
+ padding-inline-start: 22px;
88
88
  }
89
89
 
90
90
  .bs-source-link__source,
@@ -1,4 +1,4 @@
1
- import { h } from "@stencil/core";
1
+ import { h, Host } from "@stencil/core";
2
2
  /**
3
3
  * A sequence of named steps showing overall progress through a multi-step flow (e.g. a checkout,
4
4
  * an onboarding wizard) -- each step reads as enabled (not yet reached), current, done, error, or
@@ -61,7 +61,8 @@ export class BsStepper {
61
61
  });
62
62
  }
63
63
  render() {
64
- return h("slot", { key: '5e707b38009031a71566e20ec8b9d1df55462e27', onSlotchange: this.onSlotChange });
64
+ // role="list" so each bs-stepper-step's role="listitem" has the required parent.
65
+ return (h(Host, { key: 'a9c1838c549b0c3ea9cc145624bc38e9edb32a51', role: "list" }, h("slot", { key: '549a18512ad246b5988008b8d2b6a9142e5380a5', onSlotchange: this.onSlotChange })));
65
66
  }
66
67
  static get is() { return "bs-stepper"; }
67
68
  static get encapsulation() { return "shadow"; }
@@ -147,7 +147,7 @@
147
147
  the icon's own right edge to .top's right edge with no positioning assumptions to get wrong. */
148
148
  :host(.bs-stepper-step--horizontal) .bs-stepper-step__connector {
149
149
  flex: 1 1 auto;
150
- margin-left: var(--bs-stepper-step-gap);
150
+ margin-inline-start: var(--bs-stepper-step-gap);
151
151
  }
152
152
 
153
153
  :host(.bs-stepper-step--vertical) .bs-stepper-step__connector {
@@ -218,8 +218,8 @@
218
218
  }
219
219
 
220
220
  :host(.bs-stepper-step--vertical) .bs-stepper-step__label {
221
- margin-left: var(--bs-stepper-step-gap);
222
- text-align: left;
221
+ margin-inline-start: var(--bs-stepper-step-gap);
222
+ text-align: start;
223
223
  }
224
224
 
225
225
  /* white-space: nowrap -- .label is deliberately narrowed to just the icon's width (see .label's own
@@ -85,7 +85,7 @@
85
85
  .bs-switch__input {
86
86
  position: absolute;
87
87
  top: 0;
88
- left: 0;
88
+ inset-inline-start: 0;
89
89
  width: 100%;
90
90
  height: 100%;
91
91
  margin: 0;
@@ -194,3 +194,12 @@
194
194
  .bs-switch--disabled .bs-switch__label {
195
195
  color: var(--bs-switch-label-color-disabled);
196
196
  }
197
+
198
+ /* Windows High Contrast: track outline + knob in system colors; checked = Highlight. */
199
+ @media (forced-colors: active) {
200
+ .bs-switch__track { border: 2px solid ButtonText; forced-color-adjust: none; background: Canvas; }
201
+ .bs-switch__track--checked { background: Highlight; border-color: Highlight; }
202
+ .bs-switch__knob { background: ButtonText; }
203
+ .bs-switch__track--checked .bs-switch__knob { background: HighlightText; }
204
+ .bs-switch__track--disabled { border-color: GrayText; }
205
+ }
@@ -20,6 +20,12 @@ import { h } from "@stencil/core";
20
20
  // bs-switch.css, not here.
21
21
  export class BsSwitch {
22
22
  el;
23
+ internals;
24
+ initialChecked = false;
25
+ /** The `name` the value is submitted under in a surrounding `<form>`'s `FormData`. */
26
+ name;
27
+ /** The value submitted when on (native checkbox default: `"on"`). */
28
+ value = 'on';
23
29
  /** Sizing scale. Controls the track's width/height and the knob's diameter. */
24
30
  size = 'lg';
25
31
  /** Whether the switch is on. Mutable so clicking the label/input toggles it directly, and
@@ -41,6 +47,17 @@ export class BsSwitch {
41
47
  ariaLabel = null;
42
48
  /** Emitted when the checked state changes via user interaction, with the new `checked` value. */
43
49
  bsChange;
50
+ syncFormValue() {
51
+ this.internals?.setFormValue?.(this.checked ? this.value : null);
52
+ }
53
+ /** Called by the browser when the surrounding `<form>` is reset. */
54
+ formResetCallback() {
55
+ this.checked = this.initialChecked;
56
+ }
57
+ componentWillLoad() {
58
+ this.initialChecked = this.checked;
59
+ this.syncFormValue();
60
+ }
44
61
  onChange = (ev) => {
45
62
  const checked = ev.target.checked;
46
63
  this.checked = checked;
@@ -58,11 +75,12 @@ export class BsSwitch {
58
75
  const knobClasses = ['bs-switch__knob', `bs-switch__knob--${this.size}`, this.disabled ? 'bs-switch__knob--disabled' : '']
59
76
  .filter(Boolean)
60
77
  .join(' ');
61
- return (h("label", { key: 'b726eda9fd90c67368ff44f288d39a80516ac68c', class: `bs-switch ${this.disabled ? 'bs-switch--disabled' : ''}` }, h("input", { key: 'ff95ba83169aae65ec57068f2b461b23fe344903', class: "bs-switch__input", type: "checkbox", role: "switch", checked: this.checked, disabled: this.disabled, "aria-checked": String(this.checked), "aria-label": this.ariaLabel, onChange: this.onChange }), h("span", { key: 'e09834a43eb922bcf973b880da3baa1694389ca0', part: "track", class: trackClasses }, h("span", { key: 'dc6c409faddb65511847a941331926ae736ce9ec', part: "knob", class: knobClasses })), h("span", { key: '2943c9fb029632360d21aaaa544d7674322cafc6', part: "label", class: "bs-switch__label" }, h("slot", { key: '55ef83bfb72ed4b463b854eff1fd9472048dcfc4' }))));
78
+ return (h("label", { key: '37466aa7ca1b18c07b92bd7855fd974d62ad5845', class: `bs-switch ${this.disabled ? 'bs-switch--disabled' : ''}` }, h("input", { key: 'f4e0073dd9a322692003593385da04a9289ea848', class: "bs-switch__input", type: "checkbox", role: "switch", checked: this.checked, disabled: this.disabled, "aria-checked": String(this.checked), "aria-label": this.ariaLabel, onChange: this.onChange }), h("span", { key: 'f8cbdb6bb25964ba79e9cb09d82beab0c3946a14', part: "track", class: trackClasses }, h("span", { key: '7e8598698e08a95d1ada9829264df99abd507d81', part: "knob", class: knobClasses })), h("span", { key: '11d464eaf95f555f3874524adc5fb2373b1fd056', part: "label", class: "bs-switch__label" }, h("slot", { key: '2409cb732d23f613c2595fa62e9fd7539bb2041e' }))));
62
79
  }
63
80
  static get is() { return "bs-switch"; }
64
81
  static get encapsulation() { return "shadow"; }
65
82
  static get delegatesFocus() { return true; }
83
+ static get formAssociated() { return true; }
66
84
  static get originalStyleUrls() {
67
85
  return {
68
86
  "$": ["bs-switch.css"]
@@ -75,6 +93,45 @@ export class BsSwitch {
75
93
  }
76
94
  static get properties() {
77
95
  return {
96
+ "name": {
97
+ "type": "string",
98
+ "mutable": false,
99
+ "complexType": {
100
+ "original": "string",
101
+ "resolved": "string",
102
+ "references": {}
103
+ },
104
+ "required": false,
105
+ "optional": true,
106
+ "docs": {
107
+ "tags": [],
108
+ "text": "The `name` the value is submitted under in a surrounding `<form>`'s `FormData`."
109
+ },
110
+ "getter": false,
111
+ "setter": false,
112
+ "reflect": true,
113
+ "attribute": "name"
114
+ },
115
+ "value": {
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 value submitted when on (native checkbox default: `\"on\"`)."
128
+ },
129
+ "getter": false,
130
+ "setter": false,
131
+ "reflect": false,
132
+ "attribute": "value",
133
+ "defaultValue": "'on'"
134
+ },
78
135
  "size": {
79
136
  "type": "string",
80
137
  "mutable": false,
@@ -137,7 +194,7 @@ export class BsSwitch {
137
194
  },
138
195
  "getter": false,
139
196
  "setter": false,
140
- "reflect": false,
197
+ "reflect": true,
141
198
  "attribute": "disabled",
142
199
  "defaultValue": "false"
143
200
  },
@@ -182,4 +239,14 @@ export class BsSwitch {
182
239
  }];
183
240
  }
184
241
  static get elementRef() { return "el"; }
242
+ static get watchers() {
243
+ return [{
244
+ "propName": "checked",
245
+ "methodName": "syncFormValue"
246
+ }, {
247
+ "propName": "value",
248
+ "methodName": "syncFormValue"
249
+ }];
250
+ }
251
+ static get attachInternalsMemberName() { return "internals"; }
185
252
  }
@@ -78,8 +78,8 @@
78
78
  .bs-inline-tab--has-icon {
79
79
  padding-top: var(--bs-inline-tab-padding-y);
80
80
  padding-bottom: var(--bs-inline-tab-padding-y);
81
- padding-left: var(--bs-inline-tab-padding-left-with-icon);
82
- padding-right: var(--bs-inline-tab-padding-right-with-icon);
81
+ padding-inline-start: var(--bs-inline-tab-padding-left-with-icon);
82
+ padding-inline-end: var(--bs-inline-tab-padding-right-with-icon);
83
83
  gap: var(--bs-inline-tab-gap);
84
84
  }
85
85
 
@@ -48,6 +48,10 @@ export class BsInlineTab {
48
48
  * violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute
49
49
  * automatically, same as `bs-tab`'s identical prop. */
50
50
  ariaLabel = null;
51
+ /** Set by a parent `bs-tabs` to implement roving tabindex (only one tab in the group is in the
52
+ * Tab order; arrow keys move between them). Left `undefined` for a standalone tab, which stays
53
+ * a normal tab stop. */
54
+ tabbable;
51
55
  /** Tracks whether the `icon` slot has assigned content. */
52
56
  hasIcon = false;
53
57
  /** Tracks whether the default (label) slot has assigned content. */
@@ -86,7 +90,7 @@ export class BsInlineTab {
86
90
  };
87
91
  render() {
88
92
  const iconOnly = this.hasIcon && !this.hasLabel;
89
- return (h("button", { key: '5fafbb8734ddd3d5b155ebdaac9c3aa5ecae6309', 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: '26381015d527bbb2d7b598e117dd61512b5acdac', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: '9902a6a2263b7bac63063817859924decd8b3518', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '1982f864c34bb1869085c46237eb1620da47449d', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: '5029733093fd8dd68565af803bb74444e5470eef', onSlotchange: this.onLabelSlotchange }))));
93
+ return (h("button", { key: '72a2298b0dff31e192dc679ee153d1d87e6a8723', 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, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: '25679b5cfc3bfec29f91b12f6180048429706b86', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: 'f5c996ae38a4e5ace60c8b1145dfb64114097600', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '101ac663fa1b05e3f4f2faaaff865e02ecbd4e90', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: 'a705183b26ad7d7ad3e286939b256cfbafb78580', onSlotchange: this.onLabelSlotchange }))));
90
94
  }
91
95
  static get is() { return "bs-inline-tab"; }
92
96
  static get encapsulation() { return "shadow"; }
@@ -161,6 +165,25 @@ export class BsInlineTab {
161
165
  "reflect": false,
162
166
  "attribute": "aria-label",
163
167
  "defaultValue": "null"
168
+ },
169
+ "tabbable": {
170
+ "type": "boolean",
171
+ "mutable": false,
172
+ "complexType": {
173
+ "original": "boolean",
174
+ "resolved": "boolean",
175
+ "references": {}
176
+ },
177
+ "required": false,
178
+ "optional": true,
179
+ "docs": {
180
+ "tags": [],
181
+ "text": "Set by a parent `bs-tabs` to implement roving tabindex (only one tab in the group is in the\nTab order; arrow keys move between them). Left `undefined` for a standalone tab, which stays\na normal tab stop."
182
+ },
183
+ "getter": false,
184
+ "setter": false,
185
+ "reflect": false,
186
+ "attribute": "tabbable"
164
187
  }
165
188
  };
166
189
  }
@@ -207,8 +207,8 @@
207
207
  enabled/selected/hover state above sets its background. */
208
208
  .bs-tab__indicator {
209
209
  position: absolute;
210
- left: var(--bs-tab-padding-x);
211
- right: var(--bs-tab-padding-x);
210
+ inset-inline-start: var(--bs-tab-padding-x);
211
+ inset-inline-end: var(--bs-tab-padding-x);
212
212
  bottom: 0;
213
213
  height: 2px;
214
214
  background: transparent;
@@ -53,6 +53,10 @@ export class BsTab {
53
53
  * violation). Stencil reflects this camelCase prop to the `aria-label` HTML attribute
54
54
  * automatically, same as `bs-button`'s identical prop. */
55
55
  ariaLabel = null;
56
+ /** Set by a parent `bs-tabs` to implement roving tabindex (only one tab in the group is in the
57
+ * Tab order; arrow keys move between them). Left `undefined` for a standalone tab, which stays
58
+ * a normal tab stop. */
59
+ tabbable;
56
60
  /** Tracks whether the `icon` slot has assigned content. */
57
61
  hasIcon = false;
58
62
  /** Tracks whether the default (label) slot has assigned content. */
@@ -99,7 +103,7 @@ export class BsTab {
99
103
  const iconOnly = this.hasIcon && !this.hasLabel;
100
104
  const vertical = this.hasIcon && this.hasLabel && this.iconPosition === 'top';
101
105
  const showBadge = this.hasBadge && !iconOnly && !vertical;
102
- return (h("button", { key: 'b70b65a38774feac31afb3c742c1c347d0d8f009', 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: 'bae69ab5499b9e8f695cf0bc559fa395097ae7dc', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: 'b6f545c119b1e53520ee0a62b51d84071aace11f', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '6c8cf0dd0394ebfc9a5825d01713628ce20d1c2d', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: '7eddcdcc73576ac8fc4f640e3f9cdc8c5cc04eb8', onSlotchange: this.onLabelSlotchange })), h("span", { key: 'acf5cd096bb0ff3a7c2bd898759995dc73b261f5', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: 'f97ae6b3b7760883b3ce9c20a0e7ec29dd43677e', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: '2db637b4b3f398b8d300731565b0accd1138fe88', part: "indicator", class: "bs-tab__indicator" })));
106
+ return (h("button", { key: '368a2f20536d169e06e47500dcca4d6a54f17dde', 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, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: '3b22e92a5d6bca27c0b12b6f80ef29af06bcc564', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: 'd75cb8cc85547a8c6a8be3bca3fc82a61d3cfa38', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '43ff4feb2425f1b0dd9485f323b1886b42e10a32', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: '74a0af9a35043faa3baa2415c3b4a204f5745155', onSlotchange: this.onLabelSlotchange })), h("span", { key: '22b5c4671b7a7c93abffae5a34a4e3bb600d8ed3', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: '17b123826ca4b78ff00b89d3a0944e1d805ad4fe', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: 'd51f23caa9d0fd0abddd37c7394994e1ffef0586', part: "indicator", class: "bs-tab__indicator" })));
103
107
  }
104
108
  static get is() { return "bs-tab"; }
105
109
  static get encapsulation() { return "shadow"; }
@@ -200,6 +204,25 @@ export class BsTab {
200
204
  "reflect": false,
201
205
  "attribute": "aria-label",
202
206
  "defaultValue": "null"
207
+ },
208
+ "tabbable": {
209
+ "type": "boolean",
210
+ "mutable": false,
211
+ "complexType": {
212
+ "original": "boolean",
213
+ "resolved": "boolean",
214
+ "references": {}
215
+ },
216
+ "required": false,
217
+ "optional": true,
218
+ "docs": {
219
+ "tags": [],
220
+ "text": "Set by a parent `bs-tabs` to implement roving tabindex (only one tab in the group is in the\nTab order; arrow keys move between them). Left `undefined` for a standalone tab, which stays\na normal tab stop."
221
+ },
222
+ "getter": false,
223
+ "setter": false,
224
+ "reflect": false,
225
+ "attribute": "tabbable"
203
226
  }
204
227
  };
205
228
  }
@@ -47,10 +47,54 @@ export class BsTabs {
47
47
  tabs.forEach(tab => {
48
48
  tab.selected = tab === ev.target;
49
49
  });
50
+ this.syncRovingTabindex();
51
+ }
52
+ componentDidLoad() {
53
+ this.syncRovingTabindex();
54
+ }
55
+ syncRovingTabindex() {
56
+ const tabs = this.tabs();
57
+ const anySelected = tabs.some(t => t.selected);
58
+ const firstEnabled = tabs.find(t => !t.disabled);
59
+ tabs.forEach(t => {
60
+ t.tabbable = anySelected ? t.selected : t === firstEnabled;
61
+ });
62
+ }
63
+ tabs() {
64
+ return Array.from(this.el.querySelectorAll(':scope > bs-tab, :scope > bs-inline-tab'));
65
+ }
66
+ /** WAI-ARIA tabs pattern (automatic activation): arrows move focus *and* selection to the
67
+ * previous/next enabled tab (wrapping), Home/End jump to the first/last. Arrow axis follows
68
+ * `orientation`; in RTL the horizontal arrows are mirrored. */
69
+ onKeyDown(ev) {
70
+ const vertical = this.orientation === 'vertical';
71
+ const rtl = getComputedStyle(this.el).direction === 'rtl';
72
+ const prevKey = vertical ? 'ArrowUp' : rtl ? 'ArrowRight' : 'ArrowLeft';
73
+ const nextKey = vertical ? 'ArrowDown' : rtl ? 'ArrowLeft' : 'ArrowRight';
74
+ if (![prevKey, nextKey, 'Home', 'End'].includes(ev.key))
75
+ return;
76
+ const enabled = this.tabs().filter(t => !t.disabled);
77
+ const current = enabled.findIndex(t => t === ev.target || t.contains(ev.target));
78
+ if (current === -1 || enabled.length === 0)
79
+ return;
80
+ ev.preventDefault();
81
+ let nextIdx = current;
82
+ if (ev.key === nextKey)
83
+ nextIdx = (current + 1) % enabled.length;
84
+ else if (ev.key === prevKey)
85
+ nextIdx = (current - 1 + enabled.length) % enabled.length;
86
+ else if (ev.key === 'Home')
87
+ nextIdx = 0;
88
+ else
89
+ nextIdx = enabled.length - 1;
90
+ const target = enabled[nextIdx];
91
+ const button = target.shadowRoot?.querySelector('button');
92
+ button?.focus();
93
+ button?.click();
50
94
  }
51
95
  render() {
52
96
  const vertical = this.orientation === 'vertical';
53
- return (h("div", { key: '3d45234fd7f253c692fe4bbc150e5e31c3c0144d', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: '1872fc2d82a5cde90b9e5b7fc76976f1083a3563' })));
97
+ return (h("div", { key: '81b3b46d54d4acc074b0c59d0da5e3e971e7b62e', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: 'ba296a99062629de3e331cd7de1ebc41548c77f9', onSlotchange: () => this.syncRovingTabindex() })));
54
98
  }
55
99
  static get is() { return "bs-tabs"; }
56
100
  static get encapsulation() { return "shadow"; }
@@ -121,6 +165,12 @@ export class BsTabs {
121
165
  };
122
166
  }
123
167
  static get elementRef() { return "el"; }
168
+ static get watchers() {
169
+ return [{
170
+ "propName": "orientation",
171
+ "methodName": "syncRovingTabindex"
172
+ }];
173
+ }
124
174
  static get listeners() {
125
175
  return [{
126
176
  "name": "bsSelect",
@@ -128,6 +178,12 @@ export class BsTabs {
128
178
  "target": undefined,
129
179
  "capture": false,
130
180
  "passive": false
181
+ }, {
182
+ "name": "keydown",
183
+ "method": "onKeyDown",
184
+ "target": undefined,
185
+ "capture": false,
186
+ "passive": false
131
187
  }];
132
188
  }
133
189
  }
@@ -42,7 +42,7 @@ export class BsTooltip {
42
42
  */
43
43
  placement = 'top';
44
44
  render() {
45
- return (h("div", { key: '81d300180aa98431ab694c50e76bb7e55a65efb0', class: "bs-tooltip" }, h("span", { key: '42e53b74b32dab5418e1e7ce37210316fd14341e', part: "arrow", class: "bs-tooltip__arrow" }), h("div", { key: '9b118fbb55282ef4cc7ccdf45da46c1939e25147', part: "bubble", class: "bs-tooltip__bubble" }, h("slot", { key: '52f128c55db4da2bbdc6b94c254ab80fb7dcc53f' }))));
45
+ return (h("div", { key: 'b7c2ee57db3a4e36cdd106d78f0f8d54c45a04c6', class: "bs-tooltip" }, h("span", { key: '22b738a760e9967233052ce4540c77da4ac9563e', part: "arrow", class: "bs-tooltip__arrow" }), h("div", { key: '69a8b07711478e699be4c8151d9f7dfd2e4e0bf4', part: "bubble", class: "bs-tooltip__bubble" }, h("slot", { key: 'b32c75a06582b8e8f99b973889450e9100b75323' }))));
46
46
  }
47
47
  static get is() { return "bs-tooltip"; }
48
48
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,63 @@
1
+ import { html } from "lit";
2
+ // Live examples for the Forms guide (forms.mdx). Not a component -- it shows how the
3
+ // form-associated controls behave inside a plain native <form>.
4
+ // Prints exactly what the browser would send, so the story shows the real FormData rather than a
5
+ // mocked-up result.
6
+ const showFormData = (ev) => {
7
+ ev.preventDefault();
8
+ const form = ev.currentTarget;
9
+ const out = form.parentElement?.querySelector('pre');
10
+ if (!out)
11
+ return;
12
+ const lines = [];
13
+ new FormData(form).forEach((value, key) => lines.push(`${key} = ${JSON.stringify(value)}`));
14
+ out.textContent = lines.length ? lines.join('\n') : '(no entries)';
15
+ };
16
+ const meta = {
17
+ title: 'Guides/Forms',
18
+ parameters: { layout: 'padded' },
19
+ };
20
+ export default meta;
21
+ const output = html `<pre style="margin: 16px 0 0; padding: 12px; background: #f4f4f4; color: #111; border-radius: 4px; min-height: 3em;">
22
+ Submit to see the FormData…</pre
23
+ >`;
24
+ export const Default = {
25
+ render: () => html `
26
+ <div style="max-width: 420px;">
27
+ <form @submit=${showFormData} style="display: flex; flex-direction: column; gap: 16px;">
28
+ <bs-input name="email" type="email" label="Email" required></bs-input>
29
+ <bs-input name="notes" type="textarea" label="Notes"></bs-input>
30
+ <div role="radiogroup" aria-label="Plan" style="display: flex; flex-direction: column; gap: 8px;">
31
+ <bs-radio name="plan" value="free" checked>Free</bs-radio>
32
+ <bs-radio name="plan" value="pro">Pro</bs-radio>
33
+ </div>
34
+ <bs-checkbox name="terms" value="accepted" required>I accept the terms</bs-checkbox>
35
+ <bs-switch name="alerts" checked>Email alerts</bs-switch>
36
+ <bs-slider name="volume" label="Volume" value="40" aria-label="Volume"></bs-slider>
37
+ <div style="display: flex; gap: 8px;">
38
+ <bs-button type="submit">Submit</bs-button>
39
+ <bs-button type="reset" variant="outlined">Reset</bs-button>
40
+ </div>
41
+ </form>
42
+ ${output}
43
+ </div>
44
+ `,
45
+ };
46
+ // Required fields: submitting with an empty required bs-input or an unchecked required bs-checkbox is
47
+ // blocked by the browser (requestSubmit runs validation), and the form reports invalid.
48
+ export const Validation = {
49
+ render: () => html `
50
+ <div style="max-width: 420px;">
51
+ <form
52
+ @submit=${showFormData}
53
+ @invalid=${(ev) => ev.preventDefault()}
54
+ style="display: flex; flex-direction: column; gap: 16px;"
55
+ >
56
+ <bs-input name="name" label="Name" required></bs-input>
57
+ <bs-checkbox name="terms" required>I accept the terms</bs-checkbox>
58
+ <bs-button type="submit">Submit (blocked until valid)</bs-button>
59
+ </form>
60
+ ${output}
61
+ </div>
62
+ `,
63
+ };
@@ -117,7 +117,7 @@ export class BsNavigationDrawer {
117
117
  this.bsSearchClick.emit();
118
118
  };
119
119
  render() {
120
- return (h("nav", { key: '4f39df22dc1027094a67c3d331021a90c471bef6', class: "bs-navigation-drawer", "aria-label": this.heading }, this.showLogo && (h("div", { key: '68101afc424bba6fd56d6b155d8130b77fcb42a9', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--full" }, h("bs-logo", { key: '7ec295e0411d6fe6ed33ea67e632fcda72a49611', variant: "full", background: this.logoBackground }))), this.showLogo && (h("div", { key: 'ee9db23aeb0c7ad6297bed6a4baa17dbe4b2f6d4', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--mark" }, h("bs-logo", { key: 'e69f31b910c3302d2c5851ae9bfdbfec1999fd4e', variant: "mark", background: this.logoBackground }))), h("div", { key: '8d69e56009e183c1745ddafebc75417ce6ea5bdc', class: "bs-navigation-drawer__title-row" }, h("span", { key: '434dd310adc86473876e125fab81f97b0beb5c4b', part: "title", class: "bs-navigation-drawer__title" }, this.heading), this.collapsible && (h("button", { key: '27508cb2c5f417d450b1a059b8e07d47396d3e69', 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: '96ee586ecd6edc378a95a0afcc114919230a52af' })))), h("div", { key: '3b20ffc4e837b7a2e7229ba575b429e54fc9f3ac', part: "search", class: "bs-navigation-drawer__search" }, h("slot", { key: 'f62aae2397c1eada4c0d52fd6d4cba778f475a58', name: "search" })), h("button", { key: 'a00b4871692f612c62d5e1b6de9511ca7ce7ebe3', type: "button", part: "search-trigger", class: "bs-navigation-drawer__search-trigger", "aria-label": "Search", onClick: this.onSearchTriggerClick }, h(SearchIcon, { key: '8402ace02e086a862bcc3bc92beb324940f7fda0' })), h("div", { key: '3ac74499c23530d89061d04fa23c4fd6a7e8c7b4', part: "items", class: "bs-navigation-drawer__items" }, h("slot", { key: '89baa650f1449c813f7a1e9f29f6525dcf6e2699' }))));
120
+ return (h("nav", { key: '8be5fb4e45d6919408ff7057b963c2d95281b470', class: "bs-navigation-drawer", "aria-label": this.heading }, this.showLogo && (h("div", { key: 'f66ec1272c4c226d1a67fb7321b1247c3be54fb1', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--full" }, h("bs-logo", { key: '88cddd1d8696f895b33dd141bc2f5bfd3bd260b4', variant: "full", background: this.logoBackground }))), this.showLogo && (h("div", { key: '89b4efebeac6b934cbdd6cf3d25caaf5a36c86e8', part: "logo", class: "bs-navigation-drawer__logo bs-navigation-drawer__logo--mark" }, h("bs-logo", { key: '4f9ef53f8a02d9bb21b134e6a73caf28d9e864fc', variant: "mark", background: this.logoBackground }))), h("div", { key: '841040ad4770b0590ce632db1ce7122766c27ef6', class: "bs-navigation-drawer__title-row" }, h("span", { key: '857e9420aae428b44c2086bec5a2b4205a3dda04', part: "title", class: "bs-navigation-drawer__title" }, this.heading), this.collapsible && (h("button", { key: 'c109b6f3b54268cf729e114a249864fbd57203cc', 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: 'e46c9d2569b59e76398772d7a48e7a02d6b36ba3' })))), h("div", { key: '88031f0fd6cffb8480f2a086efb93a9d6418b4fc', part: "search", class: "bs-navigation-drawer__search" }, h("slot", { key: 'c86cb8c32f754fe81d91b76d8e1a352f9de5b31b', name: "search" })), h("button", { key: '90ade94c988aac8a1b2c855da7b193167b4eeee6', type: "button", part: "search-trigger", class: "bs-navigation-drawer__search-trigger", "aria-label": "Search", onClick: this.onSearchTriggerClick }, h(SearchIcon, { key: 'ff02c6f7f07de15b98bc5799914756e2245e36b9' })), h("div", { key: '41203613ef27dba8768c2755b8653d17c65d02c6', part: "items", class: "bs-navigation-drawer__items" }, h("slot", { key: 'd120d4a7477e748f5be81a5af742bfa558bf00bd' }))));
121
121
  }
122
122
  static get is() { return "bs-navigation-drawer"; }
123
123
  static get encapsulation() { return "shadow"; }
@@ -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: 'bb51c715175ff08caa34b5c2e3c5f7fecdd92059', class: "bs-navigation-drawer-item__root" }, h("button", { key: '799bb1bd74e830e8630c5a8bebe91ffa8e988c07', 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: '78cf9b9281f94d44928b8f7e93de4ed327ca2e6e', part: "icon", class: `bs-navigation-drawer-item__icon ${this.hasIcon ? 'bs-navigation-drawer-item__icon--has-content' : ''}` }, h("slot", { key: '94b6037e69f7f1aa77a5abf3c726ae1f02eb55e0', name: "icon", onSlotchange: this.onIconSlotchange }))), h("span", { key: 'f7b355c4ef9b4a1d115083fbcb19003aee1a56a4', part: "label", class: "bs-navigation-drawer-item__label" }, h("slot", { key: '68ad8fb87791f5533a13eafa1348990f0acff6d4' })), this.expandable && (h("span", { key: 'd0f2ef997e4ee619013d63a0793008bb797b2776', part: "chevron", class: `bs-navigation-drawer-item__chevron ${this.expanded ? 'bs-navigation-drawer-item__chevron--expanded' : ''}` }, h(ChevronDownIcon, { key: '20286773f2ec74c370335bdcb30b36cd868c3a58' })))), this.expandable && (h("span", { key: 'e9b7a658742af43fcc570c33e82f28bbb87b5a05', part: "children", class: "bs-navigation-drawer-item__children" }, h("slot", { key: '172adb88df778a8411cbe3de3250af1917564b5d', name: "children" })))));
134
+ return (h("div", { key: 'ff4a72a5d5c8b37fa92ff244398153ca81b7f864', class: "bs-navigation-drawer-item__root" }, h("button", { key: 'f8c1d1e9c72aba5b6012f4f9d7fdc5956b919dff', 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: 'cf46152a1d7e0f4783a3ee29fd9eb7ae2a566c68', part: "icon", class: `bs-navigation-drawer-item__icon ${this.hasIcon ? 'bs-navigation-drawer-item__icon--has-content' : ''}` }, h("slot", { key: '32a1ea999456bf584bebf03e73aab3e7c01281cc', name: "icon", onSlotchange: this.onIconSlotchange }))), h("span", { key: '496a7d21f7a3878bd58fd4bdbb978b3bde40f588', part: "label", class: "bs-navigation-drawer-item__label" }, h("slot", { key: '3b1d65cd36d19c3714174a3a05a1b68ec3910042' })), this.expandable && (h("span", { key: '041b8fc587482288c4adf7b023edc7b7057a2fda', part: "chevron", class: `bs-navigation-drawer-item__chevron ${this.expanded ? 'bs-navigation-drawer-item__chevron--expanded' : ''}` }, h(ChevronDownIcon, { key: '0957e9218a1360b35726ee346e1e3718eb1b3eff' })))), this.expandable && (h("span", { key: 'df4d3384410c6eaffd7e42aa17380740710db0ad', part: "children", class: "bs-navigation-drawer-item__children" }, h("slot", { key: '273844338141f5429aa7b53f55a06fca4293fa2a', name: "children" })))));
135
135
  }
136
136
  static get is() { return "bs-navigation-drawer-item"; }
137
137
  static get encapsulation() { return "shadow"; }