@ionic/core 8.7.10-dev.11762798751.11b77c85 → 8.7.10-dev.11763406256.1a4bac8c

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 (281) hide show
  1. package/components/checkbox.js +63 -9
  2. package/components/ion-input.js +7 -6
  3. package/components/ion-searchbar.js +6 -6
  4. package/components/ion-select.js +7 -6
  5. package/components/ion-textarea.js +2 -1
  6. package/components/ion-toggle.js +62 -12
  7. package/components/notch-controller.js +153 -0
  8. package/components/radio-group.js +60 -7
  9. package/components/validity.js +1 -150
  10. package/dist/cjs/{animation-D_c13yq_.js → animation-Bt3H9L1C.js} +1 -1
  11. package/dist/cjs/{app-globals--1qFsqEw.js → app-globals-Ciccnk9_.js} +1 -1
  12. package/dist/cjs/{button-active-CQiBOKCI.js → button-active-CMc8cD90.js} +1 -1
  13. package/dist/cjs/{config-DL8XJF0D.js → config-C5fsO43a.js} +1 -1
  14. package/dist/cjs/{data-DtEHxOpt.js → data-JwZKaIQB.js} +1 -1
  15. package/dist/cjs/{framework-delegate-DmSgIb_h.js → framework-delegate-DMJRBuDi.js} +1 -1
  16. package/dist/cjs/{hardware-back-button-C72O8m7E.js → hardware-back-button-VCK4V3mG.js} +1 -1
  17. package/dist/cjs/{helpers-xCoR213K.js → helpers-DrTqNghc.js} +1 -1
  18. package/dist/cjs/{index-WEBAL2Zz.js → index-094mMFB-.js} +4 -4
  19. package/dist/cjs/{index-DOeyHw27.js → index-C534ULug.js} +2 -2
  20. package/dist/cjs/{index-FugOCm8C.js → index-CO6eryBo.js} +2 -2
  21. package/dist/cjs/{index-qWlbeMTM.js → index-D6Wc6v08.js} +3 -41
  22. package/dist/cjs/{index-FdJ4-6Rg.js → index-DrMUZJj6.js} +5 -5
  23. package/dist/cjs/index.cjs.js +12 -12
  24. package/dist/cjs/{input-shims-CYpwizql.js → input-shims-CW0KUFTQ.js} +3 -3
  25. package/dist/cjs/{input.utils-DhlH-Ng5.js → input.utils-B_QROI2g.js} +2 -2
  26. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  27. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  28. package/dist/cjs/ion-alert.cjs.entry.js +9 -9
  29. package/dist/cjs/ion-app_8.cjs.entry.js +12 -12
  30. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  31. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  32. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  33. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  34. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  35. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  36. package/dist/cjs/ion-checkbox.cjs.entry.js +63 -11
  37. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  38. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  39. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  40. package/dist/cjs/ion-datetime_3.cjs.entry.js +8 -8
  41. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  42. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  43. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  44. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  45. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  46. package/dist/cjs/ion-input.cjs.entry.js +11 -10
  47. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  48. package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
  49. package/dist/cjs/ion-loading.cjs.entry.js +8 -8
  50. package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
  51. package/dist/cjs/ion-modal.cjs.entry.js +9 -9
  52. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  53. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  54. package/dist/cjs/ion-picker-column.cjs.entry.js +3 -3
  55. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  56. package/dist/cjs/ion-popover.cjs.entry.js +8 -8
  57. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  58. package/dist/cjs/ion-radio_2.cjs.entry.js +60 -9
  59. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  60. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  61. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  62. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  63. package/dist/cjs/ion-route_4.cjs.entry.js +3 -3
  64. package/dist/cjs/ion-searchbar.cjs.entry.js +8 -8
  65. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  66. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  67. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  68. package/dist/cjs/ion-select-modal.cjs.entry.js +6 -6
  69. package/dist/cjs/ion-select_3.cjs.entry.js +13 -12
  70. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  71. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  72. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
  73. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  74. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  75. package/dist/cjs/ion-textarea.cjs.entry.js +7 -6
  76. package/dist/cjs/ion-toast.cjs.entry.js +8 -8
  77. package/dist/cjs/ion-toggle.cjs.entry.js +61 -13
  78. package/dist/cjs/{ionic-global-CR8JSFWa.js → ionic-global-HMVqOFGO.js} +1 -1
  79. package/dist/cjs/ionic.cjs.js +5 -5
  80. package/dist/cjs/{ios.transition-MQamiuLS.js → ios.transition-BOt_uW73.js} +4 -4
  81. package/dist/cjs/loader.cjs.js +4 -4
  82. package/dist/cjs/{md.transition-VK5nuqXu.js → md.transition-Dt968VXB.js} +4 -4
  83. package/dist/cjs/{validity-ilhIJL9Q.js → notch-controller-Bzqhjm4f.js} +1 -15
  84. package/dist/cjs/{overlays-DcMnmLe2.js → overlays-DxIZwUXI.js} +5 -5
  85. package/dist/cjs/{status-tap-C0NZlIwJ.js → status-tap-g0sWWkXk.js} +3 -3
  86. package/dist/cjs/{swipe-back-CdOHy9bk.js → swipe-back-BIayeNOD.js} +2 -2
  87. package/dist/cjs/validity-BpS37YFM.js +19 -0
  88. package/dist/collection/collection-manifest.json +2 -2
  89. package/dist/collection/components/checkbox/checkbox.js +67 -9
  90. package/dist/collection/components/input/input.js +8 -8
  91. package/dist/collection/components/radio-group/radio-group.js +64 -7
  92. package/dist/collection/components/searchbar/searchbar.js +9 -9
  93. package/dist/collection/components/select/select.js +5 -5
  94. package/dist/collection/components/toggle/toggle.js +62 -12
  95. package/dist/docs.json +25 -15
  96. package/dist/esm/{animation-BMjqGaKJ.js → animation-Dt8bGnA-.js} +1 -1
  97. package/dist/esm/{app-globals-CXKe5CYv.js → app-globals-BDSf8fOA.js} +1 -1
  98. package/dist/esm/{button-active-DsHCf5yJ.js → button-active-L570Swow.js} +1 -1
  99. package/dist/esm/{config-FyGnL1d5.js → config-mCdtaoPe.js} +1 -1
  100. package/dist/esm/{data-VwBJONjN.js → data-DCORV9FH.js} +1 -1
  101. package/dist/esm/{framework-delegate-DA71As64.js → framework-delegate-BYawdMXj.js} +1 -1
  102. package/dist/esm/{hardware-back-button-gEuwgxq4.js → hardware-back-button-CPLxO-Ev.js} +1 -1
  103. package/dist/esm/{helpers-Br4puuoA.js → helpers-DEn3pfjm.js} +1 -1
  104. package/dist/esm/{index-nzxJGPo-.js → index-Bs3kT4bc.js} +2 -2
  105. package/dist/esm/{index-COOKa-0k.js → index-C8IsBmNU.js} +3 -41
  106. package/dist/esm/{index-DNUVD4sY.js → index-CvDIirVx.js} +5 -5
  107. package/dist/esm/{index-CZzUL5H7.js → index-ceb5RaMT.js} +2 -2
  108. package/dist/esm/{index-DKnepNGf.js → index-r2D9DEro.js} +4 -4
  109. package/dist/esm/index.js +12 -12
  110. package/dist/esm/{input-shims-G0QQ_JXi.js → input-shims-DyOpfTg6.js} +3 -3
  111. package/dist/esm/{input.utils-BRuJbV55.js → input.utils-DrvTa8gz.js} +2 -2
  112. package/dist/esm/ion-accordion_2.entry.js +3 -3
  113. package/dist/esm/ion-action-sheet.entry.js +8 -8
  114. package/dist/esm/ion-alert.entry.js +9 -9
  115. package/dist/esm/ion-app_8.entry.js +12 -12
  116. package/dist/esm/ion-avatar_3.entry.js +2 -2
  117. package/dist/esm/ion-back-button.entry.js +3 -3
  118. package/dist/esm/ion-backdrop.entry.js +2 -2
  119. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  120. package/dist/esm/ion-button_2.entry.js +3 -3
  121. package/dist/esm/ion-card_5.entry.js +3 -3
  122. package/dist/esm/ion-checkbox.entry.js +63 -11
  123. package/dist/esm/ion-chip.entry.js +2 -2
  124. package/dist/esm/ion-col_3.entry.js +2 -2
  125. package/dist/esm/ion-datetime-button.entry.js +4 -4
  126. package/dist/esm/ion-datetime_3.entry.js +8 -8
  127. package/dist/esm/ion-fab_3.entry.js +3 -3
  128. package/dist/esm/ion-img.entry.js +3 -3
  129. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  130. package/dist/esm/ion-input-otp.entry.js +3 -3
  131. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  132. package/dist/esm/ion-input.entry.js +10 -9
  133. package/dist/esm/ion-item-option_3.entry.js +4 -4
  134. package/dist/esm/ion-item_8.entry.js +3 -3
  135. package/dist/esm/ion-loading.entry.js +8 -8
  136. package/dist/esm/ion-menu_3.entry.js +8 -8
  137. package/dist/esm/ion-modal.entry.js +9 -9
  138. package/dist/esm/ion-nav_2.entry.js +6 -6
  139. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  140. package/dist/esm/ion-picker-column.entry.js +3 -3
  141. package/dist/esm/ion-picker.entry.js +2 -2
  142. package/dist/esm/ion-popover.entry.js +8 -8
  143. package/dist/esm/ion-progress-bar.entry.js +3 -3
  144. package/dist/esm/ion-radio_2.entry.js +60 -9
  145. package/dist/esm/ion-range.entry.js +4 -4
  146. package/dist/esm/ion-refresher_2.entry.js +6 -6
  147. package/dist/esm/ion-reorder_2.entry.js +4 -4
  148. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  149. package/dist/esm/ion-route_4.entry.js +3 -3
  150. package/dist/esm/ion-searchbar.entry.js +8 -8
  151. package/dist/esm/ion-segment-content.entry.js +1 -1
  152. package/dist/esm/ion-segment-view.entry.js +1 -1
  153. package/dist/esm/ion-segment_2.entry.js +3 -3
  154. package/dist/esm/ion-select-modal.entry.js +6 -6
  155. package/dist/esm/ion-select_3.entry.js +12 -11
  156. package/dist/esm/ion-spinner.entry.js +2 -2
  157. package/dist/esm/ion-split-pane.entry.js +2 -2
  158. package/dist/esm/ion-tab-bar_2.entry.js +3 -3
  159. package/dist/esm/ion-tab_2.entry.js +3 -3
  160. package/dist/esm/ion-text.entry.js +2 -2
  161. package/dist/esm/ion-textarea.entry.js +6 -5
  162. package/dist/esm/ion-toast.entry.js +8 -8
  163. package/dist/esm/ion-toggle.entry.js +61 -13
  164. package/dist/esm/{ionic-global-ssiordoc.js → ionic-global-CDrldh-5.js} +1 -1
  165. package/dist/esm/ionic.js +6 -6
  166. package/dist/esm/{ios.transition-CdWk5te_.js → ios.transition-BDzw0_Hm.js} +4 -4
  167. package/dist/esm/loader.js +5 -5
  168. package/dist/esm/{md.transition-CTwmjwnm.js → md.transition-BzDYi3qq.js} +4 -4
  169. package/dist/esm/{validity-CwxNVaqN.js → notch-controller-BwelN_JM.js} +2 -15
  170. package/dist/esm/{overlays-DNIbGUWk.js → overlays-BymNv-BL.js} +5 -5
  171. package/dist/esm/{status-tap-B6uPB7F5.js → status-tap-5DQ7Fc4V.js} +3 -3
  172. package/dist/esm/{swipe-back-INesdA_O.js → swipe-back-BKw2CAHc.js} +2 -2
  173. package/dist/esm/validity-DJztqcrH.js +17 -0
  174. package/dist/html.html-data.json +18 -2
  175. package/dist/ionic/index.esm.js +1 -1
  176. package/dist/ionic/ionic.esm.js +1 -1
  177. package/dist/ionic/{p-2b9e100d.entry.js → p-020af078.entry.js} +1 -1
  178. package/dist/ionic/p-074839fc.entry.js +4 -0
  179. package/dist/ionic/{p-964e89ac.entry.js → p-0b80d700.entry.js} +1 -1
  180. package/dist/ionic/{p-894e8953.entry.js → p-0dfa5a37.entry.js} +1 -1
  181. package/dist/ionic/{p-3807749f.entry.js → p-11518b31.entry.js} +1 -1
  182. package/dist/ionic/{p-fcd74818.entry.js → p-15193d01.entry.js} +1 -1
  183. package/dist/ionic/{p-c49f0f68.entry.js → p-1647c46c.entry.js} +1 -1
  184. package/dist/ionic/{p-116a97cb.entry.js → p-2a939845.entry.js} +1 -1
  185. package/dist/ionic/{p-3c522786.entry.js → p-316c0420.entry.js} +1 -1
  186. package/dist/ionic/{p-860f309a.entry.js → p-31f7095f.entry.js} +1 -1
  187. package/dist/ionic/{p-adde497f.entry.js → p-370e4237.entry.js} +1 -1
  188. package/dist/ionic/{p-ef8c7682.entry.js → p-3a6caca9.entry.js} +1 -1
  189. package/dist/ionic/p-40c261a3.entry.js +4 -0
  190. package/dist/ionic/{p-06881392.entry.js → p-43ed1ef5.entry.js} +1 -1
  191. package/dist/ionic/{p-a66bbfa0.entry.js → p-46d74291.entry.js} +1 -1
  192. package/dist/ionic/{p-7047a7b7.entry.js → p-49d06882.entry.js} +1 -1
  193. package/dist/ionic/{p-d0f6b9a7.entry.js → p-4c85d268.entry.js} +1 -1
  194. package/dist/ionic/p-4e41ea20.entry.js +4 -0
  195. package/dist/ionic/{p-5d600703.entry.js → p-4efea47a.entry.js} +1 -1
  196. package/dist/ionic/{p-dfd6acb5.entry.js → p-510d86e1.entry.js} +1 -1
  197. package/dist/ionic/p-51a60e0f.entry.js +4 -0
  198. package/dist/ionic/{p-dfc6f4b1.entry.js → p-582824c5.entry.js} +1 -1
  199. package/dist/ionic/{p-259e4068.entry.js → p-6241ce47.entry.js} +1 -1
  200. package/dist/ionic/{p-4ede0a73.entry.js → p-639dd543.entry.js} +1 -1
  201. package/dist/ionic/{p-7a19f3d1.entry.js → p-6444c606.entry.js} +1 -1
  202. package/dist/ionic/{p-c7f3e813.entry.js → p-675b1a31.entry.js} +1 -1
  203. package/dist/ionic/{p-db44afdd.entry.js → p-6d070558.entry.js} +1 -1
  204. package/dist/ionic/{p-5dcbb52f.entry.js → p-7268efa5.entry.js} +1 -1
  205. package/dist/ionic/{p-c6b68ac0.entry.js → p-72c38b88.entry.js} +1 -1
  206. package/dist/ionic/p-7380261c.entry.js +4 -0
  207. package/dist/ionic/{p-a41048a1.entry.js → p-79bd78f9.entry.js} +1 -1
  208. package/dist/ionic/{p-295a2119.entry.js → p-7da39a4d.entry.js} +1 -1
  209. package/dist/ionic/{p-d24d55cb.entry.js → p-83be404e.entry.js} +1 -1
  210. package/dist/ionic/{p-70c66710.entry.js → p-86f53961.entry.js} +1 -1
  211. package/dist/ionic/{p-db648b6a.entry.js → p-94de5cfa.entry.js} +1 -1
  212. package/dist/ionic/{p-6fe93af5.entry.js → p-9575b654.entry.js} +1 -1
  213. package/dist/ionic/{p-bef7bd83.entry.js → p-98fc09eb.entry.js} +1 -1
  214. package/dist/ionic/{p-BA44xiai.js → p-B0q1YL7N.js} +1 -1
  215. package/dist/ionic/p-BFvmZNyx.js +4 -0
  216. package/dist/ionic/p-BKc55Xev.js +4 -0
  217. package/dist/ionic/{p-baqdazzM.js → p-BOVrCkpJ.js} +1 -1
  218. package/dist/ionic/{p-CT3hZD31.js → p-BYEqWnSg.js} +1 -1
  219. package/dist/ionic/p-Bmgaetn_.js +4 -0
  220. package/dist/ionic/{p-CUek2VVk.js → p-C7hRNDhM.js} +1 -1
  221. package/dist/ionic/p-C8IsBmNU.js +5 -0
  222. package/dist/ionic/{p-CYTVJxfQ.js → p-CJxh_yLS.js} +1 -1
  223. package/dist/ionic/{p-C8VsQFea.js → p-CTfR9YZG.js} +1 -1
  224. package/dist/ionic/p-CwgG81ZD.js +4 -0
  225. package/dist/ionic/{p-UCpjvnQe.js → p-D-eFFUkA.js} +1 -1
  226. package/dist/ionic/{p-DddcVlzx.js → p-D0dMcSkw.js} +1 -1
  227. package/dist/ionic/{p-ynapDa0U.js → p-D87hU-Ly.js} +1 -1
  228. package/dist/ionic/{p-C9IcKRgw.js → p-DCv9sLH2.js} +1 -1
  229. package/dist/ionic/p-DDb5r57F.js +4 -0
  230. package/dist/ionic/p-DJztqcrH.js +4 -0
  231. package/dist/ionic/{p-yu2f42Nv.js → p-DNcfiJwE.js} +1 -1
  232. package/dist/ionic/{p-CETqdl8n.js → p-DUt5fQmA.js} +1 -1
  233. package/dist/ionic/p-DZRJwG4S.js +4 -0
  234. package/dist/ionic/{p-D8G3beZX.js → p-DbQ5QkTP.js} +1 -1
  235. package/dist/ionic/{p-BUluHF_z.js → p-Dc45iWE4.js} +1 -1
  236. package/dist/ionic/{p-Bzed_Vkc.js → p-QHYY4sjU.js} +1 -1
  237. package/dist/ionic/{p-3ca55cd6.entry.js → p-a127bee2.entry.js} +1 -1
  238. package/dist/ionic/{p-b3da5db0.entry.js → p-a80f1b04.entry.js} +1 -1
  239. package/dist/ionic/{p-948228a2.entry.js → p-ac4eb91d.entry.js} +1 -1
  240. package/dist/ionic/{p-7078b759.entry.js → p-b0a7585c.entry.js} +1 -1
  241. package/dist/ionic/{p-3549e539.entry.js → p-b57c6d3e.entry.js} +1 -1
  242. package/dist/ionic/p-c19f63d0.entry.js +4 -0
  243. package/dist/ionic/{p-e1547a17.entry.js → p-cc45bcbc.entry.js} +1 -1
  244. package/dist/ionic/{p-e1c3b35d.entry.js → p-d0a2a1ab.entry.js} +1 -1
  245. package/dist/ionic/{p-89c2d5ea.entry.js → p-d126e8d3.entry.js} +1 -1
  246. package/dist/ionic/p-d1f54e28.entry.js +4 -0
  247. package/dist/ionic/p-d3014190.entry.js +4 -0
  248. package/dist/ionic/{p-93d7685c.entry.js → p-da7d04cc.entry.js} +1 -1
  249. package/dist/ionic/p-dbbe606a.entry.js +4 -0
  250. package/dist/ionic/{p-0144ab54.entry.js → p-e16b69e1.entry.js} +1 -1
  251. package/dist/ionic/{p-d27a5c0b.entry.js → p-f8f22cc0.entry.js} +1 -1
  252. package/dist/types/components/checkbox/checkbox.d.ts +9 -1
  253. package/dist/types/components/header/header.utils.d.ts +1 -2
  254. package/dist/types/components/input/input.d.ts +1 -1
  255. package/dist/types/components/radio-group/radio-group.d.ts +9 -1
  256. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  257. package/dist/types/components/select/select.d.ts +2 -2
  258. package/dist/types/components/toggle/toggle.d.ts +7 -1
  259. package/dist/types/components.d.ts +8 -8
  260. package/dist/types/stencil-public-runtime.d.ts +9 -19
  261. package/dist/types/utils/forms/validity.d.ts +1 -1
  262. package/dist/types/utils/gesture/listener.d.ts +1 -2
  263. package/hydrate/index.js +369 -356
  264. package/hydrate/index.mjs +369 -356
  265. package/package.json +3 -3
  266. package/dist/ionic/p-0188f4a6.entry.js +0 -4
  267. package/dist/ionic/p-14e08559.entry.js +0 -4
  268. package/dist/ionic/p-22bcfae9.entry.js +0 -4
  269. package/dist/ionic/p-45c80fd7.entry.js +0 -4
  270. package/dist/ionic/p-49a21ffb.entry.js +0 -4
  271. package/dist/ionic/p-5cf136b5.entry.js +0 -4
  272. package/dist/ionic/p-9fc9dfae.entry.js +0 -4
  273. package/dist/ionic/p-BS-HlVX0.js +0 -4
  274. package/dist/ionic/p-BWS2Niqo.js +0 -4
  275. package/dist/ionic/p-CCKqmAua.js +0 -4
  276. package/dist/ionic/p-COOKa-0k.js +0 -5
  277. package/dist/ionic/p-CSQuMCUi.js +0 -4
  278. package/dist/ionic/p-PfJ1h_Zm.js +0 -4
  279. package/dist/ionic/p-edcc6f4f.entry.js +0 -4
  280. package/dist/ionic/p-f53597ee.entry.js +0 -4
  281. package/dist/ionic/p-w2EzNm9e.js +0 -4
