voyager-ionic-core 9.0.6 → 9.0.9

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 (497) 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-D0jSx7rE.js → p--cshUOAU.js} +1 -1
  99. package/components/{p-DSmHJ2DH.js → p-7KepMw9O.js} +1 -1
  100. package/components/p-B-5Z9djt.js +4 -0
  101. package/components/p-B02CcbPD.js +4 -0
  102. package/components/{p-DlUdjUlf.js → p-B4IBdPVJ.js} +1 -1
  103. package/components/{p-BLjEwM6v.js → p-BMHdI-wb.js} +1 -1
  104. package/components/{p-CAQG0btC.js → p-BODcC-C0.js} +1 -1
  105. package/components/{p-Canp1qah.js → p-Ba9_OzSY.js} +1 -1
  106. package/components/{p-CJgshb3W.js → p-Bd8hg9FK.js} +1 -1
  107. package/components/{p-CHHkdXfP.js → p-BqyLLYLm.js} +1 -1
  108. package/components/{p-C_NQIzjP.js → p-C1AxSUnp.js} +1 -1
  109. package/components/{p-BinR4_P7.js → p-CKTjkpAq.js} +1 -1
  110. package/components/{p-y7Nhe3de.js → p-CKiqp4Vl.js} +1 -1
  111. package/components/{p-CiXOsJF2.js → p-CONpe3oX.js} +1 -1
  112. package/components/{p-BSJriPuC.js → p-CW84OFQa.js} +1 -1
  113. package/components/{p-PPagT42x.js → p-CYctYy9B.js} +1 -1
  114. package/components/{p-CvzE7FFp.js → p-C_gnmBt2.js} +1 -1
  115. package/components/{p-C9ioHZq-.js → p-CdrNHfZl.js} +1 -1
  116. package/components/{p-Dlr7b3_2.js → p-ChkSQqfP.js} +1 -1
  117. package/components/{p-LH1I_Zhd.js → p-ChsJlFCQ.js} +1 -1
  118. package/components/{p-DGUed0uX.js → p-CjPRDxby.js} +1 -1
  119. package/components/p-CohRJRIu.js +4 -0
  120. package/components/{p-BrOSQhkA.js → p-CqvARtmt.js} +1 -1
  121. package/components/p-Ct2aBEue.js +4 -0
  122. package/components/{p-6sKRBFnK.js → p-CvyvLbPe.js} +1 -1
  123. package/components/{p-C7rB-0-1.js → p-CwEis84J.js} +1 -1
  124. package/components/p-CxEV3Vwy.js +4 -0
  125. package/components/p-Cyajikho.js +4 -0
  126. package/components/{p-BKxLivx4.js → p-D0nwlsl_.js} +1 -1
  127. package/components/{p-CXy2v7GI.js → p-DBtFJlTi.js} +1 -1
  128. package/components/p-DD92Fw3n.js +4 -0
  129. package/components/{p-DM2jMsSO.js → p-DDI6VLW9.js} +1 -1
  130. package/components/{p-DWGgvN5e.js → p-DHo45oj7.js} +1 -1
  131. package/{dist/ionic/p-Bv-6401R.js → components/p-Dbi3KqKm.js} +1 -1
  132. package/components/p-DfDIY2oP.js +4 -0
  133. package/components/{p-CTUMJM0R.js → p-Drpw2dyl.js} +1 -1
  134. package/components/{p-T2dnrBya.js → p-GpqwNbxf.js} +1 -1
  135. package/components/{p-BEiYs-sz.js → p-HthJZjZ6.js} +1 -1
  136. package/components/p-IQN1T5zw.js +4 -0
  137. package/components/{p-B_tZQKpS.js → p-KbMCbGRA.js} +1 -1
  138. package/components/p-ODGeXc3M.js +4 -0
  139. package/components/p-R4UxBukQ.js +4 -0
  140. package/components/p-SHHIB5F0.js +4 -0
  141. package/components/{p-B8HBLiYi.js → p-V1THdfzs.js} +1 -1
  142. package/components/{p-D4NOsSCE.js → p-YNnH1_Hs.js} +1 -1
  143. package/components/{p-RJT5zTbD.js → p-ZrYBjOcc.js} +1 -1
  144. package/components/{p-eJpG4UbM.js → p-_y7kwBO8.js} +1 -1
  145. package/components/{p-CiFFeRH9.js → p-hLu-eIbb.js} +1 -1
  146. package/components/{p-CQjNc-Pz.js → p-jsVMT15X.js} +1 -1
  147. package/components/{p-CzykzqAO.js → p-r59A3wQk.js} +1 -1
  148. package/components/{p-DPyjiKOq.js → p-yGD6MBgf.js} +1 -1
  149. package/components/p-zQi7R3tS.js +4 -0
  150. package/css/core.css.map +1 -1
  151. package/css/display.css.map +1 -1
  152. package/css/flex-utils.css.map +1 -1
  153. package/css/float-elements.css +1 -1
  154. package/css/float-elements.css.map +1 -1
  155. package/css/global.bundle.css.map +1 -1
  156. package/css/ionic.bundle.css +1 -1
  157. package/css/ionic.bundle.css.map +1 -1
  158. package/css/padding.css.map +1 -1
  159. package/css/structure.css.map +1 -1
  160. package/css/text-alignment.css.map +1 -1
  161. package/css/text-transformation.css.map +1 -1
  162. package/css/typography.css.map +1 -1
  163. package/css/utils.bundle.css +1 -1
  164. package/css/utils.bundle.css.map +1 -1
  165. package/dist/cjs/{animation-BFKyYY11.js → animation-DcgLg_PI.js} +2 -2
  166. package/dist/cjs/{app-globals-BLTzqkrC.js → app-globals-BoFCZq0K.js} +1 -1
  167. package/dist/cjs/{attribute-controller-CXIeB0Mn.js → attribute-controller-BjTE2TOf.js} +1 -1
  168. package/dist/cjs/{button-active-CEQaiV9N.js → button-active-FdsfRDY_.js} +2 -2
  169. package/dist/cjs/{capacitor-BMzmHhwe.js → capacitor-C6Pp4Z7A.js} +1 -1
  170. package/dist/cjs/{format-CdRlDqPs.js → format-CVjpvAl1.js} +1 -1
  171. package/dist/cjs/{framework-delegate-DTLbqaaO.js → framework-delegate-JbKIVMzR.js} +1 -1
  172. package/dist/cjs/{haptic-CJVUv_GB.js → haptic--4QteuuM.js} +1 -1
  173. package/dist/cjs/{helpers-Crluoxqu.js → helpers-Cqr69qxA.js} +1 -1
  174. package/dist/cjs/{index-BSD7toMO.js → index-B4ONUQRp.js} +1 -1
  175. package/dist/cjs/{index-BKpybYNI.js → index-BQpSekmz.js} +2 -2
  176. package/dist/cjs/{index-CElfU-dK.js → index-BhWiDK25.js} +6 -5
  177. package/dist/cjs/{index-SAR1xwtW.js → index-BiQyIvoc.js} +40 -27
  178. package/dist/cjs/{index-BAM4223M.js → index-CNaZ6SYM.js} +2 -2
  179. package/dist/cjs/{index-CgXTRA_-.js → index-DCfr5hz-.js} +16 -4
  180. package/dist/cjs/index.cjs.js +11 -11
  181. package/dist/cjs/{input-shims-CHghGZe-.js → input-shims-2AsXPZ5m.js} +5 -5
  182. package/dist/cjs/{input.utils-BBZr0wjw.js → input.utils-Becpo0ax.js} +1 -1
  183. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  184. package/dist/cjs/ion-action-sheet.cjs.entry.js +11 -11
  185. package/dist/cjs/ion-alert.cjs.entry.js +11 -11
  186. package/dist/cjs/ion-app_8.cjs.entry.js +46 -18
  187. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  188. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  189. package/dist/cjs/ion-backdrop.cjs.entry.js +7 -3
  190. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  191. package/dist/cjs/ion-button_2.cjs.entry.js +4 -4
  192. package/dist/cjs/ion-card_5.cjs.entry.js +4 -4
  193. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  194. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  195. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  196. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  197. package/dist/cjs/ion-datetime.cjs.entry.js +61 -15
  198. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  199. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  200. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  201. package/dist/cjs/ion-input-otp.cjs.entry.js +33 -8
  202. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  203. package/dist/cjs/ion-input.cjs.entry.js +17 -17
  204. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  205. package/dist/cjs/ion-item_8.cjs.entry.js +4 -4
  206. package/dist/cjs/ion-loading.cjs.entry.js +7 -7
  207. package/dist/cjs/ion-menu_3.cjs.entry.js +10 -9
  208. package/dist/cjs/ion-modal.cjs.entry.js +41 -91
  209. package/dist/cjs/ion-nav_2.cjs.entry.js +29 -7
  210. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  211. package/dist/cjs/ion-picker-column.cjs.entry.js +5 -5
  212. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  213. package/dist/cjs/ion-popover.cjs.entry.js +7 -7
  214. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  215. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  216. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  217. package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -8
  218. package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -6
  219. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  220. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  221. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  222. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  223. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  224. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  225. package/dist/cjs/ion-select-modal.cjs.entry.js +7 -7
  226. package/dist/cjs/ion-select_3.cjs.entry.js +19 -19
  227. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  228. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  229. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  230. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  231. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  232. package/dist/cjs/ion-textarea.cjs.entry.js +16 -16
  233. package/dist/cjs/ion-toast.cjs.entry.js +7 -7
  234. package/dist/cjs/ion-toggle.cjs.entry.js +6 -6
  235. package/dist/cjs/{ionic-global-C1h8Yi_K.js → ionic-global-48ceLiJ6.js} +1 -1
  236. package/dist/cjs/ionic.cjs.js +5 -5
  237. package/dist/cjs/{ios.transition-YFSxiyP_.js → ios.transition-Ca6XODo9.js} +4 -4
  238. package/dist/cjs/{item-multiple-inputs-h2PyAFzG.js → item-multiple-inputs-C-hz7xrh.js} +1 -1
  239. package/dist/cjs/{keyboard-C-C7xMKk.js → keyboard-BlHp4a_c.js} +1 -1
  240. package/dist/cjs/{keyboard-Cv-LNReK.js → keyboard-c2_I35b-.js} +4 -4
  241. package/dist/cjs/{keyboard-controller-CLcFxSnb.js → keyboard-controller-DHS0BgXp.js} +2 -2
  242. package/dist/cjs/loader.cjs.js +4 -4
  243. package/dist/cjs/{md.transition-Cm8yg0UK.js → md.transition-D8SfNYEp.js} +4 -4
  244. package/dist/cjs/{overlays-C68wNDWY.js → overlays-CLld3axA.js} +79 -20
  245. package/dist/cjs/{select-option-render-C-Yh9yZG.js → select-option-render-CzyhrkOu.js} +2 -2
  246. package/dist/cjs/{slot-mutation-controller-zixZ5LyH.js → slot-mutation-controller-B2OfJEBH.js} +68 -34
  247. package/dist/cjs/{status-tap-C3frTJ4c.js → status-tap-CDA0Y3Ad.js} +3 -3
  248. package/dist/cjs/{swipe-back-ChrfFzIe.js → swipe-back-Dy8pxJCF.js} +2 -2
  249. package/dist/collection/collection-manifest.json +1 -1
  250. package/dist/collection/components/backdrop/backdrop.js +6 -2
  251. package/dist/collection/components/datetime/datetime.js +56 -10
  252. package/dist/collection/components/input/input.ios.css +7 -3
  253. package/dist/collection/components/input/input.js +11 -11
  254. package/dist/collection/components/input/input.md.css +28 -15
  255. package/dist/collection/components/input-otp/input-otp.js +29 -3
  256. package/dist/collection/components/menu/menu.js +4 -3
  257. package/dist/collection/components/modal/gestures/sheet.js +30 -80
  258. package/dist/collection/components/nav/nav.js +24 -2
  259. package/dist/collection/components/router-outlet/router-outlet.js +31 -3
  260. package/dist/collection/components/select/select.ios.css +7 -3
  261. package/dist/collection/components/select/select.js +10 -10
  262. package/dist/collection/components/select/select.md.css +28 -15
  263. package/dist/collection/components/textarea/textarea.ios.css +7 -3
  264. package/dist/collection/components/textarea/textarea.js +10 -10
  265. package/dist/collection/components/textarea/textarea.md.css +28 -17
  266. package/dist/collection/utils/forms/index.js +1 -1
  267. package/dist/collection/utils/forms/{start-container-controller.js → start-end-container-controller.js} +66 -32
  268. package/dist/collection/utils/hardware-back-button.js +41 -12
  269. package/dist/collection/utils/menu-controller/index.js +2 -1
  270. package/dist/collection/utils/overlays.js +30 -4
  271. package/dist/collection/utils/transition/index.js +11 -0
  272. package/dist/docs.json +4 -4
  273. package/dist/esm/{animation-CFd8Olt3.js → animation-DmtJpz89.js} +2 -2
  274. package/dist/esm/{app-globals-7GHLBkwd.js → app-globals-CNfpAPW6.js} +1 -1
  275. package/dist/esm/{attribute-controller-Cn665x42.js → attribute-controller-DPMIcbef.js} +1 -1
  276. package/dist/esm/{button-active-DMuYeDQN.js → button-active-DVk40Sjl.js} +2 -2
  277. package/dist/esm/{capacitor-CoEgIpR9.js → capacitor-CHJaJ9aX.js} +1 -1
  278. package/dist/esm/{format-C9zPmwKU.js → format-Ck1cw5z7.js} +1 -1
  279. package/dist/esm/{framework-delegate-DeT5pmPB.js → framework-delegate-CDjM1vRH.js} +1 -1
  280. package/dist/esm/{haptic-Dxm7ZmT5.js → haptic-WXfMCob9.js} +1 -1
  281. package/dist/esm/{helpers-B54ynME_.js → helpers-BJqKF1pr.js} +1 -1
  282. package/dist/esm/{index-D9OR05yj.js → index-BpRUsN_W.js} +40 -27
  283. package/dist/esm/{index-D4ZMZz_3.js → index-CK8uF0iB.js} +1 -1
  284. package/dist/esm/{index-D_xZtbw6.js → index-Clv8QC5L.js} +2 -2
  285. package/dist/esm/{index-B9jhwvmO.js → index-DIouXecD.js} +6 -5
  286. package/dist/esm/{index--21qeSt0.js → index-TkLga3ma.js} +2 -2
  287. package/dist/esm/{index-B8iieOdw.js → index-z9vdZN7I.js} +16 -5
  288. package/dist/esm/index.js +11 -11
  289. package/dist/esm/{input-shims-MCrhq67U.js → input-shims-C1iYF5JK.js} +5 -5
  290. package/dist/esm/{input.utils-B-IIWrwT.js → input.utils-DZY_K8Po.js} +1 -1
  291. package/dist/esm/ion-accordion_2.entry.js +3 -3
  292. package/dist/esm/ion-action-sheet.entry.js +11 -11
  293. package/dist/esm/ion-alert.entry.js +11 -11
  294. package/dist/esm/ion-app_8.entry.js +46 -18
  295. package/dist/esm/ion-avatar_3.entry.js +2 -2
  296. package/dist/esm/ion-back-button.entry.js +3 -3
  297. package/dist/esm/ion-backdrop.entry.js +7 -3
  298. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  299. package/dist/esm/ion-button_2.entry.js +4 -4
  300. package/dist/esm/ion-card_5.entry.js +4 -4
  301. package/dist/esm/ion-checkbox.entry.js +4 -4
  302. package/dist/esm/ion-chip.entry.js +2 -2
  303. package/dist/esm/ion-col_3.entry.js +2 -2
  304. package/dist/esm/ion-datetime-button.entry.js +4 -4
  305. package/dist/esm/ion-datetime.entry.js +61 -15
  306. package/dist/esm/ion-fab_3.entry.js +3 -3
  307. package/dist/esm/ion-img.entry.js +3 -3
  308. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  309. package/dist/esm/ion-input-otp.entry.js +33 -8
  310. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  311. package/dist/esm/ion-input.entry.js +17 -17
  312. package/dist/esm/ion-item-option_3.entry.js +4 -4
  313. package/dist/esm/ion-item_8.entry.js +4 -4
  314. package/dist/esm/ion-loading.entry.js +7 -7
  315. package/dist/esm/ion-menu_3.entry.js +10 -9
  316. package/dist/esm/ion-modal.entry.js +41 -91
  317. package/dist/esm/ion-nav_2.entry.js +29 -7
  318. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  319. package/dist/esm/ion-picker-column.entry.js +5 -5
  320. package/dist/esm/ion-picker.entry.js +2 -2
  321. package/dist/esm/ion-popover.entry.js +7 -7
  322. package/dist/esm/ion-progress-bar.entry.js +3 -3
  323. package/dist/esm/ion-radio_2.entry.js +4 -4
  324. package/dist/esm/ion-range.entry.js +4 -4
  325. package/dist/esm/ion-refresher_2.entry.js +8 -8
  326. package/dist/esm/ion-reorder_2.entry.js +6 -6
  327. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  328. package/dist/esm/ion-route_4.entry.js +4 -4
  329. package/dist/esm/ion-searchbar.entry.js +3 -3
  330. package/dist/esm/ion-segment-content.entry.js +1 -1
  331. package/dist/esm/ion-segment-view.entry.js +1 -1
  332. package/dist/esm/ion-segment_2.entry.js +3 -3
  333. package/dist/esm/ion-select-modal.entry.js +7 -7
  334. package/dist/esm/ion-select_3.entry.js +19 -19
  335. package/dist/esm/ion-spinner.entry.js +2 -2
  336. package/dist/esm/ion-split-pane.entry.js +2 -2
  337. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  338. package/dist/esm/ion-tab_2.entry.js +3 -3
  339. package/dist/esm/ion-text.entry.js +2 -2
  340. package/dist/esm/ion-textarea.entry.js +16 -16
  341. package/dist/esm/ion-toast.entry.js +7 -7
  342. package/dist/esm/ion-toggle.entry.js +6 -6
  343. package/dist/esm/{ionic-global-B-G43ddm.js → ionic-global-Cep6oYzK.js} +1 -1
  344. package/dist/esm/ionic.js +6 -6
  345. package/dist/esm/{ios.transition-CRfGj4Mo.js → ios.transition-BkUGiDUz.js} +4 -4
  346. package/dist/esm/{item-multiple-inputs-BSD9wGHO.js → item-multiple-inputs-Bd2LO7qK.js} +1 -1
  347. package/dist/esm/{keyboard-DDw62P0D.js → keyboard-B4Y-Gph8.js} +4 -4
  348. package/dist/esm/{keyboard-ly3M0GO7.js → keyboard-Cmqp5iZD.js} +1 -1
  349. package/dist/esm/{keyboard-controller-Dzjet5wD.js → keyboard-controller-B2NoF7bV.js} +2 -2
  350. package/dist/esm/loader.js +5 -5
  351. package/dist/esm/{md.transition-wqThNy_C.js → md.transition-B6hlrWjR.js} +4 -4
  352. package/dist/esm/{overlays-BQnV0HAU.js → overlays-DmDY-El7.js} +78 -21
  353. package/dist/esm/{select-option-render-CGxPejmz.js → select-option-render-BSDT9oSA.js} +2 -2
  354. package/dist/esm/{slot-mutation-controller-C3s4-_YN.js → slot-mutation-controller-Btpr9-9O.js} +68 -34
  355. package/dist/esm/{status-tap-DRx9wSD_.js → status-tap-VGRBYwiC.js} +3 -3
  356. package/dist/esm/{swipe-back-CXmdi75W.js → swipe-back-tCNYR9ZM.js} +2 -2
  357. package/dist/html.html-data.json +1 -1
  358. package/dist/ionic/index.esm.js +1 -1
  359. package/dist/ionic/ionic.esm.js +1 -1
  360. package/dist/ionic/{p-378341d1.entry.js → p-00cd107d.entry.js} +1 -1
  361. package/dist/ionic/{p-e7414c33.entry.js → p-01b7e3f2.entry.js} +1 -1
  362. package/dist/ionic/{p-f99cf5aa.entry.js → p-0a789930.entry.js} +1 -1
  363. package/dist/ionic/{p-624f2fa8.entry.js → p-0b09c60e.entry.js} +1 -1
  364. package/dist/ionic/{p-150f350e.entry.js → p-0c32c626.entry.js} +1 -1
  365. package/dist/ionic/{p-30dcf43b.entry.js → p-0f97175e.entry.js} +1 -1
  366. package/dist/ionic/{p-e1969fd1.entry.js → p-107a81a6.entry.js} +1 -1
  367. package/dist/ionic/{p-c2a23101.entry.js → p-28251c5c.entry.js} +1 -1
  368. package/dist/ionic/p-293cb1d5.entry.js +4 -0
  369. package/dist/ionic/{p-93cd738b.entry.js → p-362dcd86.entry.js} +1 -1
  370. package/dist/ionic/{p-42b2a992.entry.js → p-4bd80334.entry.js} +1 -1
  371. package/dist/ionic/{p-3c4b0ba7.entry.js → p-4e4e5919.entry.js} +1 -1
  372. package/dist/ionic/{p-6865f0e1.entry.js → p-4f25b926.entry.js} +1 -1
  373. package/dist/ionic/{p-1110da0d.entry.js → p-539d6c8e.entry.js} +1 -1
  374. package/dist/ionic/{p-9dd9788c.entry.js → p-5bb24bce.entry.js} +1 -1
  375. package/dist/ionic/{p-f19e50f8.entry.js → p-60780b88.entry.js} +1 -1
  376. package/dist/ionic/p-61321cfa.entry.js +4 -0
  377. package/dist/ionic/{p-fee863dc.entry.js → p-62c87f3d.entry.js} +1 -1
  378. package/dist/ionic/{p-58f914ee.entry.js → p-64ac3864.entry.js} +1 -1
  379. package/dist/ionic/p-657239f5.entry.js +4 -0
  380. package/dist/ionic/p-67f004eb.entry.js +4 -0
  381. package/dist/ionic/{p-37f46670.entry.js → p-6c7b5930.entry.js} +1 -1
  382. package/dist/ionic/{p-b710b4b8.entry.js → p-76c189e7.entry.js} +1 -1
  383. package/dist/ionic/{p-e338693a.entry.js → p-77252596.entry.js} +1 -1
  384. package/dist/ionic/p-7ce9c6f8.entry.js +4 -0
  385. package/dist/ionic/{p-0517aec4.entry.js → p-7db20410.entry.js} +1 -1
  386. package/dist/ionic/{p-834afcf7.entry.js → p-7e9c2a97.entry.js} +1 -1
  387. package/dist/ionic/p-7l6ENjIV.js +4 -0
  388. package/dist/ionic/{p-daaecea3.entry.js → p-82abf431.entry.js} +1 -1
  389. package/dist/ionic/{p-b9659d21.entry.js → p-8c85e250.entry.js} +1 -1
  390. package/dist/ionic/{p-e137f724.entry.js → p-8d651adb.entry.js} +1 -1
  391. package/dist/ionic/{p-eb762f80.entry.js → p-8db08782.entry.js} +1 -1
  392. package/dist/ionic/{p-76309bab.entry.js → p-91f3cd8b.entry.js} +1 -1
  393. package/dist/ionic/{p-2e6e933d.entry.js → p-930c3538.entry.js} +1 -1
  394. package/dist/ionic/p-94f1f7df.entry.js +4 -0
  395. package/dist/ionic/{p-083b1119.entry.js → p-9ffccbf1.entry.js} +1 -1
  396. package/dist/ionic/{p-DffXRKHu.js → p-B0jcOZOE.js} +1 -1
  397. package/dist/ionic/p-BNXIurCt.js +4 -0
  398. package/dist/ionic/{p-BUB5OrpU.js → p-BO10QT9r.js} +1 -1
  399. package/dist/ionic/p-BOLqP2-V.js +4 -0
  400. package/dist/ionic/{p-DxvRP6ld.js → p-BY4FwwBp.js} +1 -1
  401. package/dist/ionic/{p-BVEsh7-M.js → p-BZTgGzGK.js} +1 -1
  402. package/dist/ionic/p-BdHBcCZF.js +4 -0
  403. package/dist/ionic/p-BexAj0yw.js +4 -0
  404. package/dist/ionic/p-BpED_ep_.js +4 -0
  405. package/dist/ionic/p-BpRUsN_W.js +6 -0
  406. package/dist/ionic/p-BuLlVedw.js +4 -0
  407. package/dist/ionic/{p-CsWrz1c2.js → p-Bx5x5GJV.js} +1 -1
  408. package/dist/ionic/p-C1WYZOZj.js +4 -0
  409. package/dist/ionic/p-C2LaBx3E.js +4 -0
  410. package/dist/ionic/{p-DNxEB9-T.js → p-CXs4J83x.js} +1 -1
  411. package/dist/ionic/{p-kKvGoaEe.js → p-CgcGX08t.js} +1 -1
  412. package/dist/ionic/{p-B4xjg_Qu.js → p-Co7eql8D.js} +1 -1
  413. package/dist/ionic/p-D13gXhdC.js +4 -0
  414. package/dist/ionic/{p-BtHAx8im.js → p-D926OmIX.js} +1 -1
  415. package/dist/ionic/{p-BCgqWm-V.js → p-DPNVo1nr.js} +1 -1
  416. package/dist/ionic/p-DXXGkPA8.js +4 -0
  417. package/dist/ionic/{p-CCik51Nv.js → p-DfvWlTdB.js} +1 -1
  418. package/dist/ionic/p-Dk4Mdaru.js +4 -0
  419. package/dist/ionic/p-DriE1ZAo.js +4 -0
  420. package/dist/ionic/{p-BhMQahM6.js → p-DxftXYZp.js} +1 -1
  421. package/dist/ionic/{p-CrAPHbJ3.js → p-SEecsUh7.js} +1 -1
  422. package/dist/ionic/{p-5c19330c.entry.js → p-a4389f13.entry.js} +1 -1
  423. package/dist/ionic/{p-4dbb2f4f.entry.js → p-a7d368b5.entry.js} +1 -1
  424. package/dist/ionic/p-af11d3c6.entry.js +4 -0
  425. package/dist/ionic/{p-5b9666be.entry.js → p-b3aadfe8.entry.js} +1 -1
  426. package/dist/ionic/p-b5bcbbc1.entry.js +4 -0
  427. package/dist/ionic/{p-3a5faaa8.entry.js → p-b9ed3a52.entry.js} +1 -1
  428. package/dist/ionic/{p-61b304c8.entry.js → p-bfdbe24b.entry.js} +1 -1
  429. package/dist/ionic/{p-b0a3dd1a.entry.js → p-c250b6b0.entry.js} +1 -1
  430. package/dist/ionic/{p-20d1ac29.entry.js → p-c293f854.entry.js} +1 -1
  431. package/dist/ionic/p-c83dbc12.entry.js +4 -0
  432. package/dist/ionic/{p-0ab133d6.entry.js → p-d0e374f8.entry.js} +1 -1
  433. package/dist/ionic/{p-24b0a961.entry.js → p-d72accc4.entry.js} +1 -1
  434. package/dist/ionic/p-e1haAYzm.js +4 -0
  435. package/dist/ionic/{p-e05073f6.entry.js → p-e7ab4def.entry.js} +1 -1
  436. package/dist/ionic/p-e8e69c21.entry.js +4 -0
  437. package/dist/ionic/{p-9b78fedf.entry.js → p-eb989dc9.entry.js} +1 -1
  438. package/dist/ionic/{p-b1164028.entry.js → p-ec259ac5.entry.js} +1 -1
  439. package/dist/ionic/{p-f9057f70.entry.js → p-f2116a54.entry.js} +1 -1
  440. package/dist/ionic/{p-B4ELlbJE.js → p-nCAPr1Ah.js} +1 -1
  441. package/dist/types/components/backdrop/backdrop.d.ts +4 -0
  442. package/dist/types/components/datetime/datetime.d.ts +20 -3
  443. package/dist/types/components/input/input.d.ts +2 -1
  444. package/dist/types/components/input-otp/input-otp.d.ts +7 -0
  445. package/dist/types/components/nav/nav.d.ts +1 -0
  446. package/dist/types/components/router-outlet/router-outlet.d.ts +1 -0
  447. package/dist/types/components/select/select.d.ts +2 -1
  448. package/dist/types/components/textarea/textarea.d.ts +2 -1
  449. package/dist/types/components.d.ts +3 -3
  450. package/dist/types/utils/config.d.ts +4 -1
  451. package/dist/types/utils/forms/index.d.ts +1 -1
  452. package/dist/types/utils/forms/start-end-container-controller.d.ts +44 -0
  453. package/dist/types/utils/hardware-back-button.d.ts +11 -0
  454. package/dist/types/utils/overlays.d.ts +5 -2
  455. package/dist/types/utils/transition/index.d.ts +6 -0
  456. package/hydrate/index.js +698 -354
  457. package/hydrate/index.mjs +698 -354
  458. package/package.json +4 -4
  459. package/components/p-BKeulLTJ.js +0 -4
  460. package/components/p-BNnmwjuy.js +0 -4
  461. package/components/p-BUVGbkSc.js +0 -4
  462. package/components/p-BexLz2XV.js +0 -4
  463. package/components/p-BriaEJK8.js +0 -4
  464. package/components/p-BsLM9eQu.js +0 -4
  465. package/components/p-Bu6O-veK.js +0 -4
  466. package/components/p-CVVUo4J1.js +0 -4
  467. package/components/p-CcQQ8oRo.js +0 -4
  468. package/components/p-Ctw69DyZ.js +0 -4
  469. package/components/p-F1rV0pyK.js +0 -4
  470. package/components/p-WMQuK_Tj.js +0 -4
  471. package/components/p-fFx6WCTj.js +0 -4
  472. package/components/p-q2WJ5Igc.js +0 -4
  473. package/dist/ionic/p-1213b719.entry.js +0 -4
  474. package/dist/ionic/p-336ea4b8.entry.js +0 -4
  475. package/dist/ionic/p-49a16200.entry.js +0 -4
  476. package/dist/ionic/p-52dc3309.entry.js +0 -4
  477. package/dist/ionic/p-636349e2.entry.js +0 -4
  478. package/dist/ionic/p-7441ed2b.entry.js +0 -4
  479. package/dist/ionic/p-83448626.entry.js +0 -4
  480. package/dist/ionic/p-B4wzg4z4.js +0 -4
  481. package/dist/ionic/p-BChRVdVv.js +0 -4
  482. package/dist/ionic/p-Ba6ZV-qU.js +0 -4
  483. package/dist/ionic/p-CTmJSZcs.js +0 -4
  484. package/dist/ionic/p-CVwXN07G.js +0 -4
  485. package/dist/ionic/p-CgQdInM0.js +0 -4
  486. package/dist/ionic/p-D5akOqD0.js +0 -4
  487. package/dist/ionic/p-D9OR05yj.js +0 -6
  488. package/dist/ionic/p-DHf9V6zI.js +0 -4
  489. package/dist/ionic/p-DZUqAr_6.js +0 -4
  490. package/dist/ionic/p-Dzew6Qv7.js +0 -4
  491. package/dist/ionic/p-PkaVMJga.js +0 -4
  492. package/dist/ionic/p-ba7bd621.entry.js +0 -4
  493. package/dist/ionic/p-e4c3f17f.entry.js +0 -4
  494. package/dist/ionic/p-edcb63e5.entry.js +0 -4
  495. package/dist/ionic/p-tXpzvta8.js +0 -4
  496. package/dist/ionic/p-vPo3vRFc.js +0 -4
  497. package/dist/types/utils/forms/start-container-controller.d.ts +0 -34
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Build, Host, forceUpdate, h, } from "@stencil/core";
5
- import { createClickController, createNotchController, createStartContainerController, checkInvalidState, } from "../../utils/forms/index";
5
+ import { createClickController, createNotchController, createStartEndContainerController, checkInvalidState, } from "../../utils/forms/index";
6
6
  import { inheritAriaAttributes, debounceEvent, inheritAttributes, componentOnReady } from "../../utils/helpers";
