@maas/vue-equipment 0.19.0 → 0.19.1
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/dist/nuxt/module.json +1 -1
- package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +3 -2
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.d.ts +2 -2
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +18 -17
- package/package.json +1 -1
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerEventHandler.d.ts +0 -68
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerEventHandler.mjs +0 -14
package/dist/nuxt/module.json
CHANGED
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
@close="closeIfAllowed"
|
|
56
56
|
/>
|
|
57
57
|
<slot v-else />
|
|
58
|
+
<div v-if="hasDragged" class="magic-drawer__overlay" />
|
|
58
59
|
</div>
|
|
59
60
|
</div>
|
|
60
61
|
</transition>
|
|
@@ -141,7 +142,7 @@ const {
|
|
|
141
142
|
removeScrollLockPadding,
|
|
142
143
|
} = drawerApi
|
|
143
144
|
|
|
144
|
-
const { onPointerdown, onClick, dragging, style } = useDrawerDrag({
|
|
145
|
+
const { onPointerdown, onClick, dragging, hasDragged, style } = useDrawerDrag({
|
|
145
146
|
id: props.id,
|
|
146
147
|
isActive,
|
|
147
148
|
elRef,
|
|
@@ -290,5 +291,5 @@ onBeforeUnmount(() => {
|
|
|
290
291
|
</script>
|
|
291
292
|
|
|
292
293
|
<style>
|
|
293
|
-
:root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-handle-wrapper-height:2rem;--magic-drawer-handle-width:3rem;--magic-drawer-handle-height:0.375rem;--magic-drawer-handle-color:#d4d4d8;--magic-drawer-handle-border-radius:0.25rem;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-drag-overshoot-x:0rem;--magic-drawer-drag-overshoot-y:0rem;--magic-drawer-padding:0rem}.magic-drawer{align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot-y));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:calc(var(--magic-drawer-width) + var(--magic-drawer-drag-overshoot-x))}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
|
|
294
|
+
:root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-handle-wrapper-height:2rem;--magic-drawer-handle-width:3rem;--magic-drawer-handle-height:0.375rem;--magic-drawer-handle-color:#d4d4d8;--magic-drawer-handle-border-radius:0.25rem;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-drag-overshoot-x:0rem;--magic-drawer-drag-overshoot-y:0rem;--magic-drawer-padding:0rem}.magic-drawer{align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot-y));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:calc(var(--magic-drawer-width) + var(--magic-drawer-drag-overshoot-x))}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__overlay{inset:0;position:absolute;z-index:9999}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
|
|
294
295
|
</style>
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type Ref, type MaybeRef } from 'vue';
|
|
2
2
|
import { type DefaultOptions } from '../../utils/defaultOptions.js';
|
|
3
|
-
import type { CustomMouseEvent } from '../../types.js';
|
|
4
3
|
type UseDrawerDragArgs = {
|
|
5
4
|
id: MaybeRef<string>;
|
|
6
5
|
isActive: MaybeRef<boolean>;
|
|
@@ -18,7 +17,8 @@ export declare function useDrawerDrag(args: UseDrawerDragArgs): {
|
|
|
18
17
|
draggedX: Ref<number>;
|
|
19
18
|
draggedY: Ref<number>;
|
|
20
19
|
dragging: Ref<boolean>;
|
|
20
|
+
hasDragged: import("vue").ComputedRef<boolean>;
|
|
21
21
|
onPointerdown: (e: PointerEvent) => void;
|
|
22
|
-
onClick: (e:
|
|
22
|
+
onClick: (e: MouseEvent) => Promise<void>;
|
|
23
23
|
};
|
|
24
24
|
export {};
|
|
@@ -17,7 +17,6 @@ import {
|
|
|
17
17
|
import { useDrawerEmitter } from "../useDrawerEmitter.mjs";
|
|
18
18
|
import { useDrawerSnap } from "./useDrawerSnap.mjs";
|
|
19
19
|
import { useDrawerGuards } from "./useDrawerGuards.mjs";
|
|
20
|
-
import { useDrawerEventHandler } from "./useDrawerEventHandler.mjs";
|
|
21
20
|
import { isIOS } from "@maas/vue-equipment/utils";
|
|
22
21
|
export function useDrawerDrag(args) {
|
|
23
22
|
const {
|
|
@@ -44,6 +43,8 @@ export function useDrawerDrag(args) {
|
|
|
44
43
|
const originY = ref(0);
|
|
45
44
|
const pointerdownX = ref(0);
|
|
46
45
|
const pointerdownY = ref(0);
|
|
46
|
+
const lastDraggedX = ref(0);
|
|
47
|
+
const lastDraggedY = ref(0);
|
|
47
48
|
const relDirectionY = ref("absolute");
|
|
48
49
|
const relDirectionX = ref("absolute");
|
|
49
50
|
const absDirectionY = ref(void 0);
|
|
@@ -53,8 +54,9 @@ export function useDrawerDrag(args) {
|
|
|
53
54
|
const duration = computed(() => toValue(snap)?.duration);
|
|
54
55
|
const draggedX = ref(0);
|
|
55
56
|
const draggedY = ref(0);
|
|
56
|
-
const
|
|
57
|
-
|
|
57
|
+
const hasDragged = computed(() => {
|
|
58
|
+
return lastDraggedX.value !== draggedX.value || lastDraggedY.value !== draggedY.value;
|
|
59
|
+
});
|
|
58
60
|
const style = computed(
|
|
59
61
|
() => `transform: translate(${draggedX.value}px, ${draggedY.value}px)`
|
|
60
62
|
);
|
|
@@ -85,7 +87,6 @@ export function useDrawerDrag(args) {
|
|
|
85
87
|
position,
|
|
86
88
|
activeSnapPoint
|
|
87
89
|
});
|
|
88
|
-
const { clickEvent, dispatchEvent } = useDrawerEventHandler();
|
|
89
90
|
async function getSizes() {
|
|
90
91
|
elRect.value = unrefElement(elRef)?.getBoundingClientRect();
|
|
91
92
|
wrapperRect.value = unrefElement(wrapperRef)?.getBoundingClientRect();
|
|
@@ -242,6 +243,8 @@ export function useDrawerDrag(args) {
|
|
|
242
243
|
function resetDragged() {
|
|
243
244
|
draggedX.value = 0;
|
|
244
245
|
draggedY.value = 0;
|
|
246
|
+
lastDraggedX.value = 0;
|
|
247
|
+
lastDraggedY.value = 0;
|
|
245
248
|
}
|
|
246
249
|
function resetSnapped() {
|
|
247
250
|
snappedX.value = 0;
|
|
@@ -307,6 +310,9 @@ export function useDrawerDrag(args) {
|
|
|
307
310
|
}
|
|
308
311
|
resetStateAndListeners();
|
|
309
312
|
resetScrollLock();
|
|
313
|
+
if (hasDragged.value) {
|
|
314
|
+
e.preventDefault();
|
|
315
|
+
}
|
|
310
316
|
}
|
|
311
317
|
function onPointermove(e) {
|
|
312
318
|
shouldClose.value = false;
|
|
@@ -326,10 +332,6 @@ export function useDrawerDrag(args) {
|
|
|
326
332
|
checkPosition({ x: e.screenX, y: e.screenY });
|
|
327
333
|
}
|
|
328
334
|
function onPointerdown(e) {
|
|
329
|
-
const tag = e.target.tagName;
|
|
330
|
-
if (tag === "A") {
|
|
331
|
-
e.preventDefault();
|
|
332
|
-
}
|
|
333
335
|
if (dragging.value) {
|
|
334
336
|
return;
|
|
335
337
|
} else {
|
|
@@ -337,7 +339,6 @@ export function useDrawerDrag(args) {
|
|
|
337
339
|
}
|
|
338
340
|
lastDraggedX.value = draggedX.value;
|
|
339
341
|
lastDraggedY.value = draggedY.value;
|
|
340
|
-
e.target.setPointerCapture(e.pointerId);
|
|
341
342
|
cancelPointerup = useEventListener(document, "pointerup", onPointerup);
|
|
342
343
|
cancelPointermove = useEventListener(document, "pointermove", onPointermove);
|
|
343
344
|
cancelTouchend = isIOS() ? useEventListener(document, "touchend", onPointerup) : void 0;
|
|
@@ -349,16 +350,9 @@ export function useDrawerDrag(args) {
|
|
|
349
350
|
onPointermove(e);
|
|
350
351
|
}
|
|
351
352
|
async function onClick(e) {
|
|
352
|
-
if (
|
|
353
|
-
clickEvent.value = void 0;
|
|
354
|
-
return;
|
|
355
|
-
} else {
|
|
356
|
-
clickEvent.value = e;
|
|
353
|
+
if (hasDragged.value) {
|
|
357
354
|
e.preventDefault();
|
|
358
355
|
}
|
|
359
|
-
if (lastDraggedX.value === draggedX.value && lastDraggedY.value === draggedY.value) {
|
|
360
|
-
dispatchEvent(clickEvent.value);
|
|
361
|
-
}
|
|
362
356
|
}
|
|
363
357
|
onMounted(async () => {
|
|
364
358
|
await getSizes();
|
|
@@ -372,6 +366,12 @@ export function useDrawerDrag(args) {
|
|
|
372
366
|
snapTo({ snapPoint, interpolate: false });
|
|
373
367
|
}
|
|
374
368
|
);
|
|
369
|
+
watch(snappedX, (value) => {
|
|
370
|
+
lastDraggedX.value = value;
|
|
371
|
+
});
|
|
372
|
+
watch(snappedY, (value) => {
|
|
373
|
+
lastDraggedY.value = value;
|
|
374
|
+
});
|
|
375
375
|
useResizeObserver(elRef, async () => {
|
|
376
376
|
useThrottleFn(async () => {
|
|
377
377
|
await getSizes();
|
|
@@ -389,6 +389,7 @@ export function useDrawerDrag(args) {
|
|
|
389
389
|
draggedX,
|
|
390
390
|
draggedY,
|
|
391
391
|
dragging,
|
|
392
|
+
hasDragged,
|
|
392
393
|
onPointerdown,
|
|
393
394
|
onClick
|
|
394
395
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maas/vue-equipment",
|
|
3
3
|
"description": "A magic collection of Vue composables, plugins, components and directives",
|
|
4
|
-
"version": "0.19.
|
|
4
|
+
"version": "0.19.1",
|
|
5
5
|
"author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
|
|
6
6
|
"devDependencies": {
|
|
7
7
|
"@antfu/ni": "^0.21.12",
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export declare function useDrawerEventHandler(): {
|
|
2
|
-
clickEvent: import("vue").Ref<{
|
|
3
|
-
readonly altKey: boolean;
|
|
4
|
-
readonly button: number;
|
|
5
|
-
readonly buttons: number;
|
|
6
|
-
readonly clientX: number;
|
|
7
|
-
readonly clientY: number;
|
|
8
|
-
readonly ctrlKey: boolean;
|
|
9
|
-
readonly metaKey: boolean;
|
|
10
|
-
readonly movementX: number;
|
|
11
|
-
readonly movementY: number;
|
|
12
|
-
readonly offsetX: number;
|
|
13
|
-
readonly offsetY: number;
|
|
14
|
-
readonly pageX: number;
|
|
15
|
-
readonly pageY: number;
|
|
16
|
-
readonly relatedTarget: {
|
|
17
|
-
addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
|
|
18
|
-
dispatchEvent: (event: Event) => boolean;
|
|
19
|
-
removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
|
|
20
|
-
} | null;
|
|
21
|
-
readonly screenX: number;
|
|
22
|
-
readonly screenY: number;
|
|
23
|
-
readonly shiftKey: boolean;
|
|
24
|
-
readonly x: number;
|
|
25
|
-
readonly y: number;
|
|
26
|
-
getModifierState: (keyArg: string) => boolean;
|
|
27
|
-
initMouseEvent: (typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null) => void;
|
|
28
|
-
readonly detail: number;
|
|
29
|
-
readonly view: Window | null;
|
|
30
|
-
readonly which: number;
|
|
31
|
-
initUIEvent: (typeArg: string, bubblesArg?: boolean | undefined, cancelableArg?: boolean | undefined, viewArg?: Window | null | undefined, detailArg?: number | undefined) => void;
|
|
32
|
-
readonly bubbles: boolean;
|
|
33
|
-
cancelBubble: boolean;
|
|
34
|
-
readonly cancelable: boolean;
|
|
35
|
-
readonly composed: boolean;
|
|
36
|
-
readonly currentTarget: {
|
|
37
|
-
addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
|
|
38
|
-
dispatchEvent: (event: Event) => boolean;
|
|
39
|
-
removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
|
|
40
|
-
} | null;
|
|
41
|
-
readonly defaultPrevented: boolean;
|
|
42
|
-
readonly eventPhase: number;
|
|
43
|
-
readonly isTrusted: boolean;
|
|
44
|
-
returnValue: boolean;
|
|
45
|
-
readonly srcElement: {
|
|
46
|
-
addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
|
|
47
|
-
dispatchEvent: (event: Event) => boolean;
|
|
48
|
-
removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
|
|
49
|
-
} | null;
|
|
50
|
-
readonly target: {
|
|
51
|
-
addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
|
|
52
|
-
dispatchEvent: (event: Event) => boolean;
|
|
53
|
-
removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
|
|
54
|
-
} | null;
|
|
55
|
-
readonly timeStamp: number;
|
|
56
|
-
readonly type: string;
|
|
57
|
-
composedPath: () => EventTarget[];
|
|
58
|
-
initEvent: (type: string, bubbles?: boolean | undefined, cancelable?: boolean | undefined) => void;
|
|
59
|
-
preventDefault: () => void;
|
|
60
|
-
stopImmediatePropagation: () => void;
|
|
61
|
-
stopPropagation: () => void;
|
|
62
|
-
readonly NONE: 0;
|
|
63
|
-
readonly CAPTURING_PHASE: 1;
|
|
64
|
-
readonly AT_TARGET: 2;
|
|
65
|
-
readonly BUBBLING_PHASE: 3;
|
|
66
|
-
} | undefined>;
|
|
67
|
-
dispatchEvent: (e: MouseEvent | PointerEvent) => void;
|
|
68
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { ref } from "vue";
|
|
2
|
-
export function useDrawerEventHandler() {
|
|
3
|
-
const clickEvent = ref(void 0);
|
|
4
|
-
function dispatchEvent(e) {
|
|
5
|
-
const target = e.target;
|
|
6
|
-
const clone = new e.constructor(e.type, e);
|
|
7
|
-
clone.custom = "magic-drawer-clone";
|
|
8
|
-
target.dispatchEvent(clone);
|
|
9
|
-
}
|
|
10
|
-
return {
|
|
11
|
-
clickEvent,
|
|
12
|
-
dispatchEvent
|
|
13
|
-
};
|
|
14
|
-
}
|