@govbr-ds/webcomponents 2.0.0-next.61 → 2.0.0-next.63

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 (277) hide show
  1. package/dist/cjs/br-checkbox.br-input.br-radio.entry.cjs.js.map +1 -1
  2. package/dist/cjs/br-checkbox_3.cjs.entry.js +17 -28
  3. package/dist/cjs/br-collapse.br-list.entry.cjs.js.map +1 -1
  4. package/dist/cjs/br-collapse_2.cjs.entry.js +10 -15
  5. package/dist/cjs/br-datetime-picker.cjs.entry.js +18 -31
  6. package/dist/cjs/br-datetime-picker.entry.cjs.js.map +1 -1
  7. package/dist/cjs/br-dropdown.br-select.entry.cjs.js.map +1 -1
  8. package/dist/cjs/br-dropdown_2.cjs.entry.js +73 -56
  9. package/dist/cjs/br-header-list.cjs.entry.js +6 -13
  10. package/dist/cjs/br-header-list.entry.cjs.js.map +1 -1
  11. package/dist/cjs/br-header.cjs.entry.js +2 -5
  12. package/dist/cjs/br-header.entry.cjs.js.map +1 -1
  13. package/dist/cjs/br-item.cjs.entry.js +3 -6
  14. package/dist/cjs/br-item.entry.cjs.js.map +1 -1
  15. package/dist/cjs/br-message.cjs.entry.js +13 -16
  16. package/dist/cjs/br-message.entry.cjs.js.map +1 -1
  17. package/dist/cjs/br-modal.cjs.entry.js +123 -24
  18. package/dist/cjs/br-modal.entry.cjs.js.map +1 -1
  19. package/dist/cjs/br-scrim.cjs.entry.js +108 -25
  20. package/dist/cjs/br-scrim.entry.cjs.js.map +1 -1
  21. package/dist/cjs/br-skip-link.cjs.entry.js +24 -29
  22. package/dist/cjs/br-skip-link.entry.cjs.js.map +1 -1
  23. package/dist/cjs/br-skiplink-item.cjs.entry.js +32 -37
  24. package/dist/cjs/br-skiplink-item.entry.cjs.js.map +1 -1
  25. package/dist/cjs/br-step.br-step-item.entry.cjs.js.map +1 -1
  26. package/dist/cjs/br-step_2.cjs.entry.js +33 -56
  27. package/dist/cjs/br-switch.cjs.entry.js +3 -6
  28. package/dist/cjs/br-switch.entry.cjs.js.map +1 -1
  29. package/dist/cjs/br-textarea.cjs.entry.js +5 -8
  30. package/dist/cjs/br-textarea.entry.cjs.js.map +1 -1
  31. package/dist/cjs/br-tooltip.cjs.entry.js +1 -2
  32. package/dist/cjs/br-tooltip.entry.cjs.js.map +1 -1
  33. package/dist/cjs/br-wizard-panel.cjs.entry.js +6 -13
  34. package/dist/cjs/br-wizard-panel.entry.cjs.js.map +1 -1
  35. package/dist/cjs/br-wizard.cjs.entry.js +147 -182
  36. package/dist/cjs/br-wizard.entry.cjs.js.map +1 -1
  37. package/dist/cjs/{floating-ui-D_WzFT9x.js → floating-ui-CkTJEp-y.js} +11 -15
  38. package/dist/{esm/floating-ui-DBIzWbO2.js.map → cjs/floating-ui-CkTJEp-y.js.map} +1 -1
  39. package/dist/cjs/loader.cjs.js +1 -1
  40. package/dist/cjs/webcomponents.cjs.js +1 -1
  41. package/dist/collection/components/checkbox/checkbox.js +9 -16
  42. package/dist/collection/components/checkbox/checkbox.js.map +1 -1
  43. package/dist/collection/components/collapse/collapse.js +10 -15
  44. package/dist/collection/components/collapse/collapse.js.map +1 -1
  45. package/dist/collection/components/datetime-picker/datetime-picker.js +18 -31
  46. package/dist/collection/components/datetime-picker/datetime-picker.js.map +1 -1
  47. package/dist/collection/components/dropdown/dropdown.js +13 -20
  48. package/dist/collection/components/dropdown/dropdown.js.map +1 -1
  49. package/dist/collection/components/header/header-list/header-list.js +6 -13
  50. package/dist/collection/components/header/header-list/header-list.js.map +1 -1
  51. package/dist/collection/components/header/header.js +2 -5
  52. package/dist/collection/components/header/header.js.map +1 -1
  53. package/dist/collection/components/item/item.js +3 -6
  54. package/dist/collection/components/item/item.js.map +1 -1
  55. package/dist/collection/components/message/message.js +13 -16
  56. package/dist/collection/components/message/message.js.map +1 -1
  57. package/dist/collection/components/modal/modal.js +156 -46
  58. package/dist/collection/components/modal/modal.js.map +1 -1
  59. package/dist/collection/components/radio/radio.js +8 -13
  60. package/dist/collection/components/radio/radio.js.map +1 -1
  61. package/dist/collection/components/scrim/scrim.js +108 -25
  62. package/dist/collection/components/scrim/scrim.js.map +1 -1
  63. package/dist/collection/components/select/select.js +79 -36
  64. package/dist/collection/components/select/select.js.map +1 -1
  65. package/dist/collection/components/skip-link/skip-link-item/skip-link-item.js +32 -37
  66. package/dist/collection/components/skip-link/skip-link-item/skip-link-item.js.map +1 -1
  67. package/dist/collection/components/skip-link/skip-link.js +24 -29
  68. package/dist/collection/components/skip-link/skip-link.js.map +1 -1
  69. package/dist/collection/components/step/step-item/step-item.js +13 -26
  70. package/dist/collection/components/step/step-item/step-item.js.map +1 -1
  71. package/dist/collection/components/step/step.js +20 -31
  72. package/dist/collection/components/step/step.js.map +1 -1
  73. package/dist/collection/components/switch/switch.js +3 -6
  74. package/dist/collection/components/switch/switch.js.map +1 -1
  75. package/dist/collection/components/textarea/textarea.js +5 -8
  76. package/dist/collection/components/textarea/textarea.js.map +1 -1
  77. package/dist/collection/components/wizard/wizard-panel/wizard-panel.js +6 -13
  78. package/dist/collection/components/wizard/wizard-panel/wizard-panel.js.map +1 -1
  79. package/dist/collection/components/wizard/wizard.js +147 -182
  80. package/dist/collection/components/wizard/wizard.js.map +1 -1
  81. package/dist/collection/pages/components/modal/index.js +1 -53
  82. package/dist/collection/utils/floating-ui.js +9 -12
  83. package/dist/collection/utils/floating-ui.js.map +1 -1
  84. package/dist/components/br-breadcrumb.js +3 -3
  85. package/dist/components/br-checkbox.js +4 -4
  86. package/dist/components/br-checkgroup.js +1 -1
  87. package/dist/components/br-collapse.js +4 -4
  88. package/dist/components/br-datetime-picker.js +1981 -1995
  89. package/dist/components/br-datetime-picker.js.map +1 -1
  90. package/dist/components/br-dropdown.js +1 -1
  91. package/dist/components/br-footer-category.js +3 -3
  92. package/dist/components/br-footer-item.js +1 -1
  93. package/dist/components/br-header-function.js +1 -1
  94. package/dist/components/br-header-link.js +1 -1
  95. package/dist/components/br-header-list.js +31 -39
  96. package/dist/components/br-header-list.js.map +1 -1
  97. package/dist/components/br-header.js +63 -67
  98. package/dist/components/br-header.js.map +1 -1
  99. package/dist/components/br-item.js +1 -1
  100. package/dist/components/br-list.js +3 -3
  101. package/dist/components/br-message.js +28 -32
  102. package/dist/components/br-message.js.map +1 -1
  103. package/dist/components/br-modal.js +140 -49
  104. package/dist/components/br-modal.js.map +1 -1
  105. package/dist/components/br-pagination.js +7 -7
  106. package/dist/components/br-radio.js +1 -1
  107. package/dist/components/br-scrim.js +112 -43
  108. package/dist/components/br-scrim.js.map +1 -1
  109. package/dist/components/br-select.js +3 -3
  110. package/dist/components/br-skip-link.js +38 -44
  111. package/dist/components/br-skip-link.js.map +1 -1
  112. package/dist/components/br-skiplink-item.js +55 -61
  113. package/dist/components/br-skiplink-item.js.map +1 -1
  114. package/dist/components/br-step-item.js +4 -4
  115. package/dist/components/br-step.js +4 -4
  116. package/dist/components/br-switch.js +12 -16
  117. package/dist/components/br-switch.js.map +1 -1
  118. package/dist/components/br-textarea.js +14 -18
  119. package/dist/components/br-textarea.js.map +1 -1
  120. package/dist/components/br-tooltip.js +1 -1
  121. package/dist/components/br-wizard-panel.js +13 -21
  122. package/dist/components/br-wizard-panel.js.map +1 -1
  123. package/dist/components/br-wizard.js +190 -228
  124. package/dist/components/br-wizard.js.map +1 -1
  125. package/dist/components/{p-Cc75U9ZX.js → p-B_YesJM8.js} +26 -34
  126. package/dist/components/{p-Cc75U9ZX.js.map → p-B_YesJM8.js.map} +1 -1
  127. package/dist/components/{p-xFn46pdm.js → p-Bc03PTAW.js} +27 -39
  128. package/dist/components/{p-xFn46pdm.js.map → p-Bc03PTAW.js.map} +1 -1
  129. package/dist/components/{p-DzKEfDGA.js → p-Bri6ECVa.js} +27 -33
  130. package/dist/components/{p-DzKEfDGA.js.map → p-Bri6ECVa.js.map} +1 -1
  131. package/dist/components/{p-BZ8BetvD.js → p-CJSXIVVe.js} +17 -23
  132. package/dist/components/{p-BZ8BetvD.js.map → p-CJSXIVVe.js.map} +1 -1
  133. package/dist/components/{p-D9c7NikS.js → p-CWRBs6PD.js} +24 -38
  134. package/dist/components/{p-D9c7NikS.js.map → p-CWRBs6PD.js.map} +1 -1
  135. package/dist/components/{p-D0dPo1K5.js → p-CwtLw60M.js} +12 -16
  136. package/dist/components/{p-D0dPo1K5.js.map → p-CwtLw60M.js.map} +1 -1
  137. package/dist/components/{p-z1PVVVFI.js → p-DW63EY0U.js} +27 -35
  138. package/dist/components/{p-z1PVVVFI.js.map → p-DW63EY0U.js.map} +1 -1
  139. package/dist/components/{p-7kxAU6Gr.js → p-DdjKNpU3.js} +92 -72
  140. package/dist/components/p-DdjKNpU3.js.map +1 -0
  141. package/dist/{webcomponents/p-B4au_byv.js → components/p-k0WZfTfL.js} +121 -124
  142. package/dist/components/{p-B4au_byv.js.map → p-k0WZfTfL.js.map} +1 -1
  143. package/dist/components/{p-OKkBxn1z.js → p-lIb35q2K.js} +3 -3
  144. package/dist/custom-elements.json +1613 -430
  145. package/dist/esm/br-checkbox.br-input.br-radio.entry.js.map +1 -1
  146. package/dist/esm/br-checkbox_3.entry.js +17 -28
  147. package/dist/esm/br-collapse.br-list.entry.js.map +1 -1
  148. package/dist/esm/br-collapse_2.entry.js +10 -15
  149. package/dist/esm/br-datetime-picker.entry.js +18 -31
  150. package/dist/esm/br-datetime-picker.entry.js.map +1 -1
  151. package/dist/esm/br-dropdown.br-select.entry.js.map +1 -1
  152. package/dist/esm/br-dropdown_2.entry.js +73 -56
  153. package/dist/esm/br-header-list.entry.js +6 -13
  154. package/dist/esm/br-header-list.entry.js.map +1 -1
  155. package/dist/esm/br-header.entry.js +2 -5
  156. package/dist/esm/br-header.entry.js.map +1 -1
  157. package/dist/esm/br-item.entry.js +3 -6
  158. package/dist/esm/br-item.entry.js.map +1 -1
  159. package/dist/esm/br-message.entry.js +13 -16
  160. package/dist/esm/br-message.entry.js.map +1 -1
  161. package/dist/esm/br-modal.entry.js +123 -24
  162. package/dist/esm/br-modal.entry.js.map +1 -1
  163. package/dist/esm/br-scrim.entry.js +108 -25
  164. package/dist/esm/br-scrim.entry.js.map +1 -1
  165. package/dist/esm/br-skip-link.entry.js +24 -29
  166. package/dist/esm/br-skip-link.entry.js.map +1 -1
  167. package/dist/esm/br-skiplink-item.entry.js +32 -37
  168. package/dist/esm/br-skiplink-item.entry.js.map +1 -1
  169. package/dist/esm/br-step.br-step-item.entry.js.map +1 -1
  170. package/dist/esm/br-step_2.entry.js +33 -56
  171. package/dist/esm/br-switch.entry.js +3 -6
  172. package/dist/esm/br-switch.entry.js.map +1 -1
  173. package/dist/esm/br-textarea.entry.js +5 -8
  174. package/dist/esm/br-textarea.entry.js.map +1 -1
  175. package/dist/esm/br-tooltip.entry.js +1 -2
  176. package/dist/esm/br-tooltip.entry.js.map +1 -1
  177. package/dist/esm/br-wizard-panel.entry.js +6 -13
  178. package/dist/esm/br-wizard-panel.entry.js.map +1 -1
  179. package/dist/esm/br-wizard.entry.js +147 -182
  180. package/dist/esm/br-wizard.entry.js.map +1 -1
  181. package/dist/esm/{floating-ui-DBIzWbO2.js → floating-ui-k0WZfTfL.js} +11 -15
  182. package/dist/{cjs/floating-ui-D_WzFT9x.js.map → esm/floating-ui-k0WZfTfL.js.map} +1 -1
  183. package/dist/esm/loader.js +1 -1
  184. package/dist/esm/webcomponents.js +1 -1
  185. package/dist/hydrate/index.js +634 -578
  186. package/dist/hydrate/index.mjs +634 -578
  187. package/dist/types/components/modal/modal.d.ts +46 -4
  188. package/dist/types/components/scrim/scrim.d.ts +39 -1
  189. package/dist/types/components/select/select.d.ts +5 -0
  190. package/dist/types/components.d.ts +21 -11
  191. package/dist/webcomponents/br-checkbox.br-input.br-radio.entry.esm.js.map +1 -1
  192. package/dist/webcomponents/br-collapse.br-list.entry.esm.js.map +1 -1
  193. package/dist/webcomponents/br-datetime-picker.entry.esm.js.map +1 -1
  194. package/dist/webcomponents/br-dropdown.br-select.entry.esm.js.map +1 -1
  195. package/dist/webcomponents/br-header-list.entry.esm.js.map +1 -1
  196. package/dist/webcomponents/br-header.entry.esm.js.map +1 -1
  197. package/dist/webcomponents/br-item.entry.esm.js.map +1 -1
  198. package/dist/webcomponents/br-message.entry.esm.js.map +1 -1
  199. package/dist/webcomponents/br-modal.entry.esm.js.map +1 -1
  200. package/dist/webcomponents/br-scrim.entry.esm.js.map +1 -1
  201. package/dist/webcomponents/br-skip-link.entry.esm.js.map +1 -1
  202. package/dist/webcomponents/br-skiplink-item.entry.esm.js.map +1 -1
  203. package/dist/webcomponents/br-step.br-step-item.entry.esm.js.map +1 -1
  204. package/dist/webcomponents/br-switch.entry.esm.js.map +1 -1
  205. package/dist/webcomponents/br-textarea.entry.esm.js.map +1 -1
  206. package/dist/webcomponents/br-tooltip.entry.esm.js.map +1 -1
  207. package/dist/webcomponents/br-wizard-panel.entry.esm.js.map +1 -1
  208. package/dist/webcomponents/br-wizard.entry.esm.js.map +1 -1
  209. package/dist/webcomponents/{p-2fe329d6.entry.js → p-10e25a32.entry.js} +28 -34
  210. package/dist/webcomponents/p-10e25a32.entry.js.map +1 -0
  211. package/dist/webcomponents/{p-097912c2.entry.js → p-1991135d.entry.js} +30 -36
  212. package/dist/webcomponents/p-1991135d.entry.js.map +1 -0
  213. package/dist/webcomponents/{p-61e5421b.entry.js → p-27eb10f9.entry.js} +57 -61
  214. package/dist/webcomponents/p-27eb10f9.entry.js.map +1 -0
  215. package/dist/webcomponents/{p-5070161f.entry.js → p-30af66b3.entry.js} +45 -51
  216. package/dist/webcomponents/p-30af66b3.entry.js.map +1 -0
  217. package/dist/webcomponents/{p-9464b692.entry.js → p-336071a5.entry.js} +2 -4
  218. package/dist/webcomponents/p-336071a5.entry.js.map +1 -0
  219. package/dist/webcomponents/{p-8a034433.entry.js → p-462c5647.entry.js} +20 -24
  220. package/dist/webcomponents/p-462c5647.entry.js.map +1 -0
  221. package/dist/webcomponents/{p-d674cee3.entry.js → p-46dfc3ee.entry.js} +12 -16
  222. package/dist/webcomponents/p-46dfc3ee.entry.js.map +1 -0
  223. package/dist/webcomponents/{p-821b896c.entry.js → p-56aabe89.entry.js} +36 -44
  224. package/dist/webcomponents/p-56aabe89.entry.js.map +1 -0
  225. package/dist/webcomponents/{p-a615baaa.entry.js → p-5710a3e9.entry.js} +41 -65
  226. package/dist/webcomponents/p-5710a3e9.entry.js.map +1 -0
  227. package/dist/webcomponents/{p-1799a082.entry.js → p-6a9d2a0b.entry.js} +1996 -2010
  228. package/dist/webcomponents/p-6a9d2a0b.entry.js.map +1 -0
  229. package/dist/webcomponents/{p-8ad1f003.entry.js → p-83001853.entry.js} +175 -213
  230. package/dist/webcomponents/p-83001853.entry.js.map +1 -0
  231. package/dist/webcomponents/{p-28dba962.entry.js → p-90401ecd.entry.js} +124 -34
  232. package/dist/webcomponents/p-90401ecd.entry.js.map +1 -0
  233. package/dist/webcomponents/{p-e7b38c63.entry.js → p-a2eec4fb.entry.js} +112 -43
  234. package/dist/webcomponents/p-a2eec4fb.entry.js.map +1 -0
  235. package/dist/webcomponents/{p-d6475852.entry.js → p-c1b0a116.entry.js} +11 -19
  236. package/dist/webcomponents/p-c1b0a116.entry.js.map +1 -0
  237. package/dist/webcomponents/{p-c90a089a.entry.js → p-ca2d95f7.entry.js} +96 -83
  238. package/dist/webcomponents/p-ca2d95f7.entry.js.map +1 -0
  239. package/dist/webcomponents/{p-7ff6698f.entry.js → p-cfa86a23.entry.js} +10 -14
  240. package/dist/webcomponents/p-cfa86a23.entry.js.map +1 -0
  241. package/dist/webcomponents/{p-abc0ecbe.entry.js → p-e5875d3d.entry.js} +10 -14
  242. package/dist/webcomponents/p-e5875d3d.entry.js.map +1 -0
  243. package/dist/webcomponents/{p-0bfb0edf.entry.js → p-f2ea0d7e.entry.js} +133 -145
  244. package/dist/webcomponents/p-f2ea0d7e.entry.js.map +1 -0
  245. package/dist/{components/p-B4au_byv.js → webcomponents/p-k0WZfTfL.js} +121 -124
  246. package/dist/webcomponents/{p-B4au_byv.js.map → p-k0WZfTfL.js.map} +1 -1
  247. package/dist/webcomponents/webcomponents.esm.js +1 -1
  248. package/dist/webcomponents.html-custom-data.json +1708 -349
  249. package/package.json +1 -1
  250. package/dist/cjs/tslib.es6-CF44W9Bn.js +0 -42
  251. package/dist/cjs/tslib.es6-CF44W9Bn.js.map +0 -1
  252. package/dist/components/p-7kxAU6Gr.js.map +0 -1
  253. package/dist/components/p-DIPMDb5E.js +0 -55
  254. package/dist/components/p-DIPMDb5E.js.map +0 -1
  255. package/dist/esm/tslib.es6-DIPMDb5E.js +0 -40
  256. package/dist/esm/tslib.es6-DIPMDb5E.js.map +0 -1
  257. package/dist/webcomponents/p-097912c2.entry.js.map +0 -1
  258. package/dist/webcomponents/p-0bfb0edf.entry.js.map +0 -1
  259. package/dist/webcomponents/p-1799a082.entry.js.map +0 -1
  260. package/dist/webcomponents/p-28dba962.entry.js.map +0 -1
  261. package/dist/webcomponents/p-2fe329d6.entry.js.map +0 -1
  262. package/dist/webcomponents/p-5070161f.entry.js.map +0 -1
  263. package/dist/webcomponents/p-61e5421b.entry.js.map +0 -1
  264. package/dist/webcomponents/p-7ff6698f.entry.js.map +0 -1
  265. package/dist/webcomponents/p-821b896c.entry.js.map +0 -1
  266. package/dist/webcomponents/p-8a034433.entry.js.map +0 -1
  267. package/dist/webcomponents/p-8ad1f003.entry.js.map +0 -1
  268. package/dist/webcomponents/p-9464b692.entry.js.map +0 -1
  269. package/dist/webcomponents/p-DIPMDb5E.js +0 -55
  270. package/dist/webcomponents/p-DIPMDb5E.js.map +0 -1
  271. package/dist/webcomponents/p-a615baaa.entry.js.map +0 -1
  272. package/dist/webcomponents/p-abc0ecbe.entry.js.map +0 -1
  273. package/dist/webcomponents/p-c90a089a.entry.js.map +0 -1
  274. package/dist/webcomponents/p-d6475852.entry.js.map +0 -1
  275. package/dist/webcomponents/p-d674cee3.entry.js.map +0 -1
  276. package/dist/webcomponents/p-e7b38c63.entry.js.map +0 -1
  277. /package/dist/components/{p-OKkBxn1z.js.map → p-lIb35q2K.js.map} +0 -0
