voyager-ionic-core 9.0.3 → 9.0.7

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 (553) 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--cshUOAU.js +4 -0
  99. package/components/{p-BF48Oc0v.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-B4IBdPVJ.js +4 -0
  103. package/components/{p-BYJRZKHa.js → p-BMHdI-wb.js} +1 -1
  104. package/components/p-BODcC-C0.js +4 -0
  105. package/components/{p-D7wDJdFn.js → p-Ba9_OzSY.js} +1 -1
  106. package/components/{p-DMBiAyOR.js → p-BqyLLYLm.js} +1 -1
  107. package/components/{p-BQyuFxYc.js → p-C1AxSUnp.js} +1 -1
  108. package/components/p-C7r5Gja6.js +4 -0
  109. package/components/{p-D5w_FlVa.js → p-CKiqp4Vl.js} +1 -1
  110. package/components/{p-C8Ck7_Eo.js → p-C_gnmBt2.js} +1 -1
  111. package/{dist/ionic/p-DTxBioUO.js → components/p-CdrNHfZl.js} +1 -1
  112. package/components/{p-DM1gJSMP.js → p-ChkSQqfP.js} +1 -1
  113. package/components/p-ChsJlFCQ.js +4 -0
  114. package/components/{p-cEN43Ahr.js → p-CjPRDxby.js} +1 -1
  115. package/components/p-CohRJRIu.js +4 -0
  116. package/components/{p-DxhHlJln.js → p-CqvARtmt.js} +1 -1
  117. package/components/p-Ct2aBEue.js +4 -0
  118. package/components/p-CtiO6_sC.js +4 -0
  119. package/components/{p-Hp8t4RMX.js → p-CvyvLbPe.js} +1 -1
  120. package/{dist/ionic/p-BMiZX1LT.js → components/p-CwEis84J.js} +1 -1
  121. package/components/p-CxEV3Vwy.js +4 -0
  122. package/components/p-Cyajikho.js +4 -0
  123. package/components/p-D64Tyi-z.js +4 -0
  124. package/components/{p-B4lxwJ8N.js → p-DBtFJlTi.js} +1 -1
  125. package/components/p-DD92Fw3n.js +4 -0
  126. package/components/p-DDI6VLW9.js +4 -0
  127. package/components/{p-Fl7ZFU74.js → p-DHo45oj7.js} +1 -1
  128. package/components/{p-COO0eJOA.js → p-DMPsc_0r.js} +1 -1
  129. package/{dist/ionic/p-DZ6Hmc-8.js → components/p-Dbi3KqKm.js} +1 -1
  130. package/components/p-DhfJAkyd.js +4 -0
  131. package/components/p-DnGlmM4u.js +4 -0
  132. package/components/{p-CJgnoKcN.js → p-Drpw2dyl.js} +1 -1
  133. package/components/{p-5ldEpNdG.js → p-Dvyv9SMk.js} +1 -1
  134. package/components/p-GpqwNbxf.js +4 -0
  135. package/components/{p-BJr2B5hZ.js → p-HthJZjZ6.js} +1 -1
  136. package/components/p-IQN1T5zw.js +4 -0
  137. package/components/{p-DL13ieTa.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-TLtgwTFF.js +4 -0
  141. package/components/p-Uk13YgEc.js +4 -0
  142. package/components/{p-qAXsfUff.js → p-V1THdfzs.js} +1 -1
  143. package/components/{p-C-NbvXu4.js → p-YNnH1_Hs.js} +1 -1
  144. package/components/{p-CqbGBmqb.js → p-ZrYBjOcc.js} +1 -1
  145. package/components/p-_y7kwBO8.js +4 -0
  146. package/components/{p-GGbIHyEF.js → p-hLu-eIbb.js} +1 -1
  147. package/components/p-jsVMT15X.js +4 -0
  148. package/components/{p-TWw4e4sO.js → p-r59A3wQk.js} +1 -1
  149. package/components/p-yGD6MBgf.js +4 -0
  150. package/css/core.css +1 -1
  151. package/css/core.css.map +1 -1
  152. package/css/display.css.map +1 -1
  153. package/css/flex-utils.css.map +1 -1
  154. package/css/float-elements.css +1 -1
  155. package/css/float-elements.css.map +1 -1
  156. package/css/global.bundle.css.map +1 -1
  157. package/css/ionic.bundle.css +1 -1
  158. package/css/ionic.bundle.css.map +1 -1
  159. package/css/padding.css.map +1 -1
  160. package/css/structure.css.map +1 -1
  161. package/css/text-alignment.css.map +1 -1
  162. package/css/text-transformation.css.map +1 -1
  163. package/css/typography.css.map +1 -1
  164. package/css/utils.bundle.css +1 -1
  165. package/css/utils.bundle.css.map +1 -1
  166. package/dist/cjs/{animation-Kd1N7WTN.js → animation-DcgLg_PI.js} +3 -3
  167. package/dist/cjs/{app-globals-b1G4t26O.js → app-globals-BoFCZq0K.js} +1 -1
  168. package/dist/cjs/attribute-controller-BjTE2TOf.js +131 -0
  169. package/dist/cjs/{button-active-CQCFubJJ.js → button-active-FdsfRDY_.js} +2 -2
  170. package/dist/cjs/{capacitor-DmA66EwP.js → capacitor-C6Pp4Z7A.js} +3 -3
  171. package/dist/cjs/{format-bHU8N1g5.js → format-CVjpvAl1.js} +1 -1
  172. package/dist/cjs/{framework-delegate-d-fWfeI6.js → framework-delegate-JbKIVMzR.js} +1 -1
  173. package/dist/cjs/{haptic-Ch-X4gRx.js → haptic--4QteuuM.js} +1 -1
  174. package/dist/cjs/{helpers-7wzdhdeg.js → helpers-Cqr69qxA.js} +50 -3
  175. package/dist/cjs/{index-KiSZqhYS.js → index-B4ONUQRp.js} +1 -1
  176. package/dist/cjs/{index-C74Q3t6a.js → index-BQpSekmz.js} +7 -8
  177. package/dist/cjs/{index-DFNrCX7M.js → index-BhWiDK25.js} +9 -9
  178. package/dist/cjs/{index-DXoo08JC.js → index-BiQyIvoc.js} +54 -28
  179. package/dist/cjs/{index-DtvKGwdh.js → index-CNaZ6SYM.js} +2 -2
  180. package/dist/cjs/{index-CQfEIyLK.js → index-DUiuw_fH.js} +4 -4
  181. package/dist/cjs/index.cjs.js +19 -19
  182. package/dist/cjs/{input-shims-VJIiKBKv.js → input-shims-2AsXPZ5m.js} +16 -17
  183. package/dist/cjs/{input.utils-EHVE2RK_.js → input.utils-Becpo0ax.js} +1 -1
  184. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  185. package/dist/cjs/ion-action-sheet.cjs.entry.js +26 -28
  186. package/dist/cjs/ion-alert.cjs.entry.js +27 -29
  187. package/dist/cjs/ion-app_8.cjs.entry.js +72 -24
  188. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  189. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  190. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  191. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
  192. package/dist/cjs/ion-button_2.cjs.entry.js +23 -34
  193. package/dist/cjs/ion-card_5.cjs.entry.js +19 -7
  194. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  195. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  196. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  197. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  198. package/dist/cjs/ion-datetime.cjs.entry.js +34 -29
  199. package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
  200. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  201. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  202. package/dist/cjs/ion-input-otp.cjs.entry.js +33 -8
  203. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  204. package/dist/cjs/ion-input.cjs.entry.js +12 -16
  205. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  206. package/dist/cjs/ion-item_8.cjs.entry.js +17 -8
  207. package/dist/cjs/ion-loading.cjs.entry.js +18 -20
  208. package/dist/cjs/ion-menu_3.cjs.entry.js +18 -19
  209. package/dist/cjs/ion-modal.cjs.entry.js +177 -172
  210. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  211. package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
  212. package/dist/cjs/ion-picker-column.cjs.entry.js +8 -9
  213. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  214. package/dist/cjs/ion-popover.cjs.entry.js +119 -42
  215. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  216. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  217. package/dist/cjs/ion-range.cjs.entry.js +4 -4
  218. package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -9
  219. package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -7
  220. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  221. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  222. package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
  223. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  224. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  225. package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
  226. package/dist/cjs/ion-select-modal.cjs.entry.js +8 -10
  227. package/dist/cjs/ion-select_3.cjs.entry.js +71 -53
  228. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  229. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  230. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -7
  231. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  232. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  233. package/dist/cjs/ion-textarea.cjs.entry.js +11 -15
  234. package/dist/cjs/ion-toast.cjs.entry.js +49 -51
  235. package/dist/cjs/ion-toggle.cjs.entry.js +6 -7
  236. package/dist/cjs/{ionic-global-CYJNT-2P.js → ionic-global-48ceLiJ6.js} +1 -1
  237. package/dist/cjs/ionic.cjs.js +5 -5
  238. package/dist/cjs/{ios.transition-DYGiD6gM.js → ios.transition-D85_rHf5.js} +4 -5
  239. package/dist/cjs/{item-multiple-inputs-Dv6qrMhm.js → item-multiple-inputs-C-hz7xrh.js} +1 -1
  240. package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-BlHp4a_c.js} +1 -1
  241. package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-c2_I35b-.js} +5 -3
  242. package/dist/cjs/{keyboard-controller-PtZoN2GS.js → keyboard-controller-DHS0BgXp.js} +9 -9
  243. package/dist/cjs/loader.cjs.js +4 -4
  244. package/dist/cjs/{md.transition-CrSkaoz6.js → md.transition-Ce9X1WXr.js} +4 -5
  245. package/dist/cjs/{overlays-BR21NUIG.js → overlays-CLld3axA.js} +224 -12
  246. package/dist/cjs/{select-option-render-D8ZEjYji.js → select-option-render-CzyhrkOu.js} +2 -2
  247. package/dist/cjs/{slot-mutation-controller-D6IjSEIh.js → slot-mutation-controller-ClDxh3EK.js} +73 -5
  248. package/dist/cjs/{status-tap-CNP5eD1R.js → status-tap-CDA0Y3Ad.js} +3 -3
  249. package/dist/cjs/{swipe-back-CSIJQfu5.js → swipe-back-Dy8pxJCF.js} +2 -2
  250. package/dist/collection/collection-manifest.json +1 -1
  251. package/dist/collection/components/button/button.js +21 -32
  252. package/dist/collection/components/card/card.js +17 -6
  253. package/dist/collection/components/content/content.js +62 -8
  254. package/dist/collection/components/datetime/datetime.js +27 -20
  255. package/dist/collection/components/input/input.ios.css +6 -0
  256. package/dist/collection/components/input/input.js +6 -9
  257. package/dist/collection/components/input/input.md.css +6 -0
  258. package/dist/collection/components/input-otp/input-otp.js +29 -3
  259. package/dist/collection/components/item/item.js +15 -6
  260. package/dist/collection/components/menu/menu.js +4 -3
  261. package/dist/collection/components/modal/modal.ios.css +12 -1
  262. package/dist/collection/components/modal/modal.js +31 -8
  263. package/dist/collection/components/modal/modal.md.css +12 -1
  264. package/dist/collection/components/modal/safe-area-utils.js +69 -90
  265. package/dist/collection/components/modal/utils.js +7 -0
  266. package/dist/collection/components/popover/animations/ios.enter.js +20 -6
  267. package/dist/collection/components/popover/animations/md.enter.js +19 -5
  268. package/dist/collection/components/popover/utils.js +64 -13
  269. package/dist/collection/components/select/select.ios.css +1 -1
  270. package/dist/collection/components/select/select.js +67 -38
  271. package/dist/collection/components/select/select.md.css +1 -1
  272. package/dist/collection/components/textarea/textarea.ios.css +15 -1
  273. package/dist/collection/components/textarea/textarea.js +5 -8
  274. package/dist/collection/components/textarea/textarea.md.css +15 -1
  275. package/dist/collection/index.js +1 -1
  276. package/dist/collection/utils/attribute-controller.js +126 -0
  277. package/dist/collection/utils/forms/click-controller.js +70 -0
  278. package/dist/collection/utils/forms/index.js +1 -0
  279. package/dist/collection/utils/hardware-back-button.js +41 -12
  280. package/dist/collection/utils/helpers.js +44 -3
  281. package/dist/collection/utils/logging/index.js +4 -0
  282. package/dist/collection/utils/menu-controller/index.js +2 -1
  283. package/dist/collection/utils/overlays.js +64 -4
  284. package/dist/docs.json +9 -3
  285. package/dist/esm/{animation-BFNVlYum.js → animation-DmtJpz89.js} +2 -2
  286. package/dist/esm/{app-globals-BgX0BGL1.js → app-globals-CNfpAPW6.js} +1 -1
  287. package/dist/esm/attribute-controller-DPMIcbef.js +128 -0
  288. package/dist/esm/{button-active-BfOvDr3b.js → button-active-DVk40Sjl.js} +2 -2
  289. package/dist/esm/{capacitor-CFERIeaU.js → capacitor-CHJaJ9aX.js} +1 -1
  290. package/dist/esm/{format-DDFE9jM5.js → format-Ck1cw5z7.js} +1 -1
  291. package/dist/esm/{framework-delegate-BwNhx9NR.js → framework-delegate-CDjM1vRH.js} +1 -1
  292. package/dist/esm/{haptic-Cq4UAeka.js → haptic-WXfMCob9.js} +1 -1
  293. package/dist/esm/{helpers-BSmc0nst.js → helpers-BJqKF1pr.js} +47 -4
  294. package/dist/esm/{index-DnA_7Bnx.js → index-BBASprVu.js} +4 -4
  295. package/dist/esm/{index-C23AVPx9.js → index-BpRUsN_W.js} +55 -29
  296. package/dist/esm/{index-D76bbuoi.js → index-CK8uF0iB.js} +1 -1
  297. package/dist/esm/{index-CJln0gS3.js → index-Clv8QC5L.js} +2 -3
  298. package/dist/esm/{index-BuPaALjU.js → index-DIouXecD.js} +6 -6
  299. package/dist/esm/{index-C1b9CLFg.js → index-TkLga3ma.js} +2 -2
  300. package/dist/esm/index.js +11 -13
  301. package/dist/esm/{input-shims-Dqk-Ou25.js → input-shims-C1iYF5JK.js} +5 -6
  302. package/dist/esm/{input.utils-rqoH22pW.js → input.utils-DZY_K8Po.js} +1 -1
  303. package/dist/esm/ion-accordion_2.entry.js +3 -3
  304. package/dist/esm/ion-action-sheet.entry.js +11 -13
  305. package/dist/esm/ion-alert.entry.js +11 -13
  306. package/dist/esm/ion-app_8.entry.js +72 -24
  307. package/dist/esm/ion-avatar_3.entry.js +2 -2
  308. package/dist/esm/ion-back-button.entry.js +3 -3
  309. package/dist/esm/ion-backdrop.entry.js +2 -2
  310. package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
  311. package/dist/esm/ion-button_2.entry.js +23 -34
  312. package/dist/esm/ion-card_5.entry.js +19 -7
  313. package/dist/esm/ion-checkbox.entry.js +4 -4
  314. package/dist/esm/ion-chip.entry.js +2 -2
  315. package/dist/esm/ion-col_3.entry.js +2 -2
  316. package/dist/esm/ion-datetime-button.entry.js +4 -4
  317. package/dist/esm/ion-datetime.entry.js +33 -28
  318. package/dist/esm/ion-fab_3.entry.js +3 -3
  319. package/dist/esm/ion-img.entry.js +3 -3
  320. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  321. package/dist/esm/ion-input-otp.entry.js +33 -8
  322. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  323. package/dist/esm/ion-input.entry.js +12 -16
  324. package/dist/esm/ion-item-option_3.entry.js +4 -4
  325. package/dist/esm/ion-item_8.entry.js +17 -8
  326. package/dist/esm/ion-loading.entry.js +7 -9
  327. package/dist/esm/ion-menu_3.entry.js +10 -11
  328. package/dist/esm/ion-modal.entry.js +115 -110
  329. package/dist/esm/ion-nav_2.entry.js +6 -6
  330. package/dist/esm/ion-picker-column-option.entry.js +3 -3
  331. package/dist/esm/ion-picker-column.entry.js +5 -6
  332. package/dist/esm/ion-picker.entry.js +2 -2
  333. package/dist/esm/ion-popover.entry.js +108 -31
  334. package/dist/esm/ion-progress-bar.entry.js +3 -3
  335. package/dist/esm/ion-radio_2.entry.js +4 -4
  336. package/dist/esm/ion-range.entry.js +4 -4
  337. package/dist/esm/ion-refresher_2.entry.js +8 -9
  338. package/dist/esm/ion-reorder_2.entry.js +6 -7
  339. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  340. package/dist/esm/ion-route_4.entry.js +4 -4
  341. package/dist/esm/ion-searchbar.entry.js +3 -3
  342. package/dist/esm/ion-segment-content.entry.js +1 -1
  343. package/dist/esm/ion-segment-view.entry.js +1 -1
  344. package/dist/esm/ion-segment_2.entry.js +3 -3
  345. package/dist/esm/ion-select-modal.entry.js +7 -9
  346. package/dist/esm/ion-select_3.entry.js +66 -48
  347. package/dist/esm/ion-spinner.entry.js +2 -2
  348. package/dist/esm/ion-split-pane.entry.js +2 -2
  349. package/dist/esm/ion-tab-bar_2.entry.js +6 -7
  350. package/dist/esm/ion-tab_2.entry.js +3 -3
  351. package/dist/esm/ion-text.entry.js +2 -2
  352. package/dist/esm/ion-textarea.entry.js +11 -15
  353. package/dist/esm/ion-toast.entry.js +7 -9
  354. package/dist/esm/ion-toggle.entry.js +6 -7
  355. package/dist/esm/{ionic-global-ZXjCXKH0.js → ionic-global-Cep6oYzK.js} +1 -1
  356. package/dist/esm/ionic.js +6 -6
  357. package/dist/esm/{ios.transition-CWAgfQ1r.js → ios.transition-B8netzsb.js} +4 -5
  358. package/dist/esm/{item-multiple-inputs-DZnIiOO_.js → item-multiple-inputs-Bd2LO7qK.js} +1 -1
  359. package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-B4Y-Gph8.js} +5 -3
  360. package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-Cmqp5iZD.js} +1 -1
  361. package/dist/esm/{keyboard-controller-DEwoa1ev.js → keyboard-controller-B2NoF7bV.js} +2 -2
  362. package/dist/esm/loader.js +5 -5
  363. package/dist/esm/{md.transition-ZuqDDdDW.js → md.transition-DNCSSiXk.js} +4 -5
  364. package/dist/esm/{overlays-DKE0DgvE.js → overlays-DmDY-El7.js} +216 -10
  365. package/dist/esm/{select-option-render-CRP_teb1.js → select-option-render-BSDT9oSA.js} +2 -2
  366. package/dist/esm/{slot-mutation-controller-B5NpUZ-N.js → slot-mutation-controller-hAS2uJ7c.js} +69 -3
  367. package/dist/esm/{status-tap-Cv9gb3ja.js → status-tap-VGRBYwiC.js} +3 -3
  368. package/dist/esm/{swipe-back-De5HlmeM.js → swipe-back-tCNYR9ZM.js} +2 -2
  369. package/dist/ionic/index.esm.js +1 -1
  370. package/dist/ionic/ionic.esm.js +1 -1
  371. package/dist/ionic/{p-b9b4e85d.entry.js → p-00cd107d.entry.js} +1 -1
  372. package/dist/ionic/p-01b7e3f2.entry.js +4 -0
  373. package/dist/ionic/{p-9c5f2691.entry.js → p-0a789930.entry.js} +1 -1
  374. package/dist/ionic/p-0b09c60e.entry.js +4 -0
  375. package/dist/ionic/p-0c32c626.entry.js +4 -0
  376. package/dist/ionic/p-0f97175e.entry.js +4 -0
  377. package/dist/ionic/p-107a81a6.entry.js +4 -0
  378. package/dist/ionic/{p-ca1b8865.entry.js → p-230f510c.entry.js} +1 -1
  379. package/dist/ionic/p-27d96a9b.entry.js +4 -0
  380. package/dist/ionic/{p-db449915.entry.js → p-28251c5c.entry.js} +1 -1
  381. package/dist/ionic/{p-099b7f9f.entry.js → p-362dcd86.entry.js} +1 -1
  382. package/dist/ionic/p-4bd80334.entry.js +4 -0
  383. package/dist/ionic/p-4d785062.entry.js +4 -0
  384. package/dist/ionic/{p-efc0cf82.entry.js → p-4e4e5919.entry.js} +1 -1
  385. package/dist/ionic/{p-837db1b9.entry.js → p-4ed3c460.entry.js} +1 -1
  386. package/dist/ionic/{p-d8c138d9.entry.js → p-4f25b926.entry.js} +1 -1
  387. package/dist/ionic/{p-271c3640.entry.js → p-539d6c8e.entry.js} +1 -1
  388. package/dist/ionic/p-5bb24bce.entry.js +4 -0
  389. package/dist/ionic/p-60780b88.entry.js +4 -0
  390. package/dist/ionic/{p-54cbb0a7.entry.js → p-62c87f3d.entry.js} +1 -1
  391. package/dist/ionic/p-6317d620.entry.js +4 -0
  392. package/dist/ionic/{p-85599fe3.entry.js → p-64ac3864.entry.js} +1 -1
  393. package/dist/ionic/{p-191a651e.entry.js → p-6c7b5930.entry.js} +1 -1
  394. package/dist/ionic/{p-7fbb3319.entry.js → p-77252596.entry.js} +1 -1
  395. package/dist/ionic/p-7ce9c6f8.entry.js +4 -0
  396. package/dist/ionic/{p-8b80d9f9.entry.js → p-7db20410.entry.js} +1 -1
  397. package/dist/ionic/{p-5d9094ac.entry.js → p-7e9c2a97.entry.js} +1 -1
  398. package/dist/ionic/p-7l6ENjIV.js +4 -0
  399. package/dist/ionic/p-82abf431.entry.js +4 -0
  400. package/dist/ionic/p-8b79061e.entry.js +4 -0
  401. package/dist/ionic/{p-6e386853.entry.js → p-8c85e250.entry.js} +1 -1
  402. package/dist/ionic/{p-90f50a65.entry.js → p-8d651adb.entry.js} +1 -1
  403. package/dist/ionic/{p-dd01be0a.entry.js → p-8db08782.entry.js} +1 -1
  404. package/dist/ionic/p-91f3cd8b.entry.js +4 -0
  405. package/dist/ionic/{p-f0fb23c1.entry.js → p-930c3538.entry.js} +1 -1
  406. package/dist/ionic/{p-ee09ac9d.entry.js → p-9ffccbf1.entry.js} +1 -1
  407. package/dist/ionic/{p-CM5OBjTW.js → p-B0jcOZOE.js} +1 -1
  408. package/dist/ionic/p-B8IuTu_r.js +4 -0
  409. package/dist/ionic/p-BNXIurCt.js +4 -0
  410. package/{components/p-6ZLn6K5e.js → dist/ionic/p-BO10QT9r.js} +1 -1
  411. package/dist/ionic/p-BOLqP2-V.js +4 -0
  412. package/dist/ionic/{p-BMPN55of.js → p-BY4FwwBp.js} +1 -1
  413. package/dist/ionic/p-BdHBcCZF.js +4 -0
  414. package/{components/p-DiuOa1vw.js → dist/ionic/p-BexAj0yw.js} +1 -1
  415. package/dist/ionic/p-Bnc1L7Rk.js +4 -0
  416. package/dist/ionic/p-BpRUsN_W.js +6 -0
  417. package/dist/ionic/p-Bppj2PE0.js +4 -0
  418. package/dist/ionic/p-BuLlVedw.js +4 -0
  419. package/dist/ionic/p-Bx5x5GJV.js +4 -0
  420. package/dist/ionic/p-C1WYZOZj.js +4 -0
  421. package/dist/ionic/p-C2LaBx3E.js +4 -0
  422. package/dist/ionic/{p-Bd72UYI2.js → p-CXs4J83x.js} +1 -1
  423. package/dist/ionic/p-Co7eql8D.js +4 -0
  424. package/dist/ionic/p-D13gXhdC.js +4 -0
  425. package/dist/ionic/p-D926OmIX.js +4 -0
  426. package/dist/ionic/{p-T71k3C35.js → p-DPNVo1nr.js} +1 -1
  427. package/{components/p-C4VpVfrJ.js → dist/ionic/p-DQXtveHv.js} +1 -1
  428. package/dist/ionic/p-DXXGkPA8.js +4 -0
  429. package/dist/ionic/{p-C8XilMh0.js → p-DfvWlTdB.js} +1 -1
  430. package/dist/ionic/p-DriE1ZAo.js +4 -0
  431. package/dist/ionic/{p-D7jHfs0Y.js → p-DxftXYZp.js} +1 -1
  432. package/dist/ionic/{p-Do3zTvCA.js → p-SEecsUh7.js} +1 -1
  433. package/dist/ionic/p-a4389f13.entry.js +4 -0
  434. package/dist/ionic/p-af11d3c6.entry.js +4 -0
  435. package/dist/ionic/p-af56702e.entry.js +4 -0
  436. package/dist/ionic/{p-561af487.entry.js → p-b3aadfe8.entry.js} +1 -1
  437. package/dist/ionic/p-b5bcbbc1.entry.js +4 -0
  438. package/dist/ionic/p-b9ed3a52.entry.js +4 -0
  439. package/dist/ionic/{p-3bba83ee.entry.js → p-bfdbe24b.entry.js} +1 -1
  440. package/dist/ionic/{p-4712a8a9.entry.js → p-c250b6b0.entry.js} +1 -1
  441. package/dist/ionic/{p-38b9375b.entry.js → p-c293f854.entry.js} +1 -1
  442. package/dist/ionic/p-c81ec0e8.entry.js +4 -0
  443. package/dist/ionic/p-c83dbc12.entry.js +4 -0
  444. package/dist/ionic/p-d0e374f8.entry.js +4 -0
  445. package/dist/ionic/p-d72accc4.entry.js +4 -0
  446. package/dist/ionic/p-d9a3dfd1.entry.js +4 -0
  447. package/dist/ionic/p-e1haAYzm.js +4 -0
  448. package/dist/ionic/p-e7ab4def.entry.js +4 -0
  449. package/dist/ionic/{p-d6755739.entry.js → p-eb989dc9.entry.js} +1 -1
  450. package/dist/ionic/p-ec259ac5.entry.js +4 -0
  451. package/dist/ionic/{p-DYUjHcuH.js → p-nCAPr1Ah.js} +1 -1
  452. package/dist/types/components/button/button.d.ts +3 -12
  453. package/dist/types/components/card/card.d.ts +3 -1
  454. package/dist/types/components/content/content.d.ts +28 -3
  455. package/dist/types/components/datetime/datetime.d.ts +5 -10
  456. package/dist/types/components/input/input.d.ts +1 -0
  457. package/dist/types/components/input-otp/input-otp.d.ts +7 -0
  458. package/dist/types/components/item/item.d.ts +1 -1
  459. package/dist/types/components/modal/modal.d.ts +9 -1
  460. package/dist/types/components/modal/safe-area-utils.d.ts +28 -14
  461. package/dist/types/components/modal/utils.d.ts +4 -0
  462. package/dist/types/components/popover/utils.d.ts +16 -3
  463. package/dist/types/components/select/select.d.ts +11 -0
  464. package/dist/types/components/textarea/textarea.d.ts +1 -0
  465. package/dist/types/components.d.ts +1 -1
  466. package/dist/types/index.d.ts +1 -1
  467. package/dist/types/stencil-public-runtime.d.ts +61 -55
  468. package/dist/types/utils/attribute-controller.d.ts +56 -0
  469. package/dist/types/utils/config.d.ts +4 -1
  470. package/dist/types/utils/forms/click-controller.d.ts +36 -0
  471. package/dist/types/utils/forms/index.d.ts +1 -0
  472. package/dist/types/utils/hardware-back-button.d.ts +11 -0
  473. package/dist/types/utils/helpers.d.ts +27 -2
  474. package/dist/types/utils/logging/index.d.ts +4 -0
  475. package/dist/types/utils/overlays.d.ts +20 -2
  476. package/hydrate/index.js +1249 -484
  477. package/hydrate/index.mjs +1249 -484
  478. package/package.json +3 -3
  479. package/components/p-1sJ0ZDPe.js +0 -4
  480. package/components/p-B1_TL6RQ.js +0 -4
  481. package/components/p-BT9-hMMz.js +0 -4
  482. package/components/p-BU8a2IhR.js +0 -4
  483. package/components/p-BW_SlU2D.js +0 -4
  484. package/components/p-BWoa-cki.js +0 -4
  485. package/components/p-BgkOsq-d.js +0 -4
  486. package/components/p-Bi-it1EH.js +0 -4
  487. package/components/p-C09TXohi.js +0 -4
  488. package/components/p-CG_zZq_I.js +0 -4
  489. package/components/p-CMRYD_yR.js +0 -4
  490. package/components/p-CNLioZ3B.js +0 -4
  491. package/components/p-CWAks_S_.js +0 -4
  492. package/components/p-Cd1WaN-0.js +0 -4
  493. package/components/p-CrAKlX71.js +0 -4
  494. package/components/p-Ctop2IWW.js +0 -4
  495. package/components/p-Cw6WocLJ.js +0 -4
  496. package/components/p-DFLJvuRK.js +0 -4
  497. package/components/p-DZRZic9C.js +0 -4
  498. package/components/p-DhNuxvJH.js +0 -4
  499. package/components/p-Djmz-ssp.js +0 -4
  500. package/components/p-DnBNYc7u.js +0 -4
  501. package/components/p-DwSXbQSz.js +0 -4
  502. package/components/p-M34T2gyX.js +0 -4
  503. package/components/p-YjMkHuvH.js +0 -4
  504. package/dist/cjs/hardware-back-button-Bu4Dzw8l.js +0 -121
  505. package/dist/cjs/index-DkNv4J_i.js +0 -10
  506. package/dist/esm/hardware-back-button-DmkiRgOT.js +0 -115
  507. package/dist/esm/index-ZjP4CjeZ.js +0 -7
  508. package/dist/ionic/p-0dcb7bb6.entry.js +0 -4
  509. package/dist/ionic/p-1347880c.entry.js +0 -4
  510. package/dist/ionic/p-1f24cb24.entry.js +0 -4
  511. package/dist/ionic/p-2ea4bb36.entry.js +0 -4
  512. package/dist/ionic/p-338a02e0.entry.js +0 -4
  513. package/dist/ionic/p-3e01c744.entry.js +0 -4
  514. package/dist/ionic/p-458715a9.entry.js +0 -4
  515. package/dist/ionic/p-4c3e50f8.entry.js +0 -4
  516. package/dist/ionic/p-5906ea6f.entry.js +0 -4
  517. package/dist/ionic/p-5cc09b40.entry.js +0 -4
  518. package/dist/ionic/p-612ea3b1.entry.js +0 -4
  519. package/dist/ionic/p-68cc89a6.entry.js +0 -4
  520. package/dist/ionic/p-77c96e08.entry.js +0 -4
  521. package/dist/ionic/p-7bfeccb3.entry.js +0 -4
  522. package/dist/ionic/p-7e394cc3.entry.js +0 -4
  523. package/dist/ionic/p-803059b6.entry.js +0 -4
  524. package/dist/ionic/p-9595e305.entry.js +0 -4
  525. package/dist/ionic/p-9ee9c5b6.entry.js +0 -4
  526. package/dist/ionic/p-BY6BzzPF.js +0 -4
  527. package/dist/ionic/p-BaeKWZ-a.js +0 -4
  528. package/dist/ionic/p-BgOvhHy_.js +0 -4
  529. package/dist/ionic/p-BhamHSw3.js +0 -4
  530. package/dist/ionic/p-BijjLYjT.js +0 -4
  531. package/dist/ionic/p-C23AVPx9.js +0 -6
  532. package/dist/ionic/p-CER8qW8Y.js +0 -4
  533. package/dist/ionic/p-CFuOr1Tu.js +0 -4
  534. package/dist/ionic/p-CIGNaXM1.js +0 -4
  535. package/dist/ionic/p-CMZYmFb4.js +0 -4
  536. package/dist/ionic/p-CkxVYPtX.js +0 -4
  537. package/dist/ionic/p-CmXuiRT6.js +0 -4
  538. package/dist/ionic/p-D5t_-oMk.js +0 -4
  539. package/dist/ionic/p-D6rHcCvc.js +0 -4
  540. package/dist/ionic/p-DLM95R4x.js +0 -4
  541. package/dist/ionic/p-D_gb-kdd.js +0 -4
  542. package/dist/ionic/p-DajLgJ4d.js +0 -4
  543. package/dist/ionic/p-ZjP4CjeZ.js +0 -4
  544. package/dist/ionic/p-a8df96c8.entry.js +0 -4
  545. package/dist/ionic/p-a8ff2489.entry.js +0 -4
  546. package/dist/ionic/p-aff52029.entry.js +0 -4
  547. package/dist/ionic/p-b3532b8d.entry.js +0 -4
  548. package/dist/ionic/p-cc4320d3.entry.js +0 -4
  549. package/dist/ionic/p-d526798a.entry.js +0 -4
  550. package/dist/ionic/p-ec00fd0d.entry.js +0 -4
  551. package/dist/ionic/p-f83b3e0c.entry.js +0 -4
  552. package/dist/ionic/p-fa50d493.entry.js +0 -4
  553. package/dist/ionic/p-zWf7R2xV.js +0 -4
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { Build, Host, forceUpdate, h, readTask, } from "@stencil/core";
5
5
  import { componentOnReady, hasLazyBuild, inheritAriaAttributes } from "../../utils/helpers";
