bromcom-ui-next 0.1.30 → 0.1.31

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 (546) hide show
  1. package/dist/bromcom-ui/bcm-accordion-group.entry.esm.js.map +1 -1
  2. package/dist/bromcom-ui/bcm-accordion.entry.esm.js.map +1 -1
  3. package/dist/bromcom-ui/bcm-alert.entry.esm.js.map +1 -1
  4. package/dist/bromcom-ui/bcm-avatar.entry.esm.js.map +1 -1
  5. package/dist/bromcom-ui/bcm-badge.entry.esm.js.map +1 -1
  6. package/dist/bromcom-ui/bcm-basic-badge.entry.esm.js.map +1 -1
  7. package/dist/bromcom-ui/bcm-button-group.entry.esm.js.map +1 -1
  8. package/dist/bromcom-ui/bcm-button.entry.esm.js.map +1 -0
  9. package/dist/bromcom-ui/bcm-checkbox.entry.esm.js.map +1 -1
  10. package/dist/bromcom-ui/bcm-chip.entry.esm.js.map +1 -1
  11. package/dist/bromcom-ui/bcm-divider.entry.esm.js.map +1 -1
  12. package/dist/bromcom-ui/bcm-drawer.entry.esm.js.map +1 -0
  13. package/dist/bromcom-ui/bcm-dropdown-item.entry.esm.js.map +1 -1
  14. package/dist/bromcom-ui/bcm-dropdown.entry.esm.js.map +1 -1
  15. package/dist/bromcom-ui/bcm-file-upload.entry.esm.js.map +1 -0
  16. package/dist/bromcom-ui/bcm-input.entry.esm.js.map +1 -1
  17. package/dist/bromcom-ui/bcm-linked.entry.esm.js.map +1 -0
  18. package/dist/bromcom-ui/bcm-modal.entry.esm.js.map +1 -0
  19. package/dist/bromcom-ui/bcm-pop-confirm.entry.esm.js.map +1 -0
  20. package/dist/bromcom-ui/bcm-popover.entry.esm.js.map +1 -0
  21. package/dist/bromcom-ui/bcm-radio-group.entry.esm.js.map +1 -1
  22. package/dist/bromcom-ui/bcm-radio.entry.esm.js.map +1 -1
  23. package/dist/bromcom-ui/bcm-segment.bcm-segmented-picker.entry.esm.js.map +1 -0
  24. package/dist/bromcom-ui/bcm-shortcut.entry.esm.js.map +1 -1
  25. package/dist/bromcom-ui/bcm-switch.entry.esm.js.map +1 -1
  26. package/dist/bromcom-ui/bcm-tab.entry.esm.js.map +1 -0
  27. package/dist/bromcom-ui/bcm-tabs.entry.esm.js.map +1 -1
  28. package/dist/bromcom-ui/bcm-text.entry.esm.js.map +1 -1
  29. package/dist/bromcom-ui/bcm-textarea.entry.esm.js.map +1 -1
  30. package/dist/bromcom-ui/bcm-tooltip.entry.esm.js.map +1 -0
  31. package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
  32. package/dist/bromcom-ui/global/global.js +33 -30
  33. package/dist/bromcom-ui/p-010219cf.entry.js +2 -0
  34. package/dist/bromcom-ui/p-010219cf.entry.js.map +1 -0
  35. package/dist/bromcom-ui/p-01a4e00b.entry.js +2 -0
  36. package/dist/bromcom-ui/p-01a4e00b.entry.js.map +1 -0
  37. package/dist/bromcom-ui/p-14c63d61.entry.js +2 -0
  38. package/dist/bromcom-ui/p-14c63d61.entry.js.map +1 -0
  39. package/dist/bromcom-ui/p-20a94dec.entry.js +2 -0
  40. package/dist/bromcom-ui/p-20a94dec.entry.js.map +1 -0
  41. package/dist/bromcom-ui/p-398620c2.entry.js +2 -0
  42. package/dist/bromcom-ui/p-398620c2.entry.js.map +1 -0
  43. package/dist/bromcom-ui/p-3b898f90.entry.js +2 -0
  44. package/dist/bromcom-ui/p-3b898f90.entry.js.map +1 -0
  45. package/dist/bromcom-ui/p-43c85c84.entry.js +2 -0
  46. package/dist/bromcom-ui/p-43c85c84.entry.js.map +1 -0
  47. package/dist/bromcom-ui/p-4e6661a5.entry.js +2 -0
  48. package/dist/bromcom-ui/p-4e6661a5.entry.js.map +1 -0
  49. package/dist/bromcom-ui/p-52bb0cdc.entry.js +2 -0
  50. package/dist/bromcom-ui/p-52bb0cdc.entry.js.map +1 -0
  51. package/dist/bromcom-ui/p-61c1c1c8.entry.js +2 -0
  52. package/dist/bromcom-ui/p-61c1c1c8.entry.js.map +1 -0
  53. package/dist/bromcom-ui/p-82e4c5f2.entry.js +2 -0
  54. package/dist/bromcom-ui/p-82e4c5f2.entry.js.map +1 -0
  55. package/dist/bromcom-ui/p-86f85963.entry.js +2 -0
  56. package/dist/bromcom-ui/p-86f85963.entry.js.map +1 -0
  57. package/dist/bromcom-ui/p-9249c1d1.entry.js +2 -0
  58. package/dist/bromcom-ui/p-9249c1d1.entry.js.map +1 -0
  59. package/dist/bromcom-ui/p-B6Ppbs5O.js +3 -0
  60. package/dist/bromcom-ui/p-B6Ppbs5O.js.map +1 -0
  61. package/dist/bromcom-ui/p-DBDSgIvP.js +2 -0
  62. package/dist/bromcom-ui/p-DBDSgIvP.js.map +1 -0
  63. package/dist/bromcom-ui/p-DaE0ZLar.js +2 -0
  64. package/dist/bromcom-ui/p-DaE0ZLar.js.map +1 -0
  65. package/dist/bromcom-ui/p-a25d1cef.entry.js +2 -0
  66. package/dist/bromcom-ui/p-a25d1cef.entry.js.map +1 -0
  67. package/dist/bromcom-ui/p-a4cb2e79.entry.js +2 -0
  68. package/dist/bromcom-ui/p-a4cb2e79.entry.js.map +1 -0
  69. package/dist/bromcom-ui/p-a68925b4.entry.js +2 -0
  70. package/dist/bromcom-ui/p-a68925b4.entry.js.map +1 -0
  71. package/dist/bromcom-ui/p-a750186c.entry.js +2 -0
  72. package/dist/bromcom-ui/p-a750186c.entry.js.map +1 -0
  73. package/dist/bromcom-ui/p-ac768b56.entry.js +2 -0
  74. package/dist/bromcom-ui/p-ac768b56.entry.js.map +1 -0
  75. package/dist/bromcom-ui/p-b0b193e6.entry.js +2 -0
  76. package/dist/bromcom-ui/p-b0b193e6.entry.js.map +1 -0
  77. package/dist/bromcom-ui/p-bf4409ca.entry.js +2 -0
  78. package/dist/bromcom-ui/p-bf4409ca.entry.js.map +1 -0
  79. package/dist/bromcom-ui/p-c57fb29b.entry.js +2 -0
  80. package/dist/bromcom-ui/p-c57fb29b.entry.js.map +1 -0
  81. package/dist/bromcom-ui/{p-1507908f.entry.js → p-ccc310aa.entry.js} +2 -2
  82. package/dist/bromcom-ui/p-ccc310aa.entry.js.map +1 -0
  83. package/dist/bromcom-ui/p-d4ee962d.entry.js +2 -0
  84. package/dist/bromcom-ui/p-d4ee962d.entry.js.map +1 -0
  85. package/dist/bromcom-ui/p-e25a2f7a.entry.js +2 -0
  86. package/dist/bromcom-ui/p-e25a2f7a.entry.js.map +1 -0
  87. package/dist/bromcom-ui/p-e5b0b2ad.entry.js +2 -0
  88. package/dist/bromcom-ui/p-e5b0b2ad.entry.js.map +1 -0
  89. package/dist/bromcom-ui/p-e70d784d.entry.js +2 -0
  90. package/dist/bromcom-ui/p-e70d784d.entry.js.map +1 -0
  91. package/dist/bromcom-ui/p-e9fa3a22.entry.js +2 -0
  92. package/dist/bromcom-ui/p-e9fa3a22.entry.js.map +1 -0
  93. package/dist/bromcom-ui/p-ef281184.entry.js +2 -0
  94. package/dist/bromcom-ui/p-ef281184.entry.js.map +1 -0
  95. package/dist/bromcom-ui/{p-496014ca.entry.js → p-fb6f616c.entry.js} +2 -2
  96. package/dist/bromcom-ui/p-fb6f616c.entry.js.map +1 -0
  97. package/dist/bromcom-ui/p-fd31c70c.entry.js +2 -0
  98. package/dist/bromcom-ui/p-fd31c70c.entry.js.map +1 -0
  99. package/dist/bromcom-ui/p-nf_HKsGq.js +2 -0
  100. package/dist/bromcom-ui/{p-CUvT12BL.js.map → p-nf_HKsGq.js.map} +1 -1
  101. package/dist/cjs/base-choice-control-EmA4JRjR.js +54 -0
  102. package/dist/cjs/base-choice-control-EmA4JRjR.js.map +1 -0
  103. package/dist/cjs/bcm-accordion-group.cjs.entry.js +20 -18
  104. package/dist/cjs/bcm-accordion-group.entry.cjs.js.map +1 -1
  105. package/dist/cjs/bcm-accordion.cjs.entry.js +73 -56
  106. package/dist/cjs/bcm-accordion.entry.cjs.js.map +1 -1
  107. package/dist/cjs/bcm-alert.cjs.entry.js +21 -21
  108. package/dist/cjs/bcm-alert.entry.cjs.js.map +1 -1
  109. package/dist/cjs/bcm-avatar.cjs.entry.js +22 -12
  110. package/dist/cjs/bcm-avatar.entry.cjs.js.map +1 -1
  111. package/dist/cjs/bcm-badge.cjs.entry.js +114 -82
  112. package/dist/cjs/bcm-badge.entry.cjs.js.map +1 -1
  113. package/dist/cjs/bcm-basic-badge.cjs.entry.js +73 -59
  114. package/dist/cjs/bcm-basic-badge.entry.cjs.js.map +1 -1
  115. package/dist/cjs/bcm-button-group.cjs.entry.js +36 -24
  116. package/dist/cjs/bcm-button-group.entry.cjs.js.map +1 -1
  117. package/dist/cjs/bcm-button.cjs.entry.js +338 -0
  118. package/dist/cjs/bcm-button.entry.cjs.js.map +1 -0
  119. package/dist/cjs/bcm-checkbox.cjs.entry.js +284 -174
  120. package/dist/cjs/bcm-checkbox.entry.cjs.js.map +1 -1
  121. package/dist/cjs/bcm-chip.cjs.entry.js +38 -35
  122. package/dist/cjs/bcm-chip.entry.cjs.js.map +1 -1
  123. package/dist/cjs/bcm-divider.cjs.entry.js +55 -55
  124. package/dist/cjs/bcm-divider.entry.cjs.js.map +1 -1
  125. package/dist/cjs/bcm-drawer.cjs.entry.js +332 -0
  126. package/dist/cjs/bcm-drawer.entry.cjs.js.map +1 -0
  127. package/dist/cjs/bcm-dropdown-item.cjs.entry.js +36 -33
  128. package/dist/cjs/bcm-dropdown-item.entry.cjs.js.map +1 -1
  129. package/dist/cjs/bcm-dropdown.cjs.entry.js +18 -17
  130. package/dist/cjs/bcm-dropdown.entry.cjs.js.map +1 -1
  131. package/dist/cjs/bcm-file-upload.cjs.entry.js +552 -0
  132. package/dist/cjs/bcm-file-upload.entry.cjs.js.map +1 -0
  133. package/dist/cjs/bcm-input.cjs.entry.js +250 -158
  134. package/dist/cjs/bcm-input.entry.cjs.js.map +1 -1
  135. package/dist/cjs/bcm-linked.cjs.entry.js +452 -0
  136. package/dist/cjs/bcm-linked.entry.cjs.js.map +1 -0
  137. package/dist/cjs/bcm-modal.cjs.entry.js +360 -0
  138. package/dist/cjs/bcm-modal.entry.cjs.js.map +1 -0
  139. package/dist/cjs/bcm-pop-confirm.cjs.entry.js +381 -0
  140. package/dist/cjs/bcm-pop-confirm.entry.cjs.js.map +1 -0
  141. package/dist/cjs/bcm-popover.cjs.entry.js +451 -0
  142. package/dist/cjs/bcm-popover.entry.cjs.js.map +1 -0
  143. package/dist/cjs/bcm-radio-group.cjs.entry.js +103 -80
  144. package/dist/cjs/bcm-radio-group.entry.cjs.js.map +1 -1
  145. package/dist/cjs/bcm-radio.cjs.entry.js +239 -106
  146. package/dist/cjs/bcm-radio.entry.cjs.js.map +1 -1
  147. package/dist/cjs/bcm-segment.bcm-segmented-picker.entry.cjs.js.map +1 -0
  148. package/dist/cjs/bcm-segment_2.cjs.entry.js +335 -0
  149. package/dist/cjs/bcm-shortcut.cjs.entry.js +5 -4
  150. package/dist/cjs/bcm-shortcut.entry.cjs.js.map +1 -1
  151. package/dist/cjs/bcm-switch.cjs.entry.js +281 -148
  152. package/dist/cjs/bcm-switch.entry.cjs.js.map +1 -1
  153. package/dist/cjs/bcm-tab.cjs.entry.js +44 -0
  154. package/dist/cjs/bcm-tab.entry.cjs.js.map +1 -0
  155. package/dist/cjs/bcm-tabs.cjs.entry.js +191 -237
  156. package/dist/cjs/bcm-tabs.entry.cjs.js.map +1 -1
  157. package/dist/cjs/bcm-text.cjs.entry.js +86 -85
  158. package/dist/cjs/bcm-text.entry.cjs.js.map +1 -1
  159. package/dist/cjs/bcm-textarea.cjs.entry.js +224 -154
  160. package/dist/cjs/bcm-textarea.entry.cjs.js.map +1 -1
  161. package/dist/cjs/bcm-tooltip.cjs.entry.js +414 -0
  162. package/dist/cjs/bcm-tooltip.entry.cjs.js.map +1 -0
  163. package/dist/cjs/bromcom-ui.cjs.js +2 -2
  164. package/dist/cjs/floating-ui.dom-S9nP6zZt.js +1622 -0
  165. package/dist/{bromcom-ui/floating-ui.dom-ltNPqX34.js.map → cjs/floating-ui.dom-S9nP6zZt.js.map} +1 -1
  166. package/dist/cjs/{index-CmYzUr-k.js → index-1Qal-onT.js} +111 -33
  167. package/dist/cjs/index-1Qal-onT.js.map +1 -0
  168. package/dist/cjs/loader.cjs.js +2 -2
  169. package/dist/cjs/{validation-messages-BjfpSEWk.js → validation-messages-DieKlSG4.js} +6 -7
  170. package/dist/{esm/validation-messages-CUvT12BL.js.map → cjs/validation-messages-DieKlSG4.js.map} +1 -1
  171. package/dist/collection/collection-manifest.json +4 -5
  172. package/dist/collection/components/_shared/form/base-choice-control.js +90 -0
  173. package/dist/collection/components/_shared/form/base-choice-control.js.map +1 -0
  174. package/dist/collection/components/_shared/form/base-form-control.js +115 -0
  175. package/dist/collection/components/_shared/form/base-form-control.js.map +1 -0
  176. package/dist/collection/components/accordion/accordion.component.js +72 -55
  177. package/dist/collection/components/accordion/accordion.component.js.map +1 -1
  178. package/dist/collection/components/accordion/accordion.css +1 -1
  179. package/dist/collection/components/accordion-group/accordion-group.component.js +20 -18
  180. package/dist/collection/components/accordion-group/accordion-group.component.js.map +1 -1
  181. package/dist/collection/components/alert/alert.component.js +19 -21
  182. package/dist/collection/components/alert/alert.component.js.map +1 -1
  183. package/dist/collection/components/alert/alert.css +1 -1
  184. package/dist/collection/components/avatar/avatar.component.js +20 -12
  185. package/dist/collection/components/avatar/avatar.component.js.map +1 -1
  186. package/dist/collection/components/avatar/avatar.css +1 -1
  187. package/dist/collection/components/badge/badge.component.js +111 -81
  188. package/dist/collection/components/badge/badge.component.js.map +1 -1
  189. package/dist/collection/components/badge/badge.css +1 -1
  190. package/dist/collection/components/basic-badge/basic-badge.component.js +70 -58
  191. package/dist/collection/components/basic-badge/basic-badge.component.js.map +1 -1
  192. package/dist/collection/components/basic-badge/basic-badge.css +1 -1
  193. package/dist/collection/components/button/button.component.js +105 -84
  194. package/dist/collection/components/button/button.component.js.map +1 -1
  195. package/dist/collection/components/button/button.css +1 -1
  196. package/dist/collection/components/button-group/button-group.component.js +34 -23
  197. package/dist/collection/components/button-group/button-group.component.js.map +1 -1
  198. package/dist/collection/components/button-group/button-group.css +1 -1
  199. package/dist/collection/components/checkbox/checkbox.component.js +355 -236
  200. package/dist/collection/components/checkbox/checkbox.component.js.map +1 -1
  201. package/dist/collection/components/checkbox/checkbox.css +1 -1
  202. package/dist/collection/components/chip/chip.component.js +35 -34
  203. package/dist/collection/components/chip/chip.component.js.map +1 -1
  204. package/dist/collection/components/chip/chip.css +1 -1
  205. package/dist/collection/components/divider/divider.component.js +53 -55
  206. package/dist/collection/components/divider/divider.component.js.map +1 -1
  207. package/dist/collection/components/drawer/drawer.component.js +168 -144
  208. package/dist/collection/components/drawer/drawer.component.js.map +1 -1
  209. package/dist/collection/components/dropdown/dropdown.component.js +16 -16
  210. package/dist/collection/components/dropdown/dropdown.component.js.map +1 -1
  211. package/dist/collection/components/dropdown/dropdown.css +1 -1
  212. package/dist/collection/components/dropdown-item/dropdown-item.component.js +34 -32
  213. package/dist/collection/components/dropdown-item/dropdown-item.component.js.map +1 -1
  214. package/dist/collection/components/dropdown-item/dropdown-item.css +1 -1
  215. package/dist/collection/components/input/input.component.js +241 -155
  216. package/dist/collection/components/input/input.component.js.map +1 -1
  217. package/dist/collection/components/linked/linked.component.js +160 -138
  218. package/dist/collection/components/linked/linked.component.js.map +1 -1
  219. package/dist/collection/components/linked/linked.css +1 -1
  220. package/dist/collection/components/modal/modal.component.js +180 -156
  221. package/dist/collection/components/modal/modal.component.js.map +1 -1
  222. package/dist/collection/components/pop-confirm/pop-confirm.component.js +190 -159
  223. package/dist/collection/components/pop-confirm/pop-confirm.component.js.map +1 -1
  224. package/dist/collection/components/pop-confirm/pop-confirm.css +1 -1
  225. package/dist/collection/components/popover/popover.component.js +240 -212
  226. package/dist/collection/components/popover/popover.component.js.map +1 -1
  227. package/dist/collection/components/popover/popover.css +1 -1
  228. package/dist/collection/components/radio/radio.component.js +282 -106
  229. package/dist/collection/components/radio/radio.component.js.map +1 -1
  230. package/dist/collection/components/radio-group/radio-group.component.js +102 -80
  231. package/dist/collection/components/radio-group/radio-group.component.js.map +1 -1
  232. package/dist/collection/components/segmented-picker/segment.component.js +228 -0
  233. package/dist/collection/components/segmented-picker/segment.component.js.map +1 -0
  234. package/dist/collection/components/segmented-picker/segment.css +1 -0
  235. package/dist/collection/components/segmented-picker/segmented-picker.component.js +354 -139
  236. package/dist/collection/components/segmented-picker/segmented-picker.component.js.map +1 -1
  237. package/dist/collection/components/segmented-picker/segmented-picker.css +1 -1
  238. package/dist/collection/components/shortcut/shortcut.js +4 -5
  239. package/dist/collection/components/shortcut/shortcut.js.map +1 -1
  240. package/dist/collection/components/switch/switch.component.js +350 -280
  241. package/dist/collection/components/switch/switch.component.js.map +1 -1
  242. package/dist/collection/components/switch/switch.css +1 -1
  243. package/dist/collection/components/tabs/bcm-tab.css +1 -0
  244. package/dist/collection/components/tabs/bcm-tabs.css +1 -1
  245. package/dist/collection/components/tabs/tab.component.js +169 -0
  246. package/dist/collection/components/tabs/tab.component.js.map +1 -0
  247. package/dist/collection/components/tabs/tabs.component.js +221 -352
  248. package/dist/collection/components/tabs/tabs.component.js.map +1 -1
  249. package/dist/collection/components/text/text.component.js +84 -85
  250. package/dist/collection/components/text/text.component.js.map +1 -1
  251. package/dist/collection/components/text/text.css +1 -1
  252. package/dist/collection/components/textarea/textarea.component.js +216 -153
  253. package/dist/collection/components/textarea/textarea.component.js.map +1 -1
  254. package/dist/collection/components/tooltip/tooltip.component.js +164 -154
  255. package/dist/collection/components/tooltip/tooltip.component.js.map +1 -1
  256. package/dist/collection/components/upload/file-upload.component.js +905 -0
  257. package/dist/collection/components/upload/file-upload.component.js.map +1 -0
  258. package/dist/collection/components/upload/file-upload.css +1 -0
  259. package/dist/collection/global/global.js +33 -30
  260. package/dist/collection/utils/i18n.js +3 -4
  261. package/dist/collection/utils/i18n.js.map +1 -1
  262. package/dist/collection/utils/slot/check-slot-content.js +1 -2
  263. package/dist/collection/utils/slot/check-slot-content.js.map +1 -1
  264. package/dist/collection/utils/validation-messages.js +1 -1
  265. package/dist/collection/utils/validation-messages.js.map +1 -1
  266. package/dist/components/bcm-accordion-group.js +19 -17
  267. package/dist/components/bcm-accordion-group.js.map +1 -1
  268. package/dist/components/bcm-accordion.js +72 -55
  269. package/dist/components/bcm-accordion.js.map +1 -1
  270. package/dist/components/bcm-alert.js +1 -114
  271. package/dist/components/bcm-alert.js.map +1 -1
  272. package/dist/components/bcm-avatar.js +22 -12
  273. package/dist/components/bcm-avatar.js.map +1 -1
  274. package/dist/components/bcm-badge.js +1 -1
  275. package/dist/components/bcm-basic-badge.js +72 -58
  276. package/dist/components/bcm-basic-badge.js.map +1 -1
  277. package/dist/components/bcm-button-group.js +35 -23
  278. package/dist/components/bcm-button-group.js.map +1 -1
  279. package/dist/components/bcm-button.js +1 -1
  280. package/dist/components/bcm-checkbox.js +296 -184
  281. package/dist/components/bcm-checkbox.js.map +1 -1
  282. package/dist/components/bcm-chip.js +37 -34
  283. package/dist/components/bcm-chip.js.map +1 -1
  284. package/dist/components/bcm-divider.js +54 -54
  285. package/dist/components/bcm-divider.js.map +1 -1
  286. package/dist/components/bcm-drawer.js +169 -144
  287. package/dist/components/bcm-drawer.js.map +1 -1
  288. package/dist/components/bcm-dropdown-item.js +35 -32
  289. package/dist/components/bcm-dropdown-item.js.map +1 -1
  290. package/dist/components/bcm-dropdown.js +19 -18
  291. package/dist/components/bcm-dropdown.js.map +1 -1
  292. package/dist/components/{bcm-tabs-content.d.ts → bcm-file-upload.d.ts} +4 -4
  293. package/dist/components/bcm-file-upload.js +593 -0
  294. package/dist/components/bcm-file-upload.js.map +1 -0
  295. package/dist/components/bcm-input.js +244 -158
  296. package/dist/components/bcm-input.js.map +1 -1
  297. package/dist/components/bcm-linked.js +1 -1
  298. package/dist/components/bcm-modal.js +181 -156
  299. package/dist/components/bcm-modal.js.map +1 -1
  300. package/dist/components/bcm-pop-confirm.js +192 -160
  301. package/dist/components/bcm-pop-confirm.js.map +1 -1
  302. package/dist/components/bcm-popover.js +242 -213
  303. package/dist/components/bcm-popover.js.map +1 -1
  304. package/dist/components/bcm-radio-group.js +102 -79
  305. package/dist/components/bcm-radio-group.js.map +1 -1
  306. package/dist/components/bcm-radio.js +241 -108
  307. package/dist/components/bcm-radio.js.map +1 -1
  308. package/dist/components/{bcm-tabs-list.d.ts → bcm-segment.d.ts} +4 -4
  309. package/dist/components/bcm-segment.js +110 -0
  310. package/dist/components/bcm-segment.js.map +1 -0
  311. package/dist/components/bcm-segmented-picker.js +234 -115
  312. package/dist/components/bcm-segmented-picker.js.map +1 -1
  313. package/dist/components/bcm-shortcut.js +4 -3
  314. package/dist/components/bcm-shortcut.js.map +1 -1
  315. package/dist/components/bcm-switch.js +292 -156
  316. package/dist/components/bcm-switch.js.map +1 -1
  317. package/dist/components/{bcm-tabs-trigger.d.ts → bcm-tab.d.ts} +4 -4
  318. package/dist/components/bcm-tab.js +71 -0
  319. package/dist/components/bcm-tab.js.map +1 -0
  320. package/dist/components/bcm-tabs.js +196 -247
  321. package/dist/components/bcm-tabs.js.map +1 -1
  322. package/dist/components/bcm-text.js +85 -84
  323. package/dist/components/bcm-text.js.map +1 -1
  324. package/dist/components/bcm-textarea.js +218 -154
  325. package/dist/components/bcm-textarea.js.map +1 -1
  326. package/dist/components/bcm-tooltip.js +164 -153
  327. package/dist/components/bcm-tooltip.js.map +1 -1
  328. package/dist/components/index.js +105 -32
  329. package/dist/components/index.js.map +1 -1
  330. package/dist/components/p-5_TgtzQU.js +119 -0
  331. package/dist/components/p-5_TgtzQU.js.map +1 -0
  332. package/dist/components/p-RlBWOSgL.js +179 -0
  333. package/dist/components/p-RlBWOSgL.js.map +1 -0
  334. package/dist/components/p-SERXqWcS.js +51 -0
  335. package/dist/components/p-SERXqWcS.js.map +1 -0
  336. package/dist/components/{p-CUvT12BL.js → p-nf_HKsGq.js} +6 -7
  337. package/dist/components/p-nf_HKsGq.js.map +1 -0
  338. package/dist/components/{p-CsIBm0J5.js → p-xQIzBLsS.js} +108 -85
  339. package/dist/components/p-xQIzBLsS.js.map +1 -0
  340. package/dist/components/{p-6VLsKZvR.js → p-z9ESseGb.js} +163 -140
  341. package/dist/components/p-z9ESseGb.js.map +1 -0
  342. package/dist/esm/base-choice-control-CKR8UdZ6.js +52 -0
  343. package/dist/esm/base-choice-control-CKR8UdZ6.js.map +1 -0
  344. package/dist/esm/bcm-accordion-group.entry.js +20 -18
  345. package/dist/esm/bcm-accordion-group.entry.js.map +1 -1
  346. package/dist/esm/bcm-accordion.entry.js +73 -56
  347. package/dist/esm/bcm-accordion.entry.js.map +1 -1
  348. package/dist/esm/bcm-alert.entry.js +21 -21
  349. package/dist/esm/bcm-alert.entry.js.map +1 -1
  350. package/dist/esm/bcm-avatar.entry.js +22 -12
  351. package/dist/esm/bcm-avatar.entry.js.map +1 -1
  352. package/dist/esm/bcm-badge.entry.js +114 -82
  353. package/dist/esm/bcm-badge.entry.js.map +1 -1
  354. package/dist/esm/bcm-basic-badge.entry.js +73 -59
  355. package/dist/esm/bcm-basic-badge.entry.js.map +1 -1
  356. package/dist/esm/bcm-button-group.entry.js +36 -24
  357. package/dist/esm/bcm-button-group.entry.js.map +1 -1
  358. package/dist/esm/bcm-button.entry.js +336 -0
  359. package/dist/esm/bcm-button.entry.js.map +1 -0
  360. package/dist/esm/bcm-checkbox.entry.js +284 -174
  361. package/dist/esm/bcm-checkbox.entry.js.map +1 -1
  362. package/dist/esm/bcm-chip.entry.js +38 -35
  363. package/dist/esm/bcm-chip.entry.js.map +1 -1
  364. package/dist/esm/bcm-divider.entry.js +55 -55
  365. package/dist/esm/bcm-divider.entry.js.map +1 -1
  366. package/dist/esm/bcm-drawer.entry.js +330 -0
  367. package/dist/esm/bcm-drawer.entry.js.map +1 -0
  368. package/dist/esm/bcm-dropdown-item.entry.js +36 -33
  369. package/dist/esm/bcm-dropdown-item.entry.js.map +1 -1
  370. package/dist/esm/bcm-dropdown.entry.js +18 -17
  371. package/dist/esm/bcm-dropdown.entry.js.map +1 -1
  372. package/dist/esm/bcm-file-upload.entry.js +550 -0
  373. package/dist/esm/bcm-file-upload.entry.js.map +1 -0
  374. package/dist/esm/bcm-input.entry.js +250 -158
  375. package/dist/esm/bcm-input.entry.js.map +1 -1
  376. package/dist/esm/bcm-linked.entry.js +450 -0
  377. package/dist/esm/bcm-linked.entry.js.map +1 -0
  378. package/dist/esm/bcm-modal.entry.js +358 -0
  379. package/dist/esm/bcm-modal.entry.js.map +1 -0
  380. package/dist/esm/bcm-pop-confirm.entry.js +379 -0
  381. package/dist/esm/bcm-pop-confirm.entry.js.map +1 -0
  382. package/dist/esm/bcm-popover.entry.js +449 -0
  383. package/dist/esm/bcm-popover.entry.js.map +1 -0
  384. package/dist/esm/bcm-radio-group.entry.js +103 -80
  385. package/dist/esm/bcm-radio-group.entry.js.map +1 -1
  386. package/dist/esm/bcm-radio.entry.js +239 -106
  387. package/dist/esm/bcm-radio.entry.js.map +1 -1
  388. package/dist/esm/bcm-segment.bcm-segmented-picker.entry.js.map +1 -0
  389. package/dist/esm/bcm-segment_2.entry.js +332 -0
  390. package/dist/esm/bcm-shortcut.entry.js +5 -4
  391. package/dist/esm/bcm-shortcut.entry.js.map +1 -1
  392. package/dist/esm/bcm-switch.entry.js +281 -148
  393. package/dist/esm/bcm-switch.entry.js.map +1 -1
  394. package/dist/esm/bcm-tab.entry.js +42 -0
  395. package/dist/esm/bcm-tab.entry.js.map +1 -0
  396. package/dist/esm/bcm-tabs.entry.js +191 -237
  397. package/dist/esm/bcm-tabs.entry.js.map +1 -1
  398. package/dist/esm/bcm-text.entry.js +86 -85
  399. package/dist/esm/bcm-text.entry.js.map +1 -1
  400. package/dist/esm/bcm-textarea.entry.js +224 -154
  401. package/dist/esm/bcm-textarea.entry.js.map +1 -1
  402. package/dist/esm/bcm-tooltip.entry.js +412 -0
  403. package/dist/esm/bcm-tooltip.entry.js.map +1 -0
  404. package/dist/esm/bromcom-ui.js +3 -3
  405. package/dist/esm/floating-ui.dom-DBDSgIvP.js +1615 -0
  406. package/dist/esm/floating-ui.dom-DBDSgIvP.js.map +1 -0
  407. package/dist/esm/{index-CRwAh9Np.js → index-B6Ppbs5O.js} +111 -34
  408. package/dist/esm/index-B6Ppbs5O.js.map +1 -0
  409. package/dist/esm/loader.js +3 -3
  410. package/dist/esm/{validation-messages-CUvT12BL.js → validation-messages-nf_HKsGq.js} +6 -7
  411. package/dist/{cjs/validation-messages-BjfpSEWk.js.map → esm/validation-messages-nf_HKsGq.js.map} +1 -1
  412. package/dist/types/components/_shared/form/base-choice-control.d.ts +15 -0
  413. package/dist/types/components/_shared/form/base-form-control.d.ts +11 -0
  414. package/dist/types/components/checkbox/checkbox.component.d.ts +89 -71
  415. package/dist/types/components/input/input.component.d.ts +5 -0
  416. package/dist/types/components/radio/radio.component.d.ts +21 -0
  417. package/dist/types/components/segmented-picker/segment.component.d.ts +42 -0
  418. package/dist/types/components/segmented-picker/segmented-picker.component.d.ts +91 -24
  419. package/dist/types/components/switch/switch.component.d.ts +83 -43
  420. package/dist/types/components/tabs/tab.component.d.ts +33 -0
  421. package/dist/types/components/tabs/tabs.component.d.ts +51 -64
  422. package/dist/types/components/textarea/textarea.component.d.ts +5 -0
  423. package/dist/types/components/upload/file-upload.component.d.ts +107 -0
  424. package/dist/types/components.d.ts +830 -382
  425. package/package.json +2 -2
  426. package/dist/bromcom-ui/_commonjsHelpers-CvGrISen.js.map +0 -1
  427. package/dist/bromcom-ui/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.esm.js.map +0 -1
  428. package/dist/bromcom-ui/bcm-segmented-picker-option.entry.esm.js.map +0 -1
  429. package/dist/bromcom-ui/bcm-segmented-picker.entry.esm.js.map +0 -1
  430. package/dist/bromcom-ui/bcm-tabs-content.entry.esm.js.map +0 -1
  431. package/dist/bromcom-ui/bcm-tabs-list.entry.esm.js.map +0 -1
  432. package/dist/bromcom-ui/bcm-tabs-trigger.entry.esm.js.map +0 -1
  433. package/dist/bromcom-ui/generate-id-Crb5QsB-.js.map +0 -1
  434. package/dist/bromcom-ui/index-40rmUZjU.js.map +0 -1
  435. package/dist/bromcom-ui/index-BCaJmHBB.js.map +0 -1
  436. package/dist/bromcom-ui/p-0c7c6896.entry.js +0 -2
  437. package/dist/bromcom-ui/p-0c7c6896.entry.js.map +0 -1
  438. package/dist/bromcom-ui/p-11d0e649.entry.js +0 -2
  439. package/dist/bromcom-ui/p-11d0e649.entry.js.map +0 -1
  440. package/dist/bromcom-ui/p-12f38632.entry.js +0 -2
  441. package/dist/bromcom-ui/p-12f38632.entry.js.map +0 -1
  442. package/dist/bromcom-ui/p-13cbd1f5.entry.js +0 -2
  443. package/dist/bromcom-ui/p-13cbd1f5.entry.js.map +0 -1
  444. package/dist/bromcom-ui/p-1507908f.entry.js.map +0 -1
  445. package/dist/bromcom-ui/p-1ce9913f.entry.js +0 -2
  446. package/dist/bromcom-ui/p-1ce9913f.entry.js.map +0 -1
  447. package/dist/bromcom-ui/p-206d767e.entry.js +0 -2
  448. package/dist/bromcom-ui/p-206d767e.entry.js.map +0 -1
  449. package/dist/bromcom-ui/p-3cf7a7f4.entry.js +0 -2
  450. package/dist/bromcom-ui/p-3cf7a7f4.entry.js.map +0 -1
  451. package/dist/bromcom-ui/p-4505feba.entry.js +0 -2
  452. package/dist/bromcom-ui/p-4505feba.entry.js.map +0 -1
  453. package/dist/bromcom-ui/p-496014ca.entry.js.map +0 -1
  454. package/dist/bromcom-ui/p-4a932cd3.entry.js +0 -2
  455. package/dist/bromcom-ui/p-4a932cd3.entry.js.map +0 -1
  456. package/dist/bromcom-ui/p-4e554b8d.entry.js +0 -2
  457. package/dist/bromcom-ui/p-4e554b8d.entry.js.map +0 -1
  458. package/dist/bromcom-ui/p-57c4c4c4.entry.js +0 -2
  459. package/dist/bromcom-ui/p-57c4c4c4.entry.js.map +0 -1
  460. package/dist/bromcom-ui/p-61293ab2.entry.js +0 -2
  461. package/dist/bromcom-ui/p-61293ab2.entry.js.map +0 -1
  462. package/dist/bromcom-ui/p-61789456.entry.js +0 -2
  463. package/dist/bromcom-ui/p-61789456.entry.js.map +0 -1
  464. package/dist/bromcom-ui/p-65d0f188.entry.js +0 -2
  465. package/dist/bromcom-ui/p-65d0f188.entry.js.map +0 -1
  466. package/dist/bromcom-ui/p-83f707dc.entry.js +0 -2
  467. package/dist/bromcom-ui/p-83f707dc.entry.js.map +0 -1
  468. package/dist/bromcom-ui/p-8ba02e7e.entry.js +0 -2
  469. package/dist/bromcom-ui/p-8ba02e7e.entry.js.map +0 -1
  470. package/dist/bromcom-ui/p-9e9bf32e.entry.js +0 -2
  471. package/dist/bromcom-ui/p-9e9bf32e.entry.js.map +0 -1
  472. package/dist/bromcom-ui/p-CRwAh9Np.js +0 -3
  473. package/dist/bromcom-ui/p-CRwAh9Np.js.map +0 -1
  474. package/dist/bromcom-ui/p-CUvT12BL.js +0 -2
  475. package/dist/bromcom-ui/p-c87a6acf.entry.js +0 -2
  476. package/dist/bromcom-ui/p-c87a6acf.entry.js.map +0 -1
  477. package/dist/bromcom-ui/p-e0e235a8.entry.js +0 -2
  478. package/dist/bromcom-ui/p-e0e235a8.entry.js.map +0 -1
  479. package/dist/bromcom-ui/p-e1ce8b55.entry.js +0 -2
  480. package/dist/bromcom-ui/p-e1ce8b55.entry.js.map +0 -1
  481. package/dist/bromcom-ui/p-e4dddb0b.entry.js +0 -2
  482. package/dist/bromcom-ui/p-e4dddb0b.entry.js.map +0 -1
  483. package/dist/bromcom-ui/p-f9426924.entry.js +0 -2
  484. package/dist/bromcom-ui/p-f9426924.entry.js.map +0 -1
  485. package/dist/bromcom-ui/p-faa0e62c.entry.js +0 -2
  486. package/dist/bromcom-ui/p-faa0e62c.entry.js.map +0 -1
  487. package/dist/bromcom-ui/p-fcb4399f.entry.js +0 -2
  488. package/dist/bromcom-ui/p-fcb4399f.entry.js.map +0 -1
  489. package/dist/bromcom-ui/tv-SlGJ5EfR.js.map +0 -1
  490. package/dist/bromcom-ui/validation-messages-CUvT12BL.js.map +0 -1
  491. package/dist/cjs/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.cjs.js.map +0 -1
  492. package/dist/cjs/bcm-button_7.cjs.entry.js +0 -4131
  493. package/dist/cjs/bcm-segmented-picker-option.cjs.entry.js +0 -105
  494. package/dist/cjs/bcm-segmented-picker-option.entry.cjs.js.map +0 -1
  495. package/dist/cjs/bcm-segmented-picker.cjs.entry.js +0 -142
  496. package/dist/cjs/bcm-segmented-picker.entry.cjs.js.map +0 -1
  497. package/dist/cjs/bcm-tabs-content.cjs.entry.js +0 -18
  498. package/dist/cjs/bcm-tabs-content.entry.cjs.js.map +0 -1
  499. package/dist/cjs/bcm-tabs-list.cjs.entry.js +0 -82
  500. package/dist/cjs/bcm-tabs-list.entry.cjs.js.map +0 -1
  501. package/dist/cjs/bcm-tabs-trigger.cjs.entry.js +0 -120
  502. package/dist/cjs/bcm-tabs-trigger.entry.cjs.js.map +0 -1
  503. package/dist/cjs/index-CmYzUr-k.js.map +0 -1
  504. package/dist/collection/components/segmented-picker/segmented-picker-option.component.js +0 -253
  505. package/dist/collection/components/segmented-picker/segmented-picker-option.component.js.map +0 -1
  506. package/dist/collection/components/segmented-picker/segmented-picker-option.css +0 -1
  507. package/dist/collection/components/tabs/tabs-content.component.js +0 -46
  508. package/dist/collection/components/tabs/tabs-content.component.js.map +0 -1
  509. package/dist/collection/components/tabs/tabs-content.css +0 -1
  510. package/dist/collection/components/tabs/tabs-list.component.js +0 -133
  511. package/dist/collection/components/tabs/tabs-list.component.js.map +0 -1
  512. package/dist/collection/components/tabs/tabs-list.css +0 -1
  513. package/dist/collection/components/tabs/tabs-trigger.component.js +0 -267
  514. package/dist/collection/components/tabs/tabs-trigger.component.js.map +0 -1
  515. package/dist/collection/components/tabs/tabs-trigger.css +0 -1
  516. package/dist/components/bcm-segmented-picker-option.d.ts +0 -11
  517. package/dist/components/bcm-segmented-picker-option.js +0 -133
  518. package/dist/components/bcm-segmented-picker-option.js.map +0 -1
  519. package/dist/components/bcm-tabs-content.js +0 -41
  520. package/dist/components/bcm-tabs-content.js.map +0 -1
  521. package/dist/components/bcm-tabs-list.js +0 -106
  522. package/dist/components/bcm-tabs-list.js.map +0 -1
  523. package/dist/components/bcm-tabs-trigger.js +0 -148
  524. package/dist/components/bcm-tabs-trigger.js.map +0 -1
  525. package/dist/components/p-6VLsKZvR.js.map +0 -1
  526. package/dist/components/p-CUvT12BL.js.map +0 -1
  527. package/dist/components/p-CaemikSK.js +0 -147
  528. package/dist/components/p-CaemikSK.js.map +0 -1
  529. package/dist/components/p-CsIBm0J5.js.map +0 -1
  530. package/dist/esm/bcm-button.bcm-drawer.bcm-linked.bcm-modal.bcm-pop-confirm.bcm-popover.bcm-tooltip.entry.js.map +0 -1
  531. package/dist/esm/bcm-button_7.entry.js +0 -4123
  532. package/dist/esm/bcm-segmented-picker-option.entry.js +0 -103
  533. package/dist/esm/bcm-segmented-picker-option.entry.js.map +0 -1
  534. package/dist/esm/bcm-segmented-picker.entry.js +0 -140
  535. package/dist/esm/bcm-segmented-picker.entry.js.map +0 -1
  536. package/dist/esm/bcm-tabs-content.entry.js +0 -16
  537. package/dist/esm/bcm-tabs-content.entry.js.map +0 -1
  538. package/dist/esm/bcm-tabs-list.entry.js +0 -80
  539. package/dist/esm/bcm-tabs-list.entry.js.map +0 -1
  540. package/dist/esm/bcm-tabs-trigger.entry.js +0 -118
  541. package/dist/esm/bcm-tabs-trigger.entry.js.map +0 -1
  542. package/dist/esm/index-CRwAh9Np.js.map +0 -1
  543. package/dist/types/components/segmented-picker/segmented-picker-option.component.d.ts +0 -30
  544. package/dist/types/components/tabs/tabs-content.component.d.ts +0 -13
  545. package/dist/types/components/tabs/tabs-list.component.d.ts +0 -20
  546. package/dist/types/components/tabs/tabs-trigger.component.d.ts +0 -49
