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
@@ -1,24 +1,25 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-tcQvqkiX.js';
5
- import { f as findClosestIonContent, i as isIonContent, d as disableContentScrollY, r as resetContentScrollY, a as findIonContent, p as printIonContentErrorMsg } from './index-MEDq2S8l.js';
6
- import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-FnPGymXL.js';
7
- import { e as clamp, g as getElementRoot, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-HEqiOzXb.js';
4
+ import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-C23AVPx9.js';
5
+ import { i as isIonContent, f as findRefresherInContent, a as findClosestIonContent, d as disableContentScrollY, r as resetContentScrollY, b as findIonContent, p as printIonContentErrorMsg } from './index-C1b9CLFg.js';
6
+ import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-BwNhx9NR.js';
7
+ import { g as getElementRoot, e as clamp, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-BSmc0nst.js';
8
8
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
9
9
  import { g as getCapacitor } from './capacitor-CFERIeaU.js';
10
- import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-TbiM4mdr.js';
11
- import { g as getClassMap } from './theme-DiVJyqlX.js';
12
- import { e as deepReady, w as waitForMount } from './index-B_dQk_WE.js';
13
- import { b as getIonMode } from './ionic-global-Cp_eT4sZ.js';
14
- import { KEYBOARD_DID_OPEN } from './keyboard-ywgs5efA.js';
15
- import { c as createAnimation } from './animation-DLJpuoEz.js';
10
+ import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, d as createTriggerController, B as BACKDROP, h as prepareOverlay, r as restoreRootFocusTrapAccessibility, j as cleanupRootFocusTrapAccessibility, k as setOverlayId, e as present, f as dismiss, g as eventMethod } from './overlays-DKE0DgvE.js';
11
+ import { g as getClassMap } from './theme-byZM6qHV.js';
12
+ import { e as deepReady, w as waitForMount } from './index-DnA_7Bnx.js';
13
+ import { b as getIonMode } from './ionic-global-ZXjCXKH0.js';
14
+ import { KEYBOARD_DID_OPEN } from './keyboard-Cj8mLJeq.js';
15
+ import { c as createAnimation } from './animation-BFNVlYum.js';
16
16
  import { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
17
- import { createGesture } from './index-CfgBF1SE.js';
17
+ import { createGesture } from './index-BmLuEdV7.js';
18
18
  import { w as win } from './index-ZjP4CjeZ.js';
19
- import './hardware-back-button-B93Gru0Y.js';
20
- import './gesture-controller-BTEOs1at.js';
21
- import './keyboard-CUw4ekVy.js';
19
+ import './dir-Dojwmvde.js';
20
+ import './hardware-back-button-DmkiRgOT.js';
21
+ import './gesture-controller-B_gJaBk0.js';
22
+ import './keyboard-DAF8GNJ9.js';
22
23
 
23
24
  var Style;
24
25
  (function (Style) {
@@ -29,7 +30,7 @@ var Style;
29
30
  const StatusBar = {
30
31
  getEngine() {
31
32
  const capacitor = getCapacitor();
32
- if (capacitor === null || capacitor === void 0 ? void 0 : capacitor.isPluginAvailable('StatusBar')) {
33
+ if (capacitor?.isPluginAvailable('StatusBar')) {
33
34
  return capacitor.Plugins.StatusBar;
34
35
  }
35
36
  return undefined;
@@ -127,6 +128,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
127
128
  StatusBar.setStyle({ style: defaultStyle });
128
129
  };
129
130
 
131
+ /**
132
+ * Swiping is only possible when the content is scrolled to the top, so that we
133
+ * do not interfere with scrolling, and never on content with a refresher.
134
+ *
135
+ * Note: We cannot solve the refresher case with gesture priority as the iOS
136
+ * native refresh gesture uses a scroll listener in addition to a gesture.
137
+ *
138
+ * Note: Do not use `getScrollElement` here because we need this to be a
139
+ * synchronous operation, and `getScrollElement` is asynchronous.
140
+ */
141
+ const canSwipeOnContent = (contentEl) => {
142
+ const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
143
+ const hasRefresherInContent = !!findRefresherInContent(contentEl);
144
+ return !hasRefresherInContent && scrollEl.scrollTop === 0;
145
+ };
130
146
  const handleCanDismiss = async (el, animation) => {
131
147
  /**
132
148
  * If canDismiss is not a function
@@ -257,7 +273,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
257
273
  let isOpen = false;
258
274
  let canDismissBlocksGesture = false;
259
275
  let contentEl = null;
260
- let scrollEl = null;
261
276
  const canDismissMaxStep = 0.2;
262
277
  let initialScrollY = true;
263
278
  let lastStep = 0;
@@ -280,12 +295,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
280
295
  return true;
281
296
  }
282
297
  /**
283
- * If we are swiping on the content,
284
- * swiping should only be possible if
285
- * the content is scrolled all the way
286
- * to the top so that we do not interfere
287
- * with scrolling.
288
- *
289
298
  * We cannot assume that the `ion-content`
290
299
  * target will remain consistent between
291
300
  * swipes. For example, when using
@@ -296,29 +305,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
296
305
  */
297
306
  contentEl = findClosestIonContent(target);
298
307
  if (contentEl) {
299
- /**
300
- * The card should never swipe to close
301
- * on the content with a refresher.
302
- * Note: We cannot solve this by making the
303
- * swipeToClose gesture have a higher priority
304
- * than the refresher gesture as the iOS native
305
- * refresh gesture uses a scroll listener in
306
- * addition to a gesture.
307
- *
308
- * Note: Do not use getScrollElement here
309
- * because we need this to be a synchronous
310
- * operation, and getScrollElement is
311
- * asynchronous.
312
- */
313
- if (isIonContent(contentEl)) {
314
- const root = getElementRoot(contentEl);
315
- scrollEl = root.querySelector('.inner-scroll');
316
- }
317
- else {
318
- scrollEl = contentEl;
319
- }
320
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
321
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
308
+ return canSwipeOnContent(contentEl);
322
309
  }
323
310
  /**
324
311
  * Card should be swipeable on all
@@ -332,6 +319,12 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
332
319
  };
333
320
  const onStart = (detail) => {
334
321
  const { deltaY } = detail;
322
+ /**
323
+ * Firefox automatically selects the header text during drag
324
+ * due to the focusable wrapper (tabindex="-1"). Remove any
325
+ * selection that may have occurred.
326
+ */
327
+ window.getSelection()?.removeAllRanges();
335
328
  /**
336
329
  * Get the initial scrollY value so
337
330
  * that we can correctly reset the scrollY
@@ -484,17 +477,30 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
484
477
  * check canDismiss. 25% was chosen
485
478
  * to avoid accidental swipes.
486
479
  */
487
- if (isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4) {
480
+ const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
481
+ if (isAttemptingCanDismiss) {
488
482
  handleCanDismiss(el, animation);
489
483
  }
490
484
  else if (shouldComplete) {
491
485
  onDismiss();
492
486
  }
487
+ /**
488
+ * `shouldComplete` is not enough on its own, since it is always `false`
489
+ * when canDismiss blocks the gesture. `canDismiss: false` blocks it and
490
+ * never dismisses, because `handleCanDismiss` returns early when
491
+ * canDismiss is not a function. A canDismiss function dismisses through
492
+ * `handleCanDismiss`, which awaits the callback, so the outcome is not
493
+ * known when this event is emitted.
494
+ */
495
+ const isDismissing = isAttemptingDismissWithCanDismiss
496
+ ? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
497
+ : shouldComplete;
493
498
  const eventDetail = {
494
499
  currentY: detail.currentY,
495
500
  deltaY: detail.deltaY,
496
501
  velocityY: detail.velocityY,
497
502
  progress: calculateProgress(el, detail.deltaY),
503
+ isDismissing,
498
504
  snapBreakpoint: shouldComplete ? 0 : 1,
499
505
  };
500
506
  onDragEnd(eventDetail);
@@ -632,7 +638,7 @@ const iosEnterAnimation = (baseEl, opts) => {
632
638
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
633
639
  // The content animation is only added if scrolling is enabled for
634
640
  // all the breakpoints.
635
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
641
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
636
642
  const baseAnimation = createAnimation('entering-base')
637
643
  .addElement(baseEl)
638
644
  .easing('cubic-bezier(0.32,0.72,0,1)')
@@ -965,7 +971,7 @@ const mdEnterAnimation = (baseEl, opts) => {
965
971
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
966
972
  // The content animation is only added if scrolling is enabled for
967
973
  // all the breakpoints.
968
- !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
974
+ !expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
969
975
  const baseAnimation = createAnimation()
970
976
  .addElement(baseEl)
971
977
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
@@ -1024,6 +1030,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1024
1030
  ],
1025
1031
  };
1026
1032
  const contentEl = baseEl.querySelector('ion-content');
1033
+ // Cache the initial value so the gesture restores it instead of forcing scrolling on.
1034
+ const initialContentScrollY = contentEl?.scrollY ?? true;
1027
1035
  const height = wrapperEl.clientHeight;
1028
1036
  let currentBreakpoint = initialBreakpoint;
1029
1037
  let offset = 0;
@@ -1089,9 +1097,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1089
1097
  cachedFooterEl.style.removeProperty('height');
1090
1098
  cachedFooterEl.style.removeProperty('top');
1091
1099
  cachedFooterEl.style.removeProperty('left');
1092
- page === null || page === void 0 ? void 0 : page.style.removeProperty('padding-bottom');
1100
+ page?.style.removeProperty('padding-bottom');
1093
1101
  // Move to page
1094
- page === null || page === void 0 ? void 0 : page.appendChild(cachedFooterEl);
1102
+ page?.appendChild(cachedFooterEl);
1095
1103
  });
1096
1104
  }
1097
1105
  else {
@@ -1135,7 +1143,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1135
1143
  // when the footer is positioned absolutely. This has to be done before we
1136
1144
  // make the footer absolutely positioned or we may accidentally cause the
1137
1145
  // sheet to scroll.
1138
- page === null || page === void 0 ? void 0 : page.style.setProperty('padding-bottom', `${footerHeights}px`);
1146
+ page?.style.setProperty('padding-bottom', `${footerHeights}px`);
1139
1147
  // Apply positioning styles to keep footer at bottom
1140
1148
  cachedFooterEl.classList.add('modal-footer-moving');
1141
1149
  // Apply our preserved styles to pin the footer
@@ -1160,7 +1168,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1160
1168
  if (wrapperAnimation && backdropAnimation) {
1161
1169
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1162
1170
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1163
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1171
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1164
1172
  animation.progressStart(true, 1 - currentBreakpoint);
1165
1173
  /**
1166
1174
  * If backdrop is not enabled, then content
@@ -1184,9 +1192,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1184
1192
  }
1185
1193
  const canStart = (detail) => {
1186
1194
  /**
1187
- * If we are swiping on the content, swiping should only be possible if the content
1188
- * is scrolled all the way to the top so that we do not interfere with scrolling.
1189
- *
1190
1195
  * We cannot assume that the `ion-content` target will remain consistent between swipes.
1191
1196
  * For example, when using ion-nav within a modal it is possible to swipe, push a view,
1192
1197
  * and then swipe again. The target content will not be the same between swipes.
@@ -1194,30 +1199,21 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1194
1199
  const contentEl = findClosestIonContent(detail.event.target);
1195
1200
  currentBreakpoint = getCurrentBreakpoint();
1196
1201
  /**
1197
- * If `expandToScroll` is disabled, we should not allow the swipe gesture
1198
- * to start if the content is not scrolled to the top.
1202
+ * Upwards swipes on the content cannot move the sheet anyway, so this only
1203
+ * blocks swiping the sheet down from the content.
1199
1204
  */
1200
- if (!expandToScroll && contentEl) {
1201
- const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1202
- return scrollEl.scrollTop === 0;
1203
- }
1204
- if (currentBreakpoint === 1 && contentEl) {
1205
- /**
1206
- * The modal should never swipe to close on the content with a refresher.
1207
- * Note 1: We cannot solve this by making this gesture have a higher priority than
1208
- * the refresher gesture as the iOS native refresh gesture uses a scroll listener in
1209
- * addition to a gesture.
1210
- *
1211
- * Note 2: Do not use getScrollElement here because we need this to be a synchronous
1212
- * operation, and getScrollElement is asynchronous.
1213
- */
1214
- const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
1215
- const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
1216
- return !hasRefresherInContent && scrollEl.scrollTop === 0;
1205
+ if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
1206
+ return canSwipeOnContent(contentEl);
1217
1207
  }
1218
1208
  return true;
1219
1209
  };
1220
1210
  const onStart = (detail) => {
1211
+ /**
1212
+ * Firefox automatically selects the header text during drag
1213
+ * due to the focusable wrapper (tabindex="-1"). Remove any
1214
+ * selection that may have occurred.
1215
+ */
1216
+ window.getSelection()?.removeAllRanges();
1221
1217
  /**
1222
1218
  * If canDismiss is anything other than `true`
1223
1219
  * then users should be able to swipe down
@@ -1345,12 +1341,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1345
1341
  };
1346
1342
  const onEnd = (detail) => {
1347
1343
  const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1344
+ /**
1345
+ * `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
1346
+ * snaps to 0 but never dismisses, since `handleCanDismiss` returns early
1347
+ * when canDismiss is not a function. A canDismiss function dismisses
1348
+ * through `handleCanDismiss`, which awaits the callback, so the outcome
1349
+ * is not known when this event is emitted.
1350
+ */
1351
+ const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
1352
+ const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
1348
1353
  const eventDetail = {
1349
1354
  currentY: detail.currentY,
1350
1355
  deltaY: detail.deltaY,
1351
1356
  velocityY: detail.velocityY,
1352
1357
  progress: calculateProgress(detail.currentY),
1353
1358
  snapBreakpoint,
1359
+ isDismissing,
1354
1360
  };
1355
1361
  /**
1356
1362
  * If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
@@ -1366,7 +1372,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1366
1372
  * swap to moving on drag and if we don't swap back here then the footer will get stuck.
1367
1373
  */
1368
1374
  swapFooterPosition('stationary');
1369
- onDragEnd(eventDetail);
1375
+ /**
1376
+ * The sheet does not move in this case, so the gesture
1377
+ * never dismisses the modal.
1378
+ */
1379
+ onDragEnd({ ...eventDetail, isDismissing: false });
1370
1380
  return;
1371
1381
  }
1372
1382
  moveSheetToBreakpoint({
@@ -1439,14 +1449,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1439
1449
  onDismiss();
1440
1450
  }
1441
1451
  /**
1442
- * Enables scrolling immediately if the sheet is about to fully expand
1443
- * or if it allows scrolling at any breakpoint. Without this, there would
1452
+ * Restores the content's scroll setting immediately if the sheet is about to
1453
+ * fully expand or if it allows scrolling at any breakpoint. Without this, there would
1444
1454
  * be a ~500ms delay while the modal animation completes, causing a
1445
1455
  * noticeable lag. Native iOS allows scrolling as soon as the gesture is
1446
1456
  * released, so we align with that behavior.
1447
1457
  */
1448
1458
  if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
1449
- contentEl.scrollY = true;
1459
+ contentEl.scrollY = initialContentScrollY;
1450
1460
  }
1451
1461
  /**
1452
1462
  * If expandToScroll is disabled and we're animating
@@ -1481,7 +1491,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1481
1491
  raf(() => {
1482
1492
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
1483
1493
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
1484
- contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1494
+ contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
1485
1495
  animation.progressStart(true, 1 - snapToBreakpoint);
1486
1496
  currentBreakpoint = snapToBreakpoint;
1487
1497
  onBreakpointChange(currentBreakpoint);
@@ -1628,9 +1638,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1628
1638
  onMove,
1629
1639
  onEnd,
1630
1640
  });
1641
+ /**
1642
+ * Puts the content back the way the app declared it. A sheet can dismiss
1643
+ * without going through moveSheetToBreakpoint, and an inline modal reuses
1644
+ * the same element on the next present.
1645
+ */
1646
+ const resetContentScroll = () => {
1647
+ if (contentEl) {
1648
+ contentEl.scrollY = initialContentScrollY;
1649
+ }
1650
+ };
1631
1651
  return {
1632
1652
  gesture,
1633
1653
  moveSheetToBreakpoint,
1654
+ resetContentScroll,
1634
1655
  };
1635
1656
  };
1636
1657
 
@@ -1680,8 +1701,8 @@ const getRootSafeAreaTop = () => {
1680
1701
  if (cachedRootSafeAreaTop !== null) {
1681
1702
  return cachedRootSafeAreaTop;
1682
1703
  }
1683
- const doc = win === null || win === void 0 ? void 0 : win.document;
1684
- if (!(doc === null || doc === void 0 ? void 0 : doc.body)) {
1704
+ const doc = win?.document;
1705
+ if (!doc?.body) {
1685
1706
  return 0;
1686
1707
  }
1687
1708
  const el = doc.createElement('div');
@@ -1700,6 +1721,41 @@ const getRootSafeAreaTop = () => {
1700
1721
  }
1701
1722
  return value;
1702
1723
  };
1724
+ /**
1725
+ * Calls back when the resolved root `--ion-safe-area-top` changes, which no
1726
+ * event and no window resize covers. The probe's height tracks the variable, so
1727
+ * a change to it becomes a size change the observer can see.
1728
+ */
1729
+ const onRootSafeAreaTopChange = (callback) => {
1730
+ const doc = win?.document;
1731
+ if (!doc?.body || typeof ResizeObserver === 'undefined') {
1732
+ return () => undefined;
1733
+ }
1734
+ const probe = doc.createElement('div');
1735
+ probe.style.cssText =
1736
+ 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
1737
+ 'height:var(--ion-safe-area-top,0px);';
1738
+ doc.body.appendChild(probe);
1739
+ /**
1740
+ * Seeded with the value the caller has already applied, so a change that
1741
+ * lands before the observer's first delivery still gets reported. Comparing
1742
+ * against an unset value instead would consume that first delivery and treat
1743
+ * the new inset as the baseline.
1744
+ */
1745
+ let lastHeight = getRootSafeAreaTop();
1746
+ const observer = new ResizeObserver((entries) => {
1747
+ const { height } = entries[0].contentRect;
1748
+ if (height !== lastHeight) {
1749
+ lastHeight = height;
1750
+ callback(height);
1751
+ }
1752
+ });
1753
+ observer.observe(probe);
1754
+ return () => {
1755
+ observer.disconnect();
1756
+ probe.remove();
1757
+ };
1758
+ };
1703
1759
  /**
1704
1760
  * True when the modal host declares BOTH a non-fullscreen `--width` AND a
1705
1761
  * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
@@ -1784,10 +1840,9 @@ const getInitialSafeAreaConfig = (context) => {
1784
1840
  * @returns SafeAreaConfig based on position
1785
1841
  */
1786
1842
  const getPositionBasedSafeAreaConfig = (wrapperEl) => {
1787
- var _a, _b;
1788
1843
  const rect = wrapperEl.getBoundingClientRect();
1789
- const vh = (_a = win === null || win === void 0 ? void 0 : win.innerHeight) !== null && _a !== void 0 ? _a : 0;
1790
- const vw = (_b = win === null || win === void 0 ? void 0 : win.innerWidth) !== null && _b !== void 0 ? _b : 0;
1844
+ const vh = win?.innerHeight ?? 0;
1845
+ const vw = win?.innerWidth ?? 0;
1791
1846
  // Only apply safe-area to sides where modal overlaps with screen edge
1792
1847
  return {
1793
1848
  top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
@@ -1820,9 +1875,9 @@ const clearSafeAreaOverrides = (hostEl) => {
1820
1875
  hostEl.style.removeProperty('--ion-safe-area-right');
1821
1876
  };
1822
1877
 
1823
- 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}`;
1878
+ 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}`;
1824
1879
 
1825
- 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}`;
1880
+ 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}`;
1826
1881
 
1827
1882
  const Modal = class {
1828
1883
  constructor(hostRef) {
@@ -1848,6 +1903,9 @@ const Modal = class {
1848
1903
  this.inline = false;
1849
1904
  // Whether or not modal is being dismissed via gesture
1850
1905
  this.gestureAnimationDismissing = false;
1906
+ // True from the first safe-area write in `present()` until the enter
1907
+ // animation settles. A position-based read in that window is not the rest position.
1908
+ this.isPresenting = false;
1851
1909
  this.presented = false;
1852
1910
  /** @internal */
1853
1911
  this.hasController = false;
@@ -1882,13 +1940,20 @@ const Modal = class {
1882
1940
  /**
1883
1941
  * The interaction behavior for the sheet modal when the handle is pressed.
1884
1942
  *
1885
- * Defaults to `"none"`, which means the modal will not change size or position when the handle is pressed.
1886
- * Set to `"cycle"` to let the modal cycle between available breakpoints when pressed.
1943
+ * Handle behavior is unavailable when the `handle` property is set to
1944
+ * `false` or when the `breakpoints` property is not set (using a
1945
+ * fullscreen or card modal).
1946
+ *
1947
+ * Set to `"cycle"` to make the handle focusable and let the sheet modal
1948
+ * cycle between available breakpoints when pressed. This keeps the sheet
1949
+ * operable with assistive technology.
1887
1950
  *
1888
- * Handle behavior is unavailable when the `handle` property is set to `false` or
1889
- * when the `breakpoints` property is not set (using a fullscreen or card modal).
1951
+ * Set to `"none"` to make the handle purely decorative when pressed and
1952
+ * removed from the tab order.
1953
+ *
1954
+ * Defaults to `"cycle"`.
1890
1955
  */
1891
- this.handleBehavior = 'none';
1956
+ this.handleBehavior = 'cycle';
1892
1957
  /**
1893
1958
  * If `true`, the modal will be dismissed when the backdrop is clicked.
1894
1959
  */
@@ -1997,8 +2062,13 @@ const Modal = class {
1997
2062
  */
1998
2063
  this.onModalFocus = (ev) => {
1999
2064
  const { dragHandleEl, el } = this;
2000
- // Only handle focus if the modal itself was focused (not a child element)
2001
- if (ev.target === el && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2065
+ /**
2066
+ * Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
2067
+ * true when a shadow child (the dialog wrapper present() focuses) is focused.
2068
+ * shadowRoot's activeElement is null only when the host was focused directly,
2069
+ * so redirect to the handle only then and leave present()'s wrapper focus intact.
2070
+ */
2071
+ if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
2002
2072
  dragHandleEl.focus();
2003
2073
  }
2004
2074
  };
@@ -2072,6 +2142,17 @@ const Modal = class {
2072
2142
  const { el } = this;
2073
2143
  prepareOverlay(el);
2074
2144
  this.triggerChanged();
2145
+ // A disconnect tears down state this presentation still needs and cannot
2146
+ // tell a re-insert from a removal, so put it back.
2147
+ if (this.presented || this.isPresenting) {
2148
+ this.restoreSafeAreaOverrides();
2149
+ }
2150
+ // A relocation from `willPresent` reaches these before `present()` has
2151
+ // applied the lock, so they apply it instead. Both are idempotent.
2152
+ if (this.presented) {
2153
+ restoreRootFocusTrapAccessibility(el);
2154
+ this.initParentRemovalObserver();
2155
+ }
2075
2156
  }
2076
2157
  disconnectedCallback() {
2077
2158
  this.triggerController.removeClickListener();
@@ -2080,9 +2161,12 @@ const Modal = class {
2080
2161
  // Also called in dismiss() — intentional dual cleanup covers both
2081
2162
  // dismiss-then-remove and direct DOM removal without dismiss.
2082
2163
  this.cleanupSafeAreaOverrides();
2164
+ // Clean up aria-hidden if removed without dismiss() being called
2165
+ if (this.presented) {
2166
+ cleanupRootFocusTrapAccessibility();
2167
+ }
2083
2168
  }
2084
2169
  componentWillLoad() {
2085
- var _a;
2086
2170
  const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
2087
2171
  const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
2088
2172
  const attributesToInherit = ['aria-label', 'role'];
@@ -2117,7 +2201,10 @@ const Modal = class {
2117
2201
  * htmlAttributes wins, but that's not a pattern that we recommend.
2118
2202
  * The only time you'd need htmlAttributes is when using modalController.
2119
2203
  */
2120
- this.inheritedAttributes = Object.assign(Object.assign({}, this.inheritedAttributes), { [attribute]: htmlAttributes[attribute] });
2204
+ this.inheritedAttributes = {
2205
+ ...this.inheritedAttributes,
2206
+ [attribute]: htmlAttributes[attribute],
2207
+ };
2121
2208
  delete htmlAttributes[attribute];
2122
2209
  }
2123
2210
  });
@@ -2128,7 +2215,7 @@ const Modal = class {
2128
2215
  if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
2129
2216
  printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
2130
2217
  }
2131
- if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
2218
+ if (!this.htmlAttributes?.id) {
2132
2219
  setOverlayId(this.el);
2133
2220
  }
2134
2221
  }
@@ -2243,25 +2330,33 @@ const Modal = class {
2243
2330
  // Recalculate isSheetModal before safe-area setup because framework
2244
2331
  // bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
2245
2332
  this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
2246
- // Set initial safe-area overrides before animation
2247
- this.setInitialSafeAreaOverrides();
2333
+ this.isPresenting = true;
2248
2334
  const hasCardModal = presentingElement !== undefined;
2249
- /**
2250
- * We need to change the status bar at the
2251
- * start of the animation so that it completes
2252
- * by the time the card animation is done.
2253
- */
2254
- if (hasCardModal && getIonMode(this) === 'ios') {
2255
- // Cache the original status bar color before the modal is presented
2256
- this.statusBarStyle = await StatusBar.getStyle();
2257
- setCardStatusBarDark();
2335
+ // Wrapped so a throw cannot strand `isPresenting`, which would suppress
2336
+ // the position-based correction for the life of this instance.
2337
+ try {
2338
+ // Set initial safe-area overrides before animation
2339
+ this.setInitialSafeAreaOverrides();
2340
+ /**
2341
+ * We need to change the status bar at the
2342
+ * start of the animation so that it completes
2343
+ * by the time the card animation is done.
2344
+ */
2345
+ if (hasCardModal && getIonMode(this) === 'ios') {
2346
+ // Cache the original status bar color before the modal is presented
2347
+ this.statusBarStyle = await StatusBar.getStyle();
2348
+ setCardStatusBarDark();
2349
+ }
2350
+ await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2351
+ presentingEl: presentingElement,
2352
+ currentBreakpoint: this.initialBreakpoint,
2353
+ backdropBreakpoint: this.backdropBreakpoint,
2354
+ expandToScroll: this.expandToScroll,
2355
+ });
2356
+ }
2357
+ finally {
2358
+ this.isPresenting = false;
2258
2359
  }
2259
- await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2260
- presentingEl: presentingElement,
2261
- currentBreakpoint: this.initialBreakpoint,
2262
- backdropBreakpoint: this.backdropBreakpoint,
2263
- expandToScroll: this.expandToScroll,
2264
- });
2265
2360
  // Update safe-area based on actual position after animation
2266
2361
  this.updateSafeAreaOverrides();
2267
2362
  // Apply fullscreen safe-area padding if needed
@@ -2310,7 +2405,6 @@ const Modal = class {
2310
2405
  unlock();
2311
2406
  }
2312
2407
  initSwipeToClose() {
2313
- var _a;
2314
2408
  if (getIonMode(this) !== 'ios') {
2315
2409
  return;
2316
2410
  }
@@ -2328,7 +2422,7 @@ const Modal = class {
2328
2422
  printIonContentErrorMsg(el);
2329
2423
  return;
2330
2424
  }
2331
- const statusBarStyle = (_a = this.statusBarStyle) !== null && _a !== void 0 ? _a : Style.Default;
2425
+ const statusBarStyle = this.statusBarStyle ?? Style.Default;
2332
2426
  this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2333
2427
  this.gesture.enable(true);
2334
2428
  }
@@ -2345,7 +2439,7 @@ const Modal = class {
2345
2439
  expandToScroll: this.expandToScroll,
2346
2440
  }));
2347
2441
  ani.progressStart(true, 1);
2348
- const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => { var _a; return (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : 0; }, () => this.sheetOnDismiss(), (breakpoint) => {
2442
+ const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
2349
2443
  if (this.currentBreakpoint !== breakpoint) {
2350
2444
  this.currentBreakpoint = breakpoint;
2351
2445
  this.ionBreakpointDidChange.emit({ breakpoint });
@@ -2353,6 +2447,7 @@ const Modal = class {
2353
2447
  }, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
2354
2448
  this.gesture = gesture;
2355
2449
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2450
+ this.resetSheetContentScroll = resetContentScroll;
2356
2451
  this.gesture.enable(true);
2357
2452
  /**
2358
2453
  * When backdrop interaction is allowed, nested router outlets from child routes
@@ -2370,7 +2465,6 @@ const Modal = class {
2370
2465
  * passthrough on child route page wrappers and nested router outlets.
2371
2466
  */
2372
2467
  setupChildRoutePassthrough() {
2373
- var _a;
2374
2468
  // Cache the page parent for cleanup
2375
2469
  this.cachedPageParent = this.getOriginalPageParent();
2376
2470
  const pageParent = this.cachedPageParent;
@@ -2378,14 +2472,11 @@ const Modal = class {
2378
2472
  if (!pageParent || pageParent.tagName === 'ION-APP') {
2379
2473
  return;
2380
2474
  }
2381
- const hasVisibleContent = Array.from(pageParent.children).some((child) => {
2382
- var _a;
2383
- return child !== this.el &&
2384
- !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2385
- child.tagName !== 'TEMPLATE' &&
2386
- child.tagName !== 'SLOT' &&
2387
- !(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
2388
- });
2475
+ const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
2476
+ !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
2477
+ child.tagName !== 'TEMPLATE' &&
2478
+ child.tagName !== 'SLOT' &&
2479
+ !(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
2389
2480
  if (hasVisibleContent) {
2390
2481
  return;
2391
2482
  }
@@ -2393,7 +2484,7 @@ const Modal = class {
2393
2484
  pageParent.classList.add('ion-page-overlay-passthrough');
2394
2485
  // Also make nested router outlets passthrough
2395
2486
  const routerOutlet = pageParent.parentElement;
2396
- if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
2487
+ if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
2397
2488
  routerOutlet.style.setProperty('pointer-events', 'none');
2398
2489
  routerOutlet.setAttribute('data-overlay-passthrough', 'true');
2399
2490
  }
@@ -2421,7 +2512,7 @@ const Modal = class {
2421
2512
  }
2422
2513
  pageParent.classList.remove('ion-page-overlay-passthrough');
2423
2514
  const routerOutlet = pageParent.parentElement;
2424
- if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
2515
+ if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
2425
2516
  routerOutlet.style.removeProperty('pointer-events');
2426
2517
  routerOutlet.removeAttribute('data-overlay-passthrough');
2427
2518
  }
@@ -2484,7 +2575,6 @@ const Modal = class {
2484
2575
  * For example, `cancel` or `backdrop`.
2485
2576
  */
2486
2577
  async dismiss(data, role) {
2487
- var _a;
2488
2578
  if (this.gestureAnimationDismissing && role !== GESTURE) {
2489
2579
  return false;
2490
2580
  }
@@ -2529,7 +2619,7 @@ const Modal = class {
2529
2619
  }
2530
2620
  const dismissed = await dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
2531
2621
  presentingEl: presentingElement,
2532
- currentBreakpoint: (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : this.initialBreakpoint,
2622
+ currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
2533
2623
  backdropBreakpoint: this.backdropBreakpoint,
2534
2624
  expandToScroll: this.expandToScroll,
2535
2625
  });
@@ -2543,6 +2633,13 @@ const Modal = class {
2543
2633
  if (this.gesture) {
2544
2634
  this.gesture.destroy();
2545
2635
  }
2636
+ /**
2637
+ * The sheet gesture turns content scrolling off while the sheet sits below
2638
+ * the top breakpoint. Inline modals reuse the same content on the next
2639
+ * present, so hand it back before the gesture goes away.
2640
+ */
2641
+ this.resetSheetContentScroll?.();
2642
+ this.resetSheetContentScroll = undefined;
2546
2643
  this.cleanupViewTransitionListener();
2547
2644
  this.cleanupParentRemovalObserver();
2548
2645
  this.cleanupSafeAreaOverrides();
@@ -2717,7 +2814,7 @@ const Modal = class {
2717
2814
  wrapperEl.style.transform = 'translateY(0vh)';
2718
2815
  wrapperEl.style.opacity = '1';
2719
2816
  }
2720
- if ((presentingElement === null || presentingElement === void 0 ? void 0 : presentingElement.tagName) === 'ION-MODAL') {
2817
+ if (presentingElement?.tagName === 'ION-MODAL') {
2721
2818
  const isPortrait = window.innerWidth < 768;
2722
2819
  if (isPortrait) {
2723
2820
  const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
@@ -2733,7 +2830,7 @@ const Modal = class {
2733
2830
  }
2734
2831
  async dismissNestedModals() {
2735
2832
  const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
2736
- nestedModals === null || nestedModals === void 0 ? void 0 : nestedModals.forEach(async (modal) => {
2833
+ nestedModals?.forEach(async (modal) => {
2737
2834
  await modal.dismiss(undefined, 'parent-dismissed');
2738
2835
  });
2739
2836
  }
@@ -2761,15 +2858,17 @@ const Modal = class {
2761
2858
  this.cachedOriginalParent.tagName === 'ION-APP') {
2762
2859
  return;
2763
2860
  }
2861
+ // Both `present()` and a reconnect call this, so drop any existing
2862
+ // observer. Below the guards, so a call that bails cannot leave none.
2863
+ this.cleanupParentRemovalObserver();
2764
2864
  this.parentRemovalObserver = new MutationObserver((mutations) => {
2765
2865
  mutations.forEach((mutation) => {
2766
2866
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
2767
2867
  // Check if our cached original parent was removed
2768
2868
  const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
2769
- var _a, _b;
2770
2869
  const isDirectMatch = node === this.cachedOriginalParent;
2771
2870
  const isContainedMatch = this.cachedOriginalParent
2772
- ? (_b = (_a = node).contains) === null || _b === void 0 ? void 0 : _b.call(_a, this.cachedOriginalParent)
2871
+ ? node.contains?.(this.cachedOriginalParent)
2773
2872
  : false;
2774
2873
  return isDirectMatch || isContainedMatch;
2775
2874
  });
@@ -2791,8 +2890,7 @@ const Modal = class {
2791
2890
  });
2792
2891
  }
2793
2892
  cleanupParentRemovalObserver() {
2794
- var _a;
2795
- (_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
2893
+ this.parentRemovalObserver?.disconnect();
2796
2894
  this.parentRemovalObserver = undefined;
2797
2895
  }
2798
2896
  onDragStart() {
@@ -2832,22 +2930,30 @@ const Modal = class {
2832
2930
  * sheets to prevent header content from getting double-offset padding).
2833
2931
  */
2834
2932
  setInitialSafeAreaOverrides() {
2835
- const context = Object.assign(Object.assign({}, this.getSafeAreaContext()), { hasCustomDimensions: hasCustomModalDimensions(this.el) });
2933
+ const context = {
2934
+ ...this.getSafeAreaContext(),
2935
+ hasCustomDimensions: hasCustomModalDimensions(this.el),
2936
+ };
2836
2937
  const safeAreaConfig = getInitialSafeAreaConfig(context);
2837
2938
  applySafeAreaOverrides(this.el, safeAreaConfig);
2838
2939
  // Set the internal offset property with the resolved root safe-area-top value
2839
2940
  if (context.isSheetModal) {
2840
2941
  this.updateSheetOffsetTop();
2942
+ // A restore after a DOM move runs this a second time for the same
2943
+ // modal, so drop the previous subscription rather than stacking one.
2944
+ this.unsubscribeRootSafeAreaTop?.();
2945
+ this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
2841
2946
  }
2842
2947
  }
2843
2948
  /**
2844
- * Resolves the current root --ion-safe-area-top value and sets the
2845
- * internal --ion-modal-offset-top property on the host element.
2846
- * Called on present and on resize (e.g., device rotation changes safe-area).
2949
+ * Sets the internal --ion-modal-offset-top property on the host element,
2950
+ * resolving the current root --ion-safe-area-top when no value is given.
2951
+ * Called on present, on resize (e.g., device rotation changes safe-area),
2952
+ * and whenever the root safe-area value itself changes.
2847
2953
  */
2848
- updateSheetOffsetTop() {
2849
- const safeAreaTop = getRootSafeAreaTop();
2850
- this.el.style.setProperty('--ion-modal-offset-top', `${safeAreaTop}px`);
2954
+ updateSheetOffsetTop(safeAreaTop) {
2955
+ const value = safeAreaTop ?? getRootSafeAreaTop();
2956
+ this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
2851
2957
  }
2852
2958
  /**
2853
2959
  * Updates safe-area overrides during dynamic state changes.
@@ -2947,11 +3053,38 @@ const Modal = class {
2947
3053
  */
2948
3054
  cleanupSafeAreaOverrides() {
2949
3055
  clearSafeAreaOverrides(this.el);
3056
+ this.unsubscribeRootSafeAreaTop?.();
3057
+ this.unsubscribeRootSafeAreaTop = undefined;
2950
3058
  // Remove internal sheet offset property
2951
3059
  this.el.style.removeProperty('--ion-modal-offset-top');
2952
3060
  const { contentEl } = this.findContentAndFooter();
2953
3061
  this.clearContentSafeAreaPadding(contentEl);
2954
3062
  }
3063
+ /**
3064
+ * Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
3065
+ * while presented. Anything needing no measurement goes on synchronously so
3066
+ * the modal is never painted without safe-area. The position-based
3067
+ * correction waits a frame for the layout pass it reads.
3068
+ */
3069
+ restoreSafeAreaOverrides() {
3070
+ this.setInitialSafeAreaOverrides();
3071
+ this.applyFullscreenSafeArea();
3072
+ raf(() => {
3073
+ // A dismiss or another move can land first, and a read before the enter
3074
+ // animation settles is not the rest position. `present()` redoes it.
3075
+ if (!this.presented || !this.el.isConnected || this.isPresenting) {
3076
+ return;
3077
+ }
3078
+ // A hidden subtree carries `display: none`, so there is no box and the
3079
+ // read would write the safe-area for a modal touching no edge. The
3080
+ // prediction applied above holds until the modal is shown again.
3081
+ const { width, height } = this.el.getBoundingClientRect();
3082
+ if (width === 0 && height === 0) {
3083
+ return;
3084
+ }
3085
+ this.updateSafeAreaOverrides();
3086
+ });
3087
+ }
2955
3088
  render() {
2956
3089
  const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
2957
3090
  const showHandle = handle !== false && isSheetModal;
@@ -2959,20 +3092,35 @@ const Modal = class {
2959
3092
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2960
3093
  const isHandleCycle = handleBehavior === 'cycle';
2961
3094
  const isSheetModalWithHandle = isSheetModal && showHandle;
2962
- return (h(Host, Object.assign({ key: 'ab93657f4a5b4c97168d292b398d975e4b5b4af4', "no-router": true,
3095
+ return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
2963
3096
  // Allow the modal to be navigable when the handle is focusable
2964
- tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
3097
+ tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
2965
3098
  zIndex: `${20000 + this.overlayIndex}`,
2966
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '5ba6315c7c8c64fa04c62f85fd493da5275b2cbd', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'a76c48d41c67f86c18a7481e980e6925e614f85d', class: "modal-shadow" }), h("div", Object.assign({ key: '3f6c61ba60b063592784d76a9594073b3bf210a9',
3099
+ }, class: {
3100
+ [mode]: true,
3101
+ ['modal-default']: !isCardModal && !isSheetModal,
3102
+ [`modal-card`]: isCardModal,
3103
+ [`modal-sheet`]: isSheetModal,
3104
+ [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
3105
+ 'overlay-hidden': true,
3106
+ [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
3107
+ ...getClassMap(this.cssClass),
3108
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
2967
3109
  /*
2968
3110
  role and aria-modal must be used on the
2969
3111
  same element. They must also be set inside the
2970
3112
  shadow DOM otherwise ion-button will not be highlighted
2971
3113
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
3114
+
3115
+ tabIndex={-1} is required so present() can move focus to this
3116
+ element (which carries the dialog role) instead of the role-less
3117
+ host. role="dialog" alone does not make an element focusable, so
3118
+ without the tabindex focus() would be a no-op and screen readers
3119
+ may not properly announce the dialog and its content when it opens.
2972
3120
  */
2973
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '7f66b4fdb3dec61a2b9aec4e9dbacf5d013d637c', class: "modal-handle",
3121
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
2974
3122
  // Prevents the handle from receiving keyboard focus when it does not cycle
2975
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '2dfaaebe3d0b2a46be1224c25f9ab89bf1744332', onSlotchange: this.onSlotChange }))));
3123
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
2976
3124
  }
2977
3125
  get el() { return getElement(this); }
2978
3126
  static get watchers() { return {