7
7
  import { createSlotMutationController } from "../../utils/slot-mutation-controller";
8
8
  import { createColorClasses, hostContext } from "../../utils/theme";
@@ -238,16 +238,16 @@ export class Input {
238
238
  connectedCallback() {
239
239
  const { el } = this;
240
240
  this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
241
- this.startContainerController?.calculateStartContainerWidth();
241
+ this.startEndContainerController?.calculateContainerWidths();
242
242
  this.setSlottedLabelId();
243
243
  forceUpdate(this);
244
244
  });
245
245
  this.setSlottedLabelId();
246
246
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
247
- this.startContainerController = createStartContainerController(el, () => this.startContainerEl, () => {
247
+ this.startEndContainerController = createStartEndContainerController(el, () => this.startContainerEl, () => this.endContainerEl, () => {
248
248
  return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
249
249
  });
250
- this.startContainerController.calculateStartContainerWidth();
250
+ this.startEndContainerController.calculateContainerWidths();
251
251
  this.clickController = createClickController(el, () => this.nativeInput);
252
252
  // Watch for class changes to update validation state
253
253
  if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
@@ -286,7 +286,7 @@ export class Input {
286
286
  }
287
287
  componentDidRender() {
288
288
  this.notchController?.calculateNotchWidth();
289
- this.startContainerController?.calculateStartContainerWidth();
289
+ this.startEndContainerController?.calculateContainerWidths();
290
290
  }
291
291
  disconnectedCallback() {
292
292
  if (Build.isBrowser) {
@@ -302,9 +302,9 @@ export class Input {
302
302
  this.notchController.destroy();
303
303
  this.notchController = undefined;
304
304
  }
305
- if (this.startContainerController) {
306
- this.startContainerController.destroy();
307
- this.startContainerController = undefined;
305
+ if (this.startEndContainerController) {
306
+ this.startEndContainerController.destroy();
307
+ this.startEndContainerController = undefined;
308
308
  }
309
309
  // Clean up validation observer to prevent memory leaks
310
310
  if (this.validationObserver) {
@@ -524,7 +524,7 @@ export class Input {
524
524
  * the input has a value or is focused.
525
525
  */
526
526
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus));
527
- return (h(Host, { key: '290cf987de670276bf40b9f19d35d3769d9c0540', class: createColorClasses(this.color, {
527
+ return (h(Host, { key: '0d03d37173639105b19083c0b44da25d9115a449', class: createColorClasses(this.color, {
528
528
  [mode]: true,
529
529
  'has-value': hasValue,
530
530
  'has-focus': hasFocus,
@@ -535,14 +535,14 @@ export class Input {
535
535
  'in-item': inItem,
536
536
  'in-item-color': hostContext('ion-item.ion-color', this.el),
537
537
  'input-disabled': disabled,
538
- }) }, h("label", { key: '27f4bd671f6084a7e608e4f9442192c950879dc2', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '7827c61ffdd02952fc8cf2096f621b50fc51ec03', class: "input-start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: '1d8af52d3506742d87334b388859a8bf613e1be0', name: "start" })), h("div", { key: '927a412064538c00df98fabc06a32c564d05e984', class: "input-control" }, this.renderLabel(), h("div", { key: '05f80c0b11a7da57445f976bd2dbb557fa63c9bc', class: "native-wrapper", onClick: this.onLabelClick }, h("input", { key: 'cb6f5d81ba7c2a04cc4c9deb5d3f5bca8562b6db', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect ? 'on' : 'off', autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById(), ...this.inheritedAttributes }))), h("div", { key: '82cd1b0458dcd491fd1a46b29764f2b79a969bc6', class: "input-end" }, this.clearInput && !readonly && !disabled && (h("button", { key: 'dfcf0ed81cf36fc61b8e12ed4605ac6b6eb50dad', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
538
+ }) }, h("label", { key: '1d62890b6a54229fccae0832eebe92e546e6e53d', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: 'b1ceeb7666678569f6479729d556a29b8e549ce5', class: "input-start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: '1af55c89b1390ff9063a6c6d49a1e8bd01c7c78e', name: "start" })), h("div", { key: '6df6bc5521352ca87aeb400d169b0c9129521249', class: "input-control" }, this.renderLabel(), h("div", { key: '55d2b3a235332d7fbf61356b13052b5c9cda01de', class: "native-wrapper", onClick: this.onLabelClick }, h("input", { key: 'a938cb7ef2e87bde9da310817e1a48e7a5c67bc3', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect ? 'on' : 'off', autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById(), ...this.inheritedAttributes }))), h("div", { key: 'c99685e001ee133220d74cfa877a72063d46433c', class: "input-end", ref: (el) => (this.endContainerEl = el) }, this.clearInput && !readonly && !disabled && (h("button", { key: '0e0e154182cca8b5367c1586b3c8c5b20b38006b', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
539
539
  /**
540
540
  * This prevents mobile browsers from
541
541
  * blurring the input when the clear
542
542
  * button is activated.
543
543
  */
544
544
  ev.preventDefault();
545
- }, onClick: this.clearTextInput }, h("ion-icon", { key: '11e2c866135f332e81b4637de178e1c5c7da0d38', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: 'afb0e75e7103b2bf925a9c7649c93eb1d5702670', name: "end" })), shouldRenderHighlight && h("div", { key: '1f305bba279e93685d7139acf0aff6bf4a77500c', class: "input-highlight" })), this.renderBottomContent()));
545
+ }, onClick: this.clearTextInput }, h("ion-icon", { key: '655e8d25940dbfb96e7e83b6e89575337e3e91d3', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: '6104c04ae34a26da62095de70c752efb2a0417ab', name: "end" })), shouldRenderHighlight && h("div", { key: 'c85cd8e07397e0bbd1e5a120014d83f391dfbc4c', class: "input-highlight" })), this.renderBottomContent()));
546
546
  }
547
547
  static get is() { return "ion-input"; }
548
548
  static get encapsulation() { return "scoped"; }
@@ -425,7 +425,11 @@
425
425
  * would not be able to see what they are typing.
426
426
  */
427
427
  max-width: 200px;
428
- transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
428
+ /**
429
+ * The max-width animates with the transform so the label does not
430
+ * reveal its full floating width while it is still at full size.
431
+ */
432
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1), max-width 150ms cubic-bezier(0.4, 0, 0.2, 1);
429
433
  /**
430
434
  * This ensures that double tapping this text
431
435
  * clicks the <label> and focuses the input
@@ -439,8 +443,8 @@
439
443
  * disable the label transition to prevent the floating label
440
444
  * from animating as its position is adjusted.
441
445
  *
442
- * This class is applied by the start container controller, so
443
- * renaming it here requires renaming it there too.
446
+ * This class is applied by the start and end container controller,
447
+ * so renaming it here requires renaming it there too.
444
448
  */