@@ -12,13 +12,13 @@ import { AvatarShape, AvatarSize, AvatarStatus } from "./components/avatar/types
12
12
  import { ButtonKind, ButtonPosition, ButtonSize, ButtonStatus, ButtonType, ButtonVariant, IconPosition } from "./components/button/types";
13
13
  import { ChipKind, ChipSize, ChipStatus } from "./components/chip/types";
14
14
  import { DrawerPosition, DrawerSize } from "./components/drawer/types";
15
+ import { BcmUploadErrorMessages, BcmUploadItem } from "./components/upload/file-upload.component";
15
16
  import { InputSize, InputStatus, InputType } from "./components/input/types";
16
17
  import { Event } from "./stencil-public-runtime";
17
18
  import { TriggerType } from "./components/linked/linked.component";
18
19
  import { Placement } from "@floating-ui/dom";
19
20
  import { ModalPlacement, ModalSize } from "./components/modal/modal.component";
20
21
  import { PopConfirmPlacement, PopConfirmSize, PopConfirmStatus } from "./components/pop-confirm/pop-confirm.component";
21
- import { SegmentedPickerSize } from "./components/segmented-picker/types";
22
22
  import { TextSize, TextVariant } from "./components/text/text.types";
23
23
  import { InputSize as InputSize1, InputStatus as InputStatus1, TextareaResize } from "./components/textarea/types";
