@ionic/core 7.3.4-dev.11699470772.1dad7e66 → 7.3.4-dev.11699991837.1bc64f72

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 (150) hide show
  1. package/components/button-active.js +1 -1
  2. package/components/checkbox.js +6 -3
  3. package/components/data.js +31 -7
  4. package/components/index.js +2 -2
  5. package/components/index2.js +203 -429
  6. package/components/index3.js +429 -203
  7. package/components/ion-datetime-button.js +3 -0
  8. package/components/ion-datetime.js +132 -92
  9. package/components/ion-item-sliding.js +1 -1
  10. package/components/ion-menu.js +3 -3
  11. package/components/ion-modal.js +2 -2
  12. package/components/ion-nav.js +1 -1
  13. package/components/ion-range.js +3 -3
  14. package/components/ion-refresher.js +3 -3
  15. package/components/ion-reorder-group.js +1 -1
  16. package/components/ion-router-outlet.js +1 -1
  17. package/components/ion-segment.js +1 -1
  18. package/components/ion-toggle.js +7 -4
  19. package/components/ion-toolbar.js +2 -2
  20. package/components/ios.transition.js +1 -1
  21. package/components/md.transition.js +1 -1
  22. package/components/picker-column.js +1 -1
  23. package/components/popover.js +1 -1
  24. package/components/radio.js +6 -3
  25. package/components/swipe-back.js +1 -1
  26. package/dist/cjs/{data-967b9c15.js → data-db832785.js} +31 -7
  27. package/dist/cjs/index.cjs.js +10 -9
  28. package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
  29. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
  30. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -1
  31. package/dist/cjs/ion-datetime_3.cjs.entry.js +132 -93
  32. package/dist/cjs/ion-menu_3.cjs.entry.js +2 -2
  33. package/dist/cjs/ion-radio_2.cjs.entry.js +5 -3
  34. package/dist/cjs/ion-range.cjs.entry.js +2 -2
  35. package/dist/cjs/ion-toggle.cjs.entry.js +5 -3
  36. package/dist/cjs/ionic.cjs.js +1 -1
  37. package/dist/cjs/loader.cjs.js +1 -1
  38. package/dist/collection/components/checkbox/checkbox.ios.css +35 -0
  39. package/dist/collection/components/checkbox/checkbox.js +24 -4
  40. package/dist/collection/components/checkbox/checkbox.md.css +35 -0
  41. package/dist/collection/components/checkbox/test/item/checkbox.e2e.js +13 -0
  42. package/dist/collection/components/checkbox/test/label/checkbox.e2e.js +16 -0
  43. package/dist/collection/components/datetime/datetime.ios.css +32 -29
  44. package/dist/collection/components/datetime/datetime.js +137 -93
  45. package/dist/collection/components/datetime/datetime.md.css +20 -28
  46. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +25 -0
  47. package/dist/collection/components/datetime/test/color/datetime.e2e.js +1 -1
  48. package/dist/collection/components/datetime/test/custom/datetime.e2e.js +27 -1
  49. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +15 -0
  50. package/dist/collection/components/datetime/test/set-value/datetime.e2e.js +9 -12
  51. package/dist/collection/components/datetime/utils/data.js +14 -6
  52. package/dist/collection/components/datetime/utils/parse.js +18 -1
  53. package/dist/collection/components/datetime-button/datetime-button.js +3 -0
  54. package/dist/collection/components/menu/menu.ios.css +94 -0
  55. package/dist/collection/components/menu/menu.md.css +94 -0
  56. package/dist/collection/components/radio/radio.ios.css +35 -0
  57. package/dist/collection/components/radio/radio.js +24 -4
  58. package/dist/collection/components/radio/radio.md.css +35 -0
  59. package/dist/collection/components/radio/test/item/radio.e2e.js +15 -0
  60. package/dist/collection/components/radio/test/label-placement/radio.e2e.js +20 -0
  61. package/dist/collection/components/range/range.ios.css +41 -1
  62. package/dist/collection/components/range/range.js +3 -3
  63. package/dist/collection/components/range/range.md.css +41 -1
  64. package/dist/collection/components/range/test/label/range.e2e.js +48 -0
  65. package/dist/collection/components/toggle/test/item/toggle.e2e.js +15 -0
  66. package/dist/collection/components/toggle/test/label/toggle.e2e.js +16 -0
  67. package/dist/collection/components/toggle/toggle.ios.css +35 -1
  68. package/dist/collection/components/toggle/toggle.js +24 -4
  69. package/dist/collection/components/toggle/toggle.md.css +35 -1
  70. package/dist/collection/components/toolbar/toolbar.ios.css +2 -4
  71. package/dist/collection/components/toolbar/toolbar.md.css +2 -4
  72. package/dist/collection/index.js +1 -0
  73. package/dist/docs.json +147 -18
  74. package/dist/esm/{data-4b448e3a.js → data-009dbf15.js} +31 -7
  75. package/dist/esm/index.js +2 -2
  76. package/dist/esm/ion-app_8.entry.js +2 -2
  77. package/dist/esm/ion-checkbox.entry.js +5 -3
  78. package/dist/esm/ion-datetime-button.entry.js +4 -1
  79. package/dist/esm/ion-datetime_3.entry.js +132 -93
  80. package/dist/esm/ion-menu_3.entry.js +2 -2
  81. package/dist/esm/ion-radio_2.entry.js +5 -3
  82. package/dist/esm/ion-range.entry.js +2 -2
  83. package/dist/esm/ion-toggle.entry.js +5 -3
  84. package/dist/esm/ionic.js +1 -1
  85. package/dist/esm/loader.js +1 -1
  86. package/dist/esm-es5/data-009dbf15.js +4 -0
  87. package/dist/esm-es5/index.js +1 -1
  88. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  89. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  90. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  91. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  92. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  93. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  94. package/dist/esm-es5/ion-range.entry.js +1 -1
  95. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  96. package/dist/esm-es5/ionic.js +1 -1
  97. package/dist/esm-es5/loader.js +1 -1
  98. package/dist/html.html-data.json +52 -4
  99. package/dist/ionic/index.esm.js +1 -1
  100. package/dist/ionic/ionic.esm.js +1 -1
  101. package/dist/ionic/p-06902103.system.js +1 -1
  102. package/dist/ionic/p-1f4adf06.system.entry.js +4 -0
  103. package/dist/ionic/p-218b6f33.entry.js +4 -0
  104. package/dist/ionic/p-2da6ba37.system.entry.js +4 -0
  105. package/dist/ionic/p-40138199.entry.js +4 -0
  106. package/dist/ionic/p-44ef7224.system.js +4 -0
  107. package/dist/ionic/p-4ca1ce6b.system.entry.js +4 -0
  108. package/dist/ionic/p-51b165af.system.js +4 -0
  109. package/dist/ionic/p-57f0efcc.entry.js +4 -0
  110. package/dist/ionic/{p-d3b8aebf.entry.js → p-67b891af.entry.js} +1 -1
  111. package/dist/ionic/p-7cfd253c.js +4 -0
  112. package/dist/ionic/p-82f5c07e.system.entry.js +4 -0
  113. package/dist/ionic/p-86c5c320.entry.js +4 -0
  114. package/dist/ionic/p-90ec5785.system.entry.js +4 -0
  115. package/dist/ionic/{p-45ee211b.system.entry.js → p-a34669bf.system.entry.js} +1 -1
  116. package/dist/ionic/p-af986299.system.entry.js +4 -0
  117. package/dist/ionic/p-b321c999.entry.js +4 -0
  118. package/dist/ionic/p-d8a0267b.system.entry.js +4 -0
  119. package/dist/ionic/p-f5c19164.entry.js +4 -0
  120. package/dist/ionic/{p-c759a704.entry.js → p-f9567c67.entry.js} +1 -1
  121. package/dist/types/components/checkbox/checkbox.d.ts +8 -1
  122. package/dist/types/components/datetime/datetime.d.ts +23 -10
  123. package/dist/types/components/datetime/utils/data.d.ts +1 -1
  124. package/dist/types/components/datetime/utils/parse.d.ts +3 -3
  125. package/dist/types/components/radio/radio.d.ts +8 -1
  126. package/dist/types/components/range/range.d.ts +2 -1
  127. package/dist/types/components/toast/toast-interface.d.ts +3 -0
  128. package/dist/types/components/toggle/toggle.d.ts +8 -1
  129. package/dist/types/components.d.ts +40 -16
  130. package/dist/types/index.d.ts +1 -0
  131. package/dist/types/interface.d.ts +1 -0
  132. package/hydrate/index.js +196 -114
  133. package/package.json +2 -2
  134. package/dist/esm-es5/data-4b448e3a.js +0 -4
  135. package/dist/ionic/p-0053fe81.system.entry.js +0 -4
  136. package/dist/ionic/p-091cd81e.entry.js +0 -4
  137. package/dist/ionic/p-28f5715a.system.entry.js +0 -4
  138. package/dist/ionic/p-2cdcd6f2.entry.js +0 -4
  139. package/dist/ionic/p-5009cb46.entry.js +0 -4
  140. package/dist/ionic/p-5b88f780.entry.js +0 -4
  141. package/dist/ionic/p-601fd53c.js +0 -4
  142. package/dist/ionic/p-8843b046.system.js +0 -4
  143. package/dist/ionic/p-98b618ce.system.entry.js +0 -4
  144. package/dist/ionic/p-b1e8f045.entry.js +0 -4
  145. package/dist/ionic/p-b3394798.system.entry.js +0 -4
  146. package/dist/ionic/p-b3cfc6e1.system.entry.js +0 -4
  147. package/dist/ionic/p-cc8910e7.system.js +0 -4
  148. package/dist/ionic/p-e53b8af4.system.entry.js +0 -4
  149. package/dist/ionic/p-f78e60a5.entry.js +0 -4
  150. package/dist/ionic/p-fd42994b.system.entry.js +0 -4
