@ionic/core 9.0.4 → 9.0.5-nightly.20260918

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 (476) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/p--8XqAiDn.js +4 -0
  99. package/components/{p-CkffScdn.js → p-2NFckEWF.js} +1 -1
  100. package/components/p-3D5X__KW.js +4 -0
  101. package/components/{p-C6WYVtle.js → p-B2SADtq2.js} +1 -1
  102. package/components/{p-gyjG_IM4.js → p-B4i_guWa.js} +1 -1
  103. package/components/p-B7NtI9LF.js +4 -0
  104. package/components/{p-MLplUp3U.js → p-B7UPvS1C.js} +1 -1
  105. package/components/{p-8MzqWBTT.js → p-BBPjLr6a.js} +1 -1
  106. package/components/p-BGu4rI5P.js +4 -0
  107. package/components/{p-Csi6iX-c.js → p-BNnwTu4u.js} +1 -1
  108. package/components/p-BQ1TznDx.js +4 -0
  109. package/components/p-BXD1texH.js +4 -0
  110. package/components/{p-BPbgEuCf.js → p-Bi7c_bt3.js} +1 -1
  111. package/components/p-BjIkK172.js +4 -0
  112. package/components/{p-CthoZqG1.js → p-BoK0Zxin.js} +1 -1
  113. package/components/p-C9CGVt9y.js +4 -0
  114. package/components/{p-BjizFeM6.js → p-CTh7oRWR.js} +1 -1
  115. package/components/{p-BMHhG7Xh.js → p-CTykhCkJ.js} +1 -1
  116. package/components/{p-BuxZkazO.js → p-CU8SQ6hA.js} +1 -1
  117. package/components/p-CVNoHMcR.js +4 -0
  118. package/components/p-CVqR_xzT.js +4 -0
  119. package/components/{p-BxCcX93a.js → p-CXAF_kfJ.js} +1 -1
  120. package/components/p-CXR6mbDq.js +4 -0
  121. package/components/p-CYqC-Atm.js +4 -0
  122. package/components/{p-S-gGoI4A.js → p-CaLdTi8C.js} +1 -1
  123. package/components/p-CbnQxifG.js +4 -0
  124. package/{dist/ionic/p-DlvB1Idh.js → components/p-CfKxueOn.js} +1 -1
  125. package/components/{p-CMT0YmOj.js → p-CtMgk_1c.js} +1 -1
  126. package/components/p-D2peGJYg.js +4 -0
  127. package/components/{p-MSr4IlyS.js → p-D6fVxd5I.js} +1 -1
  128. package/components/p-D6pn9UkD.js +4 -0
  129. package/components/{p-DOwsU7Mc.js → p-D8cczurE.js} +1 -1
  130. package/{dist/ionic/p-Bu6uWqQM.js → components/p-D9_ODaPJ.js} +1 -1
  131. package/components/p-DCryg-Sq.js +4 -0
  132. package/components/{p-2ta4uE9-.js → p-DF5FRPZh.js} +1 -1
  133. package/components/p-DF8r3KSX.js +4 -0
  134. package/components/{p-CcOl6jEv.js → p-DNT7yQ4z.js} +1 -1
  135. package/components/{p-PWHvigWP.js → p-DSRinNB2.js} +1 -1
  136. package/components/{p-DBGxvxkE.js → p-DTo_pxeB.js} +1 -1
  137. package/components/{p-DEvF_E6y.js → p-DUE1XLJD.js} +1 -1
  138. package/components/{p-DMT-4tHM.js → p-DVoewOZH.js} +1 -1
  139. package/components/p-DhUgaaqJ.js +4 -0
  140. package/components/{p-DSuBagxs.js → p-DiqHxuia.js} +1 -1
  141. package/components/{p-DKX1mWld.js → p-Do82ooMy.js} +1 -1
  142. package/components/{p-DcrAT6v8.js → p-DrzCm5Hh.js} +1 -1
  143. package/components/{p-CXuRZoWE.js → p-J7HaBhyh.js} +1 -1
  144. package/{dist/ionic/p-BT0-h-eD.js → components/p-TsPC4TcB.js} +1 -1
  145. package/components/p-Wl4YKqiE.js +4 -0
  146. package/components/p-gYw-RCaQ.js +4 -0
  147. package/components/p-lbvS3btC.js +4 -0
  148. package/components/p-ls85vUWB.js +4 -0
  149. package/components/{p-Bi8VGu4M.js → p-vg50UO6j.js} +1 -1
  150. package/dist/cjs/{animation-2DHlng-f.js → animation-C-JWwKgy.js} +2 -2
  151. package/dist/cjs/{app-globals-BeC95igM.js → app-globals-TXtzYAPy.js} +1 -1
  152. package/dist/cjs/attribute-controller-B0BsgXV8.js +131 -0
  153. package/dist/cjs/{button-active-CTyeZB16.js → button-active-DG3sHT6d.js} +2 -2
  154. package/dist/cjs/{capacitor-cADDPMtd.js → capacitor-CtkuLHaA.js} +1 -1
  155. package/dist/cjs/{format-BbkxKT7p.js → format-BHIqanHK.js} +1 -1
  156. package/dist/cjs/{framework-delegate-DYIuFqQx.js → framework-delegate-CvJ6SkeA.js} +1 -1
  157. package/dist/cjs/{haptic-CqPss9_L.js → haptic-C-wyDL4O.js} +1 -1
  158. package/dist/cjs/{helpers-DHjAEaU9.js → helpers-CJUjGJOS.js} +6 -3
  159. package/dist/cjs/{index-D_D542p0.js → index-78cPCZwH.js} +4 -4
  160. package/dist/cjs/{index-B-R-H1Z2.js → index-7glr9oHu.js} +2 -2
  161. package/dist/cjs/{index-MdIUU940.js → index-D9PPKWTO.js} +1 -1
  162. package/dist/cjs/{index-T36W_eKv.js → index-DLQNazpt.js} +4 -0
  163. package/dist/cjs/{index-Da83wbmS.js → index-DqKXmMKk.js} +5 -5
  164. package/dist/cjs/{index-BLq7TkUV.js → index-m83Rr85o.js} +2 -2
  165. package/dist/cjs/index.cjs.js +13 -11
  166. package/dist/cjs/{input-shims-DYxL0Fdm.js → input-shims-gtEasMEV.js} +5 -5
  167. package/dist/cjs/{input.utils-B_32Xwga.js → input.utils-C1JNUKzb.js} +1 -1
  168. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  169. package/dist/cjs/ion-action-sheet.cjs.entry.js +11 -11
  170. package/dist/cjs/ion-alert.cjs.entry.js +11 -11
  171. package/dist/cjs/ion-app_8.cjs.entry.js +16 -16
  172. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  173. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  174. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  175. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  176. package/dist/cjs/ion-button_2.cjs.entry.js +23 -34
  177. package/dist/cjs/ion-card_5.cjs.entry.js +19 -7
  178. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  179. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  180. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  181. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  182. package/dist/cjs/ion-datetime.cjs.entry.js +6 -6
  183. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  184. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  185. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  186. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  187. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  188. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  189. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  190. package/dist/cjs/ion-item_8.cjs.entry.js +17 -8
  191. package/dist/cjs/ion-loading.cjs.entry.js +7 -7
  192. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  193. package/dist/cjs/ion-modal.cjs.entry.js +11 -11
  194. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  195. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  196. package/dist/cjs/ion-picker-column.cjs.entry.js +5 -5
  197. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  198. package/dist/cjs/ion-popover.cjs.entry.js +108 -29
  199. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  200. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  201. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  202. package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -8
  203. package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -6
  204. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  205. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  206. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  207. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  208. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  209. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  210. package/dist/cjs/ion-select-modal.cjs.entry.js +7 -7
  211. package/dist/cjs/ion-select_3.cjs.entry.js +8 -8
  212. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  213. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  214. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  215. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  216. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  217. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  218. package/dist/cjs/ion-toast.cjs.entry.js +7 -7
  219. package/dist/cjs/ion-toggle.cjs.entry.js +6 -6
  220. package/dist/cjs/{ionic-global-BWd7usAF.js → ionic-global-t_WpJo84.js} +1 -1
  221. package/dist/cjs/ionic.cjs.js +4 -4
  222. package/dist/cjs/{ios.transition-6AFNO6uU.js → ios.transition-DZLrW8ga.js} +4 -4
  223. package/dist/cjs/{item-multiple-inputs-BaBx_Te8.js → item-multiple-inputs-n1sInjA_.js} +1 -1
  224. package/dist/cjs/{keyboard-DstMw6u1.js → keyboard-C06ZtyfO.js} +1 -1
  225. package/dist/cjs/{keyboard-BJEm-3HF.js → keyboard-CrDGk8Si.js} +4 -4
  226. package/dist/cjs/{keyboard-controller-DaUNT15d.js → keyboard-controller-CMLPZLrw.js} +2 -2
  227. package/dist/cjs/loader.cjs.js +4 -4
  228. package/dist/cjs/{md.transition-CPq0ckrU.js → md.transition-BKWfxYYf.js} +4 -4
  229. package/dist/cjs/{overlays-DwMDYc_O.js → overlays-BEVysBKh.js} +4 -4
  230. package/dist/cjs/{select-option-render-Cu-ABBRH.js → select-option-render-CSPIWz_C.js} +2 -2
  231. package/dist/cjs/{slot-mutation-controller-CtYZdaWI.js → slot-mutation-controller-ByWHY518.js} +1 -1
  232. package/dist/cjs/{status-tap-BUfv_eD4.js → status-tap-CL5oy8nW.js} +3 -3
  233. package/dist/cjs/{swipe-back-DYKxJU5r.js → swipe-back-CMxnx1Rv.js} +2 -2
  234. package/dist/collection/components/button/button.js +21 -32
  235. package/dist/collection/components/card/card.js +17 -6
  236. package/dist/collection/components/item/item.js +15 -6
  237. package/dist/collection/components/popover/animations/ios.enter.js +20 -6
  238. package/dist/collection/components/popover/animations/md.enter.js +19 -5
  239. package/dist/collection/components/popover/utils.js +64 -13
  240. package/dist/collection/index.js +1 -1
  241. package/dist/collection/utils/attribute-controller.js +126 -0
  242. package/dist/collection/utils/helpers.js +5 -3
  243. package/dist/collection/utils/logging/index.js +4 -0
  244. package/dist/docs.json +1 -1
  245. package/dist/esm/{animation-CAzXJ2I1.js → animation-DRatc9mc.js} +2 -2
  246. package/dist/esm/{app-globals-DGJXnnkm.js → app-globals-BAPWjQRi.js} +1 -1
  247. package/dist/esm/attribute-controller-BrbFqJRn.js +128 -0
  248. package/dist/esm/{button-active-DyyWVqU3.js → button-active-Cn0mS9NP.js} +2 -2
  249. package/dist/esm/{capacitor-C041I3qZ.js → capacitor-DOXE6jIG.js} +1 -1
  250. package/dist/esm/{format-D78cdY12.js → format-Cd2aRger.js} +1 -1
  251. package/dist/esm/{framework-delegate-CUDbUfWS.js → framework-delegate-Dyvjs63n.js} +1 -1
  252. package/dist/esm/{haptic-D3njgGLB.js → haptic-B3RodENJ.js} +1 -1
  253. package/dist/esm/{helpers-BJFnZngp.js → helpers-D3HlaZqB.js} +6 -4
  254. package/dist/esm/{index-CdoVp_rZ.js → index-65Eftz2j.js} +4 -4
  255. package/dist/esm/{index-DmnOg_xm.js → index-B2E_HqxY.js} +1 -1
  256. package/dist/esm/{index-obGyiHiO.js → index-BBArCvE7.js} +2 -2
  257. package/dist/esm/{index-DoY4e_3F.js → index-BcTd8Van.js} +2 -2
  258. package/dist/esm/{index-iurdcGHg.js → index-C3hi0PAx.js} +5 -5
  259. package/dist/esm/{index-Dvqtt_WK.js → index-Ci0c0wtC.js} +5 -1
  260. package/dist/esm/index.js +11 -11
  261. package/dist/esm/{input-shims-DognYvwv.js → input-shims-pdb7CjZn.js} +5 -5
  262. package/dist/esm/{input.utils-C3mVJhji.js → input.utils-DTipZVu0.js} +1 -1
  263. package/dist/esm/ion-accordion_2.entry.js +3 -3
  264. package/dist/esm/ion-action-sheet.entry.js +11 -11
  265. package/dist/esm/ion-alert.entry.js +11 -11
  266. package/dist/esm/ion-app_8.entry.js +16 -16
  267. package/dist/esm/ion-avatar_3.entry.js +2 -2
  268. package/dist/esm/ion-back-button.entry.js +3 -3
  269. package/dist/esm/ion-backdrop.entry.js +2 -2
  270. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  271. package/dist/esm/ion-button_2.entry.js +23 -34
  272. package/dist/esm/ion-card_5.entry.js +19 -7
  273. package/dist/esm/ion-checkbox.entry.js +4 -4
  274. package/dist/esm/ion-chip.entry.js +2 -2
  275. package/dist/esm/ion-col_3.entry.js +2 -2
  276. package/dist/esm/ion-datetime-button.entry.js +4 -4
  277. package/dist/esm/ion-datetime.entry.js +6 -6
  278. package/dist/esm/ion-fab_3.entry.js +3 -3
  279. package/dist/esm/ion-img.entry.js +3 -3
  280. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  281. package/dist/esm/ion-input-otp.entry.js +3 -3
  282. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  283. package/dist/esm/ion-input.entry.js +5 -5
  284. package/dist/esm/ion-item-option_3.entry.js +4 -4
  285. package/dist/esm/ion-item_8.entry.js +17 -8
  286. package/dist/esm/ion-loading.entry.js +7 -7
  287. package/dist/esm/ion-menu_3.entry.js +7 -7
  288. package/dist/esm/ion-modal.entry.js +11 -11
  289. package/dist/esm/ion-nav_2.entry.js +6 -6
  290. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  291. package/dist/esm/ion-picker-column.entry.js +5 -5
  292. package/dist/esm/ion-picker.entry.js +2 -2
  293. package/dist/esm/ion-popover.entry.js +108 -29
  294. package/dist/esm/ion-progress-bar.entry.js +3 -3
  295. package/dist/esm/ion-radio_2.entry.js +4 -4
  296. package/dist/esm/ion-range.entry.js +4 -4
  297. package/dist/esm/ion-refresher_2.entry.js +8 -8
  298. package/dist/esm/ion-reorder_2.entry.js +6 -6
  299. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  300. package/dist/esm/ion-route_4.entry.js +4 -4
  301. package/dist/esm/ion-searchbar.entry.js +3 -3
  302. package/dist/esm/ion-segment-content.entry.js +1 -1
  303. package/dist/esm/ion-segment-view.entry.js +1 -1
  304. package/dist/esm/ion-segment_2.entry.js +3 -3
  305. package/dist/esm/ion-select-modal.entry.js +7 -7
  306. package/dist/esm/ion-select_3.entry.js +8 -8
  307. package/dist/esm/ion-spinner.entry.js +2 -2
  308. package/dist/esm/ion-split-pane.entry.js +2 -2
  309. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  310. package/dist/esm/ion-tab_2.entry.js +3 -3
  311. package/dist/esm/ion-text.entry.js +2 -2
  312. package/dist/esm/ion-textarea.entry.js +5 -5
  313. package/dist/esm/ion-toast.entry.js +7 -7
  314. package/dist/esm/ion-toggle.entry.js +6 -6
  315. package/dist/esm/{ionic-global-BSaFA7np.js → ionic-global-D319UM2i.js} +1 -1
  316. package/dist/esm/ionic.js +5 -5
  317. package/dist/esm/{ios.transition-ofa92pAl.js → ios.transition-CjR-iczx.js} +4 -4
  318. package/dist/esm/{item-multiple-inputs-CffmpUe9.js → item-multiple-inputs-CtLCJNiL.js} +1 -1
  319. package/dist/esm/{keyboard-Dsc85bts.js → keyboard-BPq0DuxS.js} +4 -4
  320. package/dist/esm/{keyboard-Cz4hUjuj.js → keyboard-Fuj-w2n0.js} +1 -1
  321. package/dist/esm/{keyboard-controller-BLvRgxgP.js → keyboard-controller-kCdrbtXb.js} +2 -2
  322. package/dist/esm/loader.js +5 -5
  323. package/dist/esm/{md.transition-DnFfqsAv.js → md.transition-BFmU8zjI.js} +4 -4
  324. package/dist/esm/{overlays-a_5AhqWk.js → overlays-D2Bo1FJ7.js} +4 -4
  325. package/dist/esm/{select-option-render-C_PCwA67.js → select-option-render-m4fqbKrD.js} +2 -2
  326. package/dist/esm/{slot-mutation-controller-D7n8Peo2.js → slot-mutation-controller-B_Gyzsmn.js} +1 -1
  327. package/dist/esm/{status-tap-BsTKKfug.js → status-tap-D3yqZrEP.js} +3 -3
  328. package/dist/esm/{swipe-back-ibFGqXH2.js → swipe-back-DDOJz7NH.js} +2 -2
  329. package/dist/ionic/index.esm.js +1 -1
  330. package/dist/ionic/ionic.esm.js +1 -1
  331. package/dist/ionic/p-011a08e9.entry.js +4 -0
  332. package/dist/ionic/{p-59305088.entry.js → p-0e8ae661.entry.js} +1 -1
  333. package/dist/ionic/p-12d381c2.entry.js +4 -0
  334. package/dist/ionic/{p-28952272.entry.js → p-12f0fc68.entry.js} +1 -1
  335. package/dist/ionic/{p-26d89234.entry.js → p-1daca166.entry.js} +1 -1
  336. package/dist/ionic/{p-fc3312a4.entry.js → p-2619b489.entry.js} +1 -1
  337. package/dist/ionic/{p-89e04e63.entry.js → p-28b0a9c7.entry.js} +1 -1
  338. package/dist/ionic/{p-cb893f35.entry.js → p-29e6a8d4.entry.js} +1 -1
  339. package/dist/ionic/{p-88cf4127.entry.js → p-2b32af08.entry.js} +1 -1
  340. package/dist/ionic/{p-41ae57ea.entry.js → p-304f92d1.entry.js} +1 -1
  341. package/dist/ionic/{p-fd220f9c.entry.js → p-35469a67.entry.js} +1 -1
  342. package/dist/ionic/{p-12ea6d13.entry.js → p-3fa7f61a.entry.js} +1 -1
  343. package/dist/ionic/{p-84dea138.entry.js → p-4253fc9f.entry.js} +1 -1
  344. package/dist/ionic/{p-5272e103.entry.js → p-44046266.entry.js} +1 -1
  345. package/dist/ionic/{p-416bec74.entry.js → p-45ca4440.entry.js} +1 -1
  346. package/dist/ionic/{p-5eadc64e.entry.js → p-49b1f0c1.entry.js} +1 -1
  347. package/dist/ionic/{p-efa78f73.entry.js → p-50ce079e.entry.js} +1 -1
  348. package/dist/ionic/p-51eb3f6f.entry.js +4 -0
  349. package/dist/ionic/{p-ac6a1168.entry.js → p-584579e7.entry.js} +1 -1
  350. package/dist/ionic/{p-0a824cef.entry.js → p-5dc1ad24.entry.js} +1 -1
  351. package/dist/ionic/p-5f41981f.entry.js +4 -0
  352. package/dist/ionic/{p-dd89474c.entry.js → p-62528b98.entry.js} +1 -1
  353. package/dist/ionic/p-636baa66.entry.js +4 -0
  354. package/dist/ionic/{p-d8a6ebfd.entry.js → p-64d0e766.entry.js} +1 -1
  355. package/dist/ionic/p-6f52068e.entry.js +4 -0
  356. package/dist/ionic/p-78d66dbf.entry.js +4 -0
  357. package/dist/ionic/{p-689f7a37.entry.js → p-84f30235.entry.js} +1 -1
  358. package/dist/ionic/{p-60ca717e.entry.js → p-87d878dc.entry.js} +1 -1
  359. package/dist/ionic/p-8WDtqI_V.js +4 -0
  360. package/dist/ionic/{p-063769cf.entry.js → p-8d6e044e.entry.js} +1 -1
  361. package/dist/ionic/p-920e067d.entry.js +4 -0
  362. package/dist/ionic/p-950c9b8b.entry.js +4 -0
  363. package/dist/ionic/p-BIiK2pe9.js +4 -0
  364. package/{components/p-BezPzC13.js → dist/ionic/p-BKzIpETv.js} +1 -1
  365. package/dist/ionic/p-BZlmYZid.js +4 -0
  366. package/dist/ionic/p-BiQyyAay.js +4 -0
  367. package/dist/ionic/p-Bl3GtrLa.js +4 -0
  368. package/dist/ionic/{p-C5SsTfux.js → p-BlIL832I.js} +1 -1
  369. package/dist/ionic/p-C-f6azUS.js +4 -0
  370. package/dist/ionic/p-C7ycgP4B.js +4 -0
  371. package/dist/ionic/p-CDm80Rj3.js +4 -0
  372. package/dist/ionic/p-CHFzrYxP.js +4 -0
  373. package/dist/ionic/{p-yiP8rgDC.js → p-CKXT3wQs.js} +1 -1
  374. package/dist/ionic/p-CM0qxZsb.js +4 -0
  375. package/dist/ionic/p-CQ_2X4AT.js +4 -0
  376. package/dist/ionic/p-CVrhKnjg.js +4 -0
  377. package/dist/ionic/{p-g9SK-dv1.js → p-CeBx7xPk.js} +1 -1
  378. package/dist/ionic/{p-Dvqtt_WK.js → p-Ci0c0wtC.js} +1 -1
  379. package/dist/ionic/{p-BIj0Lfim.js → p-DBXYO0BD.js} +1 -1
  380. package/dist/ionic/p-DMhM7rpA.js +4 -0
  381. package/dist/ionic/p-DR3KphGG.js +4 -0
  382. package/{components/p-CaY8IRMT.js → dist/ionic/p-DRhfTaQ0.js} +1 -1
  383. package/dist/ionic/p-DYjohhqj.js +4 -0
  384. package/dist/ionic/{p-BRlwrQ6h.js → p-DgorWJ0n.js} +1 -1
  385. package/dist/ionic/p-Dk5f_kFq.js +4 -0
  386. package/dist/ionic/{p-e0g1fYYm.js → p-DrPUIWm0.js} +1 -1
  387. package/dist/ionic/p-M3xPAPEh.js +4 -0
  388. package/dist/ionic/p-RgtmfsTX.js +4 -0
  389. package/dist/ionic/p-YkyvCGQx.js +4 -0
  390. package/dist/ionic/{p-e04a7110.entry.js → p-a72282cf.entry.js} +1 -1
  391. package/dist/ionic/p-a848f8d2.entry.js +4 -0
  392. package/dist/ionic/{p-df272a41.entry.js → p-a9e92328.entry.js} +1 -1
  393. package/dist/ionic/{p-8af458bf.entry.js → p-b08bcb06.entry.js} +1 -1
  394. package/dist/ionic/p-c176a425.entry.js +4 -0
  395. package/dist/ionic/{p-41254776.entry.js → p-c6c32f6d.entry.js} +1 -1
  396. package/dist/ionic/p-c913bd7d.entry.js +4 -0
  397. package/dist/ionic/{p-0a14a6a3.entry.js → p-d1687c72.entry.js} +1 -1
  398. package/dist/ionic/{p-c9952851.entry.js → p-d2a4fcf9.entry.js} +1 -1
  399. package/dist/ionic/{p-a1d733a3.entry.js → p-d428580a.entry.js} +1 -1
  400. package/dist/ionic/{p-25abc69d.entry.js → p-d7c9b618.entry.js} +1 -1
  401. package/dist/ionic/{p-d7fb1d2a.entry.js → p-dc0c071c.entry.js} +1 -1
  402. package/dist/ionic/{p-097a0cf5.entry.js → p-dc531e27.entry.js} +1 -1
  403. package/dist/ionic/p-de9cbee0.entry.js +4 -0
  404. package/dist/ionic/{p-302e4d74.entry.js → p-e223cd26.entry.js} +1 -1
  405. package/dist/ionic/{p-c0dd14f4.entry.js → p-f5a0d31b.entry.js} +1 -1
  406. package/dist/ionic/{p-7da532af.entry.js → p-f930dcb4.entry.js} +1 -1
  407. package/dist/ionic/{p-a4a2ce90.entry.js → p-f93bd399.entry.js} +1 -1
  408. package/dist/ionic/p-fa45723d.entry.js +4 -0
  409. package/dist/ionic/{p-38d3e1cb.entry.js → p-fab0961c.entry.js} +1 -1
  410. package/dist/ionic/p-fbf4767c.entry.js +4 -0
  411. package/dist/ionic/{p-CESQIy-V.js → p-vGIL6Nbe.js} +1 -1
  412. package/dist/types/components/button/button.d.ts +3 -12
  413. package/dist/types/components/card/card.d.ts +3 -1
  414. package/dist/types/components/item/item.d.ts +1 -1
  415. package/dist/types/components/popover/utils.d.ts +16 -3
  416. package/dist/types/index.d.ts +1 -1
  417. package/dist/types/utils/attribute-controller.d.ts +56 -0
  418. package/dist/types/utils/helpers.d.ts +10 -2
  419. package/dist/types/utils/logging/index.d.ts +4 -0
  420. package/hydrate/index.js +278 -63
  421. package/hydrate/index.mjs +278 -63
  422. package/package.json +1 -1
  423. package/components/p--pR3YKVX.js +0 -4
  424. package/components/p-47h0_nN4.js +0 -4
  425. package/components/p-BGChz0G8.js +0 -4
  426. package/components/p-BLe-edUh.js +0 -4
  427. package/components/p-Bc-3W2an.js +0 -4
  428. package/components/p-BezRi1ML.js +0 -4
  429. package/components/p-C0tpzcpi.js +0 -4
  430. package/components/p-CDt7Q7Dj.js +0 -4
  431. package/components/p-CDvyV0r0.js +0 -4
  432. package/components/p-CEs5NmKW.js +0 -4
  433. package/components/p-CLVgYpRn.js +0 -4
  434. package/components/p-CPGp3WWG.js +0 -4
  435. package/components/p-CeGQfrDU.js +0 -4
  436. package/components/p-CpcdCRug.js +0 -4
  437. package/components/p-DVHC9GYb.js +0 -4
  438. package/components/p-DWe-YApm.js +0 -4
  439. package/components/p-DX_3N4fh.js +0 -4
  440. package/components/p-DftucGJR.js +0 -4
  441. package/components/p-HO1CDBeU.js +0 -4
  442. package/components/p-MOwrp7hX.js +0 -4
  443. package/components/p-k92zpBT6.js +0 -4
  444. package/components/p-rDUBp56G.js +0 -4
  445. package/dist/ionic/p-1c4926e9.entry.js +0 -4
  446. package/dist/ionic/p-1dac4211.entry.js +0 -4
  447. package/dist/ionic/p-23afeeb2.entry.js +0 -4
  448. package/dist/ionic/p-29687c0b.entry.js +0 -4
  449. package/dist/ionic/p-2ecebfd9.entry.js +0 -4
  450. package/dist/ionic/p-4dc3f2b3.entry.js +0 -4
  451. package/dist/ionic/p-5b9b245e.entry.js +0 -4
  452. package/dist/ionic/p-5f695204.entry.js +0 -4
  453. package/dist/ionic/p-63eb4550.entry.js +0 -4
  454. package/dist/ionic/p-8d68604a.entry.js +0 -4
  455. package/dist/ionic/p-B13Uv-FT.js +0 -4
  456. package/dist/ionic/p-B8K6OHqa.js +0 -4
  457. package/dist/ionic/p-BD0v0Sx_.js +0 -4
  458. package/dist/ionic/p-BDs20Dfe.js +0 -4
  459. package/dist/ionic/p-BRZstBYy.js +0 -4
  460. package/dist/ionic/p-Ba_yQZdQ.js +0 -4
  461. package/dist/ionic/p-BnMJqJBa.js +0 -4
  462. package/dist/ionic/p-BrbwGxm1.js +0 -4
  463. package/dist/ionic/p-Bx46Dlpo.js +0 -4
  464. package/dist/ionic/p-C0vJzNM9.js +0 -4
  465. package/dist/ionic/p-C4FdGOym.js +0 -4
  466. package/dist/ionic/p-CD77BF32.js +0 -4
  467. package/dist/ionic/p-CazJOH5P.js +0 -4
  468. package/dist/ionic/p-D14knedj.js +0 -4
  469. package/dist/ionic/p-DQcKi6P6.js +0 -4
  470. package/dist/ionic/p-NL1pxcde.js +0 -4
  471. package/dist/ionic/p-a6a95175.entry.js +0 -4
  472. package/dist/ionic/p-bcf18c26.entry.js +0 -4
  473. package/dist/ionic/p-be8ae1cc.entry.js +0 -4
  474. package/dist/ionic/p-e3a98575.entry.js +0 -4
  475. package/dist/ionic/p-f97ef975.entry.js +0 -4
  476. package/dist/ionic/p-yYEBg4iw.js +0 -4