24
24
  import { TooltipPlacement, TooltipSize, TooltipTrigger } from "./components/tooltip/tooltip.component";
@@ -29,13 +29,13 @@ export { AvatarShape, AvatarSize, AvatarStatus } from "./components/avatar/types
29
29
  export { ButtonKind, ButtonPosition, ButtonSize, ButtonStatus, ButtonType, ButtonVariant, IconPosition } from "./components/button/types";
30
30
  export { ChipKind, ChipSize, ChipStatus } from "./components/chip/types";
31
31
  export { DrawerPosition, DrawerSize } from "./components/drawer/types";
32
+ export { BcmUploadErrorMessages, BcmUploadItem } from "./components/upload/file-upload.component";
32
33
  export { InputSize, InputStatus, InputType } from "./components/input/types";
33
34
  export { Event } from "./stencil-public-runtime";
34
35
  export { TriggerType } from "./components/linked/linked.component";
35
36
  export { Placement } from "@floating-ui/dom";
36
37
  export { ModalPlacement, ModalSize } from "./components/modal/modal.component";
37
38
  export { PopConfirmPlacement, PopConfirmSize, PopConfirmStatus } from "./components/pop-confirm/pop-confirm.component";
38
- export { SegmentedPickerSize } from "./components/segmented-picker/types";
39
39
  export { TextSize, TextVariant } from "./components/text/text.types";
40
40
  export { InputSize as InputSize1, InputStatus as InputStatus1, TextareaResize } from "./components/textarea/types";
41
41
  export { TooltipPlacement, TooltipSize, TooltipTrigger } from "./components/tooltip/tooltip.component";
@@ -504,58 +504,122 @@ export namespace Components {
504
504
  "status"?: ButtonStatus;
505
505
  }
