voyager-ionic-core 8.8.17 → 9.0.3

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 (794) 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-1sJ0ZDPe.js +4 -0
  99. package/components/p-5ldEpNdG.js +4 -0
  100. package/components/p-6ZLn6K5e.js +4 -0
  101. package/components/p-B1_TL6RQ.js +4 -0
  102. package/components/p-B4lxwJ8N.js +4 -0
  103. package/components/{p-rCa2eL0j.js → p-BF48Oc0v.js} +1 -1
  104. package/components/p-BJr2B5hZ.js +4 -0
  105. package/components/p-BMPN55of.js +4 -0
  106. package/components/{p-ChIZKXUu.js → p-BQyuFxYc.js} +1 -1
  107. package/components/p-BSQPZ79H.js +4 -0
  108. package/components/p-BT9-hMMz.js +4 -0
  109. package/components/p-BU8a2IhR.js +4 -0
  110. package/components/p-BW_SlU2D.js +4 -0
  111. package/components/p-BWoa-cki.js +4 -0
  112. package/components/p-BYJRZKHa.js +4 -0
  113. package/components/p-B_gJaBk0.js +4 -0
  114. package/components/p-BgkOsq-d.js +4 -0
  115. package/components/p-BhamHSw3.js +4 -0
  116. package/components/p-Bi-it1EH.js +4 -0
  117. package/components/p-C-NbvXu4.js +4 -0
  118. package/components/p-C09TXohi.js +4 -0
  119. package/components/p-C4VpVfrJ.js +4 -0
  120. package/components/p-C8Ck7_Eo.js +4 -0
  121. package/components/p-CEW4RXZO.js +4 -0
  122. package/components/p-CG_zZq_I.js +4 -0
  123. package/components/{p-B9jFTlwE.js → p-CJgnoKcN.js} +1 -1
  124. package/components/p-CMRYD_yR.js +4 -0
  125. package/components/{p-BMI53wYL.js → p-CNLioZ3B.js} +1 -1
  126. package/components/{p--JUspHvy.js → p-COO0eJOA.js} +1 -1
  127. package/components/p-CWAks_S_.js +4 -0
  128. package/{dist/ionic/p-KjNvRoEp.js → components/p-Cd1WaN-0.js} +1 -1
  129. package/components/p-CqbGBmqb.js +4 -0
  130. package/components/p-CrAKlX71.js +4 -0
  131. package/components/p-Ctop2IWW.js +4 -0
  132. package/components/p-Cw6WocLJ.js +4 -0
  133. package/components/p-D0YpjgON.js +4 -0
  134. package/components/{p-DJZp0KTQ.js → p-D5w_FlVa.js} +1 -1
  135. package/components/p-D7-vHX0A.js +4 -0
  136. package/components/p-D7wDJdFn.js +4 -0
  137. package/components/p-DFLJvuRK.js +4 -0
  138. package/components/p-DL13ieTa.js +4 -0
  139. package/components/{p-DqLB8yFQ.js → p-DM1gJSMP.js} +1 -1
  140. package/components/p-DMBiAyOR.js +4 -0
  141. package/components/p-DWCzVL3Y.js +4 -0
  142. package/components/p-DZRZic9C.js +4 -0
  143. package/components/{p-C_hpsif8.js → p-DhNuxvJH.js} +1 -1
  144. package/components/p-DiuOa1vw.js +4 -0
  145. package/components/p-Djmz-ssp.js +4 -0
  146. package/components/p-DnBNYc7u.js +4 -0
  147. package/components/p-Dojwmvde.js +4 -0
  148. package/components/p-DwSXbQSz.js +4 -0
  149. package/components/p-DxhHlJln.js +4 -0
  150. package/components/p-Fl7ZFU74.js +4 -0
  151. package/components/{p-DqZAXv2t.js → p-GGbIHyEF.js} +1 -1
  152. package/components/{p-j5IxBIan.js → p-Hp8t4RMX.js} +1 -1
  153. package/components/p-M34T2gyX.js +4 -0
  154. package/components/p-TWw4e4sO.js +4 -0
  155. package/components/{p-Cfx4M1Bn.js → p-YjMkHuvH.js} +1 -1
  156. package/components/p-byZM6qHV.js +4 -0
  157. package/components/p-cEN43Ahr.js +4 -0
  158. package/components/p-qAXsfUff.js +4 -0
  159. package/dist/cjs/{animation-BJq0kcy2.js → animation-Kd1N7WTN.js} +4 -4
  160. package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-b1G4t26O.js} +1 -1
  161. package/dist/cjs/{button-active-0mPOKmV2.js → button-active-CQCFubJJ.js} +3 -3
  162. package/dist/cjs/config-CjUbvdPW.js +36 -0
  163. package/dist/cjs/dir-zwDPRE5K.js +30 -0
  164. package/dist/cjs/{format-PxvGiOik.js → format-bHU8N1g5.js} +40 -30
  165. package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-d-fWfeI6.js} +5 -7
  166. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-CeJslptU.js} +1 -2
  167. package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
  168. package/dist/cjs/{hardware-back-button-iUuF_76h.js → hardware-back-button-Bu4Dzw8l.js} +4 -4
  169. package/dist/cjs/{helpers-Cv23MFHM.js → helpers-7wzdhdeg.js} +15 -11
  170. package/dist/cjs/{index-D81eLYUM.js → index-C74Q3t6a.js} +3 -2
  171. package/dist/cjs/{index-BERfRao3.js → index-CQfEIyLK.js} +5 -5
  172. package/dist/cjs/{index-aC4x3Fk3.js → index-DFNrCX7M.js} +6 -7
  173. package/dist/cjs/{index-CAvQ7Tka.js → index-DRPqwSvU.js} +13 -30
  174. package/dist/cjs/{index-Ct7gcRif.js → index-DXoo08JC.js} +321 -26
  175. package/dist/cjs/{index-CIrkNXqJ.js → index-DtvKGwdh.js} +34 -2
  176. package/dist/cjs/index-KiSZqhYS.js +431 -0
  177. package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
  178. package/dist/cjs/index.cjs.js +19 -18
  179. package/dist/cjs/{input-shims-CFLg7uzj.js → input-shims-VJIiKBKv.js} +10 -11
  180. package/dist/cjs/input.utils-EHVE2RK_.js +35 -0
  181. package/dist/cjs/ion-accordion_2.cjs.entry.js +12 -12
  182. package/dist/cjs/ion-action-sheet.cjs.entry.js +92 -44
  183. package/dist/cjs/ion-alert.cjs.entry.js +144 -65
  184. package/dist/cjs/ion-app_8.cjs.entry.js +112 -40
  185. package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
  186. package/dist/cjs/ion-back-button.cjs.entry.js +6 -5
  187. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  188. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +8 -7
  189. package/dist/cjs/ion-button_2.cjs.entry.js +12 -8
  190. package/dist/cjs/ion-card_5.cjs.entry.js +6 -5
  191. package/dist/cjs/ion-checkbox.cjs.entry.js +10 -7
  192. package/dist/cjs/ion-chip.cjs.entry.js +3 -3
  193. package/dist/cjs/ion-col_3.cjs.entry.js +10 -6
  194. package/dist/cjs/ion-datetime-button.cjs.entry.js +22 -25
  195. package/dist/cjs/{ion-datetime_3.cjs.entry.js → ion-datetime.cjs.entry.js} +182 -746
  196. package/dist/cjs/ion-fab_3.cjs.entry.js +7 -6
  197. package/dist/cjs/ion-img.cjs.entry.js +7 -4
  198. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +8 -6
  199. package/dist/cjs/ion-input-otp.cjs.entry.js +20 -29
  200. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +9 -10
  201. package/dist/cjs/ion-input.cjs.entry.js +58 -70
  202. package/dist/cjs/ion-item-option_3.cjs.entry.js +21 -24
  203. package/dist/cjs/ion-item_8.cjs.entry.js +38 -34
  204. package/dist/cjs/ion-loading.cjs.entry.js +29 -15
  205. package/dist/cjs/ion-menu_3.cjs.entry.js +23 -24
  206. package/dist/cjs/ion-modal.cjs.entry.js +283 -161
  207. package/dist/cjs/ion-nav_2.cjs.entry.js +30 -138
  208. package/dist/cjs/ion-picker-column-option.cjs.entry.js +8 -13
  209. package/dist/cjs/ion-picker-column.cjs.entry.js +218 -62
  210. package/dist/cjs/ion-picker.cjs.entry.js +4 -4
  211. package/dist/cjs/ion-popover.cjs.entry.js +50 -30
  212. package/dist/cjs/ion-progress-bar.cjs.entry.js +6 -5
  213. package/dist/cjs/ion-radio_2.cjs.entry.js +12 -11
  214. package/dist/cjs/ion-range.cjs.entry.js +30 -25
  215. package/dist/cjs/ion-refresher_2.cjs.entry.js +34 -26
  216. package/dist/cjs/ion-reorder_2.cjs.entry.js +10 -9
  217. package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
  218. package/dist/cjs/ion-route_4.cjs.entry.js +36 -30
  219. package/dist/cjs/ion-searchbar.cjs.entry.js +27 -22
  220. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  221. package/dist/cjs/ion-segment-view.cjs.entry.js +5 -6
  222. package/dist/cjs/ion-segment_2.cjs.entry.js +30 -26
  223. package/dist/cjs/ion-select-modal.cjs.entry.js +93 -38
  224. package/dist/cjs/ion-select_3.cjs.entry.js +495 -126
  225. package/dist/cjs/ion-spinner.cjs.entry.js +5 -6
  226. package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
  227. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +15 -12
  228. package/dist/cjs/ion-tab_2.cjs.entry.js +8 -8
  229. package/dist/cjs/ion-text.cjs.entry.js +5 -5
  230. package/dist/cjs/ion-textarea.cjs.entry.js +56 -65
  231. package/dist/cjs/ion-toast.cjs.entry.js +26 -21
  232. package/dist/cjs/ion-toggle.cjs.entry.js +15 -13
  233. package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-CYJNT-2P.js} +13 -8
  234. package/dist/cjs/ionic.cjs.js +5 -5
  235. package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-DYGiD6gM.js} +14 -17
  236. package/dist/cjs/{item-multiple-inputs-D-gyg57c.js → item-multiple-inputs-Dv6qrMhm.js} +1 -1
  237. package/dist/cjs/{keyboard-hHzlEQpk.js → keyboard-Cix5TVkD.js} +2 -2
  238. package/dist/cjs/{keyboard-UuAS4D_9.js → keyboard-cHxZlTyz.js} +2 -2
  239. package/dist/cjs/{keyboard-controller-GXBiBRKS.js → keyboard-controller-PtZoN2GS.js} +6 -6
  240. package/dist/cjs/loader.cjs.js +4 -4
  241. package/dist/cjs/{md.transition-B8-wBZqt.js → md.transition-CrSkaoz6.js} +8 -8
  242. package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
  243. package/dist/cjs/{overlays-DdtIYQUH.js → overlays-BR21NUIG.js} +98 -58
  244. package/dist/cjs/select-option-render-D8ZEjYji.js +123 -0
  245. package/dist/cjs/slot-mutation-controller-D6IjSEIh.js +397 -0
  246. package/dist/cjs/{status-tap-BXX8H8_Y.js → status-tap-CNP5eD1R.js} +4 -3
  247. package/dist/cjs/{swipe-back-CCMaNiP2.js → swipe-back-CSIJQfu5.js} +5 -5
  248. package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
  249. package/dist/collection/collection-manifest.json +7 -11
  250. package/dist/collection/components/accordion/accordion.js +5 -6
  251. package/dist/collection/components/accordion-group/accordion-group.js +2 -2
  252. package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
  253. package/dist/collection/components/action-sheet/action-sheet.js +77 -31
  254. package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
  255. package/dist/collection/components/alert/alert.ios.css +279 -10
  256. package/dist/collection/components/alert/alert.js +127 -50
  257. package/dist/collection/components/alert/alert.md.css +268 -20
  258. package/dist/collection/components/breadcrumb/breadcrumb.js +1 -1
  259. package/dist/collection/components/breadcrumbs/breadcrumbs.js +1 -1
  260. package/dist/collection/components/button/button.js +5 -2
  261. package/dist/collection/components/card/card.js +1 -1
  262. package/dist/collection/components/checkbox/checkbox.js +4 -2
  263. package/dist/collection/components/col/col.js +7 -3
  264. package/dist/collection/components/content/content.js +56 -6
  265. package/dist/collection/components/datetime/datetime.ios.css +42 -2
  266. package/dist/collection/components/datetime/datetime.js +146 -77
  267. package/dist/collection/components/datetime/datetime.md.css +42 -1
  268. package/dist/collection/components/datetime/utils/data.js +13 -14
  269. package/dist/collection/components/datetime/utils/format.js +21 -11
  270. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  271. package/dist/collection/components/datetime/utils/parse.js +10 -10
  272. package/dist/collection/components/datetime/utils/state.js +8 -2
  273. package/dist/collection/components/datetime/utils/validate.js +4 -5
  274. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
  275. package/dist/collection/components/datetime-button/datetime-button.js +15 -20
  276. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
  277. package/dist/collection/components/fab-button/fab-button.js +1 -1
  278. package/dist/collection/components/footer/footer.js +1 -1
  279. package/dist/collection/components/header/header.js +2 -2
  280. package/dist/collection/components/img/img.js +6 -1
  281. package/dist/collection/components/input/input.ios.css +57 -26
  282. package/dist/collection/components/input/input.js +51 -64
  283. package/dist/collection/components/input/input.md.css +79 -43
  284. package/dist/collection/components/input-otp/input-otp.js +15 -24
  285. package/dist/collection/components/input-password-toggle/input-password-toggle.js +5 -6
  286. package/dist/collection/components/item/item.js +19 -16
  287. package/dist/collection/components/item-divider/item-divider.js +2 -2
  288. package/dist/collection/components/item-group/item-group.js +1 -1
  289. package/dist/collection/components/item-option/item-option.js +2 -2
  290. package/dist/collection/components/item-options/item-options.js +1 -1
  291. package/dist/collection/components/item-sliding/item-sliding.js +12 -16
  292. package/dist/collection/components/label/label.js +2 -2
  293. package/dist/collection/components/list/list.js +2 -2
  294. package/dist/collection/components/list-header/list-header.js +2 -2
  295. package/dist/collection/components/loading/loading.js +17 -5
  296. package/dist/collection/components/menu/menu.js +6 -8
  297. package/dist/collection/components/menu-button/menu-button.js +2 -2
  298. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  299. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  300. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  301. package/dist/collection/components/modal/gestures/sheet.js +42 -34
  302. package/dist/collection/components/modal/gestures/swipe-to-close.js +18 -35
  303. package/dist/collection/components/modal/gestures/utils.js +17 -0
  304. package/dist/collection/components/modal/modal.js +146 -65
  305. package/dist/collection/components/modal/safe-area-utils.js +39 -5
  306. package/dist/collection/components/nav/nav.js +24 -235
  307. package/dist/collection/components/nav-link/nav-link.js +1 -1
  308. package/dist/collection/components/note/note.js +2 -2
  309. package/dist/collection/components/picker/picker.js +1 -2
  310. package/dist/collection/components/picker-column/picker-column.css +3 -0
  311. package/dist/collection/components/picker-column/picker-column.js +212 -58
  312. package/dist/collection/components/picker-column-option/picker-column-option.js +3 -10
  313. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
  314. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  315. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  316. package/dist/collection/components/popover/popover.ios.css +15 -0
  317. package/dist/collection/components/popover/popover.js +32 -9
  318. package/dist/collection/components/popover/popover.md.css +15 -0
  319. package/dist/collection/components/popover/utils.js +4 -6
  320. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  321. package/dist/collection/components/radio/radio.js +5 -5
  322. package/dist/collection/components/radio-group/radio-group.js +2 -2
  323. package/dist/collection/components/range/range.js +24 -19
  324. package/dist/collection/components/refresher/refresher.js +19 -13
  325. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  326. package/dist/collection/components/reorder/reorder.js +1 -1
  327. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  328. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  329. package/dist/collection/components/route/route.js +1 -1
  330. package/dist/collection/components/router/router.js +2 -6
  331. package/dist/collection/components/router/utils/dom.js +25 -7
  332. package/dist/collection/components/router/utils/matching.js +6 -9
  333. package/dist/collection/components/router/utils/parser.js +1 -1
  334. package/dist/collection/components/router/utils/path.js +0 -1
  335. package/dist/collection/components/router-link/router-link.js +2 -2
  336. package/dist/collection/components/router-outlet/router-outlet.js +49 -10
  337. package/dist/collection/components/row/row.js +1 -1
  338. package/dist/collection/components/searchbar/searchbar.js +25 -20
  339. package/dist/collection/components/segment/segment.js +9 -11
  340. package/dist/collection/components/segment-button/segment-button.js +15 -9
  341. package/dist/collection/components/segment-content/segment-content.js +1 -1
  342. package/dist/collection/components/segment-view/segment-view.js +3 -4
  343. package/dist/collection/components/select/select.ios.css +96 -69
  344. package/dist/collection/components/select/select.js +405 -92
  345. package/dist/collection/components/select/select.md.css +118 -85
  346. package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
  347. package/dist/collection/components/select-modal/select-modal.js +80 -27
  348. package/dist/collection/components/select-modal/select-modal.md.css +164 -0
  349. package/dist/collection/components/select-option/select-option.js +67 -3
  350. package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
  351. package/dist/collection/components/select-popover/select-popover.js +78 -26
  352. package/dist/collection/components/select-popover/select-popover.md.css +164 -0
  353. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  354. package/dist/collection/components/spinner/spinner.js +2 -3
  355. package/dist/collection/components/split-pane/split-pane.js +2 -2
  356. package/dist/collection/components/tab/tab.js +2 -2
  357. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  358. package/dist/collection/components/tab-button/tab-button.js +6 -4
  359. package/dist/collection/components/tabs/tabs.js +2 -3
  360. package/dist/collection/components/text/text.js +2 -2
  361. package/dist/collection/components/textarea/textarea.ios.css +94 -62
  362. package/dist/collection/components/textarea/textarea.js +47 -57
  363. package/dist/collection/components/textarea/textarea.md.css +103 -77
  364. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  365. package/dist/collection/components/title/title.js +2 -2
  366. package/dist/collection/components/toast/toast.js +12 -9
  367. package/dist/collection/components/toggle/toggle.js +6 -4
  368. package/dist/collection/components/toolbar/toolbar.js +7 -4
  369. package/dist/collection/global/config.js +3 -3
  370. package/dist/collection/global/ionic-global.js +8 -2
  371. package/dist/collection/index.js +1 -1
  372. package/dist/collection/utils/animation/animation.js +3 -3
  373. package/dist/collection/utils/config.js +5 -4
  374. package/dist/collection/utils/content/index.js +30 -0
  375. package/dist/collection/utils/focus-controller/index.js +1 -1
  376. package/dist/collection/utils/focus-trap.js +3 -3
  377. package/dist/collection/utils/forms/index.js +1 -0
  378. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  379. package/dist/collection/utils/framework-delegate.js +4 -6
  380. package/dist/collection/utils/gesture/gesture-controller.js +1 -2
  381. package/dist/collection/utils/gesture/index.js +10 -2
  382. package/dist/collection/utils/gesture/listener.js +4 -27
  383. package/dist/collection/utils/hardware-back-button.js +3 -3
  384. package/dist/collection/utils/helpers.js +14 -10
  385. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  386. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  387. package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
  388. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  389. package/dist/collection/utils/logging/index.js +23 -4
  390. package/dist/collection/utils/menu-controller/index.js +1 -2
  391. package/dist/collection/utils/native/haptic.js +2 -3
  392. package/dist/collection/utils/native/keyboard.js +2 -2
  393. package/dist/collection/utils/native/status-bar.js +1 -1
  394. package/dist/collection/utils/overlay-control-label.js +45 -0
  395. package/dist/collection/utils/overlays.js +87 -48
  396. package/dist/collection/utils/platform.js +4 -5
  397. package/dist/collection/utils/rtl/dir.js +17 -7
  398. package/dist/collection/utils/sanitization/index.js +283 -26
  399. package/dist/collection/utils/select-option-render.js +118 -0
  400. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  401. package/dist/collection/utils/test/late-props/late-props.js +69 -0
  402. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  403. package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
  404. package/dist/collection/utils/test/playwright/drag-element.js +2 -3
  405. package/dist/collection/utils/test/playwright/generator.js +3 -4
  406. package/dist/collection/utils/test/playwright/index.js +1 -0
  407. package/dist/collection/utils/test/playwright/page/event-spy.js +2 -4
  408. package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
  409. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  410. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  411. package/dist/collection/utils/test/press-keys.js +6 -16
  412. package/dist/collection/utils/theme.js +6 -1
  413. package/dist/collection/utils/transition/ios.transition.js +9 -13
  414. package/dist/collection/utils/transition/md.transition.js +3 -4
  415. package/dist/docs.json +933 -1402
  416. package/dist/esm/{animation-DLJpuoEz.js → animation-BFNVlYum.js} +4 -4
  417. package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-BgX0BGL1.js} +1 -1
  418. package/dist/esm/{button-active-BSpTQmS9.js → button-active-BfOvDr3b.js} +3 -3
  419. package/dist/esm/config-DWCzVL3Y.js +32 -0
  420. package/dist/esm/dir-Dojwmvde.js +28 -0
  421. package/dist/esm/{format-CAmvpAez.js → format-DDFE9jM5.js} +41 -31
  422. package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BwNhx9NR.js} +5 -7
  423. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-B_gJaBk0.js} +1 -2
  424. package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
  425. package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-DmkiRgOT.js} +4 -4
  426. package/dist/esm/{helpers-HEqiOzXb.js → helpers-BSmc0nst.js} +15 -11
  427. package/dist/esm/{index-CfgBF1SE.js → index-BmLuEdV7.js} +13 -30
  428. package/dist/esm/{index-Q6UPU0Ay.js → index-BuPaALjU.js} +6 -7
  429. package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
  430. package/dist/esm/{index-MEDq2S8l.js → index-C1b9CLFg.js} +33 -3
  431. package/dist/esm/{index-tcQvqkiX.js → index-C23AVPx9.js} +303 -26
  432. package/dist/esm/{index-BRHzoo00.js → index-CJln0gS3.js} +3 -2
  433. package/dist/esm/index-D76bbuoi.js +425 -0
  434. package/dist/esm/{index-B_dQk_WE.js → index-DnA_7Bnx.js} +5 -5
  435. package/dist/esm/index.js +17 -15
  436. package/dist/esm/{input-shims-D10mwcw1.js → input-shims-Dqk-Ou25.js} +10 -11
  437. package/dist/esm/input.utils-rqoH22pW.js +33 -0
  438. package/dist/esm/ion-accordion_2.entry.js +12 -12
  439. package/dist/esm/ion-action-sheet.entry.js +92 -44
  440. package/dist/esm/ion-alert.entry.js +143 -64
  441. package/dist/esm/ion-app_8.entry.js +112 -40
  442. package/dist/esm/ion-avatar_3.entry.js +4 -4
  443. package/dist/esm/ion-back-button.entry.js +6 -5
  444. package/dist/esm/ion-backdrop.entry.js +2 -2
  445. package/dist/esm/ion-breadcrumb_2.entry.js +8 -7
  446. package/dist/esm/ion-button_2.entry.js +12 -8
  447. package/dist/esm/ion-card_5.entry.js +6 -5
  448. package/dist/esm/ion-checkbox.entry.js +10 -7
  449. package/dist/esm/ion-chip.entry.js +3 -3
  450. package/dist/esm/ion-col_3.entry.js +10 -6
  451. package/dist/esm/ion-datetime-button.entry.js +22 -25
  452. package/dist/esm/{ion-datetime_3.entry.js → ion-datetime.entry.js} +183 -745
  453. package/dist/esm/ion-fab_3.entry.js +7 -6
  454. package/dist/esm/ion-img.entry.js +7 -4
  455. package/dist/esm/ion-infinite-scroll_2.entry.js +7 -5
  456. package/dist/esm/ion-input-otp.entry.js +20 -29
  457. package/dist/esm/ion-input-password-toggle.entry.js +9 -10
  458. package/dist/esm/ion-input.entry.js +56 -68
  459. package/dist/esm/ion-item-option_3.entry.js +21 -24
  460. package/dist/esm/ion-item_8.entry.js +38 -34
  461. package/dist/esm/ion-loading.entry.js +28 -14
  462. package/dist/esm/ion-menu_3.entry.js +23 -24
  463. package/dist/esm/ion-modal.entry.js +271 -149
  464. package/dist/esm/ion-nav_2.entry.js +30 -138
  465. package/dist/esm/ion-picker-column-option.entry.js +8 -13
  466. package/dist/esm/ion-picker-column.entry.js +218 -62
  467. package/dist/esm/ion-picker.entry.js +4 -4
  468. package/dist/esm/ion-popover.entry.js +50 -30
  469. package/dist/esm/ion-progress-bar.entry.js +6 -5
  470. package/dist/esm/ion-radio_2.entry.js +12 -11
  471. package/dist/esm/ion-range.entry.js +30 -25
  472. package/dist/esm/ion-refresher_2.entry.js +32 -24
  473. package/dist/esm/ion-reorder_2.entry.js +10 -9
  474. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  475. package/dist/esm/ion-route_4.entry.js +36 -30
  476. package/dist/esm/ion-searchbar.entry.js +27 -22
  477. package/dist/esm/ion-segment-content.entry.js +2 -2
  478. package/dist/esm/ion-segment-view.entry.js +5 -6
  479. package/dist/esm/ion-segment_2.entry.js +30 -26
  480. package/dist/esm/ion-select-modal.entry.js +93 -38
  481. package/dist/esm/ion-select_3.entry.js +495 -126
  482. package/dist/esm/ion-spinner.entry.js +5 -6
  483. package/dist/esm/ion-split-pane.entry.js +4 -4
  484. package/dist/esm/ion-tab-bar_2.entry.js +15 -12
  485. package/dist/esm/ion-tab_2.entry.js +8 -8
  486. package/dist/esm/ion-text.entry.js +5 -5
  487. package/dist/esm/ion-textarea.entry.js +55 -64
  488. package/dist/esm/ion-toast.entry.js +25 -20
  489. package/dist/esm/ion-toggle.entry.js +15 -13
  490. package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-ZXjCXKH0.js} +13 -8
  491. package/dist/esm/ionic.js +6 -6
  492. package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-CWAgfQ1r.js} +14 -17
  493. package/dist/esm/{item-multiple-inputs-DlNuqNJm.js → item-multiple-inputs-DZnIiOO_.js} +1 -1
  494. package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
  495. package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
  496. package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
  497. package/dist/esm/loader.js +5 -5
  498. package/dist/esm/{md.transition-D0msQmzI.js → md.transition-ZuqDDdDW.js} +8 -8
  499. package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
  500. package/dist/esm/{overlays-Dg0q2_tJ.js → overlays-DKE0DgvE.js} +97 -58
  501. package/dist/esm/select-option-render-CRP_teb1.js +121 -0
  502. package/dist/esm/slot-mutation-controller-B5NpUZ-N.js +393 -0
  503. package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-Cv9gb3ja.js} +4 -3
  504. package/dist/esm/{swipe-back-ZUWwA-KF.js → swipe-back-De5HlmeM.js} +5 -5
  505. package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
  506. package/dist/html.html-data.json +54 -82
  507. package/dist/ionic/index.esm.js +1 -1
  508. package/dist/ionic/ionic.esm.js +1 -1
  509. package/dist/ionic/p-099b7f9f.entry.js +4 -0
  510. package/dist/ionic/p-0dcb7bb6.entry.js +4 -0
  511. package/dist/ionic/p-1347880c.entry.js +4 -0
  512. package/dist/ionic/p-191a651e.entry.js +4 -0
  513. package/dist/ionic/p-1f24cb24.entry.js +4 -0
  514. package/dist/ionic/p-271c3640.entry.js +4 -0
  515. package/dist/ionic/p-2ea4bb36.entry.js +4 -0
  516. package/dist/ionic/p-338a02e0.entry.js +4 -0
  517. package/dist/ionic/p-38b9375b.entry.js +4 -0
  518. package/dist/ionic/p-3bba83ee.entry.js +4 -0
  519. package/dist/ionic/p-3e01c744.entry.js +4 -0
  520. package/dist/ionic/p-458715a9.entry.js +4 -0
  521. package/dist/ionic/p-4712a8a9.entry.js +4 -0
  522. package/dist/ionic/p-4c3e50f8.entry.js +4 -0
  523. package/dist/ionic/p-54cbb0a7.entry.js +4 -0
  524. package/dist/ionic/{p-2bb2cb18.entry.js → p-561af487.entry.js} +1 -1
  525. package/dist/ionic/p-5906ea6f.entry.js +4 -0
  526. package/dist/ionic/p-5cc09b40.entry.js +4 -0
  527. package/dist/ionic/p-5d9094ac.entry.js +4 -0
  528. package/dist/ionic/p-612ea3b1.entry.js +4 -0
  529. package/dist/ionic/p-68cc89a6.entry.js +4 -0
  530. package/dist/ionic/{p-dfa8d673.entry.js → p-6e386853.entry.js} +1 -1
  531. package/dist/ionic/p-77c96e08.entry.js +4 -0
  532. package/dist/ionic/p-7bfeccb3.entry.js +4 -0
  533. package/dist/ionic/p-7e394cc3.entry.js +4 -0
  534. package/dist/ionic/{p-0fa9c382.entry.js → p-7fbb3319.entry.js} +1 -1
  535. package/dist/ionic/p-803059b6.entry.js +4 -0
  536. package/dist/ionic/p-837db1b9.entry.js +4 -0
  537. package/dist/ionic/p-85599fe3.entry.js +4 -0
  538. package/dist/ionic/p-8b80d9f9.entry.js +4 -0
  539. package/dist/ionic/p-90f50a65.entry.js +4 -0
  540. package/dist/ionic/p-9595e305.entry.js +4 -0
  541. package/dist/ionic/p-9c5f2691.entry.js +4 -0
  542. package/dist/ionic/p-9ee9c5b6.entry.js +4 -0
  543. package/dist/ionic/p-BMPN55of.js +4 -0
  544. package/dist/ionic/p-BMiZX1LT.js +4 -0
  545. package/dist/ionic/p-BSQPZ79H.js +4 -0
  546. package/dist/ionic/p-BY6BzzPF.js +4 -0
  547. package/dist/ionic/p-B_gJaBk0.js +4 -0
  548. package/dist/ionic/p-BaeKWZ-a.js +4 -0
  549. package/dist/ionic/p-Bd72UYI2.js +4 -0
  550. package/dist/ionic/p-BgOvhHy_.js +4 -0
  551. package/dist/ionic/p-BhamHSw3.js +4 -0
  552. package/dist/ionic/p-BijjLYjT.js +4 -0
  553. package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
  554. package/dist/ionic/p-C23AVPx9.js +6 -0
  555. package/dist/ionic/p-C8XilMh0.js +4 -0
  556. package/dist/ionic/p-CER8qW8Y.js +4 -0
  557. package/dist/ionic/p-CFuOr1Tu.js +4 -0
  558. package/dist/ionic/p-CM5OBjTW.js +4 -0
  559. package/dist/ionic/p-CMZYmFb4.js +4 -0
  560. package/dist/ionic/p-CkxVYPtX.js +4 -0
  561. package/dist/ionic/p-CmXuiRT6.js +4 -0
  562. package/dist/ionic/p-D0YpjgON.js +4 -0
  563. package/dist/ionic/p-D5t_-oMk.js +4 -0
  564. package/dist/ionic/p-D6rHcCvc.js +4 -0
  565. package/dist/ionic/p-D7jHfs0Y.js +4 -0
  566. package/dist/ionic/p-DLM95R4x.js +4 -0
  567. package/dist/ionic/p-DTxBioUO.js +4 -0
  568. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  569. package/dist/ionic/p-DYUjHcuH.js +4 -0
  570. package/{components/p-BkKAANMJ.js → dist/ionic/p-DZ6Hmc-8.js} +1 -1
  571. package/dist/ionic/p-D_gb-kdd.js +4 -0
  572. package/dist/ionic/p-DajLgJ4d.js +4 -0
  573. package/dist/ionic/p-Do3zTvCA.js +4 -0
  574. package/dist/ionic/p-Dojwmvde.js +4 -0
  575. package/dist/ionic/p-T71k3C35.js +4 -0
  576. package/dist/ionic/p-a8df96c8.entry.js +4 -0
  577. package/dist/ionic/p-a8ff2489.entry.js +4 -0
  578. package/dist/ionic/p-aff52029.entry.js +4 -0
  579. package/dist/ionic/p-b3532b8d.entry.js +4 -0
  580. package/dist/ionic/p-b9b4e85d.entry.js +4 -0
  581. package/dist/ionic/p-byZM6qHV.js +4 -0
  582. package/dist/ionic/{p-c6e49f3f.entry.js → p-ca1b8865.entry.js} +1 -1
  583. package/dist/ionic/p-cc4320d3.entry.js +4 -0
  584. package/dist/ionic/p-d526798a.entry.js +4 -0
  585. package/dist/ionic/p-d6755739.entry.js +4 -0
  586. package/dist/ionic/p-d8c138d9.entry.js +4 -0
  587. package/dist/ionic/p-db449915.entry.js +4 -0
  588. package/dist/ionic/p-dd01be0a.entry.js +4 -0
  589. package/dist/ionic/p-ec00fd0d.entry.js +4 -0
  590. package/dist/ionic/p-ee09ac9d.entry.js +4 -0
  591. package/dist/ionic/{p-37e720da.entry.js → p-efc0cf82.entry.js} +1 -1
  592. package/dist/ionic/p-f0fb23c1.entry.js +4 -0
  593. package/dist/ionic/p-f83b3e0c.entry.js +4 -0
  594. package/dist/ionic/p-fa50d493.entry.js +4 -0
  595. package/dist/ionic/p-zWf7R2xV.js +4 -0
  596. package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
  597. package/dist/types/components/alert/alert.d.ts +7 -0
  598. package/dist/types/components/content/content.d.ts +12 -0
  599. package/dist/types/components/datetime/datetime.d.ts +5 -1
  600. package/dist/types/components/img/img.d.ts +2 -0
  601. package/dist/types/components/input/input.d.ts +12 -6
  602. package/dist/types/components/modal/gestures/sheet.d.ts +1 -0
  603. package/dist/types/components/modal/gestures/utils.d.ts +11 -0
  604. package/dist/types/components/modal/modal-interface.d.ts +9 -0
  605. package/dist/types/components/modal/modal.d.ts +25 -7
  606. package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
  607. package/dist/types/components/nav/nav-interface.d.ts +0 -1
  608. package/dist/types/components/nav/nav.d.ts +2 -22
  609. package/dist/types/components/picker-column/picker-column.d.ts +42 -0
  610. package/dist/types/components/range/range.d.ts +4 -1
  611. package/dist/types/components/refresher/refresher.d.ts +7 -0
  612. package/dist/types/components/route/route.d.ts +1 -1
  613. package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
  614. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  615. package/dist/types/components/select/select-interface.d.ts +31 -0
  616. package/dist/types/components/select/select.d.ts +30 -6
  617. package/dist/types/components/select-option/select-option.d.ts +42 -1
  618. package/dist/types/components/textarea/textarea.d.ts +12 -5
  619. package/dist/types/components.d.ts +79 -316
  620. package/dist/types/index.d.ts +1 -1
  621. package/dist/types/interface.d.ts +0 -1
  622. package/dist/types/stencil-public-runtime.d.ts +12 -0
  623. package/dist/types/utils/config.d.ts +1 -8
  624. package/dist/types/utils/content/index.d.ts +12 -0
  625. package/dist/types/utils/forms/index.d.ts +1 -0
  626. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  627. package/dist/types/utils/helpers.d.ts +8 -5
  628. package/dist/types/utils/logging/index.d.ts +2 -1
  629. package/dist/types/utils/overlay-control-label.d.ts +32 -0
  630. package/dist/types/utils/overlays.d.ts +20 -9
  631. package/dist/types/utils/rtl/dir.d.ts +10 -4
  632. package/dist/types/utils/sanitization/index.d.ts +58 -2
  633. package/dist/types/utils/select-option-render.d.ts +53 -0
  634. package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
  635. package/dist/types/utils/test/playwright/index.d.ts +1 -0
  636. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  637. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  638. package/hydrate/index.js +2998 -2155
  639. package/hydrate/index.mjs +2998 -2155
  640. package/loader/index.d.ts +1 -1
  641. package/package.json +58 -14
  642. package/components/ion-picker-legacy-column.d.ts +0 -11
  643. package/components/ion-picker-legacy-column.js +0 -4
  644. package/components/ion-picker-legacy.d.ts +0 -11
  645. package/components/ion-picker-legacy.js +0 -4
  646. package/components/p-A3O24YmY.js +0 -4
  647. package/components/p-ABkNVeU9.js +0 -4
  648. package/components/p-B-JJgYSG.js +0 -4
  649. package/components/p-BB42Mlnr.js +0 -4
  650. package/components/p-BLmJ0zRm.js +0 -4
  651. package/components/p-BSEgsdFI.js +0 -4
  652. package/components/p-BTEOs1at.js +0 -4
  653. package/components/p-BlIAuGv2.js +0 -4
  654. package/components/p-Bnsn6KaP.js +0 -4
  655. package/components/p-BsBCoGa-.js +0 -4
  656. package/components/p-Bz0dSlXZ.js +0 -4
  657. package/components/p-C53feagD.js +0 -4
  658. package/components/p-CHqRYvYm.js +0 -4
  659. package/components/p-CQGnMY3n.js +0 -4
  660. package/components/p-CSZf8_j0.js +0 -4
  661. package/components/p-C_xFdyXe.js +0 -4
  662. package/components/p-Cf2jSDS8.js +0 -4
  663. package/components/p-CkMSOsFF.js +0 -4
  664. package/components/p-Cl0B-RWe.js +0 -4
  665. package/components/p-CmR5uXej.js +0 -4
  666. package/components/p-CsNJ1ULL.js +0 -4
  667. package/components/p-CtWGkNnJ.js +0 -4
  668. package/components/p-CzCbeKys.js +0 -4
  669. package/components/p-D-aHdMxW.js +0 -4
  670. package/components/p-D0d8qTwj.js +0 -4
  671. package/components/p-D13Eaw-8.js +0 -4
  672. package/components/p-D3xo7hqU.js +0 -4
  673. package/components/p-D6Ynv7Xh.js +0 -4
  674. package/components/p-DCnGU1fF.js +0 -4
  675. package/components/p-DGZpx6KJ.js +0 -4
  676. package/components/p-DGvrK8dD.js +0 -4
  677. package/components/p-DHTSTb52.js +0 -4
  678. package/components/p-DOFCbuQR.js +0 -4
  679. package/components/p-DRugphUN.js +0 -4
  680. package/components/p-DV5mPYQS.js +0 -4
  681. package/components/p-DWkAgceV.js +0 -4
  682. package/components/p-DiVJyqlX.js +0 -4
  683. package/components/p-KEFO0w3i.js +0 -4
  684. package/components/p-Osve4qkc.js +0 -4
  685. package/components/p-SLS1rDZM.js +0 -4
  686. package/components/p-VWbRkLT7.js +0 -4
  687. package/components/p-aJ6PBUvj.js +0 -4
  688. package/components/p-cyNmxje6.js +0 -4
  689. package/components/p-k_E4tX5Z.js +0 -4
  690. package/components/p-oD4kcBRX.js +0 -4
  691. package/components/p-scxfI1Dd.js +0 -4
  692. package/components/p-yzCsOZE2.js +0 -4
  693. package/dist/cjs/config-xninhj0J.js +0 -201
  694. package/dist/cjs/dir-Cn0z1rJH.js +0 -20
  695. package/dist/cjs/input.utils-DetjmtH2.js +0 -150
  696. package/dist/cjs/notch-controller-18PzRGXd.js +0 -155
  697. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  698. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  699. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  700. package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
  701. package/dist/collection/components/picker-legacy/picker.js +0 -890
  702. package/dist/collection/components/picker-legacy/picker.md.css +0 -287
  703. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
  704. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  705. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
  706. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  707. package/dist/esm/config-DQCONYYp.js +0 -195
  708. package/dist/esm/dir-C53feagD.js +0 -18
  709. package/dist/esm/input.utils-Y6NgW8bw.js +0 -147
  710. package/dist/esm/notch-controller-DKDjU_O7.js +0 -153
  711. package/dist/ionic/p-01f81ea5.entry.js +0 -4
  712. package/dist/ionic/p-06c232a4.entry.js +0 -4
  713. package/dist/ionic/p-0dc33652.entry.js +0 -4
  714. package/dist/ionic/p-10e833ef.entry.js +0 -4
  715. package/dist/ionic/p-20b1a044.entry.js +0 -4
  716. package/dist/ionic/p-21eb76d5.entry.js +0 -4
  717. package/dist/ionic/p-2394a9a6.entry.js +0 -4
  718. package/dist/ionic/p-27d30585.entry.js +0 -4
  719. package/dist/ionic/p-2a05aa64.entry.js +0 -4
  720. package/dist/ionic/p-2b204c59.entry.js +0 -4
  721. package/dist/ionic/p-2fa58e80.entry.js +0 -4
  722. package/dist/ionic/p-3353c229.entry.js +0 -4
  723. package/dist/ionic/p-33704f20.entry.js +0 -4
  724. package/dist/ionic/p-34586ead.entry.js +0 -4
  725. package/dist/ionic/p-390ca786.entry.js +0 -4
  726. package/dist/ionic/p-3ae5f277.entry.js +0 -4
  727. package/dist/ionic/p-4654ae1c.entry.js +0 -4
  728. package/dist/ionic/p-4745f534.entry.js +0 -4
  729. package/dist/ionic/p-4858af1f.entry.js +0 -4
  730. package/dist/ionic/p-4ac4f3d6.entry.js +0 -4
  731. package/dist/ionic/p-4baa5b82.entry.js +0 -4
  732. package/dist/ionic/p-4e92a11f.entry.js +0 -4
  733. package/dist/ionic/p-5018dfc8.entry.js +0 -4
  734. package/dist/ionic/p-50e1194a.entry.js +0 -4
  735. package/dist/ionic/p-5d1da0a2.entry.js +0 -4
  736. package/dist/ionic/p-5eb8e86d.entry.js +0 -4
  737. package/dist/ionic/p-65ebdf1b.entry.js +0 -4
  738. package/dist/ionic/p-75dc25ba.entry.js +0 -4
  739. package/dist/ionic/p-7c319341.entry.js +0 -4
  740. package/dist/ionic/p-829367ed.entry.js +0 -4
  741. package/dist/ionic/p-84d5ce05.entry.js +0 -4
  742. package/dist/ionic/p-874b4bd8.entry.js +0 -4
  743. package/dist/ionic/p-8eb8ee76.entry.js +0 -4
  744. package/dist/ionic/p-8fce95d5.entry.js +0 -4
  745. package/dist/ionic/p-9eeaBrnk.js +0 -4
  746. package/dist/ionic/p-9f1103ce.entry.js +0 -4
  747. package/dist/ionic/p-9f9db3a2.entry.js +0 -4
  748. package/dist/ionic/p-BGqMS-oh.js +0 -4
  749. package/dist/ionic/p-BTEOs1at.js +0 -4
  750. package/dist/ionic/p-BUFIpxKM.js +0 -4
  751. package/dist/ionic/p-C0eMdTCW.js +0 -4
  752. package/dist/ionic/p-C53feagD.js +0 -4
  753. package/dist/ionic/p-CFlfIb2g.js +0 -4
  754. package/dist/ionic/p-CKvCXMs9.js +0 -4
  755. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  756. package/dist/ionic/p-CtWGkNnJ.js +0 -4
  757. package/dist/ionic/p-CwdymDLH.js +0 -4
  758. package/dist/ionic/p-Cx3IXROA.js +0 -4
  759. package/dist/ionic/p-D-3ycHmd.js +0 -4
  760. package/dist/ionic/p-D13Eaw-8.js +0 -4
  761. package/dist/ionic/p-DC3RagnA.js +0 -4
  762. package/dist/ionic/p-DIuEbVLu.js +0 -4
  763. package/dist/ionic/p-DSG2s2Eb.js +0 -4
  764. package/dist/ionic/p-Dfbt-q2k.js +0 -4
  765. package/dist/ionic/p-DiVJyqlX.js +0 -4
  766. package/dist/ionic/p-DoJvtrbw.js +0 -4
  767. package/dist/ionic/p-DqN5EA2O.js +0 -4
  768. package/dist/ionic/p-DzWaWHGc.js +0 -4
  769. package/dist/ionic/p-Nqf6uvGh.js +0 -4
  770. package/dist/ionic/p-SNAkTDfm.js +0 -4
  771. package/dist/ionic/p-VAemlbDS.js +0 -4
  772. package/dist/ionic/p-Wk5HzclC.js +0 -4
  773. package/dist/ionic/p-a3bdcae6.entry.js +0 -4
  774. package/dist/ionic/p-aaeedb6b.entry.js +0 -4
  775. package/dist/ionic/p-bfc9bb0f.entry.js +0 -4
  776. package/dist/ionic/p-c0fb8edd.entry.js +0 -4
  777. package/dist/ionic/p-c38b648e.entry.js +0 -4
  778. package/dist/ionic/p-c4d8641b.entry.js +0 -4
  779. package/dist/ionic/p-ca2ab74d.entry.js +0 -4
  780. package/dist/ionic/p-d889ff6d.entry.js +0 -4
  781. package/dist/ionic/p-e0be05c5.entry.js +0 -4
  782. package/dist/ionic/p-ef4c3bee.entry.js +0 -4
  783. package/dist/ionic/p-fd7eebc4.entry.js +0 -4
  784. package/dist/ionic/p-mjKAFv89.js +0 -4
  785. package/dist/ionic/p-tcQvqkiX.js +0 -5
  786. package/dist/ionic/p-viFHDgRs.js +0 -4
  787. package/dist/ionic/p-xWb6fgfq.js +0 -4
  788. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  789. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  790. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  791. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  792. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  793. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  794. /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
