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
@@ -1,24 +1,25 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-tcQvqkiX.js';
5
- import { f as findClosestIonContent, i as isIonContent, d as disableContentScrollY, r as resetContentScrollY, a as findIonContent, p as printIonContentErrorMsg } from './index-MEDq2S8l.js';
6
- import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-FnPGymXL.js';
7
- import { e as clamp, g as getElementRoot, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-HEqiOzXb.js';
4
+ import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-C23AVPx9.js';
5
+ import { i as isIonContent, f as findRefresherInContent, a as findClosestIonContent, d as disableContentScrollY, r as resetContentScrollY, b as findIonContent, p as printIonContentErrorMsg } from './index-C1b9CLFg.js';
6
+ import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-BwNhx9NR.js';
7
+ import { g as getElementRoot, e as clamp, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-BSmc0nst.js';
8
8
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
9
9
  import { g as getCapacitor } from './capacitor-CFERIeaU.js';
10
- import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-Dg0q2_tJ.js';
11
- import { g as getClassMap } from './theme-DiVJyqlX.js';
12
- import { e as deepReady, w as waitForMount } from './index-B_dQk_WE.js';
13
- import { b as getIonMode } from './ionic-global-Cp_eT4sZ.js';
14
- import { KEYBOARD_DID_OPEN } from './keyboard-ywgs5efA.js';
15
- import { c as createAnimation } from './animation-DLJpuoEz.js';
10
+ import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, d as createTriggerController, B as BACKDROP, h as prepareOverlay, r as restoreRootFocusTrapAccessibility, j as cleanupRootFocusTrapAccessibility, k as setOverlayId, e as present, f as dismiss, g as eventMethod } from './overlays-DKE0DgvE.js';
11
+ import { g as getClassMap } from './theme-byZM6qHV.js';
12
+ import { e as deepReady, w as waitForMount } from './index-DnA_7Bnx.js';
13
+ import { b as getIonMode } from './ionic-global-ZXjCXKH0.js';
14
+ import { KEYBOARD_DID_OPEN } from './keyboard-Cj8mLJeq.js';
15
+ import { c as createAnimation } from './animation-BFNVlYum.js';
16
16
  import { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
17
- import { createGesture } from './index-CfgBF1SE.js';
17
+ import { createGesture } from './index-BmLuEdV7.js';
18
18
  import { w as win } from './index-ZjP4CjeZ.js';
19
- import './hardware-back-button-B93Gru0Y.js';
20
- import './gesture-controller-BTEOs1at.js';
21
- import './keyboard-CUw4ekVy.js';
19
+ import './dir-Dojwmvde.js';
20
+ import './hardware-back-button-DmkiRgOT.js';
21
+ import './gesture-controller-B_gJaBk0.js';
22
+ import './keyboard-DAF8GNJ9.js';
22
23
 
23
24
  var Style;
24
25
  (function (Style) {
@@ -29,7 +30,7 @@ var Style;
29
30
  const StatusBar = {
30
31
  getEngine() {
31
32
  const capacitor = getCapacitor();
32
- if (capacitor === null || capacitor === void 0 ? void 0 : capacitor.isPluginAvailable('StatusBar')) {
33
+ if (capacitor?.isPluginAvailable('StatusBar')) {
33
34
  return capacitor.Plugins.StatusBar;
34
35
  }
35
36
  return undefined;
@@ -127,6 +128,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
127
128
  StatusBar.setStyle({ style: defaultStyle });
128
129
  };
129
130
 
131
+ /**
132
+ * Swiping is only possible when the content is scrolled to the top, so that we
133
+ * do not interfere with scrolling, and never on content with a refresher.
134
+ *
135
+ * Note: We cannot solve the refresher case with gesture priority as the iOS
136
+ * native refresh gesture uses a scroll listener in addition to a gesture.
137
+ *
138
+ * Note: Do not use `getScrollElement` here because we need this to be a
139
+ * synchronous operation, and `getScrollElement` is asynchronous.
140
+ */
141
+ const canSwipeOnContent = (contentEl) => {
142
+ const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
143
+ const hasRefresherInContent = !!findRefresherInContent(contentEl);
144
+ return !hasRefresherInContent && scrollEl.scrollTop === 0;
145
+ };
130
146
  const handleCanDismiss = async (el, animation) => {
131
147
  /**
132
148
  * If canDismiss is not a function
@@ -257,7 +273,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
257
273
  let isOpen = false;
258
274
  let canDismissBlocksGesture = false;
259
275
  let contentEl = null;
260
- let scrollEl = null;
261
276
  const canDismissMaxStep = 0.2;
262
277
  let initialScrollY = true;
263
278
  let lastStep = 0;
@@ -280,12 +295,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
280
295
  return true;
281
296
  }
282
297
  /**
283
- * If we are swiping on the content,
284
- * swiping should only be possible if
285
- * the content is scrolled all the way
286
- * to the top so that we do not interfere
287
- * with scrolling.
288
- *
289
298
  * We cannot assume that the `ion-content`
290
299
  * target will remain consistent between
291
300
  * swipes. For example, when using
@@ -296,29 +305,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
296
305
  */
297
306
  contentEl = findClosestIonContent(target);
298
307
  if (contentEl) {
299
- /**
300
- * The card should never swipe to close
301
- * on the content with a refresher.
302
- * Note: We cannot solve this by making the
303
- * swipeToClose gesture have a higher priority
304
- * than the refresher gesture as the iOS native
305
- * refresh gesture uses a scroll listener in
306
- * addition to a gesture.
307
- *
308
- * Note: Do not use getScrollElement here
309
- * because we need this to be a synchronous
310
- * operation, and getScrollElement is
311
- * asynchronous.
312
- */
313
- if (isIonContent(contentEl)) {
314
- const root = getElementRoot(contentEl);
315
- scrollEl = root.querySelector('.inner-scroll');
316
- }
317
- else {
318
- scrollEl = contentEl;
319
- }
320
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
321
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
308
+ return canSwipeOnContent(contentEl);
322
309
  }
323
310
  /**
324
311
  * Card should be swipeable on all
@@ -331,14 +318,13 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
331
318
  return false;
332
319
  };
333
320
  const onStart = (detail) => {
334
- var _a;
335
321
  const { deltaY } = detail;
336
322
  /**
337
323
  * Firefox automatically selects the header text during drag
338
324
  * due to the focusable wrapper (tabindex="-1"). Remove any
339
325
  * selection that may have occurred.
340
326
  */
341
- (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
327
+ window.getSelection()?.removeAllRanges();
342
328
  /**
343
329
  * Get the initial scrollY value so
344
330
  * that we can correctly reset the scrollY
@@ -491,17 +477,30 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
491
477
  * check canDismiss. 25% was chosen
492
478
  * to avoid accidental swipes.
493
479
  */
494
- if (isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4) {
480
+ const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
481
+ if (isAttemptingCanDismiss) {
495
482
  handleCanDismiss(el, animation);
496
483
  }
497
484
  else if (shouldComplete) {
498
485
  onDismiss();
499
486
  }
487
+ /**
488
+ * `shouldComplete` is not enough on its own, since it is always `false`
489
+ * when canDismiss blocks the gesture. `canDismiss: false` blocks it and
490
+ * never dismisses, because `handleCanDismiss` returns early when
491
+ * canDismiss is not a function. A canDismiss function dismisses through
492
+ * `handleCanDismiss`, which awaits the callback, so the outcome is not
493
+ * known when this event is emitted.
494
+ */
495
+ const isDismissing = isAttemptingDismissWithCanDismiss
496
+ ? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
497
+ : shouldComplete;
500
498
  const eventDetail = {
501
499
  currentY: detail.currentY,
502
500
  deltaY: detail.deltaY,
503
501
  velocityY: detail.velocityY,
504
502
  progress: calculateProgress(el, detail.deltaY),
503
+ isDismissing,
505
504
  snapBreakpoint: shouldComplete ? 0 : 1,
506
505
  };
507
506
  onDragEnd(eventDetail);
@@ -639,7 +638,7 @@ const iosEnterAnimation = (baseEl, opts) => {
639
638
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
640
639
  // The content animation is only added if scrolling is enabled for
641
640
  // all the breakpoints.
642
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
641
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
643
642
  const baseAnimation = createAnimation('entering-base')
644
643
  .addElement(baseEl)
645
644
  .easing('cubic-bezier(0.32,0.72,0,1)')
@@ -972,7 +971,7 @@ const mdEnterAnimation = (baseEl, opts) => {
972
971
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
973
972
  // The content animation is only added if scrolling is enabled for
974
973
  // all the breakpoints.
975
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
974
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
976
975
  const baseAnimation = createAnimation()
977
976
  .addElement(baseEl)
978
977
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
@@ -1031,6 +1030,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1031
1030
  ],
1032
1031
  };
1033
1032
  const contentEl = baseEl.querySelector('ion-content');
1033
+ // Cache the initial value so the gesture restores it instead of forcing scrolling on.
1034
+ const initialContentScrollY = contentEl?.scrollY ?? true;
1034
1035
  const height = wrapperEl.clientHeight;
1035
1036
  let currentBreakpoint = initialBreakpoint;
1036
1037
  let offset = 0;
@@ -1096,9 +1097,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1096
1097
  cachedFooterEl.style.removeProperty('height');
1097
1098
  cachedFooterEl.style.removeProperty('top');
1098
1099
  cachedFooterEl.style.removeProperty('left');
1099
- page === null || page === void 0 ? void 0 : page.style.removeProperty('padding-bottom');
1100
+ page?.style.removeProperty('padding-bottom');
1100
1101
  // Move to page
1101
- page === null || page === void 0 ? void 0 : page.appendChild(cachedFooterEl);
1102
+ page?.appendChild(cachedFooterEl);
1102
1103
  });
1103
1104
  }
1104
1105
  else {
@@ -1142,7 +1143,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1142
1143
  // when the footer is positioned absolutely. This has to be done before we
1143
1144
  // make the footer absolutely positioned or we may accidentally cause the
1144
1145
  // sheet to scroll.
1145
- page === null || page === void 0 ? void 0 : page.style.setProperty('padding-bottom', `${footerHeights}px`);
1146
+ page?.style.setProperty('padding-bottom', `${footerHeights}px`);
1146
1147
  // Apply positioning styles to keep footer at bottom
1147
1148
  cachedFooterEl.classList.add('modal-footer-moving');
1148
1149
  // Apply our preserved styles to pin the footer
@@ -1167,7 +1168,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1167
1168
  if (wrapperAnimation && backdropAnimation) {
1168
1169
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1169
1170
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1170
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1171
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1171
1172
  animation.progressStart(true, 1 - currentBreakpoint);
1172
1173
  /**
1173
1174
  * If backdrop is not enabled, then content
@@ -1191,9 +1192,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1191
1192
  }
1192
1193
  const canStart = (detail) => {
1193
1194
  /**
1194
- * If we are swiping on the content, swiping should only be possible if the content
1195
- * is scrolled all the way to the top so that we do not interfere with scrolling.
1196
- *
1197
1195
  * We cannot assume that the `ion-content` target will remain consistent between swipes.
1198
1196
  * For example, when using ion-nav within a modal it is possible to swipe, push a view,
1199
1197
  * and then swipe again. The target content will not be the same between swipes.
@@ -1201,37 +1199,21 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1201
1199
  const contentEl = findClosestIonContent(detail.event.target);
1202
1200
  currentBreakpoint = getCurrentBreakpoint();
1203
1201
  /**
1204
- * If `expandToScroll` is disabled, we should not allow the swipe gesture
1205
- * to start if the content is not scrolled to the top.
1202
+ * Upwards swipes on the content cannot move the sheet anyway, so this only
1203
+ * blocks swiping the sheet down from the content.
1206
1204
  */
1207
- if (!expandToScroll && contentEl) {
1208
- const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1209
- return scrollEl.scrollTop === 0;
1210
- }
1211
- if (currentBreakpoint === 1 && contentEl) {
1212
- /**
1213
- * The modal should never swipe to close on the content with a refresher.
1214
- * Note 1: We cannot solve this by making this gesture have a higher priority than
1215
- * the refresher gesture as the iOS native refresh gesture uses a scroll listener in
1216
- * addition to a gesture.
1217
- *
1218
- * Note 2: Do not use getScrollElement here because we need this to be a synchronous
1219
- * operation, and getScrollElement is asynchronous.
1220
- */
1221
- const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1222
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
1223
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
1205
+ if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
1206
+ return canSwipeOnContent(contentEl);
1224
1207
  }
1225
1208
  return true;
1226
1209
  };
1227
1210
  const onStart = (detail) => {
1228
- var _a;
1229
1211
  /**
1230
1212
  * Firefox automatically selects the header text during drag
1231
1213
  * due to the focusable wrapper (tabindex="-1"). Remove any
1232
1214
  * selection that may have occurred.
1233
1215
  */
1234
- (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
1216
+ window.getSelection()?.removeAllRanges();
1235
1217
  /**
1236
1218
  * If canDismiss is anything other than `true`
1237
1219
  * then users should be able to swipe down
@@ -1359,12 +1341,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1359
1341
  };
1360
1342
  const onEnd = (detail) => {
1361
1343
  const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1344
+ /**
1345
+ * `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
1346
+ * snaps to 0 but never dismisses, since `handleCanDismiss` returns early
1347
+ * when canDismiss is not a function. A canDismiss function dismisses
1348
+ * through `handleCanDismiss`, which awaits the callback, so the outcome
1349
+ * is not known when this event is emitted.
1350
+ */
1351
+ const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
1352
+ const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
1362
1353
  const eventDetail = {
1363
1354
  currentY: detail.currentY,
1364
1355
  deltaY: detail.deltaY,
1365
1356
  velocityY: detail.velocityY,
1366
1357
  progress: calculateProgress(detail.currentY),
1367
1358
  snapBreakpoint,
1359
+ isDismissing,
1368
1360
  };
1369
1361
  /**
1370
1362
  * If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
@@ -1380,7 +1372,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1380
1372
  * swap to moving on drag and if we don't swap back here then the footer will get stuck.
1381
1373
  */
1382
1374
  swapFooterPosition('stationary');
1383
- onDragEnd(eventDetail);
1375
+ /**
1376
+ * The sheet does not move in this case, so the gesture
1377
+ * never dismisses the modal.
1378
+ */
1379
+ onDragEnd({ ...eventDetail, isDismissing: false });
1384
1380
  return;
1385
1381
  }
1386
1382
  moveSheetToBreakpoint({
@@ -1453,14 +1449,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1453
1449
  onDismiss();
1454
1450
  }
1455
1451
  /**
1456
- * Enables scrolling immediately if the sheet is about to fully expand
1457
- * or if it allows scrolling at any breakpoint. Without this, there would
1452
+ * Restores the content's scroll setting immediately if the sheet is about to
1453
+ * fully expand or if it allows scrolling at any breakpoint. Without this, there would
1458
1454
  * be a ~500ms delay while the modal animation completes, causing a
1459
1455
  * noticeable lag. Native iOS allows scrolling as soon as the gesture is
1460
1456
  * released, so we align with that behavior.
1461
1457
  */
1462
1458
  if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
1463
- contentEl.scrollY = true;
1459
+ contentEl.scrollY = initialContentScrollY;
1464
1460
  }
1465
1461
  /**
1466
1462
  * If expandToScroll is disabled and we're animating
@@ -1495,7 +1491,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1495
1491
  raf(() => {
1496
1492
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1497
1493
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1498
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1494
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1499
1495
  animation.progressStart(true, 1 - snapToBreakpoint);
1500
1496
  currentBreakpoint = snapToBreakpoint;
1501
1497
  onBreakpointChange(currentBreakpoint);
@@ -1642,9 +1638,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1642
1638
  onMove,
1643
1639
  onEnd,
1644
1640
  });
1641
+ /**
1642
+ * Puts the content back the way the app declared it. A sheet can dismiss
1643
+ * without going through moveSheetToBreakpoint, and an inline modal reuses
1644
+ * the same element on the next present.
1645
+ */
1646
+ const resetContentScroll = () => {
1647
+ if (contentEl) {
1648
+ contentEl.scrollY = initialContentScrollY;
1649
+ }
1650
+ };
1645
1651
  return {
1646
1652
  gesture,
1647
1653
  moveSheetToBreakpoint,
1654
+ resetContentScroll,
1648
1655
  };
1649
1656
  };
1650
1657
 
@@ -1694,8 +1701,8 @@ const getRootSafeAreaTop = () => {
1694
1701
  if (cachedRootSafeAreaTop !== null) {
1695
1702
  return cachedRootSafeAreaTop;
1696
1703
  }
1697
- const doc = win === null || win === void 0 ? void 0 : win.document;
1698
- if (!(doc === null || doc === void 0 ? void 0 : doc.body)) {
1704
+ const doc = win?.document;
1705
+ if (!doc?.body) {
1699
1706
  return 0;
1700
1707
  }
1701
1708
  const el = doc.createElement('div');
@@ -1714,6 +1721,41 @@ const getRootSafeAreaTop = () => {
1714
1721
  }
1715
1722
  return value;
1716
1723
  };
1724
+ /**
1725
+ * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1726
+ * event and no window resize covers. The probe's height tracks the variable, so
1727
+ * a change to it becomes a size change the observer can see.
1728
+ */
1729
+ const onRootSafeAreaTopChange = (callback) => {
1730
+ const doc = win?.document;
1731
+ if (!doc?.body || typeof ResizeObserver === 'undefined') {
1732
+ return () => undefined;
1733
+ }
1734
+ const probe = doc.createElement('div');
1735
+ probe.style.cssText =
1736
+ 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1737
+ 'height:var(--ion-safe-area-top,0px);';
1738
+ doc.body.appendChild(probe);
1739
+ /**
1740
+ * Seeded with the value the caller has already applied, so a change that
1741
+ * lands before the observer's first delivery still gets reported. Comparing
1742
+ * against an unset value instead would consume that first delivery and treat
1743
+ * the new inset as the baseline.
1744
+ */
1745
+ let lastHeight = getRootSafeAreaTop();
1746
+ const observer = new ResizeObserver((entries) => {
1747
+ const { height } = entries[0].contentRect;
1748
+ if (height !== lastHeight) {
1749
+ lastHeight = height;
1750
+ callback(height);
1751
+ }
1752
+ });
1753
+ observer.observe(probe);
1754
+ return () => {
1755
+ observer.disconnect();
1756
+ probe.remove();
1757
+ };
1758
+ };
1717
1759
  /**
1718
1760
  * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1719
1761
  * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
@@ -1798,10 +1840,9 @@ const getInitialSafeAreaConfig = (context) => {
1798
1840
  * @returns SafeAreaConfig based on position
1799
1841
  */
1800
1842
  const getPositionBasedSafeAreaConfig = (wrapperEl) => {
1801
- var _a, _b;
1802
1843
  const rect = wrapperEl.getBoundingClientRect();
1803
- const vh = (_a = win === null || win === void 0 ? void 0 : win.innerHeight) !== null && _a !== void 0 ? _a : 0;
1804
- const vw = (_b = win === null || win === void 0 ? void 0 : win.innerWidth) !== null && _b !== void 0 ? _b : 0;
1844
+ const vh = win?.innerHeight ?? 0;
1845
+ const vw = win?.innerWidth ?? 0;
1805
1846
  // Only apply safe-area to sides where modal overlaps with screen edge
1806
1847
  return {
1807
1848
  top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
@@ -1862,6 +1903,9 @@ const Modal = class {
1862
1903
  this.inline = false;
1863
1904
  // Whether or not modal is being dismissed via gesture
1864
1905
  this.gestureAnimationDismissing = false;
1906
+ // True from the first safe-area write in `present()` until the enter
1907
+ // animation settles. A position-based read in that window is not the rest position.
1908
+ this.isPresenting = false;
1865
1909
  this.presented = false;
1866
1910
  /** @internal */
1867
1911
  this.hasController = false;
@@ -1896,13 +1940,20 @@ const Modal = class {
1896
1940
  /**
1897
1941
  * The interaction behavior for the sheet modal when the handle is pressed.
1898
1942
  *
1899
- * Defaults to `"none"`, which means the modal will not change size or position when the handle is pressed.
1900
- * Set to `"cycle"` to let the modal cycle between available breakpoints when pressed.
1943
+ * Handle behavior is unavailable when the `handle` property is set to
1944
+ * `false` or when the `breakpoints` property is not set (using a
1945
+ * fullscreen or card modal).
1946
+ *
1947
+ * Set to `"cycle"` to make the handle focusable and let the sheet modal
1948
+ * cycle between available breakpoints when pressed. This keeps the sheet
1949
+ * operable with assistive technology.
1950
+ *
1951
+ * Set to `"none"` to make the handle purely decorative when pressed and
1952
+ * removed from the tab order.
1901
1953
  *
1902
- * Handle behavior is unavailable when the `handle` property is set to `false` or
1903
- * when the `breakpoints` property is not set (using a fullscreen or card modal).
1954
+ * Defaults to `"cycle"`.
1904
1955
  */
1905
- this.handleBehavior = 'none';
1956
+ this.handleBehavior = 'cycle';
1906
1957
  /**
1907
1958
  * If `true`, the modal will be dismissed when the backdrop is clicked.
1908
1959
  */
@@ -2010,7 +2061,6 @@ const Modal = class {
2010
2061
  * if it exists and is focusable, otherwise let the focus trap handle it.
2011
2062
  */
2012
2063
  this.onModalFocus = (ev) => {
2013
- var _a;
2014
2064
  const { dragHandleEl, el } = this;
2015
2065
  /**
2016
2066
  * Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
@@ -2018,7 +2068,7 @@ const Modal = class {
2018
2068
  * shadowRoot's activeElement is null only when the host was focused directly,
2019
2069
  * so redirect to the handle only then and leave present()'s wrapper focus intact.
2020
2070
  */
2021
- if (ev.target === el && ((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2071
+ if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2022
2072
  dragHandleEl.focus();
2023
2073
  }
2024
2074
  };
@@ -2092,6 +2142,17 @@ const Modal = class {
2092
2142
  const { el } = this;
2093
2143
  prepareOverlay(el);
2094
2144
  this.triggerChanged();
2145
+ // A disconnect tears down state this presentation still needs and cannot
2146
+ // tell a re-insert from a removal, so put it back.
2147
+ if (this.presented || this.isPresenting) {
2148
+ this.restoreSafeAreaOverrides();
2149
+ }
2150
+ // A relocation from `willPresent` reaches these before `present()` has
2151
+ // applied the lock, so they apply it instead. Both are idempotent.
2152
+ if (this.presented) {
2153
+ restoreRootFocusTrapAccessibility(el);
2154
+ this.initParentRemovalObserver();
2155
+ }
2095
2156
  }
2096
2157
  disconnectedCallback() {
2097
2158
  this.triggerController.removeClickListener();
@@ -2100,9 +2161,12 @@ const Modal = class {
2100
2161
  // Also called in dismiss() — intentional dual cleanup covers both
2101
2162
  // dismiss-then-remove and direct DOM removal without dismiss.
2102
2163
  this.cleanupSafeAreaOverrides();
2164
+ // Clean up aria-hidden if removed without dismiss() being called
2165
+ if (this.presented) {
2166
+ cleanupRootFocusTrapAccessibility();
2167
+ }
2103
2168
  }
2104
2169
  componentWillLoad() {
2105
- var _a;
2106
2170
  const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
2107
2171
  const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
2108
2172
  const attributesToInherit = ['aria-label', 'role'];
@@ -2137,7 +2201,10 @@ const Modal = class {
2137
2201
  * htmlAttributes wins, but that's not a pattern that we recommend.
2138
2202
  * The only time you'd need htmlAttributes is when using modalController.
2139
2203
  */
2140
- this.inheritedAttributes = Object.assign(Object.assign({}, this.inheritedAttributes), { [attribute]: htmlAttributes[attribute] });
2204
+ this.inheritedAttributes = {
2205
+ ...this.inheritedAttributes,
2206
+ [attribute]: htmlAttributes[attribute],
2207
+ };
2141
2208
  delete htmlAttributes[attribute];
2142
2209
  }
2143
2210
  });
@@ -2148,7 +2215,7 @@ const Modal = class {
2148
2215
  if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
2149
2216
  printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2150
2217
  }
2151
- if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
2218
+ if (!this.htmlAttributes?.id) {
2152
2219
  setOverlayId(this.el);
2153
2220
  }
2154
2221
  }
@@ -2263,25 +2330,33 @@ const Modal = class {
2263
2330
  // Recalculate isSheetModal before safe-area setup because framework
2264
2331
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
2265
2332
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
2266
- // Set initial safe-area overrides before animation
2267
- this.setInitialSafeAreaOverrides();
2333
+ this.isPresenting = true;
2268
2334
  const hasCardModal = presentingElement !== undefined;
2269
- /**
2270
- * We need to change the status bar at the
2271
- * start of the animation so that it completes
2272
- * by the time the card animation is done.
2273
- */
2274
- if (hasCardModal && getIonMode(this) === 'ios') {
2275
- // Cache the original status bar color before the modal is presented
2276
- this.statusBarStyle = await StatusBar.getStyle();
2277
- setCardStatusBarDark();
2335
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
2336
+ // the position-based correction for the life of this instance.
2337
+ try {
2338
+ // Set initial safe-area overrides before animation
2339
+ this.setInitialSafeAreaOverrides();
2340
+ /**
2341
+ * We need to change the status bar at the
2342
+ * start of the animation so that it completes
2343
+ * by the time the card animation is done.
2344
+ */
2345
+ if (hasCardModal && getIonMode(this) === 'ios') {
2346
+ // Cache the original status bar color before the modal is presented
2347
+ this.statusBarStyle = await StatusBar.getStyle();
2348
+ setCardStatusBarDark();
2349
+ }
2350
+ await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2351
+ presentingEl: presentingElement,
2352
+ currentBreakpoint: this.initialBreakpoint,
2353
+ backdropBreakpoint: this.backdropBreakpoint,
2354
+ expandToScroll: this.expandToScroll,
2355
+ });
2356
+ }
2357
+ finally {
2358
+ this.isPresenting = false;
2278
2359
  }
2279
- await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2280
- presentingEl: presentingElement,
2281
- currentBreakpoint: this.initialBreakpoint,
2282
- backdropBreakpoint: this.backdropBreakpoint,
2283
- expandToScroll: this.expandToScroll,
2284
- });
2285
2360
  // Update safe-area based on actual position after animation
2286
2361
  this.updateSafeAreaOverrides();
2287
2362
  // Apply fullscreen safe-area padding if needed
@@ -2330,7 +2405,6 @@ const Modal = class {
2330
2405
  unlock();
2331
2406
  }
2332
2407
  initSwipeToClose() {
2333
- var _a;
2334
2408
  if (getIonMode(this) !== 'ios') {
2335
2409
  return;
2336
2410
  }
@@ -2348,7 +2422,7 @@ const Modal = class {
2348
2422
  printIonContentErrorMsg(el);
2349
2423
  return;
2350
2424
  }
2351
- const statusBarStyle = (_a = this.statusBarStyle) !== null && _a !== void 0 ? _a : Style.Default;
2425
+ const statusBarStyle = this.statusBarStyle ?? Style.Default;
2352
2426
  this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2353
2427
  this.gesture.enable(true);
2354
2428
  }
@@ -2365,7 +2439,7 @@ const Modal = class {
2365
2439
  expandToScroll: this.expandToScroll,
2366
2440
  }));
2367
2441
  ani.progressStart(true, 1);
2368
- 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) => {
2442
+ const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
2369
2443
  if (this.currentBreakpoint !== breakpoint) {
2370
2444
  this.currentBreakpoint = breakpoint;
2371
2445
  this.ionBreakpointDidChange.emit({ breakpoint });
@@ -2373,6 +2447,7 @@ const Modal = class {
2373
2447
  }, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2374
2448
  this.gesture = gesture;
2375
2449
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2450
+ this.resetSheetContentScroll = resetContentScroll;
2376
2451
  this.gesture.enable(true);
2377
2452
  /**
2378
2453
  * When backdrop interaction is allowed, nested router outlets from child routes
@@ -2390,7 +2465,6 @@ const Modal = class {
2390
2465
  * passthrough on child route page wrappers and nested router outlets.
2391
2466
  */
2392
2467
  setupChildRoutePassthrough() {
2393
- var _a;
2394
2468
  // Cache the page parent for cleanup
2395
2469
  this.cachedPageParent = this.getOriginalPageParent();
2396
2470
  const pageParent = this.cachedPageParent;
@@ -2398,14 +2472,11 @@ const Modal = class {
2398
2472
  if (!pageParent || pageParent.tagName === 'ION-APP') {
2399
2473
  return;
2400
2474
  }
2401
- const hasVisibleContent = Array.from(pageParent.children).some((child) => {
2402
- var _a;
2403
- return child !== this.el &&
2404
- !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2405
- child.tagName !== 'TEMPLATE' &&
2406
- child.tagName !== 'SLOT' &&
2407
- !(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
2408
- });
2475
+ const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
2476
+ !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2477
+ child.tagName !== 'TEMPLATE' &&
2478
+ child.tagName !== 'SLOT' &&
2479
+ !(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
2409
2480
  if (hasVisibleContent) {
2410
2481
  return;
2411
2482
  }
@@ -2413,7 +2484,7 @@ const Modal = class {
2413
2484
  pageParent.classList.add('ion-page-overlay-passthrough');
2414
2485
  // Also make nested router outlets passthrough
2415
2486
  const routerOutlet = pageParent.parentElement;
2416
- 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') {
2487
+ if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
2417
2488
  routerOutlet.style.setProperty('pointer-events', 'none');
2418
2489
  routerOutlet.setAttribute('data-overlay-passthrough', 'true');
2419
2490
  }
@@ -2441,7 +2512,7 @@ const Modal = class {
2441
2512
  }
2442
2513
  pageParent.classList.remove('ion-page-overlay-passthrough');
2443
2514
  const routerOutlet = pageParent.parentElement;
2444
- if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
2515
+ if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
2445
2516
  routerOutlet.style.removeProperty('pointer-events');
2446
2517
  routerOutlet.removeAttribute('data-overlay-passthrough');
2447
2518
  }
@@ -2504,7 +2575,6 @@ const Modal = class {
2504
2575
  * For example, `cancel` or `backdrop`.
2505
2576
  */
2506
2577
  async dismiss(data, role) {
2507
- var _a;
2508
2578
  if (this.gestureAnimationDismissing && role !== GESTURE) {
2509
2579
  return false;
2510
2580
  }
@@ -2549,7 +2619,7 @@ const Modal = class {
2549
2619
  }
2550
2620
  const dismissed = await dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2551
2621
  presentingEl: presentingElement,
2552
- currentBreakpoint: (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : this.initialBreakpoint,
2622
+ currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
2553
2623
  backdropBreakpoint: this.backdropBreakpoint,
2554
2624
  expandToScroll: this.expandToScroll,
2555
2625
  });
@@ -2563,6 +2633,13 @@ const Modal = class {
2563
2633
  if (this.gesture) {
2564
2634
  this.gesture.destroy();
2565
2635
  }
2636
+ /**
2637
+ * The sheet gesture turns content scrolling off while the sheet sits below
2638
+ * the top breakpoint. Inline modals reuse the same content on the next
2639
+ * present, so hand it back before the gesture goes away.
2640
+ */
2641
+ this.resetSheetContentScroll?.();
2642
+ this.resetSheetContentScroll = undefined;
2566
2643
  this.cleanupViewTransitionListener();
2567
2644
  this.cleanupParentRemovalObserver();
2568
2645
  this.cleanupSafeAreaOverrides();
@@ -2737,7 +2814,7 @@ const Modal = class {
2737
2814
  wrapperEl.style.transform = 'translateY(0vh)';
2738
2815
  wrapperEl.style.opacity = '1';
2739
2816
  }
2740
- if ((presentingElement === null || presentingElement === void 0 ? void 0 : presentingElement.tagName) === 'ION-MODAL') {
2817
+ if (presentingElement?.tagName === 'ION-MODAL') {
2741
2818
  const isPortrait = window.innerWidth < 768;
2742
2819
  if (isPortrait) {
2743
2820
  const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
@@ -2753,7 +2830,7 @@ const Modal = class {
2753
2830
  }
2754
2831
  async dismissNestedModals() {
2755
2832
  const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
2756
- nestedModals === null || nestedModals === void 0 ? void 0 : nestedModals.forEach(async (modal) => {
2833
+ nestedModals?.forEach(async (modal) => {
2757
2834
  await modal.dismiss(undefined, 'parent-dismissed');
2758
2835
  });
2759
2836
  }
@@ -2781,15 +2858,17 @@ const Modal = class {
2781
2858
  this.cachedOriginalParent.tagName === 'ION-APP') {
2782
2859
  return;
2783
2860
  }
2861
+ // Both `present()` and a reconnect call this, so drop any existing
2862
+ // observer. Below the guards, so a call that bails cannot leave none.
2863
+ this.cleanupParentRemovalObserver();
2784
2864
  this.parentRemovalObserver = new MutationObserver((mutations) => {
2785
2865
  mutations.forEach((mutation) => {
2786
2866
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
2787
2867
  // Check if our cached original parent was removed
2788
2868
  const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
2789
- var _a, _b;
2790
2869
  const isDirectMatch = node === this.cachedOriginalParent;
2791
2870
  const isContainedMatch = this.cachedOriginalParent
2792
- ? (_b = (_a = node).contains) === null || _b === void 0 ? void 0 : _b.call(_a, this.cachedOriginalParent)
2871
+ ? node.contains?.(this.cachedOriginalParent)
2793
2872
  : false;
2794
2873
  return isDirectMatch || isContainedMatch;
2795
2874
  });
@@ -2811,8 +2890,7 @@ const Modal = class {
2811
2890
  });
2812
2891
  }
2813
2892
  cleanupParentRemovalObserver() {
2814
- var _a;
2815
- (_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
2893
+ this.parentRemovalObserver?.disconnect();
2816
2894
  this.parentRemovalObserver = undefined;
2817
2895
  }
2818
2896
  onDragStart() {
@@ -2852,22 +2930,30 @@ const Modal = class {
2852
2930
  * sheets to prevent header content from getting double-offset padding).
2853
2931
  */
2854
2932
  setInitialSafeAreaOverrides() {
2855
- const context = Object.assign(Object.assign({}, this.getSafeAreaContext()), { hasCustomDimensions: hasCustomModalDimensions(this.el) });
2933
+ const context = {
2934
+ ...this.getSafeAreaContext(),
2935
+ hasCustomDimensions: hasCustomModalDimensions(this.el),
2936
+ };
2856
2937
  const safeAreaConfig = getInitialSafeAreaConfig(context);
2857
2938
  applySafeAreaOverrides(this.el, safeAreaConfig);
2858
2939
  // Set the internal offset property with the resolved root safe-area-top value
2859
2940
  if (context.isSheetModal) {
2860
2941
  this.updateSheetOffsetTop();
2942
+ // A restore after a DOM move runs this a second time for the same
2943
+ // modal, so drop the previous subscription rather than stacking one.
2944
+ this.unsubscribeRootSafeAreaTop?.();
2945
+ this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
2861
2946
  }
2862
2947
  }
2863
2948
  /**
2864
- * Resolves the current root --ion-safe-area-top value and sets the
2865
- * internal --ion-modal-offset-top property on the host element.
2866
- * Called on present and on resize (e.g., device rotation changes safe-area).
2949
+ * Sets the internal --ion-modal-offset-top property on the host element,
2950
+ * resolving the current root --ion-safe-area-top when no value is given.
2951
+ * Called on present, on resize (e.g., device rotation changes safe-area),
2952
+ * and whenever the root safe-area value itself changes.
2867
2953
  */
2868
- updateSheetOffsetTop() {
2869
- const safeAreaTop = getRootSafeAreaTop();
2870
- this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`);
2954
+ updateSheetOffsetTop(safeAreaTop) {
2955
+ const value = safeAreaTop ?? getRootSafeAreaTop();
2956
+ this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
2871
2957
  }
2872
2958
  /**
2873
2959
  * Updates safe-area overrides during dynamic state changes.
@@ -2967,11 +3053,38 @@ const Modal = class {
2967
3053
  */
2968
3054
  cleanupSafeAreaOverrides() {
2969
3055
  clearSafeAreaOverrides(this.el);
3056
+ this.unsubscribeRootSafeAreaTop?.();
3057
+ this.unsubscribeRootSafeAreaTop = undefined;
2970
3058
  // Remove internal sheet offset property
2971
3059
  this.el.style.removeProperty('--ion-modal-offset-top');
2972
3060
  const { contentEl } = this.findContentAndFooter();
2973
3061
  this.clearContentSafeAreaPadding(contentEl);
2974
3062
  }
3063
+ /**
3064
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
3065
+ * while presented. Anything needing no measurement goes on synchronously so
3066
+ * the modal is never painted without safe-area. The position-based
3067
+ * correction waits a frame for the layout pass it reads.
3068
+ */
3069
+ restoreSafeAreaOverrides() {
3070
+ this.setInitialSafeAreaOverrides();
3071
+ this.applyFullscreenSafeArea();
3072
+ raf(() => {
3073
+ // A dismiss or another move can land first, and a read before the enter
3074
+ // animation settles is not the rest position. `present()` redoes it.
3075
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
3076
+ return;
3077
+ }
3078
+ // A hidden subtree carries `display: none`, so there is no box and the
3079
+ // read would write the safe-area for a modal touching no edge. The
3080
+ // prediction applied above holds until the modal is shown again.
3081
+ const { width, height } = this.el.getBoundingClientRect();
3082
+ if (width === 0 && height === 0) {
3083
+ return;
3084
+ }
3085
+ this.updateSafeAreaOverrides();
3086
+ });
3087
+ }
2975
3088
  render() {
2976
3089
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
2977
3090
  const showHandle = handle !== false && isSheetModal;
@@ -2979,11 +3092,20 @@ const Modal = class {
2979
3092
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2980
3093
  const isHandleCycle = handleBehavior === 'cycle';
2981
3094
  const isSheetModalWithHandle = isSheetModal && showHandle;
2982
- return (h(Host, Object.assign({ key: 'bad33199a939bd1e289b3b3f936c676ba403224f', "no-router": true,
3095
+ return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
2983
3096
  // Allow the modal to be navigable when the handle is focusable
2984
- tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
3097
+ tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
2985
3098
  zIndex: `${20000 + this.overlayIndex}`,
2986
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: 'd098688a65fb2d1befb255f0e59fd4c00b401092', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '96cd2e59a7d1c0de7c9afb8f8d366367b09fbc93', class: "modal-shadow" }), h("div", Object.assign({ key: '882ccc39ce344a2c51d6508c11c3f40b26eaf2a7',
3099
+ }, class: {
3100
+ [mode]: true,
3101
+ ['modal-default']: !isCardModal && !isSheetModal,
3102
+ [`modal-card`]: isCardModal,
3103
+ [`modal-sheet`]: isSheetModal,
3104
+ [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
3105
+ 'overlay-hidden': true,
3106
+ [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3107
+ ...getClassMap(this.cssClass),
3108
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
2987
3109
  /*
2988
3110
  role and aria-modal must be used on the
2989
3111
  same element. They must also be set inside the
@@ -2996,9 +3118,9 @@ const Modal = class {
2996
3118
  without the tabindex focus() would be a no-op and screen readers
2997
3119
  may not properly announce the dialog and its content when it opens.
2998
3120
  */
2999
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '714d9904fcc8105b21e2bb66cdc032bffd685d72', class: "modal-handle",
3121
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
3000
3122
  // Prevents the handle from receiving keyboard focus when it does not cycle
3001
- 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) })), h("slot", { key: '79dfbeb3fe5eee7dc3a243ad880d3f63184f3ab7', onSlotchange: this.onSlotChange }))));
3123
+ 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) })), h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
3002
3124
  }
3003
3125
  get el() { return getElement(this); }
3004
3126
  static get watchers() { return {