@beeq/core 1.10.0-beta.3 → 1.10.0-beta.4

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 (453) hide show
  1. package/dist/beeq/beeq.css +1 -1
  2. package/dist/beeq/beeq.esm.js +1 -1
  3. package/dist/beeq/beeq.esm.js.map +1 -1
  4. package/dist/beeq/bq-card.entry.esm.js.map +1 -1
  5. package/dist/beeq/bq-date-picker.entry.esm.js.map +1 -1
  6. package/dist/beeq/bq-drawer.entry.esm.js.map +1 -1
  7. package/dist/beeq/bq-option-list.bq-tag.entry.esm.js.map +1 -1
  8. package/dist/beeq/bq-page-title.entry.esm.js.map +1 -1
  9. package/dist/beeq/bq-progress.entry.esm.js.map +1 -1
  10. package/dist/beeq/bq-radio-group.entry.esm.js.map +1 -1
  11. package/dist/beeq/bq-radio.entry.esm.js.map +1 -1
  12. package/dist/beeq/bq-select.entry.esm.js.map +1 -1
  13. package/dist/beeq/bq-side-menu-item.entry.esm.js.map +1 -1
  14. package/dist/beeq/bq-slider.entry.esm.js.map +1 -1
  15. package/dist/beeq/bq-step-item.entry.esm.js.map +1 -1
  16. package/dist/beeq/bq-steps.entry.esm.js.map +1 -1
  17. package/dist/beeq/bq-tooltip.entry.esm.js.map +1 -1
  18. package/dist/beeq/index.esm.js +1 -1
  19. package/dist/beeq/{p-d5e90f0c.entry.js → p-00f6ab04.entry.js} +2 -2
  20. package/dist/beeq/{p-62613d0d.entry.js → p-01d832d0.entry.js} +2 -2
  21. package/dist/beeq/{p-724c516b.entry.js → p-0bf9984d.entry.js} +2 -2
  22. package/dist/beeq/{p-724c516b.entry.js.map → p-0bf9984d.entry.js.map} +1 -1
  23. package/dist/beeq/{p-b6a03fdd.entry.js → p-12249759.entry.js} +2 -2
  24. package/dist/beeq/{p-c6773ae2.entry.js → p-1a19b5fa.entry.js} +2 -2
  25. package/dist/beeq/{p-6e523256.entry.js → p-1cd5bf89.entry.js} +2 -2
  26. package/dist/beeq/{p-58f07415.entry.js → p-3464beb1.entry.js} +2 -2
  27. package/dist/beeq/{p-7deffb9e.entry.js → p-38b70ecf.entry.js} +2 -2
  28. package/dist/beeq/{p-9d5293fe.entry.js → p-3bac8fc4.entry.js} +2 -2
  29. package/dist/beeq/{p-a8ab0de7.entry.js → p-4a29e2d0.entry.js} +2 -2
  30. package/dist/beeq/{p-a8ab0de7.entry.js.map → p-4a29e2d0.entry.js.map} +1 -1
  31. package/dist/beeq/{p-a2c91633.entry.js → p-4a3d974a.entry.js} +2 -2
  32. package/dist/beeq/p-4aa72d5a.entry.js +6 -0
  33. package/dist/beeq/p-4aa72d5a.entry.js.map +1 -0
  34. package/dist/beeq/{p-96a76f8d.entry.js → p-50b2fd06.entry.js} +2 -2
  35. package/dist/beeq/{p-da447add.entry.js → p-55017e05.entry.js} +2 -2
  36. package/dist/beeq/{p-71b947ad.entry.js → p-58541f26.entry.js} +2 -2
  37. package/dist/beeq/{p-0ea42c3f.entry.js → p-5b5442ce.entry.js} +2 -2
  38. package/dist/beeq/{p-0ea42c3f.entry.js.map → p-5b5442ce.entry.js.map} +1 -1
  39. package/dist/beeq/{p-37315c83.entry.js → p-622b9249.entry.js} +2 -2
  40. package/dist/beeq/{p-37315c83.entry.js.map → p-622b9249.entry.js.map} +1 -1
  41. package/dist/beeq/{p-dac34b15.entry.js → p-74daa290.entry.js} +2 -2
  42. package/dist/beeq/{p-dac34b15.entry.js.map → p-74daa290.entry.js.map} +1 -1
  43. package/dist/beeq/{p-355a197e.entry.js → p-7eb5259f.entry.js} +2 -2
  44. package/dist/beeq/p-9573c018.entry.js +6 -0
  45. package/dist/beeq/{p-1a52ac27.entry.js.map → p-9573c018.entry.js.map} +1 -1
  46. package/dist/beeq/{p-458f38a0.entry.js → p-968a4833.entry.js} +2 -2
  47. package/dist/beeq/{p-458f38a0.entry.js.map → p-968a4833.entry.js.map} +1 -1
  48. package/dist/beeq/{p-4iHDua0i.js → p-BsSDkLU5.js} +1 -1
  49. package/dist/beeq/p-BsSDkLU5.js.map +1 -0
  50. package/dist/beeq/p-BtpBVYE0.js +6 -0
  51. package/dist/beeq/p-BtpBVYE0.js.map +1 -0
  52. package/dist/beeq/p-C4jSqdYP.js +7 -0
  53. package/dist/beeq/p-C4jSqdYP.js.map +1 -0
  54. package/dist/beeq/{p-415691fd.entry.js → p-a1ad0e09.entry.js} +2 -2
  55. package/dist/beeq/p-a8c20aaf.entry.js +6 -0
  56. package/dist/beeq/p-a8c20aaf.entry.js.map +1 -0
  57. package/dist/beeq/{p-0fc66165.entry.js → p-a9070048.entry.js} +2 -2
  58. package/dist/beeq/p-ad869f7e.entry.js +6 -0
  59. package/dist/beeq/p-ad869f7e.entry.js.map +1 -0
  60. package/dist/beeq/{p-e3eb683b.entry.js → p-afb356b4.entry.js} +2 -2
  61. package/dist/beeq/{p-f79665be.entry.js → p-b3f103da.entry.js} +2 -2
  62. package/dist/beeq/{p-6891bdf1.entry.js → p-bb038cc5.entry.js} +2 -2
  63. package/dist/beeq/{p-4a77e03c.entry.js → p-c00bcbe6.entry.js} +2 -2
  64. package/dist/beeq/{p-e1e2b79f.entry.js → p-c110a7ea.entry.js} +2 -2
  65. package/dist/beeq/{p-e1e2b79f.entry.js.map → p-c110a7ea.entry.js.map} +1 -1
  66. package/dist/beeq/{p-7a110f32.entry.js → p-c5b7bad2.entry.js} +2 -2
  67. package/dist/beeq/p-cb1ec3ac.entry.js +6 -0
  68. package/dist/beeq/p-cb1ec3ac.entry.js.map +1 -0
  69. package/dist/beeq/{p-a35b4722.entry.js → p-d4b0dcda.entry.js} +2 -2
  70. package/dist/beeq/{p-01e2d9a2.entry.js → p-d58133b8.entry.js} +2 -2
  71. package/dist/beeq/{p-6f24fea1.entry.js → p-d88394b9.entry.js} +2 -2
  72. package/dist/beeq/p-d88394b9.entry.js.map +1 -0
  73. package/dist/beeq/{p-1f758004.entry.js → p-e2b24948.entry.js} +2 -2
  74. package/dist/beeq/{p-8d8ccade.entry.js → p-ea1244cc.entry.js} +2 -2
  75. package/dist/beeq/{p-8d8ccade.entry.js.map → p-ea1244cc.entry.js.map} +1 -1
  76. package/dist/beeq/{p-33a39834.entry.js → p-f738ef10.entry.js} +2 -2
  77. package/dist/beeq/{p-be4a88df.entry.js → p-fc2f0022.entry.js} +2 -2
  78. package/dist/beeq.html-custom-data.json +407 -406
  79. package/dist/cjs/beeq.cjs.js +3 -3
  80. package/dist/cjs/beeq.cjs.js.map +1 -1
  81. package/dist/cjs/bq-accordion-group.cjs.entry.js +2 -2
  82. package/dist/cjs/bq-accordion.cjs.entry.js +2 -2
  83. package/dist/cjs/bq-alert.cjs.entry.js +2 -2
  84. package/dist/cjs/bq-avatar.cjs.entry.js +2 -2
  85. package/dist/cjs/bq-badge.cjs.entry.js +2 -2
  86. package/dist/cjs/bq-breadcrumb-item.cjs.entry.js +2 -2
  87. package/dist/cjs/bq-breadcrumb.cjs.entry.js +2 -2
  88. package/dist/cjs/bq-button_2.cjs.entry.js +3 -3
  89. package/dist/cjs/bq-card.cjs.entry.js +4 -4
  90. package/dist/cjs/bq-card.cjs.entry.js.map +1 -1
  91. package/dist/cjs/bq-card.entry.cjs.js.map +1 -1
  92. package/dist/cjs/bq-checkbox.cjs.entry.js +2 -2
  93. package/dist/cjs/bq-date-picker.cjs.entry.js +3 -3
  94. package/dist/cjs/bq-date-picker.cjs.entry.js.map +1 -1
  95. package/dist/cjs/bq-date-picker.entry.cjs.js.map +1 -1
  96. package/dist/cjs/bq-dialog.cjs.entry.js +2 -2
  97. package/dist/cjs/bq-divider.cjs.entry.js +2 -2
  98. package/dist/cjs/bq-drawer.cjs.entry.js +6 -6
  99. package/dist/cjs/bq-drawer.cjs.entry.js.map +1 -1
  100. package/dist/cjs/bq-drawer.entry.cjs.js.map +1 -1
  101. package/dist/cjs/bq-dropdown_2.cjs.entry.js +4 -4
  102. package/dist/cjs/bq-empty-state.cjs.entry.js +2 -2
  103. package/dist/cjs/bq-input.cjs.entry.js +2 -2
  104. package/dist/cjs/bq-notification.cjs.entry.js +2 -2
  105. package/dist/cjs/bq-option-group.cjs.entry.js +2 -2
  106. package/dist/cjs/bq-option-list.bq-tag.entry.cjs.js.map +1 -1
  107. package/dist/cjs/bq-option-list_2.cjs.entry.js +6 -6
  108. package/dist/cjs/bq-option-list_2.cjs.entry.js.map +1 -1
  109. package/dist/cjs/bq-option.cjs.entry.js +2 -2
  110. package/dist/cjs/bq-page-title.cjs.entry.js +4 -4
  111. package/dist/cjs/bq-page-title.cjs.entry.js.map +1 -1
  112. package/dist/cjs/bq-page-title.entry.cjs.js.map +1 -1
  113. package/dist/cjs/bq-progress.cjs.entry.js +5 -5
  114. package/dist/cjs/bq-progress.cjs.entry.js.map +1 -1
  115. package/dist/cjs/bq-progress.entry.cjs.js.map +1 -1
  116. package/dist/cjs/bq-radio-group.cjs.entry.js +209 -102
  117. package/dist/cjs/bq-radio-group.cjs.entry.js.map +1 -1
  118. package/dist/cjs/bq-radio-group.entry.cjs.js.map +1 -1
  119. package/dist/cjs/bq-radio.cjs.entry.js +24 -15
  120. package/dist/cjs/bq-radio.cjs.entry.js.map +1 -1
  121. package/dist/cjs/bq-radio.entry.cjs.js.map +1 -1
  122. package/dist/cjs/bq-select.cjs.entry.js +2 -2
  123. package/dist/cjs/bq-select.cjs.entry.js.map +1 -1
  124. package/dist/cjs/bq-select.entry.cjs.js.map +1 -1
  125. package/dist/cjs/bq-side-menu-item.cjs.entry.js +6 -6
  126. package/dist/cjs/bq-side-menu-item.cjs.entry.js.map +1 -1
  127. package/dist/cjs/bq-side-menu-item.entry.cjs.js.map +1 -1
  128. package/dist/cjs/bq-side-menu.cjs.entry.js +4 -4
  129. package/dist/cjs/bq-slider.cjs.entry.js +7 -5
  130. package/dist/cjs/bq-slider.cjs.entry.js.map +1 -1
  131. package/dist/cjs/bq-slider.entry.cjs.js.map +1 -1
  132. package/dist/cjs/bq-spinner.cjs.entry.js +6 -6
  133. package/dist/cjs/bq-status.cjs.entry.js +3 -3
  134. package/dist/cjs/bq-step-item.cjs.entry.js +38 -15
  135. package/dist/cjs/bq-step-item.cjs.entry.js.map +1 -1
  136. package/dist/cjs/bq-step-item.entry.cjs.js.map +1 -1
  137. package/dist/cjs/bq-steps.cjs.entry.js +18 -7
  138. package/dist/cjs/bq-steps.cjs.entry.js.map +1 -1
  139. package/dist/cjs/bq-steps.entry.cjs.js.map +1 -1
  140. package/dist/cjs/bq-switch.cjs.entry.js +4 -4
  141. package/dist/cjs/bq-tab-group.cjs.entry.js +6 -6
  142. package/dist/cjs/bq-tab.cjs.entry.js +4 -4
  143. package/dist/cjs/bq-textarea.cjs.entry.js +5 -5
  144. package/dist/cjs/bq-toast.cjs.entry.js +3 -3
  145. package/dist/cjs/bq-tooltip.cjs.entry.js +4 -4
  146. package/dist/cjs/bq-tooltip.cjs.entry.js.map +1 -1
  147. package/dist/cjs/bq-tooltip.entry.cjs.js.map +1 -1
  148. package/dist/cjs/{getNextElement-B5h_gmRG.js → getNextElement-Bcdj4jIn.js} +4 -4
  149. package/dist/cjs/getNextElement-Bcdj4jIn.js.map +1 -0
  150. package/dist/cjs/{index-CbmPaaDD.js → index-BKXwzJHW.js} +545 -168
  151. package/dist/cjs/index-BKXwzJHW.js.map +1 -0
  152. package/dist/cjs/{index-CD2anR4A.js → index-BZ6JRHUg.js} +56 -32
  153. package/dist/cjs/index-BZ6JRHUg.js.map +1 -0
  154. package/dist/cjs/index.cjs.js +1 -1
  155. package/dist/cjs/loader.cjs.js +2 -2
  156. package/dist/collection/collection-manifest.json +1 -1
  157. package/dist/collection/components/accordion/scss/bq-accordion.css +1 -1
  158. package/dist/collection/components/accordion-group/scss/bq-accordion-group.css +1 -1
  159. package/dist/collection/components/alert/scss/bq-alert.css +1 -1
  160. package/dist/collection/components/avatar/scss/bq-avatar.css +1 -1
  161. package/dist/collection/components/badge/scss/bq-badge.css +1 -1
  162. package/dist/collection/components/breadcrumb/scss/bq-breadcrumb.css +1 -1
  163. package/dist/collection/components/breadcrumb-item/scss/bq-breadcrumb-item.css +1 -1
  164. package/dist/collection/components/button/scss/bq-button.css +1 -1
  165. package/dist/collection/components/card/bq-card.js +2 -2
  166. package/dist/collection/components/card/bq-card.js.map +1 -1
  167. package/dist/collection/components/card/scss/bq-card.css +1 -1
  168. package/dist/collection/components/checkbox/scss/bq-checkbox.css +1 -1
  169. package/dist/collection/components/date-picker/bq-date-picker.js +1 -1
  170. package/dist/collection/components/date-picker/bq-date-picker.js.map +1 -1
  171. package/dist/collection/components/date-picker/scss/bq-date-picker.css +1 -1
  172. package/dist/collection/components/dialog/scss/bq-dialog.css +1 -1
  173. package/dist/collection/components/divider/scss/bq-divider.css +1 -1
  174. package/dist/collection/components/drawer/bq-drawer.js +4 -4
  175. package/dist/collection/components/drawer/bq-drawer.js.map +1 -1
  176. package/dist/collection/components/drawer/scss/bq-drawer.css +1 -1
  177. package/dist/collection/components/dropdown/scss/bq-dropdown.css +1 -1
  178. package/dist/collection/components/empty-state/scss/bq-empty-state.css +1 -1
  179. package/dist/collection/components/icon/scss/bq-icon.css +1 -1
  180. package/dist/collection/components/input/scss/bq-input.css +1 -1
  181. package/dist/collection/components/notification/scss/bq-notification.css +1 -1
  182. package/dist/collection/components/option/scss/bq-option.css +1 -1
  183. package/dist/collection/components/option-group/scss/bq-option-group.css +1 -1
  184. package/dist/collection/components/option-list/scss/bq-option-list.css +1 -1
  185. package/dist/collection/components/page-title/bq-page-title.js +2 -2
  186. package/dist/collection/components/page-title/bq-page-title.js.map +1 -1
  187. package/dist/collection/components/page-title/scss/bq-page-title.css +1 -1
  188. package/dist/collection/components/panel/scss/bq-panel.css +1 -1
  189. package/dist/collection/components/progress/bq-progress.js +3 -3
  190. package/dist/collection/components/progress/bq-progress.js.map +1 -1
  191. package/dist/collection/components/progress/scss/bq-progress.css +1 -1
  192. package/dist/collection/components/radio/bq-radio.js +61 -28
  193. package/dist/collection/components/radio/bq-radio.js.map +1 -1
  194. package/dist/collection/components/radio/scss/bq-radio.css +1 -1
  195. package/dist/collection/components/radio-group/bq-radio-group.js +220 -115
  196. package/dist/collection/components/radio-group/bq-radio-group.js.map +1 -1
  197. package/dist/collection/components/radio-group/scss/bq-radio-group.css +1 -1
  198. package/dist/collection/components/select/scss/bq-select.css +1 -1
  199. package/dist/collection/components/side-menu/bq-side-menu.js +2 -2
  200. package/dist/collection/components/side-menu/scss/bq-side-menu.css +1 -1
  201. package/dist/collection/components/side-menu-item/bq-side-menu-item.js +7 -10
  202. package/dist/collection/components/side-menu-item/bq-side-menu-item.js.map +1 -1
  203. package/dist/collection/components/side-menu-item/scss/bq-side-menu-item.css +1 -1
  204. package/dist/collection/components/slider/bq-slider.js +5 -3
  205. package/dist/collection/components/slider/bq-slider.js.map +1 -1
  206. package/dist/collection/components/slider/scss/bq-slider.css +1 -1
  207. package/dist/collection/components/spinner/bq-spinner.js +4 -4
  208. package/dist/collection/components/spinner/scss/bq-spinner.css +1 -1
  209. package/dist/collection/components/status/bq-status.js +1 -1
  210. package/dist/collection/components/status/scss/bq-status.css +1 -1
  211. package/dist/collection/components/step-item/bq-step-item.js +78 -17
  212. package/dist/collection/components/step-item/bq-step-item.js.map +1 -1
  213. package/dist/collection/components/step-item/scss/bq-step-item.css +1 -1
  214. package/dist/collection/components/steps/bq-steps.js +48 -5
  215. package/dist/collection/components/steps/bq-steps.js.map +1 -1
  216. package/dist/collection/components/steps/scss/bq-steps.css +1 -1
  217. package/dist/collection/components/switch/bq-switch.js +2 -2
  218. package/dist/collection/components/switch/scss/bq-switch.css +1 -1
  219. package/dist/collection/components/tab/bq-tab.js +2 -2
  220. package/dist/collection/components/tab/scss/bq-tab.css +1 -1
  221. package/dist/collection/components/tab-group/bq-tab-group.js +3 -3
  222. package/dist/collection/components/tab-group/scss/bq-tab-group.css +1 -1
  223. package/dist/collection/components/tag/bq-tag.js +3 -3
  224. package/dist/collection/components/tag/scss/bq-tag.css +1 -1
  225. package/dist/collection/components/textarea/bq-textarea.js +3 -3
  226. package/dist/collection/components/textarea/scss/bq-textarea.css +1 -1
  227. package/dist/collection/components/toast/bq-toast.js +1 -1
  228. package/dist/collection/components/toast/scss/bq-toast.css +1 -1
  229. package/dist/collection/components/tooltip/bq-tooltip.js +1 -1
  230. package/dist/collection/components/tooltip/scss/bq-tooltip.css +1 -1
  231. package/dist/collection/shared/test-utils/index.js +1 -0
  232. package/dist/collection/shared/test-utils/index.js.map +1 -1
  233. package/dist/collection/shared/test-utils/setProperties.js +10 -2
  234. package/dist/collection/shared/test-utils/setProperties.js.map +1 -1
  235. package/dist/collection/shared/test-utils/waitForSvgLoad.js +61 -0
  236. package/dist/collection/shared/test-utils/waitForSvgLoad.js.map +1 -0
  237. package/dist/collection/shared/utils/getNextElement.js +2 -2
  238. package/dist/collection/shared/utils/getNextElement.js.map +1 -1
  239. package/dist/components/bq-accordion-group.js +1 -1
  240. package/dist/components/bq-accordion.js +1 -1
  241. package/dist/components/bq-alert.js +1 -1
  242. package/dist/components/bq-avatar.js +1 -1
  243. package/dist/components/bq-badge.js +1 -1
  244. package/dist/components/bq-breadcrumb-item.js +1 -1
  245. package/dist/components/bq-breadcrumb.js +1 -1
  246. package/dist/components/bq-button.js +1 -1
  247. package/dist/components/bq-card.js +1 -1
  248. package/dist/components/bq-card.js.map +1 -1
  249. package/dist/components/bq-checkbox.js +1 -1
  250. package/dist/components/bq-date-picker.js +1 -1
  251. package/dist/components/bq-date-picker.js.map +1 -1
  252. package/dist/components/bq-dialog.js +1 -1
  253. package/dist/components/bq-divider.js +1 -1
  254. package/dist/components/bq-drawer.js +1 -1
  255. package/dist/components/bq-drawer.js.map +1 -1
  256. package/dist/components/bq-dropdown.js +1 -1
  257. package/dist/components/bq-empty-state.js +1 -1
  258. package/dist/components/bq-icon.js +1 -1
  259. package/dist/components/bq-input.js +1 -1
  260. package/dist/components/bq-notification.js +1 -1
  261. package/dist/components/bq-option-group.js +1 -1
  262. package/dist/components/bq-option-list.js +1 -1
  263. package/dist/components/bq-option.js +1 -1
  264. package/dist/components/bq-page-title.js +1 -1
  265. package/dist/components/bq-page-title.js.map +1 -1
  266. package/dist/components/bq-panel.js +1 -1
  267. package/dist/components/bq-progress.js +1 -1
  268. package/dist/components/bq-progress.js.map +1 -1
  269. package/dist/components/bq-radio-group.js +1 -1
  270. package/dist/components/bq-radio-group.js.map +1 -1
  271. package/dist/components/bq-radio.js +1 -1
  272. package/dist/components/bq-radio.js.map +1 -1
  273. package/dist/components/bq-select.js +1 -1
  274. package/dist/components/bq-select.js.map +1 -1
  275. package/dist/components/bq-side-menu-item.js +1 -1
  276. package/dist/components/bq-side-menu-item.js.map +1 -1
  277. package/dist/components/bq-side-menu.js +1 -1
  278. package/dist/components/bq-slider.js +1 -1
  279. package/dist/components/bq-slider.js.map +1 -1
  280. package/dist/components/bq-spinner.js +1 -1
  281. package/dist/components/bq-status.js +1 -1
  282. package/dist/components/bq-step-item.js +1 -1
  283. package/dist/components/bq-step-item.js.map +1 -1
  284. package/dist/components/bq-steps.js +1 -1
  285. package/dist/components/bq-steps.js.map +1 -1
  286. package/dist/components/bq-switch.js +1 -1
  287. package/dist/components/bq-tab-group.js +1 -1
  288. package/dist/components/bq-tab-group.js.map +1 -1
  289. package/dist/components/bq-tab.js +1 -1
  290. package/dist/components/bq-tag.js +1 -1
  291. package/dist/components/bq-textarea.js +1 -1
  292. package/dist/components/bq-textarea.js.map +1 -1
  293. package/dist/components/bq-toast.js +1 -1
  294. package/dist/components/bq-toast.js.map +1 -1
  295. package/dist/components/bq-tooltip.js +1 -1
  296. package/dist/components/index.js +1 -1
  297. package/dist/components/index.js.map +1 -1
  298. package/dist/components/{p-DWR8iX59.js → p-9gvSRSmi.js} +2 -2
  299. package/dist/components/{p-CaWrrLKB.js → p-B8eXbMij.js} +2 -2
  300. package/dist/components/{p-CaWrrLKB.js.map → p-B8eXbMij.js.map} +1 -1
  301. package/dist/components/{p-B-HVvLrd.js → p-BUpGMEPS.js} +2 -2
  302. package/dist/components/{p-Cbtgc6ah.js → p-BmdGoExW.js} +2 -2
  303. package/dist/components/{p-D0zwGLLG.js → p-BrcJUBET.js} +2 -2
  304. package/dist/components/p-BsSDkLU5.js +6 -0
  305. package/dist/components/p-BsSDkLU5.js.map +1 -0
  306. package/dist/components/p-BtpBVYE0.js +6 -0
  307. package/dist/components/p-BtpBVYE0.js.map +1 -0
  308. package/dist/components/{p-vH9q8NAw.js → p-C63H4SKY.js} +2 -2
  309. package/dist/components/{p-C0L4R3iu.js → p-DSDQV9S1.js} +2 -2
  310. package/dist/components/{p-Dbba-Ppg.js → p-DWg_PDHj.js} +2 -2
  311. package/dist/components/p-DZoizZde.js +6 -0
  312. package/dist/components/p-DZoizZde.js.map +1 -0
  313. package/dist/components/{p-DpyHfE7c.js → p-DdRiQ0rm.js} +2 -2
  314. package/dist/custom-elements.json +6722 -6619
  315. package/dist/esm/beeq.js +4 -4
  316. package/dist/esm/beeq.js.map +1 -1
  317. package/dist/esm/bq-accordion-group.entry.js +2 -2
  318. package/dist/esm/bq-accordion.entry.js +2 -2
  319. package/dist/esm/bq-alert.entry.js +2 -2
  320. package/dist/esm/bq-avatar.entry.js +2 -2
  321. package/dist/esm/bq-badge.entry.js +2 -2
  322. package/dist/esm/bq-breadcrumb-item.entry.js +2 -2
  323. package/dist/esm/bq-breadcrumb.entry.js +2 -2
  324. package/dist/esm/bq-button_2.entry.js +3 -3
  325. package/dist/esm/bq-card.entry.js +4 -4
  326. package/dist/esm/bq-card.entry.js.map +1 -1
  327. package/dist/esm/bq-checkbox.entry.js +2 -2
  328. package/dist/esm/bq-date-picker.entry.js +3 -3
  329. package/dist/esm/bq-date-picker.entry.js.map +1 -1
  330. package/dist/esm/bq-dialog.entry.js +2 -2
  331. package/dist/esm/bq-divider.entry.js +2 -2
  332. package/dist/esm/bq-drawer.entry.js +6 -6
  333. package/dist/esm/bq-drawer.entry.js.map +1 -1
  334. package/dist/esm/bq-dropdown_2.entry.js +4 -4
  335. package/dist/esm/bq-empty-state.entry.js +2 -2
  336. package/dist/esm/bq-input.entry.js +2 -2
  337. package/dist/esm/bq-notification.entry.js +2 -2
  338. package/dist/esm/bq-option-group.entry.js +2 -2
  339. package/dist/esm/bq-option-list.bq-tag.entry.js.map +1 -1
  340. package/dist/esm/bq-option-list_2.entry.js +6 -6
  341. package/dist/esm/bq-option-list_2.entry.js.map +1 -1
  342. package/dist/esm/bq-option.entry.js +2 -2
  343. package/dist/esm/bq-page-title.entry.js +4 -4
  344. package/dist/esm/bq-page-title.entry.js.map +1 -1
  345. package/dist/esm/bq-progress.entry.js +5 -5
  346. package/dist/esm/bq-progress.entry.js.map +1 -1
  347. package/dist/esm/bq-radio-group.entry.js +206 -99
  348. package/dist/esm/bq-radio-group.entry.js.map +1 -1
  349. package/dist/esm/bq-radio.entry.js +24 -15
  350. package/dist/esm/bq-radio.entry.js.map +1 -1
  351. package/dist/esm/bq-select.entry.js +2 -2
  352. package/dist/esm/bq-select.entry.js.map +1 -1
  353. package/dist/esm/bq-side-menu-item.entry.js +6 -6
  354. package/dist/esm/bq-side-menu-item.entry.js.map +1 -1
  355. package/dist/esm/bq-side-menu.entry.js +4 -4
  356. package/dist/esm/bq-slider.entry.js +7 -5
  357. package/dist/esm/bq-slider.entry.js.map +1 -1
  358. package/dist/esm/bq-spinner.entry.js +6 -6
  359. package/dist/esm/bq-status.entry.js +3 -3
  360. package/dist/esm/bq-step-item.entry.js +38 -15
  361. package/dist/esm/bq-step-item.entry.js.map +1 -1
  362. package/dist/esm/bq-steps.entry.js +18 -7
  363. package/dist/esm/bq-steps.entry.js.map +1 -1
  364. package/dist/esm/bq-switch.entry.js +4 -4
  365. package/dist/esm/bq-tab-group.entry.js +6 -6
  366. package/dist/esm/bq-tab.entry.js +4 -4
  367. package/dist/esm/bq-textarea.entry.js +5 -5
  368. package/dist/esm/bq-toast.entry.js +3 -3
  369. package/dist/esm/bq-tooltip.entry.js +4 -4
  370. package/dist/esm/bq-tooltip.entry.js.map +1 -1
  371. package/dist/esm/{getNextElement-4iHDua0i.js → getNextElement-BsSDkLU5.js} +4 -4
  372. package/dist/esm/getNextElement-BsSDkLU5.js.map +1 -0
  373. package/dist/esm/{index-DJ_hypV7.js → index-BtpBVYE0.js} +56 -32
  374. package/dist/esm/index-BtpBVYE0.js.map +1 -0
  375. package/dist/esm/{index-BZCppx8n.js → index-C4jSqdYP.js} +546 -168
  376. package/dist/esm/index-C4jSqdYP.js.map +1 -0
  377. package/dist/esm/index.js +1 -1
  378. package/dist/esm/loader.js +3 -3
  379. package/dist/hydrate/index.js +778 -439
  380. package/dist/hydrate/index.mjs +778 -439
  381. package/dist/stencil.config.js +1 -0
  382. package/dist/stencil.config.js.map +1 -1
  383. package/dist/types/components/date-picker/bq-date-picker.d.ts +1 -1
  384. package/dist/types/components/radio/bq-radio.d.ts +15 -7
  385. package/dist/types/components/radio-group/bq-radio-group.d.ts +57 -16
  386. package/dist/types/components/side-menu-item/bq-side-menu-item.d.ts +2 -5
  387. package/dist/types/components/step-item/bq-step-item.d.ts +10 -6
  388. package/dist/types/components/steps/bq-steps.d.ts +5 -0
  389. package/dist/types/components.d.ts +42 -33
  390. package/dist/types/shared/test-utils/index.d.ts +1 -0
  391. package/dist/types/shared/test-utils/setProperties.d.ts +1 -1
  392. package/dist/types/shared/test-utils/waitForSvgLoad.d.ts +19 -0
  393. package/dist/types/shared/utils/getNextElement.d.ts +2 -2
  394. package/dist/types/stencil-public-runtime.d.ts +12 -5
  395. package/package.json +1 -1
  396. package/dist/beeq/p-1a52ac27.entry.js +0 -6
  397. package/dist/beeq/p-4iHDua0i.js.map +0 -1
  398. package/dist/beeq/p-59209ae4.entry.js +0 -6
  399. package/dist/beeq/p-59209ae4.entry.js.map +0 -1
  400. package/dist/beeq/p-5a4768b2.entry.js +0 -6
  401. package/dist/beeq/p-5a4768b2.entry.js.map +0 -1
  402. package/dist/beeq/p-6abd3dbb.entry.js +0 -6
  403. package/dist/beeq/p-6abd3dbb.entry.js.map +0 -1
  404. package/dist/beeq/p-6f24fea1.entry.js.map +0 -1
  405. package/dist/beeq/p-BZCppx8n.js +0 -7
  406. package/dist/beeq/p-BZCppx8n.js.map +0 -1
  407. package/dist/beeq/p-DJ_hypV7.js +0 -6
  408. package/dist/beeq/p-DJ_hypV7.js.map +0 -1
  409. package/dist/beeq/p-d0d85576.entry.js +0 -6
  410. package/dist/beeq/p-d0d85576.entry.js.map +0 -1
  411. package/dist/cjs/getNextElement-B5h_gmRG.js.map +0 -1
  412. package/dist/cjs/index-CD2anR4A.js.map +0 -1
  413. package/dist/cjs/index-CbmPaaDD.js.map +0 -1
  414. package/dist/components/p-C-PPt5Je.js +0 -6
  415. package/dist/components/p-C-PPt5Je.js.map +0 -1
  416. package/dist/components/p-DJ_hypV7.js +0 -6
  417. package/dist/components/p-DJ_hypV7.js.map +0 -1
  418. package/dist/esm/getNextElement-4iHDua0i.js.map +0 -1
  419. package/dist/esm/index-BZCppx8n.js.map +0 -1
  420. package/dist/esm/index-DJ_hypV7.js.map +0 -1
  421. /package/dist/beeq/{p-d5e90f0c.entry.js.map → p-00f6ab04.entry.js.map} +0 -0
  422. /package/dist/beeq/{p-62613d0d.entry.js.map → p-01d832d0.entry.js.map} +0 -0
  423. /package/dist/beeq/{p-b6a03fdd.entry.js.map → p-12249759.entry.js.map} +0 -0
  424. /package/dist/beeq/{p-c6773ae2.entry.js.map → p-1a19b5fa.entry.js.map} +0 -0
  425. /package/dist/beeq/{p-6e523256.entry.js.map → p-1cd5bf89.entry.js.map} +0 -0
  426. /package/dist/beeq/{p-58f07415.entry.js.map → p-3464beb1.entry.js.map} +0 -0
  427. /package/dist/beeq/{p-7deffb9e.entry.js.map → p-38b70ecf.entry.js.map} +0 -0
  428. /package/dist/beeq/{p-9d5293fe.entry.js.map → p-3bac8fc4.entry.js.map} +0 -0
  429. /package/dist/beeq/{p-a2c91633.entry.js.map → p-4a3d974a.entry.js.map} +0 -0
  430. /package/dist/beeq/{p-96a76f8d.entry.js.map → p-50b2fd06.entry.js.map} +0 -0
  431. /package/dist/beeq/{p-da447add.entry.js.map → p-55017e05.entry.js.map} +0 -0
  432. /package/dist/beeq/{p-71b947ad.entry.js.map → p-58541f26.entry.js.map} +0 -0
  433. /package/dist/beeq/{p-355a197e.entry.js.map → p-7eb5259f.entry.js.map} +0 -0
  434. /package/dist/beeq/{p-415691fd.entry.js.map → p-a1ad0e09.entry.js.map} +0 -0
  435. /package/dist/beeq/{p-0fc66165.entry.js.map → p-a9070048.entry.js.map} +0 -0
  436. /package/dist/beeq/{p-e3eb683b.entry.js.map → p-afb356b4.entry.js.map} +0 -0
  437. /package/dist/beeq/{p-f79665be.entry.js.map → p-b3f103da.entry.js.map} +0 -0
  438. /package/dist/beeq/{p-6891bdf1.entry.js.map → p-bb038cc5.entry.js.map} +0 -0
  439. /package/dist/beeq/{p-4a77e03c.entry.js.map → p-c00bcbe6.entry.js.map} +0 -0
  440. /package/dist/beeq/{p-7a110f32.entry.js.map → p-c5b7bad2.entry.js.map} +0 -0
  441. /package/dist/beeq/{p-a35b4722.entry.js.map → p-d4b0dcda.entry.js.map} +0 -0
  442. /package/dist/beeq/{p-01e2d9a2.entry.js.map → p-d58133b8.entry.js.map} +0 -0
  443. /package/dist/beeq/{p-1f758004.entry.js.map → p-e2b24948.entry.js.map} +0 -0
  444. /package/dist/beeq/{p-33a39834.entry.js.map → p-f738ef10.entry.js.map} +0 -0
  445. /package/dist/beeq/{p-be4a88df.entry.js.map → p-fc2f0022.entry.js.map} +0 -0
  446. /package/dist/components/{p-DWR8iX59.js.map → p-9gvSRSmi.js.map} +0 -0
  447. /package/dist/components/{p-B-HVvLrd.js.map → p-BUpGMEPS.js.map} +0 -0
  448. /package/dist/components/{p-Cbtgc6ah.js.map → p-BmdGoExW.js.map} +0 -0
  449. /package/dist/components/{p-D0zwGLLG.js.map → p-BrcJUBET.js.map} +0 -0
  450. /package/dist/components/{p-vH9q8NAw.js.map → p-C63H4SKY.js.map} +0 -0
  451. /package/dist/components/{p-C0L4R3iu.js.map → p-DSDQV9S1.js.map} +0 -0
  452. /package/dist/components/{p-Dbba-Ppg.js.map → p-DWg_PDHj.js.map} +0 -0
  453. /package/dist/components/{p-DpyHfE7c.js.map → p-DdRiQ0rm.js.map} +0 -0
