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
@@ -21,8 +21,8 @@ import { mdEnterAnimation } from "./animations/md.enter";
21
21
  import { mdLeaveAnimation } from "./animations/md.leave";
22
22
  import { createSheetGesture } from "./gestures/sheet";
23
23
  import { createSwipeToCloseGesture, SwipeToCloseDefaults } from "./gestures/swipe-to-close";
24
- import { getInitialSafeAreaConfig, getPositionBasedSafeAreaConfig, applySafeAreaOverrides, clearSafeAreaOverrides, getRootSafeAreaTop, onRootSafeAreaTopChange, hasCustomModalDimensions, } from "./safe-area-utils";
25
- import { setCardStatusBarDark, setCardStatusBarDefault } from "./utils";
24
+ import { getInitialSafeAreaConfig, getPositionBasedSafeAreaConfig, applySafeAreaOverrides, clearSafeAreaOverrides, getRootSafeAreaTop, onRootSafeAreaTopChange, getModalCoveredAxes, } from "./safe-area-utils";
25
+ import { onModalHeightChange, setCardStatusBarDark, setCardStatusBarDefault } from "./utils";
26
26
  // TODO(FW-2832): types
27
27
  /**
28
28
  * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
@@ -1053,7 +1053,7 @@ export class Modal {
1053
1053
  /**
1054
1054
  * Creates the context object for safe-area utilities.
1055
1055
  *
1056
- * `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
1056
+ * `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
1057
1057
  * because it is only read by `getInitialSafeAreaConfig()`. Other callers
1058
1058
  * (resize handler, post-animation update, fullscreen-padding apply) would
1059
1059
  * pay a `getComputedStyle()` cost for a value they never consult.
@@ -1067,6 +1067,26 @@ export class Modal {
1067
1067
  currentBreakpoint: this.currentBreakpoint,
1068
1068
  };
1069
1069
  }
1070
+ /**
1071
+ * Keeps the content's sizing in sync with `--height`. The content reads the
1072
+ * property to determine whether it should size itself to its content, and
1073
+ * changes to `--height` on an ancestor or the root can change that behavior
1074
+ * without changing the modal itself.
1075
+ */
1076
+ watchHeightForContent() {
1077
+ /**
1078
+ * A sheet's height comes from its breakpoints, so its content never sizes
1079
+ * itself to `--height`. Watching it would cause the drag to recalculate on
1080
+ * every frame.
1081
+ */
1082
+ if (this.isSheetModal) {
1083
+ return;
1084
+ }
1085
+ this.unsubscribeHeightChange?.();
1086
+ this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
1087
+ this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
1088
+ });
1089
+ }
1070
1090
  /**
1071
1091
  * Sets initial safe-area overrides before modal animation.
1072
1092
  * Called in present() before animation starts.
@@ -1080,10 +1100,11 @@ export class Modal {
1080
1100
  setInitialSafeAreaOverrides() {
1081
1101
  const context = {
1082
1102
  ...this.getSafeAreaContext(),
1083
- hasCustomDimensions: hasCustomModalDimensions(this.el),
1103
+ coveredAxes: getModalCoveredAxes(this.el),
1084
1104
  };
1085
1105
  const safeAreaConfig = getInitialSafeAreaConfig(context);
1086
1106
  applySafeAreaOverrides(this.el, safeAreaConfig);
1107
+ this.watchHeightForContent();
1087
1108
  // Set the internal offset property with the resolved root safe-area-top value
1088
1109
  if (context.isSheetModal) {
1089
1110
  this.updateSheetOffsetTop();
@@ -1203,6 +1224,8 @@ export class Modal {
1203
1224
  clearSafeAreaOverrides(this.el);
1204
1225
  this.unsubscribeRootSafeAreaTop?.();
1205
1226
  this.unsubscribeRootSafeAreaTop = undefined;
1227
+ this.unsubscribeHeightChange?.();
1228
+ this.unsubscribeHeightChange = undefined;
1206
1229
  // Remove internal sheet offset property
1207
1230
  this.el.style.removeProperty('--ion-modal-offset-top');
1208
1231
  const { contentEl } = this.findContentAndFooter();
@@ -1240,7 +1263,7 @@ export class Modal {
1240
1263
  const isCardModal = presentingElement !== undefined && mode === 'ios';
1241
1264
  const isHandleCycle = handleBehavior === 'cycle';
1242
1265
  const isSheetModalWithHandle = isSheetModal && showHandle;
1243
- return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
1266
+ return (h(Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
1244
1267
  // Allow the modal to be navigable when the handle is focusable
1245
1268
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
1246
1269
  zIndex: `${20000 + this.overlayIndex}`,
@@ -1253,7 +1276,7 @@ export class Modal {
1253
1276
  'overlay-hidden': true,
1254
1277
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
1255
1278
  ...getClassMap(this.cssClass),
1256
- }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
1279
+ }, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '9dab1ef4771c0d847ba2be8672afbaa2748517f3', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '64af7ed1c5f552b61fc4b9387b926acc76c8a99a', class: "modal-shadow" }), h("div", { key: '7e76d77d5b2e8f0467bb793facf5aa86f8d01bbe',
1257
1280
  /*
1258
1281
  role and aria-modal must be used on the
1259
1282
  same element. They must also be set inside the
@@ -1266,9 +1289,9 @@ export class Modal {
1266
1289
  without the tabindex focus() would be a no-op and screen readers
1267
1290
  may not properly announce the dialog and its content when it opens.
1268
1291
  */