6
+ import { getOverlaySizeType } from "../../utils/overlays";
6
7
  import { isPlatform } from "../../utils/platform";
7
8
  import { isRTL } from "../../utils/rtl/index";
8
9
  import { createColorClasses, hostContext } from "../../utils/theme";
@@ -47,6 +48,10 @@ export class Content {
47
48
  data: undefined,
48
49
  isScrolling: true,
49
50
  };
51
+ /**
52
+ * Whether the host is sized to its content.
53
+ */
54
+ this.sizeToContent = false;
50
55
  /**
51
56
  * If `true`, the content will scroll behind the headers
52
57
  * and footers. This effect can easily be seen by setting the toolbar
@@ -80,6 +85,7 @@ export class Content {
80
85
  }
81
86
  componentWillLoad() {
82
87
  this.inheritedAttributes = inheritAriaAttributes(this.el);
88
+ this.sizeToContent = this.readSizeToContent();
83
89
  }
84
90
  connectedCallback() {
85
91
  this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
@@ -119,6 +125,7 @@ export class Content {
119
125
  }
120
126
  // Re-observe on reattach, since componentDidLoad only fires once.
121
127
  this.setupFullscreenResizeObserver();
128
+ this.updateSizeToContent();
122
129
  }
123
130
  componentDidLoad() {
124
131
  // The custom elements build assigns fullscreen after connectedCallback.
@@ -175,6 +182,16 @@ export class Content {
175
182
  });
176
183
  this.fullscreenResizeObserver.observe(this.el);
177
184
  }
185
+ /**
186
+ * Picks up an overlay that is no longer sized the way the last render
187
+ * assumed, re-rendering only when the answer changes. Read in a `readTask`
188
+ * because resolving the custom property forces a style recalculation.
189
+ */
190
+ updateSizeToContent() {
191
+ readTask(() => {
192
+ this.sizeToContent = this.readSizeToContent();
193
+ });
194
+ }
178
195
  destroyFullscreenResizeObserver() {
179
196
  if (this.fullscreenResizeObserver !== undefined) {
180
197
  this.fullscreenResizeObserver.disconnect();
@@ -221,6 +238,30 @@ export class Content {
221
238
  const mode = getIonMode(this);
222
239
  return forceOverscroll === undefined ? mode === 'ios' && isPlatform('ios') : forceOverscroll;
223
240
  }
241
+ /**
242
+ * Reads whether to size the component to its content height. Forces a style
243
+ * recalculation, so it belongs in a read task or before the first render.
244
+ *
245
+ * This applies inside popovers and modals with a content-based `--height`,
246
+ * where the overlay does not provide the content with a definite height
247
+ * to fill.
248
+ *
249
+ * Only `--height` is consulted. Styling the wrapper directly, such as
250
+ * `ion-modal::part(content) { height: fit-content; }`, does not change
251
+ * `--height` and therefore cannot be observed. `--height` is the only
252
+ * supported way to opt into content-based sizing.
253
+ */
254
+ readSizeToContent() {
255
+ if (hostContext('ion-popover', this.el)) {
256
+ return true;
257
+ }
258
+ const modal = this.el.closest('ion-modal');
259
+ if (modal === null) {
260
+ return false;
261
+ }
262
+ const height = getComputedStyle(modal).getPropertyValue('--height');
263
+ return getOverlaySizeType(height) === 'content';
264
+ }
224
265
  resize() {
225
266
  /**
226
267
  * Only force update if the component is rendered in a browser context.
@@ -231,6 +272,12 @@ export class Content {
231
272
  * TODO: Remove if STENCIL-834 determines Stencil will account for this.
232
273
  */
233
274
  if (Build.isBrowser) {
275
+ /**
276
+ * A window resize can cross a media query that changes the modal's
277
+ * `--height`. The content's own offsets are unchanged, so neither branch
278
+ * below re-renders and the class from the last render would go stale.
279
+ */
280
+ this.updateSizeToContent();
234
281
  if (this.fullscreen) {
235
282
  readTask(() => this.readDimensions());
236
283
  }
@@ -241,13 +288,15 @@ export class Content {
241
288
  }
242
289
  }
243
290
  /**
244
- * Recalculate content dimensions. Called by overlays (e.g., popover) when
245
- * sibling elements like headers or footers have finished rendering and their
246
- * heights are available, ensuring accurate offset-top calculations.
291
+ * Recalculates the content dimensions and whether it should size itself to
292
+ * its content. Called by overlays when something they own changes, such as
293
+ * a header finishing its render or `--height` being updated.
294
+ *
247
295
  * @internal
248
296
  */
249
297
  async recalculateDimensions() {
250
298
  readTask(() => this.readDimensions());
299
+ this.updateSizeToContent();
251
300
  }
252
301
  readDimensions() {
253
302
  const page = getPageElement(this.el);
@@ -418,21 +467,21 @@ export class Content {
418
467
  const forceOverscroll = this.shouldForceOverscroll();
419
468
  const transitionShadow = mode === 'ios';
420
469
  this.resize();
421
- return (h(Host, { key: '9551c759df407b10d809171641fc6e8f14d92219', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
470
+ return (h(Host, { key: 'e1013621096729354ef92915af52dd823e69fdff', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
422
471
  [mode]: true,
423
472
  'content-fullscreen': this.fullscreen,
424
- 'content-sizing': hostContext('ion-popover', this.el),
473
+ 'content-sizing': this.sizeToContent,
425
474
  overscroll: forceOverscroll,
426
475
  [`content-${rtl}`]: true,
427
476
  }), style: {
428
477
  '--offset-top': `${this.cTop}px`,
429
478
  '--offset-bottom': `${this.cBottom}px`,
430
- }, ...inheritedAttributes }, h("div", { key: 'c6de8fd226f0d10a534eb107fe032ac155fbe68e', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '082fc2936061360060b48221ecb1c864a3711fa0', class: {
479
+ }, ...inheritedAttributes }, h("div", { key: '3d8649b164d6324beaa1bc50e1d204ad06c2ec1a', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: 'dd2d3bed8690b4f5027a43f5ec60e7e7df18106d', class: {
431
480
  'inner-scroll': true,
432
481
  'scroll-x': scrollX,
433
482
  'scroll-y': scrollY,
434
483
  overscroll: (scrollX || scrollY) && forceOverscroll,
435
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '0d2286206facb22696a9ca7e74a3f6b7d2397aab' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
484
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: 'dc3d4584d9e9afd43699525a619b8e873078fbbf' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
436
485
  }
437
486
  static get is() { return "ion-content"; }
438
487
  static get encapsulation() { return "shadow"; }
@@ -595,6 +644,11 @@ export class Content {
595
644
  }
596
645
  };
597
646
  }
647
+ static get states() {
648
+ return {
649
+ "sizeToContent": {}
650
+ };
651
+ }
598
652
  static get events() {
599
653
  return [{
600
654
  "method": "ionScrollStart",
@@ -679,7 +733,7 @@ export class Content {
679
733
  "return": "Promise<void>"
680
734
  },
681
735
  "docs": {
682
- "text": "Recalculate content dimensions. Called by overlays (e.g., popover) when\nsibling elements like headers or footers have finished rendering and their\nheights are available, ensuring accurate offset-top calculations.",
736
+ "text": "Recalculates the content dimensions and whether it should size itself to\nits content. Called by overlays when something they own changes, such as\na header finishing its render or `--height` being updated.",
683
737
  "tags": [{
684
738
  "name": "internal",
685
739
  "text": undefined
@@ -56,16 +56,6 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./ut
56
56
  export class Datetime {
57
57
  constructor() {
58
58
  this.inputId = `ion-dt-${datetimeIds++}`;
59
- /**
60
- * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
61
- * synthetic "not intersecting" entry IntersectionObserver fires on
62
- * `observe()` when the host mounts offscreen.
63
- *
64
- * Don't reset this in `disconnectedCallback`. Overlays disconnect and
65
- * reconnect the host without re-creating the observers, so a reset there
66
- * makes `hiddenCallback` miss the dismissal.
67
- */
68
- this.hasBeenIntersecting = false;
69
59
  this.prevPresentation = null;
70
60
  this.showMonthAndYear = false;
71
61
  this.activeParts = [];
@@ -627,12 +617,19 @@ export class Datetime {
627
617
  if (this.el.classList.contains('datetime-ready')) {
628
618
  return;
629
619
  }
630
- const rect = this.el.getBoundingClientRect();
631
- if (rect.width === 0 || rect.height === 0) {
620
+ if (!this.hasLayoutBox()) {
632
621
  return;
633
622
  }
634
623
  this.markReady();
635
624
  };
625
+ /**
626
+ * Whether the datetime is on screen. A modal or popover hides its contents
627
+ * with `display: none`, which leaves the host without a layout box.
628
+ */
629
+ this.hasLayoutBox = () => {
630
+ const { width, height } = this.el.getBoundingClientRect();
631
+ return width > 0 && height > 0;
632
+ };
636
633
  this.markReady = () => {
637
634
  if (this.el.classList.contains('datetime-ready')) {
638
635
  return;
@@ -965,11 +962,14 @@ export class Datetime {
965
962
  * areas will not have the correct values snapped into place.
966
963
  */
967
964
  const visibleCallback = (entries) => {
968
- const ev = entries[0];
965
+ /**
966
+ * The browser can batch several observations into one callback, so
967
+ * only the last entry describes the datetime now.
968
+ */
969
+ const ev = entries[entries.length - 1];
969
970
  if (!ev.isIntersecting) {
970
971
  return;
971
972
  }
972
- this.hasBeenIntersecting = true;
973
973
  this.markReady();
974
974
  };
975
975
  const visibleIO = new IntersectionObserver(visibleCallback, { threshold: 0.01, root: el });
@@ -1002,15 +1002,22 @@ export class Datetime {
1002
1002
  * we did originally has been lost.
1003
1003
  */
1004
1004
  const hiddenCallback = (entries) => {
1005
- const ev = entries[0];
1005
+ const ev = entries[entries.length - 1];
1006
1006
  if (ev.isIntersecting) {
1007
1007
  return;
1008
1008
  }
1009
- // Ignore the initial "not intersecting" entry IntersectionObserver fires on observe().
1010
- if (!this.hasBeenIntersecting) {
1009
+ /**
1010
+ * WebKit reports a datetime that is still on screen as not
1011
+ * intersecting, and it doesn't deliver that entry to every observer on
1012
+ * the same root and target, so `visibleCallback` may never hear about
1013
+ * it and add `datetime-ready` back. That is what left the calendar
1014
+ * blank in #30933. Checking the host instead of trusting the entry
1015
+ * also covers the synthetic "not intersecting" entry `observe()` fires
1016
+ * when the datetime mounts offscreen.
1017
+ */
1018
+ if (this.hasLayoutBox()) {
1011
1019
  return;
1012
1020
  }
1013
- this.hasBeenIntersecting = false;
1014
1021
  this.destroyInteractionListeners();
1015
1022
  /**
1016
1023
  * When datetime is hidden, we need to make sure that
@@ -1822,7 +1829,7 @@ export class Datetime {
1822
1829
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1823
1830
  const hasWheelVariant = hasDatePresentation && preferWheel;
1824
1831
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1825
- return (h(Host, { key: '4e0b529a70924b065bcc6191e08550428b5a52a0', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1832
+ return (h(Host, { key: 'a9128b5c55464e30a269daf9d725bf430c8c655c', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1826
1833
  ...createColorClasses(color, {
1827
1834
  [mode]: true,
1828
1835
  ['datetime-readonly']: readonly,
@@ -1834,7 +1841,7 @@ export class Datetime {
1834
1841
  [`datetime-prefer-wheel`]: hasWheelVariant,
1835
1842
  [`datetime-grid`]: isGridStyle,
1836
1843
  }),
1837
- } }, h("div", { key: 'cc9d1b92f960984cb0466d0003a240ace67da243', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1844
+ } }, h("div", { key: 'b49f3a98db2b7cf535d7ea894d518f75f8a1fefb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1838
1845
  }
1839
1846
  static get is() { return "ion-datetime"; }
1840
1847
  static get encapsulation() { return "shadow"; }
@@ -151,6 +151,12 @@
151
151
  position: relative;
152
152
  flex: 1;
153
153
  width: 100%;
154
+ /**
155
+ * The input keeps a minimum width so that the value stays visible
156
+ * when a long label or wide slotted content would otherwise shrink
157
+ * it to nothing.
158
+ */
159
+ min-width: 2ch;
154
160
  max-width: 100%;
155
161
  height: 100%;
156
162
  max-height: 100%;
@@ -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 { createNotchController, createStartContainerController, checkInvalidState } from "../../utils/forms/index";
5
+ import { createClickController, createNotchController, createStartContainerController, 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";
@@ -227,11 +227,7 @@ export class Input {
227
227
  * Instead, the click event from the ion-input is emitted.
228
228
  */
229
229
  onClickCapture(ev) {
230
- const nativeInput = this.nativeInput;
231
- if (nativeInput && ev.target === nativeInput) {
232
- ev.stopPropagation();
233
- this.el.click();
234
- }
230
+ this.clickController?.handleClickCapture(ev);
235
231
  }
236
232
  componentWillLoad() {
237
233
  this.inheritedAttributes = {
@@ -252,6 +248,7 @@ export class Input {
252
248
  return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
253
249
  });
254
250
  this.startContainerController.calculateStartContainerWidth();
251
+ this.clickController = createClickController(el, () => this.nativeInput);
255
252
  // Watch for class changes to update validation state
256
253
  if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
257
254
  this.validationObserver = new MutationObserver(() => {
@@ -527,7 +524,7 @@ export class Input {
527
524
  * the input has a value or is focused.
528
525
  */
529
526
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus));
530
- return (h(Host, { key: '9e9495b8f962372d526343ff76b80fb9700fce19', class: createColorClasses(this.color, {
527
+ return (h(Host, { key: '290cf987de670276bf40b9f19d35d3769d9c0540', class: createColorClasses(this.color, {
531
528
  [mode]: true,
532
529
  'has-value': hasValue,
533
530
  'has-focus': hasFocus,
@@ -538,14 +535,14 @@ export class Input {
538
535
  'in-item': inItem,
539
536
  'in-item-color': hostContext('ion-item.ion-color', this.el),
540
537
  'input-disabled': disabled,
541
- }) }, h("label", { key: '7121f34ed782caf7a7b82703b94fc9d6c78ce5ba', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '0c1f8526d86c8a2433c23873fa64b1edc0eafe29', class: "input-start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: 'a50323fde0fb12997c2324eded132908680ea450', name: "start" })), h("div", { key: '626360c4e115a5286baab49680b2a02cd39614c8', class: "input-control" }, this.renderLabel(), h("div", { key: '1cefd9d8cd6ed96fab7b58237f8f8b0c5e1be92e', class: "native-wrapper", onClick: this.onLabelClick }, h("input", { key: '3dee5302f3a685a848fedd7e1face5095e3ac64b', 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: '39fff82e00e63963fe5f17794900ace2a3faa208', class: "input-end" }, this.clearInput && !readonly && !disabled && (h("button", { key: '1fa86fdb5baf4a7cd531ee0fe767a42b44fb33fc', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
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) => {
542
539
  /**
543
540
  * This prevents mobile browsers from
544
541
  * blurring the input when the clear
545
542
  * button is activated.
546
543
  */
547
544
  ev.preventDefault();
548
- }, onClick: this.clearTextInput }, h("ion-icon", { key: 'ced39304f97e56870f7480afa025ffe232010cfb', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: 'f4098769eef1cc5aa2074c369f757ccb94a98e1c', name: "end" })), shouldRenderHighlight && h("div", { key: '258fe6ff8f9f57836f2a3a0b6163bd2b7dbf0699', class: "input-highlight" })), this.renderBottomContent()));
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()));
549
546
  }
550
547
  static get is() { return "ion-input"; }
551
548
  static get encapsulation() { return "scoped"; }
@@ -151,6 +151,12 @@
151
151
  position: relative;
152
152
  flex: 1;
153
153
  width: 100%;
154
+ /**
155
+ * The input keeps a minimum width so that the value stays visible
156
+ * when a long label or wide slotted content would otherwise shrink
157
+ * it to nothing.
158
+ */
159
+ min-width: 2ch;
154
160
  max-width: 100%;
155
161
  height: 100%;
156
162
  max-height: 100%;
@@ -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"
@@ -2,7 +2,8 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Build, Host, forceUpdate, h } from "@stencil/core";
5
- import { inheritAttributes, raf } from "../../utils/helpers";
5
+ import { createAttributeController } from "../../utils/attribute-controller";
6
+ import { raf } from "../../utils/helpers";
6
7
  import { createColorClasses, hostContext, openURL } from "../../utils/theme";
7
8
  import { chevronForward } from "ionicons/icons";
8
9
  import { getIonMode } from "../../global/ionic-global";
@@ -23,7 +24,6 @@ export class Item {
23
24
  constructor() {
24
25
  this.labelColorStyles = {};
25
26
  this.itemStyles = new Map();
26
- this.inheritedAriaAttributes = {};
27
27
  this.didLoad = false;
28
28
  this.multipleInputs = false;
29
29
  this.focusable = true;
@@ -104,9 +104,16 @@ export class Item {
104
104
  this.watchForIndicatorControls();
105
105
  this.updateInteractivityOnSlotChange();
106
106
  }
107
+ this.ariaController?.init();
107
108
  }
108
109
  componentWillLoad() {
109
- this.inheritedAriaAttributes = inheritAttributes(this.el, ['aria-label']);
110
+ /**
111
+ * Only the initial copy takes the attribute off the host, so an `aria-label` written
112
+ * after load names both the native element and the Host, which is a `listitem` when
113
+ * the item is in an `ion-list`. The two names always agree, so a screen reader just
114
+ * reads it twice.
115
+ */
116
+ this.ariaController = createAttributeController(this.el, ['aria-label'], () => forceUpdate(this));
110
117
  }
111
118
  componentDidLoad() {
112
119
  raf(() => {
@@ -123,6 +130,7 @@ export class Item {
123
130
  this.indicatorControlObserver.disconnect();
124
131
  this.indicatorControlObserver = undefined;
125
132
  }
133
+ this.ariaController?.destroy();
126
134
  }
127
135
  totalNestedInputs() {
128
136
  // The following elements have a clickable cover that is relative to the entire item
@@ -230,7 +238,8 @@ export class Item {
230
238
  return controls[0];
231
239
  }
232
240
  render() {
233
- const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, inheritedAriaAttributes, multipleInputs, } = this;
241
+ const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, multipleInputs, } = this;
242
+ const inheritedAriaAttributes = this.ariaController?.attributes ?? {};
234
243
  const childStyles = {};
235
244
  const mode = getIonMode(this);
236
245
  const clickable = this.isClickable();
@@ -306,7 +315,7 @@ export class Item {
306
315
  * multi-input item, and in a clickable item, which is a second tab stop.
307
316
  */
308
317
  const slottedIndicatorNeedsRoom = this.hasSlottedIndicatorControl && (multipleInputs || this.isClickable());
309
- return (h(Host, { key: '0dc161ad7ac2fdedc5005015fceb34ed176010a6', "aria-disabled": ariaDisabled, class: {
318
+ return (h(Host, { key: '7fe924642310c19f057ae1bfa29c1acdf5cc7ed6', "aria-disabled": ariaDisabled, class: {
310
319
  ...childStyles,
311
320
  ...labelColorStyles,
312
321
  ...createColorClasses(this.color, {
@@ -323,7 +332,7 @@ export class Item {
323
332
  'ion-focusable': this.focusable,
324
333
  'item-rtl': document.dir === 'rtl',
325
334
  }),
326
- }, role: inList ? 'listitem' : null }, h(TagType, { key: 'd42583cf62133b2553de2e7a5357168640bb1834', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, h("slot", { key: 'bd805ce49946cd52280d1c4b370104ee2472f1e2', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), h("div", { key: '0de589f9c5c13c31b6c8838566a7ad6f78f81028', class: "item-inner", part: "inner" }, h("div", { key: 'faaf6a39e072fb352753c645736ab1f47c2d7d25', class: "input-wrapper", part: "container" }, h("slot", { key: '70a34c31de29a0786a14b4a7d3156ba8d4d92eb4', onSlotchange: this.updateInteractivityOnSlotChange })), h("slot", { key: 'c8e764b62c5c30f67750896741ca266b741d5999', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (h("ion-icon", { key: 'af006856d8c4ed69174534261344215957cc751a', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && h("ion-ripple-effect", { key: 'e5e151bafedd38feb8f71a387a0059aa1e9e90de' }))));
335
+ }, role: inList ? 'listitem' : null }, h(TagType, { key: '8fddfb2a076b4b98e45ee8b23579d011dba12acb', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, h("slot", { key: '7f888b62b2023cf501fd308e32629e7a291c2d05', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), h("div", { key: '6d5cdde307caa65b131edb65cb0a5f8294cf151c', class: "item-inner", part: "inner" }, h("div", { key: '9fbfffdff4cf51adf1f02d573953cf8b145574b0', class: "input-wrapper", part: "container" }, h("slot", { key: '574c7e61cdaa3959a28bad7353105ef217a76ed9', onSlotchange: this.updateInteractivityOnSlotChange })), h("slot", { key: 'ed7e211960cd65ed17f865a6d50d5bdde069416b', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (h("ion-icon", { key: '2847bb21f42e9d5ab8ea86262b2bc1c3b3f7c902', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && h("ion-ripple-effect", { key: '55502ef394db0953144387fa3baebf9fa6a976a9' }))));
327
336
  }
328
337
  static get is() { return "ion-item"; }
329
338
  static get encapsulation() { return "shadow"; }
@@ -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"; }
@@ -77,7 +77,12 @@
77
77
  --max-width: auto;
78
78
  --height: 100%;
79
79
  --min-height: auto;
80
- --max-height: auto;
80
+ /**
81
+ * Clamps a content-sized `--height` (auto, fit-content, ...) to the
82
+ * overlay, giving the wrapper's flex children something to shrink
83
+ * toward so `ion-content` scrolls instead of overflowing.
84
+ */
85
+ --max-height: 100%;
81
86
  --overflow: hidden;
82
87
  --border-radius: 0;
83
88
  --border-width: 0;
@@ -129,8 +134,14 @@ ion-backdrop {
129
134
  /**
130
135
  * The wrapper receives programmatic focus for screen readers but should not
131
136
  * show a visible focus ring, which is meant only for keyboard navigation.
137
+ *
138
+ * A flex layout is required for the wrapper to size itself to its content
139
+ * when the modal is content-sized (`--height` is auto, fit-content, ...).
140
+ * This makes it so that the content can scroll when it overflows the wrapper.
132
141
  */
133
142
  .modal-wrapper {
143
+ display: flex;
144
+ flex-direction: column;
134
145
  outline: none;
135
146
  }
136
147