@@ -2,9 +2,15 @@
2
2
  * Built by Endavans
3
3
  * © https://beeq.design - Apache 2 License.
4
4
  */
5
- import { h } from "@stencil/core";
5
+ import { h, Host } from "@stencil/core";
6
6
  import { RADIO_GROUP_ORIENTATION } from "./bq-radio-group.types";
7
- import { debounce, isHTMLElement, isNil, validatePropValue } from "../../shared/utils";
7
+ import { debounce, getNextElement, isEventTargetChildOfElement, isNil, validatePropValue, } from "../../shared/utils";
8
+ const KEY_MAP = {
9
+ ArrowDown: 'forward',
10
+ ArrowRight: 'forward',
11
+ ArrowUp: 'backward',
12
+ ArrowLeft: 'backward',
13
+ };
8
14
  /**
9
15
  * The radio group is a user interface component that groups radio buttons to enable a single selection within the group.
10
16
  *
@@ -47,8 +53,11 @@ import { debounce, isHTMLElement, isNil, validatePropValue } from "../../shared/
47
53
  export class BqRadioGroup {
48
54
  // Own Properties
49
55
  // ====================
50
- focusedBqRadio = null;
56
+ initialValue;
51
57
  debouncedBqChange;
58
+ focusedBqRadio = null;
59
+ radioElementsSet = new Set();
60
+ cachedRadioElements = [];
52
61
  // Reference to host HTML element
53
62
  // ===================================
54
63
  internals;
@@ -56,6 +65,8 @@ export class BqRadioGroup {
56
65
  // State() variables
57
66
  // Inlined decorator, alphabetical order
58
67
  // =======================================
68
+ checkedRadio;
69
+ tabIndex = '0';
59
70
  // Public Property API
60
71
  // ========================
61
72
  /** If true, all radio inputs in the group will display a background on hover */