1269
- role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
1292
+ role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: '5efc0bb0a59adcc594ac48da9fd90e57908a7ffb', class: "modal-handle",
1270
1293
  // Prevents the handle from receiving keyboard focus when it does not cycle
1271
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
1294
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '6175fcd0b39c086b4e9eb9e96c4d631c2a86774b', onSlotchange: this.onSlotChange }))));
1272
1295
  }
1273
1296
  static get is() { return "ion-modal"; }
1274
1297
  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
 
@@ -2,41 +2,14 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { win } from "../../utils/browser/index";
5
- import { raf } from "../../utils/helpers";
6
- /**
7
- * These thresholds match the SCSS media query breakpoints in modal.vars.scss
8
- * that trigger the centered dialog layout (non-fullscreen modal).
9
- *
10
- * SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
11
- * and $modal-inset-min-height-large (768px). We use the smaller one because
12
- * that's the threshold where the modal transitions from fullscreen to centered
13
- * dialog — the larger breakpoint only increases the dialog's height.
14
- */
15
- const MODAL_INSET_MIN_WIDTH = 768;
16
- const MODAL_INSET_MIN_HEIGHT = 600;
5
+ import { onCustomPropertyChange, raf } from "../../utils/helpers";
6
+ import { getOverlaySizeType } from "../../utils/overlays";
17
7
  const EDGE_THRESHOLD = 5;
18
- /**
19
- * CSS values for `--width` / `--height` that are treated as fullscreen
20
- * (modal touches the corresponding screen edges). Empty string means the
21
- * property was not overridden. See `hasCustomModalDimensions()`.
22
- */
23
- const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
24
8
  /**
25
9
  * Cache for resolved root safe-area-top value, invalidated once per frame.
26
10
  */
27
11
  let cachedRootSafeAreaTop = null;
28
12
  let cacheInvalidationScheduled = false;
29
- /**
30
- * Determines if the current viewport meets the CSS media query conditions
31
- * that cause regular modals to render as centered dialogs instead of fullscreen.
32
- * Matches: @media (min-width: 768px) and (min-height: 600px)
33
- */
34
- const isCenteredDialogViewport = () => {
35
- if (!win)
36
- return false;
37
- return win.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
38
- .matches;
39
- };
40
13
  /**
41
14
  * Resolves the current root --ion-safe-area-top value to pixels.
42
15
  * Uses a temporary element because getComputedStyle on :root returns
@@ -70,55 +43,64 @@ export const getRootSafeAreaTop = () => {
70
43
  return value;
71
44
  };
72
45
  /**
73
- * Calls back when the resolved root `--ion-safe-area-top` changes, which no
74
- * event and no window resize covers. The probe's height tracks the variable, so
75
- * a change to it becomes a size change the observer can see.
46
+ * Calls back when the resolved root `--ion-safe-area-top` changes. The value
47
+ * the caller already applied is passed as the baseline, so a change between
48
+ * that read and the observer starting is still reported.
76
49
  */