package/hydrate/index.js CHANGED
@@ -130,7 +130,7 @@ function hydrateFactory($stencilWindow, $stencilHydrateOpts, $stencilHydrateResu
130
130
 
131
131
 
132
132
  const NAMESPACE = 'ionic';
133
- const BUILD = /* ionic */ { hydratedSelectorName: "hydrated", slotRelocation: true, state: true, updatable: true};
133
+ const BUILD = /* ionic */ { hydratedSelectorName: "hydrated", slotRelocation: true, updatable: true};
134
134
 
135
135
  // TODO(FW-2832): types
136
136
  class Config {
@@ -392,7 +392,7 @@ const initialize = (userConfig = {}) => {
392
392
  const globalScripts = initialize;
393
393
 
394
394
  /*
395
- Stencil Hydrate Platform v4.38.3 | MIT Licensed | https://stenciljs.com
395
+ Stencil Hydrate Platform v4.38.0 | MIT Licensed | https://stenciljs.com
396
396
  */
397
397
  var __defProp = Object.defineProperty;
398
398
  var __export = (target, all) => {
@@ -428,40 +428,6 @@ var TYPE_CONSTANT = "type";
428
428
  var VALUE_CONSTANT = "value";
429
429
  var SERIALIZED_PREFIX = "serialized:";
430
430
 
431
- // src/utils/es2022-rewire-class-members.ts
432
- var reWireGetterSetter = (instance, hostRef) => {
433
- var _a;
434
- const cmpMeta = hostRef.$cmpMeta$;
435
- const members = Object.entries((_a = cmpMeta.$members$) != null ? _a : {});
436
- members.map(([memberName, [memberFlags]]) => {
437
- if ((memberFlags & 31 /* Prop */ || memberFlags & 32 /* State */)) {
438
- const ogValue = instance[memberName];
439
- const ogDescriptor = getPropertyDescriptor(Object.getPrototypeOf(instance), memberName) || Object.getOwnPropertyDescriptor(instance, memberName);
440
- if (ogDescriptor) {
441
- Object.defineProperty(instance, memberName, {
442
- get() {
443
- return ogDescriptor.get.call(this);
444
- },
445
- set(newValue) {
446
- ogDescriptor.set.call(this, newValue);
447
- },
448
- configurable: true,
449
- enumerable: true
450
- });
451
- }
452
- instance[memberName] = hostRef.$instanceValues$.has(memberName) ? hostRef.$instanceValues$.get(memberName) : ogValue;
453
- }
454
- });
455
- };
456
- function getPropertyDescriptor(obj, memberName) {
457
- while (obj) {
458
- const desc = Object.getOwnPropertyDescriptor(obj, memberName);
459
- if (desc == null ? void 0 : desc.get) return desc;
460
- obj = Object.getPrototypeOf(obj);
461
- }
462
- return void 0;
463
- }
464
-
465
431
  // src/utils/helpers.ts
466
432
  var isDef = (v) => v != null && v !== void 0;
467
433
  var isComplexType = (o) => {
@@ -3681,9 +3647,6 @@ var registerInstance = (lazyInstance, hostRef) => {
3681
3647
  if (!hostRef) return void 0;
3682
3648
  lazyInstance.__stencil__getHostRef = () => hostRef;
3683
3649
  hostRef.$lazyInstance$ = lazyInstance;
3684
- if (hostRef.$cmpMeta$.$flags$ & 512 /* hasModernPropertyDecls */ && (BUILD.state)) {
3685
- reWireGetterSetter(lazyInstance, hostRef);
3686
- }
3687
3650
  return hostRef;
3688
3651
  };
3689
3652
  var registerHost = (elm, cmpMeta) => {
@@ -9722,6 +9685,202 @@ class CardTitle {
9722
9685
  }; }
9723
9686
  }
9724
9687
 
9688
+ /**
9689
+ * A utility to calculate the size of an outline notch
9690
+ * width relative to the content passed. This is used in
9691
+ * components such as `ion-select` with `fill="outline"`
9692
+ * where we need to pass slotted HTML content. This is not
9693
+ * needed when rendering plaintext content because we can
9694
+ * render the plaintext again hidden with `opacity: 0` inside
9695
+ * of the notch. As a result we can rely on the intrinsic size
9696
+ * of the element to correctly compute the notch width. We
9697
+ * cannot do this with slotted content because we cannot project
9698
+ * it into 2 places at once.
9699
+ *
9700
+ * @internal
9701
+ * @param el: The host element
9702
+ * @param getNotchSpacerEl: A function that returns a reference to the notch spacer element inside of the component template.
9703
+ * @param getLabelSlot: A function that returns a reference to the slotted content.
9704
+ */
9705
+ const createNotchController = (el, getNotchSpacerEl, getLabelSlot) => {
9706
+ let notchVisibilityIO;
9707
+ const needsExplicitNotchWidth = () => {
9708
+ const notchSpacerEl = getNotchSpacerEl();
9709
+ if (
9710
+ /**
9711
+ * If the notch is not being used
9712
+ * then we do not need to set the notch width.
9713
+ */
9714
+ notchSpacerEl === undefined ||
9715
+ /**
9716
+ * If either the label property is being
9717
+ * used or the label slot is not defined,
9718
+ * then we do not need to estimate the notch width.
9719
+ */
9720
+ el.label !== undefined ||
9721
+ getLabelSlot() === null) {
9722
+ return false;
9723
+ }
9724
+ return true;
9725
+ };
9726
+ const calculateNotchWidth = () => {
9727
+ if (needsExplicitNotchWidth()) {
9728
+ /**
9729
+ * Run this the frame after
9730
+ * the browser has re-painted the host element.
9731
+ * Otherwise, the label element may have a width
9732
+ * of 0 and the IntersectionObserver will be used.
9733
+ */
9734
+ raf(() => {
9735
+ setNotchWidth();
9736
+ });
9737
+ }
9738
+ };
9739
+ /**
9740
+ * When using a label prop we can render
9741
+ * the label value inside of the notch and
9742
+ * let the browser calculate the size of the notch.
9743
+ * However, we cannot render the label slot in multiple
9744
+ * places so we need to manually calculate the notch dimension
9745
+ * based on the size of the slotted content.
9746
+ *
9747
+ * This function should only be used to set the notch width
9748
+ * on slotted label content. The notch width for label prop
9749
+ * content is automatically calculated based on the
9750
+ * intrinsic size of the label text.
9751
+ */
9752
+ const setNotchWidth = () => {
9753
+ const notchSpacerEl = getNotchSpacerEl();
9754
+ if (notchSpacerEl === undefined) {
9755
+ return;
9756
+ }
9757
+ if (!needsExplicitNotchWidth()) {
9758
+ notchSpacerEl.style.removeProperty('width');
9759
+ return;
9760
+ }
9761
+ const width = getLabelSlot().scrollWidth;
9762
+ if (
9763
+ /**
9764
+ * If the computed width of the label is 0
9765
+ * and notchSpacerEl's offsetParent is null
9766
+ * then that means the element is hidden.
9767
+ * As a result, we need to wait for the element
9768
+ * to become visible before setting the notch width.
9769
+ *
9770
+ * We do not check el.offsetParent because
9771
+ * that can be null if the host element has
9772
+ * position: fixed applied to it.
9773
+ * notchSpacerEl does not have position: fixed.
9774
+ */
9775
+ width === 0 &&
9776
+ notchSpacerEl.offsetParent === null &&
9777
+ win$1 !== undefined &&
9778
+ 'IntersectionObserver' in win$1) {
9779
+ /**
9780
+ * If there is an IO already attached
9781
+ * then that will update the notch
9782
+ * once the element becomes visible.
9783
+ * As a result, there is no need to create
9784
+ * another one.
9785
+ */
9786
+ if (notchVisibilityIO !== undefined) {
9787
+ return;
9788
+ }
9789
+ const io = (notchVisibilityIO = new IntersectionObserver((ev) => {
9790
+ /**
9791
+ * If the element is visible then we
9792
+ * can try setting the notch width again.
9793
+ */
9794
+ if (ev[0].intersectionRatio === 1) {
9795
+ setNotchWidth();
9796
+ io.disconnect();
9797
+ notchVisibilityIO = undefined;
9798
+ }
9799
+ },
9800
+ /**
9801
+ * Set the root to be the host element
9802
+ * This causes the IO callback
9803
+ * to be fired in WebKit as soon as the element
9804
+ * is visible. If we used the default root value
9805
+ * then WebKit would only fire the IO callback
9806
+ * after any animations (such as a modal transition)
9807
+ * finished, and there would potentially be a flicker.
9808
+ */
9809
+ { threshold: 0.01, root: el }));
9810
+ io.observe(notchSpacerEl);
9811
+ return;
9812
+ }
9813
+ /**
9814
+ * If the element is visible then we can set the notch width.
9815
+ * The notch is only visible when the label is scaled,
9816
+ * which is why we multiply the width by 0.75 as this is
9817
+ * the same amount the label element is scaled by in the host CSS.
9818
+ * (See $form-control-label-stacked-scale in ionic.globals.scss).
9819
+ */
9820
+ notchSpacerEl.style.setProperty('width', `${width * 0.75}px`);
9821
+ };
9822
+ const destroy = () => {
9823
+ if (notchVisibilityIO) {
9824
+ notchVisibilityIO.disconnect();
9825
+ notchVisibilityIO = undefined;
9826
+ }
9827
+ };
9828
+ return {
9829
+ calculateNotchWidth,
9830
+ destroy,
9831
+ };
9832
+ };
9833
+
9834
+ /**
9835
+ * Uses the compareWith param to compare two values to determine if they are equal.
9836
+ *
9837
+ * @param currentValue The current value of the control.
9838
+ * @param compareValue The value to compare against.
9839
+ * @param compareWith The function or property name to use to compare values.
9840
+ */
9841
+ const compareOptions = (currentValue, compareValue, compareWith) => {
9842
+ if (typeof compareWith === 'function') {
9843
+ return compareWith(currentValue, compareValue);
9844
+ }
9845
+ else if (typeof compareWith === 'string') {
9846
+ return currentValue[compareWith] === compareValue[compareWith];
9847
+ }
9848
+ else {
9849
+ return Array.isArray(compareValue) ? compareValue.includes(currentValue) : currentValue === compareValue;
9850
+ }
9851
+ };
9852
+ /**
9853
+ * Compares a value against the current value(s) to determine if it is selected.
9854
+ *
9855
+ * @param currentValue The current value of the control.
9856
+ * @param compareValue The value to compare against.
9857
+ * @param compareWith The function or property name to use to compare values.
9858
+ */
9859
+ const isOptionSelected = (currentValue, compareValue, compareWith) => {
9860
+ if (currentValue === undefined) {
9861
+ return false;
9862
+ }
9863
+ if (Array.isArray(currentValue)) {
9864
+ return currentValue.some((val) => compareOptions(val, compareValue, compareWith));
9865
+ }
9866
+ else {
9867
+ return compareOptions(currentValue, compareValue, compareWith);
9868
+ }
9869
+ };
9870
+
9871
+ /**
9872
+ * Checks if the form element is in an invalid state based on
9873
+ * Ionic validation classes.
9874
+ *
9875
+ * @param el The form element to check.
9876
+ * @returns `true` if the element is invalid, `false` otherwise.
9877
+ */
9878
+ const checkInvalidState = (el) => {
9879
+ const hasIonTouched = el.classList.contains('ion-touched');
9880
+ const hasIonInvalid = el.classList.contains('ion-invalid');
9881
+ return hasIonTouched && hasIonInvalid;
9882
+ };
9883
+
9725
9884
  const checkboxIosCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:50%;--border-width:0.125rem;--border-style:solid;--border-color:rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.23);--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--size:min(1.375rem, 55.836px);--checkmark-width:1.5px}:host(.checkbox-disabled){opacity:0.3}";
9726
9885
 
9727
9886
  const checkboxMdCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:calc(var(--size) * .125);--border-width:2px;--border-style:solid;--border-color:rgb(var(--ion-text-color-rgb, 0, 0, 0), 0.6);--checkmark-width:3;--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--transition:background 180ms cubic-bezier(0.4, 0, 0.2, 1);--size:18px}.checkbox-icon path{stroke-dasharray:30;stroke-dashoffset:30}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{stroke-dashoffset:0;-webkit-transition:stroke-dashoffset 90ms linear 90ms;transition:stroke-dashoffset 90ms linear 90ms}:host(.checkbox-disabled) .label-text-wrapper{opacity:0.38}:host(.checkbox-disabled) .native-wrapper{opacity:0.63}";
@@ -9787,6 +9946,10 @@ class Checkbox {
9787
9946
  * submitting if the value is invalid.
9788
9947
  */
9789
9948
  this.required = false;
9949
+ /**
9950
+ * Track validation state for proper aria-live announcements.
9951
+ */
9952
+ this.isInvalid = false;
9790
9953
  /**
9791
9954
  * Sets the checked property and emits
9792
9955
  * the ionChange event. Use this to update the
@@ -9833,16 +9996,29 @@ class Checkbox {
9833
9996
  ev.stopPropagation();
9834
9997
  };
9835
9998
  }
9999
+ connectedCallback() {
10000
+ const { el } = this;
10001
+ // Always set initial state
10002
+ this.isInvalid = checkInvalidState(el);
10003
+ }
9836
10004
  componentWillLoad() {
9837
10005
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
10006
+ this.hintTextId = this.getHintTextId();
10007
+ }
10008
+ disconnectedCallback() {
10009
+ // Clean up validation observer to prevent memory leaks.
10010
+ if (this.validationObserver) {
10011
+ this.validationObserver.disconnect();
10012
+ this.validationObserver = undefined;
10013
+ }
9838
10014
  }
9839
10015
  /** @internal */
9840
10016
  async setFocus() {
9841
10017
  this.el.focus();
9842
10018
  }
9843
- getHintTextID() {
9844
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
9845
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
10019
+ getHintTextId() {
10020
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
10021
+ if (isInvalid && errorText) {
9846
10022
  return errorTextId;
9847
10023
  }
9848
10024
  if (helperText) {
@@ -9855,7 +10031,7 @@ class Checkbox {
9855
10031
  * This element should only be rendered if hint text is set.
9856
10032
  */
9857
10033
  renderHintText() {
9858
- const { helperText, errorText, helperTextId, errorTextId } = this;
10034
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
9859
10035
  /**
9860
10036
  * undefined and empty string values should
9861
10037
  * be treated as not having helper/error text.
@@ -9864,7 +10040,7 @@ class Checkbox {
9864
10040
  if (!hasHintText) {
9865
10041
  return;
9866
10042
  }
9867
- return (hAsync("div", { class: "checkbox-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text" }, errorText)));
10043
+ return (hAsync("div", { class: "checkbox-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text", role: "alert" }, isInvalid ? errorText : null)));
9868
10044
  }
9869
10045
  render() {
9870
10046
  const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, required, } = this;
@@ -9874,7 +10050,7 @@ class Checkbox {
9874
10050
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
9875
10051
  // The host element must have a checkbox role to ensure proper VoiceOver
9876
10052
  // support in Safari for accessibility.
9877
- return (hAsync(Host, { key: 'ee2e02d28f9d15a1ec746609f7e9559444f621e5', role: "checkbox", "aria-checked": indeterminate ? 'mixed' : `${checked}`, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId, "aria-labelledby": hasLabelContent ? this.inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, onClick: this.onClick, class: createColorClasses$1(color, {
10053
+ return (hAsync(Host, { key: 'ae0fbd4b21accbac132e6b85c513512ad9179394', role: "checkbox", "aria-checked": indeterminate ? 'mixed' : `${checked}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": hasLabelContent ? this.inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, "aria-required": required ? 'true' : undefined, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, onClick: this.onClick, class: createColorClasses$1(color, {
9878
10054
  [mode]: true,
9879
10055
  'in-item': hostContext('ion-item', el),
9880
10056
  'checkbox-checked': checked,
@@ -9884,10 +10060,10 @@ class Checkbox {
9884
10060
  [`checkbox-justify-${justify}`]: justify !== undefined,
9885
10061
  [`checkbox-alignment-${alignment}`]: alignment !== undefined,
9886
10062
  [`checkbox-label-placement-${labelPlacement}`]: true,
9887
- }) }, hAsync("label", { key: '84d4c33da0348dc65ad36fb0fafd48be366dcf3b', class: "checkbox-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '427db69a3ab8a17aa0867519c90f585b8930406b', type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, required: required }, inheritedAttributes)), hAsync("div", { key: '9dda7024b3a4f1ee55351f783f9a10f9b4ad0d12', class: {
10063
+ }) }, hAsync("label", { key: '7a3d7f3c27dde514f2dbf2e34f4629fad33ec3bf', class: "checkbox-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '4130d77ddf034271fecccda14e101a5a809921b6', type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, required: required }, inheritedAttributes)), hAsync("div", { key: '5daa74f4e62b0947e37764762524001ee42609d9', class: {
9888
10064
  'label-text-wrapper': true,
9889
10065
  'label-text-wrapper-hidden': !hasLabelContent,
9890
- }, part: "label", id: this.inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: 'f9d1d545ffd4164b650808241b51ea1bedc6a42c' }), this.renderHintText()), hAsync("div", { key: 'a96d61ac324864228f14caa0e9f2c0d15418882e', class: "native-wrapper" }, hAsync("svg", { key: '64ff3e4d87e190601811ef64323edec18d510cd1', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container", "aria-hidden": "true" }, path)))));
10066
+ }, part: "label", id: this.inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '23ff66138f8c3a2f56f39113fc842d54b2f7952a' }), this.renderHintText()), hAsync("div", { key: 'ab914d9623c19fc46821d5e62db92f1192ebbe7e', class: "native-wrapper" }, hAsync("svg", { key: '66e3f4f5dcaa9756fb0e9452299954f9ed3dcb7b', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container", "aria-hidden": "true" }, path)))));
9891
10067
  }
9892
10068
  getSVGPath(mode, indeterminate) {
9893
10069
  let path = indeterminate ? (hAsync("path", { d: "M6 12L18 12", part: "mark" })) : (hAsync("path", { d: "M5.9,12.5l3.8,3.8l8.8-8.8", part: "mark" }));
@@ -9917,6 +10093,8 @@ class Checkbox {
9917
10093
  "justify": [1],
9918
10094
  "alignment": [1],
9919
10095
  "required": [4],
10096
+ "isInvalid": [32],
10097
+ "hintTextId": [32],
9920
10098
  "setFocus": [64]
9921
10099
  },
9922
10100
  "$listeners$": undefined,
@@ -16351,202 +16529,6 @@ class InfiniteScrollContent {
16351
16529
  }; }
16352
16530
  }
16353
16531
 
16354
- /**
16355
- * A utility to calculate the size of an outline notch
16356
- * width relative to the content passed. This is used in
16357
- * components such as `ion-select` with `fill="outline"`
16358
- * where we need to pass slotted HTML content. This is not
16359
- * needed when rendering plaintext content because we can
16360
- * render the plaintext again hidden with `opacity: 0` inside
16361
- * of the notch. As a result we can rely on the intrinsic size
16362
- * of the element to correctly compute the notch width. We
16363
- * cannot do this with slotted content because we cannot project
16364
- * it into 2 places at once.
16365
- *
16366
- * @internal
16367
- * @param el: The host element
16368
- * @param getNotchSpacerEl: A function that returns a reference to the notch spacer element inside of the component template.
16369
- * @param getLabelSlot: A function that returns a reference to the slotted content.
16370
- */
16371
- const createNotchController = (el, getNotchSpacerEl, getLabelSlot) => {
16372
- let notchVisibilityIO;
16373
- const needsExplicitNotchWidth = () => {
16374
- const notchSpacerEl = getNotchSpacerEl();
16375
- if (
16376
- /**
16377
- * If the notch is not being used
16378
- * then we do not need to set the notch width.
16379
- */
16380
- notchSpacerEl === undefined ||
16381
- /**
16382
- * If either the label property is being
16383
- * used or the label slot is not defined,
16384
- * then we do not need to estimate the notch width.
16385
- */
16386
- el.label !== undefined ||
16387
- getLabelSlot() === null) {
16388
- return false;
16389
- }
16390
- return true;
16391
- };
16392
- const calculateNotchWidth = () => {
16393
- if (needsExplicitNotchWidth()) {
16394
- /**
16395
- * Run this the frame after
16396
- * the browser has re-painted the host element.
16397
- * Otherwise, the label element may have a width
16398
- * of 0 and the IntersectionObserver will be used.
16399
- */
16400
- raf(() => {
16401
- setNotchWidth();
16402
- });
16403
- }
16404
- };
16405
- /**
16406
- * When using a label prop we can render
16407
- * the label value inside of the notch and
16408
- * let the browser calculate the size of the notch.
16409
- * However, we cannot render the label slot in multiple
16410
- * places so we need to manually calculate the notch dimension
16411
- * based on the size of the slotted content.
16412
- *
16413
- * This function should only be used to set the notch width
16414
- * on slotted label content. The notch width for label prop
16415
- * content is automatically calculated based on the
16416
- * intrinsic size of the label text.
16417
- */
16418
- const setNotchWidth = () => {
16419
- const notchSpacerEl = getNotchSpacerEl();
16420
- if (notchSpacerEl === undefined) {
16421
- return;
16422
- }
16423
- if (!needsExplicitNotchWidth()) {
16424
- notchSpacerEl.style.removeProperty('width');
16425
- return;
16426
- }
16427
- const width = getLabelSlot().scrollWidth;
16428
- if (
16429
- /**
16430
- * If the computed width of the label is 0
16431
- * and notchSpacerEl's offsetParent is null
16432
- * then that means the element is hidden.
16433
- * As a result, we need to wait for the element
16434
- * to become visible before setting the notch width.
16435
- *
16436
- * We do not check el.offsetParent because
16437
- * that can be null if the host element has
16438
- * position: fixed applied to it.
16439
- * notchSpacerEl does not have position: fixed.
16440
- */
16441
- width === 0 &&
16442
- notchSpacerEl.offsetParent === null &&
16443
- win$1 !== undefined &&
16444
- 'IntersectionObserver' in win$1) {
16445
- /**
16446
- * If there is an IO already attached
16447
- * then that will update the notch
16448
- * once the element becomes visible.
16449
- * As a result, there is no need to create
16450
- * another one.
16451
- */
16452
- if (notchVisibilityIO !== undefined) {
16453
- return;
16454
- }
16455
- const io = (notchVisibilityIO = new IntersectionObserver((ev) => {
16456
- /**
16457
- * If the element is visible then we
16458
- * can try setting the notch width again.
16459
- */
16460
- if (ev[0].intersectionRatio === 1) {
16461
- setNotchWidth();
16462
- io.disconnect();
16463
- notchVisibilityIO = undefined;
16464
- }
16465
- },
16466
- /**
16467
- * Set the root to be the host element
16468
- * This causes the IO callback
16469
- * to be fired in WebKit as soon as the element
16470
- * is visible. If we used the default root value
16471
- * then WebKit would only fire the IO callback
16472
- * after any animations (such as a modal transition)
16473
- * finished, and there would potentially be a flicker.
16474
- */
16475
- { threshold: 0.01, root: el }));
16476
- io.observe(notchSpacerEl);
16477
- return;
16478
- }
16479
- /**
16480
- * If the element is visible then we can set the notch width.
16481
- * The notch is only visible when the label is scaled,
16482
- * which is why we multiply the width by 0.75 as this is
16483
- * the same amount the label element is scaled by in the host CSS.
16484
- * (See $form-control-label-stacked-scale in ionic.globals.scss).
16485
- */
16486
- notchSpacerEl.style.setProperty('width', `${width * 0.75}px`);
16487
- };
16488
- const destroy = () => {
16489
- if (notchVisibilityIO) {
16490
- notchVisibilityIO.disconnect();
16491
- notchVisibilityIO = undefined;
16492
- }
16493
- };
16494
- return {
16495
- calculateNotchWidth,
16496
- destroy,
16497
- };
16498
- };
16499
-
16500
- /**
16501
- * Uses the compareWith param to compare two values to determine if they are equal.
16502
- *
16503
- * @param currentValue The current value of the control.
16504
- * @param compareValue The value to compare against.
16505
- * @param compareWith The function or property name to use to compare values.
16506
- */
16507
- const compareOptions = (currentValue, compareValue, compareWith) => {
16508
- if (typeof compareWith === 'function') {
16509
- return compareWith(currentValue, compareValue);
16510
- }
16511
- else if (typeof compareWith === 'string') {
16512
- return currentValue[compareWith] === compareValue[compareWith];
16513
- }
16514
- else {
16515
- return Array.isArray(compareValue) ? compareValue.includes(currentValue) : currentValue === compareValue;
16516
- }
16517
- };
16518
- /**
16519
- * Compares a value against the current value(s) to determine if it is selected.
16520
- *
16521
- * @param currentValue The current value of the control.
16522
- * @param compareValue The value to compare against.
16523
- * @param compareWith The function or property name to use to compare values.
16524
- */
16525
- const isOptionSelected = (currentValue, compareValue, compareWith) => {
16526
- if (currentValue === undefined) {
16527
- return false;
16528
- }
16529
- if (Array.isArray(currentValue)) {
16530
- return currentValue.some((val) => compareOptions(val, compareValue, compareWith));
16531
- }
16532
- else {
16533
- return compareOptions(currentValue, compareValue, compareWith);
16534
- }
16535
- };
16536
-
16537
- /**
16538
- * Checks if the form element is in an invalid state based on
16539
- * Ionic validation classes.
16540
- *
16541
- * @param el The form element to check.
16542
- * @returns `true` if the element is invalid, `false` otherwise.
16543
- */
16544
- const checkInvalidState = (el) => {
16545
- const hasIonTouched = el.classList.contains('ion-touched');
16546
- const hasIonInvalid = el.classList.contains('ion-invalid');
16547
- return hasIonTouched && hasIonInvalid;
16548
- };
16549
-
16550
16532
  /**
16551
16533
  * Used to update a scoped component that uses emulated slots. This fires when
16552
16534
  * content is passed into the slot or when the content inside of a slot changes.
@@ -16741,7 +16723,7 @@ class Input {
16741
16723
  /**
16742
16724
  * Whether auto correction should be enabled when the user is entering/editing the text value.
16743
16725
  */
16744
- this.autocorrect = false;
16726
+ this.autocorrect = 'off';
16745
16727
  /**
16746
16728
  * Sets the [`autofocus` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus) on the native input element.
16747
16729
  *
@@ -17171,7 +17153,7 @@ class Input {
17171
17153
  * TODO(FW-5592): Remove hasStartEndSlots condition
17172
17154
  */
17173
17155
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
17174
- return (hAsync(Host, { key: '39ddb0c5882d377a96979aa2b78ca6430071b277', class: createColorClasses$1(this.color, {
17156
+ return (hAsync(Host, { key: '97b5308021064d9e7434ef2d3d96f27045c1b0c4', class: createColorClasses$1(this.color, {
17175
17157
  [mode]: true,
17176
17158
  'has-value': hasValue,
17177
17159
  'has-focus': hasFocus,
@@ -17182,14 +17164,14 @@ class Input {
17182
17164
  'in-item': inItem,
17183
17165
  'in-item-color': hostContext('ion-item.ion-color', this.el),
17184
17166
  'input-disabled': disabled,
17185
- }) }, hAsync("label", { key: '624920541bb673225cb3aee82b5ac71f4abaefbd', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '5d1a22755ae9e14b704da04f763b177983474a97', class: "native-wrapper", onClick: this.onLabelClick }, hAsync("slot", { key: '088e13ac7550537e4e7466d0eda1053d6255f48e', name: "start" }), hAsync("input", Object.assign({ key: 'e851301b91e7e70a794c49260fe1b3e8d1f97999', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect ? 'on' : 'off', autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (hAsync("button", { key: '65541ba96111fc978c428d9950a7e6fe1a589a75', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
17167
+ }) }, hAsync("label", { key: '353f68726ce180299bd9adc81e5ff7d26a48f54f', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '2034b4bad04fc157f3298a1805819216b6f439d0', class: "native-wrapper", onClick: this.onLabelClick }, hAsync("slot", { key: '96bb5e30176b2bd76dfb75bfbf6c1c3d4403f4bb', name: "start" }), hAsync("input", Object.assign({ key: '1a1d75b0e414a95c89d5a760757c33548d234aca', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (hAsync("button", { key: '95f3df17b7691d9a2e7dcd4a51f16a94aa3ca36f', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
17186
17168
  /**
17187
17169
  * This prevents mobile browsers from
17188
17170
  * blurring the input when the clear
17189
17171
  * button is activated.
17190
17172
  */
17191
17173
  ev.preventDefault();
17192
- }, onClick: this.clearTextInput }, hAsync("ion-icon", { key: '3f4bc559ce36e32c7235bf642547c012805b14ab', "aria-hidden": "true", icon: clearIconData }))), hAsync("slot", { key: '0b4cd18c49350d28b3d31df73304b84748c0ed0b', name: "end" })), shouldRenderHighlight && hAsync("div", { key: '5fcbb19f0ed1f2f7b7105c040256c783132da046', class: "input-highlight" })), this.renderBottomContent()));
17174
+ }, onClick: this.clearTextInput }, hAsync("ion-icon", { key: '16b0af75eed50c8115fb5597f73b5fbf71c2530e', "aria-hidden": "true", icon: clearIconData }))), hAsync("slot", { key: 'c48da0f8ddb3764ac43efa705bb4a6bb2d9cc2fd', name: "end" })), shouldRenderHighlight && hAsync("div", { key: 'f15238481fc20de56ca7ecb6e350b3c024cc755e', class: "input-highlight" })), this.renderBottomContent()));
17193
17175
  }
17194
17176
  get el() { return getElement(this); }
17195
17177
  static get watchers() { return {
@@ -17209,7 +17191,7 @@ class Input {
17209
17191
  "color": [513],
17210
17192
  "autocapitalize": [1],
17211
17193
  "autocomplete": [1],
17212
- "autocorrect": [4],
17194
+ "autocorrect": [1],
17213
17195
  "autofocus": [4],
17214
17196
  "clearInput": [4, "clear-input"],
17215
17197
  "clearInputIcon": [1, "clear-input-icon"],
@@ -28088,6 +28070,10 @@ class RadioGroup {
28088
28070
  this.helperTextId = `${this.inputId}-helper-text`;
28089
28071
  this.errorTextId = `${this.inputId}-error-text`;
28090
28072
  this.labelId = `${this.inputId}-lbl`;
28073
+ /**
28074
+ * Track validation state for proper aria-live announcements.
28075
+ */
28076
+ this.isInvalid = false;
28091
28077
  /**
28092
28078
  * If `true`, the radios can be deselected.
28093
28079
  */
@@ -28169,6 +28155,18 @@ class RadioGroup {
28169
28155
  this.labelId = label.id = this.name + '-lbl';
28170
28156
  }
28171
28157
  }
28158
+ // Always set initial state
28159
+ this.isInvalid = checkInvalidState(this.el);
28160
+ }
28161
+ componentWillLoad() {
28162
+ this.hintTextId = this.getHintTextId();
28163
+ }
28164
+ disconnectedCallback() {
28165
+ // Clean up validation observer to prevent memory leaks.
28166
+ if (this.validationObserver) {
28167
+ this.validationObserver.disconnect();
28168
+ this.validationObserver = undefined;
28169
+ }
28172
28170
  }
28173
28171
  getRadios() {
28174
28172
  return Array.from(this.el.querySelectorAll('ion-radio'));
@@ -28244,16 +28242,16 @@ class RadioGroup {
28244
28242
  * Renders the helper text or error text values
28245
28243
  */
28246
28244
  renderHintText() {
28247
- const { helperText, errorText, helperTextId, errorTextId } = this;
28245
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
28248
28246
  const hasHintText = !!helperText || !!errorText;
28249
28247
  if (!hasHintText) {
28250
28248
  return;
28251
28249
  }
28252
- return (hAsync("div", { class: "radio-group-top" }, hAsync("div", { id: helperTextId, class: "helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text" }, errorText)));
28250
+ return (hAsync("div", { class: "radio-group-top" }, hAsync("div", { id: helperTextId, class: "helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", role: "alert" }, isInvalid ? errorText : null)));
28253
28251
  }
28254
- getHintTextID() {
28255
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
28256
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
28252
+ getHintTextId() {
28253
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
28254
+ if (isInvalid && errorText) {
28257
28255
  return errorTextId;
28258
28256
  }
28259
28257
  if (helperText) {
@@ -28265,7 +28263,7 @@ class RadioGroup {
28265
28263
  const { label, labelId, el, name, value } = this;
28266
28264
  const mode = getIonMode$1(this);
28267
28265
  renderHiddenInput(true, el, name, value, false);
28268
- return (hAsync(Host, { key: '81b8ebc96b2f383c36717f290d2959cc921ad6e8', role: "radiogroup", "aria-labelledby": label ? labelId : null, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId, onClick: this.onClick, class: mode }, this.renderHintText(), hAsync("div", { key: '45b09efc10776b889a8f372cba80d25a3fc849da', class: "radio-group-wrapper" }, hAsync("slot", { key: '58714934542c2fdd7396de160364f3f06b32e8f8' }))));
28266
+ return (hAsync(Host, { key: 'db593b3ed511e9395e3c7bfd91b787328692cd6d', role: "radiogroup", "aria-labelledby": label ? labelId : null, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, onClick: this.onClick, class: mode }, this.renderHintText(), hAsync("div", { key: '85045b45a0100a45f3b9a35d1c5a25ec63d525c4', class: "radio-group-wrapper" }, hAsync("slot", { key: '53dacb87ce62398e78771fb2efaf839ab922d946' }))));
28269
28267
  }
28270
28268
  get el() { return getElement(this); }
28271
28269
  static get watchers() { return {
@@ -28285,6 +28283,8 @@ class RadioGroup {
28285
28283
  "value": [1032],
28286
28284
  "helperText": [1, "helper-text"],
28287
28285
  "errorText": [1, "error-text"],
28286
+ "isInvalid": [32],
28287
+ "hintTextId": [32],
28288
28288
  "setFocus": [64]
28289
28289
  },
28290
28290
  "$listeners$": [[4, "keydown", "onKeydown"]],
@@ -31898,7 +31898,7 @@ class Searchbar {
31898
31898
  /**
31899
31899
  * Set the input's autocorrect property.
31900
31900
  */
31901
- this.autocorrect = false;
31901
+ this.autocorrect = 'off';
31902
31902
  /**
31903
31903
  * Set the cancel button icon. Only applies to `md` mode.
31904
31904
  * Defaults to `arrow-back-sharp`.
@@ -32287,8 +32287,8 @@ class Searchbar {
32287
32287
  const clearIcon = this.clearIcon || (mode === 'ios' ? closeCircle : closeSharp);
32288
32288
  const searchIcon = this.searchIcon || (mode === 'ios' ? searchOutline : searchSharp);
32289
32289
  const shouldShowCancelButton = this.shouldShowCancelButton();
32290
- const cancelButton = this.showCancelButton !== 'never' && (hAsync("button", { key: 'c40019b58933a2e6e260de877f5d05419f477aca', "aria-label": cancelButtonText, "aria-hidden": shouldShowCancelButton ? undefined : 'true', type: "button", tabIndex: mode === 'ios' && !shouldShowCancelButton ? -1 : undefined, onMouseDown: this.onCancelSearchbar, onTouchStart: this.onCancelSearchbar, class: "searchbar-cancel-button" }, hAsync("div", { key: '1c6b2caf907b0d457c8da2960068bfa922364996', "aria-hidden": "true" }, mode === 'md' ? (hAsync("ion-icon", { "aria-hidden": "true", mode: mode, icon: this.cancelButtonIcon, lazy: false })) : (cancelButtonText))));
32291
- return (hAsync(Host, { key: '4b5d8f2d7a6a1dc104d85cae6e76105d1e5123c6', role: "search", "aria-disabled": this.disabled ? 'true' : null, class: createColorClasses$1(this.color, {
32290
+ const cancelButton = this.showCancelButton !== 'never' && (hAsync("button", { key: '19e18775856db87daeb4b9e3d7bca0461915a0df', "aria-label": cancelButtonText, "aria-hidden": shouldShowCancelButton ? undefined : 'true', type: "button", tabIndex: mode === 'ios' && !shouldShowCancelButton ? -1 : undefined, onMouseDown: this.onCancelSearchbar, onTouchStart: this.onCancelSearchbar, class: "searchbar-cancel-button" }, hAsync("div", { key: 'b3bbdcc033f3bd3441d619e4a252cef0dad4d07e', "aria-hidden": "true" }, mode === 'md' ? (hAsync("ion-icon", { "aria-hidden": "true", mode: mode, icon: this.cancelButtonIcon, lazy: false })) : (cancelButtonText))));
32291
+ return (hAsync(Host, { key: '074aa60e051bfb3225e87d44bbb6346c59c73574', role: "search", "aria-disabled": this.disabled ? 'true' : null, class: createColorClasses$1(this.color, {
32292
32292
  [mode]: true,
32293
32293
  'searchbar-animated': animated,
32294
32294
  'searchbar-disabled': this.disabled,
@@ -32298,14 +32298,14 @@ class Searchbar {
32298
32298
  'searchbar-has-focus': this.focused,
32299
32299
  'searchbar-should-show-clear': this.shouldShowClearButton(),
32300
32300
  'searchbar-should-show-cancel': this.shouldShowCancelButton(),
32301
- }) }, hAsync("div", { key: '2aa1dd3bbd82b7df543ecb08fc54f106543e6c55', class: "searchbar-input-container" }, hAsync("input", Object.assign({ key: 'e0a7e751e4a84803ad8367ab0cd251e7e2a17ef3', "aria-label": "search text", disabled: this.disabled, ref: (el) => (this.nativeInput = el), class: "searchbar-input", inputMode: this.inputmode, enterKeyHint: this.enterkeyhint, name: this.name, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, minLength: this.minlength, maxLength: this.maxlength, placeholder: this.placeholder, type: this.type, value: this.getValue(), autoCapitalize: autocapitalize === 'default' ? undefined : autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect ? 'on' : 'off', spellcheck: this.spellcheck }, this.inheritedAttributes)), mode === 'md' && cancelButton, hAsync("ion-icon", { key: '346f943e83b3236087ca78f56525c56997f60884', "aria-hidden": "true", mode: mode, icon: searchIcon, lazy: false, class: "searchbar-search-icon" }), hAsync("button", { key: '76a685d35e47b13230f449c58946239137510cfc', "aria-label": "reset", type: "button", "no-blur": true, class: "searchbar-clear-button", onPointerDown: (ev) => {
32301
+ }) }, hAsync("div", { key: '54f58a79fe36e85d9295157303f1be89c98bbdaf', class: "searchbar-input-container" }, hAsync("input", Object.assign({ key: 'f991a37fcf54d26b7ad10d89084764e03d97b9de', "aria-label": "search text", disabled: this.disabled, ref: (el) => (this.nativeInput = el), class: "searchbar-input", inputMode: this.inputmode, enterKeyHint: this.enterkeyhint, name: this.name, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, minLength: this.minlength, maxLength: this.maxlength, placeholder: this.placeholder, type: this.type, value: this.getValue(), autoCapitalize: autocapitalize === 'default' ? undefined : autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, spellcheck: this.spellcheck }, this.inheritedAttributes)), mode === 'md' && cancelButton, hAsync("ion-icon", { key: '8b44dd90a3292c5cf872ef16a8520675f5673494', "aria-hidden": "true", mode: mode, icon: searchIcon, lazy: false, class: "searchbar-search-icon" }), hAsync("button", { key: '79d9cfed8f01268044f82811a35d323a12dca749', "aria-label": "reset", type: "button", "no-blur": true, class: "searchbar-clear-button", onPointerDown: (ev) => {
32302
32302
  /**
32303
32303
  * This prevents mobile browsers from
32304
32304
  * blurring the input when the clear
32305
32305
  * button is activated.
32306
32306
  */
32307
32307
  ev.preventDefault();
32308
- }, onClick: () => this.onClearInput(true) }, hAsync("ion-icon", { key: '88d8cff792861f3ae5646252db212e2461445c47', "aria-hidden": "true", mode: mode, icon: clearIcon, lazy: false, class: "searchbar-clear-icon" }))), mode === 'ios' && cancelButton));
32308
+ }, onClick: () => this.onClearInput(true) }, hAsync("ion-icon", { key: 'aa3b9fa8a61f853236783ac7bcd0b113ea65ece2', "aria-hidden": "true", mode: mode, icon: clearIcon, lazy: false, class: "searchbar-clear-icon" }))), mode === 'ios' && cancelButton));
32309
32309
  }
32310
32310
  get el() { return getElement(this); }
32311
32311
  static get watchers() { return {
@@ -32327,7 +32327,7 @@ class Searchbar {
32327
32327
  "animated": [4],
32328
32328
  "autocapitalize": [1],
32329
32329
  "autocomplete": [1],
32330
- "autocorrect": [4],
32330
+ "autocorrect": [1],
32331
32331
  "cancelButtonIcon": [1, "cancel-button-icon"],
32332
32332
  "cancelButtonText": [1, "cancel-button-text"],
32333
32333
  "clearIcon": [1, "clear-icon"],
@@ -33412,7 +33412,7 @@ class Select {
33412
33412
  }
33413
33413
  componentWillLoad() {
33414
33414
  this.inheritedAttributes = inheritAttributes$1(this.el, ['aria-label']);
33415
- this.hintTextID = this.getHintTextID();
33415
+ this.hintTextId = this.getHintTextId();
33416
33416
  }
33417
33417
  componentDidLoad() {
33418
33418
  /**
@@ -33911,9 +33911,9 @@ class Select {
33911
33911
  }
33912
33912
  renderListbox() {
33913
33913
  const { disabled, inputId, isExpanded, required } = this;
33914
- return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-describedby": this.hintTextID, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
33914
+ return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
33915
33915
  }
33916
- getHintTextID() {
33916
+ getHintTextId() {
33917
33917
  const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
33918
33918
  if (isInvalid && errorText) {
33919
33919
  return errorTextId;
@@ -34038,7 +34038,7 @@ class Select {
34038
34038
  "isExpanded": [32],
34039
34039
  "hasFocus": [32],
34040
34040
  "isInvalid": [32],
34041
- "hintTextID": [32],
34041
+ "hintTextId": [32],
34042
34042
  "open": [64]
34043
34043
  },
34044
34044
  "$listeners$": undefined,
@@ -36509,6 +36509,10 @@ class Toggle {
36509
36509
  this.inheritedAttributes = {};
36510
36510
  this.didLoad = false;
36511
36511
  this.activated = false;
36512
+ /**
36513
+ * Track validation state for proper aria-live announcements.
36514
+ */
36515
+ this.isInvalid = false;
36512
36516
  /**
36513
36517
  * The name of the control, which is submitted with the form data.
36514
36518
  */
@@ -36622,15 +36626,18 @@ class Toggle {
36622
36626
  });
36623
36627
  }
36624
36628
  async connectedCallback() {
36629
+ const { didLoad, el } = this;
36625
36630
  /**
36626
36631
  * If we have not yet rendered
36627
36632
  * ion-toggle, then toggleTrack is not defined.
36628
36633
  * But if we are moving ion-toggle via appendChild,
36629
36634
  * then toggleTrack will be defined.
36630
36635
  */
36631
- if (this.didLoad) {
36636
+ if (didLoad) {
36632
36637
  this.setupGesture();
36633
36638
  }
36639
+ // Always set initial state
36640
+ this.isInvalid = checkInvalidState(el);
36634
36641
  }
36635
36642
  componentDidLoad() {
36636
36643
  this.setupGesture();
@@ -36641,9 +36648,15 @@ class Toggle {
36641
36648
  this.gesture.destroy();
36642
36649
  this.gesture = undefined;
36643
36650
  }
36651
+ // Clean up validation observer to prevent memory leaks.
36652
+ if (this.validationObserver) {
36653
+ this.validationObserver.disconnect();
36654
+ this.validationObserver = undefined;
36655
+ }
36644
36656
  }
36645
36657
  componentWillLoad() {
36646
36658
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
36659
+ this.hintTextId = this.getHintTextId();
36647
36660
  }
36648
36661
  onStart() {
36649
36662
  this.activated = true;
@@ -36684,9 +36697,9 @@ class Toggle {
36684
36697
  get hasLabel() {
36685
36698
  return this.el.textContent !== '';
36686
36699
  }
36687
- getHintTextID() {
36688
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
36689
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
36700
+ getHintTextId() {
36701
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
36702
+ if (isInvalid && errorText) {
36690
36703
  return errorTextId;
36691
36704
  }
36692
36705
  if (helperText) {
@@ -36699,7 +36712,7 @@ class Toggle {
36699
36712
  * This element should only be rendered if hint text is set.
36700
36713
  */
36701
36714
  renderHintText() {
36702
- const { helperText, errorText, helperTextId, errorTextId } = this;
36715
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
36703
36716
  /**
36704
36717
  * undefined and empty string values should
36705
36718
  * be treated as not having helper/error text.
@@ -36708,15 +36721,15 @@ class Toggle {
36708
36721
  if (!hasHintText) {
36709
36722
  return;
36710
36723
  }
36711
- return (hAsync("div", { class: "toggle-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text" }, errorText)));
36724
+ return (hAsync("div", { class: "toggle-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text", role: "alert" }, isInvalid ? errorText : null)));
36712
36725
  }
36713
36726
  render() {
36714
- const { activated, alignment, checked, color, disabled, el, errorTextId, hasLabel, inheritedAttributes, inputId, inputLabelId, justify, labelPlacement, name, required, } = this;
36727
+ const { activated, alignment, checked, color, disabled, el, hasLabel, inheritedAttributes, inputId, inputLabelId, justify, labelPlacement, name, required, } = this;
36715
36728
  const mode = getIonMode$1(this);
36716
36729
  const value = this.getValue();
36717
36730
  const rtl = isRTL$1(el) ? 'rtl' : 'ltr';
36718
36731
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
36719
- return (hAsync(Host, { key: '17bbbc8d229868e5c872b2bc5a3faf579780c5e0', role: "switch", "aria-checked": `${checked}`, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === errorTextId, onClick: this.onClick, "aria-labelledby": hasLabel ? inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, class: createColorClasses$1(color, {
36732
+ return (hAsync(Host, { key: 'f569148edd89ee041a4719ffc4733c16b05229bd', role: "switch", "aria-checked": `${checked}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, onClick: this.onClick, "aria-labelledby": hasLabel ? inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, "aria-required": required ? 'true' : undefined, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, class: createColorClasses$1(color, {
36720
36733
  [mode]: true,
36721
36734
  'in-item': hostContext('ion-item', el),
36722
36735
  'toggle-activated': activated,
@@ -36726,10 +36739,10 @@ class Toggle {
36726
36739
  [`toggle-alignment-${alignment}`]: alignment !== undefined,
36727
36740
  [`toggle-label-placement-${labelPlacement}`]: true,
36728
36741
  [`toggle-${rtl}`]: true,
36729
- }) }, hAsync("label", { key: '673625b62a2c909e95dccb642c91312967a6cd1c', class: "toggle-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '7dc3f357b4708116663970047765da9f8f845bf0', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, required: required }, inheritedAttributes)), hAsync("div", { key: '8f1c6a182031e8cbc6727e5f4ac0e00ad4247447', class: {
36742
+ }) }, hAsync("label", { key: '3027f2ac4be6de422a14486d847fbee77f615db1', class: "toggle-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '4b0304c9e879e432b80184b4e5de37d55c11b436', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, required: required }, inheritedAttributes)), hAsync("div", { key: '8ef265ec942e7f01ff31cbb202ed146c6bf94e02', class: {
36730
36743
  'label-text-wrapper': true,
36731
36744
  'label-text-wrapper-hidden': !hasLabel,
36732
- }, part: "label", id: inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '8322b9d54dc7edeb4e16fefcde9f7ebca8d5c3e1' }), this.renderHintText()), hAsync("div", { key: 'fe6984143db817a7b3020a3f57cf5418fc3dcc0e', class: "native-wrapper" }, this.renderToggleControl()))));
36745
+ }, part: "label", id: inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '7b162b7dd27199cca2a4c995276a18b9f8e44aaf' }), this.renderHintText()), hAsync("div", { key: 'd13c34bd42fca01cc73ddb4ea7e471b33a282a3e', class: "native-wrapper" }, this.renderToggleControl()))));
36733
36746
  }
36734
36747
  get el() { return getElement(this); }
36735
36748
  static get watchers() { return {
@@ -36755,7 +36768,9 @@ class Toggle {
36755
36768
  "justify": [1],
36756
36769
  "alignment": [1],
36757
36770
  "required": [4],
36758
- "activated": [32]
36771
+ "activated": [32],
36772
+ "isInvalid": [32],
36773
+ "hintTextId": [32]
36759
36774
  },
36760
36775
  "$listeners$": undefined,
36761
36776
  "$lazyBundleId$": "-",
@@ -37912,7 +37927,7 @@ var NAMESPACE = (
37912
37927
  );
37913
37928
 
37914
37929
  /*
37915
- Stencil Hydrate Runner v4.38.3 | MIT Licensed | https://stenciljs.com
37930
+ Stencil Hydrate Runner v4.38.0 | MIT Licensed | https://stenciljs.com
37916
37931
  */
37917
37932
  var __defProp = Object.defineProperty;
37918
37933
  var __export = (target, all) => {
@@ -38073,6 +38088,82 @@ var MockAttr = class {
38073
38088
  }
38074
38089
  };
38075
38090
 
38091
+ // src/mock-doc/class-list.ts
38092
+ var MockClassList = class {
38093
+ constructor(elm) {
38094
+ this.elm = elm;
38095
+ }
38096
+ add(...classNames) {
38097
+ const clsNames = getItems(this.elm);
38098
+ let updated = false;
38099
+ classNames.forEach((className) => {
38100
+ className = String(className);
38101
+ validateClass(className);
38102
+ if (clsNames.includes(className) === false) {
38103
+ clsNames.push(className);
38104
+ updated = true;
38105
+ }
38106
+ });
38107
+ if (updated) {
38108
+ this.elm.setAttributeNS(null, "class", clsNames.join(" "));
38109
+ }
38110
+ }
38111
+ remove(...classNames) {
38112
+ const clsNames = getItems(this.elm);
38113
+ let updated = false;
38114
+ classNames.forEach((className) => {
38115
+ className = String(className);
38116
+ validateClass(className);
38117
+ const index = clsNames.indexOf(className);
38118
+ if (index > -1) {
38119
+ clsNames.splice(index, 1);
38120
+ updated = true;
38121
+ }
38122
+ });
38123
+ if (updated) {
38124
+ this.elm.setAttributeNS(null, "class", clsNames.filter((c) => c.length > 0).join(" "));
38125
+ }
38126
+ }
38127
+ contains(className) {
38128
+ className = String(className);
38129
+ return getItems(this.elm).includes(className);
38130
+ }
38131
+ toggle(className) {
38132
+ className = String(className);
38133
+ if (this.contains(className) === true) {
38134
+ this.remove(className);
38135
+ } else {
38136
+ this.add(className);
38137
+ }
38138
+ }
38139
+ get length() {
38140
+ return getItems(this.elm).length;
38141
+ }
38142
+ item(index) {
38143
+ return getItems(this.elm)[index];
38144
+ }
38145
+ toString() {
38146
+ return getItems(this.elm).join(" ");
38147
+ }
38148
+ };
38149
+ function validateClass(className) {
38150
+ if (className === "") {
38151
+ throw new Error("The token provided must not be empty.");
38152
+ }
38153
+ if (/\s/.test(className)) {
38154
+ throw new Error(
38155
+ `The token provided ('${className}') contains HTML space characters, which are not valid in tokens.`
38156
+ );
38157
+ }
38158
+ }
38159
+ function getItems(elm) {
38160
+ const className = elm.getAttribute("class");
38161
+ if (typeof className === "string" && className.length > 0) {
38162
+ return className.trim().split(" ").filter((c) => c.length > 0);
38163
+ }
38164
+ return [];
38165
+ }
38166
+
38076
38167
  // src/mock-doc/css-style-declaration.ts
38077
38168
  var MockCSSStyleDeclaration = class {
38078
38169
  constructor() {
@@ -48588,81 +48679,6 @@ var STRUCTURE_ELEMENTS = /* @__PURE__ */ new Set([
48588
48679
  "style"
48589
48680
  ]);
48590
48681
 
48591
- // src/mock-doc/token-list.ts
48592
- var MockTokenList = class {
48593
- constructor(elm, attr) {
48594
- this.elm = elm;
48595
- this.attr = attr;
48596
- }
48597
- add(...tokens) {
48598
- const items = getItems(this.elm, this.attr);
48599
- let updated = false;
48600
- tokens.forEach((token) => {
48601
- token = String(token);
48602
- validateToken(token);
48603
- if (items.includes(token) === false) {
48604
- items.push(token);
48605
- updated = true;
48606
- }
48607
- });
48608
- if (updated) {
48609
- this.elm.setAttributeNS(null, this.attr, items.join(" "));
48610
- }
48611
- }
48612
- remove(...tokens) {
48613
- const items = getItems(this.elm, this.attr);
48614
- let updated = false;
48615
- tokens.forEach((token) => {
48616
- token = String(token);
48617
- validateToken(token);
48618
- const index = items.indexOf(token);
48619
- if (index > -1) {
48620
- items.splice(index, 1);
48621
- updated = true;
48622
- }
48623
- });
48624
- if (updated) {
48625
- this.elm.setAttributeNS(null, this.attr, items.filter((c) => c.length > 0).join(" "));
48626
- }
48627
- }
48628
- contains(token) {
48629
- token = String(token);
48630
- return getItems(this.elm, this.attr).includes(token);
48631
- }
48632
- toggle(token) {
48633
- token = String(token);
48634
- if (this.contains(token) === true) {
48635
- this.remove(token);
48636
- } else {
48637
- this.add(token);
48638
- }
48639
- }
48640
- get length() {
48641
- return getItems(this.elm, this.attr).length;
48642
- }
48643
- item(index) {
48644
- return getItems(this.elm, this.attr)[index];
48645
- }
48646
- toString() {
48647
- return getItems(this.elm, this.attr).join(" ");
48648
- }
48649
- };
48650
- function validateToken(token) {
48651
- if (token === "") {
48652
- throw new Error("The token provided must not be empty.");
48653
- }
48654
- if (/\s/.test(token)) {
48655
- throw new Error(`The token provided ('${token}') contains HTML space characters, which are not valid in tokens.`);
48656
- }
48657
- }
48658
- function getItems(elm, attr) {
48659
- const value = elm.getAttribute(attr);
48660
- if (typeof value === "string" && value.length > 0) {
48661
- return value.trim().split(" ").filter((c) => c.length > 0);
48662
- }
48663
- return [];
48664
- }
48665
-
48666
48682
  // src/mock-doc/node.ts
48667
48683
  var MockNode2 = class {
48668
48684
  constructor(ownerDocument, nodeType, nodeName, nodeValue) {
@@ -48930,10 +48946,7 @@ var MockElement = class extends MockNode2 {
48930
48946
  this.setAttributeNS(null, "class", value);
48931
48947
  }
48932
48948
  get classList() {
48933
- return new MockTokenList(this, "class");
48934
- }
48935
- get part() {
48936
- return new MockTokenList(this, "part");
48949
+ return new MockClassList(this);
48937
48950
  }
48938
48951
  click() {
48939
48952
  dispatchEvent(this, new MockEvent("click", { bubbles: true, cancelable: true, composed: true }));
@@ -51816,7 +51829,7 @@ var MockDocument = class _MockDocument extends MockHTMLElement {
51816
51829
  }
51817
51830
  set location(val) {
51818
51831
  if (this.defaultView != null) {
51819
- this.defaultView.location.href = val;
51832
+ this.defaultView.location = val;
51820
51833
  }
51821
51834
  }
51822
51835
  get baseURI() {