@ionic/core 8.8.4-dev.11776186452.1cc0af05 → 8.8.4-dev.11776246162.138c2737

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 (214) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-action-sheet.js +1 -1
  3. package/components/ion-alert.js +1 -1
  4. package/components/ion-datetime.js +1 -1
  5. package/components/ion-infinite-scroll-content.js +1 -1
  6. package/components/ion-loading.js +1 -1
  7. package/components/ion-menu.js +1 -1
  8. package/components/ion-modal.js +1 -1
  9. package/components/ion-picker-legacy.js +1 -1
  10. package/components/ion-popover.js +1 -1
  11. package/components/ion-refresher-content.js +1 -1
  12. package/components/ion-select-modal.js +1 -1
  13. package/components/ion-select-option.js +1 -1
  14. package/components/ion-select-popover.js +1 -1
  15. package/components/ion-select.js +1 -1
  16. package/components/ion-skeleton-text.js +1 -1
  17. package/components/ion-spinner.js +1 -1
  18. package/components/ion-split-pane.js +1 -1
  19. package/components/ion-tab-bar.js +1 -1
  20. package/components/ion-tab-button.js +1 -1
  21. package/components/ion-tab.js +1 -1
  22. package/components/ion-tabs.js +1 -1
  23. package/components/ion-text.js +1 -1
  24. package/components/ion-textarea.js +1 -1
  25. package/components/ion-thumbnail.js +1 -1
  26. package/components/ion-title.js +1 -1
  27. package/components/ion-toast.js +1 -1
  28. package/components/ion-toggle.js +1 -1
  29. package/components/ion-toolbar.js +1 -1
  30. package/components/p-B36-MWK0.js +4 -0
  31. package/components/p-BDPU2685.js +4 -0
  32. package/components/p-BrNzoF1U.js +4 -0
  33. package/components/{p-B0orUoaV.js → p-C-_EGKki.js} +1 -1
  34. package/components/{p-qhBzWoOF.js → p-C2cZvGcF.js} +1 -1
  35. package/components/p-CEUppJkx.js +4 -0
  36. package/components/p-CSexRbnt.js +4 -0
  37. package/components/{p-ZRp3l6Dk.js → p-CoarhFWH.js} +1 -1
  38. package/components/p-DNdBtsfu.js +4 -0
  39. package/components/p-Njik5v4C.js +4 -0
  40. package/dist/cjs/index.cjs.js +1 -1
  41. package/dist/cjs/ion-action-sheet.cjs.entry.js +34 -25
  42. package/dist/cjs/ion-alert.cjs.entry.js +51 -44
  43. package/dist/cjs/ion-app_8.cjs.entry.js +4 -4
  44. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  45. package/dist/cjs/ion-datetime_3.cjs.entry.js +28 -4
  46. package/dist/cjs/ion-item_8.cjs.entry.js +2 -2
  47. package/dist/cjs/ion-loading.cjs.entry.js +29 -4
  48. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  49. package/dist/cjs/ion-modal.cjs.entry.js +176 -79
  50. package/dist/cjs/ion-popover.cjs.entry.js +90 -4
  51. package/dist/cjs/ion-select-modal.cjs.entry.js +27 -60
  52. package/dist/cjs/ion-select_3.cjs.entry.js +48 -191
  53. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  54. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  55. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  56. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  57. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  58. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  59. package/dist/cjs/ion-toast.cjs.entry.js +32 -4
  60. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  61. package/dist/cjs/ionic.cjs.js +1 -1
  62. package/dist/cjs/loader.cjs.js +1 -1
  63. package/dist/cjs/{overlays-Dhoy6v_5.js → overlays-BbhewSIQ.js} +4 -4
  64. package/dist/collection/components/action-sheet/action-sheet.ios.css +0 -84
  65. package/dist/collection/components/action-sheet/action-sheet.js +8 -22
  66. package/dist/collection/components/action-sheet/action-sheet.md.css +0 -84
  67. package/dist/collection/components/action-sheet/animations/ionic.enter.js +27 -0
  68. package/dist/collection/components/action-sheet/animations/ionic.leave.js +21 -0
  69. package/dist/collection/components/alert/alert.ios.css +0 -83
  70. package/dist/collection/components/alert/alert.js +24 -41
  71. package/dist/collection/components/alert/alert.md.css +0 -83
  72. package/dist/collection/components/alert/animations/ionic.enter.js +28 -0
  73. package/dist/collection/components/alert/animations/ionic.leave.js +19 -0
  74. package/dist/collection/components/loading/animations/ionic.enter.js +28 -0
  75. package/dist/collection/components/loading/animations/ionic.leave.js +22 -0
  76. package/dist/collection/components/loading/loading.js +4 -3
  77. package/dist/collection/components/modal/animations/ionic.enter.js +40 -0
  78. package/dist/collection/components/modal/animations/ionic.leave.js +28 -0
  79. package/dist/collection/components/modal/gestures/sheet.js +71 -9
  80. package/dist/collection/components/modal/modal.ionic.css +1 -1
  81. package/dist/collection/components/modal/modal.js +6 -5
  82. package/dist/collection/components/picker-legacy/animations/ionic.enter.js +27 -0
  83. package/dist/collection/components/picker-legacy/animations/ionic.leave.js +23 -0
  84. package/dist/collection/components/picker-legacy/picker.js +4 -3
  85. package/dist/collection/components/popover/animations/ionic.enter.js +91 -0
  86. package/dist/collection/components/popover/animations/ionic.leave.js +29 -0
  87. package/dist/collection/components/popover/popover.js +4 -3
  88. package/dist/collection/components/select/select.ionic.css +0 -31
  89. package/dist/collection/components/select/select.ios.css +0 -31
  90. package/dist/collection/components/select/select.js +14 -125
  91. package/dist/collection/components/select/select.md.css +0 -31
  92. package/dist/collection/components/select-modal/select-modal.ionic.css +0 -24
  93. package/dist/collection/components/select-modal/select-modal.ios.css +0 -77
  94. package/dist/collection/components/select-modal/select-modal.js +23 -56
  95. package/dist/collection/components/select-modal/select-modal.md.css +1 -80
  96. package/dist/collection/components/select-option/select-option.js +2 -21
  97. package/dist/collection/components/select-popover/select-popover.ios.css +0 -77
  98. package/dist/collection/components/select-popover/select-popover.js +26 -59
  99. package/dist/collection/components/select-popover/select-popover.md.css +0 -77
  100. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  101. package/dist/collection/components/spinner/spinner.js +1 -1
  102. package/dist/collection/components/split-pane/split-pane.js +2 -2
  103. package/dist/collection/components/tab/tab.js +2 -2
  104. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  105. package/dist/collection/components/tab-button/tab-button.js +2 -2
  106. package/dist/collection/components/tabs/tabs.js +1 -1
  107. package/dist/collection/components/text/text.js +2 -2
  108. package/dist/collection/components/textarea/textarea.js +3 -3
  109. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  110. package/dist/collection/components/title/title.js +2 -2
  111. package/dist/collection/components/toast/animations/ionic.enter.js +33 -0
  112. package/dist/collection/components/toast/animations/ionic.leave.js +16 -0
  113. package/dist/collection/components/toast/toast.js +4 -3
  114. package/dist/collection/components/toggle/toggle.js +3 -3
  115. package/dist/collection/components/toolbar/toolbar.js +2 -2
  116. package/dist/collection/utils/overlays.js +5 -5
  117. package/dist/docs.json +1 -135
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/ion-action-sheet.entry.js +34 -25
  120. package/dist/esm/ion-alert.entry.js +51 -44
  121. package/dist/esm/ion-app_8.entry.js +4 -4
  122. package/dist/esm/ion-avatar_3.entry.js +2 -2
  123. package/dist/esm/ion-datetime_3.entry.js +28 -4
  124. package/dist/esm/ion-item_8.entry.js +2 -2
  125. package/dist/esm/ion-loading.entry.js +29 -4
  126. package/dist/esm/ion-menu_3.entry.js +1 -1
  127. package/dist/esm/ion-modal.entry.js +177 -80
  128. package/dist/esm/ion-popover.entry.js +90 -4
  129. package/dist/esm/ion-select-modal.entry.js +27 -60
  130. package/dist/esm/ion-select_3.entry.js +49 -192
  131. package/dist/esm/ion-spinner.entry.js +1 -1
  132. package/dist/esm/ion-split-pane.entry.js +2 -2
  133. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  134. package/dist/esm/ion-tab_2.entry.js +3 -3
  135. package/dist/esm/ion-text.entry.js +2 -2
  136. package/dist/esm/ion-textarea.entry.js +3 -3
  137. package/dist/esm/ion-toast.entry.js +32 -4
  138. package/dist/esm/ion-toggle.entry.js +3 -3
  139. package/dist/esm/ionic.js +1 -1
  140. package/dist/esm/loader.js +1 -1
  141. package/dist/esm/{overlays-CvFHfO3y.js → overlays-VA-4NWjf.js} +5 -5
  142. package/dist/html.html-data.json +0 -4
  143. package/dist/ionic/index.esm.js +1 -1
  144. package/dist/ionic/ionic.esm.js +1 -1
  145. package/dist/ionic/p-07b129d5.entry.js +4 -0
  146. package/dist/ionic/p-0cb50208.entry.js +4 -0
  147. package/dist/ionic/{p-db4f4eaf.entry.js → p-1efe83c8.entry.js} +1 -1
  148. package/dist/ionic/{p-d2fe6791.entry.js → p-2193e875.entry.js} +1 -1
  149. package/dist/ionic/{p-69033ad6.entry.js → p-2bf931ae.entry.js} +1 -1
  150. package/dist/ionic/{p-26595044.entry.js → p-3bf01c2c.entry.js} +1 -1
  151. package/dist/ionic/p-3d4c8528.entry.js +4 -0
  152. package/dist/ionic/{p-9e71982e.entry.js → p-49799a34.entry.js} +1 -1
  153. package/dist/ionic/p-64341e32.entry.js +4 -0
  154. package/dist/ionic/p-6992d9d6.entry.js +4 -0
  155. package/dist/ionic/{p-aa8c1e64.entry.js → p-6c8c37c2.entry.js} +1 -1
  156. package/dist/ionic/{p-a94016be.entry.js → p-91e242e4.entry.js} +1 -1
  157. package/dist/ionic/{p-96ec9a10.entry.js → p-9b9b1450.entry.js} +1 -1
  158. package/dist/ionic/p-9dd4276b.entry.js +4 -0
  159. package/dist/ionic/p-BExfzy0B.js +4 -0
  160. package/dist/ionic/p-a3d794ba.entry.js +4 -0
  161. package/dist/ionic/p-ba9f8cbb.entry.js +4 -0
  162. package/dist/ionic/{p-2095969c.entry.js → p-bae3ebe5.entry.js} +1 -1
  163. package/dist/ionic/{p-a1c8ba8c.entry.js → p-bc5713f7.entry.js} +1 -1
  164. package/dist/ionic/{p-71f28573.entry.js → p-cdfbe4cc.entry.js} +1 -1
  165. package/dist/ionic/p-fa701753.entry.js +4 -0
  166. package/dist/types/components/action-sheet/animations/ionic.enter.d.ts +5 -0
  167. package/dist/types/components/action-sheet/animations/ionic.leave.d.ts +5 -0
  168. package/dist/types/components/alert/animations/ionic.enter.d.ts +5 -0
  169. package/dist/types/components/alert/animations/ionic.leave.d.ts +5 -0
  170. package/dist/types/components/loading/animations/ionic.enter.d.ts +5 -0
  171. package/dist/types/components/loading/animations/ionic.leave.d.ts +5 -0
  172. package/dist/types/components/modal/animations/ionic.enter.d.ts +6 -0
  173. package/dist/types/components/modal/animations/ionic.leave.d.ts +6 -0
  174. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  175. package/dist/types/components/picker-legacy/animations/ionic.enter.d.ts +5 -0
  176. package/dist/types/components/picker-legacy/animations/ionic.leave.d.ts +5 -0
  177. package/dist/types/components/popover/animations/ionic.enter.d.ts +5 -0
  178. package/dist/types/components/popover/animations/ionic.leave.d.ts +5 -0
  179. package/dist/types/components/select/select-interface.d.ts +0 -21
  180. package/dist/types/components/select/select.d.ts +0 -7
  181. package/dist/types/components/select-option/select-option.d.ts +0 -4
  182. package/dist/types/components/toast/animations/ionic.enter.d.ts +6 -0
  183. package/dist/types/components/toast/animations/ionic.leave.d.ts +5 -0
  184. package/dist/types/components.d.ts +0 -9
  185. package/dist/types/utils/overlays.d.ts +1 -1
  186. package/hydrate/index.js +534 -489
  187. package/hydrate/index.mjs +534 -489
  188. package/package.json +1 -1
  189. package/components/p-B6czg-mf.js +0 -4
  190. package/components/p-BObmvbuR.js +0 -4
  191. package/components/p-C8Dne7pI.js +0 -4
  192. package/components/p-Cm7hjN9B.js +0 -4
  193. package/components/p-DQY5lHUa.js +0 -4
  194. package/components/p-D_uMZULz.js +0 -4
  195. package/components/p-GytrfCp8.js +0 -4
  196. package/components/p-ZeIAjDcZ.js +0 -4
  197. package/dist/cjs/select-option-render-qQf4xz8P.js +0 -67
  198. package/dist/collection/components/action-sheet/action-sheet.ionic.css +0 -834
  199. package/dist/collection/components/alert/alert.ionic.css +0 -1165
  200. package/dist/collection/components/select-popover/select-popover.ionic.css +0 -489
  201. package/dist/collection/utils/select-option-render.js +0 -62
  202. package/dist/esm/select-option-render-BQUT9Aqa.js +0 -65
  203. package/dist/ionic/p-003b40fc.entry.js +0 -4
  204. package/dist/ionic/p-35aa95dc.entry.js +0 -4
  205. package/dist/ionic/p-37f895a8.entry.js +0 -4
  206. package/dist/ionic/p-3884bfa4.entry.js +0 -4
  207. package/dist/ionic/p-38897781.entry.js +0 -4
  208. package/dist/ionic/p-575061c0.entry.js +0 -4
  209. package/dist/ionic/p-6bffc700.entry.js +0 -4
  210. package/dist/ionic/p-BYtS2rae.js +0 -4
  211. package/dist/ionic/p-Dr3N4o63.js +0 -4
  212. package/dist/ionic/p-c3335fe0.entry.js +0 -4
  213. package/dist/ionic/p-ef0c281a.entry.js +0 -4
  214. package/dist/types/utils/select-option-render.d.ts +0 -26