@@ -3,24 +3,25 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index$3 = require('./index-Ct7gcRif.js');
7
- var index$2 = require('./index-CIrkNXqJ.js');
8
- var frameworkDelegate = require('./framework-delegate-BtICZDHr.js');
9
- var helpers = require('./helpers-Cv23MFHM.js');
6
+ var index$3 = require('./index-DXoo08JC.js');
7
+ var index$1 = require('./index-DtvKGwdh.js');
8
+ var frameworkDelegate = require('./framework-delegate-d-fWfeI6.js');
9
+ var helpers = require('./helpers-7wzdhdeg.js');
10
10
  var lockController = require('./lock-controller-aDB9wrEf.js');
11
11
  var capacitor = require('./capacitor-DmA66EwP.js');
12
- var overlays = require('./overlays-DdtIYQUH.js');
13
- var theme = require('./theme-CeDs6Hcv.js');
14
- var index$4 = require('./index-BERfRao3.js');
15
- var ionicGlobal = require('./ionic-global-B-cA6LkY.js');
16
- var keyboard = require('./keyboard-hHzlEQpk.js');
17
- var animation = require('./animation-BJq0kcy2.js');
12
+ var overlays = require('./overlays-BR21NUIG.js');
13
+ var theme = require('./theme-Bw0rpaNN.js');
14
+ var index$4 = require('./index-CQfEIyLK.js');
15
+ var ionicGlobal = require('./ionic-global-CYJNT-2P.js');
16
+ var keyboard = require('./keyboard-Cix5TVkD.js');
17
+ var animation = require('./animation-Kd1N7WTN.js');
18
18
  var cubicBezier = require('./cubic-bezier-DAjy1V-e.js');