77
50
  export const onRootSafeAreaTopChange = (callback) => {
78
- const doc = win?.document;
79
- if (!doc?.body || typeof ResizeObserver === 'undefined') {
80
- return () => undefined;
81
- }
82
- const probe = doc.createElement('div');
83
- probe.style.cssText =
84
- 'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
85
- 'height:var(--ion-safe-area-top,0px);';
86
- doc.body.appendChild(probe);
87
- /**
88
- * Seeded with the value the caller has already applied, so a change that
89
- * lands before the observer's first delivery still gets reported. Comparing
90
- * against an unset value instead would consume that first delivery and treat
91
- * the new inset as the baseline.
92
- */
93
- let lastHeight = getRootSafeAreaTop();
94
- const observer = new ResizeObserver((entries) => {
95
- const { height } = entries[0].contentRect;
96
- if (height !== lastHeight) {
97
- lastHeight = height;
98
- callback(height);
99
- }
100
- });
101
- observer.observe(probe);
102
- return () => {
103
- observer.disconnect();
104
- probe.remove();
105
- };
51
+ return onCustomPropertyChange(win?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
106
52
  };
107
53
  /**
108
- * True when the modal host declares BOTH a non-fullscreen `--width` AND a
109
- * non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
110
- * touch any screen edge).
54
+ * Determines which viewport axes the modal spans so safe-area requirements
55
+ * can be predicted independently for each axis.
111
56
  *
112
- * The conservative "both axes" check avoids mis-zeroing safe-area for
113
- * partial-custom modals where the modal still touches top/bottom edges
114
- * (e.g. only `--width` overridden). Partial cases fall through to the
115
- * existing position-based post-animation correction.
57
+ * A modal that spans an axis reaches both edges on that axis and needs the
58
+ * corresponding safe-area insets. A modal that does not span an axis reaches
59
+ * neither edge on that axis.
60
+ *
61
+ * When both `--width` and `--height` are `fullscreen`, coverage can be
62
+ * determined directly. Otherwise, coverage is based on the rendered wrapper,
63
+ * including cases where content sizing or `--max-height` causes the modal
64
+ * to reach the viewport.
116
65
  */
117
- export const hasCustomModalDimensions = (hostEl) => {
66
+ export const getModalCoveredAxes = (hostEl) => {
118
67
  const styles = getComputedStyle(hostEl);
119
- const width = styles.getPropertyValue('--width').trim();
120
- const height = styles.getPropertyValue('--height').trim();
121
- return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
68
+ const width = getOverlaySizeType(styles.getPropertyValue('--width'));
69
+ const height = getOverlaySizeType(styles.getPropertyValue('--height'));
70
+ if (width === 'fullscreen' && height === 'fullscreen') {
71
+ return { vertical: true, horizontal: true };
72
+ }
73
+ return measureCoveredAxes(hostEl);
74
+ };
75
+ /**
76
+ * Measures the modal wrapper to determine whether it spans the viewport
77
+ * on each axis.
78
+ *
79
+ * The wrapper has no box while the modal is hidden, so `overlay-hidden`
80
+ * is temporarily removed to allow the wrapper to be measured. The class
81
+ * is restored in the same task before the browser can paint.
82
+ *
83
+ * Only the wrapper's size is measured. Its position is affected by the
84
+ * enter animation, which initially translates it by its own height, while
85
+ * the translation does not affect its measured size.
86
+ */
87
+ const measureCoveredAxes = (hostEl) => {
88
+ const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
89
+ if (wrapperEl == null || win === undefined) {
90
+ return { vertical: false, horizontal: false };
91
+ }
92
+ const wasHidden = hostEl.classList.contains('overlay-hidden');
93
+ if (wasHidden) {
94
+ hostEl.classList.remove('overlay-hidden');
95
+ }
96
+ const { width, height } = wrapperEl.getBoundingClientRect();
97
+ if (wasHidden) {
98
+ hostEl.classList.add('overlay-hidden');
99
+ }
100
+ return {
101
+ vertical: height >= win.innerHeight - EDGE_THRESHOLD,
102
+ horizontal: width >= win.innerWidth - EDGE_THRESHOLD,
103
+ };
122
104
  };
123
105
  /**
124
106
  * Returns the initial safe-area configuration based on modal type.
@@ -152,26 +134,23 @@ export const getInitialSafeAreaConfig = (context) => {
152
134
  right: '0px',
153
135
  };
154
136
  }
155
- // On viewports that meet the centered dialog media query breakpoints,
156
- // regular modals render as centered dialogs (not fullscreen), so they
157
- // don't touch any screen edges and don't need safe-area insets. Also
158
- // applies to phone viewports when the modal declares custom --width and
159
- // --height; these don't touch screen edges either, so the initial
160
- // prediction must be zero to avoid a post-animation correction flash.
161
- if (isCenteredDialogViewport() || context.hasCustomDimensions) {
162
- return {
163
- top: '0px',
164
- bottom: '0px',
165
- left: '0px',
166
- right: '0px',
167
- };
168
- }
169
- // Fullscreen modals on phone - inherit all safe areas
137
+ /**
138
+ * Each axis is evaluated independently because a modal can span one axis
139
+ * without spanning the other. This allows the initial safe-area configuration
140
+ * to match the modal's expected dimensions and avoids correcting an incorrect
141
+ * pair of insets after presentation.
142
+ *
143
+ * A modal can span the horizontal axis while remaining inset vertically, or
144
+ * span the vertical axis while remaining inset horizontally. Wide viewports
145
+ * can also render regular modals as centered dialogs, while content-sized
146
+ * modals may still be clamped to the viewport.
147
+ */
148
+ const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
170
149
  return {
171
- top: 'inherit',
172
- bottom: 'inherit',
173
- left: 'inherit',
174
- right: 'inherit',
150
+ top: vertical ? 'inherit' : '0px',
151
+ bottom: vertical ? 'inherit' : '0px',
152
+ left: horizontal ? 'inherit' : '0px',
153
+ right: horizontal ? 'inherit' : '0px',
175
154
  };
176
155
  };
177
156
  /**
@@ -2,6 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { win } from "../../utils/browser/index";
5
+ import { onCustomPropertyChange } from "../../utils/helpers";
5
6
  import { StatusBar, Style } from "../../utils/native/status-bar";
6
7
  /**
7
8
  * Use y = mx + b to
@@ -78,3 +79,9 @@ export const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
78
79
  }
79
80
  StatusBar.setStyle({ style: defaultStyle });
80
81
  };
82
+ /**
83
+ * Calls back when the modal's resolved `--height` changes.
84
+ */
85
+ export const onModalHeightChange = (hostEl, callback) => {
86
+ return onCustomPropertyChange(hostEl, '--height', () => callback());
87
+ };
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { createAnimation } from "../../../utils/animation/animation";
5
5
  import { getElementRoot } from "../../../utils/helpers";
6
- import { calculateWindowAdjustment, getArrowDimensions, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets, shouldShowArrow, } from "../utils";
6
+ import { calculateWindowAdjustment, getArrowDimensions, getElementCSSZoom, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets, shouldShowArrow, } from "../utils";
7
7
  const POPOVER_IOS_BODY_PADDING = 5;
8
8
  /**
9
9
  * Minimum edge margin for iOS popovers ensures visual spacing from screen
@@ -22,21 +22,35 @@ export const iosEnterAnimation = (baseEl, opts) => {
22
22
  const { event: ev, size, trigger, reference, side, align } = opts;
23
23
  const doc = baseEl.ownerDocument;
24
24
  const isRTL = doc.dir === 'rtl';
25
- const bodyWidth = doc.defaultView.innerWidth;
26
- const bodyHeight = doc.defaultView.innerHeight;
27
25
  const root = getElementRoot(baseEl);
28
26
  const contentEl = root.querySelector('.popover-content');
29
27
  const arrowEl = root.querySelector('.popover-arrow');
28
+ /**
29
+ * A CSS `zoom` other than 1 on an ancestor (e.g. the `html` element) causes
30
+ * geometry APIs like `getBoundingClientRect()` to report zoomed values while
31
+ * inline `top`/`left`/`--width` styles are interpreted in the unzoomed layout
32
+ * space. Normalize all rect-derived measurements by this factor so the
33
+ * popover is positioned and sized correctly.
34
+ */
35
+ const zoom = getElementCSSZoom(contentEl);
36
+ /**
37
+ * `innerWidth`/`innerHeight` are not affected by CSS `zoom`, so they must be
38
+ * scaled down to the same layout space as the normalized measurements above.
39
+ * Otherwise the popover would be clamped against a viewport that is larger
40
+ * than the space actually available to it.
41
+ */
42
+ const bodyWidth = doc.defaultView.innerWidth / zoom;
43
+ const bodyHeight = doc.defaultView.innerHeight / zoom;
30
44
  const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
31
- const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
32
- const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl);
45
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl, zoom);
46
+ const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl, zoom);
33
47
  const defaultPosition = {
34
48
  top: bodyHeight / 2 - contentHeight / 2,
35
49
  left: bodyWidth / 2 - contentWidth / 2,
36
50
  originX: isRTL ? 'right' : 'left',
37
51
  originY: 'top',
38
52
  };