@@ -4,10 +4,10 @@
4
4
  import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-Omi_TcwW.js';
5
5
  import { f as findClosestIonContent, i as isIonContent, d as disableContentScrollY, r as resetContentScrollY, a as findIonContent, p as printIonContentErrorMsg } from './index-BmkLokUL.js';
6
6
  import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-CjVwn_KZ.js';
7
- import { e as clamp, g as getElementRoot, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-Do7zwvM1.js';
7
+ import { g as getElementRoot, e as clamp, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-Do7zwvM1.js';
8
8
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
9
9
  import { g as getCapacitor } from './capacitor-C4lYa1nV.js';
10
- import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-CvFHfO3y.js';
10
+ import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-VA-4NWjf.js';
11
11
  import { g as getClassMap } from './theme-DaJxRxSQ.js';
12
12
  import { e as deepReady, w as waitForMount } from './index-CGthURny.js';
13
13
  import { w as win, b as getIonMode, c as getIonTheme } from './ionic-global-CAZb-5i-.js';
@@ -126,6 +126,104 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
126
126
  StatusBar.setStyle({ style: defaultStyle });
127
127
  };
128
128
 
129
+ const createSheetEnterAnimation = (opts) => {
130
+ const { currentBreakpoint, backdropBreakpoint, expandToScroll, staticBackdropOpacity } = opts;
131
+ /**
132
+ * If the backdropBreakpoint is undefined, then the backdrop
133
+ * should always fade in. If the backdropBreakpoint came before the
134
+ * current breakpoint, then the backdrop should be fading in.
135
+ */
136
+ const shouldShowBackdrop = backdropBreakpoint === undefined || backdropBreakpoint < currentBreakpoint;
137
+ let initialBackdrop = '0';
138
+ if (staticBackdropOpacity) {
139
+ initialBackdrop = 'calc(var(--backdrop-opacity)';
140
+ }
141
+ else if (shouldShowBackdrop) {
142
+ initialBackdrop = `calc(var(--backdrop-opacity) * ${currentBreakpoint})`;
143
+ }
144
+ const backdropAnimation = createAnimation('backdropAnimation').fromTo('opacity', 0, initialBackdrop);
145
+ if (shouldShowBackdrop) {
146
+ backdropAnimation
147
+ .beforeStyles({
148
+ 'pointer-events': 'none',
149
+ })
150
+ .afterClearStyles(['pointer-events']);
151
+ }
152
+ const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
153
+ { offset: 0, opacity: 1, transform: 'translateY(100%)' },
154
+ { offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
155
+ ]);
156
+ /**
157
+ * This allows the content to be scrollable at any breakpoint.
158
+ */
159
+ const contentAnimation = !expandToScroll
160
+ ? createAnimation('contentAnimation').keyframes([
161
+ { offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
162
+ { offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
163
+ ])
164
+ : undefined;
165
+ return { wrapperAnimation, backdropAnimation, contentAnimation };
166
+ };
167
+ const createSheetLeaveAnimation = (opts) => {
168
+ const { currentBreakpoint, backdropBreakpoint } = opts;
169
+ /**
170
+ * Backdrop does not always fade in from 0 to 1 if backdropBreakpoint
171
+ * is defined, so we need to account for that offset by figuring out
172
+ * what the current backdrop value should be.
173
+ */
174
+ const backdropValue = `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(currentBreakpoint, backdropBreakpoint)})`;
175
+ const defaultBackdrop = [
176
+ { offset: 0, opacity: backdropValue },
177
+ { offset: 1, opacity: 0 },
178
+ ];
179
+ const customBackdrop = [
180
+ { offset: 0, opacity: backdropValue },
181
+ { offset: backdropBreakpoint, opacity: 0 },
182
+ { offset: 1, opacity: 0 },
183
+ ];
184
+ const backdropAnimation = createAnimation('backdropAnimation').keyframes(backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop);
185
+ const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
186
+ { offset: 0, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
187
+ { offset: 1, opacity: 1, transform: `translateY(100%)` },
188
+ ]);
189
+ return { wrapperAnimation, backdropAnimation };
190
+ };
191
+
192
+ const createEnterAnimation$2 = () => {
193
+ const backdropAnimation = createAnimation()
194
+ .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
195
+ .beforeStyles({
196
+ 'pointer-events': 'none',
197
+ })
198
+ .afterClearStyles(['pointer-events']);
199
+ const wrapperAnimation = createAnimation().keyframes([
200
+ { offset: 0, opacity: 0.01, transform: 'translateY(40px)' },
201
+ { offset: 1, opacity: 1, transform: `translateY(0px)` },
202
+ ]);
203
+ return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
204
+ };
205
+ /**
206
+ * Ionic Modal Enter Animation
207
+ */
208
+ const ionicEnterAnimation = (baseEl, opts) => {
209
+ const { currentBreakpoint, expandToScroll } = opts;
210
+ const root = getElementRoot(baseEl);
211
+ const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation$2();
212
+ backdropAnimation.addElement(root.querySelector('ion-backdrop'));
213
+ wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
214
+ // The content animation is only added if scrolling is enabled for
215
+ // all the breakpoints.
216
+ !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
217
+ backdropAnimation.duration(300).easing('ease-out');
218
+ wrapperAnimation.duration(400).easing('cubic-bezier(0.32, 0.68, 0, 1)');
219
+ contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.duration(400).easing('cubic-bezier(0.32, 0.68, 0, 1)');
220
+ const baseAnimation = createAnimation().addElement(baseEl).addAnimation([backdropAnimation, wrapperAnimation]);
221
+ if (contentAnimation) {
222
+ baseAnimation.addAnimation(contentAnimation);
223
+ }
224
+ return baseAnimation;
225
+ };
226
+
129
227
  const handleCanDismiss = async (el, animation) => {
130
228
  /**
131
229
  * If canDismiss is not a function
@@ -552,69 +650,6 @@ const calculateProgress = (el, deltaY) => {
552
650
  return Math.max(0, Math.min(1, roundedProgress));
553
651
  };
554
652
 
555
- const createSheetEnterAnimation = (opts) => {
556
- const { currentBreakpoint, backdropBreakpoint, expandToScroll, staticBackdropOpacity } = opts;
557
- /**
558
- * If the backdropBreakpoint is undefined, then the backdrop
559
- * should always fade in. If the backdropBreakpoint came before the
560
- * current breakpoint, then the backdrop should be fading in.
561
- */
562
- const shouldShowBackdrop = backdropBreakpoint === undefined || backdropBreakpoint < currentBreakpoint;
563
- let initialBackdrop = '0';
564
- if (staticBackdropOpacity) {
565
- initialBackdrop = 'calc(var(--backdrop-opacity)';
566
- }
567
- else if (shouldShowBackdrop) {
568
- initialBackdrop = `calc(var(--backdrop-opacity) * ${currentBreakpoint})`;
569
- }
570
- const backdropAnimation = createAnimation('backdropAnimation').fromTo('opacity', 0, initialBackdrop);
571
- if (shouldShowBackdrop) {
572
- backdropAnimation
573
- .beforeStyles({
574
- 'pointer-events': 'none',
575
- })
576
- .afterClearStyles(['pointer-events']);
577
- }
578
- const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
579
- { offset: 0, opacity: 1, transform: 'translateY(100%)' },
580
- { offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
581
- ]);
582
- /**
583
- * This allows the content to be scrollable at any breakpoint.
584
- */
585
- const contentAnimation = !expandToScroll
586
- ? createAnimation('contentAnimation').keyframes([
587
- { offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
588
- { offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
589
- ])
590
- : undefined;
591
- return { wrapperAnimation, backdropAnimation, contentAnimation };
592
- };
593
- const createSheetLeaveAnimation = (opts) => {
594
- const { currentBreakpoint, backdropBreakpoint } = opts;
595
- /**
596
- * Backdrop does not always fade in from 0 to 1 if backdropBreakpoint
597
- * is defined, so we need to account for that offset by figuring out
598
- * what the current backdrop value should be.
599
- */
600
- const backdropValue = `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(currentBreakpoint, backdropBreakpoint)})`;
601
- const defaultBackdrop = [
602
- { offset: 0, opacity: backdropValue },
603
- { offset: 1, opacity: 0 },
604
- ];
605
- const customBackdrop = [
606
- { offset: 0, opacity: backdropValue },
607
- { offset: backdropBreakpoint, opacity: 0 },
608
- { offset: 1, opacity: 0 },
609
- ];
610
- const backdropAnimation = createAnimation('backdropAnimation').keyframes(backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop);
611
- const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
612
- { offset: 0, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
613
- { offset: 1, opacity: 1, transform: `translateY(100%)` },
614
- ]);
615
- return { wrapperAnimation, backdropAnimation };
616
- };
617
-
618
653
  const createEnterAnimation$1 = () => {
619
654
  const backdropAnimation = createAnimation()
620
655
  .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
@@ -1005,16 +1040,16 @@ const mdLeaveAnimation = (baseEl, opts) => {
1005
1040
  return baseAnimation;
1006
1041
  };
1007
1042
 
1008
- const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, staticBackdropOpacity, onDragStart, onDragMove, onDragEnd) => {
1043
+ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, isIonicTheme, onDragStart, onDragMove, onDragEnd) => {
1009
1044
  // Defaults for the sheet swipe animation
1010
1045
  const defaultBackdrop = [
1011
1046
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
1012
- { offset: 1, opacity: staticBackdropOpacity ? 'var(--backdrop-opacity)' : 0.01 },
1047
+ { offset: 1, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0.01 },
1013
1048
  ];
1014
1049
  const customBackdrop = [
1015
1050
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
1016
- { offset: 1 - backdropBreakpoint, opacity: staticBackdropOpacity ? 'var(--backdrop-opacity)' : 0 },
1017
- { offset: 1, opacity: staticBackdropOpacity ? 'var(--backdrop-opacity)' : 0 },
1051
+ { offset: 1 - backdropBreakpoint, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0 },
1052
+ { offset: 1, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0 },
1018
1053
  ];
1019
1054
  const SheetDefaults = {
1020
1055
  WRAPPER_KEYFRAMES: [
@@ -1337,7 +1372,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1337
1372
  : step;
1338
1373
  offset = clamp(0.0001, processedStep, maxStep);
1339
1374
  animation.progressStep(offset);
1340
- const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1375
+ const snapBreakpoint = isIonicTheme
1376
+ ? calculateIonicSnapBreakpoint(detail.deltaY, detail.velocityY, detail.currentY)
1377
+ : calculateSnapBreakpoint(detail.deltaY);
1341
1378
  const eventDetail = {
1342
1379
  currentY: detail.currentY,
1343
1380
  deltaY: detail.deltaY,
@@ -1348,7 +1385,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1348
1385
  onDragMove(eventDetail);
1349
1386
  };
1350
1387
  const onEnd = (detail) => {
1351
- const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
1388
+ const snapBreakpoint = isIonicTheme
1389
+ ? calculateIonicSnapBreakpoint(detail.deltaY, detail.velocityY, detail.currentY)
1390
+ : calculateSnapBreakpoint(detail.deltaY);
1352
1391
  const eventDetail = {
1353
1392
  currentY: detail.currentY,
1354
1393
  deltaY: detail.deltaY,
@@ -1395,6 +1434,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1395
1434
  */
1396
1435
  const shouldPreventDismiss = canDismiss && breakpoint === 0;
1397
1436
  const snapToBreakpoint = shouldPreventDismiss ? currentBreakpoint : breakpoint;
1437
+ /**
1438
+ * Detect snap-back behavior: when the snap target is the same as the current breakpoint,
1439
+ * the user released before crossing the threshold to a new breakpoint.
1440
+ * Apply different timing and easing for snap-back vs. snap-to-new.
1441
+ */
1442
+ const isSnapBack = snapToBreakpoint === currentBreakpoint;
1443
+ const duration = isIonicTheme ? (isSnapBack ? 300 : 400) : 500;
1444
+ const easing = isSnapBack ? 'cubic-bezier(0.34, 1.4, 0.64, 1)' : 'cubic-bezier(0.32, 0.68, 0, 1)';
1398
1445
  const shouldRemainOpen = snapToBreakpoint !== 0;
1399
1446
  currentBreakpoint = 0;
1400
1447
  /**
@@ -1409,13 +1456,13 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1409
1456
  backdropAnimation.keyframes([
1410
1457
  {
1411
1458
  offset: 0,
1412
- opacity: staticBackdropOpacity
1459
+ opacity: isIonicTheme
1413
1460
  ? 'var(--backdrop-opacity)'
1414
1461
  : `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(1 - breakpointOffset, backdropBreakpoint)})`,
1415
1462
  },
1416
1463
  {
1417
1464
  offset: 1,
1418
- opacity: staticBackdropOpacity
1465
+ opacity: isIonicTheme
1419
1466
  ? 'var(--backdrop-opacity)'
1420
1467
  : `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(snapToBreakpoint, backdropBreakpoint)})`,
1421
1468
  },
@@ -1435,6 +1482,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1435
1482
  }
1436
1483
  animation.progressStep(0);
1437
1484
  }
1485
+ /**
1486
+ * Apply the appropriate easing curve for this snap behavior.
1487
+ */
1488
+ if (isIonicTheme) {
1489
+ animation.easing(easing);
1490
+ }
1438
1491
  /**
1439
1492
  * Gesture should remain disabled until the
1440
1493
  * snapping animation completes.
@@ -1524,7 +1577,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1524
1577
  * be added every time onEnd runs.
1525
1578
  */
1526
1579
  }, { oneTimeCallback: true })
1527
- .progressEnd(1, 0, animated ? 500 : 0);
1580
+ .progressEnd(1, 0, animated ? duration : 0);
1528
1581
  });
1529
1582
  };
1530
1583
  /**
@@ -1555,6 +1608,50 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1555
1608
  });
1556
1609
  return snapBreakpoint;
1557
1610
  };
1611
+ /**
1612
+ * Calculates the Ionic-specific snap breakpoint using velocity-based logic.
1613
+ * This provides a more intuitive and responsive sheet behavior for the Ionic theme.
1614
+ *
1615
+ * Rules:
1616
+ * 1. Fast downward flick (> 500 px/s) always dismisses, regardless of position
1617
+ * 2. Fast upward flick (> 400 px/s) snaps to the next breakpoint above
1618
+ * 3. If dragged 40% below current snap point without fast upward flick, dismisses
1619
+ * 4. Otherwise, falls back to position-based snap (closest breakpoint)
1620
+ *
1621
+ * @param deltaY The change in Y position since gesture started
1622
+ * @param velocityY The velocity in pixels per millisecond
1623
+ * @param currentY The current Y position of the gesture
1624
+ * @returns The snap breakpoint value
1625
+ */
1626
+ const calculateIonicSnapBreakpoint = (deltaY, velocityY, currentY) => {
1627
+ // Convert velocity from px/ms to px/s for easier threshold comparison
1628
+ const velocityYPerSecond = velocityY * 1000;
1629
+ // Calculate current progress (0 = fully closed, 1 = fully expanded)
1630
+ const currentProgress = calculateProgress(currentY);
1631
+ // Rule 1: Fast downward flick always dismisses
1632
+ if (velocityYPerSecond > 500) {
1633
+ return minBreakpoint;
1634
+ }
1635
+ // Rule 2: Fast upward flick moves to next breakpoint above
1636
+ if (velocityYPerSecond < -400) {
1637
+ // Find next breakpoint above current position
1638
+ const nextBreakpoint = breakpoints.find((bp) => bp > currentProgress);
1639
+ // If no breakpoint above, stay at max breakpoint
1640
+ return nextBreakpoint !== null && nextBreakpoint !== void 0 ? nextBreakpoint : maxBreakpoint;
1641
+ }
1642
+ // Rule 3: 40% dismissal rule (only if not flicking up and 0 breakpoint exists)
1643
+ if (minBreakpoint === 0 && currentBreakpoint > 0) {
1644
+ // Calculate how far we've moved below the current snap point
1645
+ const distanceBelowSnap = currentBreakpoint - currentProgress;
1646
+ const percentageBelowSnap = distanceBelowSnap / currentBreakpoint;
1647
+ // If dragged more than 40% below and not flicking up, dismiss
1648
+ if (percentageBelowSnap > 0.4 && velocityYPerSecond <= 400) {
1649
+ return 0;
1650
+ }
1651
+ }
1652
+ // Rule 4: Fallback to position-based snap (existing logic)
1653
+ return calculateSnapBreakpoint(deltaY);
1654
+ };
1558
1655
  /**
1559
1656
  * Calculates the progress of the swipe gesture.
1560
1657
  *
@@ -1803,7 +1900,7 @@ const clearSafeAreaOverrides = (hostEl) => {
1803
1900
  hostEl.style.removeProperty('--ion-safe-area-right');
1804
1901
  };
1805
1902
 
1806
- const modalIonicCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--token-bg-surface-default, var(--token-primitives-base-white, #ffffff));--box-shadow:var(--token-elevation-3, 0px 2px 7px 0px rgba(0, 0, 0, 0.05), 0px 6px 32px 0px rgba(0, 0, 0, 0.16));--backdrop-opacity:1;color:var(--token-text-default, var(--token-primitives-neutral-1200, #242424))}:host(.modal-round){--border-radius:var(--token-border-radius-1000, var(--token-scale-1000, 40px))}:host(.modal-soft){--border-radius:var(--token-border-radius-400, var(--token-scale-400, 16px))}:host(.modal-rectangular){--border-radius:var(--token-border-radius-0, var(--token-scale-0, 0px))}:host(.select-modal.modal-default){--max-height:45%;--max-width:calc(100% - (var(--token-space-400, var(--token-scale-400, 16px)) * 2));--min-height:340px}.modal-handle{right:0px;left:0px;top:var(--token-space-300, var(--token-scale-300, 12px));border-radius:var(--token-border-radius-100, var(--token-scale-100, 4px));width:var(--token-scale-1100, 44px);height:var(--token-scale-100, 4px);background-color:var(--token-primitives-neutral-300, #e0e0e0)}.modal-handle::before{-webkit-padding-start:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-start:var(--token-space-100, var(--token-scale-100, 4px));-webkit-padding-end:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-end:var(--token-space-100, var(--token-scale-100, 4px));padding-top:var(--token-space-100, var(--token-scale-100, 4px));padding-bottom:var(--token-space-100, var(--token-scale-100, 4px))}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + var(--token-scale-250, 10px)))}`;
1903
+ const modalIonicCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--token-bg-surface-default, var(--token-primitives-base-white, #ffffff));--box-shadow:var(--token-elevation-3, 0px 2px 7px 0px rgba(0, 0, 0, 0.05), 0px 6px 32px 0px rgba(0, 0, 0, 0.16));--backdrop-opacity:0.7;color:var(--token-text-default, var(--token-primitives-neutral-1200, #242424))}:host(.modal-round){--border-radius:var(--token-border-radius-1000, var(--token-scale-1000, 40px))}:host(.modal-soft){--border-radius:var(--token-border-radius-400, var(--token-scale-400, 16px))}:host(.modal-rectangular){--border-radius:var(--token-border-radius-0, var(--token-scale-0, 0px))}:host(.select-modal.modal-default){--max-height:45%;--max-width:calc(100% - (var(--token-space-400, var(--token-scale-400, 16px)) * 2));--min-height:340px}.modal-handle{right:0px;left:0px;top:var(--token-space-300, var(--token-scale-300, 12px));border-radius:var(--token-border-radius-100, var(--token-scale-100, 4px));width:var(--token-scale-1100, 44px);height:var(--token-scale-100, 4px);background-color:var(--token-primitives-neutral-300, #e0e0e0)}.modal-handle::before{-webkit-padding-start:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-start:var(--token-space-100, var(--token-scale-100, 4px));-webkit-padding-end:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-end:var(--token-space-100, var(--token-scale-100, 4px));padding-top:var(--token-space-100, var(--token-scale-100, 4px));padding-bottom:var(--token-space-100, var(--token-scale-100, 4px))}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + var(--token-scale-250, 10px)))}`;
1807
1904
 
1808
1905
  const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--ion-background-color, #fff);--border-radius:0;--backdrop-opacity:0;color:var(--ion-text-color, #000)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{right:0px;left:0px;top:5px;border-radius:8px;width:36px;height:5px;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be))}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;width:36px;height:5px}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
1809
1906
 
@@ -2243,7 +2340,7 @@ const Modal = class {
2243
2340
  this.statusBarStyle = await StatusBar.getStyle();
2244
2341
  setCardStatusBarDark();
2245
2342
  }
2246
- await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
2343
+ await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, ionicEnterAnimation, {
2247
2344
  presentingEl: presentingElement,
2248
2345
  currentBreakpoint: this.initialBreakpoint,
2249
2346
  backdropBreakpoint: this.backdropBreakpoint,
@@ -2930,20 +3027,20 @@ const Modal = class {
2930
3027
  const isHandleCycle = handleBehavior === 'cycle';
2931
3028
  const shape = this.getShape();
2932
3029
  const isSheetModalWithHandle = isSheetModal && showHandle;
2933
- return (h(Host, Object.assign({ key: '4b323edb66d28260c34b31fd2af8f4ae53a7ef90', "no-router": true,
3030
+ return (h(Host, Object.assign({ key: '3011c8f49c1ccb6c20c01db35b59fe4f6e22ec01', "no-router": true,
2934
3031
  // Allow the modal to be navigable when the handle is focusable
2935
3032
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
2936
3033
  zIndex: `${20000 + this.overlayIndex}`,
2937
- }, class: Object.assign({ [theme]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-${shape}`]: shape !== undefined, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '6059e348dc3d020f995577dde1b7949bdb2c0f2f', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), theme === 'ios' && h("div", { key: '5a08a99dfc3de51ac7516fc76fdba3672f84db71', class: "modal-shadow" }), h("div", Object.assign({ key: 'a7a841a5b2f740fbf576b82b82782aa235b701ee',
3034
+ }, class: Object.assign({ [theme]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-${shape}`]: shape !== undefined, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: 'ab99fb4ff1b335b06d5676890012dfe3cd1a1a01', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), theme === 'ios' && h("div", { key: '95d4c79c4455c6a5ae6d581fa9dfaabdbee8c567', class: "modal-shadow" }), h("div", Object.assign({ key: '2d7d2406cdb986c69ef52708d33eca67d8a877f8',
2938
3035
  /*
2939
3036
  role and aria-modal must be used on the
2940
3037
  same element. They must also be set inside the
2941
3038
  shadow DOM otherwise ion-button will not be highlighted
2942
3039
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
2943
3040
  */
2944
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'ca5567e9ab3e9e80b41314d396106faf2da09ffe', class: "modal-handle",
3041
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'ccec8bfc314763bd6dd868b69fbfdc085f5957c9', class: "modal-handle",
2945
3042
  // Prevents the handle from receiving keyboard focus when it does not cycle
2946
- 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: 'da5471ea4292166798d3f949e79e7b3e55a0e83f', onSlotchange: this.onSlotChange }))));
3043
+ 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: '38469e3447b46983783627d697e12cadcef614fa', onSlotchange: this.onSlotChange }))));
2947
3044
  }
