voyager-ionic-core 8.8.12 → 9.0.1

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 (812) 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-B4lxwJ8N.js +4 -0
  102. package/components/{p-rCa2eL0j.js → p-BF48Oc0v.js} +1 -1
  103. package/components/p-BJr2B5hZ.js +4 -0
  104. package/components/p-BMPN55of.js +4 -0
  105. package/components/p-BNBnVi_1.js +4 -0
  106. package/components/{p-C4t5ymfq.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-BWoa-cki.js +4 -0
  110. package/components/p-BYJRZKHa.js +4 -0
  111. package/components/p-B_gJaBk0.js +4 -0
  112. package/components/p-BgkOsq-d.js +4 -0
  113. package/components/p-BhamHSw3.js +4 -0
  114. package/components/p-Bi-it1EH.js +4 -0
  115. package/components/p-C-NbvXu4.js +4 -0
  116. package/components/p-C0493tbX.js +4 -0
  117. package/components/p-C09TXohi.js +4 -0
  118. package/components/p-C4VpVfrJ.js +4 -0
  119. package/components/p-CEW4RXZO.js +4 -0
  120. package/components/p-CG_zZq_I.js +4 -0
  121. package/components/{p-B9jFTlwE.js → p-CJgnoKcN.js} +1 -1
  122. package/components/p-CMRYD_yR.js +4 -0
  123. package/components/{p-lE_JGpHD.js → p-CNLioZ3B.js} +1 -1
  124. package/components/{p--JUspHvy.js → p-COO0eJOA.js} +1 -1
  125. package/components/p-CWAks_S_.js +4 -0
  126. package/{dist/ionic/p-KjNvRoEp.js → components/p-Cd1WaN-0.js} +1 -1
  127. package/components/p-CqbGBmqb.js +4 -0
  128. package/components/p-CrAKlX71.js +4 -0
  129. package/components/p-Cw6WocLJ.js +4 -0
  130. package/components/p-D0YpjgON.js +4 -0
  131. package/components/{p-BirPFsRD.js → p-D5w_FlVa.js} +1 -1
  132. package/components/p-D7-vHX0A.js +4 -0
  133. package/components/p-D7wDJdFn.js +4 -0
  134. package/components/p-DFLJvuRK.js +4 -0
  135. package/components/p-DGPjJNOU.js +4 -0
  136. package/components/p-DJR0R0e1.js +4 -0
  137. package/components/p-DL13ieTa.js +4 -0
  138. package/components/{p-DqLB8yFQ.js → p-DM1gJSMP.js} +1 -1
  139. package/components/p-DMBiAyOR.js +4 -0
  140. package/components/p-DWCzVL3Y.js +4 -0
  141. package/components/p-DZRZic9C.js +4 -0
  142. package/components/{p-DNQI6d-L.js → p-DhNuxvJH.js} +1 -1
  143. package/components/p-DiuOa1vw.js +4 -0
  144. package/components/p-Dj40C8gm.js +4 -0
  145. package/components/p-Djmz-ssp.js +4 -0
  146. package/components/p-DnBNYc7u.js +4 -0
  147. package/components/p-DngGb-NV.js +4 -0
  148. package/components/p-Dojwmvde.js +4 -0
  149. package/components/p-DwSXbQSz.js +4 -0
  150. package/components/p-DxhHlJln.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/{data-DLTUw-KF.js → format-bHU8N1g5.js} +48 -562
  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-BbqUBe2T.js +429 -0
  171. package/dist/cjs/{index-D81eLYUM.js → index-C74Q3t6a.js} +3 -2
  172. package/dist/cjs/{index-BERfRao3.js → index-CQfEIyLK.js} +5 -5
  173. package/dist/cjs/{index-aC4x3Fk3.js → index-DFNrCX7M.js} +6 -7
  174. package/dist/cjs/{index-CAvQ7Tka.js → index-DRPqwSvU.js} +13 -30
  175. package/dist/cjs/{index-Ct7gcRif.js → index-DXoo08JC.js} +321 -26
  176. package/dist/cjs/{index-CIrkNXqJ.js → index-DtvKGwdh.js} +34 -2
  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 +18 -10
  190. package/dist/cjs/ion-card_5.cjs.entry.js +6 -5
  191. package/dist/cjs/ion-checkbox.cjs.entry.js +25 -12
  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 +29 -30
  195. package/dist/cjs/{ion-datetime_3.cjs.entry.js → ion-datetime.cjs.entry.js} +773 -796
  196. package/dist/cjs/ion-fab_3.cjs.entry.js +93 -14
  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 +117 -33
  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 +307 -159
  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 +24 -14
  214. package/dist/cjs/ion-range.cjs.entry.js +30 -25
  215. package/dist/cjs/ion-refresher_2.cjs.entry.js +61 -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 -125
  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 +26 -19
  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 +36 -15
  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-Dv6qrMhm.js +38 -0
  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-TbKsuC-K.js → overlays-BR21NUIG.js} +120 -57
  244. package/dist/cjs/select-option-render-CrbLc-1j.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 +11 -4
  261. package/dist/collection/components/card/card.js +1 -1
  262. package/dist/collection/components/checkbox/checkbox.ios.css +18 -0
  263. package/dist/collection/components/checkbox/checkbox.js +19 -8
  264. package/dist/collection/components/checkbox/checkbox.md.css +18 -0
  265. package/dist/collection/components/col/col.js +7 -3
  266. package/dist/collection/components/content/content.js +56 -6
  267. package/dist/collection/components/datetime/datetime.ios.css +42 -2
  268. package/dist/collection/components/datetime/datetime.js +193 -79
  269. package/dist/collection/components/datetime/datetime.md.css +42 -1
  270. package/dist/collection/components/datetime/utils/data.js +13 -14
  271. package/dist/collection/components/datetime/utils/format.js +21 -11
  272. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  273. package/dist/collection/components/datetime/utils/parse.js +10 -10
  274. package/dist/collection/components/datetime/utils/state.js +8 -2
  275. package/dist/collection/components/datetime/utils/validate.js +4 -5
  276. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
  277. package/dist/collection/components/datetime-button/datetime-button.js +21 -25
  278. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
  279. package/dist/collection/components/fab-button/fab-button.js +114 -10
  280. package/dist/collection/components/footer/footer.js +1 -1
  281. package/dist/collection/components/header/header.js +2 -2
  282. package/dist/collection/components/img/img.js +6 -1
  283. package/dist/collection/components/input/input.ios.css +57 -26
  284. package/dist/collection/components/input/input.js +51 -64
  285. package/dist/collection/components/input/input.md.css +79 -43
  286. package/dist/collection/components/input-otp/input-otp.js +15 -24
  287. package/dist/collection/components/input-password-toggle/input-password-toggle.js +5 -6
  288. package/dist/collection/components/item/item.ios.css +11 -0
  289. package/dist/collection/components/item/item.js +99 -15
  290. package/dist/collection/components/item/item.md.css +11 -0
  291. package/dist/collection/components/item-divider/item-divider.js +2 -2
  292. package/dist/collection/components/item-group/item-group.js +1 -1
  293. package/dist/collection/components/item-option/item-option.js +2 -2
  294. package/dist/collection/components/item-options/item-options.js +1 -1
  295. package/dist/collection/components/item-sliding/item-sliding.js +12 -16
  296. package/dist/collection/components/label/label.js +2 -2
  297. package/dist/collection/components/list/list.js +2 -2
  298. package/dist/collection/components/list-header/list-header.js +2 -2
  299. package/dist/collection/components/loading/loading.js +17 -5
  300. package/dist/collection/components/menu/menu.js +6 -8
  301. package/dist/collection/components/menu-button/menu-button.js +2 -2
  302. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  303. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  304. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  305. package/dist/collection/components/modal/gestures/sheet.js +47 -32
  306. package/dist/collection/components/modal/gestures/swipe-to-close.js +23 -33
  307. package/dist/collection/components/modal/gestures/utils.js +17 -0
  308. package/dist/collection/components/modal/modal.ios.css +8 -0
  309. package/dist/collection/components/modal/modal.js +158 -65
  310. package/dist/collection/components/modal/modal.md.css +8 -0
  311. package/dist/collection/components/modal/safe-area-utils.js +39 -5
  312. package/dist/collection/components/nav/nav.js +24 -235
  313. package/dist/collection/components/nav-link/nav-link.js +1 -1
  314. package/dist/collection/components/note/note.js +2 -2
  315. package/dist/collection/components/picker/picker.js +1 -2
  316. package/dist/collection/components/picker-column/picker-column.css +3 -0
  317. package/dist/collection/components/picker-column/picker-column.js +212 -58
  318. package/dist/collection/components/picker-column-option/picker-column-option.js +3 -10
  319. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
  320. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  321. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  322. package/dist/collection/components/popover/popover.ios.css +15 -0
  323. package/dist/collection/components/popover/popover.js +32 -9
  324. package/dist/collection/components/popover/popover.md.css +15 -0
  325. package/dist/collection/components/popover/utils.js +4 -6
  326. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  327. package/dist/collection/components/radio/radio.ios.css +11 -15
  328. package/dist/collection/components/radio/radio.js +17 -9
  329. package/dist/collection/components/radio/radio.md.css +11 -11
  330. package/dist/collection/components/radio-group/radio-group.js +2 -2
  331. package/dist/collection/components/range/range.js +24 -19
  332. package/dist/collection/components/refresher/refresher.js +49 -16
  333. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  334. package/dist/collection/components/reorder/reorder.js +1 -1
  335. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  336. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  337. package/dist/collection/components/route/route.js +1 -1
  338. package/dist/collection/components/router/router.js +2 -6
  339. package/dist/collection/components/router/utils/dom.js +25 -7
  340. package/dist/collection/components/router/utils/matching.js +6 -9
  341. package/dist/collection/components/router/utils/parser.js +1 -1
  342. package/dist/collection/components/router/utils/path.js +0 -1
  343. package/dist/collection/components/router-link/router-link.js +2 -2
  344. package/dist/collection/components/router-outlet/router-outlet.js +49 -10
  345. package/dist/collection/components/row/row.js +1 -1
  346. package/dist/collection/components/searchbar/searchbar.js +25 -20
  347. package/dist/collection/components/segment/segment.js +9 -11
  348. package/dist/collection/components/segment-button/segment-button.js +15 -9
  349. package/dist/collection/components/segment-content/segment-content.js +1 -1
  350. package/dist/collection/components/segment-view/segment-view.js +3 -4
  351. package/dist/collection/components/select/select.ios.css +96 -69
  352. package/dist/collection/components/select/select.js +405 -91
  353. package/dist/collection/components/select/select.md.css +118 -85
  354. package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
  355. package/dist/collection/components/select-modal/select-modal.js +80 -27
  356. package/dist/collection/components/select-modal/select-modal.md.css +164 -0
  357. package/dist/collection/components/select-option/select-option.js +67 -3
  358. package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
  359. package/dist/collection/components/select-popover/select-popover.js +78 -26
  360. package/dist/collection/components/select-popover/select-popover.md.css +164 -0
  361. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  362. package/dist/collection/components/spinner/spinner.js +2 -3
  363. package/dist/collection/components/split-pane/split-pane.js +2 -2
  364. package/dist/collection/components/tab/tab.js +20 -13
  365. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  366. package/dist/collection/components/tab-button/tab-button.js +6 -4
  367. package/dist/collection/components/tabs/tabs.js +2 -3
  368. package/dist/collection/components/text/text.js +2 -2
  369. package/dist/collection/components/textarea/textarea.ios.css +94 -62
  370. package/dist/collection/components/textarea/textarea.js +47 -57
  371. package/dist/collection/components/textarea/textarea.md.css +103 -77
  372. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  373. package/dist/collection/components/title/title.js +2 -2
  374. package/dist/collection/components/toast/toast.js +12 -9
  375. package/dist/collection/components/toggle/toggle.ios.css +12 -4
  376. package/dist/collection/components/toggle/toggle.js +27 -7
  377. package/dist/collection/components/toggle/toggle.md.css +42 -5
  378. package/dist/collection/components/toolbar/toolbar.js +7 -4
  379. package/dist/collection/global/config.js +3 -3
  380. package/dist/collection/global/ionic-global.js +8 -2
  381. package/dist/collection/index.js +1 -1
  382. package/dist/collection/utils/animation/animation.js +3 -3
  383. package/dist/collection/utils/config.js +5 -4
  384. package/dist/collection/utils/content/index.js +30 -0
  385. package/dist/collection/utils/focus-controller/index.js +1 -1
  386. package/dist/collection/utils/focus-trap.js +3 -3
  387. package/dist/collection/utils/forms/index.js +2 -0
  388. package/dist/collection/utils/forms/item-multiple-inputs.js +33 -0
  389. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  390. package/dist/collection/utils/framework-delegate.js +4 -6
  391. package/dist/collection/utils/gesture/gesture-controller.js +1 -2
  392. package/dist/collection/utils/gesture/index.js +10 -2
  393. package/dist/collection/utils/gesture/listener.js +4 -27
  394. package/dist/collection/utils/hardware-back-button.js +3 -3
  395. package/dist/collection/utils/helpers.js +14 -10
  396. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  397. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  398. package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
  399. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  400. package/dist/collection/utils/logging/index.js +23 -4
  401. package/dist/collection/utils/menu-controller/index.js +1 -2
  402. package/dist/collection/utils/native/haptic.js +2 -3
  403. package/dist/collection/utils/native/keyboard.js +2 -2
  404. package/dist/collection/utils/native/status-bar.js +1 -1
  405. package/dist/collection/utils/overlay-control-label.js +45 -0
  406. package/dist/collection/utils/overlays.js +109 -47
  407. package/dist/collection/utils/platform.js +4 -5
  408. package/dist/collection/utils/rtl/dir.js +17 -7
  409. package/dist/collection/utils/sanitization/index.js +275 -20
  410. package/dist/collection/utils/select-option-render.js +118 -0
  411. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  412. package/dist/collection/utils/test/late-props/late-props.js +69 -0
  413. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +25 -0
  414. package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
  415. package/dist/collection/utils/test/playwright/drag-element.js +14 -0
  416. package/dist/collection/utils/test/playwright/generator.js +3 -4
  417. package/dist/collection/utils/test/playwright/index.js +2 -0
  418. package/dist/collection/utils/test/playwright/page/event-spy.js +2 -4
  419. package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
  420. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  421. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  422. package/dist/collection/utils/test/press-keys.js +6 -16
  423. package/dist/collection/utils/theme.js +6 -1
  424. package/dist/collection/utils/transition/ios.transition.js +9 -13
  425. package/dist/collection/utils/transition/md.transition.js +3 -4
  426. package/dist/docs.json +972 -1402
  427. package/dist/esm/{animation-DLJpuoEz.js → animation-BFNVlYum.js} +4 -4
  428. package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-BgX0BGL1.js} +1 -1
  429. package/dist/esm/{button-active-BSpTQmS9.js → button-active-BfOvDr3b.js} +3 -3
  430. package/dist/esm/config-DWCzVL3Y.js +32 -0
  431. package/dist/esm/dir-Dojwmvde.js +28 -0
  432. package/dist/esm/{data-DZI70dKr.js → format-DDFE9jM5.js} +41 -554
  433. package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BwNhx9NR.js} +5 -7
  434. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-B_gJaBk0.js} +1 -2
  435. package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
  436. package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-DmkiRgOT.js} +4 -4
  437. package/dist/esm/{helpers-HEqiOzXb.js → helpers-BSmc0nst.js} +15 -11
  438. package/dist/esm/{index-CfgBF1SE.js → index-BmLuEdV7.js} +13 -30
  439. package/dist/esm/{index-Q6UPU0Ay.js → index-BuPaALjU.js} +6 -7
  440. package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
  441. package/dist/esm/{index-MEDq2S8l.js → index-C1b9CLFg.js} +33 -3
  442. package/dist/esm/{index-tcQvqkiX.js → index-C23AVPx9.js} +303 -26
  443. package/dist/esm/{index-BRHzoo00.js → index-CJln0gS3.js} +3 -2
  444. package/dist/esm/index-CqoUoxgG.js +423 -0
  445. package/dist/esm/{index-B_dQk_WE.js → index-DnA_7Bnx.js} +5 -5
  446. package/dist/esm/index.js +17 -15
  447. package/dist/esm/{input-shims-D10mwcw1.js → input-shims-Dqk-Ou25.js} +10 -11
  448. package/dist/esm/input.utils-rqoH22pW.js +33 -0
  449. package/dist/esm/ion-accordion_2.entry.js +12 -12
  450. package/dist/esm/ion-action-sheet.entry.js +92 -44
  451. package/dist/esm/ion-alert.entry.js +143 -64
  452. package/dist/esm/ion-app_8.entry.js +112 -40
  453. package/dist/esm/ion-avatar_3.entry.js +4 -4
  454. package/dist/esm/ion-back-button.entry.js +6 -5
  455. package/dist/esm/ion-backdrop.entry.js +2 -2
  456. package/dist/esm/ion-breadcrumb_2.entry.js +8 -7
  457. package/dist/esm/ion-button_2.entry.js +18 -10
  458. package/dist/esm/ion-card_5.entry.js +6 -5
  459. package/dist/esm/ion-checkbox.entry.js +25 -12
  460. package/dist/esm/ion-chip.entry.js +3 -3
  461. package/dist/esm/ion-col_3.entry.js +10 -6
  462. package/dist/esm/ion-datetime-button.entry.js +28 -29
  463. package/dist/esm/{ion-datetime_3.entry.js → ion-datetime.entry.js} +712 -733
  464. package/dist/esm/ion-fab_3.entry.js +93 -14
  465. package/dist/esm/ion-img.entry.js +7 -4
  466. package/dist/esm/ion-infinite-scroll_2.entry.js +7 -5
  467. package/dist/esm/ion-input-otp.entry.js +20 -29
  468. package/dist/esm/ion-input-password-toggle.entry.js +9 -10
  469. package/dist/esm/ion-input.entry.js +56 -68
  470. package/dist/esm/ion-item-option_3.entry.js +21 -24
  471. package/dist/esm/ion-item_8.entry.js +117 -33
  472. package/dist/esm/ion-loading.entry.js +28 -14
  473. package/dist/esm/ion-menu_3.entry.js +23 -24
  474. package/dist/esm/ion-modal.entry.js +295 -147
  475. package/dist/esm/ion-nav_2.entry.js +30 -138
  476. package/dist/esm/ion-picker-column-option.entry.js +8 -13
  477. package/dist/esm/ion-picker-column.entry.js +218 -62
  478. package/dist/esm/ion-picker.entry.js +4 -4
  479. package/dist/esm/ion-popover.entry.js +50 -30
  480. package/dist/esm/ion-progress-bar.entry.js +6 -5
  481. package/dist/esm/ion-radio_2.entry.js +24 -14
  482. package/dist/esm/ion-range.entry.js +30 -25
  483. package/dist/esm/ion-refresher_2.entry.js +59 -24
  484. package/dist/esm/ion-reorder_2.entry.js +10 -9
  485. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  486. package/dist/esm/ion-route_4.entry.js +36 -30
  487. package/dist/esm/ion-searchbar.entry.js +27 -22
  488. package/dist/esm/ion-segment-content.entry.js +2 -2
  489. package/dist/esm/ion-segment-view.entry.js +5 -6
  490. package/dist/esm/ion-segment_2.entry.js +30 -26
  491. package/dist/esm/ion-select-modal.entry.js +93 -38
  492. package/dist/esm/ion-select_3.entry.js +495 -125
  493. package/dist/esm/ion-spinner.entry.js +5 -6
  494. package/dist/esm/ion-split-pane.entry.js +4 -4
  495. package/dist/esm/ion-tab-bar_2.entry.js +15 -12
  496. package/dist/esm/ion-tab_2.entry.js +26 -19
  497. package/dist/esm/ion-text.entry.js +5 -5
  498. package/dist/esm/ion-textarea.entry.js +55 -64
  499. package/dist/esm/ion-toast.entry.js +25 -20
  500. package/dist/esm/ion-toggle.entry.js +36 -15
  501. package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-ZXjCXKH0.js} +13 -8
  502. package/dist/esm/ionic.js +6 -6
  503. package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-CWAgfQ1r.js} +14 -17
  504. package/dist/esm/item-multiple-inputs-DZnIiOO_.js +36 -0
  505. package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
  506. package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
  507. package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
  508. package/dist/esm/loader.js +5 -5
  509. package/dist/esm/{md.transition-D0msQmzI.js → md.transition-ZuqDDdDW.js} +8 -8
  510. package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
  511. package/dist/esm/{overlays-TbiM4mdr.js → overlays-DKE0DgvE.js} +119 -57
  512. package/dist/esm/select-option-render-1W6W9pbC.js +121 -0
  513. package/dist/esm/slot-mutation-controller-B5NpUZ-N.js +393 -0
  514. package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-Cv9gb3ja.js} +4 -3
  515. package/dist/esm/{swipe-back-ZUWwA-KF.js → swipe-back-De5HlmeM.js} +5 -5
  516. package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
  517. package/dist/html.html-data.json +58 -82
  518. package/dist/ionic/index.esm.js +1 -1
  519. package/dist/ionic/ionic.esm.js +1 -1
  520. package/dist/ionic/p-06c6b540.entry.js +4 -0
  521. package/dist/ionic/p-099b7f9f.entry.js +4 -0
  522. package/dist/ionic/p-0dcb7bb6.entry.js +4 -0
  523. package/dist/ionic/p-1347880c.entry.js +4 -0
  524. package/dist/ionic/p-191a651e.entry.js +4 -0
  525. package/dist/ionic/p-1f24cb24.entry.js +4 -0
  526. package/dist/ionic/p-271c3640.entry.js +4 -0
  527. package/dist/ionic/p-2c52fe3e.entry.js +4 -0
  528. package/dist/ionic/p-2ea4bb36.entry.js +4 -0
  529. package/dist/ionic/p-338a02e0.entry.js +4 -0
  530. package/dist/ionic/p-38b9375b.entry.js +4 -0
  531. package/dist/ionic/p-3bba83ee.entry.js +4 -0
  532. package/dist/ionic/p-4712a8a9.entry.js +4 -0
  533. package/dist/ionic/p-4c3e50f8.entry.js +4 -0
  534. package/dist/ionic/p-4e2fef42.entry.js +4 -0
  535. package/dist/ionic/p-54cbb0a7.entry.js +4 -0
  536. package/dist/ionic/{p-2bb2cb18.entry.js → p-561af487.entry.js} +1 -1
  537. package/dist/ionic/p-5906ea6f.entry.js +4 -0
  538. package/dist/ionic/p-5cc09b40.entry.js +4 -0
  539. package/dist/ionic/p-5d9094ac.entry.js +4 -0
  540. package/dist/ionic/p-612ea3b1.entry.js +4 -0
  541. package/dist/ionic/p-66f150ec.entry.js +4 -0
  542. package/dist/ionic/p-68cc89a6.entry.js +4 -0
  543. package/dist/ionic/{p-dfa8d673.entry.js → p-6e386853.entry.js} +1 -1
  544. package/dist/ionic/p-77c96e08.entry.js +4 -0
  545. package/dist/ionic/p-7bfeccb3.entry.js +4 -0
  546. package/dist/ionic/p-7e394cc3.entry.js +4 -0
  547. package/dist/ionic/{p-0fa9c382.entry.js → p-7fbb3319.entry.js} +1 -1
  548. package/dist/ionic/p-837db1b9.entry.js +4 -0
  549. package/dist/ionic/p-85599fe3.entry.js +4 -0
  550. package/dist/ionic/p-8b80d9f9.entry.js +4 -0
  551. package/dist/ionic/p-90f50a65.entry.js +4 -0
  552. package/dist/ionic/p-9595e305.entry.js +4 -0
  553. package/dist/ionic/p-9c5f2691.entry.js +4 -0
  554. package/dist/ionic/p-BMPN55of.js +4 -0
  555. package/dist/ionic/p-BSQPZ79H.js +4 -0
  556. package/dist/ionic/p-BY6BzzPF.js +4 -0
  557. package/dist/ionic/p-B_gJaBk0.js +4 -0
  558. package/dist/ionic/p-BaeKWZ-a.js +4 -0
  559. package/dist/ionic/p-Bd72UYI2.js +4 -0
  560. package/dist/ionic/p-BgOvhHy_.js +4 -0
  561. package/dist/ionic/p-BhamHSw3.js +4 -0
  562. package/dist/ionic/p-BijjLYjT.js +4 -0
  563. package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
  564. package/dist/ionic/p-C23AVPx9.js +6 -0
  565. package/dist/ionic/p-C8XilMh0.js +4 -0
  566. package/dist/ionic/p-CER8qW8Y.js +4 -0
  567. package/dist/ionic/p-CFuOr1Tu.js +4 -0
  568. package/dist/ionic/p-CM5OBjTW.js +4 -0
  569. package/dist/ionic/p-CMZYmFb4.js +4 -0
  570. package/dist/ionic/p-CkxVYPtX.js +4 -0
  571. package/dist/ionic/p-CmXuiRT6.js +4 -0
  572. package/dist/ionic/p-D0YpjgON.js +4 -0
  573. package/dist/ionic/p-D4OrdtJf.js +4 -0
  574. package/dist/ionic/p-D5t_-oMk.js +4 -0
  575. package/dist/ionic/p-D6rHcCvc.js +4 -0
  576. package/dist/ionic/p-DLM95R4x.js +4 -0
  577. package/dist/ionic/p-DTxBioUO.js +4 -0
  578. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  579. package/dist/ionic/p-DYUjHcuH.js +4 -0
  580. package/dist/ionic/p-DZ6Hmc-8.js +4 -0
  581. package/dist/ionic/p-D_gb-kdd.js +4 -0
  582. package/dist/ionic/p-DajLgJ4d.js +4 -0
  583. package/dist/ionic/p-Do3zTvCA.js +4 -0
  584. package/dist/ionic/p-Dojwmvde.js +4 -0
  585. package/dist/ionic/p-T71k3C35.js +4 -0
  586. package/dist/ionic/p-a1cc2861.entry.js +4 -0
  587. package/dist/ionic/p-a20a2ebe.entry.js +4 -0
  588. package/dist/ionic/p-a8ff2489.entry.js +4 -0
  589. package/dist/ionic/p-b3532b8d.entry.js +4 -0
  590. package/dist/ionic/p-b80c86c4.entry.js +4 -0
  591. package/dist/ionic/p-b9b4e85d.entry.js +4 -0
  592. package/dist/ionic/p-byZM6qHV.js +4 -0
  593. package/dist/ionic/p-c57fc396.entry.js +4 -0
  594. package/dist/ionic/{p-c6e49f3f.entry.js → p-ca1b8865.entry.js} +1 -1
  595. package/dist/ionic/p-cc4320d3.entry.js +4 -0
  596. package/dist/ionic/p-d6755739.entry.js +4 -0
  597. package/dist/ionic/p-d8c138d9.entry.js +4 -0
  598. package/dist/ionic/p-db449915.entry.js +4 -0
  599. package/dist/ionic/p-dd01be0a.entry.js +4 -0
  600. package/dist/ionic/p-ec00fd0d.entry.js +4 -0
  601. package/dist/ionic/p-ee09ac9d.entry.js +4 -0
  602. package/dist/ionic/{p-37e720da.entry.js → p-efc0cf82.entry.js} +1 -1
  603. package/dist/ionic/p-f0fb23c1.entry.js +4 -0
  604. package/dist/ionic/p-f83b3e0c.entry.js +4 -0
  605. package/dist/ionic/p-fU3rOYad.js +4 -0
  606. package/dist/ionic/p-zWf7R2xV.js +4 -0
  607. package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
  608. package/dist/types/components/alert/alert.d.ts +7 -0
  609. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  610. package/dist/types/components/content/content.d.ts +12 -0
  611. package/dist/types/components/datetime/datetime.d.ts +13 -1
  612. package/dist/types/components/fab-button/fab-button.d.ts +15 -0
  613. package/dist/types/components/img/img.d.ts +2 -0
  614. package/dist/types/components/input/input.d.ts +12 -6
  615. package/dist/types/components/item/item.d.ts +19 -0
  616. package/dist/types/components/modal/gestures/sheet.d.ts +1 -0
  617. package/dist/types/components/modal/gestures/utils.d.ts +11 -0
  618. package/dist/types/components/modal/modal-interface.d.ts +9 -0
  619. package/dist/types/components/modal/modal.d.ts +25 -7
  620. package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
  621. package/dist/types/components/nav/nav-interface.d.ts +0 -1
  622. package/dist/types/components/nav/nav.d.ts +2 -22
  623. package/dist/types/components/picker-column/picker-column.d.ts +42 -0
  624. package/dist/types/components/radio/radio.d.ts +1 -0
  625. package/dist/types/components/range/range.d.ts +4 -1
  626. package/dist/types/components/refresher/refresher.d.ts +7 -0
  627. package/dist/types/components/route/route.d.ts +1 -1
  628. package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
  629. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  630. package/dist/types/components/select/select-interface.d.ts +31 -0
  631. package/dist/types/components/select/select.d.ts +30 -6
  632. package/dist/types/components/select-option/select-option.d.ts +42 -1
  633. package/dist/types/components/tab/tab.d.ts +1 -1
  634. package/dist/types/components/textarea/textarea.d.ts +12 -5
  635. package/dist/types/components/toggle/toggle.d.ts +1 -0
  636. package/dist/types/components.d.ts +94 -318
  637. package/dist/types/index.d.ts +1 -1
  638. package/dist/types/interface.d.ts +0 -1
  639. package/dist/types/stencil-public-runtime.d.ts +12 -0
  640. package/dist/types/utils/config.d.ts +1 -8
  641. package/dist/types/utils/content/index.d.ts +12 -0
  642. package/dist/types/utils/forms/index.d.ts +2 -0
  643. package/dist/types/utils/forms/item-multiple-inputs.d.ts +13 -0
  644. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  645. package/dist/types/utils/helpers.d.ts +8 -5
  646. package/dist/types/utils/logging/index.d.ts +2 -1
  647. package/dist/types/utils/overlay-control-label.d.ts +32 -0
  648. package/dist/types/utils/overlays.d.ts +20 -9
  649. package/dist/types/utils/rtl/dir.d.ts +10 -4
  650. package/dist/types/utils/sanitization/index.d.ts +58 -2
  651. package/dist/types/utils/select-option-render.d.ts +53 -0
  652. package/dist/types/utils/test/playwright/apply-keyboard-focus.d.ts +16 -0
  653. package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
  654. package/dist/types/utils/test/playwright/index.d.ts +2 -0
  655. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  656. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  657. package/hydrate/index.js +3341 -2197
  658. package/hydrate/index.mjs +3341 -2197
  659. package/loader/index.d.ts +1 -1
  660. package/package.json +61 -17
  661. package/components/ion-picker-legacy-column.d.ts +0 -11
  662. package/components/ion-picker-legacy-column.js +0 -4
  663. package/components/ion-picker-legacy.d.ts +0 -11
  664. package/components/ion-picker-legacy.js +0 -4
  665. package/components/p-0NRupjzW.js +0 -4
  666. package/components/p-5bE_Wz4Y.js +0 -4
  667. package/components/p-B60hm8Qv.js +0 -4
  668. package/components/p-BAYYcg3o.js +0 -4
  669. package/components/p-BLmJ0zRm.js +0 -4
  670. package/components/p-BSEgsdFI.js +0 -4
  671. package/components/p-BTEOs1at.js +0 -4
  672. package/components/p-BTPfOxsU.js +0 -4
  673. package/components/p-BT_5jSqG.js +0 -4
  674. package/components/p-Baq1XyAy.js +0 -4
  675. package/components/p-BjfgFSSR.js +0 -4
  676. package/components/p-BjoEPDW5.js +0 -4
  677. package/components/p-BnqQlm7c.js +0 -4
  678. package/components/p-BsPelv04.js +0 -4
  679. package/components/p-Bth-EzJ0.js +0 -4
  680. package/components/p-Bz0dSlXZ.js +0 -4
  681. package/components/p-C1aScSTo.js +0 -4
  682. package/components/p-C2lKgrXx.js +0 -4
  683. package/components/p-C53feagD.js +0 -4
  684. package/components/p-CHqRYvYm.js +0 -4
  685. package/components/p-CI3ncNZm.js +0 -4
  686. package/components/p-CSZf8_j0.js +0 -4
  687. package/components/p-CU5rbWAW.js +0 -4
  688. package/components/p-C_xFdyXe.js +0 -4
  689. package/components/p-Ciz1-FuE.js +0 -4
  690. package/components/p-Cl0B-RWe.js +0 -4
  691. package/components/p-CmR5uXej.js +0 -4
  692. package/components/p-CtWGkNnJ.js +0 -4
  693. package/components/p-CtukzcyX.js +0 -4
  694. package/components/p-D13Eaw-8.js +0 -4
  695. package/components/p-D5Ubpm7D.js +0 -4
  696. package/components/p-D6Ynv7Xh.js +0 -4
  697. package/components/p-D7bSXQD3.js +0 -4
  698. package/components/p-DDWp95gH.js +0 -4
  699. package/components/p-DIE4pXMl.js +0 -4
  700. package/components/p-DOFCbuQR.js +0 -4
  701. package/components/p-DiVJyqlX.js +0 -4
  702. package/components/p-DnL1c9_X.js +0 -4
  703. package/components/p-W5nO8mX_.js +0 -4
  704. package/components/p-W9CZ2mWX.js +0 -4
  705. package/components/p-XlSIJDJ-.js +0 -4
  706. package/components/p-cyNmxje6.js +0 -4
  707. package/components/p-dhLYXa7A.js +0 -4
  708. package/components/p-ijF0iCrA.js +0 -4
  709. package/components/p-k_E4tX5Z.js +0 -4
  710. package/components/p-nQi4oKcG.js +0 -4
  711. package/components/p-ryqmO0B-.js +0 -4
  712. package/dist/cjs/config-xninhj0J.js +0 -201
  713. package/dist/cjs/dir-Cn0z1rJH.js +0 -20
  714. package/dist/cjs/input.utils-DetjmtH2.js +0 -150
  715. package/dist/cjs/notch-controller-18PzRGXd.js +0 -155
  716. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  717. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  718. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  719. package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
  720. package/dist/collection/components/picker-legacy/picker.js +0 -890
  721. package/dist/collection/components/picker-legacy/picker.md.css +0 -287
  722. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
  723. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  724. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
  725. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  726. package/dist/esm/config-DQCONYYp.js +0 -195
  727. package/dist/esm/dir-C53feagD.js +0 -18
  728. package/dist/esm/input.utils-Y6NgW8bw.js +0 -147
  729. package/dist/esm/notch-controller-DKDjU_O7.js +0 -153
  730. package/dist/ionic/p-00dbb17e.entry.js +0 -4
  731. package/dist/ionic/p-01f81ea5.entry.js +0 -4
  732. package/dist/ionic/p-06c232a4.entry.js +0 -4
  733. package/dist/ionic/p-0d005398.entry.js +0 -4
  734. package/dist/ionic/p-1ae21e4c.entry.js +0 -4
  735. package/dist/ionic/p-20b1a044.entry.js +0 -4
  736. package/dist/ionic/p-21eb76d5.entry.js +0 -4
  737. package/dist/ionic/p-2394a9a6.entry.js +0 -4
  738. package/dist/ionic/p-27d30585.entry.js +0 -4
  739. package/dist/ionic/p-2f55dc1a.entry.js +0 -4
  740. package/dist/ionic/p-30bf9737.entry.js +0 -4
  741. package/dist/ionic/p-3353c229.entry.js +0 -4
  742. package/dist/ionic/p-33704f20.entry.js +0 -4
  743. package/dist/ionic/p-390ca786.entry.js +0 -4
  744. package/dist/ionic/p-3a126bca.entry.js +0 -4
  745. package/dist/ionic/p-3a541154.entry.js +0 -4
  746. package/dist/ionic/p-3a7d1e91.entry.js +0 -4
  747. package/dist/ionic/p-3ae5f277.entry.js +0 -4
  748. package/dist/ionic/p-4745f534.entry.js +0 -4
  749. package/dist/ionic/p-4858af1f.entry.js +0 -4
  750. package/dist/ionic/p-4baa5b82.entry.js +0 -4
  751. package/dist/ionic/p-4dc1c33c.entry.js +0 -4
  752. package/dist/ionic/p-4e92a11f.entry.js +0 -4
  753. package/dist/ionic/p-50e1194a.entry.js +0 -4
  754. package/dist/ionic/p-5d1da0a2.entry.js +0 -4
  755. package/dist/ionic/p-75dc25ba.entry.js +0 -4
  756. package/dist/ionic/p-81ea5652.entry.js +0 -4
  757. package/dist/ionic/p-84d5ce05.entry.js +0 -4
  758. package/dist/ionic/p-874b4bd8.entry.js +0 -4
  759. package/dist/ionic/p-8c8eee7d.entry.js +0 -4
  760. package/dist/ionic/p-8eb8ee76.entry.js +0 -4
  761. package/dist/ionic/p-8fce95d5.entry.js +0 -4
  762. package/dist/ionic/p-94f2a736.entry.js +0 -4
  763. package/dist/ionic/p-9a65ac7f.entry.js +0 -4
  764. package/dist/ionic/p-9eeaBrnk.js +0 -4
  765. package/dist/ionic/p-9f1103ce.entry.js +0 -4
  766. package/dist/ionic/p-BGqMS-oh.js +0 -4
  767. package/dist/ionic/p-BTEOs1at.js +0 -4
  768. package/dist/ionic/p-BUFIpxKM.js +0 -4
  769. package/dist/ionic/p-C53feagD.js +0 -4
  770. package/dist/ionic/p-CFlfIb2g.js +0 -4
  771. package/dist/ionic/p-CKvCXMs9.js +0 -4
  772. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  773. package/dist/ionic/p-CtWGkNnJ.js +0 -4
  774. package/dist/ionic/p-CwdymDLH.js +0 -4
  775. package/dist/ionic/p-Cx3IXROA.js +0 -4
  776. package/dist/ionic/p-D13Eaw-8.js +0 -4
  777. package/dist/ionic/p-DAAFkPFT.js +0 -4
  778. package/dist/ionic/p-DC3RagnA.js +0 -4
  779. package/dist/ionic/p-DIuEbVLu.js +0 -4
  780. package/dist/ionic/p-DSG2s2Eb.js +0 -4
  781. package/dist/ionic/p-Dfbt-q2k.js +0 -4
  782. package/dist/ionic/p-DiVJyqlX.js +0 -4
  783. package/dist/ionic/p-DoJvtrbw.js +0 -4
  784. package/dist/ionic/p-DzWaWHGc.js +0 -4
  785. package/dist/ionic/p-Nqf6uvGh.js +0 -4
  786. package/dist/ionic/p-SNAkTDfm.js +0 -4
  787. package/dist/ionic/p-VAemlbDS.js +0 -4
  788. package/dist/ionic/p-Wk5HzclC.js +0 -4
  789. package/dist/ionic/p-a21add2f.entry.js +0 -4
  790. package/dist/ionic/p-a3bdcae6.entry.js +0 -4
  791. package/dist/ionic/p-aa5d6b8f.entry.js +0 -4
  792. package/dist/ionic/p-c0fb8edd.entry.js +0 -4
  793. package/dist/ionic/p-c4d8641b.entry.js +0 -4
  794. package/dist/ionic/p-e0be05c5.entry.js +0 -4
  795. package/dist/ionic/p-e847a888.entry.js +0 -4
  796. package/dist/ionic/p-ec090e0a.entry.js +0 -4
  797. package/dist/ionic/p-ef4c3bee.entry.js +0 -4
  798. package/dist/ionic/p-fabcce6c.entry.js +0 -4
  799. package/dist/ionic/p-facfde02.entry.js +0 -4
  800. package/dist/ionic/p-fd7eebc4.entry.js +0 -4
  801. package/dist/ionic/p-mjKAFv89.js +0 -4
  802. package/dist/ionic/p-tcQvqkiX.js +0 -5
  803. package/dist/ionic/p-viFHDgRs.js +0 -4
  804. package/dist/ionic/p-xOfi7-Zn.js +0 -4
  805. package/dist/ionic/p-xWb6fgfq.js +0 -4
  806. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  807. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  808. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  809. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  810. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  811. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  812. /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