39
- const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev);
53
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev, zoom);
40
54
  const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
41
55
  const rawSafeArea = getSafeAreaInsets(doc);
42
56
  const safeArea = size === 'cover'
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { createAnimation } from "../../../utils/animation/animation";
5
5
  import { getElementRoot } from "../../../utils/helpers";
6
- import { calculateWindowAdjustment, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets } from "../utils";
6
+ import { calculateWindowAdjustment, getElementCSSZoom, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets, } from "../utils";
7
7
  const POPOVER_MD_BODY_PADDING = 12;
8
8
  /**
9
9
  * Md Popover Enter Animation
@@ -13,19 +13,33 @@ export const mdEnterAnimation = (baseEl, opts) => {
13
13
  const { event: ev, size, trigger, reference, side, align } = opts;
14
14
  const doc = baseEl.ownerDocument;
15
15
  const isRTL = doc.dir === 'rtl';
16
- const bodyWidth = doc.defaultView.innerWidth;
17
- const bodyHeight = doc.defaultView.innerHeight;
18
16
  const root = getElementRoot(baseEl);
19
17
  const contentEl = root.querySelector('.popover-content');
18
+ /**
19
+ * A CSS `zoom` other than 1 on an ancestor (e.g. the `html` element) causes
20
+ * geometry APIs like `getBoundingClientRect()` to report zoomed values while
21
+ * inline `top`/`left`/`--width` styles are interpreted in the unzoomed layout
22
+ * space. Normalize all rect-derived measurements by this factor so the
23
+ * popover is positioned and sized correctly.
24
+ */
25
+ const zoom = getElementCSSZoom(contentEl);
26
+ /**
27
+ * `innerWidth`/`innerHeight` are not affected by CSS `zoom`, so they must be
28
+ * scaled down to the same layout space as the normalized measurements above.
29
+ * Otherwise the popover would be clamped against a viewport that is larger
30
+ * than the space actually available to it.
31
+ */
32
+ const bodyWidth = doc.defaultView.innerWidth / zoom;
33
+ const bodyHeight = doc.defaultView.innerHeight / zoom;
20
34
  const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