2948
3045
  get el() { return getElement(this); }
2949
3046
  static get watchers() { return {
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { r as registerInstance, c as createEvent, f as printIonWarning, h, d as Host, g as getElement } from './index-Omi_TcwW.js';
5
- import { B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, n as focusFirstDescendant, g as dismiss, h as eventMethod, F as FOCUS_TRAP_DISABLE_CLASS } from './overlays-CvFHfO3y.js';
5
+ import { B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, n as focusFirstDescendant, g as dismiss, h as eventMethod, F as FOCUS_TRAP_DISABLE_CLASS } from './overlays-VA-4NWjf.js';
6
6
  import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-CjVwn_KZ.js';
7
7
  import { g as getElementRoot, r as raf, f as addEventListener, h as hasLazyBuild } from './helpers-Do7zwvM1.js';
8
8
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
@@ -830,6 +830,92 @@ const shouldShowArrow = (side, didAdjustBounds = false, ev, trigger) => {
830
830
  return true;
831
831
  };
832
832
 
833
+ const POPOVER_MD_BODY_PADDING$1 = 12;
834
+ /**
835
+ * Ionic Popover Enter Animation
836
+ */
837
+ // TODO(FW-2832): types
838
+ const ionicEnterAnimation = (baseEl, opts) => {
839
+ var _a;
840
+ const { event: ev, size, trigger, reference, side, align } = opts;
841
+ const doc = baseEl.ownerDocument;
842
+ const isRTL = doc.dir === 'rtl';
843
+ const bodyWidth = doc.defaultView.innerWidth;
844
+ const bodyHeight = doc.defaultView.innerHeight;
845
+ const root = getElementRoot(baseEl);
846
+ const contentEl = root.querySelector('.popover-content');
847
+ const referenceSizeEl = trigger || ((_a = ev === null || ev === void 0 ? void 0 : ev.detail) === null || _a === void 0 ? void 0 : _a.ionShadowTarget) || (ev === null || ev === void 0 ? void 0 : ev.target);
848
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
849
+ const defaultPosition = {
850
+ top: bodyHeight / 2 - contentHeight / 2,
851
+ left: bodyWidth / 2 - contentWidth / 2,
852
+ originX: isRTL ? 'right' : 'left',
853
+ originY: 'top',
854
+ };
855
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
856
+ const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING$1;
857
+ // MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas).
858
+ // This is needed for Android edge-to-edge (API 36+) where system bars overlap content.
859
+ const safeArea = size === 'cover' ? { top: 0, bottom: 0, left: 0, right: 0 } : getSafeAreaInsets(doc);
860
+ const { originX, originY, top, left, bottom, checkSafeAreaLeft, checkSafeAreaRight, checkSafeAreaTop, checkSafeAreaBottom, addPopoverBottomClass, } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, safeArea, results.originX, results.originY, results.referenceCoordinates);
861
+ const safeAreaLeftCalc = ' + var(--ion-safe-area-left, 0px)';
862
+ const safeAreaRightCalc = ' - var(--ion-safe-area-right, 0px)';
863
+ let leftValue = `${left}px`;
864
+ if (checkSafeAreaLeft) {
865
+ leftValue = `${left}px${safeAreaLeftCalc}`;
866
+ }
867
+ if (checkSafeAreaRight) {
868
+ leftValue = `${left}px${safeAreaRightCalc}`;
869
+ }
870
+ let topValue = `${top}px`;
871
+ if (checkSafeAreaTop) {
872
+ topValue = `${top}px + var(--ion-safe-area-top, 0px)`;
873
+ }
874
+ const baseAnimation = createAnimation();
875
+ const backdropAnimation = createAnimation();
876
+ const wrapperAnimation = createAnimation();
877
+ const contentAnimation = createAnimation();
878
+ const viewportAnimation = createAnimation();
879
+ backdropAnimation
880
+ .addElement(root.querySelector('ion-backdrop'))
881
+ .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
882
+ .beforeStyles({
883
+ 'pointer-events': 'none',
884
+ })
885
+ .afterClearStyles(['pointer-events']);
886
+ wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).duration(150).fromTo('opacity', 0.01, 1);
887
+ contentAnimation
888
+ .addElement(contentEl)
889
+ .beforeStyles({
890
+ top: `calc(${topValue} + var(--offset-y, 0px))`,
891
+ left: `calc(${leftValue} + var(--offset-x, 0px))`,
892
+ 'transform-origin': `${originY} ${originX}`,
893
+ })
894
+ .beforeAddWrite(() => {
895
+ if (bottom !== undefined) {
896
+ let bottomValue = `${bottom}px`;
897
+ if (checkSafeAreaBottom) {
898
+ bottomValue = `${bottom}px + var(--ion-safe-area-bottom, 0px)`;
899
+ }
900
+ contentEl.style.setProperty('bottom', `calc(${bottomValue})`);
901
+ }
902
+ })
903
+ .fromTo('transform', 'scale(0.8)', 'scale(1)');
904
+ viewportAnimation.addElement(root.querySelector('.popover-viewport')).fromTo('opacity', 0.01, 1);
905
+ return baseAnimation
906
+ .easing('cubic-bezier(0.36,0.66,0.04,1)')
907
+ .duration(300)
908
+ .beforeAddWrite(() => {
909
+ if (size === 'cover') {
910
+ baseEl.style.setProperty('--width', `${contentWidth}px`);
911
+ }
912
+ if (addPopoverBottomClass) {
913
+ baseEl.classList.add('popover-bottom');
914
+ }
915
+ })
916
+ .addAnimation([backdropAnimation, wrapperAnimation, contentAnimation, viewportAnimation]);
917
+ };
918
+
833
919
  const POPOVER_IOS_BODY_PADDING = 5;