445
449
  :host(.skip-label-transition) .label-text-wrapper {
446
450
  transition: none;
@@ -946,12 +950,20 @@
946
950
  --padding-end: 16px;
947
951
  /**
948
952
  * The measured width of the start container, as a negative offset
949
- * in LTR and a positive one in RTL. Written to the host by the
950
- * start container controller, so renaming it here requires renaming
953
+ * in LTR and a positive one in RTL. Written to the host by the start
954
+ * and end container controller, so renaming it here requires renaming
951
955
  * it there too. Declared with a default so the label is positioned
952
956
  * correctly before the first measurement runs.
953
957
  */
954
958
  --internal-start-container-adjustment: 0px;
959
+ /**
960
+ * The measured combined width of the start and end containers.
961
+ * Written to the host by the start and end container controller, so
962
+ * renaming it here requires renaming it there too. Declared with a
963
+ * default so the floating label falls back to the width of the
964
+ * control before the first measurement runs.
965
+ */
966
+ --internal-start-end-container-width: 0px;
955
967
  min-height: 56px;
956
968
  }
957
969
 
@@ -1007,11 +1019,12 @@
1007
1019
  }
1008
1020
 
1009
1021
  /**
1010
- * The resting label is positioned relative to the control so it can size to
1011
- * the space between the start and end slots. When floating, the label needs
1012
- * to escape the control and position itself relative to the wrapper instead.
1022
+ * The label is positioned relative to the control whether it is resting
1023
+ * over the input or floating in the notch, so its max-width always resolves
1024
+ * against the same width. This lets the max-width animate between the
1025
+ * resting and floating values without jumping.
1013
1026
  */