@@ -2,7 +2,6 @@
2
2
  * Construído por SERPRO
3
3
  * © https://serpro.gov.br/ - MIT License.
4
4
  */
5
- import { __awaiter } from "tslib";
6
5
  import { h, Host } from "@stencil/core";
7
6
  import Helpers from "../../utils/helpers";
8
7
  /**
@@ -25,32 +24,132 @@ export class Modal {
25
24
  this.customId = Helpers.generateUniqueId('modal');
26
25
  /** Controla a visibilidade do modal. */
27
26
  this.show = false;
28
- /** Se `true`, o modal se fechará automaticamente ao clicar no botão de fechar ou pressionar a tecla 'Escape'. */
27
+ /**
28
+ * Define o comportamento de fechamento do modal.
29
+ *
30
+ * - `true`: O modal fecha automaticamente ao clicar no botão fechar.
31
+ * - `false`: O modal emite `brModalBeforeClose` mas não fecha, permitindo a implementação de lógica customizada (validação, confirmação, etc.) antes do fechamento. O desenvolvedor deve
32
+ * controlar manualmente o fechamento.
33
+ */
29
34
  this.autoClose = false;
30
35
  /**
31
36
  * Define o tamanho (largura) do modal.
32
37
  */
33
38
  this.size = 'medium';