506
506
  /**
507
- * @description A checkbox component that allows users to select or deselect an option.
508
- * It also supports an indeterminate state.
507
+ * @component BcmCheckbox
508
+ * @description A form-associated checkbox component representing a boolean choice.
509
+ * Integrates with native HTML forms via ElementInternals while supporting
510
+ * **three validation strategies** via `validation-mode`:
511
+ * - **`native`**
512
+ * - Participates in native browser constraint validation.
513
+ * - Sets the underlying input's `required`.
514
+ * - Browser may show native validation bubbles when submit/reportValidity happens.
515
+ * - **`silent`**
516
+ * - Does **not** set native `required` (prevents browser bubble).
517
+ * - Computes "missing required" internally and exposes it via `error` + `caption`.
518
+ * - UI errors are **gated**: shown only after `touched` or a form submit attempt.
519
+ * - **`none`**
520
+ * - Value-only mode: submits value but never becomes invalid.
521
+ * ## UI error gating (silent mode)
522
+ * - `touched` becomes true after first user interaction
523
+ * - `submitAttempted` becomes true when the parent form emits `submit`
524
+ * ## Value behavior
525
+ * - When checked → submits `value` (default: `"on"`).
526
+ * - When unchecked → submits no value (`null`).
527
+ * - When disabled → no submission and no validity participation.
528
+ * ## Shadow Parts
529
+ * - `checkbox` → root container
530
+ * - `control` → visual checkbox box
531
+ * - `icon` → icon container (check or minus)
532
+ * - `label` → label text
533
+ * - `caption` → helper/error text (silent mode UI)
534
+ * - `input` → hidden native input
535
+ * @example Basic usage
536
+ * <bcm-checkbox name="terms" required>
537
+ * I agree to the terms and conditions
538
+ * </bcm-checkbox>
539
+ * @example Silent validation (no native bubble)
540
+ * <form>
541
+ * <bcm-checkbox name="newsletter" required validation-mode="silent">
542
+ * Subscribe to newsletter
543
+ * </bcm-checkbox>
544
+ * <button type="submit">Submit</button>
545
+ * </form>
546
+ * @example Value-only mode
547
+ * <bcm-checkbox name="analytics" validation-mode="none">
548
+ * Allow analytics
549
+ * </bcm-checkbox>
509
550
  */
510
551
  interface BcmCheckbox {
511
552
  /**
512
- * Unique ID for the component. Automatically generated if not specified.
553
+ * Unique ID for the component. Automatically generated if not specified. Used to bind the visible label to the internal input.
513
554
  * @default generateId('bcm-checkbox')
514
555
  */
515
556
  "_id"?: string;
516
557
  /**
517
- * Determines if the checkbox is checked
558
+ * Helper / error caption (silent mode UI)
559
+ */
560
+ "caption"?: string;
561
+ /**
562
+ * Checked state
518
563
  * @default false
519
564
  */
520
565
  "checked": boolean;
521
566
  /**
522
- * Determines if the checkbox is disabled
567
+ * Disabled state
523
568
  * @default false
524
569
  */
525
570
  "disabled": boolean;
526
571
  /**
527
- * Indicates if the checkbox is in an error state. This affects the visual styling of the component.
572
+ * Visual error state. - In `silent` mode this can be managed internally. - In other modes you can set it externally as well.
528
573
  * @default false
529
574
  */
530
575
  "error": boolean;
531
576
  /**
532
- * Full width checkbox
577
+ * Makes checkbox occupy full width (if your styles support it).
533
578
  * @default false
534
579
  */
535
580
  "fullWidth": boolean;
536
581
  /**
537
- * Determines if the checkbox is in an indeterminate state. This is useful when some items in a group of checkboxes are selected and others are not.
582
+ * Indeterminate (mixed) state. Useful when a group selection is partially selected.
538
583
  * @default false
539
584
  */
540
585
  "indeterminate": boolean;
541
586
  /**
542
- * Label text to display next to the checkbox
587
+ * Visible label text (optional). You can also use the default slot.
543
588
  */
544
589
  "label"?: string;
545
590
  /**
546
- * Controls the position of the label relative to the checkbox
591
+ * Label position relative to the checkbox control.
547
592
  * @default 'right'
548
593
  */
549
594
  "labelPosition": 'left' | 'right';
550
595
  /**
551
- * Name attribute for the checkbox when used in a form
596
+ * Form field name
552
597
  */
553
- "name": string;
598
+ "name"?: string;
599
+ /**
600
+ * Optional readonly support
601
+ * @default false
602
+ */
603
+ "readonly": boolean;
604
+ /**
605
+ * Required state
606
+ * @default false
607
+ */
608
+ "required": boolean;
554
609
  /**
555
- * Size variant of the checkbox
610
+ * Size variant (affects control + typography).
556
611
  * @default 'medium'
557
612
  */
558
613
  "size": 'small' | 'medium' | 'large';
614
+ /**
615
+ * @default 'native'
616
+ */
617
+ "validationMode": 'native' | 'silent' | 'none';
618
+ /**
619
+ * Value submitted when checked
620
+ * @default 'on'
621
+ */
622
+ "value": string;
559
623
  }
560
624
  /**
561
625
  * @component BcmChip
@@ -763,6 +827,56 @@ export namespace Components {
763
827
  "selected": boolean;
764
828
  "text": string;
765
829
  }
830
+ interface BcmFileUpload {
831
+ /**
832
+ * @default '.xls,.pdf'
833
+ */
834
+ "accept": string;
835
+ /**
836
+ * @default ''
837
+ */
838
+ "caption"?: string;
839
+ /**
840
+ * Allows consumers to override default error messages.
841
+ */
842
+ "customErrorMessages"?: BcmUploadErrorMessages;
843
+ /**
844
+ * @default false
845
+ */
846
+ "disabled": boolean;
847
+ /**
848
+ * @default ''
849
+ */
850
+ "label": string;
851
+ /**
852
+ * Maximum number of files allowed in total. Only applied when `multiple` is true.
853
+ */
854
+ "maxFileCount"?: number;
855
+ /**
856
+ * @default 2
857
+ */
858
+ "maxSize": number;
859
+ /**
860
+ * @default false
861
+ */
862
+ "multiple": boolean;
863
+ /**
864
+ * @default 'file'
865
+ */
866
+ "name": string;
867
+ /**
868
+ * @default false
869
+ */
870
+ "required": boolean;
871
+ /**
872
+ * @default 'medium'
873
+ */
874
+ "size": 'medium' | 'small';
875
+ /**
876
+ * Reserved for future backend upload integration. Currently does not affect component behavior.
877
+ */
878
+ "uploadUrl"?: string;
879
+ }
766
880
  interface BcmInput {
767
881
  /**
768
882
  * Input id
@@ -1406,6 +1520,10 @@ export namespace Components {
1406
1520
  "trigger": 'click' | 'hover' | 'hover focus';
1407
1521
  }
1408
1522
  interface BcmRadio {
1523
+ /**
1524
+ * @default generateId('bcm-radio')
1525
+ */
1526
+ "_id"?: string;
1409
1527
  /**
1410
1528
  * Whether the radio button is selected.
1411
1529
  * @prop
@@ -1448,6 +1566,11 @@ export namespace Components {
1448
1566
  * @defaultValue false
1449
1567
  */
1450
1568
  "readonly": boolean;
1569
+ /**
1570
+ * Whether at least one radio in this group is required. (HTML)
1571
+ * @default false
1572
+ */
1573
+ "required": boolean;
1451
1574
  /**
1452
1575
  * Defines the size of the radio button: 'small' | 'medium' | 'large'.
1453
1576
  * @prop
@@ -1527,49 +1650,83 @@ export namespace Components {
1527
1650
  */
1528
1651
  "value": string;
1529
1652
  }
