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.
- package/components/index.js +1 -1
- package/components/ion-accordion-group.js +1 -1
- package/components/ion-accordion.js +1 -1
- package/components/ion-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-app.js +1 -1
- package/components/ion-avatar.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-backdrop.js +1 -1
- package/components/ion-badge.js +1 -1
- package/components/ion-breadcrumb.js +1 -1
- package/components/ion-breadcrumbs.js +1 -1
- package/components/ion-button.js +1 -1
- package/components/ion-buttons.js +1 -1
- package/components/ion-card-content.js +1 -1
- package/components/ion-card-header.js +1 -1
- package/components/ion-card-subtitle.js +1 -1
- package/components/ion-card-title.js +1 -1
- package/components/ion-card.js +1 -1
- package/components/ion-checkbox.js +1 -1
- package/components/ion-chip.js +1 -1
- package/components/ion-col.js +1 -1
- package/components/ion-content.js +1 -1
- package/components/ion-datetime-button.js +1 -1
- package/components/ion-datetime.js +1 -1
- package/components/ion-fab-button.js +1 -1
- package/components/ion-fab-list.js +1 -1
- package/components/ion-fab.js +1 -1
- package/components/ion-footer.js +1 -1
- package/components/ion-grid.js +1 -1
- package/components/ion-header.js +1 -1
- package/components/ion-icon.js +1 -1
- package/components/ion-img.js +1 -1
- package/components/ion-infinite-scroll-content.js +1 -1
- package/components/ion-infinite-scroll.js +1 -1
- package/components/ion-input-otp.js +1 -1
- package/components/ion-input-password-toggle.js +1 -1
- package/components/ion-input.js +1 -1
- package/components/ion-item-divider.js +1 -1
- package/components/ion-item-group.js +1 -1
- package/components/ion-item-option.js +1 -1
- package/components/ion-item-options.js +1 -1
- package/components/ion-item-sliding.js +1 -1
- package/components/ion-item.js +1 -1
- package/components/ion-label.js +1 -1
- package/components/ion-list-header.js +1 -1
- package/components/ion-list.js +1 -1
- package/components/ion-loading.js +1 -1
- package/components/ion-menu-button.js +1 -1
- package/components/ion-menu-toggle.js +1 -1
- package/components/ion-menu.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-nav-link.js +1 -1
- package/components/ion-nav.js +1 -1
- package/components/ion-note.js +1 -1
- package/components/ion-picker-column-option.js +1 -1
- package/components/ion-picker-column.js +1 -1
- package/components/ion-picker.js +1 -1
- package/components/ion-popover.js +1 -1
- package/components/ion-progress-bar.js +1 -1
- package/components/ion-radio-group.js +1 -1
- package/components/ion-radio.js +1 -1
- package/components/ion-range.js +1 -1
- package/components/ion-refresher-content.js +1 -1
- package/components/ion-refresher.js +1 -1
- package/components/ion-reorder-group.js +1 -1
- package/components/ion-reorder.js +1 -1
- package/components/ion-ripple-effect.js +1 -1
- package/components/ion-route-redirect.js +1 -1
- package/components/ion-route.js +1 -1
- package/components/ion-router-link.js +1 -1
- package/components/ion-router-outlet.js +1 -1
- package/components/ion-router.js +1 -1
- package/components/ion-row.js +1 -1
- package/components/ion-searchbar.js +1 -1
- package/components/ion-segment-button.js +1 -1
- package/components/ion-segment-content.js +1 -1
- package/components/ion-segment-view.js +1 -1
- package/components/ion-segment.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select-option.js +1 -1
- package/components/ion-select-popover.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/ion-skeleton-text.js +1 -1
- package/components/ion-spinner.js +1 -1
- package/components/ion-split-pane.js +1 -1
- package/components/ion-tab-bar.js +1 -1
- package/components/ion-tab-button.js +1 -1
- package/components/ion-tab.js +1 -1
- package/components/ion-tabs.js +1 -1
- package/components/ion-text.js +1 -1
- package/components/ion-textarea.js +1 -1
- package/components/ion-thumbnail.js +1 -1
- package/components/ion-title.js +1 -1
- package/components/ion-toast.js +1 -1
- package/components/ion-toggle.js +1 -1
- package/components/ion-toolbar.js +1 -1
- package/components/p--cshUOAU.js +4 -0
- package/components/{p-BF48Oc0v.js → p-7KepMw9O.js} +1 -1
- package/components/p-B-5Z9djt.js +4 -0
- package/components/p-B02CcbPD.js +4 -0
- package/components/p-B4IBdPVJ.js +4 -0
- package/components/{p-BYJRZKHa.js → p-BMHdI-wb.js} +1 -1
- package/components/p-BODcC-C0.js +4 -0
- package/components/{p-D7wDJdFn.js → p-Ba9_OzSY.js} +1 -1
- package/components/{p-DMBiAyOR.js → p-BqyLLYLm.js} +1 -1
- package/components/{p-BQyuFxYc.js → p-C1AxSUnp.js} +1 -1
- package/components/p-C7r5Gja6.js +4 -0
- package/components/{p-D5w_FlVa.js → p-CKiqp4Vl.js} +1 -1
- package/components/{p-C8Ck7_Eo.js → p-C_gnmBt2.js} +1 -1
- package/{dist/ionic/p-DTxBioUO.js → components/p-CdrNHfZl.js} +1 -1
- package/components/{p-DM1gJSMP.js → p-ChkSQqfP.js} +1 -1
- package/components/p-ChsJlFCQ.js +4 -0
- package/components/{p-cEN43Ahr.js → p-CjPRDxby.js} +1 -1
- package/components/p-CohRJRIu.js +4 -0
- package/components/{p-DxhHlJln.js → p-CqvARtmt.js} +1 -1
- package/components/p-Ct2aBEue.js +4 -0
- package/components/p-CtiO6_sC.js +4 -0
- package/components/{p-Hp8t4RMX.js → p-CvyvLbPe.js} +1 -1
- package/{dist/ionic/p-BMiZX1LT.js → components/p-CwEis84J.js} +1 -1
- package/components/p-CxEV3Vwy.js +4 -0
- package/components/p-Cyajikho.js +4 -0
- package/components/p-D64Tyi-z.js +4 -0
- package/components/{p-B4lxwJ8N.js → p-DBtFJlTi.js} +1 -1
- package/components/p-DD92Fw3n.js +4 -0
- package/components/p-DDI6VLW9.js +4 -0
- package/components/{p-Fl7ZFU74.js → p-DHo45oj7.js} +1 -1
- package/components/{p-COO0eJOA.js → p-DMPsc_0r.js} +1 -1
- package/{dist/ionic/p-DZ6Hmc-8.js → components/p-Dbi3KqKm.js} +1 -1
- package/components/p-DhfJAkyd.js +4 -0
- package/components/p-DnGlmM4u.js +4 -0
- package/components/{p-CJgnoKcN.js → p-Drpw2dyl.js} +1 -1
- package/components/{p-5ldEpNdG.js → p-Dvyv9SMk.js} +1 -1
- package/components/p-GpqwNbxf.js +4 -0
- package/components/{p-BJr2B5hZ.js → p-HthJZjZ6.js} +1 -1
- package/components/p-IQN1T5zw.js +4 -0
- package/components/{p-DL13ieTa.js → p-KbMCbGRA.js} +1 -1
- package/components/p-ODGeXc3M.js +4 -0
- package/components/p-R4UxBukQ.js +4 -0
- package/components/p-TLtgwTFF.js +4 -0
- package/components/p-Uk13YgEc.js +4 -0
- package/components/{p-qAXsfUff.js → p-V1THdfzs.js} +1 -1
- package/components/{p-C-NbvXu4.js → p-YNnH1_Hs.js} +1 -1
- package/components/{p-CqbGBmqb.js → p-ZrYBjOcc.js} +1 -1
- package/components/p-_y7kwBO8.js +4 -0
- package/components/{p-GGbIHyEF.js → p-hLu-eIbb.js} +1 -1
- package/components/p-jsVMT15X.js +4 -0
- package/components/{p-TWw4e4sO.js → p-r59A3wQk.js} +1 -1
- package/components/p-yGD6MBgf.js +4 -0
- package/css/core.css +1 -1
- package/css/core.css.map +1 -1
- package/css/display.css.map +1 -1
- package/css/flex-utils.css.map +1 -1
- package/css/float-elements.css +1 -1
- package/css/float-elements.css.map +1 -1
- package/css/global.bundle.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/css/padding.css.map +1 -1
- package/css/structure.css.map +1 -1
- package/css/text-alignment.css.map +1 -1
- package/css/text-transformation.css.map +1 -1
- package/css/typography.css.map +1 -1
- package/css/utils.bundle.css +1 -1
- package/css/utils.bundle.css.map +1 -1
- package/dist/cjs/{animation-Kd1N7WTN.js → animation-DcgLg_PI.js} +3 -3
- package/dist/cjs/{app-globals-b1G4t26O.js → app-globals-BoFCZq0K.js} +1 -1
- package/dist/cjs/attribute-controller-BjTE2TOf.js +131 -0
- package/dist/cjs/{button-active-CQCFubJJ.js → button-active-FdsfRDY_.js} +2 -2
- package/dist/cjs/{capacitor-DmA66EwP.js → capacitor-C6Pp4Z7A.js} +3 -3
- package/dist/cjs/{format-bHU8N1g5.js → format-CVjpvAl1.js} +1 -1
- package/dist/cjs/{framework-delegate-d-fWfeI6.js → framework-delegate-JbKIVMzR.js} +1 -1
- package/dist/cjs/{haptic-Ch-X4gRx.js → haptic--4QteuuM.js} +1 -1
- package/dist/cjs/{helpers-7wzdhdeg.js → helpers-Cqr69qxA.js} +50 -3
- package/dist/cjs/{index-KiSZqhYS.js → index-B4ONUQRp.js} +1 -1
- package/dist/cjs/{index-C74Q3t6a.js → index-BQpSekmz.js} +7 -8
- package/dist/cjs/{index-DFNrCX7M.js → index-BhWiDK25.js} +9 -9
- package/dist/cjs/{index-DXoo08JC.js → index-BiQyIvoc.js} +54 -28
- package/dist/cjs/{index-DtvKGwdh.js → index-CNaZ6SYM.js} +2 -2
- package/dist/cjs/{index-CQfEIyLK.js → index-DUiuw_fH.js} +4 -4
- package/dist/cjs/index.cjs.js +19 -19
- package/dist/cjs/{input-shims-VJIiKBKv.js → input-shims-2AsXPZ5m.js} +16 -17
- package/dist/cjs/{input.utils-EHVE2RK_.js → input.utils-Becpo0ax.js} +1 -1
- package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +26 -28
- package/dist/cjs/ion-alert.cjs.entry.js +27 -29
- package/dist/cjs/ion-app_8.cjs.entry.js +72 -24
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-button_2.cjs.entry.js +23 -34
- package/dist/cjs/ion-card_5.cjs.entry.js +19 -7
- package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
- package/dist/cjs/ion-chip.cjs.entry.js +2 -2
- package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
- package/dist/cjs/ion-datetime.cjs.entry.js +34 -29
- package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
- package/dist/cjs/ion-img.cjs.entry.js +3 -3
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
- package/dist/cjs/ion-input-otp.cjs.entry.js +33 -8
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
- package/dist/cjs/ion-input.cjs.entry.js +12 -16
- package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +17 -8
- package/dist/cjs/ion-loading.cjs.entry.js +18 -20
- package/dist/cjs/ion-menu_3.cjs.entry.js +18 -19
- package/dist/cjs/ion-modal.cjs.entry.js +177 -172
- package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
- package/dist/cjs/ion-picker-column.cjs.entry.js +8 -9
- package/dist/cjs/ion-picker.cjs.entry.js +2 -2
- package/dist/cjs/ion-popover.cjs.entry.js +119 -42
- package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
- package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-range.cjs.entry.js +4 -4
- package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -9
- package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -7
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
- package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
- package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
- package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-select-modal.cjs.entry.js +8 -10
- package/dist/cjs/ion-select_3.cjs.entry.js +71 -53
- package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -7
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +11 -15
- package/dist/cjs/ion-toast.cjs.entry.js +49 -51
- package/dist/cjs/ion-toggle.cjs.entry.js +6 -7
- package/dist/cjs/{ionic-global-CYJNT-2P.js → ionic-global-48ceLiJ6.js} +1 -1
- package/dist/cjs/ionic.cjs.js +5 -5
- package/dist/cjs/{ios.transition-DYGiD6gM.js → ios.transition-D85_rHf5.js} +4 -5
- package/dist/cjs/{item-multiple-inputs-Dv6qrMhm.js → item-multiple-inputs-C-hz7xrh.js} +1 -1
- package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-BlHp4a_c.js} +1 -1
- package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-c2_I35b-.js} +5 -3
- package/dist/cjs/{keyboard-controller-PtZoN2GS.js → keyboard-controller-DHS0BgXp.js} +9 -9
- package/dist/cjs/loader.cjs.js +4 -4
- package/dist/cjs/{md.transition-CrSkaoz6.js → md.transition-Ce9X1WXr.js} +4 -5
- package/dist/cjs/{overlays-BR21NUIG.js → overlays-CLld3axA.js} +224 -12
- package/dist/cjs/{select-option-render-D8ZEjYji.js → select-option-render-CzyhrkOu.js} +2 -2
- package/dist/cjs/{slot-mutation-controller-D6IjSEIh.js → slot-mutation-controller-ClDxh3EK.js} +73 -5
- package/dist/cjs/{status-tap-CNP5eD1R.js → status-tap-CDA0Y3Ad.js} +3 -3
- package/dist/cjs/{swipe-back-CSIJQfu5.js → swipe-back-Dy8pxJCF.js} +2 -2
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/button/button.js +21 -32
- package/dist/collection/components/card/card.js +17 -6
- package/dist/collection/components/content/content.js +62 -8
- package/dist/collection/components/datetime/datetime.js +27 -20
- package/dist/collection/components/input/input.ios.css +6 -0
- package/dist/collection/components/input/input.js +6 -9
- package/dist/collection/components/input/input.md.css +6 -0
- package/dist/collection/components/input-otp/input-otp.js +29 -3
- package/dist/collection/components/item/item.js +15 -6
- package/dist/collection/components/menu/menu.js +4 -3
- package/dist/collection/components/modal/modal.ios.css +12 -1
- package/dist/collection/components/modal/modal.js +31 -8
- package/dist/collection/components/modal/modal.md.css +12 -1
- package/dist/collection/components/modal/safe-area-utils.js +69 -90
- package/dist/collection/components/modal/utils.js +7 -0
- package/dist/collection/components/popover/animations/ios.enter.js +20 -6
- package/dist/collection/components/popover/animations/md.enter.js +19 -5
- package/dist/collection/components/popover/utils.js +64 -13
- package/dist/collection/components/select/select.ios.css +1 -1
- package/dist/collection/components/select/select.js +67 -38
- package/dist/collection/components/select/select.md.css +1 -1
- package/dist/collection/components/textarea/textarea.ios.css +15 -1
- package/dist/collection/components/textarea/textarea.js +5 -8
- package/dist/collection/components/textarea/textarea.md.css +15 -1
- package/dist/collection/index.js +1 -1
- package/dist/collection/utils/attribute-controller.js +126 -0
- package/dist/collection/utils/forms/click-controller.js +70 -0
- package/dist/collection/utils/forms/index.js +1 -0
- package/dist/collection/utils/hardware-back-button.js +41 -12
- package/dist/collection/utils/helpers.js +44 -3
- package/dist/collection/utils/logging/index.js +4 -0
- package/dist/collection/utils/menu-controller/index.js +2 -1
- package/dist/collection/utils/overlays.js +64 -4
- package/dist/docs.json +9 -3
- package/dist/esm/{animation-BFNVlYum.js → animation-DmtJpz89.js} +2 -2
- package/dist/esm/{app-globals-BgX0BGL1.js → app-globals-CNfpAPW6.js} +1 -1
- package/dist/esm/attribute-controller-DPMIcbef.js +128 -0
- package/dist/esm/{button-active-BfOvDr3b.js → button-active-DVk40Sjl.js} +2 -2
- package/dist/esm/{capacitor-CFERIeaU.js → capacitor-CHJaJ9aX.js} +1 -1
- package/dist/esm/{format-DDFE9jM5.js → format-Ck1cw5z7.js} +1 -1
- package/dist/esm/{framework-delegate-BwNhx9NR.js → framework-delegate-CDjM1vRH.js} +1 -1
- package/dist/esm/{haptic-Cq4UAeka.js → haptic-WXfMCob9.js} +1 -1
- package/dist/esm/{helpers-BSmc0nst.js → helpers-BJqKF1pr.js} +47 -4
- package/dist/esm/{index-DnA_7Bnx.js → index-BBASprVu.js} +4 -4
- package/dist/esm/{index-C23AVPx9.js → index-BpRUsN_W.js} +55 -29
- package/dist/esm/{index-D76bbuoi.js → index-CK8uF0iB.js} +1 -1
- package/dist/esm/{index-CJln0gS3.js → index-Clv8QC5L.js} +2 -3
- package/dist/esm/{index-BuPaALjU.js → index-DIouXecD.js} +6 -6
- package/dist/esm/{index-C1b9CLFg.js → index-TkLga3ma.js} +2 -2
- package/dist/esm/index.js +11 -13
- package/dist/esm/{input-shims-Dqk-Ou25.js → input-shims-C1iYF5JK.js} +5 -6
- package/dist/esm/{input.utils-rqoH22pW.js → input.utils-DZY_K8Po.js} +1 -1
- package/dist/esm/ion-accordion_2.entry.js +3 -3
- package/dist/esm/ion-action-sheet.entry.js +11 -13
- package/dist/esm/ion-alert.entry.js +11 -13
- package/dist/esm/ion-app_8.entry.js +72 -24
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +3 -3
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
- package/dist/esm/ion-button_2.entry.js +23 -34
- package/dist/esm/ion-card_5.entry.js +19 -7
- package/dist/esm/ion-checkbox.entry.js +4 -4
- package/dist/esm/ion-chip.entry.js +2 -2
- package/dist/esm/ion-col_3.entry.js +2 -2
- package/dist/esm/ion-datetime-button.entry.js +4 -4
- package/dist/esm/ion-datetime.entry.js +33 -28
- package/dist/esm/ion-fab_3.entry.js +3 -3
- package/dist/esm/ion-img.entry.js +3 -3
- package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
- package/dist/esm/ion-input-otp.entry.js +33 -8
- package/dist/esm/ion-input-password-toggle.entry.js +2 -2
- package/dist/esm/ion-input.entry.js +12 -16
- package/dist/esm/ion-item-option_3.entry.js +4 -4
- package/dist/esm/ion-item_8.entry.js +17 -8
- package/dist/esm/ion-loading.entry.js +7 -9
- package/dist/esm/ion-menu_3.entry.js +10 -11
- package/dist/esm/ion-modal.entry.js +115 -110
- package/dist/esm/ion-nav_2.entry.js +6 -6
- package/dist/esm/ion-picker-column-option.entry.js +3 -3
- package/dist/esm/ion-picker-column.entry.js +5 -6
- package/dist/esm/ion-picker.entry.js +2 -2
- package/dist/esm/ion-popover.entry.js +108 -31
- package/dist/esm/ion-progress-bar.entry.js +3 -3
- package/dist/esm/ion-radio_2.entry.js +4 -4
- package/dist/esm/ion-range.entry.js +4 -4
- package/dist/esm/ion-refresher_2.entry.js +8 -9
- package/dist/esm/ion-reorder_2.entry.js +6 -7
- package/dist/esm/ion-ripple-effect.entry.js +2 -2
- package/dist/esm/ion-route_4.entry.js +4 -4
- package/dist/esm/ion-searchbar.entry.js +3 -3
- package/dist/esm/ion-segment-content.entry.js +1 -1
- package/dist/esm/ion-segment-view.entry.js +1 -1
- package/dist/esm/ion-segment_2.entry.js +3 -3
- package/dist/esm/ion-select-modal.entry.js +7 -9
- package/dist/esm/ion-select_3.entry.js +66 -48
- package/dist/esm/ion-spinner.entry.js +2 -2
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +6 -7
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +11 -15
- package/dist/esm/ion-toast.entry.js +7 -9
- package/dist/esm/ion-toggle.entry.js +6 -7
- package/dist/esm/{ionic-global-ZXjCXKH0.js → ionic-global-Cep6oYzK.js} +1 -1
- package/dist/esm/ionic.js +6 -6
- package/dist/esm/{ios.transition-CWAgfQ1r.js → ios.transition-B8netzsb.js} +4 -5
- package/dist/esm/{item-multiple-inputs-DZnIiOO_.js → item-multiple-inputs-Bd2LO7qK.js} +1 -1
- package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-B4Y-Gph8.js} +5 -3
- package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-Cmqp5iZD.js} +1 -1
- package/dist/esm/{keyboard-controller-DEwoa1ev.js → keyboard-controller-B2NoF7bV.js} +2 -2
- package/dist/esm/loader.js +5 -5
- package/dist/esm/{md.transition-ZuqDDdDW.js → md.transition-DNCSSiXk.js} +4 -5
- package/dist/esm/{overlays-DKE0DgvE.js → overlays-DmDY-El7.js} +216 -10
- package/dist/esm/{select-option-render-CRP_teb1.js → select-option-render-BSDT9oSA.js} +2 -2
- package/dist/esm/{slot-mutation-controller-B5NpUZ-N.js → slot-mutation-controller-hAS2uJ7c.js} +69 -3
- package/dist/esm/{status-tap-Cv9gb3ja.js → status-tap-VGRBYwiC.js} +3 -3
- package/dist/esm/{swipe-back-De5HlmeM.js → swipe-back-tCNYR9ZM.js} +2 -2
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-b9b4e85d.entry.js → p-00cd107d.entry.js} +1 -1
- package/dist/ionic/p-01b7e3f2.entry.js +4 -0
- package/dist/ionic/{p-9c5f2691.entry.js → p-0a789930.entry.js} +1 -1
- package/dist/ionic/p-0b09c60e.entry.js +4 -0
- package/dist/ionic/p-0c32c626.entry.js +4 -0
- package/dist/ionic/p-0f97175e.entry.js +4 -0
- package/dist/ionic/p-107a81a6.entry.js +4 -0
- package/dist/ionic/{p-ca1b8865.entry.js → p-230f510c.entry.js} +1 -1
- package/dist/ionic/p-27d96a9b.entry.js +4 -0
- package/dist/ionic/{p-db449915.entry.js → p-28251c5c.entry.js} +1 -1
- package/dist/ionic/{p-099b7f9f.entry.js → p-362dcd86.entry.js} +1 -1
- package/dist/ionic/p-4bd80334.entry.js +4 -0
- package/dist/ionic/p-4d785062.entry.js +4 -0
- package/dist/ionic/{p-efc0cf82.entry.js → p-4e4e5919.entry.js} +1 -1
- package/dist/ionic/{p-837db1b9.entry.js → p-4ed3c460.entry.js} +1 -1
- package/dist/ionic/{p-d8c138d9.entry.js → p-4f25b926.entry.js} +1 -1
- package/dist/ionic/{p-271c3640.entry.js → p-539d6c8e.entry.js} +1 -1
- package/dist/ionic/p-5bb24bce.entry.js +4 -0
- package/dist/ionic/p-60780b88.entry.js +4 -0
- package/dist/ionic/{p-54cbb0a7.entry.js → p-62c87f3d.entry.js} +1 -1
- package/dist/ionic/p-6317d620.entry.js +4 -0
- package/dist/ionic/{p-85599fe3.entry.js → p-64ac3864.entry.js} +1 -1
- package/dist/ionic/{p-191a651e.entry.js → p-6c7b5930.entry.js} +1 -1
- package/dist/ionic/{p-7fbb3319.entry.js → p-77252596.entry.js} +1 -1
- package/dist/ionic/p-7ce9c6f8.entry.js +4 -0
- package/dist/ionic/{p-8b80d9f9.entry.js → p-7db20410.entry.js} +1 -1
- package/dist/ionic/{p-5d9094ac.entry.js → p-7e9c2a97.entry.js} +1 -1
- package/dist/ionic/p-7l6ENjIV.js +4 -0
- package/dist/ionic/p-82abf431.entry.js +4 -0
- package/dist/ionic/p-8b79061e.entry.js +4 -0
- package/dist/ionic/{p-6e386853.entry.js → p-8c85e250.entry.js} +1 -1
- package/dist/ionic/{p-90f50a65.entry.js → p-8d651adb.entry.js} +1 -1
- package/dist/ionic/{p-dd01be0a.entry.js → p-8db08782.entry.js} +1 -1
- package/dist/ionic/p-91f3cd8b.entry.js +4 -0
- package/dist/ionic/{p-f0fb23c1.entry.js → p-930c3538.entry.js} +1 -1
- package/dist/ionic/{p-ee09ac9d.entry.js → p-9ffccbf1.entry.js} +1 -1
- package/dist/ionic/{p-CM5OBjTW.js → p-B0jcOZOE.js} +1 -1
- package/dist/ionic/p-B8IuTu_r.js +4 -0
- package/dist/ionic/p-BNXIurCt.js +4 -0
- package/{components/p-6ZLn6K5e.js → dist/ionic/p-BO10QT9r.js} +1 -1
- package/dist/ionic/p-BOLqP2-V.js +4 -0
- package/dist/ionic/{p-BMPN55of.js → p-BY4FwwBp.js} +1 -1
- package/dist/ionic/p-BdHBcCZF.js +4 -0
- package/{components/p-DiuOa1vw.js → dist/ionic/p-BexAj0yw.js} +1 -1
- package/dist/ionic/p-Bnc1L7Rk.js +4 -0
- package/dist/ionic/p-BpRUsN_W.js +6 -0
- package/dist/ionic/p-Bppj2PE0.js +4 -0
- package/dist/ionic/p-BuLlVedw.js +4 -0
- package/dist/ionic/p-Bx5x5GJV.js +4 -0
- package/dist/ionic/p-C1WYZOZj.js +4 -0
- package/dist/ionic/p-C2LaBx3E.js +4 -0
- package/dist/ionic/{p-Bd72UYI2.js → p-CXs4J83x.js} +1 -1
- package/dist/ionic/p-Co7eql8D.js +4 -0
- package/dist/ionic/p-D13gXhdC.js +4 -0
- package/dist/ionic/p-D926OmIX.js +4 -0
- package/dist/ionic/{p-T71k3C35.js → p-DPNVo1nr.js} +1 -1
- package/{components/p-C4VpVfrJ.js → dist/ionic/p-DQXtveHv.js} +1 -1
- package/dist/ionic/p-DXXGkPA8.js +4 -0
- package/dist/ionic/{p-C8XilMh0.js → p-DfvWlTdB.js} +1 -1
- package/dist/ionic/p-DriE1ZAo.js +4 -0
- package/dist/ionic/{p-D7jHfs0Y.js → p-DxftXYZp.js} +1 -1
- package/dist/ionic/{p-Do3zTvCA.js → p-SEecsUh7.js} +1 -1
- package/dist/ionic/p-a4389f13.entry.js +4 -0
- package/dist/ionic/p-af11d3c6.entry.js +4 -0
- package/dist/ionic/p-af56702e.entry.js +4 -0
- package/dist/ionic/{p-561af487.entry.js → p-b3aadfe8.entry.js} +1 -1
- package/dist/ionic/p-b5bcbbc1.entry.js +4 -0
- package/dist/ionic/p-b9ed3a52.entry.js +4 -0
- package/dist/ionic/{p-3bba83ee.entry.js → p-bfdbe24b.entry.js} +1 -1
- package/dist/ionic/{p-4712a8a9.entry.js → p-c250b6b0.entry.js} +1 -1
- package/dist/ionic/{p-38b9375b.entry.js → p-c293f854.entry.js} +1 -1
- package/dist/ionic/p-c81ec0e8.entry.js +4 -0
- package/dist/ionic/p-c83dbc12.entry.js +4 -0
- package/dist/ionic/p-d0e374f8.entry.js +4 -0
- package/dist/ionic/p-d72accc4.entry.js +4 -0
- package/dist/ionic/p-d9a3dfd1.entry.js +4 -0
- package/dist/ionic/p-e1haAYzm.js +4 -0
- package/dist/ionic/p-e7ab4def.entry.js +4 -0
- package/dist/ionic/{p-d6755739.entry.js → p-eb989dc9.entry.js} +1 -1
- package/dist/ionic/p-ec259ac5.entry.js +4 -0
- package/dist/ionic/{p-DYUjHcuH.js → p-nCAPr1Ah.js} +1 -1
- package/dist/types/components/button/button.d.ts +3 -12
- package/dist/types/components/card/card.d.ts +3 -1
- package/dist/types/components/content/content.d.ts +28 -3
- package/dist/types/components/datetime/datetime.d.ts +5 -10
- package/dist/types/components/input/input.d.ts +1 -0
- package/dist/types/components/input-otp/input-otp.d.ts +7 -0
- package/dist/types/components/item/item.d.ts +1 -1
- package/dist/types/components/modal/modal.d.ts +9 -1
- package/dist/types/components/modal/safe-area-utils.d.ts +28 -14
- package/dist/types/components/modal/utils.d.ts +4 -0
- package/dist/types/components/popover/utils.d.ts +16 -3
- package/dist/types/components/select/select.d.ts +11 -0
- package/dist/types/components/textarea/textarea.d.ts +1 -0
- package/dist/types/components.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/stencil-public-runtime.d.ts +61 -55
- package/dist/types/utils/attribute-controller.d.ts +56 -0
- package/dist/types/utils/config.d.ts +4 -1
- package/dist/types/utils/forms/click-controller.d.ts +36 -0
- package/dist/types/utils/forms/index.d.ts +1 -0
- package/dist/types/utils/hardware-back-button.d.ts +11 -0
- package/dist/types/utils/helpers.d.ts +27 -2
- package/dist/types/utils/logging/index.d.ts +4 -0
- package/dist/types/utils/overlays.d.ts +20 -2
- package/hydrate/index.js +1249 -484
- package/hydrate/index.mjs +1249 -484
- package/package.json +3 -3
- package/components/p-1sJ0ZDPe.js +0 -4
- package/components/p-B1_TL6RQ.js +0 -4
- package/components/p-BT9-hMMz.js +0 -4
- package/components/p-BU8a2IhR.js +0 -4
- package/components/p-BW_SlU2D.js +0 -4
- package/components/p-BWoa-cki.js +0 -4
- package/components/p-BgkOsq-d.js +0 -4
- package/components/p-Bi-it1EH.js +0 -4
- package/components/p-C09TXohi.js +0 -4
- package/components/p-CG_zZq_I.js +0 -4
- package/components/p-CMRYD_yR.js +0 -4
- package/components/p-CNLioZ3B.js +0 -4
- package/components/p-CWAks_S_.js +0 -4
- package/components/p-Cd1WaN-0.js +0 -4
- package/components/p-CrAKlX71.js +0 -4
- package/components/p-Ctop2IWW.js +0 -4
- package/components/p-Cw6WocLJ.js +0 -4
- package/components/p-DFLJvuRK.js +0 -4
- package/components/p-DZRZic9C.js +0 -4
- package/components/p-DhNuxvJH.js +0 -4
- package/components/p-Djmz-ssp.js +0 -4
- package/components/p-DnBNYc7u.js +0 -4
- package/components/p-DwSXbQSz.js +0 -4
- package/components/p-M34T2gyX.js +0 -4
- package/components/p-YjMkHuvH.js +0 -4
- package/dist/cjs/hardware-back-button-Bu4Dzw8l.js +0 -121
- package/dist/cjs/index-DkNv4J_i.js +0 -10
- package/dist/esm/hardware-back-button-DmkiRgOT.js +0 -115
- package/dist/esm/index-ZjP4CjeZ.js +0 -7
- package/dist/ionic/p-0dcb7bb6.entry.js +0 -4
- package/dist/ionic/p-1347880c.entry.js +0 -4
- package/dist/ionic/p-1f24cb24.entry.js +0 -4
- package/dist/ionic/p-2ea4bb36.entry.js +0 -4
- package/dist/ionic/p-338a02e0.entry.js +0 -4
- package/dist/ionic/p-3e01c744.entry.js +0 -4
- package/dist/ionic/p-458715a9.entry.js +0 -4
- package/dist/ionic/p-4c3e50f8.entry.js +0 -4
- package/dist/ionic/p-5906ea6f.entry.js +0 -4
- package/dist/ionic/p-5cc09b40.entry.js +0 -4
- package/dist/ionic/p-612ea3b1.entry.js +0 -4
- package/dist/ionic/p-68cc89a6.entry.js +0 -4
- package/dist/ionic/p-77c96e08.entry.js +0 -4
- package/dist/ionic/p-7bfeccb3.entry.js +0 -4
- package/dist/ionic/p-7e394cc3.entry.js +0 -4
- package/dist/ionic/p-803059b6.entry.js +0 -4
- package/dist/ionic/p-9595e305.entry.js +0 -4
- package/dist/ionic/p-9ee9c5b6.entry.js +0 -4
- package/dist/ionic/p-BY6BzzPF.js +0 -4
- package/dist/ionic/p-BaeKWZ-a.js +0 -4
- package/dist/ionic/p-BgOvhHy_.js +0 -4
- package/dist/ionic/p-BhamHSw3.js +0 -4
- package/dist/ionic/p-BijjLYjT.js +0 -4
- package/dist/ionic/p-C23AVPx9.js +0 -6
- package/dist/ionic/p-CER8qW8Y.js +0 -4
- package/dist/ionic/p-CFuOr1Tu.js +0 -4
- package/dist/ionic/p-CIGNaXM1.js +0 -4
- package/dist/ionic/p-CMZYmFb4.js +0 -4
- package/dist/ionic/p-CkxVYPtX.js +0 -4
- package/dist/ionic/p-CmXuiRT6.js +0 -4
- package/dist/ionic/p-D5t_-oMk.js +0 -4
- package/dist/ionic/p-D6rHcCvc.js +0 -4
- package/dist/ionic/p-DLM95R4x.js +0 -4
- package/dist/ionic/p-D_gb-kdd.js +0 -4
- package/dist/ionic/p-DajLgJ4d.js +0 -4
- package/dist/ionic/p-ZjP4CjeZ.js +0 -4
- package/dist/ionic/p-a8df96c8.entry.js +0 -4
- package/dist/ionic/p-a8ff2489.entry.js +0 -4
- package/dist/ionic/p-aff52029.entry.js +0 -4
- package/dist/ionic/p-b3532b8d.entry.js +0 -4
- package/dist/ionic/p-cc4320d3.entry.js +0 -4
- package/dist/ionic/p-d526798a.entry.js +0 -4
- package/dist/ionic/p-ec00fd0d.entry.js +0 -4
- package/dist/ionic/p-f83b3e0c.entry.js +0 -4
- package/dist/ionic/p-fa50d493.entry.js +0 -4
- 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,
|
|
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
|
-
* `
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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
|
-
|
|
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
|
|
74
|
-
*
|
|
75
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
109
|
-
*
|
|
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
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
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
|
|
66
|
+
export const getModalCoveredAxes = (hostEl) => {
|
|
118
67
|
const styles = getComputedStyle(hostEl);
|
|
119
|
-
const width = styles.getPropertyValue('--width')
|
|
120
|
-
const height = styles.getPropertyValue('--height')
|
|
121
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
}
|