21
- const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
35
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl, zoom);
22
36
  const defaultPosition = {
23
37
  top: bodyHeight / 2 - contentHeight / 2,
24
38
  left: bodyWidth / 2 - contentWidth / 2,
25
39
  originX: isRTL ? 'right' : 'left',
26
40
  originY: 'top',
27
41
  };
28
- const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
42
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev, zoom);
29
43
  const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
30
44
  // MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas).
31
45
  // This is needed for Android edge-to-edge (API 36+) where system bars overlap content.
@@ -54,30 +54,81 @@ export const getSafeAreaInsets = (doc) => {
54
54
  }
55
55
  return insets;
56
56
  };
57
+ /**
58
+ * Largest difference from 1 that the `offsetWidth` based zoom detection below
59
+ * attributes to integer rounding rather than to an actual CSS `zoom`. The
60
+ * rounding error is at most half a pixel over the width of the popover, which
61
+ * is well under this threshold for any realistic popover size.
62
+ */
63
+ const ZOOM_ROUNDING_TOLERANCE = 0.01;
64
+ /**
65
+ * Returns the cumulative CSS `zoom` factor applied to an element.
66
+ *
67
+ * When a CSS `zoom` other than 1 is set on an ancestor (e.g. the `html`
68
+ * element, as recommended by the docs for dynamic font scaling on Chrome for
69
+ * Android), `getBoundingClientRect()`, `clientX`/`clientY` and other geometry
70
+ * APIs report values in the *zoomed* (visual) coordinate space, while inline
71
+ * `top`/`left`/`--width` styles we set are interpreted in the *unzoomed*
72
+ * (layout) space and re-scaled by the browser. Dividing the rect-derived
73
+ * values by this factor converts them back to layout space so the popover is
74
+ * positioned and sized correctly. Returns 1 when no zoom is applied.
75
+ */
76
+ export const getElementCSSZoom = (el) => {
77
+ if (!el) {
78
+ return 1;
79
+ }
80
+ /**
81
+ * `currentCSSZoom` exposes the exact effective zoom of an element
82
+ * (Chromium 128+). When available we use it directly.
83
+ */
84
+ const currentCSSZoom = el.currentCSSZoom;
85
+ if (typeof currentCSSZoom === 'number' && currentCSSZoom > 0) {
86
+ return currentCSSZoom;
87
+ }
88
+ /**
89
+ * Fallback for browsers without `currentCSSZoom`: compare the rendered
90
+ * (zoomed) width from `getBoundingClientRect()` against the layout width
91
+ * from `offsetWidth`, which is not affected by CSS `zoom`.
92
+ */
93
+ const { width } = el.getBoundingClientRect();
94
+ const { offsetWidth } = el;
95
+ if (offsetWidth > 0 && width > 0) {
96
+ const ratio = width / offsetWidth;
97
+ /**
98
+ * `offsetWidth` is rounded to an integer while the bounding rect is not,
99
+ * so the ratio is rarely exactly 1 even when no zoom is applied. Treat
100
+ * sub-pixel differences as "no zoom" so that unzoomed popovers are not
101
+ * shifted by the rounding error. A real zoom deviates far more, though
102
+ * the same rounding leaves the detected factor approximate.
103
+ */
104
+ return Math.abs(ratio - 1) < ZOOM_ROUNDING_TOLERANCE ? 1 : ratio;
105
+ }
106
+ return 1;
107
+ };
57
108
  /**
58
109
  * Returns the dimensions of the popover
59
110
  * arrow on `ios` mode. If arrow is disabled
60
111
  * returns (0, 0).
61
112
  */
