@excom/gesture-handler 0.1.0

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 (39) hide show
  1. package/.rush/temp/chunked-rush-logs/gesture-handler.apply-exports.chunks.jsonl +1 -0
  2. package/.rush/temp/chunked-rush-logs/gesture-handler.build_docs.chunks.jsonl +1 -0
  3. package/.rush/temp/chunked-rush-logs/gesture-handler.build_package-metas.chunks.jsonl +1 -0
  4. package/.rush/temp/operation/apply-exports/all.log +1 -0
  5. package/.rush/temp/operation/apply-exports/log-chunks.jsonl +1 -0
  6. package/.rush/temp/operation/apply-exports/state.json +3 -0
  7. package/.rush/temp/operation/build_docs/all.log +1 -0
  8. package/.rush/temp/operation/build_docs/log-chunks.jsonl +1 -0
  9. package/.rush/temp/operation/build_docs/state.json +3 -0
  10. package/.rush/temp/operation/build_package-metas/all.log +1 -0
  11. package/.rush/temp/operation/build_package-metas/log-chunks.jsonl +1 -0
  12. package/.rush/temp/operation/build_package-metas/state.json +3 -0
  13. package/.rush/temp/shrinkwrap-deps.json +3 -0
  14. package/config/rig.json +6 -0
  15. package/gesture-handler.ts +1211 -0
  16. package/index.css +5 -0
  17. package/index.ts +29 -0
  18. package/package.json +52 -0
  19. package/rush-logs/gesture-handler.apply-exports.cache.log +1 -0
  20. package/rush-logs/gesture-handler.apply-exports.log +1 -0
  21. package/rush-logs/gesture-handler.build_docs.cache.log +1 -0
  22. package/rush-logs/gesture-handler.build_docs.log +1 -0
  23. package/rush-logs/gesture-handler.build_package-metas.cache.log +1 -0
  24. package/rush-logs/gesture-handler.build_package-metas.log +1 -0
  25. package/src/gesture-handler.css +207 -0
  26. package/support/custom-elements.json +989 -0
  27. package/support/demos/carousel.html +44 -0
  28. package/support/demos/pinch.html +10 -0
  29. package/support/demos/sheet.html +50 -0
  30. package/support/demos/swipe.html +24 -0
  31. package/support/dist-docs/gesture-handler.md +339 -0
  32. package/support/docs/README.md +92 -0
  33. package/support/package-meta.json +489 -0
  34. package/support/tests/carousel.view.test.ts +67 -0
  35. package/support/tests/gesture-handler.test.ts +625 -0
  36. package/support/tests/pointer-utils.ts +62 -0
  37. package/support/tests/sheet.view.test.ts +112 -0
  38. package/support/tests/swipe.view.test.ts +44 -0
  39. package/tsconfig.json +5 -0