@@ -3,24 +3,25 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index$3 = require('./index-Ct7gcRif.js');
7
- var index$2 = require('./index-CIrkNXqJ.js');
8
- var frameworkDelegate = require('./framework-delegate-BtICZDHr.js');
9
- var helpers = require('./helpers-Cv23MFHM.js');
6
+ var index$3 = require('./index-DXoo08JC.js');
7
+ var index$1 = require('./index-DtvKGwdh.js');
8
+ var frameworkDelegate = require('./framework-delegate-d-fWfeI6.js');
9
+ var helpers = require('./helpers-7wzdhdeg.js');
10
10
  var lockController = require('./lock-controller-aDB9wrEf.js');
11
11
  var capacitor = require('./capacitor-DmA66EwP.js');
12
- var overlays = require('./overlays-TbKsuC-K.js');
13
- var theme = require('./theme-CeDs6Hcv.js');
14
- var index$4 = require('./index-BERfRao3.js');
15
- var ionicGlobal = require('./ionic-global-B-cA6LkY.js');
16
- var keyboard = require('./keyboard-hHzlEQpk.js');
17
- var animation = require('./animation-BJq0kcy2.js');
12
+ var overlays = require('./overlays-BR21NUIG.js');
13
+ var theme = require('./theme-Bw0rpaNN.js');
14
+ var index$4 = require('./index-CQfEIyLK.js');
15
+ var ionicGlobal = require('./ionic-global-CYJNT-2P.js');
16
+ var keyboard = require('./keyboard-Cix5TVkD.js');
17
+ var animation = require('./animation-Kd1N7WTN.js');
18
18
  var cubicBezier = require('./cubic-bezier-DAjy1V-e.js');