62
- export const getArrowDimensions = (arrowEl) => {
113
+ export const getArrowDimensions = (arrowEl, zoom = 1) => {
63
114
  if (!arrowEl) {
64
115
  return { arrowWidth: 0, arrowHeight: 0 };
65
116
  }
66
117
  const { width, height } = arrowEl.getBoundingClientRect();
67
- return { arrowWidth: width, arrowHeight: height };
118
+ return { arrowWidth: width / zoom, arrowHeight: height / zoom };
68
119
  };
69
120
  /**
70
121
  * Returns the recommended dimensions of the popover
71
122
  * that takes into account whether or not the width
72
123
  * should match the trigger width.
73
124
  */
74
- export const getPopoverDimensions = (size, contentEl, triggerEl) => {
125
+ export const getPopoverDimensions = (size, contentEl, triggerEl, zoom = 1) => {
75
126
  const contentDimentions = contentEl.getBoundingClientRect();
76
- const contentHeight = contentDimentions.height;
77
- let contentWidth = contentDimentions.width;
127
+ const contentHeight = contentDimentions.height / zoom;
128
+ let contentWidth = contentDimentions.width / zoom;
78
129
  if (size === 'cover' && triggerEl) {
79
130
  const triggerDimensions = triggerEl.getBoundingClientRect();
80
- contentWidth = triggerDimensions.width;
131
+ contentWidth = triggerDimensions.width / zoom;
81
132
  }
82
133
  return {
83
134
  contentWidth,
@@ -419,7 +470,7 @@ export const configureKeyboardInteraction = (popoverEl) => {
419
470
  * the reference point, preferred side, alignment
420
471
  * and viewport dimensions.
421
472
  */
422
- export const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, triggerEl, event) => {
473
+ export const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, triggerEl, event, zoom = 1) => {
423
474
  let referenceCoordinates = {
424
475
  top: 0,
425
476
  left: 0,
@@ -438,8 +489,8 @@ export const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidt
438
489
  }
439
490
  const mouseEv = event;
440
491
  referenceCoordinates = {
441
- top: mouseEv.clientY,
442
- left: mouseEv.clientX,
492
+ top: mouseEv.clientY / zoom,
493
+ left: mouseEv.clientX / zoom,
443
494
  width: 1,
444
495
  height: 1,
445
496
  };
@@ -471,10 +522,10 @@ export const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidt
471
522
  }
472
523
  const triggerBoundingBox = actualTriggerEl.getBoundingClientRect();
473
524
  referenceCoordinates = {
474
- top: triggerBoundingBox.top,
475
- left: triggerBoundingBox.left,
476
- width: triggerBoundingBox.width,
477
- height: triggerBoundingBox.height,
525
+ top: triggerBoundingBox.top / zoom,
526
+ left: triggerBoundingBox.left / zoom,
527
+ width: triggerBoundingBox.width / zoom,
528
+ height: triggerBoundingBox.height / zoom,
478
529
  };
479
530
  break;
480
531
  }
@@ -204,7 +204,7 @@ button {
204
204
 
205
205
  .select-text {
206
206
  flex: 1;
207
- min-width: 16px;
207
+ min-width: 2ch;
208
208
  font-size: inherit;
209
209
  text-overflow: ellipsis;
210
210
  white-space: inherit;