@@ -0,0 +1,112 @@
1
+ import "@excom/quark-sheet";
2
+ import "@excom/content-drawer";
3
+ import "../../index";
4
+ import {
5
+ afterEach,
6
+ describe,
7
+ expect,
8
+ it,
9
+ wait,
10
+ } from "@excom/heft-rig/profiles/default/config/test-utils";
11
+ import {
12
+ flush,
13
+ mountView,
14
+ readDemo,
15
+ } from "@excom/quark/support/tests/view-helpers";
16
+ import { drag, frame, pull } from "./pointer-utils";
17
+
18
+ describe("sheet view", () => {
19
+ afterEach(() => {
20
+ document.body.innerHTML = "";
21
+ });
22
+
23
+ it("scrubs the bottom sheet open and closed, committing on gesture-handler-end", async () => {
24
+ const { root } = await mountView(readDemo(import.meta.url, "sheet"));
25
+ const handler = root as HTMLGestureHandlerElement;
26
+ const drawer = root.querySelector("content-drawer")!;
27
+ const header = drawer.querySelector("header")!;
28
+ // happy-dom has no layout: give the drawer the height range-ref measures
29
+ Object.defineProperty(drawer, "offsetHeight", { value: 200 });
30
+ expect(handler.getAttribute("progress-offset")).toBe("0");
31
+ expect(drawer.hasAttribute("is-open")).toBe(false);
32
+
33
+ // a pointer down elsewhere than the header never starts
34
+ root.querySelector("button")!.dispatchEvent(
35
+ new PointerEvent("pointerdown", { pointerId: 1, pointerType: "touch", bubbles: true })
36
+ );
37
+ expect(handler.hasAttribute("is-active")).toBe(false);
38
+
39
+ // drag the header up three quarters of the way, no fling
40
+ const release = await drag(header, { x: 100, y: 300 }, { x: 100, y: 150 });
41
+ await flush();
42
+ expect(handler.getAttribute("gesture-type")).toBe("pan-y");
43
+ expect(handler.style.getPropertyValue("--gesture-progress")).toBe("0.75");
44
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(true);
45
+ await wait(150);
46
+ release();
47
+ expect(handler.provision?.snap).toBe(1);
48
+ await flush();
49
+ expect(drawer.hasAttribute("is-open")).toBe(true);
50
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(false);
51
+ expect(handler.getAttribute("progress-offset")).toBe("1");
52
+
53
+ // open: dragging down starts from 1 and a short drag snaps back to open
54
+ const stay = await drag(header, { x: 100, y: 100 }, { x: 100, y: 130 });
55
+ await frame();
56
+ expect(handler.style.getPropertyValue("--gesture-progress")).toBe("0.85");
57
+ await wait(150);
58
+ stay();
59
+ await flush();
60
+ expect(drawer.hasAttribute("is-open")).toBe(true);
61
+
62
+ // a long drag down closes it
63
+ const close = await drag(header, { x: 100, y: 100 }, { x: 100, y: 260 });
64
+ await wait(150);
65
+ close();
66
+ expect(handler.provision?.snap).toBe(0);
67
+ await flush();
68
+ expect(drawer.hasAttribute("is-open")).toBe(false);
69
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(false);
70
+ expect(handler.getAttribute("progress-offset")).toBe("0");
71
+ });
72
+
73
+ it("closes the open sheet by pulling its own content past the top (handoff-ref)", async () => {
74
+ const { root } = await mountView(readDemo(import.meta.url, "sheet"));
75
+ const handler = root as HTMLGestureHandlerElement;
76
+ const drawer = root.querySelector("content-drawer")!;
77
+ const header = drawer.querySelector("header")!;
78
+ const body = drawer.querySelector("p")!;
79
+ Object.defineProperty(drawer, "offsetHeight", { value: 200 });
80
+
81
+ // open it from the grab handle first
82
+ const open = await drag(header, { x: 100, y: 300 }, { x: 100, y: 150 });
83
+ await wait(150);
84
+ open();
85
+ await flush();
86
+ expect(drawer.hasAttribute("is-open")).toBe(true);
87
+ expect(handler.getAttribute("progress-offset")).toBe("1");
88
+
89
+ // scrolled content keeps scrolling: nothing is taken over
90
+ drawer.scrollTop = 50;
91
+ const scrolled = await pull(body, { x: 100, y: 100 }, { x: 100, y: 200 });
92
+ await flush();
93
+ expect(scrolled.first.defaultPrevented).toBe(false);
94
+ expect(handler.hasAttribute("is-active")).toBe(false);
95
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(false);
96
+
97
+ // back at the top, the same pull becomes the drag and closes the sheet
98
+ drawer.scrollTop = 0;
99
+ const handoff = await pull(body, { x: 100, y: 100 }, { x: 100, y: 260 });
100
+ await flush();
101
+ expect(handoff.first.defaultPrevented).toBe(true);
102
+ expect(handler.getAttribute("gesture-type")).toBe("pan-y");
103
+ expect(handler.style.getPropertyValue("--gesture-progress")).toBe("0.2");
104
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(true);
105
+ await wait(150);
106
+ handoff.release();
107
+ expect(handler.provision?.snap).toBe(0);
108
+ await flush();
109
+ expect(drawer.hasAttribute("is-open")).toBe(false);
110
+ expect(drawer.hasAttribute("is-scrubbing")).toBe(false);
111
+ });
112
+ });
@@ -0,0 +1,44 @@
1
+ import "@excom/quark-sheet";
2
+ import "../../index";
3
+ import {
4
+ afterEach,
5
+ describe,
6
+ expect,
7
+ it,
8
+ wait,
9
+ } from "@excom/heft-rig/profiles/default/config/test-utils";
10
+ import {
11
+ flush,
12
+ mountView,
13
+ readDemo,
14
+ } from "@excom/quark/support/tests/view-helpers";
15
+ import { drag, tap } from "./pointer-utils";
16
+
17
+ describe("swipe view", () => {
18
+ afterEach(() => {
19
+ document.body.innerHTML = "";
20
+ });
21
+
22
+ it("flicks the card away and taps it back", async () => {
23
+ const { root } = await mountView(readDemo(import.meta.url, "swipe"));
24
+ const handler = root as HTMLGestureHandlerElement;
25
+ const card = root.querySelector("article")!;
26
+
27
+ // a fling: release right after the last move
28
+ const release = await drag(card, { x: 50, y: 50 }, { x: 130, y: 50 });
29
+ await wait(2);
30
+ release();
31
+ expect(handler.getAttribute("last-gesture")).toBe("swipe-right");
32
+ expect(handler.provision?.snap).toBe(1);
33
+ await wait(0);
34
+ await flush();
35
+ expect(handler.style.getPropertyValue("--gesture-progress")).toBe("1");
36
+ expect(card.hasAttribute("data-is-dismissed")).toBe(true);
37
+
38
+ await tap(card);
39
+ await flush();
40
+ expect(handler.getAttribute("last-gesture")).toBe("tap");
41
+ expect(handler.style.getPropertyValue("--gesture-progress")).toBe("0");
42
+ expect(card.hasAttribute("data-is-dismissed")).toBe(false);
43
+ });
44
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "@excom/heft-rig/profiles/default/config/tsconfig.json",
3
+ "include": ["./*.ts"],
4
+ "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
5
+ }