@@ -78,33 +89,42 @@ export class BqRadioGroup {
78
89
  value;
79
90
  // Prop lifecycle events
80
91
  // =======================
92
+ handleDebounceTimeChange() {
93
+ const MIN_DEBOUNCE_TIME = 0;
94
+ const normalizedDebounceTime = Math.max(MIN_DEBOUNCE_TIME, this.debounceTime);
95
+ if (normalizedDebounceTime !== this.debounceTime) {
96
+ this.debounceTime = normalizedDebounceTime;
97
+ }
98
+ this.debouncedBqChange?.cancel();
99
+ this.debouncedBqChange = debounce((event) => {
100
+ this.bqChange?.emit(event);
101
+ }, this.debounceTime);
102
+ }
103
+ handleDisabledChange() {
104
+ this.tabIndex = this.disabled ? '-1' : '0';
105
+ this.updateRadioTabIndexes();
106
+ }
81
107
  handleGroupProperties() {
82
- if (!this.bqRadioElements)
83
- return;
84
- this.bqRadioElements.forEach((bqRadio) => {
85
- bqRadio.backgroundOnHover = this.backgroundOnHover;
86
- bqRadio.checked = !isNil(this.value) ? bqRadio.value === this.value : false;
87
- bqRadio.disabled = this.disabled;
88
- bqRadio.name = this.name;
89
- bqRadio.required = this.required;
90
- });
108
+ this.updateRadioProperties();
91
109
  }
92
110
  checkPropValues() {
93
111
  validatePropValue(RADIO_GROUP_ORIENTATION, 'vertical', this.el, 'orientation');
94
112
  }
95
- checkDebounceChange() {
96
- if (this.debounceTime < 0) {
97
- this.debounceTime = Math.max(0, this.debounceTime);
113
+ handleRequiredChange() {
114
+ this.updateFormValidity();
115
+ }
116
+ handleValueChange() {
117
+ this.updateRadioProperties();
118
+ this.updateFormValidity();
119
+ // Find and update the checked radio based on the new value
120
+ const newCheckedRadio = this.cachedRadioElements.find((radio) => radio.value === this.value);
121
+ if (newCheckedRadio) {
122
+ this.checkedRadio = newCheckedRadio;
123
+ this.debouncedBqChange?.({ value: this.value, target: newCheckedRadio });
98
124
  }
99
- if (this.debouncedBqChange) {
100
- this.debouncedBqChange.cancel();
125
+ else {
126
+ this.checkedRadio = undefined;
101
127
  }
102
- this.debouncedBqChange = debounce((event) => {
103
- this.bqChange.emit(event);
104
- }, this.debounceTime);
105
- }
106
- async handleRequiredChange() {
107
- await this.updateFormValidity();
108
128
  }
109
129
  // Events section
110
130
  // Requires JSDocs for public API documentation
@@ -115,68 +135,65 @@ export class BqRadioGroup {
115
135
  // Ordered by their natural call order
116
136
  // =====================================
117
137
  componentWillLoad() {
118
- this.checkPropValues();
119
- this.checkDebounceChange();
120
- this.internals.setFormValue(this.value);
138
+ this.initialValue = this.value;
139
+ this.handleDebounceTimeChange();
140
+ this.internals.setFormValue(this.value ?? null);
141
+ this.updateCustomStates();
142
+ this.updateFormValidity();
121
143
  }
122
- componentDidLoad() {
123
- this.handleGroupProperties();
144
+ disconnectedCallback() {
145
+ this.debouncedBqChange?.cancel();
124
146
  }
125
- async formAssociatedCallback() {
126
- this.internals.setFormValue(this.value);
127
- await this.updateFormValidity();
147
+ formAssociatedCallback() {
148
+ this.internals.setFormValue(this.value ?? null);
149
+ this.updateFormValidity();
128
150
  }
129
151
  formResetCallback() {
130
- this.value = null;
131
- this.internals.setFormValue(this.value);
152
+ this.value = this.initialValue;
153
+ this.internals.setFormValue(this.value ?? null);
154
+ this.updateFormValidity();
155
+ this.updateCustomStates();
132
156
  }
133
157
  // Listeners
134
158
  // ==============
135
- onMouseDown(event) {
136
- if (!isNil(this.focusedBqRadio) && isHTMLElement(event.target, 'bq-radio') && this.el.contains(event.target)) {
137
- this.focusedBqRadio = event.target;
138
- }
139
- }
140
- onBqClick(event) {
141
- if (isNil(this.focusedBqRadio)) {
142
- this.focusedBqRadio = event.detail;
143
- }
144
- if (event.detail.value === this.value)
159
+ async onBqClick(event) {
160
+ if (!isEventTargetChildOfElement(event, this.el))
145
161
  return;
146
- const target = event.detail;
147
- this.bqRadioElements.forEach((bqRadioElement) => (bqRadioElement.checked = bqRadioElement === target));
148
- this.setCheckedRadioItem(event.detail);
162
+ const { target, value } = event.detail;
163
+ if (value === this.value)
164
+ return;
165
+ requestAnimationFrame(() => {
166
+ if (event.defaultPrevented)
167
+ return;
168
+ this.updateRadioSelection(target);
169
+ });
149
170
  }
150
171
  onBqKeyDown(event) {
151
- const { target } = event;
152
- if (!isHTMLElement(target, 'bq-radio'))
172
+ if (!isEventTargetChildOfElement(event, this.el))
153
173
  return;
154
- switch (event.detail.key) {
155
- case 'ArrowDown':
156
- case 'ArrowRight': {
157
- this.focusRadioInputSibling(target, true);
158
- break;
159
- }
160
- case 'ArrowUp':
161
- case 'ArrowLeft': {
162
- this.focusRadioInputSibling(target, false);
163
- break;
164
- }
165
- default:
166
- }
174
+ const direction = KEY_MAP[event.detail.key];
175
+ if (!direction)
176
+ return;
177
+ this.focusRadioInputSibling(event.detail.target, direction);
167
178
  }
168
179
  onBqFocus(event) {
169
- if (event.detail !== this.focusedBqRadio)
180
+ if (!isEventTargetChildOfElement(event, this.el))
170
181
  return;
171
- event.stopPropagation();
182
+ const shouldStopPropagation = this.focusedBqRadio && event.detail !== this.focusedBqRadio;
183
+ if (shouldStopPropagation) {
184
+ event.stopPropagation();
185
+ }
186
+ this.focusedBqRadio = event.detail;
172
187
  }
173
188
  onBqBlur(event) {
174
- if (!isNil(this.focusedBqRadio) && event.detail !== this.focusedBqRadio) {
189
+ if (!isEventTargetChildOfElement(event, this.el))
190
+ return;
191
+ const shouldStopPropagation = this.focusedBqRadio && event.detail !== this.focusedBqRadio;
192
+ if (shouldStopPropagation) {
175
193
  event.stopPropagation();
194
+ return;
176
195
  }
177
- else {
178
- this.focusedBqRadio = null;
179
- }
196
+ this.focusedBqRadio = null;
180
197
  }
181
198
  // Public methods API
182
199
  // These methods are exposed on the host element.
@@ -188,55 +205,143 @@ export class BqRadioGroup {
188
205
  // Internal business logic.
189
206
  // These methods cannot be called from the host element.
190
207
  // =======================================================
191
- focusRadioInputSibling = (currentTarget, next) => {
192
- this.bqRadioElements.forEach((bqRadioElement, index, elements) => {
193
- if (bqRadioElement === currentTarget) {
194
- const target = this.getNextRadioElement(elements, index, next);
195
- currentTarget.checked = false;
196
- target.vFocus();
197
- this.setCheckedRadioItem(target);
198
- }
208
+ /**
209
+ * Initializes the radio elements set by querying the host element for `ds-radio` elements.
210
+ * This is done to avoid re-querying the host element for radio elements on every change.
211
+ */
212
+ initializeRadioElements = () => {
213
+ this.radioElementsSet.clear();
214
+ this.el.querySelectorAll('bq-radio').forEach((radio) => this.radioElementsSet.add(radio));
215
+ // Caching the radio elements in an array for faster access and iteration
216
+ this.cachedRadioElements = Array.from(this.radioElementsSet);
217
+ // Set the tabIndex of the host element to -1 if there are no radio elements or the group is disabled, otherwise set it to 0
218
+ this.tabIndex = this.cachedRadioElements.length === 0 || this.disabled ? '-1' : '0';
219
+ // Set initial tabIndex for all radios
220
+ this.updateRadioTabIndexes();
221
+ };
222
+ /**
223
+ * Sets tabIndex for all radio elements based on current state
224
+ * Handles all scenarios: disabled state, checked radio, value matching, fallback to first
225
+ */
226
+ updateRadioTabIndexes = () => {
227
+ if (this.cachedRadioElements.length === 0)
228
+ return;
229
+ // If disabled, all radios get tabIndex -1
230
+ if (this.disabled) {
231
+ this.cachedRadioElements.forEach((radio) => (radio.tabIndex = -1));
232
+ return;
233
+ }
234
+ // Find which radio should be focusable
235
+ let focusableRadio;
236
+ // Priority 1: Currently checked radio
237
+ focusableRadio = this.cachedRadioElements.find((radio) => radio.checked);
238
+ // Priority 2: Radio matching current value
239
+ if (!focusableRadio && this.value) {
240
+ focusableRadio = this.cachedRadioElements.find((radio) => radio.value === this.value);
241
+ }
242
+ // Priority 3: First enabled radio (fallback)
243
+ if (!focusableRadio) {
244
+ focusableRadio = this.cachedRadioElements.find((radio) => !radio.disabled);
245
+ }
246
+ // Apply tabIndex to all radios
247
+ this.cachedRadioElements.forEach((radio) => {
248
+ radio.tabIndex = radio === focusableRadio ? 0 : -1;
199
249
  });
200
250
  };
201
- setCheckedRadioItem = (target) => {
202
- const { value } = target;
251
+ /**
252
+ * Updates the radio selection and focus.
253
+ * @param target - The radio element to update.
254
+ */
255
+ updateRadioSelection = (target) => {
256
+ // Only uncheck the previously checked radio if it's different
257
+ if (this.checkedRadio && this.checkedRadio !== target) {
258
+ this.checkedRadio.checked = false;
259
+ this.checkedRadio.tabIndex = -1;
260
+ }
203
261
  target.checked = true;
204
- this.value = value;
205
- this.focusedBqRadio = target;
206
- this.internals.setFormValue(value);
207
- this.debouncedBqChange({ value, target });
262
+ target.tabIndex = 0;
263
+ target.vFocus();
264
+ this.checkedRadio = target;
265
+ this.value = target.value;
266
+ this.internals?.setFormValue(this.value ?? null);
267
+ this.updateRadioTabIndexes();
208
268
  };
209
- getNextRadioElement = (elements, index, forward = true) => {
210
- let element = null;
211
- let elementIndex = index;
212
- do {
213
- elementIndex = (elements.length + (elementIndex + (forward ? 1 : -1))) % elements.length;
214
- element = elements[elementIndex];
215
- } while (element.disabled);
216
- return element;
269
+ /**
270
+ * Synchronizes properties of child radio elements with the group's state.
271
+ */
272
+ updateRadioProperties = () => {
273
+ if (this.cachedRadioElements.length === 0)
274
+ return;
275
+ const { backgroundOnHover, disabled, name, required, value } = this;
276
+ for (const radio of this.cachedRadioElements) {
277
+ radio.backgroundOnHover = backgroundOnHover;
278
+ radio.checked = value === radio.value;
279
+ // This will allows us to force all radio elements to be disabled
280
+ // while keeping the disabled state of the radio element if it was set individually by the user
281
+ radio.forceDisabled = disabled;
282
+ radio.name = name;
283
+ radio.required = required;
284
+ }
285
+ };
286
+ /**
287
+ * Focuses the next/previous radio element in the group based on the current target.
288
+ * Handles circular navigation and skips disabled elements.
289
+ * @param currentTarget - The currently focused radio element
290
+ * @param direction - The navigation direction ('forward' | 'backward')
291
+ */
292
+ focusRadioInputSibling = (currentTarget, direction) => {
293
+ // If there is none or only one radio element, there will be no sibling to focus
294
+ if (this.cachedRadioElements.length <= 1)
295
+ return;
296
+ const currentIndex = this.cachedRadioElements.indexOf(currentTarget);
297
+ // If the index of the radio element target is not found, it means that it's not part of the group
298
+ if (currentIndex === -1)
299
+ return;
300
+ const nextElement = getNextElement(this.cachedRadioElements, currentIndex, direction);
301
+ this.updateRadioSelection(nextElement);
217
302
  };
218
303
  updateFormValidity = async () => {
219
304
  const { internals, required, requiredValidationMessage, value } = this;
220
305
  // Clear the validity state
221
306
  internals?.states.clear();
222
307
  if (!required || (required && !isNil(value))) {
223
- // If the checkbox is not required or is checked, set the validity state to valid
308
+ // If the radio group is not required or has a value, set the validity state to valid
224
309
  internals?.states.add('valid');
225
310
  internals?.setValidity({});
226
311
  return;
227
312
  }
228
- // If the checkbox is required and not checked, set the validity state to invalid
313
+ const firstRadio = this.cachedRadioElements[0];
314
+ if (!firstRadio)
315
+ return;
316
+ // If the radio group is required and has no value, set the validity state to invalid
229
317
  internals?.states.add('invalid');
230
- internals?.setValidity({ valueMissing: true }, requiredValidationMessage, await this.bqRadioElements[0].getNativeInput());
318
+ // We need to pass the native input element to the setValidity method as anchor element
319
+ internals?.setValidity({ valueMissing: true }, requiredValidationMessage ?? 'Please select an option', await firstRadio.getNativeInput());
320
+ };
321
+ /**
322
+ * Updates the custom states based on the component properties.
323
+ * The custom states can be used to style the component based on the component properties.
324
+ * The custom states are `disabled`, based on the component properties.
325
+ */
326
+ updateCustomStates = () => {
327
+ const states = new Set();
328
+ if (this.disabled)
329
+ states.add('disabled');
330
+ if (this.orientation)
331
+ states.add(this.orientation);
332
+ // Update states
333
+ this.internals?.states.clear();
334
+ states.forEach((state) => this.internals?.states.add(state));
335
+ };
336
+ handleSlotChange = () => {
337
+ this.initializeRadioElements();
338
+ this.updateRadioProperties();
231
339
  };
232
- get bqRadioElements() {
233
- return Array.from(this.el.querySelectorAll('bq-radio'));
234
- }
235
340
  // render() function
236
341
  // Always the last one in the class.
237
342
  // ===================================
238
343
  render() {
239
- return (h("fieldset", { key: 'f6802fdedbf33e5863a68e159d1add1dfc3df7a8', class: { 'bq-radio-group': true, 'has-fieldset': this.fieldset }, "aria-labelledby": "bq-radio-group__label", "aria-controls": "bq-radiogroup", role: "radiogroup", part: "base" }, h("legend", { key: '379b6151d63422ed543b7c520ff035f6ae4154a0', part: "label" }, h("slot", { key: '622478a3c8c4acb4d656aef8bedbc7961e5aa6e1', id: "bq-radiogroup__label", name: "label" })), h("div", { key: 'e993a782177088dafd25b49a693e6dcf8255b2c2', class: `bq-radio-group--${this.orientation}`, part: "group" }, h("slot", { key: 'cf52a7bdd57bc4e6204ec4355a2c335bd6a4b7e4', id: "bq-radiogroup" }))));
344
+ return (h(Host, { key: '0f3d7f7b43b4d98eaee94ffa79ad0e23c0f80cd9', tabindex: this.tabIndex }, h("fieldset", { key: 'e48c6c15370dd881ed26b7df9e578350f3a42e34', class: { 'bq-radio-group': true, 'has-fieldset': this.fieldset }, "aria-controls": "bq-radiogroup", "aria-labelledby": "bq-radio-group__label", "aria-disabled": this.disabled, "aria-required": this.required, disabled: this.disabled, role: "radiogroup", part: "base" }, h("legend", { key: '56faba3e726d627fe1b76f96d2eb0dc352c72165', part: "label" }, h("slot", { key: '87ae7a460396a150e136123be5b895f2e50b229e', id: "bq-radiogroup__label", name: "label" })), h("div", { key: '6aad53784020d3e1a4fe1a22d4e53812f6311058', class: `bq-radio-group--${this.orientation}`, part: "group" }, h("slot", { key: '9753cae782f6e3e4a2a419d31d786b7d838336bd', id: "bq-radiogroup", onSlotchange: this.handleSlotChange })))));
240
345
  }
241
346
  static get is() { return "bq-radio-group"; }
242
347
  static get encapsulation() { return "shadow"; }
@@ -264,7 +369,7 @@ export class BqRadioGroup {
264
369
  "references": {}
265
370
  },
266
371
  "required": false,
267
- "optional": true,
372
+ "optional": false,
268
373
  "docs": {
269
374
  "tags": [],
270
375
  "text": "If true, all radio inputs in the group will display a background on hover"
@@ -304,7 +409,7 @@ export class BqRadioGroup {
304
409
  "references": {}
305
410
  },
306
411
  "required": false,
307
- "optional": true,
412
+ "optional": false,
308
413
  "docs": {
309
414
  "tags": [],
310
415
  "text": "If true radio inputs are disabled"
@@ -324,7 +429,7 @@ export class BqRadioGroup {
324
429
  "references": {}
325
430
  },
326
431
  "required": false,
327
- "optional": true,
432
+ "optional": false,
328
433
  "docs": {
329
434
  "tags": [],
330
435
  "text": "If true displays fieldset"
@@ -369,7 +474,7 @@ export class BqRadioGroup {
369
474
  }
370
475
  },
371
476
  "required": false,
372
- "optional": true,
477
+ "optional": false,
373
478
  "docs": {
374
479
  "tags": [],
375
480
  "text": "The display orientation of the radio inputs"
@@ -389,7 +494,7 @@ export class BqRadioGroup {
389
494
  "references": {}
390
495
  },
391
496
  "required": false,
392
- "optional": true,
497
+ "optional": false,
393
498
  "docs": {
394
499
  "tags": [],
395
500
  "text": "If true, the radio group is required"
@@ -439,6 +544,12 @@ export class BqRadioGroup {
439
544
  }
440
545
  };
441
546
  }
547
+ static get states() {
548
+ return {
549
+ "checkedRadio": {},
550
+ "tabIndex": {}
551
+ };
552
+ }
442
553
  static get events() {
443
554
  return [{
444
555
  "method": "bqChange",
@@ -465,6 +576,12 @@ export class BqRadioGroup {
465
576
  static get elementRef() { return "el"; }
466
577
  static get watchers() {
467
578
  return [{
579
+ "propName": "debounceTime",
580
+ "methodName": "handleDebounceTimeChange"
581
+ }, {
582
+ "propName": "disabled",
583
+ "methodName": "handleDisabledChange"
584
+ }, {
468
585
  "propName": "backgroundOnHover",
469
586
  "methodName": "handleGroupProperties"
470
587
  }, {
@@ -476,35 +593,23 @@ export class BqRadioGroup {
476
593
  }, {
477
594
  "propName": "required",
478
595
  "methodName": "handleGroupProperties"
479
- }, {
480
- "propName": "value",
481
- "methodName": "handleGroupProperties"
482
596
  }, {
483
597
  "propName": "orientation",
484
598
  "methodName": "checkPropValues"
485
- }, {
486
- "propName": "debounceTime",
487
- "methodName": "checkDebounceChange"
488
599
  }, {
489
600
  "propName": "required",
490
601
  "methodName": "handleRequiredChange"
491
602
  }, {
492
603
  "propName": "value",
493
- "methodName": "handleRequiredChange"
604
+ "methodName": "handleValueChange"
494
605
  }];
495
606
  }
496
607
  static get listeners() {
497
608
  return [{
498
- "name": "mousedown",
499
- "method": "onMouseDown",
500
- "target": "body",
501
- "capture": false,
502
- "passive": true
503
- }, {
504
609
  "name": "bqClick",
505
610
  "method": "onBqClick",
506
611
  "target": undefined,
507
- "capture": false,
612
+ "capture": true,
508
613
  "passive": false
509
614
  }, {
510
615
  "name": "bqKeyDown",
@@ -1 +1 @@
1
- {"version":3,"file":"bq-radio-group.js","sourceRoot":"","sources":["../../../../../../packages/beeq/src/components/radio-group/bq-radio-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, Event, h, Listen, Prop, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\nimport { RADIO_GROUP_ORIENTATION } from './bq-radio-group.types';\nimport type { TRadioGroupOrientation } from './bq-radio-group.types';\nimport { debounce, isHTMLElement, isNil, TDebounce, validatePropValue } from '../../shared/utils';\n\n/**\n * The radio group is a user interface component that groups radio buttons to enable a single selection within the group.\n *\n * @example How to use it\n * ```html\n * <bq-radio-group fieldset value=\"option1\">\n * <span slot=\"label\">radio group</span>\n * <bq-radio value=\"option1\">Radio option 1</bq-radio>\n * <bq-radio value=\"option2\">Radio option 2</bq-radio>\n * <bq-radio value=\"option3\">Radio option 3</bq-radio>\n * </bq-radio-group>\n * ```\n *\n * @documentation https://www.beeq.design/3d466e231/p/9718e1-radio-button/b/09d7b1\n * @status stable\n *\n * @attr {boolean} background-on-hover - If `true`, the radio displays background on hover\n * @attr {number} debounce-time - A number representing the delay time (in milliseconds) that bqChange event handler gets triggered once the value change\n * @attr {boolean} disabled - If `true` radio inputs are disabled\n * @attr {boolean} fieldset - If `true` displays fieldset\n * @attr {string} name - Name of the HTML input form control. Submitted with the form as part of a name/value pair\n * @attr {\"horizontal\" | \"vertical\"} orientation - The display orientation of the radio inputs\n * @attr {boolean} required - If `true`, the radio group is required\n * @attr {string} required-validation-message - The native form validation message when the radio group is required\n * @attr {string} value - The display orientation of the radio inputs\n *\n * @method vClick - Simulate a click event on the native `<input>` HTML element used under the hood\n * @method vFocus - Sets focus on the native `<input>` HTML element used under the hood\n * @method vBlur - Remove focus from the native `<input>` HTML element used under the hood\n *\n * @event bqChange - Handler to be called when the radio state changes\n *\n * @slot - The bq-radio items to group\n * @slot label - The label content of radio group\n *\n * @part base - The component's internal wrapper of the radio components.\n * @part label - The `<legend>` element that holds the text content.\n * @part group - The `<div>` element that holds the radio inputs.\n */\n@Component({\n tag: 'bq-radio-group',\n styleUrl: './scss/bq-radio-group.scss',\n formAssociated: true,\n shadow: {\n delegatesFocus: true,\n },\n})\nexport class BqRadioGroup {\n // Own Properties\n // ====================\n\n private focusedBqRadio: HTMLBqRadioElement | null = null;\n private debouncedBqChange: TDebounce<{ value: string; target: HTMLBqRadioElement }>;\n\n // Reference to host HTML element\n // ===================================\n\n @AttachInternals() internals!: ElementInternals;\n @Element() el!: HTMLBqRadioGroupElement;\n\n // State() variables\n // Inlined decorator, alphabetical order\n // =======================================\n\n // Public Property API\n // ========================\n\n /** If true, all radio inputs in the group will display a background on hover */\n @Prop({ reflect: true }) backgroundOnHover? = false;\n\n /** A number representing the delay time (in milliseconds) that `bqChange` event handler gets triggered once the value change */\n @Prop({ reflect: true, mutable: true }) debounceTime = 0;\n\n /** If true radio inputs are disabled */\n @Prop({ reflect: true }) disabled? = false;\n\n /** If true displays fieldset */\n @Prop({ reflect: true }) fieldset? = false;\n\n /** Name of the HTML input form control. Submitted with the form as part of a name/value pair. */\n @Prop({ reflect: true }) name!: string;\n\n /** The display orientation of the radio inputs */\n @Prop({ reflect: true, mutable: true }) orientation?: TRadioGroupOrientation = 'vertical';\n\n /** If true, the radio group is required */\n @Prop({ reflect: true }) required? = false;\n\n /** The native form validation message when the radio group is required */\n @Prop({ reflect: true }) requiredValidationMessage?: string;\n\n /** A string representing the value of the radio. */\n @Prop({ reflect: true, mutable: true }) value?: string;\n\n // Prop lifecycle events\n // =======================\n\n @Watch('backgroundOnHover')\n @Watch('disabled')\n @Watch('name')\n @Watch('required')\n @Watch('value')\n handleGroupProperties() {\n if (!this.bqRadioElements) return;\n\n this.bqRadioElements.forEach((bqRadio) => {\n bqRadio.backgroundOnHover = this.backgroundOnHover;\n bqRadio.checked = !isNil(this.value) ? bqRadio.value === this.value : false;\n bqRadio.disabled = this.disabled;\n bqRadio.name = this.name;\n bqRadio.required = this.required;\n });\n }\n\n @Watch('orientation')\n checkPropValues() {\n validatePropValue(RADIO_GROUP_ORIENTATION, 'vertical', this.el, 'orientation');\n }\n\n @Watch('debounceTime')\n checkDebounceChange() {\n if (this.debounceTime < 0) {\n this.debounceTime = Math.max(0, this.debounceTime);\n }\n\n if (this.debouncedBqChange) {\n this.debouncedBqChange.cancel();\n }\n\n this.debouncedBqChange = debounce((event: Parameters<typeof this.debouncedBqChange>[0]) => {\n this.bqChange.emit(event);\n }, this.debounceTime);\n }\n\n @Watch('required')\n @Watch('value')\n async handleRequiredChange() {\n await this.updateFormValidity();\n }\n\n // Events section\n // Requires JSDocs for public API documentation\n // ==============================================\n\n /** Handler to be called when the radio state changes */\n @Event() bqChange: EventEmitter<{ value: string; target: HTMLBqRadioElement }>;\n\n // Component lifecycle events\n // Ordered by their natural call order\n // =====================================\n\n componentWillLoad() {\n this.checkPropValues();\n this.checkDebounceChange();\n this.internals.setFormValue(this.value);\n }\n\n componentDidLoad() {\n this.handleGroupProperties();\n }\n\n async formAssociatedCallback() {\n this.internals.setFormValue(this.value);\n await this.updateFormValidity();\n }\n\n formResetCallback() {\n this.value = null;\n this.internals.setFormValue(this.value);\n }\n\n // Listeners\n // ==============\n\n @Listen('mousedown', { target: 'body', passive: true })\n onMouseDown(event: MouseEvent) {\n if (!isNil(this.focusedBqRadio) && isHTMLElement(event.target, 'bq-radio') && this.el.contains(event.target)) {\n this.focusedBqRadio = event.target;\n }\n }\n\n @Listen('bqClick')\n onBqClick(event: CustomEvent<HTMLBqRadioElement>) {\n if (isNil(this.focusedBqRadio)) {\n this.focusedBqRadio = event.detail;\n }\n\n if (event.detail.value === this.value) return;\n\n const target = event.detail;\n this.bqRadioElements.forEach((bqRadioElement) => (bqRadioElement.checked = bqRadioElement === target));\n this.setCheckedRadioItem(event.detail);\n }\n\n @Listen('bqKeyDown')\n onBqKeyDown(event: CustomEvent<KeyboardEvent>) {\n const { target } = event;\n\n if (!isHTMLElement(target, 'bq-radio')) return;\n\n switch (event.detail.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n this.focusRadioInputSibling(target, true);\n break;\n }\n\n case 'ArrowUp':\n case 'ArrowLeft': {\n this.focusRadioInputSibling(target, false);\n break;\n }\n\n default:\n }\n }\n\n @Listen('bqFocus', { capture: true })\n onBqFocus(event: CustomEvent<HTMLBqRadioElement>) {\n if (event.detail !== this.focusedBqRadio) return;\n\n event.stopPropagation();\n }\n\n @Listen('bqBlur', { capture: true })\n onBqBlur(event: CustomEvent<HTMLBqRadioElement>) {\n if (!isNil(this.focusedBqRadio) && event.detail !== this.focusedBqRadio) {\n event.stopPropagation();\n } else {\n this.focusedBqRadio = null;\n }\n }\n\n // Public methods API\n // These methods are exposed on the host element.\n // Always use two lines.\n // Public Methods must be async.\n // Requires JSDocs for public API documentation.\n // ===============================================\n\n // Local methods\n // Internal business logic.\n // These methods cannot be called from the host element.\n // =======================================================\n\n private focusRadioInputSibling = (currentTarget: HTMLBqRadioElement, next: boolean): void => {\n this.bqRadioElements.forEach((bqRadioElement, index, elements) => {\n if (bqRadioElement === currentTarget) {\n const target = this.getNextRadioElement(elements, index, next);\n\n currentTarget.checked = false;\n\n target.vFocus();\n this.setCheckedRadioItem(target);\n }\n });\n };\n\n private setCheckedRadioItem = (target: HTMLBqRadioElement): void => {\n const { value } = target;\n target.checked = true;\n this.value = value;\n this.focusedBqRadio = target;\n this.internals.setFormValue(value);\n this.debouncedBqChange({ value, target });\n };\n\n private getNextRadioElement = (elements: HTMLBqRadioElement[], index: number, forward = true): HTMLBqRadioElement => {\n let element = null;\n let elementIndex = index;\n\n do {\n elementIndex = (elements.length + (elementIndex + (forward ? 1 : -1))) % elements.length;\n element = elements[elementIndex];\n } while (element.disabled);\n\n return element;\n };\n\n private updateFormValidity = async (): Promise<void> => {\n const { internals, required, requiredValidationMessage, value } = this;\n // Clear the validity state\n internals?.states.clear();\n\n if (!required || (required && !isNil(value))) {\n // If the checkbox is not required or is checked, set the validity state to valid\n internals?.states.add('valid');\n internals?.setValidity({});\n return;\n }\n\n // If the checkbox is required and not checked, set the validity state to invalid\n internals?.states.add('invalid');\n internals?.setValidity(\n { valueMissing: true },\n requiredValidationMessage,\n await this.bqRadioElements[0].getNativeInput(),\n );\n };\n\n private get bqRadioElements(): HTMLBqRadioElement[] {\n return Array.from(this.el.querySelectorAll('bq-radio'));\n }\n\n // render() function\n // Always the last one in the class.\n // ===================================\n\n render() {\n return (\n <fieldset\n class={{ 'bq-radio-group': true, 'has-fieldset': this.fieldset }}\n aria-labelledby=\"bq-radio-group__label\"\n aria-controls=\"bq-radiogroup\"\n role=\"radiogroup\"\n part=\"base\"\n >\n <legend part=\"label\">\n <slot id=\"bq-radiogroup__label\" name=\"label\" />\n </legend>\n <div class={`bq-radio-group--${this.orientation}`} part=\"group\">\n <slot id=\"bq-radiogroup\" />\n </div>\n </fieldset>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"bq-radio-group.js","sourceRoot":"","sources":["../../../../../../packages/beeq/src/components/radio-group/bq-radio-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, Event, h, Host, Listen, Prop, State, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\nimport { RADIO_GROUP_ORIENTATION } from './bq-radio-group.types';\nimport type { TRadioGroupOrientation } from './bq-radio-group.types';\nimport {\n debounce,\n getNextElement,\n isEventTargetChildOfElement,\n isNil,\n TDebounce,\n validatePropValue,\n} from '../../shared/utils';\n\nconst KEY_MAP = {\n ArrowDown: 'forward',\n ArrowRight: 'forward',\n ArrowUp: 'backward',\n ArrowLeft: 'backward',\n} as const;\n\ntype Direction = (typeof KEY_MAP)[keyof typeof KEY_MAP];\n\n/**\n * The radio group is a user interface component that groups radio buttons to enable a single selection within the group.\n *\n * @example How to use it\n * ```html\n * <bq-radio-group fieldset value=\"option1\">\n * <span slot=\"label\">radio group</span>\n * <bq-radio value=\"option1\">Radio option 1</bq-radio>\n * <bq-radio value=\"option2\">Radio option 2</bq-radio>\n * <bq-radio value=\"option3\">Radio option 3</bq-radio>\n * </bq-radio-group>\n * ```\n *\n * @documentation https://www.beeq.design/3d466e231/p/9718e1-radio-button/b/09d7b1\n * @status stable\n *\n * @attr {boolean} background-on-hover - If `true`, the radio displays background on hover\n * @attr {number} debounce-time - A number representing the delay time (in milliseconds) that bqChange event handler gets triggered once the value change\n * @attr {boolean} disabled - If `true` radio inputs are disabled\n * @attr {boolean} fieldset - If `true` displays fieldset\n * @attr {string} name - Name of the HTML input form control. Submitted with the form as part of a name/value pair\n * @attr {\"horizontal\" | \"vertical\"} orientation - The display orientation of the radio inputs\n * @attr {boolean} required - If `true`, the radio group is required\n * @attr {string} required-validation-message - The native form validation message when the radio group is required\n * @attr {string} value - The display orientation of the radio inputs\n *\n * @method vClick - Simulate a click event on the native `<input>` HTML element used under the hood\n * @method vFocus - Sets focus on the native `<input>` HTML element used under the hood\n * @method vBlur - Remove focus from the native `<input>` HTML element used under the hood\n *\n * @event bqChange - Handler to be called when the radio state changes\n *\n * @slot - The bq-radio items to group\n * @slot label - The label content of radio group\n *\n * @part base - The component's internal wrapper of the radio components.\n * @part label - The `<legend>` element that holds the text content.\n * @part group - The `<div>` element that holds the radio inputs.\n */\n@Component({\n tag: 'bq-radio-group',\n styleUrl: './scss/bq-radio-group.scss',\n formAssociated: true,\n shadow: {\n delegatesFocus: true,\n },\n})\nexport class BqRadioGroup {\n // Own Properties\n // ====================\n\n private initialValue?: string;\n private debouncedBqChange: TDebounce<{ value: string; target: HTMLBqRadioElement }>;\n private focusedBqRadio: HTMLBqRadioElement | null = null;\n private readonly radioElementsSet = new Set<HTMLBqRadioElement>();\n private cachedRadioElements: HTMLBqRadioElement[] = [];\n\n // Reference to host HTML element\n // ===================================\n\n @AttachInternals() internals!: ElementInternals;\n @Element() el!: HTMLBqRadioGroupElement;\n\n // State() variables\n // Inlined decorator, alphabetical order\n // =======================================\n\n @State() checkedRadio?: HTMLBqRadioElement;\n @State() tabIndex: '0' | '-1' = '0';\n\n // Public Property API\n // ========================\n\n /** If true, all radio inputs in the group will display a background on hover */\n @Prop({ reflect: true }) backgroundOnHover = false;\n\n /** A number representing the delay time (in milliseconds) that `bqChange` event handler gets triggered once the value change */\n @Prop({ reflect: true, mutable: true }) debounceTime = 0;\n\n /** If true radio inputs are disabled */\n @Prop({ reflect: true }) disabled = false;\n\n /** If true displays fieldset */\n @Prop({ reflect: true }) fieldset = false;\n\n /** Name of the HTML input form control. Submitted with the form as part of a name/value pair. */\n @Prop({ reflect: true }) name!: string;\n\n /** The display orientation of the radio inputs */\n @Prop({ reflect: true, mutable: true }) orientation: TRadioGroupOrientation = 'vertical';\n\n /** If true, the radio group is required */\n @Prop({ reflect: true }) required = false;\n\n /** The native form validation message when the radio group is required */\n @Prop({ reflect: true }) requiredValidationMessage?: string;\n\n /** A string representing the value of the radio. */\n @Prop({ reflect: true, mutable: true }) value?: string;\n\n // Prop lifecycle events\n // =======================\n\n @Watch('debounceTime')\n handleDebounceTimeChange() {\n const MIN_DEBOUNCE_TIME = 0;\n const normalizedDebounceTime = Math.max(MIN_DEBOUNCE_TIME, this.debounceTime);\n\n if (normalizedDebounceTime !== this.debounceTime) {\n this.debounceTime = normalizedDebounceTime;\n }\n\n this.debouncedBqChange?.cancel();\n this.debouncedBqChange = debounce((event: { value: string; target: HTMLBqRadioElement }): void => {\n this.bqChange?.emit(event);\n }, this.debounceTime);\n }\n\n @Watch('disabled')\n handleDisabledChange() {\n this.tabIndex = this.disabled ? '-1' : '0';\n this.updateRadioTabIndexes();\n }\n\n @Watch('backgroundOnHover')\n @Watch('disabled')\n @Watch('name')\n @Watch('required')\n handleGroupProperties() {\n this.updateRadioProperties();\n }\n\n @Watch('orientation')\n checkPropValues() {\n validatePropValue(RADIO_GROUP_ORIENTATION, 'vertical', this.el, 'orientation');\n }\n\n @Watch('required')\n handleRequiredChange() {\n this.updateFormValidity();\n }\n\n @Watch('value')\n handleValueChange() {\n this.updateRadioProperties();\n this.updateFormValidity();\n\n // Find and update the checked radio based on the new value\n const newCheckedRadio = this.cachedRadioElements.find((radio) => radio.value === this.value);\n if (newCheckedRadio) {\n this.checkedRadio = newCheckedRadio;\n this.debouncedBqChange?.({ value: this.value, target: newCheckedRadio });\n } else {\n this.checkedRadio = undefined;\n }\n }\n\n // Events section\n // Requires JSDocs for public API documentation\n // ==============================================\n\n /** Handler to be called when the radio state changes */\n @Event() bqChange: EventEmitter<{ value: string; target: HTMLBqRadioElement }>;\n\n // Component lifecycle events\n // Ordered by their natural call order\n // =====================================\n\n componentWillLoad() {\n this.initialValue = this.value;\n this.handleDebounceTimeChange();\n this.internals.setFormValue(this.value ?? null);\n\n this.updateCustomStates();\n this.updateFormValidity();\n }\n\n disconnectedCallback() {\n this.debouncedBqChange?.cancel();\n }\n\n formAssociatedCallback() {\n this.internals.setFormValue(this.value ?? null);\n this.updateFormValidity();\n }\n\n formResetCallback() {\n this.value = this.initialValue;\n this.internals.setFormValue(this.value ?? null);\n this.updateFormValidity();\n this.updateCustomStates();\n }\n\n // Listeners\n // ==============\n\n @Listen('bqClick', { capture: true })\n async onBqClick(event: CustomEvent<{ value: string; target: HTMLBqRadioElement }>) {\n if (!isEventTargetChildOfElement(event, this.el)) return;\n\n const { target, value } = event.detail;\n if (value === this.value) return;\n\n requestAnimationFrame(() => {\n if (event.defaultPrevented) return;\n this.updateRadioSelection(target);\n });\n }\n\n @Listen('bqKeyDown')\n onBqKeyDown(event: CustomEvent<{ key: string; target: HTMLBqRadioElement }>) {\n if (!isEventTargetChildOfElement(event, this.el)) return;\n\n const direction: Direction | undefined = KEY_MAP[event.detail.key];\n if (!direction) return;\n\n this.focusRadioInputSibling(event.detail.target, direction);\n }\n\n @Listen('bqFocus', { capture: true })\n onBqFocus(event: CustomEvent<HTMLBqRadioElement>) {\n if (!isEventTargetChildOfElement(event, this.el)) return;\n\n const shouldStopPropagation = this.focusedBqRadio && event.detail !== this.focusedBqRadio;\n if (shouldStopPropagation) {\n event.stopPropagation();\n }\n\n this.focusedBqRadio = event.detail;\n }\n\n @Listen('bqBlur', { capture: true })\n onBqBlur(event: CustomEvent<HTMLBqRadioElement>) {\n if (!isEventTargetChildOfElement(event, this.el)) return;\n\n const shouldStopPropagation = this.focusedBqRadio && event.detail !== this.focusedBqRadio;\n if (shouldStopPropagation) {\n event.stopPropagation();\n return;\n }\n\n this.focusedBqRadio = null;\n }\n\n // Public methods API\n // These methods are exposed on the host element.\n // Always use two lines.\n // Public Methods must be async.\n // Requires JSDocs for public API documentation.\n // ===============================================\n\n // Local methods\n // Internal business logic.\n // These methods cannot be called from the host element.\n // =======================================================\n\n /**\n * Initializes the radio elements set by querying the host element for `ds-radio` elements.\n * This is done to avoid re-querying the host element for radio elements on every change.\n */\n private initializeRadioElements = (): void => {\n this.radioElementsSet.clear();\n this.el.querySelectorAll('bq-radio').forEach((radio) => this.radioElementsSet.add(radio));\n // Caching the radio elements in an array for faster access and iteration\n this.cachedRadioElements = Array.from(this.radioElementsSet);\n // Set the tabIndex of the host element to -1 if there are no radio elements or the group is disabled, otherwise set it to 0\n this.tabIndex = this.cachedRadioElements.length === 0 || this.disabled ? '-1' : '0';\n // Set initial tabIndex for all radios\n this.updateRadioTabIndexes();\n };\n\n /**\n * Sets tabIndex for all radio elements based on current state\n * Handles all scenarios: disabled state, checked radio, value matching, fallback to first\n */\n private updateRadioTabIndexes = (): void => {\n if (this.cachedRadioElements.length === 0) return;\n\n // If disabled, all radios get tabIndex -1\n if (this.disabled) {\n this.cachedRadioElements.forEach((radio) => (radio.tabIndex = -1));\n return;\n }\n\n // Find which radio should be focusable\n let focusableRadio: HTMLBqRadioElement | undefined;\n\n // Priority 1: Currently checked radio\n focusableRadio = this.cachedRadioElements.find((radio) => radio.checked);\n\n // Priority 2: Radio matching current value\n if (!focusableRadio && this.value) {\n focusableRadio = this.cachedRadioElements.find((radio) => radio.value === this.value);\n }\n\n // Priority 3: First enabled radio (fallback)\n if (!focusableRadio) {\n focusableRadio = this.cachedRadioElements.find((radio) => !radio.disabled);\n }\n\n // Apply tabIndex to all radios\n this.cachedRadioElements.forEach((radio) => {\n radio.tabIndex = radio === focusableRadio ? 0 : -1;\n });\n };\n\n /**\n * Updates the radio selection and focus.\n * @param target - The radio element to update.\n */\n private updateRadioSelection = (target: HTMLBqRadioElement): void => {\n // Only uncheck the previously checked radio if it's different\n if (this.checkedRadio && this.checkedRadio !== target) {\n this.checkedRadio.checked = false;\n this.checkedRadio.tabIndex = -1;\n }\n\n target.checked = true;\n target.tabIndex = 0;\n target.vFocus();\n\n this.checkedRadio = target;\n this.value = target.value;\n this.internals?.setFormValue(this.value ?? null);\n\n this.updateRadioTabIndexes();\n };\n\n /**\n * Synchronizes properties of child radio elements with the group's state.\n */\n private updateRadioProperties = (): void => {\n if (this.cachedRadioElements.length === 0) return;\n\n const { backgroundOnHover, disabled, name, required, value } = this;\n\n for (const radio of this.cachedRadioElements) {\n radio.backgroundOnHover = backgroundOnHover;\n radio.checked = value === radio.value;\n // This will allows us to force all radio elements to be disabled\n // while keeping the disabled state of the radio element if it was set individually by the user\n radio.forceDisabled = disabled;\n radio.name = name;\n radio.required = required;\n }\n };\n\n /**\n * Focuses the next/previous radio element in the group based on the current target.\n * Handles circular navigation and skips disabled elements.\n * @param currentTarget - The currently focused radio element\n * @param direction - The navigation direction ('forward' | 'backward')\n */\n private focusRadioInputSibling = (currentTarget: HTMLBqRadioElement, direction: Direction): void => {\n // If there is none or only one radio element, there will be no sibling to focus\n if (this.cachedRadioElements.length <= 1) return;\n\n const currentIndex = this.cachedRadioElements.indexOf(currentTarget);\n // If the index of the radio element target is not found, it means that it's not part of the group\n if (currentIndex === -1) return;\n\n const nextElement = getNextElement(this.cachedRadioElements, currentIndex, direction);\n this.updateRadioSelection(nextElement);\n };\n\n private updateFormValidity = async (): Promise<void> => {\n const { internals, required, requiredValidationMessage, value } = this;\n // Clear the validity state\n internals?.states.clear();\n\n if (!required || (required && !isNil(value))) {\n // If the radio group is not required or has a value, set the validity state to valid\n internals?.states.add('valid');\n internals?.setValidity({});\n return;\n }\n\n const firstRadio = this.cachedRadioElements[0];\n if (!firstRadio) return;\n // If the radio group is required and has no value, set the validity state to invalid\n internals?.states.add('invalid');\n // We need to pass the native input element to the setValidity method as anchor element\n internals?.setValidity(\n { valueMissing: true },\n requiredValidationMessage ?? 'Please select an option',\n await firstRadio.getNativeInput(),\n );\n };\n\n /**\n * Updates the custom states based on the component properties.\n * The custom states can be used to style the component based on the component properties.\n * The custom states are `disabled`, based on the component properties.\n */\n private updateCustomStates = (): void => {\n const states = new Set<string>();\n\n if (this.disabled) states.add('disabled');\n if (this.orientation) states.add(this.orientation);\n\n // Update states\n this.internals?.states.clear();\n states.forEach((state) => this.internals?.states.add(state));\n };\n\n private handleSlotChange = (): void => {\n this.initializeRadioElements();\n this.updateRadioProperties();\n };\n\n // render() function\n // Always the last one in the class.\n // ===================================\n\n render() {\n return (\n <Host tabindex={this.tabIndex}>\n <fieldset\n class={{ 'bq-radio-group': true, 'has-fieldset': this.fieldset }}\n aria-controls=\"bq-radiogroup\"\n aria-labelledby=\"bq-radio-group__label\"\n aria-disabled={this.disabled}\n aria-required={this.required}\n disabled={this.disabled}\n role=\"radiogroup\"\n part=\"base\"\n >\n <legend part=\"label\">\n <slot id=\"bq-radiogroup__label\" name=\"label\" />\n </legend>\n <div class={`bq-radio-group--${this.orientation}`} part=\"group\">\n <slot id=\"bq-radiogroup\" onSlotchange={this.handleSlotChange} />\n </div>\n </fieldset>\n </Host>\n );\n }\n}\n"]}