19
- var index$1 = require('./index-CAvQ7Tka.js');
19
+ var index$2 = require('./index-DRPqwSvU.js');
20
20
  var index = require('./index-DkNv4J_i.js');
21
- require('./hardware-back-button-iUuF_76h.js');
22
- require('./gesture-controller-dtqlP_q4.js');
23
- require('./keyboard-UuAS4D_9.js');
21
+ require('./dir-zwDPRE5K.js');
22
+ require('./hardware-back-button-Bu4Dzw8l.js');
23
+ require('./gesture-controller-CeJslptU.js');
24
+ require('./keyboard-cHxZlTyz.js');
24
25
 
25
26
  var Style;
26
27
  (function (Style) {
@@ -31,7 +32,7 @@ var Style;
31
32
  const StatusBar = {
32
33
  getEngine() {
33
34
  const capacitor$1 = capacitor.getCapacitor();
34
- if (capacitor$1 === null || capacitor$1 === void 0 ? void 0 : capacitor$1.isPluginAvailable('StatusBar')) {
35
+ if (capacitor$1?.isPluginAvailable('StatusBar')) {
35
36
  return capacitor$1.Plugins.StatusBar;
36
37
  }
37
38
  return undefined;
@@ -129,6 +130,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
129
130
  StatusBar.setStyle({ style: defaultStyle });
130
131
  };
131
132
 
133
+ /**
134
+ * Swiping is only possible when the content is scrolled to the top, so that we
135
+ * do not interfere with scrolling, and never on content with a refresher.
136
+ *
137
+ * Note: We cannot solve the refresher case with gesture priority as the iOS
138
+ * native refresh gesture uses a scroll listener in addition to a gesture.
139
+ *
140
+ * Note: Do not use `getScrollElement` here because we need this to be a
141
+ * synchronous operation, and `getScrollElement` is asynchronous.
142
+ */
143
+ const canSwipeOnContent = (contentEl) => {
144
+ const scrollEl = index$1.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
145
+ const hasRefresherInContent = !!index$1.findRefresherInContent(contentEl);
146
+ return !hasRefresherInContent && scrollEl.scrollTop === 0;
147
+ };
132
148
  const handleCanDismiss = async (el, animation) => {
133
149
  /**
134
150
  * If canDismiss is not a function
@@ -259,12 +275,11 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
259
275
  let isOpen = false;
260
276
  let canDismissBlocksGesture = false;
261
277
  let contentEl = null;
262
- let scrollEl = null;
263
278
  const canDismissMaxStep = 0.2;
264
279
  let initialScrollY = true;
265
280
  let lastStep = 0;
266
281
  const getScrollY = () => {
267
- if (contentEl && index$2.isIonContent(contentEl)) {
282
+ if (contentEl && index$1.isIonContent(contentEl)) {
268
283
  return contentEl.scrollY;
269
284
  /**
270
285
  * Custom scroll containers are intended to be
@@ -282,12 +297,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
282
297
  return true;
283
298
  }
284
299
  /**
285
- * If we are swiping on the content,
286
- * swiping should only be possible if
287
- * the content is scrolled all the way
288
- * to the top so that we do not interfere
289
- * with scrolling.
290
- *
291
300
  * We cannot assume that the `ion-content`
292
301
  * target will remain consistent between
293
302
  * swipes. For example, when using
@@ -296,31 +305,9 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
296
305
  * swipe again. The target content will not
297
306
  * be the same between swipes.
298
307
  */
299
- contentEl = index$2.findClosestIonContent(target);
308
+ contentEl = index$1.findClosestIonContent(target);
300
309
  if (contentEl) {
301
- /**
302
- * The card should never swipe to close
303
- * on the content with a refresher.
304
- * Note: We cannot solve this by making the
305
- * swipeToClose gesture have a higher priority
306
- * than the refresher gesture as the iOS native
307
- * refresh gesture uses a scroll listener in
308
- * addition to a gesture.
309
- *
310
- * Note: Do not use getScrollElement here
311
- * because we need this to be a synchronous
312
- * operation, and getScrollElement is
313
- * asynchronous.
314
- */
315
- if (index$2.isIonContent(contentEl)) {
316
- const root = helpers.getElementRoot(contentEl);
317
- scrollEl = root.querySelector('.inner-scroll');
318
- }
319
- else {
320
- scrollEl = contentEl;
321
- }
322
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
323
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
310
+ return canSwipeOnContent(contentEl);
324
311
  }
325
312
  /**
326
313
  * Card should be swipeable on all
@@ -333,14 +320,13 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
333
320
  return false;
334
321
  };
335
322
  const onStart = (detail) => {
336
- var _a;
337
323
  const { deltaY } = detail;
338
324
  /**
339
325
  * Firefox automatically selects the header text during drag
340
326
  * due to the focusable wrapper (tabindex="-1"). Remove any
341
327
  * selection that may have occurred.
342
328
  */
343
- (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
329
+ window.getSelection()?.removeAllRanges();
344
330
  /**
345
331
  * Get the initial scrollY value so
346
332
  * that we can correctly reset the scrollY
@@ -363,7 +349,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
363
349
  * happen at the same time as the gesture.
364
350
  */
365
351
  if (deltaY > 0 && contentEl) {
366
- index$2.disableContentScrollY(contentEl);
352
+ index$1.disableContentScrollY(contentEl);
367
353
  }
368
354
  animation.progressStart(true, isOpen ? 1 : 0);
369
355
  onDragStart();
@@ -377,7 +363,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
377
363
  * happen at the same time as the gesture.
378
364
  */
379
365
  if (deltaY > 0 && contentEl) {
380
- index$2.disableContentScrollY(contentEl);
366
+ index$1.disableContentScrollY(contentEl);
381
367
  }
382
368
  /**
383
369
  * If we are swiping on the content
@@ -472,7 +458,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
472
458
  isOpen = shouldComplete;
473
459
  gesture.enable(false);
474
460
  if (contentEl) {
475
- index$2.resetContentScrollY(contentEl, initialScrollY);
461
+ index$1.resetContentScrollY(contentEl, initialScrollY);
476
462
  }
477
463
  animation
478
464
  .onFinish(() => {
@@ -493,22 +479,35 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
493
479
  * check canDismiss. 25% was chosen
494
480
  * to avoid accidental swipes.
495
481
  */
496
- if (isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4) {
482
+ const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
483
+ if (isAttemptingCanDismiss) {
497
484
  handleCanDismiss(el, animation);
498
485
  }
499
486
  else if (shouldComplete) {
500
487
  onDismiss();
501
488
  }
489
+ /**
490
+ * `shouldComplete` is not enough on its own, since it is always `false`
491
+ * when canDismiss blocks the gesture. `canDismiss: false` blocks it and
492
+ * never dismisses, because `handleCanDismiss` returns early when
493
+ * canDismiss is not a function. A canDismiss function dismisses through
494
+ * `handleCanDismiss`, which awaits the callback, so the outcome is not
495
+ * known when this event is emitted.
496
+ */
497
+ const isDismissing = isAttemptingDismissWithCanDismiss
498
+ ? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
499
+ : shouldComplete;
502
500
  const eventDetail = {
503
501
  currentY: detail.currentY,
504
502
  deltaY: detail.deltaY,
505
503
  velocityY: detail.velocityY,
506
504
  progress: calculateProgress(el, detail.deltaY),
505
+ isDismissing,
507
506
  snapBreakpoint: shouldComplete ? 0 : 1,
508
507
  };
509
508
  onDragEnd(eventDetail);
510
509
  };
511
- const gesture = index$1.createGesture({
510
+ const gesture = index$2.createGesture({
512
511
  el,
513
512
  gestureName: 'modalSwipeToClose',
514
513
  gesturePriority: overlays.OVERLAY_GESTURE_PRIORITY,
@@ -641,7 +640,7 @@ const iosEnterAnimation = (baseEl, opts) => {
641
640
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
642
641
  // The content animation is only added if scrolling is enabled for
643
642
  // all the breakpoints.
644
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
643
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
645
644
  const baseAnimation = animation.createAnimation('entering-base')
646
645
  .addElement(baseEl)
647
646
  .easing('cubic-bezier(0.32,0.72,0,1)')
@@ -974,7 +973,7 @@ const mdEnterAnimation = (baseEl, opts) => {
974
973
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
975
974
  // The content animation is only added if scrolling is enabled for
976
975
  // all the breakpoints.
977
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
976
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
978
977
  const baseAnimation = animation.createAnimation()
979
978
  .addElement(baseEl)
980
979
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
@@ -1033,6 +1032,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1033
1032
  ],
1034
1033
  };
1035
1034
  const contentEl = baseEl.querySelector('ion-content');
1035
+ // Cache the initial value so the gesture restores it instead of forcing scrolling on.
1036
+ const initialContentScrollY = contentEl?.scrollY ?? true;
1036
1037
  const height = wrapperEl.clientHeight;
1037
1038
  let currentBreakpoint = initialBreakpoint;
1038
1039
  let offset = 0;
@@ -1098,9 +1099,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1098
1099
  cachedFooterEl.style.removeProperty('height');
1099
1100
  cachedFooterEl.style.removeProperty('top');
1100
1101
  cachedFooterEl.style.removeProperty('left');
1101
- page === null || page === void 0 ? void 0 : page.style.removeProperty('padding-bottom');
1102
+ page?.style.removeProperty('padding-bottom');
1102
1103
  // Move to page
1103
- page === null || page === void 0 ? void 0 : page.appendChild(cachedFooterEl);
1104
+ page?.appendChild(cachedFooterEl);
1104
1105
  });
1105
1106
  }
1106
1107
  else {
@@ -1144,7 +1145,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1144
1145
  // when the footer is positioned absolutely. This has to be done before we
1145
1146
  // make the footer absolutely positioned or we may accidentally cause the
1146
1147
  // sheet to scroll.
1147
- page === null || page === void 0 ? void 0 : page.style.setProperty('padding-bottom', `${footerHeights}px`);
1148
+ page?.style.setProperty('padding-bottom', `${footerHeights}px`);
1148
1149
  // Apply positioning styles to keep footer at bottom
1149
1150
  cachedFooterEl.classList.add('modal-footer-moving');
1150
1151
  // Apply our preserved styles to pin the footer
@@ -1169,7 +1170,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1169
1170
  if (wrapperAnimation && backdropAnimation) {
1170
1171
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1171
1172
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1172
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1173
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1173
1174
  animation.progressStart(true, 1 - currentBreakpoint);
1174
1175
  /**
1175
1176
  * If backdrop is not enabled, then content
@@ -1193,47 +1194,28 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1193
1194
  }
1194
1195
  const canStart = (detail) => {
1195
1196
  /**
1196
- * If we are swiping on the content, swiping should only be possible if the content
1197
- * is scrolled all the way to the top so that we do not interfere with scrolling.
1198
- *
1199
1197
  * We cannot assume that the `ion-content` target will remain consistent between swipes.
1200
1198
  * For example, when using ion-nav within a modal it is possible to swipe, push a view,
1201
1199
  * and then swipe again. The target content will not be the same between swipes.
1202
1200
  */
1203
- const contentEl = index$2.findClosestIonContent(detail.event.target);
1201
+ const contentEl = index$1.findClosestIonContent(detail.event.target);
1204
1202
  currentBreakpoint = getCurrentBreakpoint();
1205
1203
  /**
1206
- * If `expandToScroll` is disabled, we should not allow the swipe gesture
1207
- * to start if the content is not scrolled to the top.
1204
+ * Upwards swipes on the content cannot move the sheet anyway, so this only
1205
+ * blocks swiping the sheet down from the content.
1208
1206
  */
1209
- if (!expandToScroll && contentEl) {
1210
- const scrollEl = index$2.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1211
- return scrollEl.scrollTop === 0;
1212
- }
1213
- if (currentBreakpoint === 1 && contentEl) {
1214
- /**
1215
- * The modal should never swipe to close on the content with a refresher.
1216
- * Note 1: We cannot solve this by making this gesture have a higher priority than
1217
- * the refresher gesture as the iOS native refresh gesture uses a scroll listener in
1218
- * addition to a gesture.
1219
- *
1220
- * Note 2: Do not use getScrollElement here because we need this to be a synchronous
1221
- * operation, and getScrollElement is asynchronous.
1222
- */
1223
- const scrollEl = index$2.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1224
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
1225
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
1207
+ if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
1208
+ return canSwipeOnContent(contentEl);
1226
1209
  }
1227
1210
  return true;
1228
1211
  };
1229
1212
  const onStart = (detail) => {
1230
- var _a;
1231
1213
  /**
1232
1214
  * Firefox automatically selects the header text during drag
1233
1215
  * due to the focusable wrapper (tabindex="-1"). Remove any
1234
1216
  * selection that may have occurred.
1235
1217
  */
1236
- (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
1218
+ window.getSelection()?.removeAllRanges();
1237
1219
  /**
1238
1220
  * If canDismiss is anything other than `true`
1239
1221
  * then users should be able to swipe down
@@ -1253,9 +1235,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1253
1235
  * which would impact performance significantly.
1254
1236
  */
1255
1237
  if (!expandToScroll) {
1256
- const targetEl = index$2.findClosestIonContent(detail.event.target);
1238
+ const targetEl = index$1.findClosestIonContent(detail.event.target);
1257
1239
  cachedScrollEl =
1258
- targetEl && index$2.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1240
+ targetEl && index$1.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1259
1241
  }
1260
1242
  /**
1261
1243
  * If expandToScroll is disabled, we need to swap
@@ -1361,12 +1343,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1361
1343
  };
1362
1344
  const onEnd = (detail) => {
1363
1345
  const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1346
+ /**
1347
+ * `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
1348
+ * snaps to 0 but never dismisses, since `handleCanDismiss` returns early
1349
+ * when canDismiss is not a function. A canDismiss function dismisses
1350
+ * through `handleCanDismiss`, which awaits the callback, so the outcome
1351
+ * is not known when this event is emitted.
1352
+ */
1353
+ const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
1354
+ const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
1364
1355
  const eventDetail = {
1365
1356
  currentY: detail.currentY,
1366
1357
  deltaY: detail.deltaY,
1367
1358
  velocityY: detail.velocityY,
1368
1359
  progress: calculateProgress(detail.currentY),
1369
1360
  snapBreakpoint,
1361
+ isDismissing,
1370
1362
  };
1371
1363
  /**
1372
1364
  * If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
@@ -1382,7 +1374,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1382
1374
  * swap to moving on drag and if we don't swap back here then the footer will get stuck.
1383
1375
  */
1384
1376
  swapFooterPosition('stationary');
1385
- onDragEnd(eventDetail);
1377
+ /**
1378
+ * The sheet does not move in this case, so the gesture
1379
+ * never dismisses the modal.
1380
+ */
1381
+ onDragEnd({ ...eventDetail, isDismissing: false });
1386
1382
  return;
1387
1383
  }
1388
1384
  moveSheetToBreakpoint({
@@ -1455,14 +1451,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1455
1451
  onDismiss();
1456
1452
  }
1457
1453
  /**
1458
- * Enables scrolling immediately if the sheet is about to fully expand
1459
- * or if it allows scrolling at any breakpoint. Without this, there would
1454
+ * Restores the content's scroll setting immediately if the sheet is about to
1455
+ * fully expand or if it allows scrolling at any breakpoint. Without this, there would
1460
1456
  * be a ~500ms delay while the modal animation completes, causing a
1461
1457
  * noticeable lag. Native iOS allows scrolling as soon as the gesture is
1462
1458
  * released, so we align with that behavior.
1463
1459
  */
1464
1460
  if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
1465
- contentEl.scrollY = true;
1461
+ contentEl.scrollY = initialContentScrollY;
1466
1462
  }
1467
1463
  /**
1468
1464
  * If expandToScroll is disabled and we're animating
@@ -1497,7 +1493,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1497
1493
  helpers.raf(() => {
1498
1494
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1499
1495
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1500
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1496
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1501
1497
  animation.progressStart(true, 1 - snapToBreakpoint);
1502
1498
  currentBreakpoint = snapToBreakpoint;
1503
1499
  onBreakpointChange(currentBreakpoint);
@@ -1633,7 +1629,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1633
1629
  */
1634
1630
  return viewportBottom - activeHeight;
1635
1631
  };
1636
- const gesture = index$1.createGesture({
1632
+ const gesture = index$2.createGesture({
1637
1633
  el: wrapperEl,
1638
1634
  gestureName: 'modalSheet',
1639
1635
  gesturePriority: 40,
@@ -1644,9 +1640,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1644
1640
  onMove,
1645
1641
  onEnd,
1646
1642
  });
1643
+ /**
1644
+ * Puts the content back the way the app declared it. A sheet can dismiss
1645
+ * without going through moveSheetToBreakpoint, and an inline modal reuses
1646
+ * the same element on the next present.
1647
+ */
1648
+ const resetContentScroll = () => {
1649
+ if (contentEl) {
1650
+ contentEl.scrollY = initialContentScrollY;
1651
+ }
1652
+ };
1647
1653
  return {
1648
1654
  gesture,
1649
1655
  moveSheetToBreakpoint,
1656
+ resetContentScroll,
1650
1657
  };
1651
1658
  };
1652
1659
 
@@ -1696,8 +1703,8 @@ const getRootSafeAreaTop = () => {
1696
1703
  if (cachedRootSafeAreaTop !== null) {
1697
1704
  return cachedRootSafeAreaTop;
1698
1705
  }
1699
- const doc = index.win === null || index.win === void 0 ? void 0 : index.win.document;
1700
- if (!(doc === null || doc === void 0 ? void 0 : doc.body)) {
1706
+ const doc = index.win?.document;
1707
+ if (!doc?.body) {
1701
1708
  return 0;
1702
1709
  }
1703
1710
  const el = doc.createElement('div');
@@ -1716,6 +1723,41 @@ const getRootSafeAreaTop = () => {
1716
1723
  }
1717
1724
  return value;
1718
1725
  };
1726
+ /**
1727
+ * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1728
+ * event and no window resize covers. The probe's height tracks the variable, so
1729
+ * a change to it becomes a size change the observer can see.
1730
+ */
1731
+ const onRootSafeAreaTopChange = (callback) => {
1732
+ const doc = index.win?.document;
1733
+ if (!doc?.body || typeof ResizeObserver === 'undefined') {
1734
+ return () => undefined;
1735
+ }
1736
+ const probe = doc.createElement('div');
1737
+ probe.style.cssText =
1738
+ 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1739
+ 'height:var(--ion-safe-area-top,0px);';
1740
+ doc.body.appendChild(probe);
1741
+ /**
1742
+ * Seeded with the value the caller has already applied, so a change that
1743
+ * lands before the observer's first delivery still gets reported. Comparing
1744
+ * against an unset value instead would consume that first delivery and treat
1745
+ * the new inset as the baseline.
1746
+ */
1747
+ let lastHeight = getRootSafeAreaTop();
1748
+ const observer = new ResizeObserver((entries) => {
1749
+ const { height } = entries[0].contentRect;
1750
+ if (height !== lastHeight) {
1751
+ lastHeight = height;
1752
+ callback(height);
1753
+ }
1754
+ });
1755
+ observer.observe(probe);
1756
+ return () => {
1757
+ observer.disconnect();
1758
+ probe.remove();
1759
+ };
1760
+ };
1719
1761
  /**
1720
1762
  * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1721
1763
  * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
@@ -1800,10 +1842,9 @@ const getInitialSafeAreaConfig = (context) => {
1800
1842
  * @returns SafeAreaConfig based on position
1801
1843
  */
1802
1844
  const getPositionBasedSafeAreaConfig = (wrapperEl) => {
1803
- var _a, _b;
1804
1845
  const rect = wrapperEl.getBoundingClientRect();
1805
- const vh = (_a = index.win === null || index.win === void 0 ? void 0 : index.win.innerHeight) !== null && _a !== void 0 ? _a : 0;
1806
- const vw = (_b = index.win === null || index.win === void 0 ? void 0 : index.win.innerWidth) !== null && _b !== void 0 ? _b : 0;
1846
+ const vh = index.win?.innerHeight ?? 0;
1847
+ const vw = index.win?.innerWidth ?? 0;
1807
1848
  // Only apply safe-area to sides where modal overlaps with screen edge
1808
1849
  return {
1809
1850
  top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
@@ -1864,6 +1905,9 @@ const Modal = class {
1864
1905
  this.inline = false;
1865
1906
  // Whether or not modal is being dismissed via gesture
1866
1907
  this.gestureAnimationDismissing = false;
1908
+ // True from the first safe-area write in `present()` until the enter
1909
+ // animation settles. A position-based read in that window is not the rest position.
1910
+ this.isPresenting = false;
1867
1911
  this.presented = false;
1868
1912
  /** @internal */
1869
1913
  this.hasController = false;
@@ -1898,13 +1942,20 @@ const Modal = class {
1898
1942
  /**
1899
1943
  * The interaction behavior for the sheet modal when the handle is pressed.
1900
1944
  *
1901
- * Defaults to `"none"`, which means the modal will not change size or position when the handle is pressed.
1902
- * Set to `"cycle"` to let the modal cycle between available breakpoints when pressed.
1945
+ * Handle behavior is unavailable when the `handle` property is set to
1946
+ * `false` or when the `breakpoints` property is not set (using a
1947
+ * fullscreen or card modal).
1948
+ *
1949
+ * Set to `"cycle"` to make the handle focusable and let the sheet modal
1950
+ * cycle between available breakpoints when pressed. This keeps the sheet
1951
+ * operable with assistive technology.
1952
+ *
1953
+ * Set to `"none"` to make the handle purely decorative when pressed and
1954
+ * removed from the tab order.
1903
1955
  *
1904
- * Handle behavior is unavailable when the `handle` property is set to `false` or
1905
- * when the `breakpoints` property is not set (using a fullscreen or card modal).
1956
+ * Defaults to `"cycle"`.
1906
1957
  */
1907
- this.handleBehavior = 'none';
1958
+ this.handleBehavior = 'cycle';
1908
1959
  /**
1909
1960
  * If `true`, the modal will be dismissed when the backdrop is clicked.
1910
1961
  */
@@ -2012,7 +2063,6 @@ const Modal = class {
2012
2063
  * if it exists and is focusable, otherwise let the focus trap handle it.
2013
2064
  */
2014
2065
  this.onModalFocus = (ev) => {
2015
- var _a;
2016
2066
  const { dragHandleEl, el } = this;
2017
2067
  /**
2018
2068
  * Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
@@ -2020,7 +2070,7 @@ const Modal = class {
2020
2070
  * shadowRoot's activeElement is null only when the host was focused directly,
2021
2071
  * so redirect to the handle only then and leave present()'s wrapper focus intact.
2022
2072
  */
2023
- if (ev.target === el && ((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2073
+ if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2024
2074
  dragHandleEl.focus();
2025
2075
  }
2026
2076
  };
@@ -2094,6 +2144,17 @@ const Modal = class {
2094
2144
  const { el } = this;
2095
2145
  overlays.prepareOverlay(el);
2096
2146
  this.triggerChanged();
2147
+ // A disconnect tears down state this presentation still needs and cannot
2148
+ // tell a re-insert from a removal, so put it back.
2149
+ if (this.presented || this.isPresenting) {
2150
+ this.restoreSafeAreaOverrides();
2151
+ }
2152
+ // A relocation from `willPresent` reaches these before `present()` has
2153
+ // applied the lock, so they apply it instead. Both are idempotent.
2154
+ if (this.presented) {
2155
+ overlays.restoreRootFocusTrapAccessibility(el);
2156
+ this.initParentRemovalObserver();
2157
+ }
2097
2158
  }
2098
2159
  disconnectedCallback() {
2099
2160
  this.triggerController.removeClickListener();
@@ -2102,9 +2163,12 @@ const Modal = class {
2102
2163
  // Also called in dismiss() — intentional dual cleanup covers both
2103
2164
  // dismiss-then-remove and direct DOM removal without dismiss.
2104
2165
  this.cleanupSafeAreaOverrides();
2166
+ // Clean up aria-hidden if removed without dismiss() being called
2167
+ if (this.presented) {
2168
+ overlays.cleanupRootFocusTrapAccessibility();
2169
+ }
2105
2170
  }
2106
2171
  componentWillLoad() {
2107
- var _a;
2108
2172
  const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
2109
2173
  const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
2110
2174
  const attributesToInherit = ['aria-label', 'role'];
@@ -2139,7 +2203,10 @@ const Modal = class {
2139
2203
  * htmlAttributes wins, but that's not a pattern that we recommend.
2140
2204
  * The only time you'd need htmlAttributes is when using modalController.
2141
2205
  */
2142
- this.inheritedAttributes = Object.assign(Object.assign({}, this.inheritedAttributes), { [attribute]: htmlAttributes[attribute] });
2206
+ this.inheritedAttributes = {
2207
+ ...this.inheritedAttributes,
2208
+ [attribute]: htmlAttributes[attribute],
2209
+ };
2143
2210
  delete htmlAttributes[attribute];
2144
2211
  }
2145
2212
  });
@@ -2150,7 +2217,7 @@ const Modal = class {
2150
2217
  if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
2151
2218
  index$3.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2152
2219
  }
2153
- if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
2220
+ if (!this.htmlAttributes?.id) {
2154
2221
  overlays.setOverlayId(this.el);
2155
2222
  }
2156
2223
  }
@@ -2265,25 +2332,33 @@ const Modal = class {
2265
2332
  // Recalculate isSheetModal before safe-area setup because framework
2266
2333
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
2267
2334
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
2268
- // Set initial safe-area overrides before animation
2269
- this.setInitialSafeAreaOverrides();
2335
+ this.isPresenting = true;
2270
2336
  const hasCardModal = presentingElement !== undefined;
2271
- /**
2272
- * We need to change the status bar at the
2273
- * start of the animation so that it completes
2274
- * by the time the card animation is done.
2275
- */
2276
- if (hasCardModal && ionicGlobal.getIonMode(this) === 'ios') {
2277
- // Cache the original status bar color before the modal is presented
2278
- this.statusBarStyle = await StatusBar.getStyle();
2279
- setCardStatusBarDark();
2337
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
2338
+ // the position-based correction for the life of this instance.
2339
+ try {
2340
+ // Set initial safe-area overrides before animation
2341
+ this.setInitialSafeAreaOverrides();
2342
+ /**
2343
+ * We need to change the status bar at the
2344
+ * start of the animation so that it completes
2345
+ * by the time the card animation is done.
2346
+ */
2347
+ if (hasCardModal && ionicGlobal.getIonMode(this) === 'ios') {
2348
+ // Cache the original status bar color before the modal is presented
2349
+ this.statusBarStyle = await StatusBar.getStyle();
2350
+ setCardStatusBarDark();
2351
+ }
2352
+ await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2353
+ presentingEl: presentingElement,
2354
+ currentBreakpoint: this.initialBreakpoint,
2355
+ backdropBreakpoint: this.backdropBreakpoint,
2356
+ expandToScroll: this.expandToScroll,
2357
+ });
2358
+ }
2359
+ finally {
2360
+ this.isPresenting = false;
2280
2361
  }
2281
- await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2282
- presentingEl: presentingElement,
2283
- currentBreakpoint: this.initialBreakpoint,
2284
- backdropBreakpoint: this.backdropBreakpoint,
2285
- expandToScroll: this.expandToScroll,
2286
- });
2287
2362
  // Update safe-area based on actual position after animation
2288
2363
  this.updateSafeAreaOverrides();
2289
2364
  // Apply fullscreen safe-area padding if needed
@@ -2332,7 +2407,6 @@ const Modal = class {
2332
2407
  unlock();
2333
2408
  }
2334
2409
  initSwipeToClose() {
2335
- var _a;
2336
2410
  if (ionicGlobal.getIonMode(this) !== 'ios') {
2337
2411
  return;
2338
2412
  }
@@ -2345,12 +2419,12 @@ const Modal = class {
2345
2419
  presentingEl: this.presentingElement,
2346
2420
  expandToScroll: this.expandToScroll,
2347
2421
  }));
2348
- const contentEl = index$2.findIonContent(el);
2422
+ const contentEl = index$1.findIonContent(el);
2349
2423
  if (!contentEl) {
2350
- index$2.printIonContentErrorMsg(el);
2424
+ index$1.printIonContentErrorMsg(el);
2351
2425
  return;
2352
2426
  }
2353
- const statusBarStyle = (_a = this.statusBarStyle) !== null && _a !== void 0 ? _a : Style.Default;
2427
+ const statusBarStyle = this.statusBarStyle ?? Style.Default;
2354
2428
  this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2355
2429
  this.gesture.enable(true);
2356
2430
  }
@@ -2367,7 +2441,7 @@ const Modal = class {
2367
2441
  expandToScroll: this.expandToScroll,
2368
2442
  }));
2369
2443
  ani.progressStart(true, 1);
2370
- const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => { var _a; return (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : 0; }, () => this.sheetOnDismiss(), (breakpoint) => {
2444
+ const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
2371
2445
  if (this.currentBreakpoint !== breakpoint) {
2372
2446
  this.currentBreakpoint = breakpoint;
2373
2447
  this.ionBreakpointDidChange.emit({ breakpoint });
@@ -2375,6 +2449,7 @@ const Modal = class {
2375
2449
  }, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2376
2450
  this.gesture = gesture;
2377
2451
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2452
+ this.resetSheetContentScroll = resetContentScroll;
2378
2453
  this.gesture.enable(true);
2379
2454
  /**
2380
2455
  * When backdrop interaction is allowed, nested router outlets from child routes
@@ -2392,7 +2467,6 @@ const Modal = class {
2392
2467
  * passthrough on child route page wrappers and nested router outlets.
2393
2468
  */
2394
2469
  setupChildRoutePassthrough() {
2395
- var _a;
2396
2470
  // Cache the page parent for cleanup
2397
2471
  this.cachedPageParent = this.getOriginalPageParent();
2398
2472
  const pageParent = this.cachedPageParent;
@@ -2400,14 +2474,11 @@ const Modal = class {
2400
2474
  if (!pageParent || pageParent.tagName === 'ION-APP') {
2401
2475
  return;
2402
2476
  }
2403
- const hasVisibleContent = Array.from(pageParent.children).some((child) => {
2404
- var _a;
2405
- return child !== this.el &&
2406
- !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2407
- child.tagName !== 'TEMPLATE' &&
2408
- child.tagName !== 'SLOT' &&
2409
- !(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
2410
- });
2477
+ const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
2478
+ !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2479
+ child.tagName !== 'TEMPLATE' &&
2480
+ child.tagName !== 'SLOT' &&
2481
+ !(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
2411
2482
  if (hasVisibleContent) {
2412
2483
  return;
2413
2484
  }
@@ -2415,7 +2486,7 @@ const Modal = class {
2415
2486
  pageParent.classList.add('ion-page-overlay-passthrough');
2416
2487
  // Also make nested router outlets passthrough
2417
2488
  const routerOutlet = pageParent.parentElement;
2418
- if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
2489
+ if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
2419
2490
  routerOutlet.style.setProperty('pointer-events', 'none');
2420
2491
  routerOutlet.setAttribute('data-overlay-passthrough', 'true');
2421
2492
  }
@@ -2443,7 +2514,7 @@ const Modal = class {
2443
2514
  }
2444
2515
  pageParent.classList.remove('ion-page-overlay-passthrough');
2445
2516
  const routerOutlet = pageParent.parentElement;
2446
- if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
2517
+ if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
2447
2518
  routerOutlet.style.removeProperty('pointer-events');
2448
2519
  routerOutlet.removeAttribute('data-overlay-passthrough');
2449
2520
  }
@@ -2506,7 +2577,6 @@ const Modal = class {
2506
2577
  * For example, `cancel` or `backdrop`.
2507
2578
  */
2508
2579
  async dismiss(data, role) {
2509
- var _a;
2510
2580
  if (this.gestureAnimationDismissing && role !== overlays.GESTURE) {
2511
2581
  return false;
2512
2582
  }
@@ -2551,7 +2621,7 @@ const Modal = class {
2551
2621
  }
2552
2622
  const dismissed = await overlays.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2553
2623
  presentingEl: presentingElement,
2554
- currentBreakpoint: (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : this.initialBreakpoint,
2624
+ currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
2555
2625
  backdropBreakpoint: this.backdropBreakpoint,
2556
2626
  expandToScroll: this.expandToScroll,
2557
2627
  });
@@ -2565,6 +2635,13 @@ const Modal = class {
2565
2635
  if (this.gesture) {
2566
2636
  this.gesture.destroy();
2567
2637
  }
2638
+ /**
2639
+ * The sheet gesture turns content scrolling off while the sheet sits below
2640
+ * the top breakpoint. Inline modals reuse the same content on the next
2641
+ * present, so hand it back before the gesture goes away.
2642
+ */
2643
+ this.resetSheetContentScroll?.();
2644
+ this.resetSheetContentScroll = undefined;
2568
2645
  this.cleanupViewTransitionListener();
2569
2646
  this.cleanupParentRemovalObserver();
2570
2647
  this.cleanupSafeAreaOverrides();
@@ -2739,7 +2816,7 @@ const Modal = class {
2739
2816
  wrapperEl.style.transform = 'translateY(0vh)';
2740
2817
  wrapperEl.style.opacity = '1';
2741
2818
  }
2742
- if ((presentingElement === null || presentingElement === void 0 ? void 0 : presentingElement.tagName) === 'ION-MODAL') {
2819
+ if (presentingElement?.tagName === 'ION-MODAL') {
2743
2820
  const isPortrait = window.innerWidth < 768;
2744
2821
  if (isPortrait) {
2745
2822
  const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
@@ -2755,7 +2832,7 @@ const Modal = class {
2755
2832
  }
2756
2833
  async dismissNestedModals() {
2757
2834
  const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
2758
- nestedModals === null || nestedModals === void 0 ? void 0 : nestedModals.forEach(async (modal) => {
2835
+ nestedModals?.forEach(async (modal) => {
2759
2836
  await modal.dismiss(undefined, 'parent-dismissed');
2760
2837
  });
2761
2838
  }
@@ -2783,15 +2860,17 @@ const Modal = class {
2783
2860
  this.cachedOriginalParent.tagName === 'ION-APP') {
2784
2861
  return;
2785
2862
  }
2863
+ // Both `present()` and a reconnect call this, so drop any existing
2864
+ // observer. Below the guards, so a call that bails cannot leave none.
2865
+ this.cleanupParentRemovalObserver();
2786
2866
  this.parentRemovalObserver = new MutationObserver((mutations) => {
2787
2867
  mutations.forEach((mutation) => {
2788
2868
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
2789
2869
  // Check if our cached original parent was removed
2790
2870
  const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
2791
- var _a, _b;
2792
2871
  const isDirectMatch = node === this.cachedOriginalParent;
2793
2872
  const isContainedMatch = this.cachedOriginalParent
2794
- ? (_b = (_a = node).contains) === null || _b === void 0 ? void 0 : _b.call(_a, this.cachedOriginalParent)
2873
+ ? node.contains?.(this.cachedOriginalParent)
2795
2874
  : false;
2796
2875
  return isDirectMatch || isContainedMatch;
2797
2876
  });
@@ -2813,8 +2892,7 @@ const Modal = class {
2813
2892
  });
2814
2893
  }
2815
2894
  cleanupParentRemovalObserver() {
2816
- var _a;
2817
- (_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
2895
+ this.parentRemovalObserver?.disconnect();
2818
2896
  this.parentRemovalObserver = undefined;
2819
2897
  }
2820
2898
  onDragStart() {
@@ -2854,22 +2932,30 @@ const Modal = class {
2854
2932
  * sheets to prevent header content from getting double-offset padding).
2855
2933
  */
2856
2934
  setInitialSafeAreaOverrides() {
2857
- const context = Object.assign(Object.assign({}, this.getSafeAreaContext()), { hasCustomDimensions: hasCustomModalDimensions(this.el) });
2935
+ const context = {
2936
+ ...this.getSafeAreaContext(),
2937
+ hasCustomDimensions: hasCustomModalDimensions(this.el),
2938
+ };
2858
2939
  const safeAreaConfig = getInitialSafeAreaConfig(context);
2859
2940
  applySafeAreaOverrides(this.el, safeAreaConfig);
2860
2941
  // Set the internal offset property with the resolved root safe-area-top value
2861
2942
  if (context.isSheetModal) {
2862
2943
  this.updateSheetOffsetTop();
2944
+ // A restore after a DOM move runs this a second time for the same
2945
+ // modal, so drop the previous subscription rather than stacking one.
2946
+ this.unsubscribeRootSafeAreaTop?.();
2947
+ this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
2863
2948
  }
2864
2949
  }
2865
2950
  /**
2866
- * Resolves the current root --ion-safe-area-top value and sets the
2867
- * internal --ion-modal-offset-top property on the host element.
2868
- * Called on present and on resize (e.g., device rotation changes safe-area).
2951
+ * Sets the internal --ion-modal-offset-top property on the host element,
2952
+ * resolving the current root --ion-safe-area-top when no value is given.
2953
+ * Called on present, on resize (e.g., device rotation changes safe-area),
2954
+ * and whenever the root safe-area value itself changes.
2869
2955
  */
2870
- updateSheetOffsetTop() {
2871
- const safeAreaTop = getRootSafeAreaTop();
2872
- this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`);
2956
+ updateSheetOffsetTop(safeAreaTop) {
2957
+ const value = safeAreaTop ?? getRootSafeAreaTop();
2958
+ this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
2873
2959
  }
2874
2960
  /**
2875
2961
  * Updates safe-area overrides during dynamic state changes.
@@ -2969,11 +3055,38 @@ const Modal = class {
2969
3055
  */
2970
3056
  cleanupSafeAreaOverrides() {
2971
3057
  clearSafeAreaOverrides(this.el);
3058
+ this.unsubscribeRootSafeAreaTop?.();
3059
+ this.unsubscribeRootSafeAreaTop = undefined;
2972
3060
  // Remove internal sheet offset property
2973
3061
  this.el.style.removeProperty('--ion-modal-offset-top');
2974
3062
  const { contentEl } = this.findContentAndFooter();
2975
3063
  this.clearContentSafeAreaPadding(contentEl);
2976
3064
  }
3065
+ /**
3066
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
3067
+ * while presented. Anything needing no measurement goes on synchronously so
3068
+ * the modal is never painted without safe-area. The position-based
3069
+ * correction waits a frame for the layout pass it reads.
3070
+ */
3071
+ restoreSafeAreaOverrides() {
3072
+ this.setInitialSafeAreaOverrides();
3073
+ this.applyFullscreenSafeArea();
3074
+ helpers.raf(() => {
3075
+ // A dismiss or another move can land first, and a read before the enter
3076
+ // animation settles is not the rest position. `present()` redoes it.
3077
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
3078
+ return;
3079
+ }
3080
+ // A hidden subtree carries `display: none`, so there is no box and the
3081
+ // read would write the safe-area for a modal touching no edge. The
3082
+ // prediction applied above holds until the modal is shown again.
3083
+ const { width, height } = this.el.getBoundingClientRect();
3084
+ if (width === 0 && height === 0) {
3085
+ return;
3086
+ }
3087
+ this.updateSafeAreaOverrides();
3088
+ });
3089
+ }
2977
3090
  render() {
2978
3091
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
2979
3092
  const showHandle = handle !== false && isSheetModal;
@@ -2981,11 +3094,20 @@ const Modal = class {
2981
3094
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2982
3095
  const isHandleCycle = handleBehavior === 'cycle';
2983
3096
  const isSheetModalWithHandle = isSheetModal && showHandle;
2984
- return (index$3.h(index$3.Host, Object.assign({ key: 'bad33199a939bd1e289b3b3f936c676ba403224f', "no-router": true,
3097
+ return (index$3.h(index$3.Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
2985
3098
  // Allow the modal to be navigable when the handle is focusable
2986
- tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
3099
+ tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
2987
3100
  zIndex: `${20000 + this.overlayIndex}`,
2988
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, theme.getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), index$3.h("ion-backdrop", { key: 'd098688a65fb2d1befb255f0e59fd4c00b401092', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: '96cd2e59a7d1c0de7c9afb8f8d366367b09fbc93', class: "modal-shadow" }), index$3.h("div", Object.assign({ key: '882ccc39ce344a2c51d6508c11c3f40b26eaf2a7',
3101
+ }, class: {
3102
+ [mode]: true,
3103
+ ['modal-default']: !isCardModal && !isSheetModal,
3104
+ [`modal-card`]: isCardModal,
3105
+ [`modal-sheet`]: isSheetModal,
3106
+ [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
3107
+ 'overlay-hidden': true,
3108
+ [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3109
+ ...theme.getClassMap(this.cssClass),
3110
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$3.h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), index$3.h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
2989
3111
  /*
2990
3112
  role and aria-modal must be used on the
2991
3113
  same element. They must also be set inside the
@@ -2998,9 +3120,9 @@ const Modal = class {
2998
3120
  without the tabindex focus() would be a no-op and screen readers
2999
3121
  may not properly announce the dialog and its content when it opens.
3000
3122
  */
3001
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (index$3.h("button", { key: '714d9904fcc8105b21e2bb66cdc032bffd685d72', class: "modal-handle",
3123
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$3.h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
3002
3124
  // Prevents the handle from receiving keyboard focus when it does not cycle
3003
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '79dfbeb3fe5eee7dc3a243ad880d3f63184f3ab7', onSlotchange: this.onSlotChange }))));
3125
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
3004
3126
  }
3005
3127
  get el() { return index$3.getElement(this); }
3006
3128
  static get watchers() { return {