834
920
  /**
835
921
  * Minimum edge margin for iOS popovers ensures visual spacing from screen
@@ -1434,7 +1520,7 @@ const Popover = class {
1434
1520
  else if (!this.keepContentsMounted) {
1435
1521
  await waitForMount();
1436
1522
  }
1437
- await present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, {
1523
+ await present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, ionicEnterAnimation, {
1438
1524
  event: event || this.event,
1439
1525
  size: this.size,
1440
1526
  trigger: this.triggerEl,
@@ -1543,9 +1629,9 @@ const Popover = class {
1543
1629
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
1544
1630
  const desktop = isPlatform('desktop');
1545
1631
  const enableArrow = arrow && !parentPopover;
1546
- return (h(Host, Object.assign({ key: 'cc70f9b037b16ea78b999916106a1062ceb74cb6', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
1632
+ return (h(Host, Object.assign({ key: '398b4c72cfea89fb743d427e3c2b48507649aff1', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
1547
1633
  zIndex: `${20000 + this.overlayIndex}`,
1548
- }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: 'e641e7ee28cbd54911ec3f8c0bfd9d7e3f2e85cd', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '750494585c3524b27e42d79f02e729f3eff9e660', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '2e49b4ad1287e31a3cdbfebc91120405a998dc95', class: "popover-arrow", part: "arrow" }), h("div", { key: '306586776e74acab787b2a96433553005bca580d', class: "popover-content", part: "content" }, h("slot", { key: '0273c0975cd7dc37db5cfa0b91d418867a77c4d8' })))));
1634
+ }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: '6baec0b33665557c55425ffad9c6b31741c25651', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '6ce3a61164f478560cc45c618fc5b7f62b491ecd', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: 'a36815fc0417a10fb350429909a79cb4025baf3a', class: "popover-arrow", part: "arrow" }), h("div", { key: 'cec3436cdb2cb6fa839c37abb3cb6daf7de453de', class: "popover-content", part: "content" }, h("slot", { key: '5405fb03bab017acd7fa09d00cfe1b7cfbdfae92' })))));
1549
1635
  }
1550
1636
  get el() { return getElement(this); }
1551
1637
  static get watchers() { return {