1014
- :host(.input-fill-outline:not(.label-floating)) .input-control {
1027
+ :host(.input-fill-outline) .input-control {
1015
1028
  position: relative;
1016
1029
  }
1017
1030
 
@@ -1020,9 +1033,8 @@
1020
1033
  transform-origin: left top;
1021
1034
  position: absolute;
1022
1035
  /**
1023
- * While resting this is the width of the text input, which already
1024
- * excludes the start and end slots. Once the label floats the
1025
- * containing block becomes the wrapper and the rule below takes over.
1036
+ * This is the width of the text input, which already
1037
+ * excludes the start and end slots.
1026
1038
  */
1027
1039
  max-width: 100%;
1028
1040
  }
@@ -1055,10 +1067,11 @@
1055
1067
  margin-top: 0;
1056
1068
  margin-bottom: 0;
1057
1069
  /**
1058
- * Label text should not extend
1059
- * beyond the bounds of the input.
1070
+ * Label text should not extend beyond the bounds of the input.
1071
+ * The control excludes the start and end slots, but the notch spans
1072
+ * the full width of the outline, so their width is added back.
1060
1073
  */
1061
- max-width: calc((100% - var(--padding-start) - var(--padding-end) - 8px) / 0.75);
1074
+ max-width: calc((100% + var(--internal-start-end-container-width) - 8px) / 0.75);
1062
1075
  }