34
- /** Se `true`, exibe um fundo escurecido (scrim) atrás do modal. */
35
- this.scrim = false;
36
39
  /** Se `true`, habilita a rolagem interna do conteúdo do modal. */
37
40
  this.scrollable = false;
38
41
  /**
39
42
  * Define o alinhamento do conteúdo do rodapé (slot="footer").
40
43
  */
41
44
  this.alignFooter = 'center';
45
+ this.isOpeningParentScrim = false;
46
+ /**
47
+ * Handler para evento brScrimOpen do parent scrim
48
+ * Quando scrim abre programaticamente, a modal deve abrir também
49
+ */
50
+ this.handleParentScrimOpen = () => {
51
+ const parentScrim = this.el.closest('br-scrim');
52
+ if (parentScrim === null)
53
+ return;
54
+ if (!this.show) {
55
+ this.show = true;
56
+ }
57
+ };
58
+ /**
59
+ * Handler para evento brScrimClose do parent scrim
60
+ * Se autoClose=true, fecha a modal junto com o scrim
61
+ * Se autoClose=false, não faz nada (modal permanece aberta)
62
+ */
63
+ this.handleParentScrimClose = () => {
64
+ const parentScrim = this.el.closest('br-scrim');
65
+ if (parentScrim === null)
66
+ return;
67
+ if (this.autoClose && this.show) {
68
+ this.show = false;
69
+ }
70
+ };
42
71
  this.handleClose = () => {
43
- this.brModalClose.emit();
72
+ this.brModalBeforeClose.emit();
44
73
  if (this.autoClose) {
45
74
  this.show = false;
46
- // Se o modal está dentro de um br-scrim, fecha o scrim também
47
- const parentScrim = this.el.closest('br-scrim');
48
- if (parentScrim) {
49
- parentScrim.close();
50
- }
51
75
  }
52
76
  };