package/hydrate/index.mjs CHANGED
@@ -284,6 +284,8 @@ const isLogLevelEnabled = (minimum) => {
284
284
  * to indicate the library that is warning the developer.
285
285
  *
286
286
  * @param message - The string message to be logged to the console.
287
+ *
288
+ * @internal
287
289
  */
288
290
  const printIonWarning = (message, ...params) => {
289
291
  if (isLogLevelEnabled(LogLevel.WARN)) {
@@ -296,6 +298,8 @@ const printIonWarning = (message, ...params) => {
296
298
  *
297
299
  * @param message - The string message to be logged to the console.
298
300
  * @param params - Additional arguments to supply to the console.error.
301
+ *
302
+ * @internal
299
303
  */
300
304
  const printIonError = (message, ...params) => {
301
305
  if (isLogLevelEnabled(LogLevel.ERROR)) {
@@ -5943,8 +5947,8 @@ const hasLazyBuild = (stencilEl) => {
5943
5947
  * helper function should be called in componentWillLoad and assigned to a variable
5944
5948
  * that is later used in the render function.
5945
5949
  *
5946
- * This does not need to be reactive as changing attributes on the host element
5947
- * does not trigger a re-render.
5950
+ * This copies once. Use `createAttributeController` instead when the attributes can
5951
+ * change after load, since a host attribute change does not trigger a re-render.
5948
5952
  */
5949
5953
  const inheritAttributes$1 = (el, attributes = []) => {
5950
5954
  const attributeObject = {};
@@ -5963,6 +5967,8 @@ const inheritAttributes$1 = (el, attributes = []) => {
5963
5967
  * List of available ARIA attributes + `role`.
5964
5968
  * Removed deprecated attributes.
5965
5969
  * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes
5970
+ *
5971
+ * @internal Exported for `attribute-controller.ts`, which needs the same set.
5966
5972
  */
5967
5973
  const ariaAttributes = [
5968
5974
  'role',
@@ -12261,6 +12267,128 @@ class Breadcrumbs {
12261
12267
  }; }
12262
12268
  }
12263
12269
 
12270
+ /**
12271
+ * Copies a set of attributes off the host element so they can be applied to an element
12272
+ * inside the shadow root, then keeps that copy in sync as the host attributes change.
12273
+ * Using `inheritAttributes` alone copies once at load, so anything written to the host
12274
+ * afterwards never reaches the element the assistive technology reads.
12275
+ *
12276
+ * Create the controller in `componentWillLoad`. It takes the initial copy and starts
12277
+ * watching right away, so `init()` is only needed to resume after a move.
12278
+ *
12279
+ * Two things to know before adopting it. Only the initial copy removes the attributes
12280
+ * from the host, so a value written after load sits on the host as well as on the
12281
+ * element it is applied to, which matters if the host has a role of its own. And an
12282
+ * attribute from the initial markup can never be removed, only overwritten, since the
12283
+ * copy already took it off the host and a `removeAttribute` there fires no mutation.
12284
+ * An empty string works for `aria-label` and friends, but a token-valued attribute
12285
+ * has to be set to its default instead, so `aria-pressed="false"` rather than empty.
12286
+ *
12287
+ * @internal
12288
+ * @param el The host element to copy from and watch.
12289
+ * @param attributes The attributes to copy and watch.
12290
+ * @param onChange Called after `attributes` changes, so the component can re-render.
12291
+ * @param hostOwnedAttributes Attributes copied at load but not watched. Use it for
12292
+ * attributes the component renders on its own `<Host>`, since a later change to one of
12293
+ * those is the component's own write, and for attributes that would put a second node in
12294
+ * the accessibility tree if the host kept a copy alongside the one we apply.
12295
+ */
12296
+ const createAttributeController = (el, attributes, onChange, hostOwnedAttributes = []) => {
12297
+ let inherited = inheritAttributes$1(el, attributes);
12298
+ let observer;
12299
+ const watchedAttributes = attributes.filter((attr) => !hostOwnedAttributes.includes(attr));
12300
+ /**
12301
+ * The names still on the host, which is everything written after load. The initial
12302
+ * copy removes what it captures, so a missing attribute only counts as a removal
12303
+ * when its name is in here.
12304
+ */
12305
+ const hostWritten = new Set();
12306
+ const setPresence = (name, value) => {
12307
+ if (value === null) {
12308
+ hostWritten.delete(name);
12309
+ }
12310
+ else {
12311
+ hostWritten.add(name);
12312
+ }
12313
+ };
12314
+ /**
12315
+ * Nothing is watching while the host is out of the tree, since `disconnectedCallback`
12316
+ * calls `destroy()`, and `forceUpdate` is a no-op on a disconnected host anyway. So
12317
+ * the host has to be re-read on the way back in.
12318
+ */
12319
+ const readMissedChanges = () => {
12320
+ const changed = {};
12321
+ for (const name of watchedAttributes) {
12322
+ const value = el.getAttribute(name);
12323
+ const wasOnHost = hostWritten.has(name);
12324
+ setPresence(name, value);
12325
+ /**
12326
+ * An attribute that was never written to the host is missing because the initial
12327
+ * copy took it, not because the developer cleared it.
12328
+ */
12329
+ if ((value === null && !wasOnHost) || value === inherited[name]) {
12330
+ continue;
12331
+ }
12332
+ changed[name] = value;
12333
+ }
12334
+ if (Object.keys(changed).length > 0) {
12335
+ inherited = { ...inherited, ...changed };
12336
+ onChange();
12337
+ }
12338
+ };
12339
+ const init = () => {
12340
+ // There is no MutationObserver in SSR or the hydrate build.
12341
+ if (observer !== undefined || watchedAttributes.length === 0 || win$1 === undefined || !('MutationObserver' in win$1)) {
12342
+ return;
12343
+ }
12344
+ readMissedChanges();
12345
+ observer = new MutationObserver((mutations) => {
12346
+ const changed = {};
12347
+ for (const mutation of mutations) {
12348
+ const name = mutation.attributeName;
12349
+ // A removed attribute reads back as null, which clears it from the element the
12350
+ // values are spread onto.
12351
+ const value = el.getAttribute(name);
12352
+ setPresence(name, value);
12353
+ changed[name] = value;
12354
+ }
12355
+ inherited = { ...inherited, ...changed };
12356
+ onChange();
12357
+ });
12358
+ observer.observe(el, { attributeFilter: watchedAttributes });
12359
+ };
12360
+ const destroy = () => {
12361
+ observer?.disconnect();
12362
+ observer = undefined;
12363
+ };
12364
+ /**
12365
+ * Has to run after the initial copy, because that copy removes the attributes from the
12366
+ * host and an observer armed any earlier would read the removal as a developer clearing
12367
+ * them.
12368
+ */
12369
+ init();
12370
+ return {
12371
+ get attributes() {
12372
+ return inherited;
12373
+ },
12374
+ init,
12375
+ destroy,
12376
+ };
12377
+ };
12378
+ /**
12379
+ * The `createAttributeController` equivalent of `inheritAriaAttributes`, which copies and
12380
+ * watches every ARIA attribute plus `role`.
12381
+ *
12382
+ * @internal
12383
+ * @param el The host element to copy from and watch.
12384
+ * @param onChange Called after the attributes change, so the component can re-render.
12385
+ * @param hostOwnedAttributes Attributes copied at load but not watched. See
12386
+ * `createAttributeController`.
12387
+ */
12388
+ const createAriaAttributeController = (el, onChange, hostOwnedAttributes = []) => {
12389
+ return createAttributeController(el, ariaAttributes, onChange, hostOwnedAttributes);
12390
+ };
12391
+
12264
12392
  const buttonIosCss = () => `:host{--overflow:hidden;--ripple-color:currentColor;--border-width:initial;--border-color:initial;--border-style:initial;--color-activated:var(--color);--color-focused:var(--color);--color-hover:var(--color);--box-shadow:none;display:inline-block;width:auto;color:var(--color);font-family:var(--ion-font-family, inherit);text-align:center;text-decoration:none;white-space:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:top;vertical-align:-webkit-baseline-middle;-webkit-font-kerning:none;font-kerning:none}:host(.button-disabled){cursor:default;opacity:0.5;pointer-events:none}:host(.button-solid){--background:var(--ion-color-primary, #0054e9);--color:var(--ion-color-primary-contrast, #fff)}:host(.button-outline){--border-color:var(--ion-color-primary, #0054e9);--background:transparent;--color:var(--ion-color-primary, #0054e9)}:host(.button-clear){--border-width:0;--background:transparent;--color:var(--ion-color-primary, #0054e9)}:host(.button-block){display:block}:host(.button-block) .button-native{margin-left:0;margin-right:0;width:100%;clear:both;contain:content}:host(.button-block) .button-native::after{clear:both}:host(.button-full){display:block}:host(.button-full) .button-native{margin-left:0;margin-right:0;width:100%;contain:content}:host(.button-full:not(.button-round)) .button-native{border-radius:0;border-right-width:0;border-left-width:0}.button-native{border-radius:var(--border-radius);-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-indent:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;width:100%;height:100%;min-height:inherit;-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);outline:none;background:var(--background);line-height:1;-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);contain:layout style;cursor:pointer;opacity:var(--opacity);overflow:var(--overflow);z-index:0;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}.button-native::-moz-focus-inner{border:0}.button-inner{display:-ms-flexbox;display:flex;position:relative;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-negative:0;flex-shrink:0;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;z-index:1}::slotted([slot=start]),::slotted([slot=end]){-ms-flex-negative:0;flex-shrink:0}::slotted(ion-icon){font-size:1.35em;pointer-events:none}::slotted(ion-icon[slot=start]){-webkit-margin-start:-0.3em;margin-inline-start:-0.3em;-webkit-margin-end:0.3em;margin-inline-end:0.3em;margin-top:0;margin-bottom:0}::slotted(ion-icon[slot=end]){-webkit-margin-start:0.3em;margin-inline-start:0.3em;-webkit-margin-end:-0.2em;margin-inline-end:-0.2em;margin-top:0;margin-bottom:0}ion-ripple-effect{color:var(--ripple-color)}.button-native::after{left:0;right:0;top:0;bottom:0;position:absolute;content:"";opacity:0}:host(.ion-focused){color:var(--color-focused)}:host(.ion-focused) .button-native::after{background:var(--background-focused);opacity:var(--background-focused-opacity)}@media (any-hover: hover){:host(:hover){color:var(--color-hover)}:host(:hover) .button-native::after{background:var(--background-hover);opacity:var(--background-hover-opacity)}}:host(.ion-activated){color:var(--color-activated)}:host(.ion-activated) .button-native::after{background:var(--background-activated);opacity:var(--background-activated-opacity)}:host(.button-solid.ion-color) .button-native{background:var(--ion-color-base);color:var(--ion-color-contrast)}:host(.button-outline.ion-color) .button-native{border-color:var(--ion-color-base);background:transparent;color:var(--ion-color-base)}:host(.button-clear.ion-color) .button-native{background:transparent;color:var(--ion-color-base)}:host(.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{color:var(--ion-toolbar-color, var(--color))}:host(.button-outline.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{border-color:var(--ion-toolbar-color, var(--color, var(--border-color)))}:host(.button-solid.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{background:var(--ion-toolbar-color, var(--background));color:var(--ion-toolbar-background, var(--color))}:host{--border-radius:14px;--padding-top:13px;--padding-bottom:13px;--padding-start:1em;--padding-end:1em;--transition:background-color, opacity 100ms linear;-webkit-margin-start:2px;margin-inline-start:2px;-webkit-margin-end:2px;margin-inline-end:2px;margin-top:4px;margin-bottom:4px;min-height:3.1em;font-size:min(1rem, 48px);font-weight:500;letter-spacing:0}:host(.button-solid){--background-activated:var(--ion-color-primary-shade, #004acd);--background-focused:var(--ion-color-primary-shade, #004acd);--background-hover:var(--ion-color-primary-tint, #1a65eb);--background-activated-opacity:1;--background-focused-opacity:1;--background-hover-opacity:1}:host(.button-outline){--border-radius:14px;--border-width:1px;--border-style:solid;--background-activated:var(--ion-color-primary, #0054e9);--background-focused:var(--ion-color-primary, #0054e9);--background-hover:transparent;--background-focused-opacity:.1;--color-activated:var(--ion-color-primary-contrast, #fff)}:host(.button-clear){--background-activated:transparent;--background-activated-opacity:0;--background-focused:var(--ion-color-primary, #0054e9);--background-hover:transparent;--background-focused-opacity:.1;font-size:min(1.0625rem, 51px);font-weight:normal}:host(.in-buttons){font-size:clamp(17px, 1.0625rem, 21.08px);font-weight:400}:host(.button-large){--border-radius:16px;--padding-top:17px;--padding-start:1em;--padding-end:1em;--padding-bottom:17px;min-height:3.1em;font-size:min(1.25rem, 60px)}:host(.button-small){--border-radius:6px;--padding-top:4px;--padding-start:0.9em;--padding-end:0.9em;--padding-bottom:4px;min-height:2.1em;font-size:min(0.8125rem, 39px)}:host(.button-round){--border-radius:999px;--padding-top:0;--padding-start:26px;--padding-end:26px;--padding-bottom:0}:host(.button-strong){font-weight:600}:host(.button-has-icon-only){--padding-top:0;--padding-bottom:var(--padding-top);--padding-end:var(--padding-top);--padding-start:var(--padding-end);min-width:clamp(30px, 2.125em, 60px);min-height:clamp(30px, 2.125em, 60px)}::slotted(ion-icon[slot=icon-only]){font-size:clamp(15.12px, 1.125em, 43.02px)}:host(.button-small.button-has-icon-only){min-width:clamp(23px, 2.16em, 54px);min-height:clamp(23px, 2.16em, 54px)}:host(.button-small) ::slotted(ion-icon[slot=icon-only]){font-size:clamp(12.1394px, 1.308125em, 40.1856px)}:host(.button-large.button-has-icon-only){min-width:clamp(46px, 2.5em, 78px);min-height:clamp(46px, 2.5em, 78px)}:host(.button-large) ::slotted(ion-icon[slot=icon-only]){font-size:clamp(15.12px, 0.9em, 43.056px)}:host(.button-outline.ion-focused.ion-color) .button-native,:host(.button-clear.ion-focused.ion-color) .button-native{color:var(--ion-color-base)}:host(.button-outline.ion-focused.ion-color) .button-native::after,:host(.button-clear.ion-focused.ion-color) .button-native::after{background:var(--ion-color-base)}:host(.button-solid.ion-color.ion-focused) .button-native::after{background:var(--ion-color-shade)}@media (any-hover: hover){:host(.button-clear:not(.ion-activated):hover),:host(.button-outline:not(.ion-activated):hover){opacity:0.6}:host(.button-clear.ion-color:hover) .button-native,:host(.button-outline.ion-color:hover) .button-native{color:var(--ion-color-base)}:host(.button-clear.ion-color:hover) .button-native::after,:host(.button-outline.ion-color:hover) .button-native::after{background:transparent}:host(.button-solid.ion-color:hover) .button-native::after{background:var(--ion-color-tint)}:host(:hover.button-solid.in-toolbar:not(.ion-color):not(.in-toolbar-color):not(.ion-activated)) .button-native::after{background:#fff;opacity:0.1}}:host(.button-clear.ion-activated){opacity:0.4}:host(.button-outline.ion-activated.ion-color) .button-native{color:var(--ion-color-contrast)}:host(.button-outline.ion-activated.ion-color) .button-native::after{background:var(--ion-color-base)}:host(.button-solid.ion-color.ion-activated) .button-native::after{background:var(--ion-color-shade)}:host(.button-outline.ion-activated.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{background:var(--ion-toolbar-color, var(--color));color:var(--ion-toolbar-background, var(--background), var(--ion-color-primary-contrast, #fff))}`;
12265
12393
 
12266
12394
  const buttonMdCss = () => `:host{--overflow:hidden;--ripple-color:currentColor;--border-width:initial;--border-color:initial;--border-style:initial;--color-activated:var(--color);--color-focused:var(--color);--color-hover:var(--color);--box-shadow:none;display:inline-block;width:auto;color:var(--color);font-family:var(--ion-font-family, inherit);text-align:center;text-decoration:none;white-space:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:top;vertical-align:-webkit-baseline-middle;-webkit-font-kerning:none;font-kerning:none}:host(.button-disabled){cursor:default;opacity:0.5;pointer-events:none}:host(.button-solid){--background:var(--ion-color-primary, #0054e9);--color:var(--ion-color-primary-contrast, #fff)}:host(.button-outline){--border-color:var(--ion-color-primary, #0054e9);--background:transparent;--color:var(--ion-color-primary, #0054e9)}:host(.button-clear){--border-width:0;--background:transparent;--color:var(--ion-color-primary, #0054e9)}:host(.button-block){display:block}:host(.button-block) .button-native{margin-left:0;margin-right:0;width:100%;clear:both;contain:content}:host(.button-block) .button-native::after{clear:both}:host(.button-full){display:block}:host(.button-full) .button-native{margin-left:0;margin-right:0;width:100%;contain:content}:host(.button-full:not(.button-round)) .button-native{border-radius:0;border-right-width:0;border-left-width:0}.button-native{border-radius:var(--border-radius);-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-indent:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;width:100%;height:100%;min-height:inherit;-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);outline:none;background:var(--background);line-height:1;-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);contain:layout style;cursor:pointer;opacity:var(--opacity);overflow:var(--overflow);z-index:0;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}.button-native::-moz-focus-inner{border:0}.button-inner{display:-ms-flexbox;display:flex;position:relative;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-negative:0;flex-shrink:0;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:100%;height:100%;z-index:1}::slotted([slot=start]),::slotted([slot=end]){-ms-flex-negative:0;flex-shrink:0}::slotted(ion-icon){font-size:1.35em;pointer-events:none}::slotted(ion-icon[slot=start]){-webkit-margin-start:-0.3em;margin-inline-start:-0.3em;-webkit-margin-end:0.3em;margin-inline-end:0.3em;margin-top:0;margin-bottom:0}::slotted(ion-icon[slot=end]){-webkit-margin-start:0.3em;margin-inline-start:0.3em;-webkit-margin-end:-0.2em;margin-inline-end:-0.2em;margin-top:0;margin-bottom:0}ion-ripple-effect{color:var(--ripple-color)}.button-native::after{left:0;right:0;top:0;bottom:0;position:absolute;content:"";opacity:0}:host(.ion-focused){color:var(--color-focused)}:host(.ion-focused) .button-native::after{background:var(--background-focused);opacity:var(--background-focused-opacity)}@media (any-hover: hover){:host(:hover){color:var(--color-hover)}:host(:hover) .button-native::after{background:var(--background-hover);opacity:var(--background-hover-opacity)}}:host(.ion-activated){color:var(--color-activated)}:host(.ion-activated) .button-native::after{background:var(--background-activated);opacity:var(--background-activated-opacity)}:host(.button-solid.ion-color) .button-native{background:var(--ion-color-base);color:var(--ion-color-contrast)}:host(.button-outline.ion-color) .button-native{border-color:var(--ion-color-base);background:transparent;color:var(--ion-color-base)}:host(.button-clear.ion-color) .button-native{background:transparent;color:var(--ion-color-base)}:host(.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{color:var(--ion-toolbar-color, var(--color))}:host(.button-outline.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{border-color:var(--ion-toolbar-color, var(--color, var(--border-color)))}:host(.button-solid.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{background:var(--ion-toolbar-color, var(--background));color:var(--ion-toolbar-background, var(--color))}:host{--border-radius:4px;--padding-top:8px;--padding-bottom:8px;--padding-start:1.1em;--padding-end:1.1em;--transition:box-shadow 280ms cubic-bezier(.4, 0, .2, 1), background-color 15ms linear, color 15ms linear;-webkit-margin-start:2px;margin-inline-start:2px;-webkit-margin-end:2px;margin-inline-end:2px;margin-top:4px;margin-bottom:4px;min-height:36px;font-size:0.875rem;font-weight:500;letter-spacing:0.06em;text-transform:uppercase}:host(.button-solid){--background-activated:transparent;--background-hover:var(--ion-color-primary-contrast, #fff);--background-focused:var(--ion-color-primary-contrast, #fff);--background-activated-opacity:0;--background-focused-opacity:.24;--background-hover-opacity:.08;--box-shadow:0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)}:host(.button-solid.ion-activated){--box-shadow:0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12)}:host(.button-outline){--border-width:2px;--border-style:solid;--box-shadow:none;--background-activated:transparent;--background-focused:var(--ion-color-primary, #0054e9);--background-hover:var(--ion-color-primary, #0054e9);--background-activated-opacity:0;--background-focused-opacity:.12;--background-hover-opacity:.04}:host(.button-outline.ion-activated.ion-color) .button-native{background:transparent}:host(.button-clear){--background-activated:transparent;--background-focused:var(--ion-color-primary, #0054e9);--background-hover:var(--ion-color-primary, #0054e9);--background-activated-opacity:0;--background-focused-opacity:.12;--background-hover-opacity:.04}:host(.button-round){--border-radius:999px;--padding-top:0;--padding-start:26px;--padding-end:26px;--padding-bottom:0}:host(.button-large){--padding-top:14px;--padding-start:1em;--padding-end:1em;--padding-bottom:14px;min-height:2.8em;font-size:1.25rem}:host(.button-small){--padding-top:4px;--padding-start:0.9em;--padding-end:0.9em;--padding-bottom:4px;min-height:2.1em;font-size:0.8125rem}:host(.button-strong){font-weight:bold}:host(.button-has-icon-only){--padding-top:0;--padding-bottom:var(--padding-top);--padding-end:var(--padding-top);--padding-start:var(--padding-end);min-width:clamp(30px, 2.86em, 60px);min-height:clamp(30px, 2.86em, 60px)}::slotted(ion-icon[slot=icon-only]){font-size:clamp(15.104px, 1.6em, 43.008px)}:host(.button-small.button-has-icon-only){min-width:clamp(23px, 2.16em, 54px);min-height:clamp(23px, 2.16em, 54px)}:host(.button-small) ::slotted(ion-icon[slot=icon-only]){font-size:clamp(13.002px, 1.23125em, 40.385px)}:host(.button-large.button-has-icon-only){min-width:clamp(46px, 2.5em, 78px);min-height:clamp(46px, 2.5em, 78px)}:host(.button-large) ::slotted(ion-icon[slot=icon-only]){font-size:clamp(15.008px, 1.4em, 43.008px)}:host(.button-solid.ion-color.ion-focused) .button-native::after{background:var(--ion-color-contrast)}:host(.button-clear.ion-color.ion-focused) .button-native::after,:host(.button-outline.ion-color.ion-focused) .button-native::after{background:var(--ion-color-base)}@media (any-hover: hover){:host(.button-solid.ion-color:hover) .button-native::after{background:var(--ion-color-contrast)}:host(.button-clear.ion-color:hover) .button-native::after,:host(.button-outline.ion-color:hover) .button-native::after{background:var(--ion-color-base)}}:host(.button-outline.ion-activated.in-toolbar:not(.ion-color):not(.in-toolbar-color)) .button-native{background:var(--ion-toolbar-background, var(--color));color:var(--ion-toolbar-color, var(--background), var(--ion-color-primary-contrast, #fff))}`;
@@ -12285,7 +12413,6 @@ class Button {
12285
12413
  this.inToolbar = false;
12286
12414
  this.formButtonEl = null;
12287
12415
  this.formEl = null;
12288
- this.inheritedAttributes = {};
12289
12416
  /**
12290
12417
  * If `true`, the button only has an icon.
12291
12418
  */
@@ -12344,22 +12471,6 @@ class Button {
12344
12471
  this.formButtonEl.disabled = disabled;
12345
12472
  }
12346
12473
  }
12347
- /**
12348
- * This component is used within the `ion-input-password-toggle` component
12349
- * to toggle the visibility of the password input.
12350
- * These attributes need to update based on the state of the password input.
12351
- * Otherwise, the values will be stale.
12352
- *
12353
- * @param newValue
12354
- * @param _oldValue
12355
- * @param propName
12356
- */
12357
- onAriaChanged(newValue, _oldValue, propName) {
12358
- this.inheritedAttributes = {
12359
- ...this.inheritedAttributes,
12360
- [propName]: newValue,
12361
- };
12362
- }
12363
12474
  /**
12364
12475
  * This is responsible for rendering a hidden native
12365
12476
  * button element inside the associated form. This allows
@@ -12397,7 +12508,21 @@ class Button {
12397
12508
  this.inToolbar = !!this.el.closest('ion-buttons');
12398
12509
  this.inListHeader = !!this.el.closest('ion-list-header');
12399
12510
  this.inItem = !!this.el.closest('ion-item') || !!this.el.closest('ion-item-divider');
12400
- this.inheritedAttributes = inheritAriaAttributes(this.el);
12511
+ /**
12512
+ * The ARIA state has to stay live, since `ion-input-password-toggle` rewrites
12513
+ * `aria-label` and `aria-pressed` on its `ion-button` on every toggle. We keep
12514
+ * `aria-disabled` out of the watch because the `<Host>` below renders it from the
12515
+ * `disabled` prop and those writes would clobber a developer's value, and `role` out
12516
+ * because a post-load write stays on the host too, which would put the same role on
12517
+ * two elements in the accessibility tree.
12518
+ */
12519
+ this.ariaController = createAriaAttributeController(this.el, () => forceUpdate(), ['aria-disabled', 'role']);
12520
+ }
12521
+ connectedCallback() {
12522
+ this.ariaController?.init();
12523
+ }
12524
+ disconnectedCallback() {
12525
+ this.ariaController?.destroy();
12401
12526
  }
12402
12527
  get hasIconOnly() {
12403
12528
  return !!this.el.querySelector('[slot="icon-only"]');
@@ -12472,7 +12597,8 @@ class Button {
12472
12597
  }
12473
12598
  render() {
12474
12599
  const mode = getIonMode$1(this);
12475
- const { buttonType, type, disabled, rel, target, size, href, color, expand, hasIconOnly, shape, strong, inheritedAttributes, } = this;
12600
+ const { buttonType, type, disabled, rel, target, size, href, color, expand, hasIconOnly, shape, strong } = this;
12601
+ const inheritedAttributes = this.ariaController?.attributes ?? {};
12476
12602
  const finalSize = size === undefined && this.inItem ? 'small' : size;
12477
12603
  const TagType = href === undefined ? 'button' : 'a';
12478
12604
  const attrs = TagType === 'button'
@@ -12497,7 +12623,7 @@ class Button {
12497
12623
  {
12498
12624
  type !== 'button' && this.renderHiddenButton();
12499
12625
  }
12500
- return (hAsync(Host, { key: '82c71b8cbf3bb51e443f4aa99c375bf5be6b8dc7', onClick: this.handleClick, "aria-disabled": disabled ? 'true' : null, class: createColorClasses$1(color, {
12626
+ return (hAsync(Host, { key: 'fd42d1a5836c148cddd6c474c130ce4bb36286ea', onClick: this.handleClick, "aria-disabled": disabled ? 'true' : null, class: createColorClasses$1(color, {
12501
12627
  [mode]: true,
12502
12628
  [buttonType]: true,
12503
12629
  [`${buttonType}-${expand}`]: expand !== undefined,
@@ -12512,21 +12638,12 @@ class Button {
12512
12638
  'button-disabled': disabled,
12513
12639
  'ion-activatable': true,
12514
12640
  'ion-focusable': true,
12515
- }) }, hAsync(TagType, { key: '53f4cb366bac796ab38f609e858bc1a55fce7641', ...attrs, class: "button-native", part: "native", disabled: disabled, onFocus: this.onFocus, onBlur: this.onBlur, ...inheritedAttributes }, hAsync("span", { key: '40e127fc11c889e77b8bf02e8714f0dea83bfce7', class: "button-inner" }, hAsync("slot", { key: 'e11c8c86d3f0894658a8999129425c9c111f5540', name: "icon-only", onSlotchange: this.slotChanged }), hAsync("slot", { key: '105ea9259ea17036359e6fe7eced8b267ab8e0f6', name: "start" }), hAsync("slot", { key: '0d7b0966e328a5b10b0562dacbd638dfd08d92af' }), hAsync("slot", { key: 'c542b40685802464d69f57ecc0a7c3465d24a417', name: "end" })), mode === 'md' && hAsync("ion-ripple-effect", { key: '46df4cbeb057b0a8daab92226121d8bbb8c0ee07', type: this.rippleType }))));
12641
+ }) }, hAsync(TagType, { key: '97dbf689ea912aed38182dbe0097a2bf5b768816', ...attrs, class: "button-native", part: "native", disabled: disabled, onFocus: this.onFocus, onBlur: this.onBlur, ...inheritedAttributes }, hAsync("span", { key: '0f1ff4c667e95a8e3dc787fee43fe529b95477b7', class: "button-inner" }, hAsync("slot", { key: 'fc1e8b8080d02828c392e9edd6a70e0255435f82', name: "icon-only", onSlotchange: this.slotChanged }), hAsync("slot", { key: 'c1ece4c0d935f4d023d38fee4cf529dd4123d487', name: "start" }), hAsync("slot", { key: '970db0ee1e3633bc9cbff52eca446e4891ff6851' }), hAsync("slot", { key: 'ef8d7d894f01dbe881f381b985620c2a482e55fe', name: "end" })), mode === 'md' && hAsync("ion-ripple-effect", { key: 'fea5e49a54b0efd07b1bd35d9fd5d2d862a2bac1', type: this.rippleType }))));
12516
12642
  }
12517
12643
  get el() { return getElement(this); }
12518
12644
  static get watchers() { return {
12519
12645
  "disabled": [{
12520
12646
  "disabledChanged": 0
12521
- }],
12522
- "aria-checked": [{
12523
- "onAriaChanged": 0
12524
- }],
12525
- "aria-label": [{
12526
- "onAriaChanged": 0
12527
- }],
12528
- "aria-pressed": [{
12529
- "onAriaChanged": 0
12530
12647
  }]
12531
12648
  }; }
12532
12649
  static get style() { return {
@@ -12617,7 +12734,6 @@ const cardMdCss = () => `:host{--ion-safe-area-left:0px;--ion-safe-area-right:0p
12617
12734
  class Card {
12618
12735
  constructor(hostRef) {
12619
12736
  registerInstance(this, hostRef);
12620
- this.inheritedAriaAttributes = {};
12621
12737
  /**
12622
12738
  * If `true`, a button tag will be rendered and the card will be tappable.
12623
12739
  */
@@ -12637,7 +12753,18 @@ class Card {
12637
12753
  this.routerDirection = 'forward';
12638
12754
  }
12639
12755
  componentWillLoad() {
12640
- this.inheritedAriaAttributes = inheritAttributes$1(this.el, ['aria-label']);
12756
+ /**
12757
+ * Only the initial copy takes the attribute off the host, so an `aria-label` written
12758
+ * after load stays on the host too. That's harmless here, because unlike `ion-item`
12759
+ * the card host renders no role of its own, so nothing reads the leftover copy.
12760
+ */
12761
+ this.ariaController = createAttributeController(this.el, ['aria-label'], () => forceUpdate());
12762
+ }
12763
+ connectedCallback() {
12764
+ this.ariaController?.init();
12765
+ }
12766
+ disconnectedCallback() {
12767
+ this.ariaController?.destroy();
12641
12768
  }
12642
12769
  isClickable() {
12643
12770
  return this.href !== undefined || this.button;
@@ -12647,7 +12774,8 @@ class Card {
12647
12774
  if (!clickable) {
12648
12775
  return [hAsync("slot", null)];
12649
12776
  }
12650
- const { href, routerAnimation, routerDirection, inheritedAriaAttributes } = this;
12777
+ const { href, routerAnimation, routerDirection } = this;
12778
+ const inheritedAriaAttributes = this.ariaController?.attributes ?? {};
12651
12779
  const TagType = clickable ? (href === undefined ? 'button' : 'a') : 'div';
12652
12780
  const attrs = TagType === 'button'
12653
12781
  ? { type: this.type }
@@ -12661,7 +12789,7 @@ class Card {
12661
12789
  }
12662
12790
  render() {
12663
12791
  const mode = getIonMode$1(this);
12664
- return (hAsync(Host, { key: '85e9b30bd81e79a0c7ac75cb3664bdcf9e4afc4d', class: createColorClasses$1(this.color, {
12792
+ return (hAsync(Host, { key: '104412c26f53cce36432c3bb4d9e38bbe00c5816', class: createColorClasses$1(this.color, {
12665
12793
  [mode]: true,
12666
12794
  'card-disabled': this.disabled,
12667
12795
  'ion-activatable': this.isClickable(),
@@ -21870,7 +21998,6 @@ class Item {
21870
21998
  registerInstance(this, hostRef);
21871
21999
  this.labelColorStyles = {};
21872
22000
  this.itemStyles = new Map();
21873
- this.inheritedAriaAttributes = {};
21874
22001
  this.didLoad = false;
21875
22002
  this.multipleInputs = false;
21876
22003
  this.focusable = true;
@@ -21950,9 +22077,16 @@ class Item {
21950
22077
  this.watchForIndicatorControls();
21951
22078
  this.updateInteractivityOnSlotChange();
21952
22079
  }
22080
+ this.ariaController?.init();
21953
22081
  }
21954
22082
  componentWillLoad() {
21955
- this.inheritedAriaAttributes = inheritAttributes$1(this.el, ['aria-label']);
22083
+ /**
22084
+ * Only the initial copy takes the attribute off the host, so an `aria-label` written
22085
+ * after load names both the native element and the Host, which is a `listitem` when
22086
+ * the item is in an `ion-list`. The two names always agree, so a screen reader just
22087
+ * reads it twice.
22088
+ */
22089
+ this.ariaController = createAttributeController(this.el, ['aria-label'], () => forceUpdate());
21956
22090
  }
21957
22091
  componentDidLoad() {
21958
22092
  raf(() => {
@@ -21969,6 +22103,7 @@ class Item {
21969
22103
  this.indicatorControlObserver.disconnect();
21970
22104
  this.indicatorControlObserver = undefined;
21971
22105
  }
22106
+ this.ariaController?.destroy();
21972
22107
  }
21973
22108
  totalNestedInputs() {
21974
22109
  // The following elements have a clickable cover that is relative to the entire item
@@ -22065,7 +22200,8 @@ class Item {
22065
22200
  return controls[0];
22066
22201
  }
22067
22202
  render() {
22068
- const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, inheritedAriaAttributes, multipleInputs, } = this;
22203
+ const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, multipleInputs, } = this;
22204
+ const inheritedAriaAttributes = this.ariaController?.attributes ?? {};
22069
22205
  const childStyles = {};
22070
22206
  const mode = getIonMode$1(this);
22071
22207
  const clickable = this.isClickable();
@@ -22141,7 +22277,7 @@ class Item {
22141
22277
  * multi-input item, and in a clickable item, which is a second tab stop.
22142
22278
  */
22143
22279
  const slottedIndicatorNeedsRoom = this.hasSlottedIndicatorControl && (multipleInputs || this.isClickable());
22144
- return (hAsync(Host, { key: '0dc161ad7ac2fdedc5005015fceb34ed176010a6', "aria-disabled": ariaDisabled, class: {
22280
+ return (hAsync(Host, { key: '7fe924642310c19f057ae1bfa29c1acdf5cc7ed6', "aria-disabled": ariaDisabled, class: {
22145
22281
  ...childStyles,
22146
22282
  ...labelColorStyles,
22147
22283
  ...createColorClasses$1(this.color, {
@@ -22158,7 +22294,7 @@ class Item {
22158
22294
  'ion-focusable': this.focusable,
22159
22295
  'item-rtl': document.dir === 'rtl',
22160
22296
  }),
22161
- }, role: inList ? 'listitem' : null }, hAsync(TagType, { key: 'd42583cf62133b2553de2e7a5357168640bb1834', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, hAsync("slot", { key: 'bd805ce49946cd52280d1c4b370104ee2472f1e2', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), hAsync("div", { key: '0de589f9c5c13c31b6c8838566a7ad6f78f81028', class: "item-inner", part: "inner" }, hAsync("div", { key: 'faaf6a39e072fb352753c645736ab1f47c2d7d25', class: "input-wrapper", part: "container" }, hAsync("slot", { key: '70a34c31de29a0786a14b4a7d3156ba8d4d92eb4', onSlotchange: this.updateInteractivityOnSlotChange })), hAsync("slot", { key: 'c8e764b62c5c30f67750896741ca266b741d5999', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (hAsync("ion-icon", { key: 'af006856d8c4ed69174534261344215957cc751a', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && hAsync("ion-ripple-effect", { key: 'e5e151bafedd38feb8f71a387a0059aa1e9e90de' }))));
22297
+ }, role: inList ? 'listitem' : null }, hAsync(TagType, { key: '8fddfb2a076b4b98e45ee8b23579d011dba12acb', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, hAsync("slot", { key: '7f888b62b2023cf501fd308e32629e7a291c2d05', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), hAsync("div", { key: '6d5cdde307caa65b131edb65cb0a5f8294cf151c', class: "item-inner", part: "inner" }, hAsync("div", { key: '9fbfffdff4cf51adf1f02d573953cf8b145574b0', class: "input-wrapper", part: "container" }, hAsync("slot", { key: '574c7e61cdaa3959a28bad7353105ef217a76ed9', onSlotchange: this.updateInteractivityOnSlotChange })), hAsync("slot", { key: 'ed7e211960cd65ed17f865a6d50d5bdde069416b', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (hAsync("ion-icon", { key: '2847bb21f42e9d5ab8ea86262b2bc1c3b3f7c902', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && hAsync("ion-ripple-effect", { key: '55502ef394db0953144387fa3baebf9fa6a976a9' }))));
22162
22298
  }
22163
22299
  get el() { return getElement(this); }
22164
22300
  static get watchers() { return {
@@ -30520,30 +30656,81 @@ const getSafeAreaInsets = (doc) => {
30520
30656
  }
30521
30657
  return insets;
30522
30658
  };
30659
+ /**
30660
+ * Largest difference from 1 that the `offsetWidth` based zoom detection below
30661
+ * attributes to integer rounding rather than to an actual CSS `zoom`. The
30662
+ * rounding error is at most half a pixel over the width of the popover, which
30663
+ * is well under this threshold for any realistic popover size.
30664
+ */
30665
+ const ZOOM_ROUNDING_TOLERANCE = 0.01;
30666
+ /**
30667
+ * Returns the cumulative CSS `zoom` factor applied to an element.
30668
+ *
30669
+ * When a CSS `zoom` other than 1 is set on an ancestor (e.g. the `html`
30670
+ * element, as recommended by the docs for dynamic font scaling on Chrome for
30671
+ * Android), `getBoundingClientRect()`, `clientX`/`clientY` and other geometry
30672
+ * APIs report values in the *zoomed* (visual) coordinate space, while inline
30673
+ * `top`/`left`/`--width` styles we set are interpreted in the *unzoomed*
30674
+ * (layout) space and re-scaled by the browser. Dividing the rect-derived
30675
+ * values by this factor converts them back to layout space so the popover is
30676
+ * positioned and sized correctly. Returns 1 when no zoom is applied.
30677
+ */
30678
+ const getElementCSSZoom = (el) => {
30679
+ if (!el) {
30680
+ return 1;
30681
+ }
30682
+ /**
30683
+ * `currentCSSZoom` exposes the exact effective zoom of an element
30684
+ * (Chromium 128+). When available we use it directly.
30685
+ */
30686
+ const currentCSSZoom = el.currentCSSZoom;
30687
+ if (typeof currentCSSZoom === 'number' && currentCSSZoom > 0) {
30688
+ return currentCSSZoom;
30689
+ }
30690
+ /**
30691
+ * Fallback for browsers without `currentCSSZoom`: compare the rendered
30692
+ * (zoomed) width from `getBoundingClientRect()` against the layout width
30693
+ * from `offsetWidth`, which is not affected by CSS `zoom`.
30694
+ */
30695
+ const { width } = el.getBoundingClientRect();
30696
+ const { offsetWidth } = el;
30697
+ if (offsetWidth > 0 && width > 0) {
30698
+ const ratio = width / offsetWidth;
30699
+ /**
30700
+ * `offsetWidth` is rounded to an integer while the bounding rect is not,
30701
+ * so the ratio is rarely exactly 1 even when no zoom is applied. Treat
30702
+ * sub-pixel differences as "no zoom" so that unzoomed popovers are not
30703
+ * shifted by the rounding error. A real zoom deviates far more, though
30704
+ * the same rounding leaves the detected factor approximate.
30705
+ */
30706
+ return Math.abs(ratio - 1) < ZOOM_ROUNDING_TOLERANCE ? 1 : ratio;
30707
+ }
30708
+ return 1;
30709
+ };
30523
30710
  /**
30524
30711
  * Returns the dimensions of the popover
30525
30712
  * arrow on `ios` mode. If arrow is disabled
30526
30713
  * returns (0, 0).
30527
30714
  */
30528
- const getArrowDimensions = (arrowEl) => {
30715
+ const getArrowDimensions = (arrowEl, zoom = 1) => {
30529
30716
  if (!arrowEl) {
30530
30717
  return { arrowWidth: 0, arrowHeight: 0 };
30531
30718
  }
30532
30719
  const { width, height } = arrowEl.getBoundingClientRect();
30533
- return { arrowWidth: width, arrowHeight: height };
30720
+ return { arrowWidth: width / zoom, arrowHeight: height / zoom };
30534
30721
  };
30535
30722
  /**
30536
30723
  * Returns the recommended dimensions of the popover
30537
30724
  * that takes into account whether or not the width
30538
30725
  * should match the trigger width.
30539
30726
  */
30540
- const getPopoverDimensions = (size, contentEl, triggerEl) => {
30727
+ const getPopoverDimensions = (size, contentEl, triggerEl, zoom = 1) => {
30541
30728
  const contentDimentions = contentEl.getBoundingClientRect();
30542
- const contentHeight = contentDimentions.height;
30543
- let contentWidth = contentDimentions.width;
30729
+ const contentHeight = contentDimentions.height / zoom;
30730
+ let contentWidth = contentDimentions.width / zoom;
30544
30731
  if (size === 'cover' && triggerEl) {
30545
30732
  const triggerDimensions = triggerEl.getBoundingClientRect();
30546
- contentWidth = triggerDimensions.width;
30733
+ contentWidth = triggerDimensions.width / zoom;
30547
30734
  }
30548
30735
  return {
30549
30736
  contentWidth,
@@ -30883,7 +31070,7 @@ const configureKeyboardInteraction = (popoverEl) => {
30883
31070
  * the reference point, preferred side, alignment
30884
31071
  * and viewport dimensions.
30885
31072
  */
30886
- const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, triggerEl, event) => {
31073
+ const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, triggerEl, event, zoom = 1) => {
30887
31074
  let referenceCoordinates = {
30888
31075
  top: 0,
30889
31076
  left: 0,
@@ -30902,8 +31089,8 @@ const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arro
30902
31089
  }
30903
31090
  const mouseEv = event;
30904
31091
  referenceCoordinates = {
30905
- top: mouseEv.clientY,
30906
- left: mouseEv.clientX,
31092
+ top: mouseEv.clientY / zoom,
31093
+ left: mouseEv.clientX / zoom,
30907
31094
  width: 1,
30908
31095
  height: 1,
30909
31096
  };
@@ -30935,10 +31122,10 @@ const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arro
30935
31122
  }
30936
31123
  const triggerBoundingBox = actualTriggerEl.getBoundingClientRect();
30937
31124
  referenceCoordinates = {
30938
- top: triggerBoundingBox.top,
30939
- left: triggerBoundingBox.left,
30940
- width: triggerBoundingBox.width,
30941
- height: triggerBoundingBox.height,
31125
+ top: triggerBoundingBox.top / zoom,
31126
+ left: triggerBoundingBox.left / zoom,
31127
+ width: triggerBoundingBox.width / zoom,
31128
+ height: triggerBoundingBox.height / zoom,
30942
31129
  };
30943
31130
  break;
30944
31131
  }
@@ -31301,21 +31488,35 @@ const iosEnterAnimation$1 = (baseEl, opts) => {
31301
31488
  const { event: ev, size, trigger, reference, side, align } = opts;
31302
31489
  const doc = baseEl.ownerDocument;
31303
31490
  const isRTL = doc.dir === 'rtl';
31304
- const bodyWidth = doc.defaultView.innerWidth;
31305
- const bodyHeight = doc.defaultView.innerHeight;
31306
31491
  const root = getElementRoot(baseEl);
31307
31492
  const contentEl = root.querySelector('.popover-content');
31308
31493
  const arrowEl = root.querySelector('.popover-arrow');
31494
+ /**
31495
+ * A CSS `zoom` other than 1 on an ancestor (e.g. the `html` element) causes
31496
+ * geometry APIs like `getBoundingClientRect()` to report zoomed values while
31497
+ * inline `top`/`left`/`--width` styles are interpreted in the unzoomed layout
31498
+ * space. Normalize all rect-derived measurements by this factor so the
31499
+ * popover is positioned and sized correctly.
31500
+ */
31501
+ const zoom = getElementCSSZoom(contentEl);
31502
+ /**
31503
+ * `innerWidth`/`innerHeight` are not affected by CSS `zoom`, so they must be
31504
+ * scaled down to the same layout space as the normalized measurements above.
31505
+ * Otherwise the popover would be clamped against a viewport that is larger
31506
+ * than the space actually available to it.
31507
+ */
31508
+ const bodyWidth = doc.defaultView.innerWidth / zoom;
31509
+ const bodyHeight = doc.defaultView.innerHeight / zoom;
31309
31510
  const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
31310
- const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
31311
- const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl);
31511
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl, zoom);
31512
+ const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl, zoom);
31312
31513
  const defaultPosition = {
31313
31514
  top: bodyHeight / 2 - contentHeight / 2,
31314
31515
  left: bodyWidth / 2 - contentWidth / 2,
31315
31516
  originX: isRTL ? 'right' : 'left',
31316
31517
  originY: 'top',
31317
31518
  };
31318
- const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev);
31519
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev, zoom);
31319
31520
  const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
31320
31521
  const rawSafeArea = getSafeAreaInsets(doc);
31321
31522
  const safeArea = size === 'cover'
@@ -31437,19 +31638,33 @@ const mdEnterAnimation$1 = (baseEl, opts) => {
31437
31638
  const { event: ev, size, trigger, reference, side, align } = opts;
31438
31639
  const doc = baseEl.ownerDocument;
31439
31640
  const isRTL = doc.dir === 'rtl';
31440
- const bodyWidth = doc.defaultView.innerWidth;
31441
- const bodyHeight = doc.defaultView.innerHeight;
31442
31641
  const root = getElementRoot(baseEl);
31443
31642
  const contentEl = root.querySelector('.popover-content');
31643
+ /**
31644
+ * A CSS `zoom` other than 1 on an ancestor (e.g. the `html` element) causes
31645
+ * geometry APIs like `getBoundingClientRect()` to report zoomed values while
31646
+ * inline `top`/`left`/`--width` styles are interpreted in the unzoomed layout
31647
+ * space. Normalize all rect-derived measurements by this factor so the
31648
+ * popover is positioned and sized correctly.
31649
+ */
31650
+ const zoom = getElementCSSZoom(contentEl);
31651
+ /**
31652
+ * `innerWidth`/`innerHeight` are not affected by CSS `zoom`, so they must be
31653
+ * scaled down to the same layout space as the normalized measurements above.
31654
+ * Otherwise the popover would be clamped against a viewport that is larger
31655
+ * than the space actually available to it.
31656
+ */
31657
+ const bodyWidth = doc.defaultView.innerWidth / zoom;
31658
+ const bodyHeight = doc.defaultView.innerHeight / zoom;
31444
31659
  const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
31445
- const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
31660
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl, zoom);
31446
31661
  const defaultPosition = {
31447
31662
  top: bodyHeight / 2 - contentHeight / 2,
31448
31663
  left: bodyWidth / 2 - contentWidth / 2,
31449
31664
  originX: isRTL ? 'right' : 'left',
31450
31665
  originY: 'top',
31451
31666
  };
31452
- const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
31667
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev, zoom);
31453
31668
  const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
31454
31669
  // MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas).
31455
31670
  // This is needed for Android edge-to-edge (API 36+) where system bars overlap content.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ionic/core",
3
- "version": "9.0.4",
3
+ "version": "9.0.5-nightly.20260918",
4
4
  "description": "Base components for Ionic",
5
5
  "engines": {
6
6
  "node": ">= 16"
@@ -1,4 +0,0 @@
1
- /*!
2
- * (C) Ionic http://ionicframework.com - MIT License
3
- */
4
- import{m as a}from"./p-CMT0YmOj.js";const t=async t=>{const s=await a.get(t);return!(!s||!await s.isActive())};export{t as u}
@@ -1,4 +0,0 @@
1
- /*!
2
- * (C) Ionic http://ionicframework.com - MIT License
3
- */
4
- import{p as t,H as i,e,h as o,d as n,t as r}from"./p-CthoZqG1.js";import{c as a}from"./p-byZM6qHV.js";import{b as l}from"./p-2ta4uE9-.js";const s=t(class extends i{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.ionStyle=e(this,"ionStyle",7)}sizeChanged(){this.emitStyle()}connectedCallback(){this.emitStyle()}emitStyle(){const t=this.getSize();this.ionStyle.emit({[`title-${t}`]:!0})}getSize(){return void 0!==this.size?this.size:"default"}render(){const t=l(this),i=this.getSize();return o(n,{key:"c5f0b913ff0a22d9bf02da48a313a613c2ac8fe7",class:a(this.color,{[t]:!0,[`title-${i}`]:!0,"title-rtl":"rtl"===document.dir})},o("div",{key:"5253b9e39fb764bfe1e57370719139f8a83e9904",class:"toolbar-title"},o("slot",{key:"e38b1eccb0175c36f8cab211aee7ce4d61fc9035"})))}get el(){return this}static get watchers(){return{size:[{sizeChanged:0}]}}static get style(){return{ios:":host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}:host(.ion-color){color:var(--ion-color-base)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host{top:0;-webkit-padding-start:90px;padding-inline-start:90px;-webkit-padding-end:90px;padding-inline-end:90px;padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);position:absolute;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);font-size:min(1.0625rem, 20.4px);font-weight:600;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}:host{inset-inline-start:0}:host(.title-small){-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:6px;padding-bottom:16px;position:relative;font-size:min(0.8125rem, 23.4px);font-weight:normal}:host(.title-large){-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:2px;padding-bottom:4px;-webkit-transform-origin:left center;transform-origin:left center;position:static;-ms-flex-align:end;align-items:flex-end;min-width:100%;font-size:min(2.125rem, 61.2px);font-weight:700;text-align:start}:host(.title-large.title-rtl){-webkit-transform-origin:right center;transform-origin:right center}:host(.title-large.ion-cloned-element){--color:var(--ion-text-color, #000);font-family:var(--ion-font-family)}:host(.title-large) .toolbar-title{-webkit-transform-origin:inherit;transform-origin:inherit;width:auto}:host-context([dir=rtl]):host(.title-large) .toolbar-title,:host-context([dir=rtl]).title-large .toolbar-title{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}@supports selector(:dir(rtl)){:host(.title-large:dir(rtl)) .toolbar-title{-webkit-transform-origin:calc(100% - inherit);transform-origin:calc(100% - inherit)}}",md:":host{--color:initial;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);color:var(--color)}:host(.ion-color){color:var(--ion-color-base)}.toolbar-title{display:block;width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;pointer-events:auto}:host(.title-small) .toolbar-title{white-space:normal}:host{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:0;padding-bottom:0;font-size:1.25rem;font-weight:500;letter-spacing:0.0125em}:host(.title-small){width:100%;height:100%;font-size:0.9375rem;font-weight:normal}"}}},[289,"ion-title",{color:[513],size:[1]},void 0,{size:[{sizeChanged:0}]}]);function d(){"undefined"!=typeof customElements&&["ion-title"].forEach((t=>{"ion-title"===t&&(customElements.get(r(t))||customElements.define(r(t),s))}))}export{s as T,d}
@@ -1,4 +0,0 @@
1
- /*!
2
- * (C) Ionic http://ionicframework.com - MIT License
3
- */
4
- import{p as t,H as i,e,h as o,d as r,t as s}from"./p-CthoZqG1.js";import{e as n}from"./p-DEvF_E6y.js";import{c as a}from"./p-DJztqcrH.js";import{b as d}from"./p-2ta4uE9-.js";const l=t(class extends i{constructor(t){super(),!1!==t&&this.__registerHost(),this.ionChange=e(this,"ionChange",7),this.ionValueChange=e(this,"ionValueChange",7),this.inputId="ion-rg-"+h++,this.helperTextId=`${this.inputId}-helper-text`,this.errorTextId=`${this.inputId}-error-text`,this.labelId=`${this.inputId}-lbl`,this.isInvalid=!1,this.allowEmptySelection=!1,this.name=this.inputId,this.setRadioTabindex=t=>{const i=this.getRadios(),e=i.find((t=>!t.disabled)),o=i.find((i=>i.value===t&&!i.disabled));if(!e&&!o)return;const r=o||e;for(const t of i)t.setButtonTabindex(t===r?0:-1)},this.onClick=t=>{t.preventDefault();const i=t.target&&t.target.closest("ion-radio");if(i&&!i.disabled){const e=i.value;e!==this.value?(this.value=e,this.emitValueChange(t)):this.allowEmptySelection&&(this.value=void 0,this.emitValueChange(t))}}}valueChanged(t){this.setRadioTabindex(t),this.ionValueChange.emit({value:t})}componentDidLoad(){this.valueChanged(this.value)}async connectedCallback(){const t=this.el.querySelector("ion-list-header")||this.el.querySelector("ion-item-divider");if(t){const i=this.label=t.querySelector("ion-label");i&&(this.labelId=i.id=this.name+"-lbl")}"undefined"!=typeof MutationObserver&&(this.validationObserver=new MutationObserver((()=>{const t=a(this.el);this.isInvalid!==t&&(this.isInvalid=t,Promise.resolve().then((()=>{this.hintTextId=this.getHintTextId()})))})),this.validationObserver.observe(this.el,{attributes:!0,attributeFilter:["class"]})),this.isInvalid=a(this.el)}componentWillLoad(){this.hintTextId=this.getHintTextId()}disconnectedCallback(){this.validationObserver&&(this.validationObserver.disconnect(),this.validationObserver=void 0)}getRadios(){return Array.from(this.el.querySelectorAll("ion-radio"))}emitValueChange(t){const{value:i}=this;this.ionChange.emit({value:i,event:t})}onKeydown(t){const i=!!this.el.closest("ion-select-popover")||!!this.el.closest("ion-select-modal");if(t.target&&!this.el.contains(t.target))return;const e=this.getRadios().filter((t=>!t.disabled));if(t.target&&e.includes(t.target)){const o=e.findIndex((i=>i===t.target)),r=e[o];let s;if(["ArrowDown","ArrowRight"].includes(t.key)&&(s=o===e.length-1?e[0]:e[o+1]),["ArrowUp","ArrowLeft"].includes(t.key)&&(s=0===o?e[e.length-1]:e[o-1]),s&&e.includes(s)&&(s.setFocus(t),i||(this.value=s.value,this.emitValueChange(t))),[" "].includes(t.key)){const i=this.value;this.value=this.allowEmptySelection&&void 0!==this.value?void 0:r.value,(i!==this.value||this.allowEmptySelection)&&this.emitValueChange(t),t.preventDefault()}if("Enter"===t.key&&i&&!t.repeat){const i=this.value;this.value=r.value,i!==this.value&&this.emitValueChange(t),t.preventDefault()}}}async setFocus(){const t=this.getRadios().find((t=>-1!==t.tabIndex));t?.setFocus()}renderHintText(){const{helperText:t,errorText:i,helperTextId:e,errorTextId:r,isInvalid:s}=this;if(t||i)return o("div",{class:"radio-group-top"},o("div",{id:e,class:"helper-text","aria-live":"polite"},s?null:t),o("div",{id:r,class:"error-text",role:"alert"},s?i:null))}getHintTextId(){const{helperText:t,errorText:i,helperTextId:e,errorTextId:o,isInvalid:r}=this;return r&&i?o:t?e:void 0}render(){const{label:t,labelId:i,el:e,name:s,value:a}=this,l=d(this);return n(!0,e,s,a,!1),o(r,{key:"8d926a17e800adf0184274215c9689c96a8d6dfd",role:"radiogroup","aria-labelledby":t?i:null,"aria-describedby":this.hintTextId,"aria-invalid":this.isInvalid?"true":void 0,onClick:this.onClick,class:l},this.renderHintText(),o("slot",{key:"2ff891123d5971a581b70d0886d23a074358c2dc"}))}get el(){return this}static get watchers(){return{value:[{valueChanged:0}]}}static get style(){return{ios:"ion-radio-group{vertical-align:top}.radio-group-top{line-height:1.5}.radio-group-top .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.radio-group-top .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}.ion-touched.ion-invalid .radio-group-top .error-text{display:block}.ion-touched.ion-invalid .radio-group-top .helper-text{display:none}ion-list .radio-group-top{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px}",md:"ion-radio-group{vertical-align:top}.radio-group-top{line-height:1.5}.radio-group-top .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.radio-group-top .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}.ion-touched.ion-invalid .radio-group-top .error-text{display:block}.ion-touched.ion-invalid .radio-group-top .helper-text{display:none}ion-list .radio-group-top{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px}"}}},[292,"ion-radio-group",{allowEmptySelection:[4,"allow-empty-selection"],compareWith:[1,"compare-with"],name:[1],value:[1032],helperText:[1,"helper-text"],errorText:[1,"error-text"],isInvalid:[32],hintTextId:[32],setFocus:[64]},[[4,"keydown","onKeydown"]],{value:[{valueChanged:0}]}]);let h=0;function p(){"undefined"!=typeof customElements&&["ion-radio-group"].forEach((t=>{"ion-radio-group"===t&&(customElements.get(s(t))||customElements.define(s(t),l))}))}export{l as R,p as d}