1063
1076
 
1064
1077
  :host(.input-fill-outline) .input-outline-container {
@@ -19,6 +19,11 @@ export class InputOTP {
19
19
  * focus behavior when an input box is focused.
20
20
  */
21
21
  this.isKeyboardNavigation = false;
22
+ /**
23
+ * The `length` watcher runs before new inputs render, so
24
+ * `componentDidRender` updates their tab indexes instead.
25
+ */
26
+ this.updateTabIndexesAfterRender = false;
22
27
  this.inputValues = [];
23
28
  this.hasFocus = false;
24
29
  this.previousInputValues = [];
@@ -378,6 +383,10 @@ export class InputOTP {
378
383
  this.initializeValues();
379
384
  this.updateTabIndexes();
380
385
  }
386
+ lengthChanged() {
387
+ this.initializeValues();
388
+ this.updateTabIndexesAfterRender = true;
389
+ }
381
390
  /**
382
391
  * Processes the separators prop into an array of numbers.
383
392
  *
@@ -434,6 +443,12 @@ export class InputOTP {
434
443
  componentDidLoad() {
435
444
  this.updateTabIndexes();
436
445
  }
446
+ componentDidRender() {
447
+ if (this.updateTabIndexesAfterRender) {
448
+ this.updateTabIndexesAfterRender = false;
449
+ this.updateTabIndexes();
450
+ }
451
+ }
437
452
  /**
438
453
  * Get the regex pattern for allowed characters.
439
454
  * If a pattern is provided, use it to create a regex pattern
@@ -611,7 +626,7 @@ export class InputOTP {
611
626
  const tabbableIndex = this.getTabbableIndex();
612
627
  const pattern = this.getPattern();
613
628
  const hasDescription = el.querySelector('.input-otp-description')?.textContent?.trim() !== '';
614
- return (h(Host, { key: 'bd37661e13cde21feff30c663e6813ce3fff0d9a', class: createColorClasses(color, {
629
+ return (h(Host, { key: 'def9fbd4fa135e6f435380c6ea86ac1621b4a111', class: createColorClasses(color, {
615
630
  [mode]: true,
616
631
  'has-focus': hasFocus,
617
632
  [`input-otp-size-${size}`]: true,
@@ -619,10 +634,18 @@ export class InputOTP {
619
634
  [`input-otp-fill-${fill}`]: true,
620
635
  'input-otp-disabled': disabled,
621
636
  'input-otp-readonly': readonly,
622
- }) }, h("div", { key: '5e206f870024f1ecfebda999ff31e6e815774deb', role: "group", "aria-label": "One-time password input", class: "input-otp-group", ...inheritedAttributes }, Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper" }, h("input", { class: "native-input", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => (inputRefs[index] = el), onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator" }))))), h("div", { key: 'c268f838ddab2c8d6a612a11c7d38e6ca076436d', class: {
637
+ }) }, h("div", { key: '5d3d7646a3d4fc856b7b2e1f53d29fca47b10baf', role: "group", "aria-label": "One-time password input", class: "input-otp-group", ...inheritedAttributes }, Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper" }, h("input", { class: "native-input", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => {
638
+ if (el) {
639
+ inputRefs[index] = el;
640
+ }
641
+ else {
642
+ // The input was removed, so drop its ref and any after it.
643
+ inputRefs.splice(index);
644
+ }
645
+ }, onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator" }))))), h("div", { key: '9d72a4ab35b5fdd6bba9701050c385ed253b310f', class: {
623
646
  'input-otp-description': true,
624
647
  'input-otp-description-hidden': !hasDescription,
625
- } }, h("slot", { key: 'c0736359b26f609b795e399fc1ad9b540632af18' }))));
648
+ } }, h("slot", { key: '7deb3373c0d4e5deac22fa51577d271b9bb3a6d2' }))));
626
649
  }
627
650
  static get is() { return "ion-input-otp"; }
628
651
  static get encapsulation() { return "scoped"; }
@@ -1054,6 +1077,9 @@ export class InputOTP {
1054
1077
  return [{
1055
1078
  "propName": "value",
1056
1079
  "methodName": "valueChanged"
1080
+ }, {
1081
+ "propName": "length",
1082
+ "methodName": "lengthChanged"
1057
1083
  }, {
1058
1084
  "propName": "separators",
1059
1085
  "methodName": "processSeparators"
@@ -5,7 +5,7 @@ import { Build, Host, h } from "@stencil/core";
5
5
  import { getTimeGivenProgression } from "../../utils/animation/cubic-bezier";
6
6
  import { focusFirstDescendant, focusLastDescendant } from "../../utils/focus-trap";
7
7
  import { GESTURE_CONTROLLER } from "../../utils/gesture/index";
8
- import { shouldUseCloseWatcher } from "../../utils/hardware-back-button";
8
+ import { shouldUseCloseWatcher, updateCloseWatcher } from "../../utils/hardware-back-button";
9
9
  import { inheritAriaAttributes, assert, clamp, isEndSide as isEnd } from "../../utils/helpers";
10
10
  import { printIonError } from "../../utils/logging/index";
11
11
  import { menuController } from "../../utils/menu-controller/index";
@@ -560,6 +560,7 @@ export class Menu {
560
560
  // emit opened/closed events
561
561
  this._isOpen = isOpen;
562
562
  this.isAnimating = false;
563
+ updateCloseWatcher();
563
564
  if (!this._isOpen) {
564
565
  this.blocker.unblock();
565
566
  }
@@ -656,14 +657,14 @@ export class Menu {
656
657
  * the ionBackButton listener in the menu controller
657
658
  * will handle closing the menu when Escape is pressed.
658
659
  */
659
- return (h(Host, { key: '1208ba437fa58680325408d3d4c8580950da1d68', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
660
+ return (h(Host, { key: '5cf26df26d4e539860cbeaea98ec621b98c3fcfc', onKeyDown: shouldUseCloseWatcher() ? null : this.onKeydown, role: "navigation", "aria-label": inheritedAttributes['aria-label'] || 'menu', class: {
660
661
  [mode]: true,
661
662
  [`menu-type-${type}`]: true,
662
663
  'menu-enabled': !disabled,
663
664
  [`menu-side-${side}`]: true,
664
665
  'menu-pane-visible': isPaneVisible,
665
666
  'split-pane-side': hostContext('ion-split-pane', el),
666
- } }, h("div", { key: 'c0ddc957b7a7956b41901d77ae02d91e73071c55', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: '6e44c56116431a024f114ab85ded1b822c942fac' })), h("ion-backdrop", { key: '5f4bbcf84444d96ec6b02bf567e1aaf95f59078d', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
667
+ } }, h("div", { key: 'f337016e293bb8665c99762e0c389dd6c372bb33', class: "menu-inner", part: "container", ref: (el) => (this.menuInnerEl = el) }, h("slot", { key: '4c3fe331aa42cd57d7ad9bd1f5910f8eeb62d7da' })), h("ion-backdrop", { key: '61af7ea876d81574841e1dd3e81e2352e555d096', ref: (el) => (this.backdropEl = el), class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" })));
667
668
  }
668
669
  static get is() { return "ion-menu"; }
669
670
  static get encapsulation() { return "shadow"; }
@@ -7,6 +7,8 @@ import { clamp, getElementRoot, raf } from "../../../utils/helpers";
7
7
  import { FOCUS_TRAP_DISABLE_CLASS } from "../../../utils/overlays";
8
8
  import { getBackdropValueForSheet } from "../utils";
9
9
  import { calculateSpringStep, canSwipeOnContent, handleCanDismiss } from "./utils";
10
+ /** How far ahead, in milliseconds, a drag's velocity is projected when snapping. */
11
+ const FLICK_PROJECTION_MS = 350;
10
12
  export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, onDragStart, onDragMove, onDragEnd) => {
11
13
  // Defaults for the sheet swipe animation
12
14
  const defaultBackdrop = [
@@ -32,6 +34,11 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
32
34
  const contentEl = baseEl.querySelector('ion-content');
33
35
  // Cache the initial value so the gesture restores it instead of forcing scrolling on.
34
36
  const initialContentScrollY = contentEl?.scrollY ?? true;
37
+ /**
38
+ * The height of the sheet the user actually sees. This comes from the wrapper
39
+ * rather than the host element, which is stretched to the full viewport no
40
+ * matter how tall the sheet itself is.
41
+ */
35
42
  const height = wrapperEl.clientHeight;
36
43
  let currentBreakpoint = initialBreakpoint;
37
44
  let offset = 0;
@@ -329,18 +336,18 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
329
336
  : step;
330
337
  offset = clamp(0.0001, processedStep, maxStep);
331
338
  animation.progressStep(offset);
332
- const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
339
+ const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY, detail.velocityY);
333
340
  const eventDetail = {
334
341
  currentY: detail.currentY,
335
342
  deltaY: detail.deltaY,
336
343
  velocityY: detail.velocityY,
337
- progress: calculateProgress(detail.currentY),
344
+ progress: calculateEventProgress(detail.deltaY),
338
345
  snapBreakpoint: snapBreakpoint,
339
346
  };
340
347
  onDragMove(eventDetail);
341
348
  };
342
349
  const onEnd = (detail) => {
343
- const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
350
+ const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY, detail.velocityY);
344
351
  /**
345
352
  * `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
346
353
  * snaps to 0 but never dismisses, since `handleCanDismiss` returns early
@@ -354,7 +361,7 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
354
361
  currentY: detail.currentY,
355
362
  deltaY: detail.deltaY,
356
363
  velocityY: detail.velocityY,
357
- progress: calculateProgress(detail.currentY),
364
+ progress: calculateEventProgress(detail.deltaY),
358
365
  snapBreakpoint,
359
366
  isDismissing,
360
367
  };
@@ -530,24 +537,15 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
530
537
  });
531
538
  };
532
539
  /**
533
- * Calculates the breakpoint based on the current deltaY.
534
- * This determines where the sheet should snap to when the user releases the
535
- * gesture.
540
+ * Decides which breakpoint the sheet should settle on for the current drag.
536
541
  *
537
- * @param deltaY The change in Y position since the gesture started.
538
- * @returns The snap breakpoint value.
542
+ * @param deltaY The change in Y position since the gesture started
543
+ * @param velocityY The velocity in pixels per millisecond
544
+ * @returns The snap breakpoint value
539
545
  */
540
- const calculateSnapBreakpoint = (deltaY) => {
541
- /**
542
- * Calculates the real-time vertical position of the modal.
543
- * We combine the wrapper's current bounding box position with the
544
- * gesture's deltaY to account for the physical movement during the drag.
545
- */
546
- const currentY = wrapperEl.getBoundingClientRect().top + deltaY;
547
- /**
548
- * Convert that pixel position back into a 0 to 1 progress value.
549
- */
550
- const currentProgress = calculateProgress(currentY);
546
+ const calculateSnapBreakpoint = (deltaY, velocityY) => {
547
+ // Project the drag forward so a quick flick counts.
548
+ const currentProgress = calculateProgress(deltaY + velocityY * FLICK_PROJECTION_MS);
551
549
  /**
552
550
  * Find and return the defined breakpoint that is closest to the
553
551
  * current progress.
@@ -558,74 +556,26 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
558
556
  return snapBreakpoint;
559
557
  };
560
558
  /**
561
- * Calculates the progress of the swipe gesture.
559
+ * Calculates how open the sheet is part way through a gesture, on the same
560
+ * 0 to 1 scale as the breakpoints: 1 is fully open and 0 is fully closed.
562
561
  *
563
- * The progress is a value between 0 and 1 that represents how far
564
- * the swipe has progressed towards closing the modal.
565
- *
566
- * A value closer to 1 means the modal is closer to being opened,
567
- * while a value closer to 0 means the modal is closer to being closed.
568
- *
569
- * @param currentY The current Y position of the gesture
562
+ * @param deltaY The change in Y position since the gesture started
570
563
  * @returns The progress of the sheet gesture
571
564
  */
572
- const calculateProgress = (currentY) => {
573
- const minBreakpoint = breakpoints[0];
574
- const maxBreakpoint = breakpoints[breakpoints.length - 1];
575
- /**
576
- * The lowest point the sheet can be dragged to aka the point at which
577
- * the sheet is fully closed.
578
- */
579
- const maxY = convertBreakpointToY(minBreakpoint);
580
- /**
581
- * The highest point the sheet can be dragged to aka the point at which
582
- * the sheet is fully open.
583
- */
584
- const minY = convertBreakpointToY(maxBreakpoint);
585
- // The total distance between the fully open and fully closed positions.
586
- const totalDistance = maxY - minY;
587
- // The distance from the current position to the fully closed position.
588
- const distanceFromBottom = maxY - currentY;
589
- /**
590
- * The progress represents how far the sheet is from the bottom relative
591
- * to the total distance. When the user starts swiping up, the progress
592
- * should be close to 1, and when the user has swiped all the way down,
593
- * the progress should be close to 0.
594
- */
595
- const progress = distanceFromBottom / totalDistance;
565
+ const calculateProgress = (deltaY) => {
566
+ // Mirrors the animation step in onMove, so the snap matches where the sheet is drawn.
567
+ const progress = currentBreakpoint - deltaY / height;
596
568
  // Round to the nearest thousandth to avoid returning very small decimal
597
569
  const roundedProgress = Math.round(progress * 1000) / 1000;
598
- return Math.max(0, Math.min(1, roundedProgress));
570
+ return clamp(0, roundedProgress, 1);
599
571
  };
600
572
  /**
601
- * Converts a breakpoint value (0 to 1) into a pixel Y coordinate
602
- * on the screen.
603
- *
604
- * @param breakpoint The breakpoint value (e.g., 0.5 for half-open)
605
- * @returns The pixel Y coordinate on the screen
573
+ * Scales the progress from the lowest to the highest breakpoint, so the
574
+ * drag events report 0 at the lowest breakpoint and 1 at the highest.
606
575
  */
607
- const convertBreakpointToY = (breakpoint) => {
608
- const rect = baseEl.getBoundingClientRect();
609
- const modalHeight = rect.height;
610
- // The bottom of the screen.
611
- const viewportBottom = window.innerHeight;
612
- /**
613
- * The active height is how much of the modal is actually showing
614
- * on the screen for this specific breakpoint.
615
- */
616
- const activeHeight = modalHeight * breakpoint;
617
- /**
618
- * To find the Y coordinate, start at the bottom of the screen
619
- * and move up by the active height of the modal.
620
- *
621
- * A breakpoint of 1.0 means the active height is the full modal height
622
- * (fully open). A breakpoint of 0.0 means the active height is 0
623
- * (fully closed).
624
- *
625
- * Since screen Y coordinates get smaller as you go up, we subtract the
626
- * active height from the viewport bottom.
627
- */
628
- return viewportBottom - activeHeight;
576
+ const calculateEventProgress = (deltaY) => {
577
+ const progress = (calculateProgress(deltaY) - minBreakpoint) / (maxBreakpoint - minBreakpoint);
578
+ return clamp(0, progress, 1);
629
579
  };
630
580
  const gesture = createGesture({
631
581
  el: wrapperEl,
@@ -5,7 +5,7 @@ import { h } from "@stencil/core";
5
5
  import { getTimeGivenProgression } from "../../utils/animation/cubic-bezier";
6
6
  import { assert } from "../../utils/helpers";
7
7
  import { printIonWarning } from "../../utils/logging/index";
8
- import { lifecycle, setPageHidden, transition } from "../../utils/transition/index";
8
+ import { blockSwipeClicks, lifecycle, setPageHidden, transition } from "../../utils/transition/index";
9
9
  import { config } from "../../global/config";
10
10
  import { getIonMode } from "../../global/ionic-global";
11
11
  import { LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_LEAVE, LIFECYCLE_WILL_UNLOAD } from "./constants";
@@ -68,6 +68,12 @@ export class Nav {
68
68
  this.gesture.destroy();
69
69
  this.gesture = undefined;
70
70
  }
71
+ // Destroying the gesture skips onEnd, so end a deferred swipe here.
72
+ if (this.unblockSwipeClicks) {
73
+ this.unblockSwipeClicks();
74
+ this.unblockSwipeClicks = undefined;
75
+ this.gestureOrAnimationInProgress = false;
76
+ }
71
77
  this.transInstr.length = 0;
72
78
  this.views.length = 0;
73
79
  this.destroyed = true;
@@ -688,6 +694,14 @@ export class Nav {
688
694
  }
689
695
  onStart() {
690
696
  this.gestureOrAnimationInProgress = true;
697
+ /**
698
+ * Without animations there's nothing for the swipe to drive, so
699
+ * wait until the gesture ends to decide whether to go back.
700
+ */
701
+ if (!(this.animated && config.getBoolean('animated', true))) {
702
+ this.unblockSwipeClicks = blockSwipeClicks(this.el);
703
+ return;
704
+ }
691
705
  this.pop({ direction: 'back', progressAnimation: true });
692
706
  }
693
707
  onMove(stepValue) {
@@ -721,10 +735,18 @@ export class Nav {
721
735
  }
722
736
  else {
723
737
  this.gestureOrAnimationInProgress = false;
738
+ const { unblockSwipeClicks } = this;
739
+ if (unblockSwipeClicks) {
740
+ this.unblockSwipeClicks = undefined;
741
+ if (shouldComplete) {
742
+ this.pop({ direction: 'back' });
743
+ }
744
+ unblockSwipeClicks();
745
+ }
724
746
  }
725
747
  }
726
748
  render() {
727
- return h("slot", { key: '1886154d3c2fa8511af4d641d269aaa4c0f45c05' });
749
+ return h("slot", { key: '0aea554c0cf00dd3829757ec74c3855eccf1e068' });
728
750
  }
729
751
  static get is() { return "ion-nav"; }
730
752
  static get encapsulation() { return "shadow"; }
@@ -7,7 +7,7 @@ import { attachComponent, detachComponent } from "../../utils/framework-delegate
7
7
  import { shallowEqualStringMap, hasLazyBuild } from "../../utils/helpers";
8
8
  import { createLockController } from "../../utils/lock-controller";
9
9
  import { printIonError } from "../../utils/logging/index";
10
- import { transition } from "../../utils/transition/index";
10
+ import { blockSwipeClicks, transition } from "../../utils/transition/index";
11
11
  import { config } from "../../global/config";
12
12
  import { getIonMode } from "../../global/ionic-global";
13
13
  export class RouterOutlet {
@@ -32,6 +32,14 @@ export class RouterOutlet {
32
32
  async connectedCallback() {
33
33
  const onStart = () => {
34
34
  this.gestureOrAnimationInProgress = true;
35
+ /**
36
+ * Without animations there's nothing for the swipe to drive, so
37
+ * wait until the gesture ends to decide whether to go back.
38
+ */
39
+ if (!(this.animated && config.getBoolean('animated', true))) {
40
+ this.unblockSwipeClicks = blockSwipeClicks(this.el);
41
+ return;
42
+ }
35
43
  if (this.swipeHandler) {
36
44
  this.swipeHandler.onStart();
37
45
  }
@@ -65,7 +73,21 @@ export class RouterOutlet {
65
73
  this.ani.progressEnd(shouldComplete ? 1 : 0, newStepValue, dur);
66
74
  }
67
75
  else {
68
- this.gestureOrAnimationInProgress = false;
76
+ const { swipeHandler, unblockSwipeClicks: unblock } = this;
77
+ this.unblockSwipeClicks = undefined;
78
+ // The stack can change during the swipe, so check that going back is still possible.
79
+ if (unblock && shouldComplete && swipeHandler?.canStart()) {
80
+ new Promise((resolve) => resolve(swipeHandler.onStart()))
81
+ .then(() => swipeHandler.onEnd(true))
82
+ .finally(() => {
83
+ this.gestureOrAnimationInProgress = false;
84
+ unblock();
85
+ });
86
+ }
87
+ else {
88
+ this.gestureOrAnimationInProgress = false;
89
+ unblock?.();
90
+ }
69
91
  }
70
92
  });
71
93
  if (this.swipeGesture === undefined) {
@@ -88,6 +110,12 @@ export class RouterOutlet {
88
110
  this.gesture.destroy();
89
111
  this.gesture = undefined;
90
112
  }
113
+ // Destroying the gesture skips onEnd, so end a deferred swipe here.
114
+ if (this.unblockSwipeClicks) {
115
+ this.unblockSwipeClicks();
116
+ this.unblockSwipeClicks = undefined;
117
+ this.gestureOrAnimationInProgress = false;
118
+ }
91
119
  }
92
120
  /** @internal */
93
121
  async commit(enteringEl, leavingEl, opts) {
@@ -199,7 +227,7 @@ export class RouterOutlet {
199
227
  return true;
200
228
  }
201
229
  render() {
202
- return h("slot", { key: 'b84efe2b852f24f6b43e0667b25266f9223447ae' });
230
+ return h("slot", { key: '811f32d8794e58fcc79deef1e217c4d419778742' });
203
231
  }
204
232
  static get is() { return "ion-router-outlet"; }
205
233
  static get encapsulation() { return "shadow"; }
@@ -390,7 +390,11 @@ button {
390
390
  * would not be able to see what they are typing.
391
391
  */
392
392
  max-width: 200px;
393
- transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
393
+ /**
394
+ * The max-width animates with the transform so the label does not
395
+ * reveal its full floating width while it is still at full size.
396
+ */
397
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1), max-width 150ms cubic-bezier(0.4, 0, 0.2, 1);
394
398
  /**
395
399
  * This ensures that double tapping this text
396
400
  * clicks the <label> and focuses the input
@@ -404,8 +408,8 @@ button {
404
408
  * disable the label transition to prevent the floating label
405
409
  * from animating as its position is adjusted.
406
410
  *
407
- * This class is applied by the start container controller, so
408
- * renaming it here requires renaming it there too.
411
+ * This class is applied by the start and end container controller,
412
+ * so renaming it here requires renaming it there too.
409
413
  */
410
414
  :host(.skip-label-transition) .label-text-wrapper {
411
415
  transition: none;