53
77
  }
78
+ handleShowChange(newValue, oldValue) {
79
+ if (newValue) {
80
+ this.brModalOpen.emit();
81
+ this.openParentScrim();
82
+ }
83
+ else if (oldValue === true) {
84
+ this.brModalClose.emit();
85
+ this.closeParentScrim();
86
+ }
87
+ }
88
+ closeParentScrim() {
89
+ const parentScrim = this.el.closest('br-scrim');
90
+ if (parentScrim && typeof parentScrim.close === 'function') {
91
+ parentScrim.close();
92
+ }
93
+ }
94
+ componentWillLoad() {
95
+ if (!this.show) {
96
+ const parentScrim = this.el.closest('br-scrim');
97
+ if (parentScrim !== null && parentScrim.isOpen) {
98
+ this.show = true;
99
+ }
100
+ }
101
+ }
102
+ componentDidLoad() {
103
+ this.listenToParentScrimEvents();
104
+ if (this.show) {
105
+ this.openParentScrim();
106
+ }
107
+ }
108
+ disconnectedCallback() {
109
+ this.isOpeningParentScrim = false;
110
+ this.removeParentScrimEventListeners();
111
+ }
112
+ /**
113
+ * Adiciona listeners para eventos do parent scrim
114
+ */
115
+ listenToParentScrimEvents() {
116
+ const parentScrim = this.el.closest('br-scrim');
117
+ if (parentScrim !== null) {
118
+ parentScrim.addEventListener('brScrimOpen', this.handleParentScrimOpen);
119
+ parentScrim.addEventListener('brScrimClose', this.handleParentScrimClose);
120
+ }
121
+ }
122
+ /**
123
+ * Remove listeners de eventos do parent scrim
124
+ */
125
+ removeParentScrimEventListeners() {
126
+ const parentScrim = this.el.closest('br-scrim');
127
+ if (parentScrim !== null) {
128
+ parentScrim.removeEventListener('brScrimOpen', this.handleParentScrimOpen);
129
+ parentScrim.removeEventListener('brScrimClose', this.handleParentScrimClose);
130
+ }
131
+ }
132
+ openParentScrim() {
133
+ if (this.isOpeningParentScrim)
134
+ return;
135
+ const parentScrim = this.el.closest('br-scrim');
136
+ if (parentScrim && !parentScrim.isOpen) {
137
+ this.isOpeningParentScrim = true;
138
+ Promise.resolve()
139
+ .then(() => {
140
+ try {
141
+ return parentScrim.open();
142
+ }
143
+ catch (error) {
144
+ console.warn('br-modal: Erro ao abrir scrim pai:', error);
145
+ throw error;
146
+ }
147
+ })
148
+ .finally(() => {
149
+ this.isOpeningParentScrim = false;
150
+ });
151
+ }
152
+ }
54
153
  get titleId() {
55
154
  return `${this.customId}-title`;
56
155
  }