1530
- interface BcmSegmentedPicker {
1653
+ /**
1654
+ * Individual segment option component
1655
+ */
1656
+ interface BcmSegment {
1657
+ /**
1658
+ * Index of currently active segment (inherited from parent)
1659
+ * @default 0
1660
+ */
1661
+ "activeIndex": number;
1531
1662
  /**
1532
1663
  * Disabled state
1533
1664
  * @default false
1534
1665
  */
1535
1666
  "disabled": boolean;
1536
1667
  /**
1537
- * Full width component
1668
+ * Index of this segment (inherited from parent)
1669
+ * @default 0
1670
+ */
1671
+ "index": number;
1672
+ /**
1673
+ * Selected state (controlled by parent)
1538
1674
  * @default false
1539
1675
  */
1540
- "fullWidth": boolean;
1676
+ "selected": boolean;
1541
1677
  /**
1542
- * Controls the component size
1678
+ * Size variant (inherited from parent)
1543
1679
  * @default 'medium'
1544
1680
  */
1545
- "size": SegmentedPickerSize;
1681
+ "size": 'small' | 'medium' | 'large';
1546
1682
  /**
1547
- * The selected option value
1683
+ * Unique identifier for this segment
1548
1684
  */
1549
- "value"?: string;
1685
+ "value": string;
1550
1686
  }
1551
- interface BcmSegmentedPickerOption {
1687
+ /**
1688
+ * Modern Segmented Picker component with CSS Grid-based indicator
1689
+ */
1690
+ interface BcmSegmentedPicker {
1552
1691
  /**
1553
- * Whether this option is disabled
1692
+ * Disabled state
1554
1693
  * @default false
1555
1694
  */
1556
1695
  "disabled": boolean;
1557
- "getWidth": () => Promise<number>;
1558
1696
  /**
1559
- * Option display label
1697
+ * Full width flag
1698
+ * @default false
1560
1699
  */
1561
- "label"?: string;
1700
+ "fullWidth": boolean;
1562
1701
  /**
1563
- * Whether this option is selected
1702
+ * Public method to get active segment value
1703
+ */
1704
+ "getValue": () => Promise<string>;
1705
+ /**
1706
+ * Name attribute for form association
1707
+ */
1708
+ "name": string;
1709
+ /**
1710
+ * Whether this field is required in a form
1564
1711
  * @default false
1565
1712
  */
1566
- "selected": boolean;
1713
+ "required": boolean;
1714
+ /**
1715
+ * Public method to programmatically set active segment
1716
+ */
1717
+ "setValue": (value: string) => Promise<void>;
1567
1718
  /**
1568
- * Controls the option size
1719
+ * Enable shadow on container
1720
+ * @default false
1569
1721
  */
1570
- "size"?: SegmentedPickerSize;
1722
+ "shadow": boolean;
1571
1723
  /**
1572
- * Option value
1724
+ * Size variant
1725
+ * @default 'medium'
1726
+ */
1727
+ "size": 'small' | 'medium' | 'large';
1728
+ /**
1729
+ * Selected segment value
1573
1730
  */
1574
1731
  "value": string;
1575
1732
  }
@@ -1582,50 +1739,79 @@ export namespace Components {
1582
1739
  }
1583
1740
  /**
1584
1741
  * @component BcmSwitch
1585
- * @description A customizable toggle switch component that provides an intuitive way to enable or disable options.
1586
- * Supports different sizes, label positions, error states, and accessibility features.
1742
+ * @description A form-associated toggle switch component representing a boolean choice.
1743
+ * It behaves like a checkbox and integrates with native HTML forms via ElementInternals.
1744
+ * This component supports **three validation strategies** via `validation-mode`:
1745
+ * - **`native`**:
1746
+ * - Uses native browser constraint validation.
1747
+ * - Sets the underlying input's `required` attribute.
1748
+ * - Browser may show the native validation bubble when the form calls `reportValidity()` / submit validation runs.
1749
+ * - **`silent`**:
1750
+ * - Does **not** rely on native `required` (prevents the browser bubble).
1751
+ * - Computes the "missing required" state internally and exposes it via `error` + `caption`.
1752
+ * - UI errors are **gated**: they appear only after the control is touched or after a submit attempt.
1753
+ * - **`none`**:
1754
+ * - Value-only mode (headless): participates in form value submission but never becomes invalid.
1755
+ * ## UI error gating (silent mode)
1756
+ * To avoid showing errors on initial render, the component tracks:
1757
+ * - `touched`: set after the first user interaction
1758
+ * - `submitAttempted`: set when the parent form emits `submit`
1759
+ * Only when `touched || submitAttempted` the component will show `error/caption` in `silent` mode.
1760
+ * ## Value behavior
1761
+ * - When checked, the component submits its `value` (default: `"on"`).
1762
+ * - When unchecked, no value is submitted.
1763
+ * - When disabled, the component does not participate in submission or validity.
1587
1764
  * @example Basic usage
1588
- * <bcm-switch label="Enable notifications"></bcm-switch>
1589
- * @example With error state
1765
+ * <bcm-switch name="newsletter" label="Receive newsletter?" />
1766
+ * @example Required with silent validation (no native bubble)
1767
+ * <form>
1590
1768
  * <bcm-switch
1769
+ * name="terms"
1591
1770
  * label="Accept terms"
1592
- * error={true}
1593
- * caption="You must accept the terms to continue">
1594
- * </bcm-switch>
1595
- * @example Disabled state
1596
- * <bcm-switch
1597
- * label="Advanced features"
1598
- * disabled={true}>
1599
- * </bcm-switch>
1600
- * @example With custom size and label position
1601
- * <bcm-switch
1602
- * label="Dark mode"
1603
- * size="large"
1604
- * labelPosition="left">
1771
+ * required
1772
+ * validation-mode="silent">
1605
1773
  * </bcm-switch>
1774
+ * <button type="submit">Submit</button>
1775
+ * </form>
1776
+ * @example Native validation mode (may show native bubble)
1777
+ * <bcm-switch name="terms" label="Accept terms" required validation-mode="native" />
1778
+ * @example Value-only mode (no validation)
1779
+ * <bcm-switch name="analytics" label="Allow analytics" validation-mode="none" />
1780
+ * @csspart base - Root container
1781
+ * @csspart switch-wrapper - Wrapper containing label + track
1782
+ * @csspart input - Hidden native input
1783
+ * @csspart label - Text label
1784
+ * @csspart dot-container - Switch track
1785
+ * @csspart dot - Switch knob
1786
+ * @csspart caption - Helper/error text
1606
1787
  */
1607
1788
  interface BcmSwitch {
1608
1789
  /**
1609
- * Text to display as an error message when error is true
1790
+ * Unique id (optional). Generated by default.
1791
+ * @default generateId('bcm-switch')
1792
+ */
1793
+ "_id"?: string;
1794
+ /**
1795
+ * Helper / error text shown under the switch
1610
1796
  */
1611
1797
  "caption"?: string;
1612
1798
  /**
1613
- * Whether the switch is checked or not
1799
+ * Checked state
1614
1800
  * @default false
1615
1801
  */
1616
1802
  "checked": boolean;
1617
1803
  /**
1618
- * Whether the switch is disabled
1804
+ * Disabled state
1619
1805
  * @default false
1620
1806
  */
1621
1807
  "disabled": boolean;
1622
1808
  /**
1623
- * Whether to display the switch in an error state
1809
+ * Visual error state (manual/external). In silent mode this can be auto-managed.
1624
1810
  * @default false
1625
1811
  */
1626
1812
  "error": boolean;
1627
1813
  /**
1628
- * Text label for the switch
1814
+ * Visible label text
1629
1815
  */
1630
1816
  "label": string;
1631
1817
  /**
@@ -1634,128 +1820,93 @@ export namespace Components {
1634
1820
  */
1635
1821
  "labelPosition": 'left' | 'right';
1636
1822
  /**
1637
- * The name attribute for the hidden input element
1823
+ * Form field name
1638
1824
  */
1639
- "name": string;
1825
+ "name"?: string;
1640
1826
  /**
1641
- * Whether the switch is in readonly mode
1827
+ * Optional readonly support
1642
1828
  * @default false
1643
1829
  */
1644
1830
  "readonly": boolean;
1645
1831
  /**
1646
- * Whether the switch is required in a form
1832
+ * Required state
1647
1833
  * @default false
1648
1834
  */
1649
1835
  "required": boolean;
1650
1836
  /**
1651
- * Size variant of the switch
1837
+ * Size variant
1652
1838
  * @default 'medium'
1653
1839
  */
1654
1840
  "size": 'small' | 'medium' | 'large';
1655
1841
  /**
1656
- * The value attribute for the hidden input element
1842
+ * @default 'native'
1843
+ */
1844
+ "validationMode": 'native' | 'silent' | 'none';
1845
+ /**
1846
+ * Value submitted when checked
1847
+ * @default 'on'
1657
1848
  */
1658
1849
  "value": string;
1659
1850
  }
1660
1851
  /**
1661
- * @description Tab interface component
1852
+ * Individual tab component - self-contained with label and content panel
1662
1853
  */
1663
- interface BcmTabs {
1664
- /**
1665
- * Default active tab value
1666
- */
1667
- "defaultValue": string;
1668
- /**
1669
- * Disables all tabs
1670
- */
1671
- "disableAllTabs": () => Promise<void>;
1672
- "disableTab": (value: string) => Promise<void>;
1673
- /**
1674
- * Enables all tabs
1675
- */
1676
- "enableAllTabs": () => Promise<void>;
1677
- "enableTab": (value: string) => Promise<void>;
1678
- /**
1679
- * Returns the active tab value
1680
- */
1681
- "getActiveTab": () => Promise<string>;
1854
+ interface BcmTab {
1682
1855
  /**
1683
- * Sets the active tab
1856
+ * Active state (controlled by parent)
1857
+ * @default false
1684
1858
  */
1685
- "setActiveTab": (value: string) => Promise<void>;
1859
+ "active": boolean;
1686
1860
  /**
1687
- * Tab size
1688
- * @default 'medium'
1861
+ * Disabled state
1862
+ * @default false
1689
1863
  */
1690
- "size": 'small' | 'medium' | 'large';
1864
+ "disabled": boolean;
1691
1865
  /**
1692
- * Whether to enable smooth animations for inkbar and transitions
1693
- * @default true
1866
+ * Label text to display in tab button
1694
1867
  */
1695
- "smooth": boolean;
1868
+ "label": string;
1696
1869
  /**
1697
- * Tab variant - controls width behavior
1698
- * @default 'full-width'
1870
+ * Size variant (inherited from parent)
1871
+ * @default 'md'
1699
1872
  */
1700
- "variant": 'full-width' | 'auto-width';
1701
- }
1702
- /**
1703
- * @description Tab content panel component that displays when its corresponding tab is selected
1704
- */
1705
- interface BcmTabsContent {
1873
+ "size": 'sm' | 'md' | 'lg';
1706
1874
  /**
1707
- * Unique identifier that matches a tab trigger's value Used to associate this content with its corresponding tab
1875
+ * Unique identifier for this tab
1708
1876
  */
1709
1877
  "value": string;
1710
1878
  }
1711
1879
  /**
1712
- * @description Container component for tab triggers that includes the sliding indicator (inkbar)
1880
+ * Modern Tabs component with CSS-first approach
1713
1881
  */
1714
- interface BcmTabsList {
1882
+ interface BcmTabs {
1715
1883
  /**
1716
- * Whether to enable smooth animations for inkbar and transitions
1717
- * @default true
1884
+ * Public method to get active tab value
1718
1885
  */
1719
- "smooth": boolean;
1886
+ "getActiveTab": () => Promise<string>;
1720
1887
  /**
1721
- * Tab variant - controls width behavior
1722
- * @default 'full-width'
1888
+ * Public method to programmatically set active tab
1723
1889
  */
1724
- "variant": 'full-width' | 'auto-width';
1725
- }
1726
- /**
1727
- * @description Tab trigger component that functions as a clickable tab button
1728
- */
1729
- interface BcmTabsTrigger {
1890
+ "setActiveTab": (value: string) => Promise<void>;
1730
1891
  /**
1731
- * Whether the tab is currently active
1892
+ * Enable shadow on main container
1732
1893
  * @default false
1733
1894
  */
1734
- "active": boolean;
1895
+ "shadow": boolean;
1735
1896
  /**
1736
- * Whether the tab is disabled
1737
- * @default false
1897
+ * Tab size variant
1898
+ * @default 'md'
1738
1899
  */
1739
- "disabled": boolean;
1900
+ "size": 'sm' | 'md' | 'lg';
1740
1901
  /**
1741
- * Size of the tab
1742
- * @default 'medium'
1743
- */
1744
- "size": 'small' | 'medium' | 'large';
1745
- /**
1746
- * Whether to enable smooth animations for transitions
1747
- * @default true
1748
- */
1749
- "smooth": boolean;
1750
- /**
1751
- * Unique identifier value for the tab
1902
+ * Active tab value
1752
1903
  */
1753
1904
  "value": string;
1754
1905
  /**
1755
- * Tab variant - controls width behavior
1756
- * @default 'full-width'
1906
+ * Visual variant
1907
+ * @default 'line'
1757
1908
  */
1758
- "variant": 'full-width' | 'auto-width';
1909
+ "variant": 'line' | 'enclosed';
1759
1910
  }
1760
1911
  interface BcmText {
1761
1912
  /**
@@ -2042,6 +2193,10 @@ export interface BcmDropdownItemCustomEvent<T> extends CustomEvent<T> {
2042
2193
  detail: T;
2043
2194
  target: HTMLBcmDropdownItemElement;
2044
2195
  }
2196
+ export interface BcmFileUploadCustomEvent<T> extends CustomEvent<T> {
2197
+ detail: T;
2198
+ target: HTMLBcmFileUploadElement;
2199
+ }
2045
2200
  export interface BcmInputCustomEvent<T> extends CustomEvent<T> {
2046
2201
  detail: T;
2047
2202
  target: HTMLBcmInputElement;
@@ -2070,25 +2225,25 @@ export interface BcmRadioGroupCustomEvent<T> extends CustomEvent<T> {
2070
2225
  detail: T;
2071
2226
  target: HTMLBcmRadioGroupElement;
2072
2227
  }
2073
- export interface BcmSegmentedPickerCustomEvent<T> extends CustomEvent<T> {
2228
+ export interface BcmSegmentCustomEvent<T> extends CustomEvent<T> {
2074
2229
  detail: T;
2075
- target: HTMLBcmSegmentedPickerElement;
2230
+ target: HTMLBcmSegmentElement;
2076
2231
  }
2077
- export interface BcmSegmentedPickerOptionCustomEvent<T> extends CustomEvent<T> {
2232
+ export interface BcmSegmentedPickerCustomEvent<T> extends CustomEvent<T> {
2078
2233
  detail: T;
2079
- target: HTMLBcmSegmentedPickerOptionElement;
2234
+ target: HTMLBcmSegmentedPickerElement;
2080
2235
  }
2081
2236
  export interface BcmSwitchCustomEvent<T> extends CustomEvent<T> {
2082
2237
  detail: T;
2083
2238
  target: HTMLBcmSwitchElement;
2084
2239
  }
2085
- export interface BcmTabsCustomEvent<T> extends CustomEvent<T> {
2240
+ export interface BcmTabCustomEvent<T> extends CustomEvent<T> {
2086
2241
  detail: T;
2087
- target: HTMLBcmTabsElement;
2242
+ target: HTMLBcmTabElement;
2088
2243
  }
2089
- export interface BcmTabsTriggerCustomEvent<T> extends CustomEvent<T> {
2244
+ export interface BcmTabsCustomEvent<T> extends CustomEvent<T> {
2090
2245
  detail: T;
2091
- target: HTMLBcmTabsTriggerElement;
2246
+ target: HTMLBcmTabsElement;
2092
2247
  }
2093
2248
  export interface BcmTextareaCustomEvent<T> extends CustomEvent<T> {
2094
2249
  detail: T;
@@ -2317,11 +2472,52 @@ declare global {
2317
2472
  new (): HTMLBcmButtonGroupElement;
2318
2473
  };
2319
2474
  interface HTMLBcmCheckboxElementEventMap {
2320
- "bcmCheckboxChange": { element: any; checked: boolean };
2475
+ "bcmCheckboxChange": { element: HTMLInputElement; checked: boolean };
2321
2476
  }
2322
2477
  /**
2323
- * @description A checkbox component that allows users to select or deselect an option.
2324
- * It also supports an indeterminate state.
2478
+ * @component BcmCheckbox
2479
+ * @description A form-associated checkbox component representing a boolean choice.
2480
+ * Integrates with native HTML forms via ElementInternals while supporting
2481
+ * **three validation strategies** via `validation-mode`:
2482
+ * - **`native`**
2483
+ * - Participates in native browser constraint validation.
2484
+ * - Sets the underlying input's `required`.
2485
+ * - Browser may show native validation bubbles when submit/reportValidity happens.
2486
+ * - **`silent`**
2487
+ * - Does **not** set native `required` (prevents browser bubble).
2488
+ * - Computes "missing required" internally and exposes it via `error` + `caption`.
2489
+ * - UI errors are **gated**: shown only after `touched` or a form submit attempt.
2490
+ * - **`none`**
2491
+ * - Value-only mode: submits value but never becomes invalid.
2492
+ * ## UI error gating (silent mode)
2493
+ * - `touched` becomes true after first user interaction
2494
+ * - `submitAttempted` becomes true when the parent form emits `submit`
2495
+ * ## Value behavior
2496
+ * - When checked → submits `value` (default: `"on"`).
2497
+ * - When unchecked → submits no value (`null`).
2498
+ * - When disabled → no submission and no validity participation.
2499
+ * ## Shadow Parts
2500
+ * - `checkbox` → root container
2501
+ * - `control` → visual checkbox box
2502
+ * - `icon` → icon container (check or minus)
2503
+ * - `label` → label text
2504
+ * - `caption` → helper/error text (silent mode UI)
2505
+ * - `input` → hidden native input
2506
+ * @example Basic usage
2507
+ * <bcm-checkbox name="terms" required>
2508
+ * I agree to the terms and conditions
2509
+ * </bcm-checkbox>
2510
+ * @example Silent validation (no native bubble)
2511
+ * <form>
2512
+ * <bcm-checkbox name="newsletter" required validation-mode="silent">
2513
+ * Subscribe to newsletter
2514
+ * </bcm-checkbox>
2515
+ * <button type="submit">Submit</button>
2516
+ * </form>
2517
+ * @example Value-only mode
2518
+ * <bcm-checkbox name="analytics" validation-mode="none">
2519
+ * Allow analytics
2520
+ * </bcm-checkbox>
2325
2521
  */
2326
2522
  interface HTMLBcmCheckboxElement extends Components.BcmCheckbox, HTMLStencilElement {
2327
2523
  addEventListener<K extends keyof HTMLBcmCheckboxElementEventMap>(type: K, listener: (this: HTMLBcmCheckboxElement, ev: BcmCheckboxCustomEvent<HTMLBcmCheckboxElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
@@ -2473,6 +2669,27 @@ declare global {
2473
2669
  prototype: HTMLBcmDropdownItemElement;
2474
2670
  new (): HTMLBcmDropdownItemElement;
2475
2671
  };
2672
+ interface HTMLBcmFileUploadElementEventMap {
2673
+ "bcmFileChange": File[];
2674
+ "bcmFileRemoved": BcmUploadItem;
2675
+ "bcmUploadCanceled": BcmUploadItem;
2676
+ "bcmFocus": FocusEvent;
2677
+ "bcmBlur": FocusEvent;
2678
+ }
2679
+ interface HTMLBcmFileUploadElement extends Components.BcmFileUpload, HTMLStencilElement {
2680
+ addEventListener<K extends keyof HTMLBcmFileUploadElementEventMap>(type: K, listener: (this: HTMLBcmFileUploadElement, ev: BcmFileUploadCustomEvent<HTMLBcmFileUploadElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2681
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2682
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2683
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2684
+ removeEventListener<K extends keyof HTMLBcmFileUploadElementEventMap>(type: K, listener: (this: HTMLBcmFileUploadElement, ev: BcmFileUploadCustomEvent<HTMLBcmFileUploadElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2685
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2686
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2687
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2688
+ }
2689
+ var HTMLBcmFileUploadElement: {
2690
+ prototype: HTMLBcmFileUploadElement;
2691
+ new (): HTMLBcmFileUploadElement;
2692
+ };
2476
2693
  interface HTMLBcmInputElementEventMap {
2477
2694
  "bcmInput": InputEvent;
2478
2695
  "bcmChange": Event;
@@ -2846,39 +3063,45 @@ declare global {
2846
3063
  prototype: HTMLBcmRadioGroupElement;
2847
3064
  new (): HTMLBcmRadioGroupElement;
2848
3065
  };
2849
- interface HTMLBcmSegmentedPickerElementEventMap {
2850
- "bcmChange": { value: string };
3066
+ interface HTMLBcmSegmentElementEventMap {
3067
+ "bcmSegmentClick": string;
2851
3068
  }
2852
- interface HTMLBcmSegmentedPickerElement extends Components.BcmSegmentedPicker, HTMLStencilElement {
2853
- addEventListener<K extends keyof HTMLBcmSegmentedPickerElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerElement, ev: BcmSegmentedPickerCustomEvent<HTMLBcmSegmentedPickerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3069
+ /**
3070
+ * Individual segment option component
3071
+ */
3072
+ interface HTMLBcmSegmentElement extends Components.BcmSegment, HTMLStencilElement {
3073
+ addEventListener<K extends keyof HTMLBcmSegmentElementEventMap>(type: K, listener: (this: HTMLBcmSegmentElement, ev: BcmSegmentCustomEvent<HTMLBcmSegmentElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2854
3074
  addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2855
3075
  addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2856
3076
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2857
- removeEventListener<K extends keyof HTMLBcmSegmentedPickerElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerElement, ev: BcmSegmentedPickerCustomEvent<HTMLBcmSegmentedPickerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3077
+ removeEventListener<K extends keyof HTMLBcmSegmentElementEventMap>(type: K, listener: (this: HTMLBcmSegmentElement, ev: BcmSegmentCustomEvent<HTMLBcmSegmentElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2858
3078
  removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2859
3079
  removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2860
3080
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2861
3081
  }
2862
- var HTMLBcmSegmentedPickerElement: {
2863
- prototype: HTMLBcmSegmentedPickerElement;
2864
- new (): HTMLBcmSegmentedPickerElement;
3082
+ var HTMLBcmSegmentElement: {
3083
+ prototype: HTMLBcmSegmentElement;
3084
+ new (): HTMLBcmSegmentElement;
2865
3085
  };
2866
- interface HTMLBcmSegmentedPickerOptionElementEventMap {
2867
- "bcmOptionClick": string;
3086
+ interface HTMLBcmSegmentedPickerElementEventMap {
3087
+ "bcmSegmentChange": { value: string; previousValue: string };
2868
3088
  }
2869
- interface HTMLBcmSegmentedPickerOptionElement extends Components.BcmSegmentedPickerOption, HTMLStencilElement {
2870
- addEventListener<K extends keyof HTMLBcmSegmentedPickerOptionElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerOptionElement, ev: BcmSegmentedPickerOptionCustomEvent<HTMLBcmSegmentedPickerOptionElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3089
+ /**
3090
+ * Modern Segmented Picker component with CSS Grid-based indicator
3091
+ */
3092
+ interface HTMLBcmSegmentedPickerElement extends Components.BcmSegmentedPicker, HTMLStencilElement {
3093
+ addEventListener<K extends keyof HTMLBcmSegmentedPickerElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerElement, ev: BcmSegmentedPickerCustomEvent<HTMLBcmSegmentedPickerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2871
3094
  addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2872
3095
  addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2873
3096
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2874
- removeEventListener<K extends keyof HTMLBcmSegmentedPickerOptionElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerOptionElement, ev: BcmSegmentedPickerOptionCustomEvent<HTMLBcmSegmentedPickerOptionElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3097
+ removeEventListener<K extends keyof HTMLBcmSegmentedPickerElementEventMap>(type: K, listener: (this: HTMLBcmSegmentedPickerElement, ev: BcmSegmentedPickerCustomEvent<HTMLBcmSegmentedPickerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2875
3098
  removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2876
3099
  removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2877
3100
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2878
3101
  }
2879
- var HTMLBcmSegmentedPickerOptionElement: {
2880
- prototype: HTMLBcmSegmentedPickerOptionElement;
2881
- new (): HTMLBcmSegmentedPickerOptionElement;
3102
+ var HTMLBcmSegmentedPickerElement: {
3103
+ prototype: HTMLBcmSegmentedPickerElement;
3104
+ new (): HTMLBcmSegmentedPickerElement;
2882
3105
  };
2883
3106
  interface HTMLBcmShortcutElement extends Components.BcmShortcut, HTMLStencilElement {
2884
3107
  }
@@ -2891,27 +3114,51 @@ declare global {
2891
3114
  }
2892
3115
  /**
2893
3116
  * @component BcmSwitch
2894
- * @description A customizable toggle switch component that provides an intuitive way to enable or disable options.
2895
- * Supports different sizes, label positions, error states, and accessibility features.
3117
+ * @description A form-associated toggle switch component representing a boolean choice.
3118
+ * It behaves like a checkbox and integrates with native HTML forms via ElementInternals.
3119
+ * This component supports **three validation strategies** via `validation-mode`:
3120
+ * - **`native`**:
3121
+ * - Uses native browser constraint validation.
3122
+ * - Sets the underlying input's `required` attribute.
3123
+ * - Browser may show the native validation bubble when the form calls `reportValidity()` / submit validation runs.
3124
+ * - **`silent`**:
3125
+ * - Does **not** rely on native `required` (prevents the browser bubble).
3126
+ * - Computes the "missing required" state internally and exposes it via `error` + `caption`.
3127
+ * - UI errors are **gated**: they appear only after the control is touched or after a submit attempt.
3128
+ * - **`none`**:
3129
+ * - Value-only mode (headless): participates in form value submission but never becomes invalid.
3130
+ * ## UI error gating (silent mode)
3131
+ * To avoid showing errors on initial render, the component tracks:
3132
+ * - `touched`: set after the first user interaction
3133
+ * - `submitAttempted`: set when the parent form emits `submit`
3134
+ * Only when `touched || submitAttempted` the component will show `error/caption` in `silent` mode.
3135
+ * ## Value behavior
3136
+ * - When checked, the component submits its `value` (default: `"on"`).
3137
+ * - When unchecked, no value is submitted.
3138
+ * - When disabled, the component does not participate in submission or validity.
2896
3139
  * @example Basic usage
2897
- * <bcm-switch label="Enable notifications"></bcm-switch>
2898
- * @example With error state
3140
+ * <bcm-switch name="newsletter" label="Receive newsletter?" />
3141
+ * @example Required with silent validation (no native bubble)
3142
+ * <form>
2899
3143
  * <bcm-switch
3144
+ * name="terms"
2900
3145
  * label="Accept terms"
2901
- * error={true}
2902
- * caption="You must accept the terms to continue">
2903
- * </bcm-switch>
2904
- * @example Disabled state
2905
- * <bcm-switch
2906
- * label="Advanced features"
2907
- * disabled={true}>
2908
- * </bcm-switch>
2909
- * @example With custom size and label position
2910
- * <bcm-switch
2911
- * label="Dark mode"
2912
- * size="large"
2913
- * labelPosition="left">
3146
+ * required
3147
+ * validation-mode="silent">
2914
3148
  * </bcm-switch>
3149
+ * <button type="submit">Submit</button>
3150
+ * </form>
3151
+ * @example Native validation mode (may show native bubble)
3152
+ * <bcm-switch name="terms" label="Accept terms" required validation-mode="native" />
3153
+ * @example Value-only mode (no validation)
3154
+ * <bcm-switch name="analytics" label="Allow analytics" validation-mode="none" />
3155
+ * @csspart base - Root container
3156
+ * @csspart switch-wrapper - Wrapper containing label + track
3157
+ * @csspart input - Hidden native input
3158
+ * @csspart label - Text label
3159
+ * @csspart dot-container - Switch track
3160
+ * @csspart dot - Switch knob
3161
+ * @csspart caption - Helper/error text
2915
3162
  */
2916
3163
  interface HTMLBcmSwitchElement extends Components.BcmSwitch, HTMLStencilElement {
2917
3164
  addEventListener<K extends keyof HTMLBcmSwitchElementEventMap>(type: K, listener: (this: HTMLBcmSwitchElement, ev: BcmSwitchCustomEvent<HTMLBcmSwitchElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
@@ -2927,67 +3174,48 @@ declare global {
2927
3174
  prototype: HTMLBcmSwitchElement;
2928
3175
  new (): HTMLBcmSwitchElement;
2929
3176
  };
2930
- interface HTMLBcmTabsElementEventMap {
2931
- "bcmTabChange": {
2932
- activeTab: string;
2933
- element: HTMLBcmTabsTriggerElement;
2934
- previousTab?: string;
2935
- };
3177
+ interface HTMLBcmTabElementEventMap {
3178
+ "bcmTabClick": string;
2936
3179
  }
2937
3180
  /**
2938
- * @description Tab interface component
3181
+ * Individual tab component - self-contained with label and content panel
2939
3182
  */
2940
- interface HTMLBcmTabsElement extends Components.BcmTabs, HTMLStencilElement {
2941
- addEventListener<K extends keyof HTMLBcmTabsElementEventMap>(type: K, listener: (this: HTMLBcmTabsElement, ev: BcmTabsCustomEvent<HTMLBcmTabsElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3183
+ interface HTMLBcmTabElement extends Components.BcmTab, HTMLStencilElement {
3184
+ addEventListener<K extends keyof HTMLBcmTabElementEventMap>(type: K, listener: (this: HTMLBcmTabElement, ev: BcmTabCustomEvent<HTMLBcmTabElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2942
3185
  addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2943
3186
  addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2944
3187
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2945
- removeEventListener<K extends keyof HTMLBcmTabsElementEventMap>(type: K, listener: (this: HTMLBcmTabsElement, ev: BcmTabsCustomEvent<HTMLBcmTabsElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3188
+ removeEventListener<K extends keyof HTMLBcmTabElementEventMap>(type: K, listener: (this: HTMLBcmTabElement, ev: BcmTabCustomEvent<HTMLBcmTabElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2946
3189
  removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2947
3190
  removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2948
3191
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2949
3192
  }
2950
- var HTMLBcmTabsElement: {
2951
- prototype: HTMLBcmTabsElement;
2952
- new (): HTMLBcmTabsElement;
2953
- };
2954
- /**
2955
- * @description Tab content panel component that displays when its corresponding tab is selected
2956
- */
2957
- interface HTMLBcmTabsContentElement extends Components.BcmTabsContent, HTMLStencilElement {
2958
- }
2959
- var HTMLBcmTabsContentElement: {
2960
- prototype: HTMLBcmTabsContentElement;
2961
- new (): HTMLBcmTabsContentElement;
2962
- };
2963
- /**
2964
- * @description Container component for tab triggers that includes the sliding indicator (inkbar)
2965
- */
2966
- interface HTMLBcmTabsListElement extends Components.BcmTabsList, HTMLStencilElement {
2967
- }
2968
- var HTMLBcmTabsListElement: {
2969
- prototype: HTMLBcmTabsListElement;
2970
- new (): HTMLBcmTabsListElement;
3193
+ var HTMLBcmTabElement: {
3194
+ prototype: HTMLBcmTabElement;
3195
+ new (): HTMLBcmTabElement;
2971
3196
  };
2972
- interface HTMLBcmTabsTriggerElementEventMap {
2973
- "bcmTabSelected": string;
3197
+ interface HTMLBcmTabsElementEventMap {
3198
+ "bcmTabChange": {
3199
+ value: string;
3200
+ previousValue: string;
3201
+ };
2974
3202
  }
2975
3203
  /**
2976
- * @description Tab trigger component that functions as a clickable tab button
3204
+ * Modern Tabs component with CSS-first approach
2977
3205
  */
2978
- interface HTMLBcmTabsTriggerElement extends Components.BcmTabsTrigger, HTMLStencilElement {
2979
- addEventListener<K extends keyof HTMLBcmTabsTriggerElementEventMap>(type: K, listener: (this: HTMLBcmTabsTriggerElement, ev: BcmTabsTriggerCustomEvent<HTMLBcmTabsTriggerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
3206
+ interface HTMLBcmTabsElement extends Components.BcmTabs, HTMLStencilElement {
3207
+ addEventListener<K extends keyof HTMLBcmTabsElementEventMap>(type: K, listener: (this: HTMLBcmTabsElement, ev: BcmTabsCustomEvent<HTMLBcmTabsElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2980
3208
  addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2981
3209
  addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2982
3210
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2983
- removeEventListener<K extends keyof HTMLBcmTabsTriggerElementEventMap>(type: K, listener: (this: HTMLBcmTabsTriggerElement, ev: BcmTabsTriggerCustomEvent<HTMLBcmTabsTriggerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
3211
+ removeEventListener<K extends keyof HTMLBcmTabsElementEventMap>(type: K, listener: (this: HTMLBcmTabsElement, ev: BcmTabsCustomEvent<HTMLBcmTabsElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2984
3212
  removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2985
3213
  removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2986
3214
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2987
3215
  }
2988
- var HTMLBcmTabsTriggerElement: {
2989
- prototype: HTMLBcmTabsTriggerElement;
2990
- new (): HTMLBcmTabsTriggerElement;
3216
+ var HTMLBcmTabsElement: {
3217
+ prototype: HTMLBcmTabsElement;
3218
+ new (): HTMLBcmTabsElement;
2991
3219
  };
2992
3220
  interface HTMLBcmTextElement extends Components.BcmText, HTMLStencilElement {
2993
3221
  }
@@ -3085,6 +3313,7 @@ declare global {
3085
3313
  "bcm-drawer": HTMLBcmDrawerElement;
3086
3314
  "bcm-dropdown": HTMLBcmDropdownElement;
3087
3315
  "bcm-dropdown-item": HTMLBcmDropdownItemElement;
3316
+ "bcm-file-upload": HTMLBcmFileUploadElement;
3088
3317
  "bcm-input": HTMLBcmInputElement;
3089
3318
  "bcm-linked": HTMLBcmLinkedElement;
3090
3319
  "bcm-modal": HTMLBcmModalElement;
@@ -3092,14 +3321,12 @@ declare global {
3092
3321
  "bcm-popover": HTMLBcmPopoverElement;
3093
3322
  "bcm-radio": HTMLBcmRadioElement;
3094
3323
  "bcm-radio-group": HTMLBcmRadioGroupElement;
3324
+ "bcm-segment": HTMLBcmSegmentElement;
3095
3325
  "bcm-segmented-picker": HTMLBcmSegmentedPickerElement;
3096
- "bcm-segmented-picker-option": HTMLBcmSegmentedPickerOptionElement;
3097
3326
  "bcm-shortcut": HTMLBcmShortcutElement;
3098
3327
  "bcm-switch": HTMLBcmSwitchElement;
3328
+ "bcm-tab": HTMLBcmTabElement;
3099
3329
  "bcm-tabs": HTMLBcmTabsElement;
3100
- "bcm-tabs-content": HTMLBcmTabsContentElement;
3101
- "bcm-tabs-list": HTMLBcmTabsListElement;
3102
- "bcm-tabs-trigger": HTMLBcmTabsTriggerElement;
3103
3330
  "bcm-text": HTMLBcmTextElement;
3104
3331
  "bcm-textarea": HTMLBcmTextareaElement;
3105
3332
  "bcm-tooltip": HTMLBcmTooltipElement;
@@ -3553,62 +3780,126 @@ declare namespace LocalJSX {
3553
3780
  "status"?: ButtonStatus;
3554
3781
  }
3555
3782
  /**
3556
- * @description A checkbox component that allows users to select or deselect an option.
3557
- * It also supports an indeterminate state.
3783
+ * @component BcmCheckbox
3784
+ * @description A form-associated checkbox component representing a boolean choice.
3785
+ * Integrates with native HTML forms via ElementInternals while supporting
3786
+ * **three validation strategies** via `validation-mode`:
3787
+ * - **`native`**
3788
+ * - Participates in native browser constraint validation.
3789
+ * - Sets the underlying input's `required`.
3790
+ * - Browser may show native validation bubbles when submit/reportValidity happens.
3791
+ * - **`silent`**
3792
+ * - Does **not** set native `required` (prevents browser bubble).
3793
+ * - Computes "missing required" internally and exposes it via `error` + `caption`.
3794
+ * - UI errors are **gated**: shown only after `touched` or a form submit attempt.
3795
+ * - **`none`**
3796
+ * - Value-only mode: submits value but never becomes invalid.
3797
+ * ## UI error gating (silent mode)
3798
+ * - `touched` becomes true after first user interaction
3799
+ * - `submitAttempted` becomes true when the parent form emits `submit`
3800
+ * ## Value behavior
3801
+ * - When checked → submits `value` (default: `"on"`).
3802
+ * - When unchecked → submits no value (`null`).
3803
+ * - When disabled → no submission and no validity participation.
3804
+ * ## Shadow Parts
3805
+ * - `checkbox` → root container
3806
+ * - `control` → visual checkbox box
3807
+ * - `icon` → icon container (check or minus)
3808
+ * - `label` → label text
3809
+ * - `caption` → helper/error text (silent mode UI)
3810
+ * - `input` → hidden native input
3811
+ * @example Basic usage
3812
+ * <bcm-checkbox name="terms" required>
3813
+ * I agree to the terms and conditions
3814
+ * </bcm-checkbox>
3815
+ * @example Silent validation (no native bubble)
3816
+ * <form>
3817
+ * <bcm-checkbox name="newsletter" required validation-mode="silent">
3818
+ * Subscribe to newsletter
3819
+ * </bcm-checkbox>
3820
+ * <button type="submit">Submit</button>
3821
+ * </form>
3822
+ * @example Value-only mode
3823
+ * <bcm-checkbox name="analytics" validation-mode="none">
3824
+ * Allow analytics
3825
+ * </bcm-checkbox>
3558
3826
  */
3559
3827
  interface BcmCheckbox {
3560
3828
  /**
3561
- * Unique ID for the component. Automatically generated if not specified.
3829
+ * Unique ID for the component. Automatically generated if not specified. Used to bind the visible label to the internal input.
3562
3830
  * @default generateId('bcm-checkbox')
3563
3831
  */
3564
3832
  "_id"?: string;
3565
3833
  /**
3566
- * Determines if the checkbox is checked
3834
+ * Helper / error caption (silent mode UI)
3835
+ */
3836
+ "caption"?: string;
3837
+ /**
3838
+ * Checked state
3567
3839
  * @default false
3568
3840
  */
3569
3841
  "checked"?: boolean;
3570
3842
  /**
3571
- * Determines if the checkbox is disabled
3843
+ * Disabled state
3572
3844
  * @default false
3573
3845
  */
3574
3846
  "disabled"?: boolean;
3575
3847
  /**
3576
- * Indicates if the checkbox is in an error state. This affects the visual styling of the component.
3848
+ * Visual error state. - In `silent` mode this can be managed internally. - In other modes you can set it externally as well.
3577
3849
  * @default false
3578
3850
  */
3579
3851
  "error"?: boolean;
3580
3852
  /**
3581
- * Full width checkbox
3853
+ * Makes checkbox occupy full width (if your styles support it).
3582
3854
  * @default false
3583
3855
  */
3584
3856
  "fullWidth"?: boolean;
3585
3857
  /**
3586
- * Determines if the checkbox is in an indeterminate state. This is useful when some items in a group of checkboxes are selected and others are not.
3858
+ * Indeterminate (mixed) state. Useful when a group selection is partially selected.
3587
3859
  * @default false
3588
3860
  */
3589
3861
  "indeterminate"?: boolean;
3590
3862
  /**
3591
- * Label text to display next to the checkbox
3863
+ * Visible label text (optional). You can also use the default slot.
3592
3864
  */
3593
3865
  "label"?: string;
3594
3866
  /**
3595
- * Controls the position of the label relative to the checkbox
3867
+ * Label position relative to the checkbox control.
3596
3868
  * @default 'right'
3597
3869
  */
3598
3870
  "labelPosition"?: 'left' | 'right';
3599
3871
  /**
3600
- * Name attribute for the checkbox when used in a form
3872
+ * Form field name
3601
3873
  */
3602
3874
  "name"?: string;
3603
3875
  /**
3604
- * Event emitted when the checked state changes
3876
+ * Fired whenever the checked state changes.
3877
+ */
3878
+ "onBcmCheckboxChange"?: (event: BcmCheckboxCustomEvent<{ element: HTMLInputElement; checked: boolean }>) => void;
3879
+ /**
3880
+ * Optional readonly support
3881
+ * @default false
3882
+ */
3883
+ "readonly"?: boolean;
3884
+ /**
3885
+ * Required state
3886
+ * @default false
3605
3887
  */
3606
- "onBcmCheckboxChange"?: (event: BcmCheckboxCustomEvent<{ element: any; checked: boolean }>) => void;
3888
+ "required"?: boolean;
3607
3889
  /**
3608
- * Size variant of the checkbox
3890
+ * Size variant (affects control + typography).
3609
3891
  * @default 'medium'
3610
3892
  */
3611
3893
  "size"?: 'small' | 'medium' | 'large';
3894
+ /**
3895
+ * @default 'native'
3896
+ */
3897
+ "validationMode"?: 'native' | 'silent' | 'none';
3898
+ /**
3899
+ * Value submitted when checked
3900
+ * @default 'on'
3901
+ */
3902
+ "value"?: string;
3612
3903
  }
3613
3904
  /**
3614
3905
  * @component BcmChip
@@ -3823,6 +4114,61 @@ declare namespace LocalJSX {
3823
4114
  "selected"?: boolean;
3824
4115
  "text"?: string;
3825
4116
  }
4117
+ interface BcmFileUpload {
4118
+ /**
4119
+ * @default '.xls,.pdf'
4120
+ */
4121
+ "accept"?: string;
4122
+ /**
4123
+ * @default ''
4124
+ */
4125
+ "caption"?: string;
4126
+ /**
4127
+ * Allows consumers to override default error messages.
4128
+ */
4129
+ "customErrorMessages"?: BcmUploadErrorMessages;
4130
+ /**
4131
+ * @default false
4132
+ */
4133
+ "disabled"?: boolean;
4134
+ /**
4135
+ * @default ''
4136
+ */
4137
+ "label"?: string;
4138
+ /**
4139
+ * Maximum number of files allowed in total. Only applied when `multiple` is true.
4140
+ */
4141
+ "maxFileCount"?: number;
4142
+ /**
4143
+ * @default 2
4144
+ */
4145
+ "maxSize"?: number;
4146
+ /**
4147
+ * @default false
4148
+ */
4149
+ "multiple"?: boolean;
4150
+ /**
4151
+ * @default 'file'
4152
+ */
4153
+ "name"?: string;
4154
+ "onBcmBlur"?: (event: BcmFileUploadCustomEvent<FocusEvent>) => void;
4155
+ "onBcmFileChange"?: (event: BcmFileUploadCustomEvent<File[]>) => void;
4156
+ "onBcmFileRemoved"?: (event: BcmFileUploadCustomEvent<BcmUploadItem>) => void;
4157
+ "onBcmFocus"?: (event: BcmFileUploadCustomEvent<FocusEvent>) => void;
4158
+ "onBcmUploadCanceled"?: (event: BcmFileUploadCustomEvent<BcmUploadItem>) => void;
4159
+ /**
4160
+ * @default false
4161
+ */
4162
+ "required"?: boolean;
4163
+ /**
4164
+ * @default 'medium'
4165
+ */
4166
+ "size"?: 'medium' | 'small';
4167
+ /**
4168
+ * Reserved for future backend upload integration. Currently does not affect component behavior.
4169
+ */
4170
+ "uploadUrl"?: string;
4171
+ }
3826
4172
  interface BcmInput {
3827
4173
  /**
3828
4174
  * Input id
@@ -4490,6 +4836,10 @@ declare namespace LocalJSX {
4490
4836
  "trigger"?: 'click' | 'hover' | 'hover focus';
4491
4837
  }
4492
4838
  interface BcmRadio {
4839
+ /**
4840
+ * @default generateId('bcm-radio')
4841
+ */
4842
+ "_id"?: string;
4493
4843
  /**
4494
4844
  * Whether the radio button is selected.
4495
4845
  * @prop
@@ -4535,6 +4885,11 @@ declare namespace LocalJSX {
4535
4885
  * @defaultValue false
4536
4886
  */
4537
4887
  "readonly"?: boolean;
4888
+ /**
4889
+ * Whether at least one radio in this group is required. (HTML)
4890
+ * @default false
4891
+ */
4892
+ "required"?: boolean;
4538
4893
  /**
4539
4894
  * Defines the size of the radio button: 'small' | 'medium' | 'large'.
4540
4895
  * @prop
@@ -4605,58 +4960,85 @@ declare namespace LocalJSX {
4605
4960
  */
4606
4961
  "value"?: string;
4607
4962
  }
4608
- interface BcmSegmentedPicker {
4963
+ /**
4964
+ * Individual segment option component
4965
+ */
4966
+ interface BcmSegment {
4967
+ /**
4968
+ * Index of currently active segment (inherited from parent)
4969
+ * @default 0
4970
+ */
4971
+ "activeIndex"?: number;
4609
4972
  /**
4610
4973
  * Disabled state
4611
4974
  * @default false
4612
4975
  */
4613
4976
  "disabled"?: boolean;
4614
4977
  /**
4615
- * Full width component
4616
- * @default false
4978
+ * Index of this segment (inherited from parent)
4979
+ * @default 0
4617
4980
  */
4618
- "fullWidth"?: boolean;
4981
+ "index"?: number;
4982
+ /**
4983
+ * Internal event emitted when segment is clicked
4984
+ */
4985
+ "onBcmSegmentClick"?: (event: BcmSegmentCustomEvent<string>) => void;
4619
4986
  /**
4620
- * Change event
4987
+ * Selected state (controlled by parent)
4988
+ * @default false
4621
4989
  */
4622
- "onBcmChange"?: (event: BcmSegmentedPickerCustomEvent<{ value: string }>) => void;
4990
+ "selected"?: boolean;
4623
4991
  /**
4624
- * Controls the component size
4992
+ * Size variant (inherited from parent)
4625
4993
  * @default 'medium'
4626
4994
  */
4627
- "size"?: SegmentedPickerSize;
4995
+ "size"?: 'small' | 'medium' | 'large';
4628
4996
  /**
4629
- * The selected option value
4997
+ * Unique identifier for this segment
4630
4998
  */
4631
- "value"?: string;
4999
+ "value": string;
4632
5000
  }
4633
- interface BcmSegmentedPickerOption {
5001
+ /**
5002
+ * Modern Segmented Picker component with CSS Grid-based indicator
5003
+ */
5004
+ interface BcmSegmentedPicker {
4634
5005
  /**
4635
- * Whether this option is disabled
5006
+ * Disabled state
4636
5007
  * @default false
4637
5008
  */
4638
5009
  "disabled"?: boolean;
4639
5010
  /**
4640
- * Option display label
5011
+ * Full width flag
5012
+ * @default false
4641
5013
  */
4642
- "label"?: string;
5014
+ "fullWidth"?: boolean;
4643
5015
  /**
4644
- * Click event
5016
+ * Name attribute for form association
4645
5017
  */
4646
- "onBcmOptionClick"?: (event: BcmSegmentedPickerOptionCustomEvent<string>) => void;
5018
+ "name"?: string;
5019
+ /**
5020
+ * Emits when selected segment changes
5021
+ */
5022
+ "onBcmSegmentChange"?: (event: BcmSegmentedPickerCustomEvent<{ value: string; previousValue: string }>) => void;
4647
5023
  /**
4648
- * Whether this option is selected
5024
+ * Whether this field is required in a form
4649
5025
  * @default false
4650
5026
  */
4651
- "selected"?: boolean;
5027
+ "required"?: boolean;
5028
+ /**
5029
+ * Enable shadow on container
5030
+ * @default false
5031
+ */
5032
+ "shadow"?: boolean;
4652
5033
  /**
4653
- * Controls the option size
5034
+ * Size variant
5035
+ * @default 'medium'
4654
5036
  */
4655
- "size"?: SegmentedPickerSize;
5037
+ "size"?: 'small' | 'medium' | 'large';
4656
5038
  /**
4657
- * Option value
5039
+ * Selected segment value
4658
5040
  */
4659
- "value": string;
5041
+ "value"?: string;
4660
5042
  }
4661
5043
  interface BcmShortcut {
4662
5044
  "hotkey"?: string;
@@ -4667,178 +5049,181 @@ declare namespace LocalJSX {
4667
5049
  }
4668
5050
  /**
4669
5051
  * @component BcmSwitch
4670
- * @description A customizable toggle switch component that provides an intuitive way to enable or disable options.
4671
- * Supports different sizes, label positions, error states, and accessibility features.
5052
+ * @description A form-associated toggle switch component representing a boolean choice.
5053
+ * It behaves like a checkbox and integrates with native HTML forms via ElementInternals.
5054
+ * This component supports **three validation strategies** via `validation-mode`:
5055
+ * - **`native`**:
5056
+ * - Uses native browser constraint validation.
5057
+ * - Sets the underlying input's `required` attribute.
5058
+ * - Browser may show the native validation bubble when the form calls `reportValidity()` / submit validation runs.
5059
+ * - **`silent`**:
5060
+ * - Does **not** rely on native `required` (prevents the browser bubble).
5061
+ * - Computes the "missing required" state internally and exposes it via `error` + `caption`.
5062
+ * - UI errors are **gated**: they appear only after the control is touched or after a submit attempt.
5063
+ * - **`none`**:
5064
+ * - Value-only mode (headless): participates in form value submission but never becomes invalid.
5065
+ * ## UI error gating (silent mode)
5066
+ * To avoid showing errors on initial render, the component tracks:
5067
+ * - `touched`: set after the first user interaction
5068
+ * - `submitAttempted`: set when the parent form emits `submit`
5069
+ * Only when `touched || submitAttempted` the component will show `error/caption` in `silent` mode.
5070
+ * ## Value behavior
5071
+ * - When checked, the component submits its `value` (default: `"on"`).
5072
+ * - When unchecked, no value is submitted.
5073
+ * - When disabled, the component does not participate in submission or validity.
4672
5074
  * @example Basic usage
4673
- * <bcm-switch label="Enable notifications"></bcm-switch>
4674
- * @example With error state
5075
+ * <bcm-switch name="newsletter" label="Receive newsletter?" />
5076
+ * @example Required with silent validation (no native bubble)
5077
+ * <form>
4675
5078
  * <bcm-switch
5079
+ * name="terms"
4676
5080
  * label="Accept terms"
4677
- * error={true}
4678
- * caption="You must accept the terms to continue">
4679
- * </bcm-switch>
4680
- * @example Disabled state
4681
- * <bcm-switch
4682
- * label="Advanced features"
4683
- * disabled={true}>
4684
- * </bcm-switch>
4685
- * @example With custom size and label position
4686
- * <bcm-switch
4687
- * label="Dark mode"
4688
- * size="large"
4689
- * labelPosition="left">
5081
+ * required
5082
+ * validation-mode="silent">
4690
5083
  * </bcm-switch>
5084
+ * <button type="submit">Submit</button>
5085
+ * </form>
5086
+ * @example Native validation mode (may show native bubble)
5087
+ * <bcm-switch name="terms" label="Accept terms" required validation-mode="native" />
5088
+ * @example Value-only mode (no validation)
5089
+ * <bcm-switch name="analytics" label="Allow analytics" validation-mode="none" />
5090
+ * @csspart base - Root container
5091
+ * @csspart switch-wrapper - Wrapper containing label + track
5092
+ * @csspart input - Hidden native input
5093
+ * @csspart label - Text label
5094
+ * @csspart dot-container - Switch track
5095
+ * @csspart dot - Switch knob
5096
+ * @csspart caption - Helper/error text
4691
5097
  */
4692
5098
  interface BcmSwitch {
4693
5099
  /**
4694
- * Text to display as an error message when error is true
5100
+ * Unique id (optional). Generated by default.
5101
+ * @default generateId('bcm-switch')
5102
+ */
5103
+ "_id"?: string;
5104
+ /**
5105
+ * Helper / error text shown under the switch
4695
5106
  */
4696
5107
  "caption"?: string;
4697
5108
  /**
4698
- * Whether the switch is checked or not
5109
+ * Checked state
4699
5110
  * @default false
4700
5111
  */
4701
5112
  "checked"?: boolean;
4702
5113
  /**
4703
- * Whether the switch is disabled
5114
+ * Disabled state
4704
5115
  * @default false
4705
5116
  */
4706
5117
  "disabled"?: boolean;
4707
5118
  /**
4708
- * Whether to display the switch in an error state
5119
+ * Visual error state (manual/external). In silent mode this can be auto-managed.
4709
5120
  * @default false
4710
5121
  */
4711
5122
  "error"?: boolean;
4712
5123
  /**
4713
- * Text label for the switch
5124
+ * Visible label text
4714
5125
  */
4715
- "label"?: string;
5126
+ "label": string;
4716
5127
  /**
4717
5128
  * Position of the label relative to the switch
4718
5129
  * @default 'right'
4719
5130
  */
4720
5131
  "labelPosition"?: 'left' | 'right';
4721
5132
  /**
4722
- * The name attribute for the hidden input element
5133
+ * Form field name
4723
5134
  */
4724
5135
  "name"?: string;
4725
5136
  /**
4726
- * Emitted when the switch state changes
5137
+ * Emitted when the switch toggles
4727
5138
  */
4728
5139
  "onBcmSwitchChange"?: (event: BcmSwitchCustomEvent<boolean>) => void;
4729
5140
  /**
4730
- * Whether the switch is in readonly mode
5141
+ * Optional readonly support
4731
5142
  * @default false
4732
5143
  */
4733
5144
  "readonly"?: boolean;
4734
5145
  /**
4735
- * Whether the switch is required in a form
5146
+ * Required state
4736
5147
  * @default false
4737
5148
  */
4738
5149
  "required"?: boolean;
4739
5150
  /**
4740
- * Size variant of the switch
5151
+ * Size variant
4741
5152
  * @default 'medium'
4742
5153
  */
4743
5154
  "size"?: 'small' | 'medium' | 'large';
4744
5155
  /**
4745
- * The value attribute for the hidden input element
5156
+ * @default 'native'
5157
+ */
5158
+ "validationMode"?: 'native' | 'silent' | 'none';
5159
+ /**
5160
+ * Value submitted when checked
5161
+ * @default 'on'
4746
5162
  */
4747
5163
  "value"?: string;
4748
5164
  }
4749
5165
  /**
4750
- * @description Tab interface component
5166
+ * Individual tab component - self-contained with label and content panel
4751
5167
  */
4752
- interface BcmTabs {
4753
- /**
4754
- * Default active tab value
4755
- */
4756
- "defaultValue"?: string;
5168
+ interface BcmTab {
4757
5169
  /**
4758
- * Triggers when tab changes
4759
- */
4760
- "onBcmTabChange"?: (event: BcmTabsCustomEvent<{
4761
- activeTab: string;
4762
- element: HTMLBcmTabsTriggerElement;
4763
- previousTab?: string;
4764
- }>) => void;
4765
- /**
4766
- * Tab size
4767
- * @default 'medium'
5170
+ * Active state (controlled by parent)
5171
+ * @default false
4768
5172
  */
4769
- "size"?: 'small' | 'medium' | 'large';
5173
+ "active"?: boolean;
4770
5174
  /**
4771
- * Whether to enable smooth animations for inkbar and transitions
4772
- * @default true
5175
+ * Disabled state
5176
+ * @default false
4773
5177
  */
4774
- "smooth"?: boolean;
5178
+ "disabled"?: boolean;
4775
5179
  /**
4776
- * Tab variant - controls width behavior
4777
- * @default 'full-width'
5180
+ * Label text to display in tab button
4778
5181
  */
4779
- "variant"?: 'full-width' | 'auto-width';
4780
- }
4781
- /**
4782
- * @description Tab content panel component that displays when its corresponding tab is selected
4783
- */
4784
- interface BcmTabsContent {
5182
+ "label": string;
4785
5183
  /**
4786
- * Unique identifier that matches a tab trigger's value Used to associate this content with its corresponding tab
5184
+ * Internal event emitted when tab button is clicked
4787
5185
  */
4788
- "value"?: string;
4789
- }
4790
- /**
4791
- * @description Container component for tab triggers that includes the sliding indicator (inkbar)
4792
- */
4793
- interface BcmTabsList {
5186
+ "onBcmTabClick"?: (event: BcmTabCustomEvent<string>) => void;
4794
5187
  /**
4795
- * Whether to enable smooth animations for inkbar and transitions
4796
- * @default true
5188
+ * Size variant (inherited from parent)
5189
+ * @default 'md'
4797
5190
  */
4798
- "smooth"?: boolean;
5191
+ "size"?: 'sm' | 'md' | 'lg';
4799
5192
  /**
4800
- * Tab variant - controls width behavior
4801
- * @default 'full-width'
5193
+ * Unique identifier for this tab
4802
5194
  */
4803
- "variant"?: 'full-width' | 'auto-width';
5195
+ "value": string;
4804
5196
  }
4805
5197
  /**
4806
- * @description Tab trigger component that functions as a clickable tab button
5198
+ * Modern Tabs component with CSS-first approach
4807
5199
  */
4808
- interface BcmTabsTrigger {
5200
+ interface BcmTabs {
4809
5201
  /**
4810
- * Whether the tab is currently active
4811
- * @default false
5202
+ * Emits when active tab changes
4812
5203
  */
4813
- "active"?: boolean;
5204
+ "onBcmTabChange"?: (event: BcmTabsCustomEvent<{
5205
+ value: string;
5206
+ previousValue: string;
5207
+ }>) => void;
4814
5208
  /**
4815
- * Whether the tab is disabled
5209
+ * Enable shadow on main container
4816
5210
  * @default false
4817
5211
  */
4818
- "disabled"?: boolean;
4819
- /**
4820
- * Event emitted when this tab is selected
4821
- */
4822
- "onBcmTabSelected"?: (event: BcmTabsTriggerCustomEvent<string>) => void;
4823
- /**
4824
- * Size of the tab
4825
- * @default 'medium'
4826
- */
4827
- "size"?: 'small' | 'medium' | 'large';
5212
+ "shadow"?: boolean;
4828
5213
  /**
4829
- * Whether to enable smooth animations for transitions
4830
- * @default true
5214
+ * Tab size variant
5215
+ * @default 'md'
4831
5216
  */
4832
- "smooth"?: boolean;
5217
+ "size"?: 'sm' | 'md' | 'lg';
4833
5218
  /**
4834
- * Unique identifier value for the tab
5219
+ * Active tab value
4835
5220
  */
4836
5221
  "value"?: string;
4837
5222
  /**
4838
- * Tab variant - controls width behavior
4839
- * @default 'full-width'
5223
+ * Visual variant
5224
+ * @default 'line'
4840
5225
  */
4841
- "variant"?: 'full-width' | 'auto-width';
5226
+ "variant"?: 'line' | 'enclosed';
4842
5227
  }
4843
5228
  interface BcmText {
4844
5229
  /**
@@ -5094,6 +5479,7 @@ declare namespace LocalJSX {
5094
5479
  "bcm-drawer": BcmDrawer;
5095
5480
  "bcm-dropdown": BcmDropdown;
5096
5481
  "bcm-dropdown-item": BcmDropdownItem;
5482
+ "bcm-file-upload": BcmFileUpload;
5097
5483
  "bcm-input": BcmInput;
5098
5484
  "bcm-linked": BcmLinked;
5099
5485
  "bcm-modal": BcmModal;
@@ -5101,14 +5487,12 @@ declare namespace LocalJSX {
5101
5487
  "bcm-popover": BcmPopover;
5102
5488
  "bcm-radio": BcmRadio;
5103
5489
  "bcm-radio-group": BcmRadioGroup;
5490
+ "bcm-segment": BcmSegment;
5104
5491
  "bcm-segmented-picker": BcmSegmentedPicker;
5105
- "bcm-segmented-picker-option": BcmSegmentedPickerOption;
5106
5492
  "bcm-shortcut": BcmShortcut;
5107
5493
  "bcm-switch": BcmSwitch;
5494
+ "bcm-tab": BcmTab;
5108
5495
  "bcm-tabs": BcmTabs;
5109
- "bcm-tabs-content": BcmTabsContent;
5110
- "bcm-tabs-list": BcmTabsList;
5111
- "bcm-tabs-trigger": BcmTabsTrigger;
5112
5496
  "bcm-text": BcmText;
5113
5497
  "bcm-textarea": BcmTextarea;
5114
5498
  "bcm-tooltip": BcmTooltip;
@@ -5254,8 +5638,49 @@ declare module "@stencil/core" {
5254
5638
  "bcm-button": LocalJSX.BcmButton & JSXBase.HTMLAttributes<HTMLBcmButtonElement>;
5255
5639
  "bcm-button-group": LocalJSX.BcmButtonGroup & JSXBase.HTMLAttributes<HTMLBcmButtonGroupElement>;
5256
5640
  /**
5257
- * @description A checkbox component that allows users to select or deselect an option.
5258
- * It also supports an indeterminate state.
5641
+ * @component BcmCheckbox
5642
+ * @description A form-associated checkbox component representing a boolean choice.
5643
+ * Integrates with native HTML forms via ElementInternals while supporting
5644
+ * **three validation strategies** via `validation-mode`:
5645
+ * - **`native`**
5646
+ * - Participates in native browser constraint validation.
5647
+ * - Sets the underlying input's `required`.
5648
+ * - Browser may show native validation bubbles when submit/reportValidity happens.
5649
+ * - **`silent`**
5650
+ * - Does **not** set native `required` (prevents browser bubble).
5651
+ * - Computes "missing required" internally and exposes it via `error` + `caption`.
5652
+ * - UI errors are **gated**: shown only after `touched` or a form submit attempt.
5653
+ * - **`none`**
5654
+ * - Value-only mode: submits value but never becomes invalid.
5655
+ * ## UI error gating (silent mode)
5656
+ * - `touched` becomes true after first user interaction
5657
+ * - `submitAttempted` becomes true when the parent form emits `submit`
5658
+ * ## Value behavior
5659
+ * - When checked → submits `value` (default: `"on"`).
5660
+ * - When unchecked → submits no value (`null`).
5661
+ * - When disabled → no submission and no validity participation.
5662
+ * ## Shadow Parts
5663
+ * - `checkbox` → root container
5664
+ * - `control` → visual checkbox box
5665
+ * - `icon` → icon container (check or minus)
5666
+ * - `label` → label text
5667
+ * - `caption` → helper/error text (silent mode UI)
5668
+ * - `input` → hidden native input
5669
+ * @example Basic usage
5670
+ * <bcm-checkbox name="terms" required>
5671
+ * I agree to the terms and conditions
5672
+ * </bcm-checkbox>
5673
+ * @example Silent validation (no native bubble)
5674
+ * <form>
5675
+ * <bcm-checkbox name="newsletter" required validation-mode="silent">
5676
+ * Subscribe to newsletter
5677
+ * </bcm-checkbox>
5678
+ * <button type="submit">Submit</button>
5679
+ * </form>
5680
+ * @example Value-only mode
5681
+ * <bcm-checkbox name="analytics" validation-mode="none">
5682
+ * Allow analytics
5683
+ * </bcm-checkbox>
5259
5684
  */
5260
5685
  "bcm-checkbox": LocalJSX.BcmCheckbox & JSXBase.HTMLAttributes<HTMLBcmCheckboxElement>;
5261
5686
  /**
@@ -5322,6 +5747,7 @@ declare module "@stencil/core" {
5322
5747
  "bcm-drawer": LocalJSX.BcmDrawer & JSXBase.HTMLAttributes<HTMLBcmDrawerElement>;
5323
5748
  "bcm-dropdown": LocalJSX.BcmDropdown & JSXBase.HTMLAttributes<HTMLBcmDropdownElement>;
5324
5749
  "bcm-dropdown-item": LocalJSX.BcmDropdownItem & JSXBase.HTMLAttributes<HTMLBcmDropdownItemElement>;
5750
+ "bcm-file-upload": LocalJSX.BcmFileUpload & JSXBase.HTMLAttributes<HTMLBcmFileUploadElement>;
5325
5751
  "bcm-input": LocalJSX.BcmInput & JSXBase.HTMLAttributes<HTMLBcmInputElement>;
5326
5752
  /**
5327
5753
  * @component BcmLinked
@@ -5560,50 +5986,72 @@ declare module "@stencil/core" {
5560
5986
  "bcm-popover": LocalJSX.BcmPopover & JSXBase.HTMLAttributes<HTMLBcmPopoverElement>;
5561
5987
  "bcm-radio": LocalJSX.BcmRadio & JSXBase.HTMLAttributes<HTMLBcmRadioElement>;
5562
5988
  "bcm-radio-group": LocalJSX.BcmRadioGroup & JSXBase.HTMLAttributes<HTMLBcmRadioGroupElement>;
5989
+ /**
5990
+ * Individual segment option component
5991
+ */
5992
+ "bcm-segment": LocalJSX.BcmSegment & JSXBase.HTMLAttributes<HTMLBcmSegmentElement>;
5993
+ /**
5994
+ * Modern Segmented Picker component with CSS Grid-based indicator
5995
+ */
5563
5996
  "bcm-segmented-picker": LocalJSX.BcmSegmentedPicker & JSXBase.HTMLAttributes<HTMLBcmSegmentedPickerElement>;
5564
- "bcm-segmented-picker-option": LocalJSX.BcmSegmentedPickerOption & JSXBase.HTMLAttributes<HTMLBcmSegmentedPickerOptionElement>;
5565
5997
  "bcm-shortcut": LocalJSX.BcmShortcut & JSXBase.HTMLAttributes<HTMLBcmShortcutElement>;
5566
5998
  /**
5567
5999
  * @component BcmSwitch
5568
- * @description A customizable toggle switch component that provides an intuitive way to enable or disable options.
5569
- * Supports different sizes, label positions, error states, and accessibility features.
6000
+ * @description A form-associated toggle switch component representing a boolean choice.
6001
+ * It behaves like a checkbox and integrates with native HTML forms via ElementInternals.
6002
+ * This component supports **three validation strategies** via `validation-mode`:
6003
+ * - **`native`**:
6004
+ * - Uses native browser constraint validation.
6005
+ * - Sets the underlying input's `required` attribute.
6006
+ * - Browser may show the native validation bubble when the form calls `reportValidity()` / submit validation runs.
6007
+ * - **`silent`**:
6008
+ * - Does **not** rely on native `required` (prevents the browser bubble).
6009
+ * - Computes the "missing required" state internally and exposes it via `error` + `caption`.
6010
+ * - UI errors are **gated**: they appear only after the control is touched or after a submit attempt.
6011
+ * - **`none`**:
6012
+ * - Value-only mode (headless): participates in form value submission but never becomes invalid.
6013
+ * ## UI error gating (silent mode)
6014
+ * To avoid showing errors on initial render, the component tracks:
6015
+ * - `touched`: set after the first user interaction
6016
+ * - `submitAttempted`: set when the parent form emits `submit`
6017
+ * Only when `touched || submitAttempted` the component will show `error/caption` in `silent` mode.
6018
+ * ## Value behavior
6019
+ * - When checked, the component submits its `value` (default: `"on"`).
6020
+ * - When unchecked, no value is submitted.
6021
+ * - When disabled, the component does not participate in submission or validity.
5570
6022
  * @example Basic usage
5571
- * <bcm-switch label="Enable notifications"></bcm-switch>
5572
- * @example With error state
6023
+ * <bcm-switch name="newsletter" label="Receive newsletter?" />
6024
+ * @example Required with silent validation (no native bubble)
6025
+ * <form>
5573
6026
  * <bcm-switch
6027
+ * name="terms"
5574
6028
  * label="Accept terms"
5575
- * error={true}
5576
- * caption="You must accept the terms to continue">
5577
- * </bcm-switch>
5578
- * @example Disabled state
5579
- * <bcm-switch
5580
- * label="Advanced features"
5581
- * disabled={true}>
5582
- * </bcm-switch>
5583
- * @example With custom size and label position
5584
- * <bcm-switch
5585
- * label="Dark mode"
5586
- * size="large"
5587
- * labelPosition="left">
6029
+ * required
6030
+ * validation-mode="silent">
5588
6031
  * </bcm-switch>
6032
+ * <button type="submit">Submit</button>
6033
+ * </form>
6034
+ * @example Native validation mode (may show native bubble)
6035
+ * <bcm-switch name="terms" label="Accept terms" required validation-mode="native" />
6036
+ * @example Value-only mode (no validation)
6037
+ * <bcm-switch name="analytics" label="Allow analytics" validation-mode="none" />
6038
+ * @csspart base - Root container
6039
+ * @csspart switch-wrapper - Wrapper containing label + track
6040
+ * @csspart input - Hidden native input
6041
+ * @csspart label - Text label
6042
+ * @csspart dot-container - Switch track
6043
+ * @csspart dot - Switch knob
6044
+ * @csspart caption - Helper/error text
5589
6045
  */
5590
6046
  "bcm-switch": LocalJSX.BcmSwitch & JSXBase.HTMLAttributes<HTMLBcmSwitchElement>;
5591
6047
  /**
5592
- * @description Tab interface component
6048
+ * Individual tab component - self-contained with label and content panel
5593
6049
  */
5594
- "bcm-tabs": LocalJSX.BcmTabs & JSXBase.HTMLAttributes<HTMLBcmTabsElement>;
6050
+ "bcm-tab": LocalJSX.BcmTab & JSXBase.HTMLAttributes<HTMLBcmTabElement>;
5595
6051
  /**
5596
- * @description Tab content panel component that displays when its corresponding tab is selected
6052
+ * Modern Tabs component with CSS-first approach
5597
6053
  */
5598
- "bcm-tabs-content": LocalJSX.BcmTabsContent & JSXBase.HTMLAttributes<HTMLBcmTabsContentElement>;
5599
- /**
5600
- * @description Container component for tab triggers that includes the sliding indicator (inkbar)
5601
- */
5602
- "bcm-tabs-list": LocalJSX.BcmTabsList & JSXBase.HTMLAttributes<HTMLBcmTabsListElement>;
5603
- /**
5604
- * @description Tab trigger component that functions as a clickable tab button
5605
- */
5606
- "bcm-tabs-trigger": LocalJSX.BcmTabsTrigger & JSXBase.HTMLAttributes<HTMLBcmTabsTriggerElement>;
6054
+ "bcm-tabs": LocalJSX.BcmTabs & JSXBase.HTMLAttributes<HTMLBcmTabsElement>;
5607
6055
  "bcm-text": LocalJSX.BcmText & JSXBase.HTMLAttributes<HTMLBcmTextElement>;
5608
6056
  "bcm-textarea": LocalJSX.BcmTextarea & JSXBase.HTMLAttributes<HTMLBcmTextareaElement>;
5609
6057
  /**