19
- var index$1 = require('./index-CAvQ7Tka.js');
19
+ var index$2 = require('./index-DRPqwSvU.js');
20
20
  var index = require('./index-DkNv4J_i.js');
21
- require('./hardware-back-button-iUuF_76h.js');
22
- require('./gesture-controller-dtqlP_q4.js');
23
- require('./keyboard-UuAS4D_9.js');
21
+ require('./dir-zwDPRE5K.js');
22
+ require('./hardware-back-button-Bu4Dzw8l.js');
23
+ require('./gesture-controller-CeJslptU.js');
24
+ require('./keyboard-cHxZlTyz.js');
24
25
 
25
26
  var Style;
26
27
  (function (Style) {
@@ -31,7 +32,7 @@ var Style;
31
32
  const StatusBar = {
32
33
  getEngine() {
33
34
  const capacitor$1 = capacitor.getCapacitor();
34
- if (capacitor$1 === null || capacitor$1 === void 0 ? void 0 : capacitor$1.isPluginAvailable('StatusBar')) {
35
+ if (capacitor$1?.isPluginAvailable('StatusBar')) {
35
36
  return capacitor$1.Plugins.StatusBar;
36
37
  }
37
38
  return undefined;
@@ -129,6 +130,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
129
130
  StatusBar.setStyle({ style: defaultStyle });
130
131
  };
131
132
 
133
+ /**
134
+ * Swiping is only possible when the content is scrolled to the top, so that we
135
+ * do not interfere with scrolling, and never on content with a refresher.
136
+ *
137
+ * Note: We cannot solve the refresher case with gesture priority as the iOS
138
+ * native refresh gesture uses a scroll listener in addition to a gesture.
139
+ *
140
+ * Note: Do not use `getScrollElement` here because we need this to be a
141
+ * synchronous operation, and `getScrollElement` is asynchronous.
142
+ */
143
+ const canSwipeOnContent = (contentEl) => {
144
+ const scrollEl = index$1.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
145
+ const hasRefresherInContent = !!index$1.findRefresherInContent(contentEl);
146
+ return !hasRefresherInContent && scrollEl.scrollTop === 0;
147
+ };
132
148
  const handleCanDismiss = async (el, animation) => {
133
149
  /**
134
150
  * If canDismiss is not a function
@@ -259,12 +275,11 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
259
275
  let isOpen = false;
260
276
  let canDismissBlocksGesture = false;
261
277
  let contentEl = null;
262
- let scrollEl = null;
263
278
  const canDismissMaxStep = 0.2;
264
279
  let initialScrollY = true;
265
280
  let lastStep = 0;
266
281
  const getScrollY = () => {
267
- if (contentEl && index$2.isIonContent(contentEl)) {
282
+ if (contentEl && index$1.isIonContent(contentEl)) {
268
283
  return contentEl.scrollY;
269
284
  /**
270
285
  * Custom scroll containers are intended to be
@@ -282,12 +297,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
282
297
  return true;
283
298
  }
284
299
  /**
285
- * If we are swiping on the content,
286
- * swiping should only be possible if
287
- * the content is scrolled all the way
288
- * to the top so that we do not interfere
289
- * with scrolling.
290
- *
291
300
  * We cannot assume that the `ion-content`
292
301
  * target will remain consistent between
293
302
  * swipes. For example, when using
@@ -296,31 +305,9 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
296
305
  * swipe again. The target content will not
297
306
  * be the same between swipes.
298
307
  */
299
- contentEl = index$2.findClosestIonContent(target);
308
+ contentEl = index$1.findClosestIonContent(target);
300
309
  if (contentEl) {
301
- /**
302
- * The card should never swipe to close
303
- * on the content with a refresher.
304
- * Note: We cannot solve this by making the
305
- * swipeToClose gesture have a higher priority
306
- * than the refresher gesture as the iOS native
307
- * refresh gesture uses a scroll listener in
308
- * addition to a gesture.
309
- *
310
- * Note: Do not use getScrollElement here
311
- * because we need this to be a synchronous
312
- * operation, and getScrollElement is
313
- * asynchronous.
314
- */
315
- if (index$2.isIonContent(contentEl)) {
316
- const root = helpers.getElementRoot(contentEl);
317
- scrollEl = root.querySelector('.inner-scroll');
318
- }
319
- else {
320
- scrollEl = contentEl;
321
- }
322
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
323
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
310
+ return canSwipeOnContent(contentEl);
324
311
  }
325
312
  /**
326
313
  * Card should be swipeable on all
@@ -334,6 +321,12 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
334
321
  };
335
322
  const onStart = (detail) => {
336
323
  const { deltaY } = detail;
324
+ /**
325
+ * Firefox automatically selects the header text during drag
326
+ * due to the focusable wrapper (tabindex="-1"). Remove any
327
+ * selection that may have occurred.
328
+ */
329
+ window.getSelection()?.removeAllRanges();
337
330
  /**
338
331
  * Get the initial scrollY value so
339
332
  * that we can correctly reset the scrollY
@@ -356,7 +349,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
356
349
  * happen at the same time as the gesture.
357
350
  */
358
351
  if (deltaY > 0 && contentEl) {
359
- index$2.disableContentScrollY(contentEl);
352
+ index$1.disableContentScrollY(contentEl);
360
353
  }
361
354
  animation.progressStart(true, isOpen ? 1 : 0);
362
355
  onDragStart();
@@ -370,7 +363,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
370
363
  * happen at the same time as the gesture.
371
364
  */
372
365
  if (deltaY > 0 && contentEl) {
373
- index$2.disableContentScrollY(contentEl);
366
+ index$1.disableContentScrollY(contentEl);
374
367
  }
375
368
  /**
376
369
  * If we are swiping on the content
@@ -465,7 +458,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
465
458
  isOpen = shouldComplete;
466
459
  gesture.enable(false);
467
460
  if (contentEl) {
468
- index$2.resetContentScrollY(contentEl, initialScrollY);
461
+ index$1.resetContentScrollY(contentEl, initialScrollY);
469
462
  }
470
463
  animation
471
464
  .onFinish(() => {
@@ -486,22 +479,35 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
486
479
  * check canDismiss. 25% was chosen
487
480
  * to avoid accidental swipes.
488
481
  */
489
- if (isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4) {
482
+ const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
483
+ if (isAttemptingCanDismiss) {
490
484
  handleCanDismiss(el, animation);
491
485
  }
492
486
  else if (shouldComplete) {
493
487
  onDismiss();
494
488
  }
489
+ /**
490
+ * `shouldComplete` is not enough on its own, since it is always `false`
491
+ * when canDismiss blocks the gesture. `canDismiss: false` blocks it and
492
+ * never dismisses, because `handleCanDismiss` returns early when
493
+ * canDismiss is not a function. A canDismiss function dismisses through
494
+ * `handleCanDismiss`, which awaits the callback, so the outcome is not
495
+ * known when this event is emitted.
496
+ */
497
+ const isDismissing = isAttemptingDismissWithCanDismiss
498
+ ? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
499
+ : shouldComplete;
495
500
  const eventDetail = {
496
501
  currentY: detail.currentY,
497
502
  deltaY: detail.deltaY,
498
503
  velocityY: detail.velocityY,
499
504
  progress: calculateProgress(el, detail.deltaY),
505
+ isDismissing,
500
506
  snapBreakpoint: shouldComplete ? 0 : 1,
501
507
  };
502
508
  onDragEnd(eventDetail);
503
509
  };
504
- const gesture = index$1.createGesture({
510
+ const gesture = index$2.createGesture({
505
511
  el,
506
512
  gestureName: 'modalSwipeToClose',
507
513
  gesturePriority: overlays.OVERLAY_GESTURE_PRIORITY,
@@ -634,7 +640,7 @@ const iosEnterAnimation = (baseEl, opts) => {
634
640
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
635
641
  // The content animation is only added if scrolling is enabled for
636
642
  // all the breakpoints.
637
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
643
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
638
644
  const baseAnimation = animation.createAnimation('entering-base')
639
645
  .addElement(baseEl)
640
646
  .easing('cubic-bezier(0.32,0.72,0,1)')
@@ -967,7 +973,7 @@ const mdEnterAnimation = (baseEl, opts) => {
967
973
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
968
974
  // The content animation is only added if scrolling is enabled for
969
975
  // all the breakpoints.
970
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
976
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
971
977
  const baseAnimation = animation.createAnimation()
972
978
  .addElement(baseEl)
973
979
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
@@ -1026,6 +1032,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1026
1032
  ],
1027
1033
  };
1028
1034
  const contentEl = baseEl.querySelector('ion-content');
1035
+ // Cache the initial value so the gesture restores it instead of forcing scrolling on.
1036
+ const initialContentScrollY = contentEl?.scrollY ?? true;
1029
1037
  const height = wrapperEl.clientHeight;
1030
1038
  let currentBreakpoint = initialBreakpoint;
1031
1039
  let offset = 0;
@@ -1091,9 +1099,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1091
1099
  cachedFooterEl.style.removeProperty('height');
1092
1100
  cachedFooterEl.style.removeProperty('top');
1093
1101
  cachedFooterEl.style.removeProperty('left');
1094
- page === null || page === void 0 ? void 0 : page.style.removeProperty('padding-bottom');
1102
+ page?.style.removeProperty('padding-bottom');
1095
1103
  // Move to page
1096
- page === null || page === void 0 ? void 0 : page.appendChild(cachedFooterEl);
1104
+ page?.appendChild(cachedFooterEl);
1097
1105
  });
1098
1106
  }
1099
1107
  else {
@@ -1137,7 +1145,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1137
1145
  // when the footer is positioned absolutely. This has to be done before we
1138
1146
  // make the footer absolutely positioned or we may accidentally cause the
1139
1147
  // sheet to scroll.
1140
- page === null || page === void 0 ? void 0 : page.style.setProperty('padding-bottom', `${footerHeights}px`);
1148
+ page?.style.setProperty('padding-bottom', `${footerHeights}px`);
1141
1149
  // Apply positioning styles to keep footer at bottom
1142
1150
  cachedFooterEl.classList.add('modal-footer-moving');
1143
1151
  // Apply our preserved styles to pin the footer
@@ -1162,7 +1170,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1162
1170
  if (wrapperAnimation && backdropAnimation) {
1163
1171
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1164
1172
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1165
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1173
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1166
1174
  animation.progressStart(true, 1 - currentBreakpoint);
1167
1175
  /**
1168
1176
  * If backdrop is not enabled, then content
@@ -1186,40 +1194,28 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1186
1194
  }
1187
1195
  const canStart = (detail) => {
1188
1196
  /**
1189
- * If we are swiping on the content, swiping should only be possible if the content
1190
- * is scrolled all the way to the top so that we do not interfere with scrolling.
1191
- *
1192
1197
  * We cannot assume that the `ion-content` target will remain consistent between swipes.
1193
1198
  * For example, when using ion-nav within a modal it is possible to swipe, push a view,
1194
1199
  * and then swipe again. The target content will not be the same between swipes.
1195
1200
  */
1196
- const contentEl = index$2.findClosestIonContent(detail.event.target);
1201
+ const contentEl = index$1.findClosestIonContent(detail.event.target);
1197
1202
  currentBreakpoint = getCurrentBreakpoint();
1198
1203
  /**
1199
- * If `expandToScroll` is disabled, we should not allow the swipe gesture
1200
- * to start if the content is not scrolled to the top.
1204
+ * Upwards swipes on the content cannot move the sheet anyway, so this only
1205
+ * blocks swiping the sheet down from the content.
1201
1206
  */
1202
- if (!expandToScroll && contentEl) {
1203
- const scrollEl = index$2.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1204
- return scrollEl.scrollTop === 0;
1205
- }
1206
- if (currentBreakpoint === 1 && contentEl) {
1207
- /**
1208
- * The modal should never swipe to close on the content with a refresher.
1209
- * Note 1: We cannot solve this by making this gesture have a higher priority than
1210
- * the refresher gesture as the iOS native refresh gesture uses a scroll listener in
1211
- * addition to a gesture.
1212
- *
1213
- * Note 2: Do not use getScrollElement here because we need this to be a synchronous
1214
- * operation, and getScrollElement is asynchronous.
1215
- */
1216
- const scrollEl = index$2.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1217
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
1218
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
1207
+ if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
1208
+ return canSwipeOnContent(contentEl);
1219
1209
  }
1220
1210
  return true;
1221
1211
  };
1222
1212
  const onStart = (detail) => {
1213
+ /**
1214
+ * Firefox automatically selects the header text during drag
1215
+ * due to the focusable wrapper (tabindex="-1"). Remove any
1216
+ * selection that may have occurred.
1217
+ */
1218
+ window.getSelection()?.removeAllRanges();
1223
1219
  /**
1224
1220
  * If canDismiss is anything other than `true`
1225
1221
  * then users should be able to swipe down
@@ -1239,9 +1235,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1239
1235
  * which would impact performance significantly.
1240
1236
  */
1241
1237
  if (!expandToScroll) {
1242
- const targetEl = index$2.findClosestIonContent(detail.event.target);
1238
+ const targetEl = index$1.findClosestIonContent(detail.event.target);
1243
1239
  cachedScrollEl =
1244
- targetEl && index$2.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1240
+ targetEl && index$1.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
1245
1241
  }
1246
1242
  /**
1247
1243
  * If expandToScroll is disabled, we need to swap
@@ -1347,12 +1343,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1347
1343
  };
1348
1344
  const onEnd = (detail) => {
1349
1345
  const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1346
+ /**
1347
+ * `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
1348
+ * snaps to 0 but never dismisses, since `handleCanDismiss` returns early
1349
+ * when canDismiss is not a function. A canDismiss function dismisses
1350
+ * through `handleCanDismiss`, which awaits the callback, so the outcome
1351
+ * is not known when this event is emitted.
1352
+ */
1353
+ const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
1354
+ const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
1350
1355
  const eventDetail = {
1351
1356
  currentY: detail.currentY,
1352
1357
  deltaY: detail.deltaY,
1353
1358
  velocityY: detail.velocityY,
1354
1359
  progress: calculateProgress(detail.currentY),
1355
1360
  snapBreakpoint,
1361
+ isDismissing,
1356
1362
  };
1357
1363
  /**
1358
1364
  * If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
@@ -1368,7 +1374,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1368
1374
  * swap to moving on drag and if we don't swap back here then the footer will get stuck.
1369
1375
  */
1370
1376
  swapFooterPosition('stationary');
1371
- onDragEnd(eventDetail);
1377
+ /**
1378
+ * The sheet does not move in this case, so the gesture
1379
+ * never dismisses the modal.
1380
+ */
1381
+ onDragEnd({ ...eventDetail, isDismissing: false });
1372
1382
  return;
1373
1383
  }
1374
1384
  moveSheetToBreakpoint({
@@ -1441,14 +1451,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1441
1451
  onDismiss();
1442
1452
  }
1443
1453
  /**
1444
- * Enables scrolling immediately if the sheet is about to fully expand
1445
- * or if it allows scrolling at any breakpoint. Without this, there would
1454
+ * Restores the content's scroll setting immediately if the sheet is about to
1455
+ * fully expand or if it allows scrolling at any breakpoint. Without this, there would
1446
1456
  * be a ~500ms delay while the modal animation completes, causing a
1447
1457
  * noticeable lag. Native iOS allows scrolling as soon as the gesture is
1448
1458
  * released, so we align with that behavior.
1449
1459
  */
1450
1460
  if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
1451
- contentEl.scrollY = true;
1461
+ contentEl.scrollY = initialContentScrollY;
1452
1462
  }
1453
1463
  /**
1454
1464
  * If expandToScroll is disabled and we're animating
@@ -1483,7 +1493,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1483
1493
  helpers.raf(() => {
1484
1494
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1485
1495
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1486
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1496
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1487
1497
  animation.progressStart(true, 1 - snapToBreakpoint);
1488
1498
  currentBreakpoint = snapToBreakpoint;
1489
1499
  onBreakpointChange(currentBreakpoint);
@@ -1619,7 +1629,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1619
1629
  */
1620
1630
  return viewportBottom - activeHeight;
1621
1631
  };
1622
- const gesture = index$1.createGesture({
1632
+ const gesture = index$2.createGesture({
1623
1633
  el: wrapperEl,
1624
1634
  gestureName: 'modalSheet',
1625
1635
  gesturePriority: 40,
@@ -1630,9 +1640,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1630
1640
  onMove,
1631
1641
  onEnd,
1632
1642
  });
1643
+ /**
1644
+ * Puts the content back the way the app declared it. A sheet can dismiss
1645
+ * without going through moveSheetToBreakpoint, and an inline modal reuses
1646
+ * the same element on the next present.
1647
+ */
1648
+ const resetContentScroll = () => {
1649
+ if (contentEl) {
1650
+ contentEl.scrollY = initialContentScrollY;
1651
+ }
1652
+ };
1633
1653
  return {
1634
1654
  gesture,
1635
1655
  moveSheetToBreakpoint,
1656
+ resetContentScroll,
1636
1657
  };
1637
1658
  };
1638
1659
 
@@ -1682,8 +1703,8 @@ const getRootSafeAreaTop = () => {
1682
1703
  if (cachedRootSafeAreaTop !== null) {
1683
1704
  return cachedRootSafeAreaTop;
1684
1705
  }
1685
- const doc = index.win === null || index.win === void 0 ? void 0 : index.win.document;
1686
- if (!(doc === null || doc === void 0 ? void 0 : doc.body)) {
1706
+ const doc = index.win?.document;
1707
+ if (!doc?.body) {
1687
1708
  return 0;
1688
1709
  }
1689
1710
  const el = doc.createElement('div');
@@ -1702,6 +1723,41 @@ const getRootSafeAreaTop = () => {
1702
1723
  }
1703
1724
  return value;
1704
1725
  };
1726
+ /**
1727
+ * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1728
+ * event and no window resize covers. The probe's height tracks the variable, so
1729
+ * a change to it becomes a size change the observer can see.
1730
+ */
1731
+ const onRootSafeAreaTopChange = (callback) => {
1732
+ const doc = index.win?.document;
1733
+ if (!doc?.body || typeof ResizeObserver === 'undefined') {
1734
+ return () => undefined;
1735
+ }
1736
+ const probe = doc.createElement('div');
1737
+ probe.style.cssText =
1738
+ 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1739
+ 'height:var(--ion-safe-area-top,0px);';
1740
+ doc.body.appendChild(probe);
1741
+ /**
1742
+ * Seeded with the value the caller has already applied, so a change that
1743
+ * lands before the observer's first delivery still gets reported. Comparing
1744
+ * against an unset value instead would consume that first delivery and treat
1745
+ * the new inset as the baseline.
1746
+ */
1747
+ let lastHeight = getRootSafeAreaTop();
1748
+ const observer = new ResizeObserver((entries) => {
1749
+ const { height } = entries[0].contentRect;
1750
+ if (height !== lastHeight) {
1751
+ lastHeight = height;
1752
+ callback(height);
1753
+ }
1754
+ });
1755
+ observer.observe(probe);
1756
+ return () => {
1757
+ observer.disconnect();
1758
+ probe.remove();
1759
+ };
1760
+ };
1705
1761
  /**
1706
1762
  * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1707
1763
  * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
@@ -1786,10 +1842,9 @@ const getInitialSafeAreaConfig = (context) => {
1786
1842
  * @returns SafeAreaConfig based on position
1787
1843
  */
1788
1844
  const getPositionBasedSafeAreaConfig = (wrapperEl) => {
1789
- var _a, _b;
1790
1845
  const rect = wrapperEl.getBoundingClientRect();
1791
- const vh = (_a = index.win === null || index.win === void 0 ? void 0 : index.win.innerHeight) !== null && _a !== void 0 ? _a : 0;
1792
- const vw = (_b = index.win === null || index.win === void 0 ? void 0 : index.win.innerWidth) !== null && _b !== void 0 ? _b : 0;
1846
+ const vh = index.win?.innerHeight ?? 0;
1847
+ const vw = index.win?.innerWidth ?? 0;
1793
1848
  // Only apply safe-area to sides where modal overlaps with screen edge
1794
1849
  return {
1795
1850
  top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
@@ -1822,9 +1877,9 @@ const clearSafeAreaOverrides = (hostEl) => {
1822
1877
  hostEl.style.removeProperty('--ion-safe-area-right');
1823
1878
  };
1824
1879
 
1825
- const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
1880
+ const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
1826
1881
 
1827
- const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
1882
+ const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{outline:none}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}`;
1828
1883
 
1829
1884
  const Modal = class {
1830
1885
  constructor(hostRef) {
@@ -1850,6 +1905,9 @@ const Modal = class {
1850
1905
  this.inline = false;
1851
1906
  // Whether or not modal is being dismissed via gesture
1852
1907
  this.gestureAnimationDismissing = false;
1908
+ // True from the first safe-area write in `present()` until the enter
1909
+ // animation settles. A position-based read in that window is not the rest position.
1910
+ this.isPresenting = false;
1853
1911
  this.presented = false;
1854
1912
  /** @internal */
1855
1913
  this.hasController = false;
@@ -1884,13 +1942,20 @@ const Modal = class {
1884
1942
  /**
1885
1943
  * The interaction behavior for the sheet modal when the handle is pressed.
1886
1944
  *
1887
- * Defaults to `"none"`, which means the modal will not change size or position when the handle is pressed.
1888
- * Set to `"cycle"` to let the modal cycle between available breakpoints when pressed.
1945
+ * Handle behavior is unavailable when the `handle` property is set to
1946
+ * `false` or when the `breakpoints` property is not set (using a
1947
+ * fullscreen or card modal).
1948
+ *
1949
+ * Set to `"cycle"` to make the handle focusable and let the sheet modal
1950
+ * cycle between available breakpoints when pressed. This keeps the sheet
1951
+ * operable with assistive technology.
1889
1952
  *
1890
- * Handle behavior is unavailable when the `handle` property is set to `false` or
1891
- * when the `breakpoints` property is not set (using a fullscreen or card modal).
1953
+ * Set to `"none"` to make the handle purely decorative when pressed and
1954
+ * removed from the tab order.
1955
+ *
1956
+ * Defaults to `"cycle"`.
1892
1957
  */
1893
- this.handleBehavior = 'none';
1958
+ this.handleBehavior = 'cycle';
1894
1959
  /**
1895
1960
  * If `true`, the modal will be dismissed when the backdrop is clicked.
1896
1961
  */
@@ -1999,8 +2064,13 @@ const Modal = class {
1999
2064
  */
2000
2065
  this.onModalFocus = (ev) => {
2001
2066
  const { dragHandleEl, el } = this;
2002
- // Only handle focus if the modal itself was focused (not a child element)
2003
- if (ev.target === el && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2067
+ /**
2068
+ * Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
2069
+ * true when a shadow child (the dialog wrapper present() focuses) is focused.
2070
+ * shadowRoot's activeElement is null only when the host was focused directly,
2071
+ * so redirect to the handle only then and leave present()'s wrapper focus intact.
2072
+ */
2073
+ if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2004
2074
  dragHandleEl.focus();
2005
2075
  }
2006
2076
  };
@@ -2074,6 +2144,17 @@ const Modal = class {
2074
2144
  const { el } = this;
2075
2145
  overlays.prepareOverlay(el);
2076
2146
  this.triggerChanged();
2147
+ // A disconnect tears down state this presentation still needs and cannot
2148
+ // tell a re-insert from a removal, so put it back.
2149
+ if (this.presented || this.isPresenting) {
2150
+ this.restoreSafeAreaOverrides();
2151
+ }
2152
+ // A relocation from `willPresent` reaches these before `present()` has
2153
+ // applied the lock, so they apply it instead. Both are idempotent.
2154
+ if (this.presented) {
2155
+ overlays.restoreRootFocusTrapAccessibility(el);
2156
+ this.initParentRemovalObserver();
2157
+ }
2077
2158
  }
2078
2159
  disconnectedCallback() {
2079
2160
  this.triggerController.removeClickListener();
@@ -2082,9 +2163,12 @@ const Modal = class {
2082
2163
  // Also called in dismiss() — intentional dual cleanup covers both
2083
2164
  // dismiss-then-remove and direct DOM removal without dismiss.
2084
2165
  this.cleanupSafeAreaOverrides();
2166
+ // Clean up aria-hidden if removed without dismiss() being called
2167
+ if (this.presented) {
2168
+ overlays.cleanupRootFocusTrapAccessibility();
2169
+ }
2085
2170
  }
2086
2171
  componentWillLoad() {
2087
- var _a;
2088
2172
  const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
2089
2173
  const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
2090
2174
  const attributesToInherit = ['aria-label', 'role'];
@@ -2119,7 +2203,10 @@ const Modal = class {
2119
2203
  * htmlAttributes wins, but that's not a pattern that we recommend.
2120
2204
  * The only time you'd need htmlAttributes is when using modalController.
2121
2205
  */
2122
- this.inheritedAttributes = Object.assign(Object.assign({}, this.inheritedAttributes), { [attribute]: htmlAttributes[attribute] });
2206
+ this.inheritedAttributes = {
2207
+ ...this.inheritedAttributes,
2208
+ [attribute]: htmlAttributes[attribute],
2209
+ };
2123
2210
  delete htmlAttributes[attribute];
2124
2211
  }
2125
2212
  });
@@ -2130,7 +2217,7 @@ const Modal = class {
2130
2217
  if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
2131
2218
  index$3.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2132
2219
  }
2133
- if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
2220
+ if (!this.htmlAttributes?.id) {
2134
2221
  overlays.setOverlayId(this.el);
2135
2222
  }
2136
2223
  }
@@ -2245,25 +2332,33 @@ const Modal = class {
2245
2332
  // Recalculate isSheetModal before safe-area setup because framework
2246
2333
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
2247
2334
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
2248
- // Set initial safe-area overrides before animation
2249
- this.setInitialSafeAreaOverrides();
2335
+ this.isPresenting = true;
2250
2336
  const hasCardModal = presentingElement !== undefined;
2251
- /**
2252
- * We need to change the status bar at the
2253
- * start of the animation so that it completes
2254
- * by the time the card animation is done.
2255
- */
2256
- if (hasCardModal && ionicGlobal.getIonMode(this) === 'ios') {
2257
- // Cache the original status bar color before the modal is presented
2258
- this.statusBarStyle = await StatusBar.getStyle();
2259
- setCardStatusBarDark();
2337
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
2338
+ // the position-based correction for the life of this instance.
2339
+ try {
2340
+ // Set initial safe-area overrides before animation
2341
+ this.setInitialSafeAreaOverrides();
2342
+ /**
2343
+ * We need to change the status bar at the
2344
+ * start of the animation so that it completes
2345
+ * by the time the card animation is done.
2346
+ */
2347
+ if (hasCardModal && ionicGlobal.getIonMode(this) === 'ios') {
2348
+ // Cache the original status bar color before the modal is presented
2349
+ this.statusBarStyle = await StatusBar.getStyle();
2350
+ setCardStatusBarDark();
2351
+ }
2352
+ await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2353
+ presentingEl: presentingElement,
2354
+ currentBreakpoint: this.initialBreakpoint,
2355
+ backdropBreakpoint: this.backdropBreakpoint,
2356
+ expandToScroll: this.expandToScroll,
2357
+ });
2358
+ }
2359
+ finally {
2360
+ this.isPresenting = false;
2260
2361
  }
2261
- await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2262
- presentingEl: presentingElement,
2263
- currentBreakpoint: this.initialBreakpoint,
2264
- backdropBreakpoint: this.backdropBreakpoint,
2265
- expandToScroll: this.expandToScroll,
2266
- });
2267
2362
  // Update safe-area based on actual position after animation
2268
2363
  this.updateSafeAreaOverrides();
2269
2364
  // Apply fullscreen safe-area padding if needed
@@ -2312,7 +2407,6 @@ const Modal = class {
2312
2407
  unlock();
2313
2408
  }
2314
2409
  initSwipeToClose() {
2315
- var _a;
2316
2410
  if (ionicGlobal.getIonMode(this) !== 'ios') {
2317
2411
  return;
2318
2412
  }
@@ -2325,12 +2419,12 @@ const Modal = class {
2325
2419
  presentingEl: this.presentingElement,
2326
2420
  expandToScroll: this.expandToScroll,
2327
2421
  }));
2328
- const contentEl = index$2.findIonContent(el);
2422
+ const contentEl = index$1.findIonContent(el);
2329
2423
  if (!contentEl) {
2330
- index$2.printIonContentErrorMsg(el);
2424
+ index$1.printIonContentErrorMsg(el);
2331
2425
  return;
2332
2426
  }
2333
- const statusBarStyle = (_a = this.statusBarStyle) !== null && _a !== void 0 ? _a : Style.Default;
2427
+ const statusBarStyle = this.statusBarStyle ?? Style.Default;
2334
2428
  this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2335
2429
  this.gesture.enable(true);
2336
2430
  }
@@ -2347,7 +2441,7 @@ const Modal = class {
2347
2441
  expandToScroll: this.expandToScroll,
2348
2442
  }));
2349
2443
  ani.progressStart(true, 1);
2350
- const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => { var _a; return (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : 0; }, () => this.sheetOnDismiss(), (breakpoint) => {
2444
+ const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
2351
2445
  if (this.currentBreakpoint !== breakpoint) {
2352
2446
  this.currentBreakpoint = breakpoint;
2353
2447
  this.ionBreakpointDidChange.emit({ breakpoint });
@@ -2355,6 +2449,7 @@ const Modal = class {
2355
2449
  }, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2356
2450
  this.gesture = gesture;
2357
2451
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2452
+ this.resetSheetContentScroll = resetContentScroll;
2358
2453
  this.gesture.enable(true);
2359
2454
  /**
2360
2455
  * When backdrop interaction is allowed, nested router outlets from child routes
@@ -2372,7 +2467,6 @@ const Modal = class {
2372
2467
  * passthrough on child route page wrappers and nested router outlets.
2373
2468
  */
2374
2469
  setupChildRoutePassthrough() {
2375
- var _a;
2376
2470
  // Cache the page parent for cleanup
2377
2471
  this.cachedPageParent = this.getOriginalPageParent();
2378
2472
  const pageParent = this.cachedPageParent;
@@ -2380,14 +2474,11 @@ const Modal = class {
2380
2474
  if (!pageParent || pageParent.tagName === 'ION-APP') {
2381
2475
  return;
2382
2476
  }
2383
- const hasVisibleContent = Array.from(pageParent.children).some((child) => {
2384
- var _a;
2385
- return child !== this.el &&
2386
- !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2387
- child.tagName !== 'TEMPLATE' &&
2388
- child.tagName !== 'SLOT' &&
2389
- !(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
2390
- });
2477
+ const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
2478
+ !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2479
+ child.tagName !== 'TEMPLATE' &&
2480
+ child.tagName !== 'SLOT' &&
2481
+ !(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
2391
2482
  if (hasVisibleContent) {
2392
2483
  return;
2393
2484
  }
@@ -2395,7 +2486,7 @@ const Modal = class {
2395
2486
  pageParent.classList.add('ion-page-overlay-passthrough');
2396
2487
  // Also make nested router outlets passthrough
2397
2488
  const routerOutlet = pageParent.parentElement;
2398
- if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
2489
+ if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
2399
2490
  routerOutlet.style.setProperty('pointer-events', 'none');
2400
2491
  routerOutlet.setAttribute('data-overlay-passthrough', 'true');
2401
2492
  }
@@ -2423,7 +2514,7 @@ const Modal = class {
2423
2514
  }
2424
2515
  pageParent.classList.remove('ion-page-overlay-passthrough');
2425
2516
  const routerOutlet = pageParent.parentElement;
2426
- if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
2517
+ if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
2427
2518
  routerOutlet.style.removeProperty('pointer-events');
2428
2519
  routerOutlet.removeAttribute('data-overlay-passthrough');
2429
2520
  }
@@ -2486,7 +2577,6 @@ const Modal = class {
2486
2577
  * For example, `cancel` or `backdrop`.
2487
2578
  */
2488
2579
  async dismiss(data, role) {
2489
- var _a;
2490
2580
  if (this.gestureAnimationDismissing && role !== overlays.GESTURE) {
2491
2581
  return false;
2492
2582
  }
@@ -2531,7 +2621,7 @@ const Modal = class {
2531
2621
  }
2532
2622
  const dismissed = await overlays.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2533
2623
  presentingEl: presentingElement,
2534
- currentBreakpoint: (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : this.initialBreakpoint,
2624
+ currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
2535
2625
  backdropBreakpoint: this.backdropBreakpoint,
2536
2626
  expandToScroll: this.expandToScroll,
2537
2627
  });
@@ -2545,6 +2635,13 @@ const Modal = class {
2545
2635
  if (this.gesture) {
2546
2636
  this.gesture.destroy();
2547
2637
  }
2638
+ /**
2639
+ * The sheet gesture turns content scrolling off while the sheet sits below
2640
+ * the top breakpoint. Inline modals reuse the same content on the next
2641
+ * present, so hand it back before the gesture goes away.
2642
+ */
2643
+ this.resetSheetContentScroll?.();
2644
+ this.resetSheetContentScroll = undefined;
2548
2645
  this.cleanupViewTransitionListener();
2549
2646
  this.cleanupParentRemovalObserver();
2550
2647
  this.cleanupSafeAreaOverrides();
@@ -2719,7 +2816,7 @@ const Modal = class {
2719
2816
  wrapperEl.style.transform = 'translateY(0vh)';
2720
2817
  wrapperEl.style.opacity = '1';
2721
2818
  }
2722
- if ((presentingElement === null || presentingElement === void 0 ? void 0 : presentingElement.tagName) === 'ION-MODAL') {
2819
+ if (presentingElement?.tagName === 'ION-MODAL') {
2723
2820
  const isPortrait = window.innerWidth < 768;
2724
2821
  if (isPortrait) {
2725
2822
  const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
@@ -2735,7 +2832,7 @@ const Modal = class {
2735
2832
  }
2736
2833
  async dismissNestedModals() {
2737
2834
  const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
2738
- nestedModals === null || nestedModals === void 0 ? void 0 : nestedModals.forEach(async (modal) => {
2835
+ nestedModals?.forEach(async (modal) => {
2739
2836
  await modal.dismiss(undefined, 'parent-dismissed');
2740
2837
  });
2741
2838
  }
@@ -2763,15 +2860,17 @@ const Modal = class {
2763
2860
  this.cachedOriginalParent.tagName === 'ION-APP') {
2764
2861
  return;
2765
2862
  }
2863
+ // Both `present()` and a reconnect call this, so drop any existing
2864
+ // observer. Below the guards, so a call that bails cannot leave none.
2865
+ this.cleanupParentRemovalObserver();
2766
2866
  this.parentRemovalObserver = new MutationObserver((mutations) => {
2767
2867
  mutations.forEach((mutation) => {
2768
2868
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
2769
2869
  // Check if our cached original parent was removed
2770
2870
  const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
2771
- var _a, _b;
2772
2871
  const isDirectMatch = node === this.cachedOriginalParent;
2773
2872
  const isContainedMatch = this.cachedOriginalParent
2774
- ? (_b = (_a = node).contains) === null || _b === void 0 ? void 0 : _b.call(_a, this.cachedOriginalParent)
2873
+ ? node.contains?.(this.cachedOriginalParent)
2775
2874
  : false;
2776
2875
  return isDirectMatch || isContainedMatch;
2777
2876
  });
@@ -2793,8 +2892,7 @@ const Modal = class {
2793
2892
  });
2794
2893
  }
2795
2894
  cleanupParentRemovalObserver() {
2796
- var _a;
2797
- (_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
2895
+ this.parentRemovalObserver?.disconnect();
2798
2896
  this.parentRemovalObserver = undefined;
2799
2897
  }
2800
2898
  onDragStart() {
@@ -2834,22 +2932,30 @@ const Modal = class {
2834
2932
  * sheets to prevent header content from getting double-offset padding).
2835
2933
  */
2836
2934
  setInitialSafeAreaOverrides() {
2837
- const context = Object.assign(Object.assign({}, this.getSafeAreaContext()), { hasCustomDimensions: hasCustomModalDimensions(this.el) });
2935
+ const context = {
2936
+ ...this.getSafeAreaContext(),
2937
+ hasCustomDimensions: hasCustomModalDimensions(this.el),
2938
+ };
2838
2939
  const safeAreaConfig = getInitialSafeAreaConfig(context);
2839
2940
  applySafeAreaOverrides(this.el, safeAreaConfig);
2840
2941
  // Set the internal offset property with the resolved root safe-area-top value
2841
2942
  if (context.isSheetModal) {
2842
2943
  this.updateSheetOffsetTop();
2944
+ // A restore after a DOM move runs this a second time for the same
2945
+ // modal, so drop the previous subscription rather than stacking one.
2946
+ this.unsubscribeRootSafeAreaTop?.();
2947
+ this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
2843
2948
  }
2844
2949
  }
2845
2950
  /**
2846
- * Resolves the current root --ion-safe-area-top value and sets the
2847
- * internal --ion-modal-offset-top property on the host element.
2848
- * Called on present and on resize (e.g., device rotation changes safe-area).
2951
+ * Sets the internal --ion-modal-offset-top property on the host element,
2952
+ * resolving the current root --ion-safe-area-top when no value is given.
2953
+ * Called on present, on resize (e.g., device rotation changes safe-area),
2954
+ * and whenever the root safe-area value itself changes.
2849
2955
  */
2850
- updateSheetOffsetTop() {
2851
- const safeAreaTop = getRootSafeAreaTop();
2852
- this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`);
2956
+ updateSheetOffsetTop(safeAreaTop) {
2957
+ const value = safeAreaTop ?? getRootSafeAreaTop();
2958
+ this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
2853
2959
  }
2854
2960
  /**
2855
2961
  * Updates safe-area overrides during dynamic state changes.
@@ -2949,11 +3055,38 @@ const Modal = class {
2949
3055
  */
2950
3056
  cleanupSafeAreaOverrides() {
2951
3057
  clearSafeAreaOverrides(this.el);
3058
+ this.unsubscribeRootSafeAreaTop?.();
3059
+ this.unsubscribeRootSafeAreaTop = undefined;
2952
3060
  // Remove internal sheet offset property
2953
3061
  this.el.style.removeProperty('--ion-modal-offset-top');
2954
3062
  const { contentEl } = this.findContentAndFooter();
2955
3063
  this.clearContentSafeAreaPadding(contentEl);
2956
3064
  }
3065
+ /**
3066
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
3067
+ * while presented. Anything needing no measurement goes on synchronously so
3068
+ * the modal is never painted without safe-area. The position-based
3069
+ * correction waits a frame for the layout pass it reads.
3070
+ */
3071
+ restoreSafeAreaOverrides() {
3072
+ this.setInitialSafeAreaOverrides();
3073
+ this.applyFullscreenSafeArea();
3074
+ helpers.raf(() => {
3075
+ // A dismiss or another move can land first, and a read before the enter
3076
+ // animation settles is not the rest position. `present()` redoes it.
3077
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
3078
+ return;
3079
+ }
3080
+ // A hidden subtree carries `display: none`, so there is no box and the
3081
+ // read would write the safe-area for a modal touching no edge. The
3082
+ // prediction applied above holds until the modal is shown again.
3083
+ const { width, height } = this.el.getBoundingClientRect();
3084
+ if (width === 0 && height === 0) {
3085
+ return;
3086
+ }
3087
+ this.updateSafeAreaOverrides();
3088
+ });
3089
+ }
2957
3090
  render() {
2958
3091
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
2959
3092
  const showHandle = handle !== false && isSheetModal;
@@ -2961,20 +3094,35 @@ const Modal = class {
2961
3094
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2962
3095
  const isHandleCycle = handleBehavior === 'cycle';
2963
3096
  const isSheetModalWithHandle = isSheetModal && showHandle;
2964
- return (index$3.h(index$3.Host, Object.assign({ key: 'ab93657f4a5b4c97168d292b398d975e4b5b4af4', "no-router": true,
3097
+ return (index$3.h(index$3.Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
2965
3098
  // Allow the modal to be navigable when the handle is focusable
2966
- tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
3099
+ tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
2967
3100
  zIndex: `${20000 + this.overlayIndex}`,
2968
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, theme.getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), index$3.h("ion-backdrop", { key: '5ba6315c7c8c64fa04c62f85fd493da5275b2cbd', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: 'a76c48d41c67f86c18a7481e980e6925e614f85d', class: "modal-shadow" }), index$3.h("div", Object.assign({ key: '3f6c61ba60b063592784d76a9594073b3bf210a9',
3101
+ }, class: {
3102
+ [mode]: true,
3103
+ ['modal-default']: !isCardModal && !isSheetModal,
3104
+ [`modal-card`]: isCardModal,
3105
+ [`modal-sheet`]: isSheetModal,
3106
+ [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
3107
+ 'overlay-hidden': true,
3108
+ [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3109
+ ...theme.getClassMap(this.cssClass),
3110
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$3.h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), index$3.h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
2969
3111
  /*
2970
3112
  role and aria-modal must be used on the
2971
3113
  same element. They must also be set inside the
2972
3114
  shadow DOM otherwise ion-button will not be highlighted
2973
3115
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
3116
+
3117
+ tabIndex={-1} is required so present() can move focus to this
3118
+ element (which carries the dialog role) instead of the role-less
3119
+ host. role="dialog" alone does not make an element focusable, so
3120
+ without the tabindex focus() would be a no-op and screen readers
3121
+ may not properly announce the dialog and its content when it opens.
2974
3122
  */
2975
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (index$3.h("button", { key: '7f66b4fdb3dec61a2b9aec4e9dbacf5d013d637c', class: "modal-handle",
3123
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$3.h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
2976
3124
  // Prevents the handle from receiving keyboard focus when it does not cycle
2977
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '2dfaaebe3d0b2a46be1224c25f9ab89bf1744332', onSlotchange: this.onSlotChange }))));
3125
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
2978
3126
  }
2979
3127
  get el() { return index$3.getElement(this); }
2980
3128
  static get watchers() { return {