@@ -67,29 +166,24 @@ export class Modal {
67
166
  /**
68
167
  * Método público para abrir o modal
69
168
  */
70
- open() {
71
- return __awaiter(this, void 0, void 0, function* () {
72
- this.show = true;
73
- });
169
+ async open() {
170
+ this.show = true;
171
+ this.openParentScrim();
74
172
  }
75
173
  /**
76
174
  * Método público para fechar o modal
77
175
  */
78
- close() {
79
- return __awaiter(this, void 0, void 0, function* () {
80
- this.show = false;
81
- // Se o modal está dentro de um br-scrim, fecha o scrim também
82
- const parentScrim = this.el.closest('br-scrim');
83
- if (parentScrim) {
84
- parentScrim.close();
85
- }
86
- });
176
+ async close() {
177
+ if (!this.autoClose) {
178
+ return;
179
+ }
180
+ this.show = false;
87
181
  }
88
182
  render() {
89
183
  if (!this.show) {
90
184
  return null;
91
185
  }
92
- return (h(Host, null, h("div", { class: this.getCssClassMap(), role: "dialog", "aria-modal": "true", "aria-labelledby": this.titleId, "aria-describedby": this.contentId }, h("div", { class: "br-modal-header" }, h("div", { class: "modal-title", id: this.titleId }, h("slot", { name: "header" }, this.titleText)), h("slot", { name: "close-button" }, h("br-button", { class: "close", shape: "circle", density: "small", "aria-label": "Fechar", onClick: this.handleClose }, h("br-icon", { "icon-name": "fa-solid:times" })))), h("div", { id: this.contentId, class: "br-modal-body" }, h("slot", null)), h("div", { class: `br-modal-footer ${this.alignFooter ? `justify-content-${this.alignFooter}` : ''}` }, h("slot", { name: "footer" })))));
186
+ return (h(Host, null, h("div", { class: this.getCssClassMap(), role: "dialog", "aria-modal": "true", "aria-labelledby": this.titleId, "aria-describedby": this.contentId }, h("div", { class: "br-modal-header" }, h("div", { class: "modal-title", id: this.titleId }, h("slot", { name: "header" }, this.titleText)), h("slot", { name: "close-button" }, h("br-button", { class: "close", shape: "circle", density: "small", "aria-label": "Fechar", onClick: this.handleClose }, h("br-icon", { "icon-name": "fa-solid:times" })))), h("div", { id: this.contentId, class: "br-modal-body" }, h("slot", null)), h("div", { class: `br-modal-footer ${this.alignFooter !== undefined ? `justify-content-${this.alignFooter}` : ''}` }, h("slot", { name: "footer" })))));
93
187
  }
94
188
  static get is() { return "br-modal"; }
95
189
  static get encapsulation() { return "shadow"; }
@@ -177,7 +271,7 @@ export class Modal {
177
271
  "optional": false,
178
272
  "docs": {
179
273
  "tags": [],
180
- "text": "Se `true`, o modal se fechar\u00E1 automaticamente ao clicar no bot\u00E3o de fechar ou pressionar a tecla 'Escape'."
274
+ "text": "Define o comportamento de fechamento do modal.\n\n- `true`: O modal fecha automaticamente ao clicar no bot\u00E3o fechar.\n- `false`: O modal emite `brModalBeforeClose` mas n\u00E3o fecha, permitindo a implementa\u00E7\u00E3o de l\u00F3gica customizada (valida\u00E7\u00E3o, confirma\u00E7\u00E3o, etc.) antes do fechamento. O desenvolvedor deve\n controlar manualmente o fechamento."
181
275
  },
182
276
  "getter": false,
183
277
  "setter": false,
@@ -224,26 +318,6 @@ export class Modal {
224
318
  "attribute": "size",
225
319
  "defaultValue": "'medium'"
226
320
  },
227
- "scrim": {
228
- "type": "boolean",
229
- "mutable": false,
230
- "complexType": {
231
- "original": "false",
232
- "resolved": "boolean",
233
- "references": {}
234
- },
235
- "required": false,
236
- "optional": false,
237
- "docs": {
238
- "tags": [],
239
- "text": "Se `true`, exibe um fundo escurecido (scrim) atr\u00E1s do modal."
240
- },
241
- "getter": false,
242
- "setter": false,
243
- "reflect": true,
244
- "attribute": "scrim",
245
- "defaultValue": "false"
246
- },
247
321
  "scrollable": {
248
322
  "type": "boolean",
249
323
  "mutable": false,
@@ -288,6 +362,21 @@ export class Modal {
288
362
  }
289
363
  static get events() {
290
364
  return [{
365
+ "method": "brModalOpen",
366
+ "name": "brModalOpen",
367
+ "bubbles": true,
368
+ "cancelable": true,
369
+ "composed": true,
370
+ "docs": {
371
+ "tags": [],
372
+ "text": "Evento emitido quando o modal \u00E9 aberto (quando `show` muda de `false` para `true`)."
373
+ },
374
+ "complexType": {
375
+ "original": "void",
376
+ "resolved": "void",
377
+ "references": {}
378
+ }
379
+ }, {
291
380
  "method": "brModalClose",
292
381
  "name": "brModalClose",
293
382
  "bubbles": true,
@@ -295,7 +384,22 @@ export class Modal {
295
384
  "composed": true,
296
385
  "docs": {
297
386
  "tags": [],
298
- "text": "Evento emitido quando o modal solicita ser fechado (pelo bot\u00E3o 'x', tecla 'Escape' ou clique no scrim)."
387
+ "text": "Evento emitido ap\u00F3s o modal ser fechado (quando `show` muda de `true` para `false`)."
388
+ },
389
+ "complexType": {
390
+ "original": "void",
391
+ "resolved": "void",
392
+ "references": {}
393
+ }
394
+ }, {
395
+ "method": "brModalBeforeClose",
396
+ "name": "brModalBeforeClose",
397
+ "bubbles": true,
398
+ "cancelable": true,
399
+ "composed": true,
400
+ "docs": {
401
+ "tags": [],
402
+ "text": "Evento emitido antes do fechamento do modal (quando o bot\u00E3o X \u00E9 clicado).\nSe autoClose est\u00E1 desativado, o desenvolvedor deve fechar manualmente o modal ap\u00F3s este evento.\nSe autoClose est\u00E1 ativado, o modal fecha automaticamente ap\u00F3s este evento."
299
403
  },
300
404
  "complexType": {
301
405
  "original": "void",
@@ -343,6 +447,12 @@ export class Modal {
343
447
  };
344
448
  }
345
449
  static get elementRef() { return "el"; }
450
+ static get watchers() {
451
+ return [{
452
+ "propName": "show",
453
+ "methodName": "handleShowChange"
454
+ }];
455
+ }
346
456
  static get attachInternalsMemberName() { return "elementInternals"; }
347
457
  }
348
458
  //# sourceMappingURL=modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/modal/modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/modal?tab=designer).\n *\n * @slot header - Cabeçalho do modal. Se não for usado, o `title-text` será exibido.\n * @slot default - Corpo do modal.\n * @slot footer - Rodapé do modal.\n * @slot close-button - Botão de fechar customizado. Se não for usado, o botão padrão será exibido.\n *\n */\n@Component({\n tag: 'br-modal',\n styleUrl: 'modal.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Modal {\n /** Referência ao elemento host do componente. */\n @Element() el: HTMLBrModalElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = Helpers.generateUniqueId('modal')\n\n /** O texto do título a ser exibido no cabeçalho do modal. Usado quando o slot `header` não é fornecido. */\n @Prop() readonly titleText: string\n\n /** Controla a visibilidade do modal. */\n @Prop({ reflect: true, mutable: true }) show = false\n\n /** Se `true`, o modal se fechará automaticamente ao clicar no botão de fechar ou pressionar a tecla 'Escape'. */\n @Prop({ reflect: true }) autoClose = false\n\n /** Seletor CSS para o elemento que deve receber foco quando o modal é aberto. */\n @Prop() readonly initialFocusSelector: string\n\n /**\n * Define o tamanho (largura) do modal.\n */\n @Prop({ reflect: true }) readonly size: 'xsmall' | 'small' | 'medium' | 'large' | 'auto' = 'medium'\n\n /** Se `true`, exibe um fundo escurecido (scrim) atrás do modal. */\n @Prop({ reflect: true }) readonly scrim = false\n\n /** Se `true`, habilita a rolagem interna do conteúdo do modal. */\n @Prop({ reflect: true }) readonly scrollable = false\n\n /**\n * Define o alinhamento do conteúdo do rodapé (slot=\"footer\").\n */\n @Prop({ reflect: true }) readonly alignFooter: 'start' | 'end' | 'center' = 'center'\n\n /** Evento emitido quando o modal solicita ser fechado (pelo botão 'x', tecla 'Escape' ou clique no scrim). */\n @Event() brModalClose: EventEmitter<void>\n\n private get titleId() {\n return `${this.customId}-title`\n }\n\n private get contentId() {\n return `${this.customId}-content`\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-modal': true,\n [this.size]: true,\n scrollable: this.scrollable,\n }\n }\n\n private handleClose = () => {\n this.brModalClose.emit()\n if (this.autoClose) {\n this.show = false\n\n // Se o modal está dentro de um br-scrim, fecha o scrim também\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim) {\n parentScrim.close()\n }\n }\n }\n\n /**\n * Método público para abrir o modal\n */\n @Method()\n async open() {\n this.show = true\n }\n\n /**\n * Método público para fechar o modal\n */\n @Method()\n async close() {\n this.show = false\n\n // Se o modal está dentro de um br-scrim, fecha o scrim também\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim) {\n parentScrim.close()\n }\n }\n\n render() {\n if (!this.show) {\n return null\n }\n\n return (\n <Host>\n <div\n class={this.getCssClassMap()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={this.titleId}\n aria-describedby={this.contentId}\n >\n <div class=\"br-modal-header\">\n <div class=\"modal-title\" id={this.titleId}>\n <slot name=\"header\">{this.titleText}</slot>\n </div>\n <slot name=\"close-button\">\n <br-button class=\"close\" shape=\"circle\" density=\"small\" aria-label=\"Fechar\" onClick={this.handleClose}>\n <br-icon icon-name=\"fa-solid:times\"></br-icon>\n </br-button>\n </slot>\n </div>\n <div id={this.contentId} class=\"br-modal-body\">\n <slot></slot>\n </div>\n <div class={`br-modal-footer ${this.alignFooter ? `justify-content-${this.alignFooter}` : ''}`}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </Host>\n )\n }\n}\n"]}
1
+ {"version":3,"file":"modal.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/modal/modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, Event, EventEmitter, h, Host, Method, Prop, Watch } from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/modal?tab=designer).\n *\n * @slot header - Cabeçalho do modal. Se não for usado, o `title-text` será exibido.\n * @slot default - Corpo do modal.\n * @slot footer - Rodapé do modal.\n * @slot close-button - Botão de fechar customizado. Se não for usado, o botão padrão será exibido.\n *\n */\n@Component({\n tag: 'br-modal',\n styleUrl: 'modal.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Modal {\n /** Referência ao elemento host do componente. */\n @Element() el: HTMLBrModalElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = Helpers.generateUniqueId('modal')\n\n /** O texto do título a ser exibido no cabeçalho do modal. Usado quando o slot `header` não é fornecido. */\n @Prop() readonly titleText: string\n\n /** Controla a visibilidade do modal. */\n @Prop({ reflect: true, mutable: true }) show = false\n\n /**\n * Define o comportamento de fechamento do modal.\n *\n * - `true`: O modal fecha automaticamente ao clicar no botão fechar.\n * - `false`: O modal emite `brModalBeforeClose` mas não fecha, permitindo a implementação de lógica customizada (validação, confirmação, etc.) antes do fechamento. O desenvolvedor deve\n * controlar manualmente o fechamento.\n */\n @Prop({ reflect: true }) autoClose = false\n\n /** Seletor CSS para o elemento que deve receber foco quando o modal é aberto. */\n @Prop() readonly initialFocusSelector: string\n\n /**\n * Define o tamanho (largura) do modal.\n */\n @Prop({ reflect: true }) readonly size: 'xsmall' | 'small' | 'medium' | 'large' | 'auto' = 'medium'\n\n /** Se `true`, habilita a rolagem interna do conteúdo do modal. */\n @Prop({ reflect: true }) readonly scrollable = false\n\n /**\n * Define o alinhamento do conteúdo do rodapé (slot=\"footer\").\n */\n @Prop({ reflect: true }) readonly alignFooter: 'start' | 'end' | 'center' = 'center'\n\n private isOpeningParentScrim = false\n\n /**\n * Evento emitido quando o modal é aberto (quando `show` muda de `false` para `true`).\n */\n @Event() brModalOpen: EventEmitter<void>\n\n /**\n * Evento emitido após o modal ser fechado (quando `show` muda de `true` para `false`).\n */\n @Event() brModalClose: EventEmitter<void>\n\n /**\n * Evento emitido antes do fechamento do modal (quando o botão X é clicado).\n * Se autoClose está desativado, o desenvolvedor deve fechar manualmente o modal após este evento.\n * Se autoClose está ativado, o modal fecha automaticamente após este evento.\n */\n @Event() brModalBeforeClose: EventEmitter<void>\n\n @Watch('show')\n handleShowChange(newValue: boolean, oldValue: boolean) {\n if (newValue) {\n this.brModalOpen.emit()\n this.openParentScrim()\n } else if (oldValue === true) {\n this.brModalClose.emit()\n this.closeParentScrim()\n }\n }\n\n private closeParentScrim() {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim && typeof parentScrim.close === 'function') {\n parentScrim.close()\n }\n }\n\n componentWillLoad() {\n if (!this.show) {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim !== null && parentScrim.isOpen) {\n this.show = true\n }\n }\n }\n\n componentDidLoad() {\n this.listenToParentScrimEvents()\n\n if (this.show) {\n this.openParentScrim()\n }\n }\n\n disconnectedCallback() {\n this.isOpeningParentScrim = false\n this.removeParentScrimEventListeners()\n }\n\n /**\n * Adiciona listeners para eventos do parent scrim\n */\n private listenToParentScrimEvents() {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim !== null) {\n parentScrim.addEventListener('brScrimOpen', this.handleParentScrimOpen)\n parentScrim.addEventListener('brScrimClose', this.handleParentScrimClose)\n }\n }\n\n /**\n * Remove listeners de eventos do parent scrim\n */\n private removeParentScrimEventListeners() {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim !== null) {\n parentScrim.removeEventListener('brScrimOpen', this.handleParentScrimOpen)\n parentScrim.removeEventListener('brScrimClose', this.handleParentScrimClose)\n }\n }\n\n /**\n * Handler para evento brScrimOpen do parent scrim\n * Quando scrim abre programaticamente, a modal deve abrir também\n */\n private handleParentScrimOpen = () => {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim === null) return\n\n if (!this.show) {\n this.show = true\n }\n }\n\n /**\n * Handler para evento brScrimClose do parent scrim\n * Se autoClose=true, fecha a modal junto com o scrim\n * Se autoClose=false, não faz nada (modal permanece aberta)\n */\n private handleParentScrimClose = () => {\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim === null) return\n\n if (this.autoClose && this.show) {\n this.show = false\n }\n }\n\n private openParentScrim() {\n if (this.isOpeningParentScrim) return\n\n const parentScrim = this.el.closest('br-scrim')\n if (parentScrim && !parentScrim.isOpen) {\n this.isOpeningParentScrim = true\n\n Promise.resolve()\n .then(() => {\n try {\n return parentScrim.open()\n } catch (error) {\n console.warn('br-modal: Erro ao abrir scrim pai:', error)\n throw error\n }\n })\n .finally(() => {\n this.isOpeningParentScrim = false\n })\n }\n }\n\n private get titleId() {\n return `${this.customId}-title`\n }\n\n private get contentId() {\n return `${this.customId}-content`\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-modal': true,\n [this.size]: true,\n scrollable: this.scrollable,\n }\n }\n\n private handleClose = () => {\n this.brModalBeforeClose.emit()\n\n if (this.autoClose) {\n this.show = false\n }\n }\n\n /**\n * Método público para abrir o modal\n */\n @Method()\n async open() {\n this.show = true\n\n this.openParentScrim()\n }\n\n /**\n * Método público para fechar o modal\n */\n @Method()\n async close() {\n if (!this.autoClose) {\n return\n }\n\n this.show = false\n }\n\n render() {\n if (!this.show) {\n return null\n }\n\n return (\n <Host>\n <div\n class={this.getCssClassMap()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={this.titleId}\n aria-describedby={this.contentId}\n >\n <div class=\"br-modal-header\">\n <div class=\"modal-title\" id={this.titleId}>\n <slot name=\"header\">{this.titleText}</slot>\n </div>\n <slot name=\"close-button\">\n <br-button class=\"close\" shape=\"circle\" density=\"small\" aria-label=\"Fechar\" onClick={this.handleClose}>\n <br-icon icon-name=\"fa-solid:times\"></br-icon>\n </br-button>\n </slot>\n </div>\n <div id={this.contentId} class=\"br-modal-body\">\n <slot></slot>\n </div>\n <div class={`br-modal-footer ${this.alignFooter !== undefined ? `justify-content-${this.alignFooter}` : ''}`}>\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </Host>\n )\n }\n}\n"]}
@@ -2,7 +2,6 @@
2
2
  * Construído por SERPRO
3
3
  * © https://serpro.gov.br/ - MIT License.
4
4
  */
5
- import { __awaiter } from "tslib";
6
5
  import { h, Host, } from "@stencil/core";
7
6
  import Helpers from "../../utils/helpers";
8
7
  /**
@@ -103,19 +102,15 @@ export class Radio {
103
102
  /**
104
103
  * Inverte o valor da prop `checked`
105
104
  */
106
- toggleChecked() {
107
- return __awaiter(this, void 0, void 0, function* () {
108
- this.checked = !this.checked;
109
- });
105
+ async toggleChecked() {
106
+ this.checked = !this.checked;
110
107
  }
111
- setFocus() {
112
- return __awaiter(this, void 0, void 0, function* () {
113
- var _a;
114
- const input = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('input');
115
- if (input) {
116
- input.focus();
117
- }
118
- });
108
+ async setFocus() {
109
+ var _a;
110
+ const input = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('input');
111
+ if (input) {
112
+ input.focus();
113
+ }
119
114
  }
120
115
  getCssClassMap() {
121
116
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"radio.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/radio/radio.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/radio?tab=designer).\n *\n * @slot default - Slot para o rótulo do rádio, como alternativa à propriedade label.\n */\n\n@Component({\n tag: 'br-radio',\n styleUrl: 'radio.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Radio {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrRadioElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Define o estado de seleção do radio.\n * Se definido como verdadeiro, o radio estará marcado. Caso contrário, estará desmarcado.\n */\n @Prop({ reflect: true, mutable: true }) checked: boolean = false\n\n /**\n * Desativa o radio, tornando-o não interativo.\n */\n @Prop({ reflect: true }) readonly disabled: boolean = false\n\n /**\n * Indica a validade do radio.\n * Se não for especificado, o valor padrão é `null`, indicando que a validade não foi definida.\n */\n @Prop({ reflect: true }) readonly state: 'valid' | 'invalid'\n\n /**\n * Define se o label associado ao radio deve ser oculto.\n * Se definido como verdadeiro, o texto do label será oculto, mas o radio ainda estará visível e funcional.\n */\n @Prop({ reflect: true, attribute: 'has-hidden-label' }) readonly hasHiddenLabel: boolean = false\n\n /**\n * Identificador único; gerado automaticamente quando omitido.\n */\n @Prop({ reflect: true }) readonly customId: string = Helpers.generateUniqueId('br-radio')\n\n /**\n * Define o nome do radio, que é utilizado para agrupar radios em formulários e identificar o campo.\n * O valor é obrigatório e deve ser fornecido para garantir o correto funcionamento em formulários.\n */\n\n @Prop({ reflect: true }) readonly name!: string\n\n /**\n * Texto descritivo exibido à direita do radio.\n * Caso um slot seja utilizado para fornecer um texto alternativo, o valor desta propriedade será ignorado.\n */\n @Prop({ reflect: true }) readonly label: string\n\n /**\n * Define o valor associado ao radio quando ele faz parte de um formulário nativo (`<form>`).\n * Esse valor é enviado com o formulário quando o radio está selecionado.\n * **Nota:** Esta propriedade não deve ser utilizada para determinar se o radio está selecionado; para verificar o estado de seleção, use a propriedade `checked`.\n */\n @Prop({ reflect: true }) readonly value: string\n\n @State() updateTrigger: number = 0\n\n /**\n * Disparado depois que o valor do `checked` foi alterado\n */\n @Event({ bubbles: true, composed: true }) checkedChange: EventEmitter<boolean>\n\n @Watch('checked')\n checkedChanged(isChecked: boolean) {\n this.checkedChange.emit(isChecked)\n }\n\n @Listen('checkedChange', { target: 'window' })\n handleCheckedChange(event: CustomEvent) {\n if (\n (event.target as HTMLBrRadioElement).customId !== this.customId &&\n (event.target as HTMLBrRadioElement).name === this.name\n ) {\n const isSiblingChecked = event.detail\n\n if (isSiblingChecked) {\n if (this.checked) {\n this.checked = false\n }\n }\n // Always re-evaluate focusability (tabIndex) when siblings change\n this.updateTrigger++\n }\n }\n\n /**\n * Navega e seleciona o próximo/anterior rádio habilitado no grupo via teclas de seta.\n * Ativado por 'keydown', move a seleção entre rádios do mesmo 'name'\n * usando as setas, partindo do rádio atualmente checado.\n * @param {KeyboardEvent} event O evento de teclado.\n * @listens keydown\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (this.disabled) return\n\n const isArrowKey = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)\n if (!isArrowKey) return\n\n // Prevent default scrolling\n event.preventDefault()\n\n const root = this.el.getRootNode() as Document | ShadowRoot\n const radios = Array.from(root.querySelectorAll<HTMLBrRadioElement>('br-radio')).filter(\n (el: HTMLBrRadioElement) => el.name === this.name && !el.disabled\n )\n\n const currentIndex = radios.indexOf(this.el)\n if (currentIndex === -1) return\n\n let nextIndex = currentIndex\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n nextIndex = (currentIndex + 1) % radios.length\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n nextIndex = (currentIndex - 1 + radios.length) % radios.length\n }\n\n const nextRadio = radios[nextIndex]\n if (nextRadio) {\n if (!nextRadio.checked) {\n nextRadio.toggleChecked()\n }\n ;(nextRadio as any).setFocus()\n }\n }\n\n /**\n * Inverte o valor da prop `checked`\n */\n @Method()\n async toggleChecked() {\n this.checked = !this.checked\n }\n\n @Method()\n async setFocus() {\n const input = this.el.shadowRoot?.querySelector('input')\n if (input) {\n input.focus()\n }\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-radio': true,\n valid: this.state === 'valid',\n invalid: this.state === 'invalid',\n disabled: this.disabled,\n 'hidden-label': this.hasHiddenLabel,\n }\n }\n\n /**\n * Handler para o event `click`\n * @param event Objeto Event\n */\n private readonly onClick = (event: MouseEvent) => {\n event.stopPropagation()\n this.checked = (event.target as HTMLInputElement).checked\n }\n\n /**\n * Handler para o evento `change`\n */\n private readonly onChange = () => {\n // this.checkedChange.emit(this.checked) - handled by Watch\n }\n\n private computeTabIndex(): number {\n if (this.disabled) return -1\n if (this.checked) return 0\n\n // If unchecked, we are only focusable (0) if NO sibling is checked AND we are the first enabled sibling.\n const root = this.el.getRootNode() as Document | ShadowRoot\n if (!root) return 0 // Fallback\n\n const radios = Array.from(root.querySelectorAll<HTMLBrRadioElement>('br-radio')).filter(\n (r) => r.name === this.name && !r.disabled\n )\n\n const anyChecked = radios.some((r) => r.checked)\n if (anyChecked) return -1\n\n return radios[0] === this.el ? 0 : -1\n }\n\n render() {\n return (\n <Host aria-disabled={this.disabled ? 'true' : null}>\n <div class={this.getCssClassMap()}>\n <input\n part=\"radio-input\"\n aria-label={this.hasHiddenLabel && this.label ? this.label : null}\n type=\"radio\"\n id={this.customId}\n name={this.name}\n checked={this.checked}\n disabled={this.disabled}\n value={this.value}\n tabIndex={this.computeTabIndex()}\n onClick={this.onClick}\n onChange={this.onChange}\n />\n <label part=\"radio-label\" htmlFor={this.customId}>\n <slot>{this.label}</slot>\n </label>\n </div>\n </Host>\n )\n }\n}\n"]}
1
+ {"version":3,"file":"radio.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/radio/radio.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core'\n\nimport Helpers from '../../utils/helpers'\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * ## Design System\n *\n * Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o [Design System do GovBR](https://www.gov.br/ds/components/radio?tab=designer).\n *\n * @slot default - Slot para o rótulo do rádio, como alternativa à propriedade label.\n */\n\n@Component({\n tag: 'br-radio',\n styleUrl: 'radio.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Radio {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrRadioElement\n\n @AttachInternals() elementInternals: ElementInternals\n\n /**\n * Define o estado de seleção do radio.\n * Se definido como verdadeiro, o radio estará marcado. Caso contrário, estará desmarcado.\n */\n @Prop({ reflect: true, mutable: true }) checked: boolean = false\n\n /**\n * Desativa o radio, tornando-o não interativo.\n */\n @Prop({ reflect: true }) readonly disabled: boolean = false\n\n /**\n * Indica a validade do radio.\n * Se não for especificado, o valor padrão é `null`, indicando que a validade não foi definida.\n */\n @Prop({ reflect: true }) readonly state: 'valid' | 'invalid'\n\n /**\n * Define se o label associado ao radio deve ser oculto.\n * Se definido como verdadeiro, o texto do label será oculto, mas o radio ainda estará visível e funcional.\n */\n @Prop({ reflect: true, attribute: 'has-hidden-label' }) readonly hasHiddenLabel: boolean = false\n\n /**\n * Identificador único; gerado automaticamente quando omitido.\n */\n @Prop({ reflect: true }) readonly customId: string = Helpers.generateUniqueId('br-radio')\n\n /**\n * Define o nome do radio, que é utilizado para agrupar radios em formulários e identificar o campo.\n * O valor é obrigatório e deve ser fornecido para garantir o correto funcionamento em formulários.\n */\n\n @Prop({ reflect: true }) readonly name!: string\n\n /**\n * Texto descritivo exibido à direita do radio.\n * Caso um slot seja utilizado para fornecer um texto alternativo, o valor desta propriedade será ignorado.\n */\n @Prop({ reflect: true }) readonly label: string\n\n /**\n * Define o valor associado ao radio quando ele faz parte de um formulário nativo (`<form>`).\n * Esse valor é enviado com o formulário quando o radio está selecionado.\n * **Nota:** Esta propriedade não deve ser utilizada para determinar se o radio está selecionado; para verificar o estado de seleção, use a propriedade `checked`.\n */\n @Prop({ reflect: true }) readonly value: string\n\n @State() updateTrigger: number = 0\n\n /**\n * Disparado depois que o valor do `checked` foi alterado\n */\n @Event({ bubbles: true, composed: true }) checkedChange: EventEmitter<boolean>\n\n @Watch('checked')\n checkedChanged(isChecked: boolean) {\n this.checkedChange.emit(isChecked)\n }\n\n @Listen('checkedChange', { target: 'window' })\n handleCheckedChange(event: CustomEvent) {\n if (\n (event.target as HTMLBrRadioElement).customId !== this.customId &&\n (event.target as HTMLBrRadioElement).name === this.name\n ) {\n const isSiblingChecked = event.detail\n\n if (isSiblingChecked) {\n if (this.checked) {\n this.checked = false\n }\n }\n // Always re-evaluate focusability (tabIndex) when siblings change\n this.updateTrigger++\n }\n }\n\n /**\n * Navega e seleciona o próximo/anterior rádio habilitado no grupo via teclas de seta.\n * Ativado por 'keydown', move a seleção entre rádios do mesmo 'name'\n * usando as setas, partindo do rádio atualmente checado.\n * @param {KeyboardEvent} event O evento de teclado.\n * @listens keydown\n */\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (this.disabled) return\n\n const isArrowKey = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)\n if (!isArrowKey) return\n\n // Prevent default scrolling\n event.preventDefault()\n\n const root = this.el.getRootNode() as Document | ShadowRoot\n const radios = Array.from(root.querySelectorAll<HTMLBrRadioElement>('br-radio')).filter(\n (el: HTMLBrRadioElement) => el.name === this.name && !el.disabled\n )\n\n const currentIndex = radios.indexOf(this.el)\n if (currentIndex === -1) return\n\n let nextIndex = currentIndex\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n nextIndex = (currentIndex + 1) % radios.length\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n nextIndex = (currentIndex - 1 + radios.length) % radios.length\n }\n\n const nextRadio = radios[nextIndex]\n if (nextRadio) {\n if (!nextRadio.checked) {\n nextRadio.toggleChecked()\n }\n ;(nextRadio as any).setFocus()\n }\n }\n\n /**\n * Inverte o valor da prop `checked`\n */\n @Method()\n async toggleChecked() {\n this.checked = !this.checked\n }\n\n @Method()\n async setFocus() {\n const input = this.el.shadowRoot?.querySelector('input')\n if (input) {\n input.focus()\n }\n }\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-radio': true,\n valid: this.state === 'valid',\n invalid: this.state === 'invalid',\n disabled: this.disabled,\n 'hidden-label': this.hasHiddenLabel,\n }\n }\n\n /**\n * Handler para o event `click`\n * @param event Objeto Event\n */\n private readonly onClick = (event: MouseEvent) => {\n event.stopPropagation()\n this.checked = (event.target as HTMLInputElement).checked\n }\n\n /**\n * Handler para o evento `change`\n */\n private readonly onChange = () => {\n // this.checkedChange.emit(this.checked) - handled by Watch\n }\n\n private computeTabIndex(): number {\n if (this.disabled) return -1\n if (this.checked) return 0\n\n // If unchecked, we are only focusable (0) if NO sibling is checked AND we are the first enabled sibling.\n const root = this.el.getRootNode() as Document | ShadowRoot\n if (!root) return 0 // Fallback\n\n const radios = Array.from(root.querySelectorAll<HTMLBrRadioElement>('br-radio')).filter(\n (r) => r.name === this.name && !r.disabled\n )\n\n const anyChecked = radios.some((r) => r.checked)\n if (anyChecked) return -1\n\n return radios[0] === this.el ? 0 : -1\n }\n\n render() {\n return (\n <Host aria-disabled={this.disabled ? 'true' : null}>\n <div class={this.getCssClassMap()}>\n <input\n part=\"radio-input\"\n aria-label={this.hasHiddenLabel && this.label ? this.label : null}\n type=\"radio\"\n id={this.customId}\n name={this.name}\n checked={this.checked}\n disabled={this.disabled}\n value={this.value}\n tabIndex={this.computeTabIndex()}\n onClick={this.onClick}\n onChange={this.onChange}\n />\n <label part=\"radio-label\" htmlFor={this.customId}>\n <slot>{this.label}</slot>\n </label>\n </div>\n </Host>\n )\n }\n}\n"]}