@ionic/core 7.3.4-dev.11699991837.1bc64f72 → 7.3.4-dev.11700516018.128deb56
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/button-active.js +1 -1
- package/components/checkbox.js +3 -6
- package/components/data.js +7 -31
- package/components/index.js +2 -2
- package/components/index2.js +429 -203
- package/components/index3.js +203 -429
- package/components/ion-datetime-button.js +0 -3
- package/components/ion-datetime.js +92 -132
- package/components/ion-item-sliding.js +1 -1
- package/components/ion-menu.js +3 -3
- package/components/ion-modal.js +2 -2
- package/components/ion-nav.js +1 -1
- package/components/ion-range.js +3 -3
- package/components/ion-refresher.js +3 -3
- package/components/ion-reorder-group.js +1 -1
- package/components/ion-router-outlet.js +1 -1
- package/components/ion-segment.js +1 -1
- package/components/ion-toggle.js +4 -7
- package/components/ion-toolbar.js +2 -2
- package/components/ios.transition.js +1 -1
- package/components/md.transition.js +1 -1
- package/components/picker-column.js +1 -1
- package/components/popover.js +1 -1
- package/components/radio.js +3 -6
- package/components/swipe-back.js +1 -1
- package/dist/cjs/{data-db832785.js → data-967b9c15.js} +7 -31
- package/dist/cjs/index.cjs.js +9 -10
- package/dist/cjs/ion-app_8.cjs.entry.js +2 -2
- package/dist/cjs/ion-checkbox.cjs.entry.js +3 -5
- package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -4
- package/dist/cjs/ion-datetime_3.cjs.entry.js +93 -132
- package/dist/cjs/ion-menu_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-radio_2.cjs.entry.js +3 -5
- package/dist/cjs/ion-range.cjs.entry.js +2 -2
- package/dist/cjs/ion-toggle.cjs.entry.js +3 -5
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/checkbox/checkbox.ios.css +0 -35
- package/dist/collection/components/checkbox/checkbox.js +4 -24
- package/dist/collection/components/checkbox/checkbox.md.css +0 -35
- package/dist/collection/components/checkbox/test/item/checkbox.e2e.js +0 -13
- package/dist/collection/components/checkbox/test/label/checkbox.e2e.js +0 -16
- package/dist/collection/components/datetime/datetime.ios.css +29 -32
- package/dist/collection/components/datetime/datetime.js +93 -137
- package/dist/collection/components/datetime/datetime.md.css +28 -20
- package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -25
- package/dist/collection/components/datetime/test/color/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/custom/datetime.e2e.js +1 -27
- package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +0 -15
- package/dist/collection/components/datetime/test/set-value/datetime.e2e.js +12 -9
- package/dist/collection/components/datetime/utils/data.js +6 -14
- package/dist/collection/components/datetime/utils/parse.js +1 -18
- package/dist/collection/components/datetime-button/datetime-button.js +0 -3
- package/dist/collection/components/menu/menu.ios.css +0 -94
- package/dist/collection/components/menu/menu.md.css +0 -94
- package/dist/collection/components/radio/radio.ios.css +0 -35
- package/dist/collection/components/radio/radio.js +4 -24
- package/dist/collection/components/radio/radio.md.css +0 -35
- package/dist/collection/components/radio/test/item/radio.e2e.js +0 -15
- package/dist/collection/components/radio/test/label-placement/radio.e2e.js +0 -20
- package/dist/collection/components/range/range.ios.css +1 -41
- package/dist/collection/components/range/range.js +3 -3
- package/dist/collection/components/range/range.md.css +1 -41
- package/dist/collection/components/range/test/label/range.e2e.js +0 -48
- package/dist/collection/components/toggle/test/item/toggle.e2e.js +0 -15
- package/dist/collection/components/toggle/test/label/toggle.e2e.js +0 -16
- package/dist/collection/components/toggle/toggle.ios.css +1 -35
- package/dist/collection/components/toggle/toggle.js +4 -24
- package/dist/collection/components/toggle/toggle.md.css +1 -35
- package/dist/collection/components/toolbar/toolbar.ios.css +4 -2
- package/dist/collection/components/toolbar/toolbar.md.css +4 -2
- package/dist/collection/index.js +0 -1
- package/dist/docs.json +18 -147
- package/dist/esm/{data-009dbf15.js → data-4b448e3a.js} +7 -31
- package/dist/esm/index.js +2 -2
- package/dist/esm/ion-app_8.entry.js +2 -2
- package/dist/esm/ion-checkbox.entry.js +3 -5
- package/dist/esm/ion-datetime-button.entry.js +1 -4
- package/dist/esm/ion-datetime_3.entry.js +93 -132
- package/dist/esm/ion-menu_3.entry.js +2 -2
- package/dist/esm/ion-radio_2.entry.js +3 -5
- package/dist/esm/ion-range.entry.js +2 -2
- package/dist/esm/ion-toggle.entry.js +3 -5
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm-es5/data-4b448e3a.js +4 -0
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/ion-app_8.entry.js +1 -1
- package/dist/esm-es5/ion-checkbox.entry.js +1 -1
- package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-menu_3.entry.js +1 -1
- package/dist/esm-es5/ion-radio_2.entry.js +1 -1
- package/dist/esm-es5/ion-range.entry.js +1 -1
- package/dist/esm-es5/ion-toggle.entry.js +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/html.html-data.json +4 -52
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-0053fe81.system.entry.js +4 -0
- package/dist/ionic/p-06902103.system.js +1 -1
- package/dist/ionic/p-091cd81e.entry.js +4 -0
- package/dist/ionic/p-28f5715a.system.entry.js +4 -0
- package/dist/ionic/p-2cdcd6f2.entry.js +4 -0
- package/dist/ionic/{p-a34669bf.system.entry.js → p-45ee211b.system.entry.js} +1 -1
- package/dist/ionic/p-5009cb46.entry.js +4 -0
- package/dist/ionic/p-5b88f780.entry.js +4 -0
- package/dist/ionic/p-601fd53c.js +4 -0
- package/dist/ionic/p-8843b046.system.js +4 -0
- package/dist/ionic/p-98b618ce.system.entry.js +4 -0
- package/dist/ionic/p-b1e8f045.entry.js +4 -0
- package/dist/ionic/p-b3394798.system.entry.js +4 -0
- package/dist/ionic/p-b3cfc6e1.system.entry.js +4 -0
- package/dist/ionic/{p-f9567c67.entry.js → p-c759a704.entry.js} +1 -1
- package/dist/ionic/p-cc8910e7.system.js +4 -0
- package/dist/ionic/{p-67b891af.entry.js → p-d3b8aebf.entry.js} +1 -1
- package/dist/ionic/p-e53b8af4.system.entry.js +4 -0
- package/dist/ionic/p-f78e60a5.entry.js +4 -0
- package/dist/ionic/p-fd42994b.system.entry.js +4 -0
- package/dist/types/components/checkbox/checkbox.d.ts +1 -8
- package/dist/types/components/datetime/datetime.d.ts +10 -23
- package/dist/types/components/datetime/utils/data.d.ts +1 -1
- package/dist/types/components/datetime/utils/parse.d.ts +3 -3
- package/dist/types/components/radio/radio.d.ts +1 -8
- package/dist/types/components/range/range.d.ts +1 -2
- package/dist/types/components/toast/toast-interface.d.ts +0 -3
- package/dist/types/components/toggle/toggle.d.ts +1 -8
- package/dist/types/components.d.ts +16 -40
- package/dist/types/index.d.ts +0 -1
- package/dist/types/interface.d.ts +0 -1
- package/hydrate/index.js +114 -196
- package/package.json +2 -2
- package/dist/esm-es5/data-009dbf15.js +0 -4
- package/dist/ionic/p-1f4adf06.system.entry.js +0 -4
- package/dist/ionic/p-218b6f33.entry.js +0 -4
- package/dist/ionic/p-2da6ba37.system.entry.js +0 -4
- package/dist/ionic/p-40138199.entry.js +0 -4
- package/dist/ionic/p-44ef7224.system.js +0 -4
- package/dist/ionic/p-4ca1ce6b.system.entry.js +0 -4
- package/dist/ionic/p-51b165af.system.js +0 -4
- package/dist/ionic/p-57f0efcc.entry.js +0 -4
- package/dist/ionic/p-7cfd253c.js +0 -4
- package/dist/ionic/p-82f5c07e.system.entry.js +0 -4
- package/dist/ionic/p-86c5c320.entry.js +0 -4
- package/dist/ionic/p-90ec5785.system.entry.js +0 -4
- package/dist/ionic/p-af986299.system.entry.js +0 -4
- package/dist/ionic/p-b321c999.entry.js +0 -4
- package/dist/ionic/p-d8a0267b.system.entry.js +0 -4
- package/dist/ionic/p-f5c19164.entry.js +0 -4
package/components/index2.js
CHANGED
|
@@ -1,231 +1,457 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { G as GESTURE_CONTROLLER } from './gesture-controller.js';
|
|
5
|
+
export { G as GESTURE_CONTROLLER } from './gesture-controller.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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');
|
|
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';
|
|
39
22
|
}
|
|
40
23
|
else {
|
|
41
|
-
|
|
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');
|
|
54
|
-
}
|
|
55
|
-
};
|
|
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');
|
|
24
|
+
add = 'addEventListener';
|
|
25
|
+
remove = 'removeEventListener';
|
|
69
26
|
}
|
|
27
|
+
el[add](eventName, callback, listenerOpts);
|
|
28
|
+
return () => {
|
|
29
|
+
el[remove](eventName, callback, listenerOpts);
|
|
30
|
+
};
|
|
70
31
|
};
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
+
}
|
|
77
47
|
}
|
|
78
|
-
|
|
79
|
-
? (await iosTransitionAnimation()).iosTransitionAnimation
|
|
80
|
-
: (await mdTransitionAnimation()).mdTransitionAnimation;
|
|
81
|
-
return getAnimation;
|
|
48
|
+
return !!_sPassive;
|
|
82
49
|
};
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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;
|
|
97
161
|
};
|
|
98
|
-
};
|
|
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);
|
|
105
162
|
return {
|
|
106
|
-
|
|
163
|
+
enable,
|
|
164
|
+
stop,
|
|
165
|
+
destroy,
|
|
107
166
|
};
|
|
108
167
|
};
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
if (deep) {
|
|
112
|
-
await Promise.all([deepReady(opts.enteringEl), deepReady(opts.leavingEl)]);
|
|
113
|
-
}
|
|
114
|
-
await notifyViewReady(opts.viewIsReady, opts.enteringEl);
|
|
168
|
+
const getDocument = (node) => {
|
|
169
|
+
return node instanceof Document ? node : node.ownerDocument;
|
|
115
170
|
};
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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;
|
|
181
|
+
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
|
+
},
|
|
218
|
+
};
|
|
120
219
|
};
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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,
|
|
125
257
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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;
|
|
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);
|
|
183
294
|
}
|
|
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;
|
|
195
295
|
return;
|
|
196
296
|
}
|
|
197
|
-
|
|
198
|
-
|
|
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);
|
|
376
|
+
}
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
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
|
+
};
|
|
199
410
|
};
|
|
200
|
-
const
|
|
201
|
-
if (
|
|
202
|
-
|
|
203
|
-
el.classList.add('ion-page-hidden');
|
|
411
|
+
const calcGestureData = (detail, ev) => {
|
|
412
|
+
if (!ev) {
|
|
413
|
+
return;
|
|
204
414
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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;
|
|
209
428
|
}
|
|
429
|
+
detail.deltaX = currentX - detail.startX;
|
|
430
|
+
detail.deltaY = currentY - detail.startY;
|
|
431
|
+
detail.event = ev;
|
|
210
432
|
};
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
+
}
|
|
217
449
|
}
|
|
450
|
+
detail.currentX = x;
|
|
451
|
+
detail.currentY = y;
|
|
218
452
|
};
|
|
219
|
-
const
|
|
220
|
-
|
|
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;
|
|
453
|
+
const now = (ev) => {
|
|
454
|
+
return ev.timeStamp || Date.now();
|
|
229
455
|
};
|
|
230
456
|
|
|
231
|
-
export {
|
|
457
|
+
export { createGesture };
|