@@ -1,457 +1,231 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { G as GESTURE_CONTROLLER } from './gesture-controller.js';
5
- export { G as GESTURE_CONTROLLER } from './gesture-controller.js';
4
+ import { writeTask, Build } from '@stencil/core/internal/client';
5
+ import { r as raf } from './helpers.js';
6
6
 
7
- const addEventListener = (el, // TODO(FW-2832): type
8
- eventName, callback, opts) => {
9
- // use event listener options when supported
10
- // otherwise it's just a boolean for the "capture" arg
11
- const listenerOpts = supportsPassive(el)
12
- ? {
13
- capture: !!opts.capture,
14
- passive: !!opts.passive,
15
- }
16
- : !!opts.capture;
17
- let add;
18
- let remove;
19
- if (el['__zone_symbol__addEventListener']) {
20
- add = '__zone_symbol__addEventListener';
21
- remove = '__zone_symbol__removeEventListener';
7
+ const LIFECYCLE_WILL_ENTER = 'ionViewWillEnter';
8
+ const LIFECYCLE_DID_ENTER = 'ionViewDidEnter';
9
+ const LIFECYCLE_WILL_LEAVE = 'ionViewWillLeave';
10
+ const LIFECYCLE_DID_LEAVE = 'ionViewDidLeave';
11
+ const LIFECYCLE_WILL_UNLOAD = 'ionViewWillUnload';
12
+
13
+ const iosTransitionAnimation = () => import('./ios.transition.js');
14
+ const mdTransitionAnimation = () => import('./md.transition.js');
15
+ // TODO(FW-2832): types
16
+ const transition = (opts) => {
17
+ return new Promise((resolve, reject) => {
18
+ writeTask(() => {
19
+ beforeTransition(opts);
20
+ runTransition(opts).then((result) => {
21
+ if (result.animation) {
22
+ result.animation.destroy();
23
+ }
24
+ afterTransition(opts);
25
+ resolve(result);
26
+ }, (error) => {
27
+ afterTransition(opts);
28
+ reject(error);
29
+ });
30
+ });
31
+ });
32
+ };
33
+ const beforeTransition = (opts) => {
34
+ const enteringEl = opts.enteringEl;
35
+ const leavingEl = opts.leavingEl;
36
+ setZIndex(enteringEl, leavingEl, opts.direction);
37
+ if (opts.showGoBack) {
38
+ enteringEl.classList.add('can-go-back');
22
39
  }
23
40
  else {
24
- add = 'addEventListener';
25
- remove = 'removeEventListener';
41
+ enteringEl.classList.remove('can-go-back');
42
+ }
43
+ setPageHidden(enteringEl, false);
44
+ /**
45
+ * When transitioning, the page should not
46
+ * respond to click events. This resolves small
47
+ * issues like users double tapping the ion-back-button.
48
+ * These pointer events are removed in `afterTransition`.
49
+ */
50
+ enteringEl.style.setProperty('pointer-events', 'none');
51
+ if (leavingEl) {
52
+ setPageHidden(leavingEl, false);
53
+ leavingEl.style.setProperty('pointer-events', 'none');
26
54
  }
27
- el[add](eventName, callback, listenerOpts);
28
- return () => {
29
- el[remove](eventName, callback, listenerOpts);
30
- };
31
55
  };
32
- const supportsPassive = (node) => {
33
- if (_sPassive === undefined) {
34
- try {
35
- const opts = Object.defineProperty({}, 'passive', {
36
- get: () => {
37
- _sPassive = true;
38
- },
39
- });
40
- node.addEventListener('optsTest', () => {
41
- return;
42
- }, opts);
43
- }
44
- catch (e) {
45
- _sPassive = false;
46
- }
56
+ const runTransition = async (opts) => {
57
+ const animationBuilder = await getAnimationBuilder(opts);
58
+ const ani = animationBuilder && Build.isBrowser ? animation(animationBuilder, opts) : noAnimation(opts); // fast path for no animation
59
+ return ani;
60
+ };
61
+ const afterTransition = (opts) => {
62
+ const enteringEl = opts.enteringEl;
63
+ const leavingEl = opts.leavingEl;
64
+ enteringEl.classList.remove('ion-page-invisible');
65
+ enteringEl.style.removeProperty('pointer-events');
66
+ if (leavingEl !== undefined) {
67
+ leavingEl.classList.remove('ion-page-invisible');
68
+ leavingEl.style.removeProperty('pointer-events');
47
69
  }
48
- return !!_sPassive;
49
70
  };
50
- let _sPassive;
51
-
52
- const MOUSE_WAIT = 2000;
53
- // TODO(FW-2832): types
54
- const createPointerEvents = (el, pointerDown, pointerMove, pointerUp, options) => {
55
- let rmTouchStart;
56
- let rmTouchMove;
57
- let rmTouchEnd;
58
- let rmTouchCancel;
59
- let rmMouseStart;
60
- let rmMouseMove;
61
- let rmMouseUp;
62
- let lastTouchEvent = 0;
63
- const handleTouchStart = (ev) => {
64
- lastTouchEvent = Date.now() + MOUSE_WAIT;
65
- if (!pointerDown(ev)) {
66
- return;
67
- }
68
- if (!rmTouchMove && pointerMove) {
69
- rmTouchMove = addEventListener(el, 'touchmove', pointerMove, options);
70
- }
71
- /**
72
- * Events are dispatched on the element that is tapped and bubble up to
73
- * the reference element in the gesture. In the event that the element this
74
- * event was first dispatched on is removed from the DOM, the event will no
75
- * longer bubble up to our reference element. This leaves the gesture in an
76
- * unusable state. To account for this, the touchend and touchcancel listeners
77
- * should be added to the event target so that they still fire even if the target
78
- * is removed from the DOM.
79
- */
80
- if (!rmTouchEnd) {
81
- rmTouchEnd = addEventListener(ev.target, 'touchend', handleTouchEnd, options);
82
- }
83
- if (!rmTouchCancel) {
84
- rmTouchCancel = addEventListener(ev.target, 'touchcancel', handleTouchEnd, options);
85
- }
86
- };
87
- const handleMouseDown = (ev) => {
88
- if (lastTouchEvent > Date.now()) {
89
- return;
90
- }
91
- if (!pointerDown(ev)) {
92
- return;
93
- }
94
- if (!rmMouseMove && pointerMove) {
95
- rmMouseMove = addEventListener(getDocument(el), 'mousemove', pointerMove, options);
96
- }
97
- if (!rmMouseUp) {
98
- rmMouseUp = addEventListener(getDocument(el), 'mouseup', handleMouseUp, options);
99
- }
100
- };
101
- const handleTouchEnd = (ev) => {
102
- stopTouch();
103
- if (pointerUp) {
104
- pointerUp(ev);
105
- }
106
- };
107
- const handleMouseUp = (ev) => {
108
- stopMouse();
109
- if (pointerUp) {
110
- pointerUp(ev);
111
- }
112
- };
113
- const stopTouch = () => {
114
- if (rmTouchMove) {
115
- rmTouchMove();
116
- }
117
- if (rmTouchEnd) {
118
- rmTouchEnd();
119
- }
120
- if (rmTouchCancel) {
121
- rmTouchCancel();
122
- }
123
- rmTouchMove = rmTouchEnd = rmTouchCancel = undefined;
124
- };
125
- const stopMouse = () => {
126
- if (rmMouseMove) {
127
- rmMouseMove();
128
- }
129
- if (rmMouseUp) {
130
- rmMouseUp();
131
- }
132
- rmMouseMove = rmMouseUp = undefined;
133
- };
134
- const stop = () => {
135
- stopTouch();
136
- stopMouse();
137
- };
138
- const enable = (isEnabled = true) => {
139
- if (!isEnabled) {
140
- if (rmTouchStart) {
141
- rmTouchStart();
142
- }
143
- if (rmMouseStart) {
144
- rmMouseStart();
145
- }
146
- rmTouchStart = rmMouseStart = undefined;
147
- stop();
148
- }
149
- else {
150
- if (!rmTouchStart) {
151
- rmTouchStart = addEventListener(el, 'touchstart', handleTouchStart, options);
152
- }
153
- if (!rmMouseStart) {
154
- rmMouseStart = addEventListener(el, 'mousedown', handleMouseDown, options);
155
- }
156
- }
157
- };
158
- const destroy = () => {
159
- enable(false);
160
- pointerUp = pointerMove = pointerDown = undefined;
161
- };
71
+ const getAnimationBuilder = async (opts) => {
72
+ if (!opts.leavingEl || !opts.animated || opts.duration === 0) {
73
+ return undefined;
74
+ }
75
+ if (opts.animationBuilder) {
76
+ return opts.animationBuilder;
77
+ }
78
+ const getAnimation = opts.mode === 'ios'
79
+ ? (await iosTransitionAnimation()).iosTransitionAnimation
80
+ : (await mdTransitionAnimation()).mdTransitionAnimation;
81
+ return getAnimation;
82
+ };
83
+ const animation = async (animationBuilder, opts) => {
84
+ await waitForReady(opts, true);
85
+ const trans = animationBuilder(opts.baseEl, opts);
86
+ fireWillEvents(opts.enteringEl, opts.leavingEl);
87
+ const didComplete = await playTransition(trans, opts);
88
+ if (opts.progressCallback) {
89
+ opts.progressCallback(undefined);
90
+ }
91
+ if (didComplete) {
92
+ fireDidEvents(opts.enteringEl, opts.leavingEl);
93
+ }
162
94
  return {
163
- enable,
164
- stop,
165
- destroy,
95
+ hasCompleted: didComplete,
96
+ animation: trans,
166
97
  };
167
98
  };
168
- const getDocument = (node) => {
169
- return node instanceof Document ? node : node.ownerDocument;
170
- };
171
-
172
- const createPanRecognizer = (direction, thresh, maxAngle) => {
173
- const radians = maxAngle * (Math.PI / 180);
174
- const isDirX = direction === 'x';
175
- const maxCosine = Math.cos(radians);
176
- const threshold = thresh * thresh;
177
- let startX = 0;
178
- let startY = 0;
179
- let dirty = false;
180
- let isPan = 0;
99
+ const noAnimation = async (opts) => {
100
+ const enteringEl = opts.enteringEl;
101
+ const leavingEl = opts.leavingEl;
102
+ await waitForReady(opts, false);
103
+ fireWillEvents(enteringEl, leavingEl);
104
+ fireDidEvents(enteringEl, leavingEl);
181
105
  return {
182
- start(x, y) {
183
- startX = x;
184
- startY = y;
185
- isPan = 0;
186
- dirty = true;
187
- },
188
- detect(x, y) {
189
- if (!dirty) {
190
- return false;
191
- }
192
- const deltaX = x - startX;
193
- const deltaY = y - startY;
194
- const distance = deltaX * deltaX + deltaY * deltaY;
195
- if (distance < threshold) {
196
- return false;
197
- }
198
- const hypotenuse = Math.sqrt(distance);
199
- const cosine = (isDirX ? deltaX : deltaY) / hypotenuse;
200
- if (cosine > maxCosine) {
201
- isPan = 1;
202
- }
203
- else if (cosine < -maxCosine) {
204
- isPan = -1;
205
- }
206
- else {
207
- isPan = 0;
208
- }
209
- dirty = false;
210
- return true;
211
- },
212
- isGesture() {
213
- return isPan !== 0;
214
- },
215
- getDirection() {
216
- return isPan;
217
- },
106
+ hasCompleted: true,
218
107
  };
219
108
  };
220
-
221
- // TODO(FW-2832): types
222
- const createGesture = (config) => {
223
- let hasCapturedPan = false;
224
- let hasStartedPan = false;
225
- let hasFiredStart = true;
226
- let isMoveQueued = false;
227
- const finalConfig = Object.assign({ disableScroll: false, direction: 'x', gesturePriority: 0, passive: true, maxAngle: 40, threshold: 10 }, config);
228
- const canStart = finalConfig.canStart;
229
- const onWillStart = finalConfig.onWillStart;
230
- const onStart = finalConfig.onStart;
231
- const onEnd = finalConfig.onEnd;
232
- const notCaptured = finalConfig.notCaptured;
233
- const onMove = finalConfig.onMove;
234
- const threshold = finalConfig.threshold;
235
- const passive = finalConfig.passive;
236
- const blurOnStart = finalConfig.blurOnStart;
237
- const detail = {
238
- type: 'pan',
239
- startX: 0,
240
- startY: 0,
241
- startTime: 0,
242
- currentX: 0,
243
- currentY: 0,
244
- velocityX: 0,
245
- velocityY: 0,
246
- deltaX: 0,
247
- deltaY: 0,
248
- currentTime: 0,
249
- event: undefined,
250
- data: undefined,
251
- };
252
- const pan = createPanRecognizer(finalConfig.direction, finalConfig.threshold, finalConfig.maxAngle);
253
- const gesture = GESTURE_CONTROLLER.createGesture({
254
- name: config.gestureName,
255
- priority: config.gesturePriority,
256
- disableScroll: config.disableScroll,
109
+ const waitForReady = async (opts, defaultDeep) => {
110
+ const deep = opts.deepWait !== undefined ? opts.deepWait : defaultDeep;
111
+ if (deep) {
112
+ await Promise.all([deepReady(opts.enteringEl), deepReady(opts.leavingEl)]);
113
+ }
114
+ await notifyViewReady(opts.viewIsReady, opts.enteringEl);
115
+ };
116
+ const notifyViewReady = async (viewIsReady, enteringEl) => {
117
+ if (viewIsReady) {
118
+ await viewIsReady(enteringEl);
119
+ }
120
+ };
121
+ const playTransition = (trans, opts) => {
122
+ const progressCallback = opts.progressCallback;
123
+ const promise = new Promise((resolve) => {
124
+ trans.onFinish((currentStep) => resolve(currentStep === 1));
257
125
  });
258
- const pointerDown = (ev) => {
259
- const timeStamp = now(ev);
260
- if (hasStartedPan || !hasFiredStart) {
261
- return false;
262
- }
263
- updateDetail(ev, detail);
264
- detail.startX = detail.currentX;
265
- detail.startY = detail.currentY;
266
- detail.startTime = detail.currentTime = timeStamp;
267
- detail.velocityX = detail.velocityY = detail.deltaX = detail.deltaY = 0;
268
- detail.event = ev;
269
- // Check if gesture can start
270
- if (canStart && canStart(detail) === false) {
271
- return false;
272
- }
273
- // Release fallback
274
- gesture.release();
275
- // Start gesture
276
- if (!gesture.start()) {
277
- return false;
278
- }
279
- hasStartedPan = true;
280
- if (threshold === 0) {
281
- return tryToCapturePan();
282
- }
283
- pan.start(detail.startX, detail.startY);
284
- return true;
285
- };
286
- const pointerMove = (ev) => {
287
- // fast path, if gesture is currently captured
288
- // do minimum job to get user-land even dispatched
289
- if (hasCapturedPan) {
290
- if (!isMoveQueued && hasFiredStart) {
291
- isMoveQueued = true;
292
- calcGestureData(detail, ev);
293
- requestAnimationFrame(fireOnMove);
294
- }
295
- return;
296
- }
297
- // gesture is currently being detected
298
- calcGestureData(detail, ev);
299
- if (pan.detect(detail.currentX, detail.currentY)) {
300
- if (!pan.isGesture() || !tryToCapturePan()) {
301
- abortGesture();
302
- }
303
- }
304
- };
305
- const fireOnMove = () => {
306
- // Since fireOnMove is called inside a RAF, onEnd() might be called,
307
- // we must double check hasCapturedPan
308
- if (!hasCapturedPan) {
309
- return;
310
- }
311
- isMoveQueued = false;
312
- if (onMove) {
313
- onMove(detail);
314
- }
315
- };
316
- const tryToCapturePan = () => {
317
- if (!gesture.capture()) {
318
- return false;
319
- }
320
- hasCapturedPan = true;
321
- hasFiredStart = false;
322
- // reset start position since the real user-land event starts here
323
- // If the pan detector threshold is big, not resetting the start position
324
- // will cause a jump in the animation equal to the detector threshold.
325
- // the array of positions used to calculate the gesture velocity does not
326
- // need to be cleaned, more points in the positions array always results in a
327
- // more accurate value of the velocity.
328
- detail.startX = detail.currentX;
329
- detail.startY = detail.currentY;
330
- detail.startTime = detail.currentTime;
331
- if (onWillStart) {
332
- onWillStart(detail).then(fireOnStart);
333
- }
334
- else {
335
- fireOnStart();
336
- }
337
- return true;
338
- };
339
- const blurActiveElement = () => {
340
- if (typeof document !== 'undefined') {
341
- const activeElement = document.activeElement;
342
- if (activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur) {
343
- activeElement.blur();
344
- }
345
- }
346
- };
347
- const fireOnStart = () => {
348
- if (blurOnStart) {
349
- blurActiveElement();
350
- }
351
- if (onStart) {
352
- onStart(detail);
353
- }
354
- hasFiredStart = true;
355
- };
356
- const reset = () => {
357
- hasCapturedPan = false;
358
- hasStartedPan = false;
359
- isMoveQueued = false;
360
- hasFiredStart = true;
361
- gesture.release();
362
- };
363
- // END *************************
364
- const pointerUp = (ev) => {
365
- const tmpHasCaptured = hasCapturedPan;
366
- const tmpHasFiredStart = hasFiredStart;
367
- reset();
368
- if (!tmpHasFiredStart) {
369
- return;
370
- }
371
- calcGestureData(detail, ev);
372
- // Try to capture press
373
- if (tmpHasCaptured) {
374
- if (onEnd) {
375
- onEnd(detail);
126
+ // cool, let's do this, start the transition
127
+ if (progressCallback) {
128
+ // this is a swipe to go back, just get the transition progress ready
129
+ // kick off the swipe animation start
130
+ trans.progressStart(true);
131
+ progressCallback(trans);
132
+ }
133
+ else {
134
+ // only the top level transition should actually start "play"
135
+ // kick it off and let it play through
136
+ // ******** DOM WRITE ****************
137
+ trans.play();
138
+ }
139
+ // create a callback for when the animation is done
140
+ return promise;
141
+ };
142
+ const fireWillEvents = (enteringEl, leavingEl) => {
143
+ lifecycle(leavingEl, LIFECYCLE_WILL_LEAVE);
144
+ lifecycle(enteringEl, LIFECYCLE_WILL_ENTER);
145
+ };
146
+ const fireDidEvents = (enteringEl, leavingEl) => {
147
+ lifecycle(enteringEl, LIFECYCLE_DID_ENTER);
148
+ lifecycle(leavingEl, LIFECYCLE_DID_LEAVE);
149
+ };
150
+ const lifecycle = (el, eventName) => {
151
+ if (el) {
152
+ const ev = new CustomEvent(eventName, {
153
+ bubbles: false,
154
+ cancelable: false,
155
+ });
156
+ el.dispatchEvent(ev);
157
+ }
158
+ };
159
+ /**
160
+ * Wait two request animation frame loops.
161
+ * This allows the framework implementations enough time to mount
162
+ * the user-defined contents. This is often needed when using inline
163
+ * modals and popovers that accept user components. For popover,
164
+ * the contents must be mounted for the popover to be sized correctly.
165
+ * For modals, the contents must be mounted for iOS to run the
166
+ * transition correctly.
167
+ *
168
+ * On Angular and React, a single raf is enough time, but for Vue
169
+ * we need to wait two rafs. As a result we are using two rafs for
170
+ * all frameworks to ensure contents are mounted.
171
+ */
172
+ const waitForMount = () => {
173
+ return new Promise((resolve) => raf(() => raf(() => resolve())));
174
+ };
175
+ const deepReady = async (el) => {
176
+ const element = el;
177
+ if (element) {
178
+ if (element.componentOnReady != null) {
179
+ // eslint-disable-next-line custom-rules/no-component-on-ready-method
180
+ const stencilEl = await element.componentOnReady();
181
+ if (stencilEl != null) {
182
+ return;
376
183
  }
184
+ /**
185
+ * Custom elements in Stencil will have __registerHost.
186
+ */
187
+ }
188
+ else if (element.__registerHost != null) {
189
+ /**
190
+ * Non-lazy loaded custom elements need to wait
191
+ * one frame for component to be loaded.
192
+ */
193
+ const waitForCustomElement = new Promise((resolve) => raf(resolve));
194
+ await waitForCustomElement;
377
195
  return;
378
196
  }
379
- // Not captured any event
380
- if (notCaptured) {
381
- notCaptured(detail);
382
- }
383
- };
384
- const pointerEvents = createPointerEvents(finalConfig.el, pointerDown, pointerMove, pointerUp, {
385
- capture: false,
386
- passive,
387
- });
388
- const abortGesture = () => {
389
- reset();
390
- pointerEvents.stop();
391
- if (notCaptured) {
392
- notCaptured(detail);
393
- }
394
- };
395
- return {
396
- enable(enable = true) {
397
- if (!enable) {
398
- if (hasCapturedPan) {
399
- pointerUp(undefined);
400
- }
401
- reset();
402
- }
403
- pointerEvents.enable(enable);
404
- },
405
- destroy() {
406
- gesture.destroy();
407
- pointerEvents.destroy();
408
- },
409
- };
197
+ await Promise.all(Array.from(element.children).map(deepReady));
198
+ }
410
199
  };
411
- const calcGestureData = (detail, ev) => {
412
- if (!ev) {
413
- return;
200
+ const setPageHidden = (el, hidden) => {
201
+ if (hidden) {
202
+ el.setAttribute('aria-hidden', 'true');
203
+ el.classList.add('ion-page-hidden');
414
204
  }
415
- const prevX = detail.currentX;
416
- const prevY = detail.currentY;
417
- const prevT = detail.currentTime;
418
- updateDetail(ev, detail);
419
- const currentX = detail.currentX;
420
- const currentY = detail.currentY;
421
- const timestamp = (detail.currentTime = now(ev));
422
- const timeDelta = timestamp - prevT;
423
- if (timeDelta > 0 && timeDelta < 100) {
424
- const velocityX = (currentX - prevX) / timeDelta;
425
- const velocityY = (currentY - prevY) / timeDelta;
426
- detail.velocityX = velocityX * 0.7 + detail.velocityX * 0.3;
427
- detail.velocityY = velocityY * 0.7 + detail.velocityY * 0.3;
205
+ else {
206
+ el.hidden = false;
207
+ el.removeAttribute('aria-hidden');
208
+ el.classList.remove('ion-page-hidden');
428
209
  }
429
- detail.deltaX = currentX - detail.startX;
430
- detail.deltaY = currentY - detail.startY;
431
- detail.event = ev;
432
210
  };
433
- const updateDetail = (ev, detail) => {
434
- // get X coordinates for either a mouse click
435
- // or a touch depending on the given event
436
- let x = 0;
437
- let y = 0;
438
- if (ev) {
439
- const changedTouches = ev.changedTouches;
440
- if (changedTouches && changedTouches.length > 0) {
441
- const touch = changedTouches[0];
442
- x = touch.clientX;
443
- y = touch.clientY;
444
- }
445
- else if (ev.pageX !== undefined) {
446
- x = ev.pageX;
447
- y = ev.pageY;
448
- }
211
+ const setZIndex = (enteringEl, leavingEl, direction) => {
212
+ if (enteringEl !== undefined) {
213
+ enteringEl.style.zIndex = direction === 'back' ? '99' : '101';
214
+ }
215
+ if (leavingEl !== undefined) {
216
+ leavingEl.style.zIndex = '100';
449
217
  }
450
- detail.currentX = x;
451
- detail.currentY = y;
452
218
  };
453
- const now = (ev) => {
454
- return ev.timeStamp || Date.now();
219
+ const getIonPageElement = (element) => {
220
+ if (element.classList.contains('ion-page')) {
221
+ return element;
222
+ }
223
+ const ionPage = element.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs');
224
+ if (ionPage) {
225
+ return ionPage;
226
+ }
227
+ // idk, return the original element so at least something animates and we don't have a null pointer
228
+ return element;
455
229
  };
456
230
 
457
- export { createGesture };
231
+ export { LIFECYCLE_WILL_ENTER as L, LIFECYCLE_DID_ENTER as a, LIFECYCLE_WILL_LEAVE as b, LIFECYCLE_DID_LEAVE as c, LIFECYCLE_WILL_UNLOAD as d, deepReady as e, getIonPageElement as g, lifecycle as l, setPageHidden as s, transition as t, waitForMount as w };