@pinecall/dot 0.11.23 → 0.11.25
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/README.md +145 -63
- package/dist/agent/index.d.ts +3 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/tutor.d.ts +12 -10
- package/dist/agent/tutor.d.ts.map +1 -1
- package/dist/agent/tutor.js +81 -68
- package/dist/agent/tutor.js.map +1 -1
- package/dist/agent/walks.d.ts +19 -0
- package/dist/agent/walks.d.ts.map +1 -0
- package/dist/agent/walks.js +89 -0
- package/dist/agent/walks.js.map +1 -0
- package/dist/page/page.d.ts +2 -2
- package/dist/page/page.d.ts.map +1 -1
- package/dist/page/page.js +5 -5
- package/dist/page/page.js.map +1 -1
- package/dist/page/roles.d.ts +2 -0
- package/dist/page/roles.d.ts.map +1 -1
- package/dist/page/roles.js +21 -2
- package/dist/page/roles.js.map +1 -1
- package/dist/pointer/asking.d.ts +25 -0
- package/dist/pointer/asking.d.ts.map +1 -0
- package/dist/pointer/asking.js +82 -0
- package/dist/pointer/asking.js.map +1 -0
- package/dist/pointer/flight.d.ts +40 -4
- package/dist/pointer/flight.d.ts.map +1 -1
- package/dist/pointer/flight.js +139 -17
- package/dist/pointer/flight.js.map +1 -1
- package/dist/pointer/frames.d.ts +28 -0
- package/dist/pointer/frames.d.ts.map +1 -0
- package/dist/pointer/frames.js +66 -0
- package/dist/pointer/frames.js.map +1 -0
- package/dist/pointer/icons.d.ts +8 -0
- package/dist/pointer/icons.d.ts.map +1 -0
- package/dist/pointer/icons.js +15 -0
- package/dist/pointer/icons.js.map +1 -0
- package/dist/pointer/menu.d.ts +5 -4
- package/dist/pointer/menu.d.ts.map +1 -1
- package/dist/pointer/menu.js +56 -47
- package/dist/pointer/menu.js.map +1 -1
- package/dist/pointer/person.d.ts +13 -2
- package/dist/pointer/person.d.ts.map +1 -1
- package/dist/pointer/person.js +47 -41
- package/dist/pointer/person.js.map +1 -1
- package/dist/pointer/pressing.d.ts +6 -0
- package/dist/pointer/pressing.d.ts.map +1 -0
- package/dist/pointer/pressing.js +32 -0
- package/dist/pointer/pressing.js.map +1 -0
- package/dist/pointer/sections.d.ts +4 -7
- package/dist/pointer/sections.d.ts.map +1 -1
- package/dist/pointer/sections.js +11 -17
- package/dist/pointer/sections.js.map +1 -1
- package/dist/pointer/typing.d.ts +5 -3
- package/dist/pointer/typing.d.ts.map +1 -1
- package/dist/pointer/typing.js +46 -15
- package/dist/pointer/typing.js.map +1 -1
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +108 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/questions.d.ts +30 -0
- package/dist/server/questions.d.ts.map +1 -0
- package/dist/server/questions.js +136 -0
- package/dist/server/questions.js.map +1 -0
- package/dist/server/saying.d.ts +31 -0
- package/dist/server/saying.d.ts.map +1 -0
- package/dist/server/saying.js +124 -0
- package/dist/server/saying.js.map +1 -0
- package/dist/tutor/acting.d.ts +42 -0
- package/dist/tutor/acting.d.ts.map +1 -0
- package/dist/tutor/acting.js +180 -0
- package/dist/tutor/acting.js.map +1 -0
- package/dist/tutor/aloud.d.ts +50 -0
- package/dist/tutor/aloud.d.ts.map +1 -0
- package/dist/tutor/aloud.js +288 -0
- package/dist/tutor/aloud.js.map +1 -0
- package/dist/tutor/ask.d.ts +49 -0
- package/dist/tutor/ask.d.ts.map +1 -0
- package/dist/tutor/ask.js +47 -0
- package/dist/tutor/ask.js.map +1 -0
- package/dist/tutor/listening.d.ts +17 -0
- package/dist/tutor/listening.d.ts.map +1 -0
- package/dist/tutor/listening.js +66 -0
- package/dist/tutor/listening.js.map +1 -0
- package/dist/tutor/options.d.ts +37 -1
- package/dist/tutor/options.d.ts.map +1 -1
- package/dist/tutor/options.js +1 -1
- package/dist/tutor/options.js.map +1 -1
- package/dist/tutor/reading.d.ts +58 -0
- package/dist/tutor/reading.d.ts.map +1 -0
- package/dist/tutor/reading.js +193 -0
- package/dist/tutor/reading.js.map +1 -0
- package/dist/tutor/text.d.ts +16 -0
- package/dist/tutor/text.d.ts.map +1 -0
- package/dist/tutor/text.js +119 -0
- package/dist/tutor/text.js.map +1 -0
- package/dist/tutor/tutor.d.ts +2 -9
- package/dist/tutor/tutor.d.ts.map +1 -1
- package/dist/tutor/tutor.js +110 -87
- package/dist/tutor/tutor.js.map +1 -1
- package/dist/tutor/walking.d.ts +26 -8
- package/dist/tutor/walking.d.ts.map +1 -1
- package/dist/tutor/walking.js +145 -30
- package/dist/tutor/walking.js.map +1 -1
- package/dist/tutor/walks.d.ts +33 -0
- package/dist/tutor/walks.d.ts.map +1 -1
- package/dist/tutor/walks.js +121 -13
- package/dist/tutor/walks.js.map +1 -1
- package/dist/wire/acts.d.ts +60 -0
- package/dist/wire/acts.d.ts.map +1 -0
- package/dist/wire/acts.js +120 -0
- package/dist/wire/acts.js.map +1 -0
- package/dist/wire/ask.d.ts +132 -0
- package/dist/wire/ask.d.ts.map +1 -0
- package/dist/wire/ask.js +102 -0
- package/dist/wire/ask.js.map +1 -0
- package/dist/wire/index.d.ts +38 -8
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +86 -12
- package/dist/wire/index.js.map +1 -1
- package/docs/macros.md +216 -0
- package/docs/write-a-tutor.md +247 -0
- package/package.json +11 -6
package/dist/page/roles.js
CHANGED
|
@@ -39,6 +39,12 @@ export function roleOf(element) {
|
|
|
39
39
|
return "listitem";
|
|
40
40
|
if (tag === "details")
|
|
41
41
|
return "group";
|
|
42
|
+
if (tag === "search")
|
|
43
|
+
return "search";
|
|
44
|
+
if (tag === "table")
|
|
45
|
+
return "table";
|
|
46
|
+
if (tag === "tr")
|
|
47
|
+
return "row";
|
|
42
48
|
if (tag === "p")
|
|
43
49
|
return "text";
|
|
44
50
|
return null;
|
|
@@ -57,7 +63,7 @@ export function clean(text, max = 80) {
|
|
|
57
63
|
return line.length > max ? `${line.slice(0, max - 1)}…` : line;
|
|
58
64
|
}
|
|
59
65
|
/** The roles whose name is their own words: nothing under them is said again. */
|
|
60
|
-
export const SAID_WHOLE = new Set(["link", "button", "tab", "heading", "text", "textbox", "combobox", "listitem"]);
|
|
66
|
+
export const SAID_WHOLE = new Set(["link", "button", "tab", "option", "menuitem", "heading", "text", "textbox", "combobox", "listitem", "row"]);
|
|
61
67
|
/** What a person calls the element. A field is its label, never its value: a value never leaves the page. */
|
|
62
68
|
export function nameOf(element, role) {
|
|
63
69
|
const label = element.getAttribute("aria-label");
|
|
@@ -68,12 +74,25 @@ export function nameOf(element, role) {
|
|
|
68
74
|
return clean(by.split(/\s+/).map((id) => element.ownerDocument.getElementById(id)?.textContent ?? "").join(" "));
|
|
69
75
|
if (role === "img")
|
|
70
76
|
return clean(element.getAttribute("alt") ?? element.textContent);
|
|
77
|
+
if (role === "table")
|
|
78
|
+
return clean(element.querySelector("caption")?.textContent);
|
|
79
|
+
// A row is its cells, as a person reads them across: "Tue, Oct 28 · 9:00 · Dr. Patel".
|
|
80
|
+
if (role === "row")
|
|
81
|
+
return clean([...element.children].map((cell) => clean(cell.textContent)).filter((text) => text !== "").join(" · "), 160);
|
|
71
82
|
if (role === "textbox" || role === "combobox")
|
|
72
83
|
return fieldLabel(element);
|
|
73
84
|
if (SAID_WHOLE.has(role))
|
|
74
|
-
return clean(element
|
|
85
|
+
return clean(wordsOf(element), role === "text" ? 120 : 80);
|
|
75
86
|
return "";
|
|
76
87
|
}
|
|
88
|
+
/** An element's words, a space between its parts: `<b>la-espiga</b><span>not held</span>` reads "la-espiga not held", never "la-espiganot held". */
|
|
89
|
+
export function wordsOf(element) {
|
|
90
|
+
const walker = element.ownerDocument.createTreeWalker(element, NodeFilter.SHOW_TEXT);
|
|
91
|
+
const parts = [];
|
|
92
|
+
for (let node = walker.nextNode(); node !== null; node = walker.nextNode())
|
|
93
|
+
parts.push(node.textContent ?? "");
|
|
94
|
+
return parts.join(" ");
|
|
95
|
+
}
|
|
77
96
|
// The label's own words, without the field inside it: a <label> that wraps its input holds the value too.
|
|
78
97
|
function fieldLabel(field) {
|
|
79
98
|
const id = field.getAttribute("id");
|
package/dist/page/roles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/page/roles.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/page/roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** The field in the walks' menu where the visitor types what they want shown: "where do I see what each plan includes?". */
|
|
2
|
+
export interface AskingOptions {
|
|
3
|
+
/** The field's placeholder: "Ask me to show you…". */
|
|
4
|
+
placeholder: string;
|
|
5
|
+
/** What was typed, sent. */
|
|
6
|
+
onAsk: (text: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare class Asking {
|
|
9
|
+
#private;
|
|
10
|
+
/** The field and its line, for the menu to place and to keep its clicks inside. */
|
|
11
|
+
readonly element: HTMLFormElement;
|
|
12
|
+
constructor(document: Document, host: (element: Element) => void, options: AskingOptions);
|
|
13
|
+
/** Shown with the menu, or not. */
|
|
14
|
+
show(on: boolean): void;
|
|
15
|
+
/** Stand with its bottom `bottom` px above the window's bottom edge, its end `edge` px in from the side the face rests on. */
|
|
16
|
+
place(bottom: number, edge: number, right: boolean): void;
|
|
17
|
+
/** A line under the field about what was asked, with one button; null takes it away. */
|
|
18
|
+
hint(text: string | null, action?: {
|
|
19
|
+
label: string;
|
|
20
|
+
onClick: () => void;
|
|
21
|
+
}): void;
|
|
22
|
+
focus(): void;
|
|
23
|
+
close(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=asking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asking.d.ts","sourceRoot":"","sources":["../../src/pointer/asking.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAwB5H,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,MAAM;;IACjB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAQlC,YAAY,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,aAAa,EAwBvF;IAED,mCAAmC;IACnC,IAAI,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAEtB;IAED,8HAA8H;IAC9H,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAExD;IAED,wFAAwF;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAM/E;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,KAAK,IAAI,IAAI,CAGZ;CACF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** The field in the walks' menu where the visitor types what they want shown: "where do I see what each plan includes?". */
|
|
2
|
+
//
|
|
3
|
+
// It stands above the menu's pills while the menu is open, and sends what was typed on Enter. Under it a
|
|
4
|
+
// line can say what came of it ("That one is a question for the agent") with one button, to take it on.
|
|
5
|
+
// It never answers in words of its own: the tutor does a thing on the page, or offers the agent.
|
|
6
|
+
// Colours: --pc-bubble, --pc-bubble-ink, --pc-face.
|
|
7
|
+
const STYLE = `
|
|
8
|
+
.pc-ask { position: fixed; z-index: 3; display: flex; flex-direction: column; gap: 6px; width: min(270px, calc(100vw - 32px)); pointer-events: auto; }
|
|
9
|
+
.pc-ask[hidden] { display: none; }
|
|
10
|
+
.pc-ask input { all: unset; box-sizing: border-box; width: 100%; height: 32px; padding: 0 14px; border-radius: 999px;
|
|
11
|
+
background: var(--pc-bubble, #fff); color: var(--pc-bubble-ink, #17201c); font: 500 13px/32px system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
12
|
+
box-shadow: 0 4px 14px rgb(0 0 0 / .18), 0 0 0 1px color-mix(in srgb, var(--pc-face, #1f6b55) 35%, transparent); }
|
|
13
|
+
.pc-ask input:focus-visible { box-shadow: 0 4px 14px rgb(0 0 0 / .18), 0 0 0 2px var(--pc-face, #1f6b55); }
|
|
14
|
+
.pc-ask-hint { display: flex; align-items: center; gap: 8px; padding: 8px 10px 8px 12px; border-radius: 14px; background: var(--pc-bubble, #fff);
|
|
15
|
+
color: var(--pc-bubble-ink, #17201c); font: 13px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif; box-shadow: 0 4px 14px rgb(0 0 0 / .18); }
|
|
16
|
+
.pc-ask-hint[hidden] { display: none; }
|
|
17
|
+
.pc-ask-hint span { flex: 1; }
|
|
18
|
+
.pc-ask-hint button { all: unset; flex: none; padding: 5px 10px; border-radius: 999px; cursor: pointer; font-weight: 600; font-size: 12px;
|
|
19
|
+
background: var(--pc-face, #1f6b55); color: #fff; }
|
|
20
|
+
.pc-ask-hint button[hidden] { display: none; }
|
|
21
|
+
.pc-ask-hint button:focus-visible { outline: 2px solid var(--pc-face-ring, #44a785); outline-offset: 2px; }
|
|
22
|
+
`;
|
|
23
|
+
export class Asking {
|
|
24
|
+
/** The field and its line, for the menu to place and to keep its clicks inside. */
|
|
25
|
+
element;
|
|
26
|
+
#style;
|
|
27
|
+
#input;
|
|
28
|
+
#hint;
|
|
29
|
+
#said;
|
|
30
|
+
#act;
|
|
31
|
+
#action = null;
|
|
32
|
+
constructor(document, host, options) {
|
|
33
|
+
this.#style = document.createElement("style");
|
|
34
|
+
this.#style.textContent = STYLE;
|
|
35
|
+
document.head.append(this.#style);
|
|
36
|
+
this.element = document.createElement("form");
|
|
37
|
+
this.element.className = "pc-ask";
|
|
38
|
+
this.element.hidden = true;
|
|
39
|
+
this.element.innerHTML = `<div class="pc-ask-hint" role="status" hidden><span></span><button type="button" hidden></button></div><input type="text" maxlength="300" autocomplete="off">`;
|
|
40
|
+
this.#input = this.element.querySelector("input") ?? document.createElement("input");
|
|
41
|
+
this.#input.placeholder = options.placeholder;
|
|
42
|
+
this.#input.setAttribute("aria-label", options.placeholder);
|
|
43
|
+
this.#hint = this.element.querySelector(".pc-ask-hint") ?? document.createElement("div");
|
|
44
|
+
this.#said = this.#hint.querySelector("span") ?? document.createElement("span");
|
|
45
|
+
this.#act = this.#hint.querySelector("button") ?? document.createElement("button");
|
|
46
|
+
this.#act.addEventListener("click", () => this.#action?.());
|
|
47
|
+
this.element.addEventListener("submit", (event) => {
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
const text = this.#input.value.trim();
|
|
50
|
+
if (text === "")
|
|
51
|
+
return;
|
|
52
|
+
this.#input.value = "";
|
|
53
|
+
this.hint(null);
|
|
54
|
+
options.onAsk(text);
|
|
55
|
+
});
|
|
56
|
+
host(this.element);
|
|
57
|
+
}
|
|
58
|
+
/** Shown with the menu, or not. */
|
|
59
|
+
show(on) {
|
|
60
|
+
this.element.hidden = !on;
|
|
61
|
+
}
|
|
62
|
+
/** Stand with its bottom `bottom` px above the window's bottom edge, its end `edge` px in from the side the face rests on. */
|
|
63
|
+
place(bottom, edge, right) {
|
|
64
|
+
Object.assign(this.element.style, { bottom: `${bottom}px`, right: right ? `${edge}px` : "auto", left: right ? "auto" : `${edge}px` });
|
|
65
|
+
}
|
|
66
|
+
/** A line under the field about what was asked, with one button; null takes it away. */
|
|
67
|
+
hint(text, action) {
|
|
68
|
+
this.#hint.hidden = text === null;
|
|
69
|
+
this.#said.textContent = text ?? "";
|
|
70
|
+
this.#act.hidden = action === undefined;
|
|
71
|
+
this.#act.textContent = action?.label ?? "";
|
|
72
|
+
this.#action = action?.onClick ?? null;
|
|
73
|
+
}
|
|
74
|
+
focus() {
|
|
75
|
+
this.#input.focus();
|
|
76
|
+
}
|
|
77
|
+
close() {
|
|
78
|
+
this.element.remove();
|
|
79
|
+
this.#style.remove();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=asking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asking.js","sourceRoot":"","sources":["../../src/pointer/asking.ts"],"names":[],"mappings":"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"}
|
package/dist/pointer/flight.d.ts
CHANGED
|
@@ -14,17 +14,53 @@ export declare function along(from: Point, to: Point, u: number): Point;
|
|
|
14
14
|
* 60 px in), so the pointer shows the words rather than covering them; else the middle of its box.
|
|
15
15
|
*/
|
|
16
16
|
export declare function aimOf(element: Element): Point;
|
|
17
|
+
/**
|
|
18
|
+
* Where the pointer stands to show a block being read without covering it: its tip at the block's first
|
|
19
|
+
* line, the face to its left, in the margin (`west`); above the block where the left has no room.
|
|
20
|
+
*/
|
|
21
|
+
export declare function besideOf(element: Element): {
|
|
22
|
+
aim: Point;
|
|
23
|
+
side: {
|
|
24
|
+
west: boolean;
|
|
25
|
+
up: boolean;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
17
28
|
/** Run `step(u)` from 0 to 1 over `ms`, once a frame; resolves at 1. */
|
|
18
29
|
export declare function animate(ms: number, step: (u: number) => void): Promise<void>;
|
|
19
30
|
/**
|
|
20
|
-
* The scroll at which `box` (as the screen shows it at `scrollY`)
|
|
21
|
-
* tall
|
|
22
|
-
*
|
|
31
|
+
* The scroll at which `box` (as the screen shows it at `scrollY`) is best seen in the part of a screen
|
|
32
|
+
* `height` tall that the site's own header leaves free (`covered` px at its top), within a page
|
|
33
|
+
* `pageHeight` tall. One that fits is shown whole, its middle as near `where` of that part as it can be
|
|
34
|
+
* with nothing cut; one that does not (a long section, a phone) shows from its start, just under the
|
|
35
|
+
* header, so as much of it as fits is seen.
|
|
23
36
|
*/
|
|
24
37
|
export declare function scrollGoal(box: {
|
|
25
38
|
top: number;
|
|
26
39
|
height: number;
|
|
27
|
-
}, scrollY: number, height: number, pageHeight: number, where: number): number;
|
|
40
|
+
}, scrollY: number, height: number, pageHeight: number, where: number, covered?: number): number;
|
|
41
|
+
/**
|
|
42
|
+
* How much of the screen's top the site itself covers, in px: its `scroll-padding-top` when it says, and
|
|
43
|
+
* the bottom of any fixed or sticky bar along the top edge (a header), whichever is lower. The tutor's own
|
|
44
|
+
* layer does not count.
|
|
45
|
+
*/
|
|
46
|
+
export declare function coveredTop(document: Document): number;
|
|
28
47
|
/** Scroll the page, eased, until the element sits at `where` of the screen's height. Nothing when it is there already. */
|
|
29
48
|
export declare function scrollOnto(element: Element, where: number, still: boolean): Promise<void>;
|
|
49
|
+
/** What a box that scrolls keeps clear at its top, in px: its own `scroll-padding-top` (a bar stuck inside it). */
|
|
50
|
+
export declare function paddingOf(scroller: Element): number;
|
|
51
|
+
/**
|
|
52
|
+
* What can be seen where `element` stands, on the top page's screen: the screen under the site's header, cut down
|
|
53
|
+
* by every box the element scrolls in, and in a frame, by the frame's screen and every box the frame scrolls in.
|
|
54
|
+
*/
|
|
55
|
+
export declare function seenOf(element: Element): {
|
|
56
|
+
top: number;
|
|
57
|
+
bottom: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Whether `element` is shown whole in the part of the screen it scrolls in that the site leaves free (its
|
|
61
|
+
* scrolling box, under the site's header); one taller than that part, from its start, near the top.
|
|
62
|
+
*/
|
|
63
|
+
export declare function shownWhole(element: Element): boolean;
|
|
64
|
+
/** The box that scrolls `element` up and down: its nearest ancestor that does, or null when it is the page itself. */
|
|
65
|
+
export declare function scrollerOf(element: Element): Element | null;
|
|
30
66
|
//# sourceMappingURL=flight.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../../src/pointer/flight.ts"],"names":[],"mappings":"AAAA,2HAA2H;
|
|
1
|
+
{"version":3,"file":"flight.d.ts","sourceRoot":"","sources":["../../src/pointer/flight.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAQ3H,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,uDAAuD;AACvD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,+FAA+F;AAC/F,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAS9D;AAKD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAgB7C;AAKD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAI/F;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E;AAKD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,MAAM,CASxJ;AAKD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAkBrD;AAED,0HAA0H;AAC1H,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/F;AAED,mHAAmH;AACnH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAGnD;AAiBD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiBxE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQpD;AAED,sHAAsH;AACtH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAO3D"}
|
package/dist/pointer/flight.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/** How the pointer moves: where it aims on an element, the path it flies, and the page scrolled like a hand scrolls it. */
|
|
2
2
|
//
|
|
3
3
|
// The path is the screen recorder's: minimum jerk, timed by the distance, with a slight arc off the
|
|
4
|
-
// straight line, the way a hand moves a mouse.
|
|
4
|
+
// straight line, the way a hand moves a mouse. Every box is the top page's, an element in a frame of the
|
|
5
|
+
// site's own too (`frames.ts`).
|
|
6
|
+
import { boxOf, frameOf, onTop, originOf } from "./frames.js";
|
|
5
7
|
/** Minimum jerk: 0 to 1, starting and ending still. */
|
|
6
8
|
export function minJerk(u) {
|
|
7
9
|
return u * u * u * (10 + u * (-15 + 6 * u));
|
|
@@ -39,14 +41,26 @@ export function aimOf(element) {
|
|
|
39
41
|
if (text !== null) {
|
|
40
42
|
const range = document.createRange();
|
|
41
43
|
range.selectNodeContents(text);
|
|
42
|
-
const words = range.getClientRects()[0] ?? range.getBoundingClientRect();
|
|
44
|
+
const words = onTop(range.getClientRects()[0] ?? range.getBoundingClientRect(), document);
|
|
43
45
|
if (words.width > 0)
|
|
44
46
|
return { x: words.left + Math.min(words.width / 2, 60), y: words.bottom + UNDER };
|
|
45
47
|
}
|
|
46
48
|
}
|
|
47
|
-
const box = element
|
|
49
|
+
const box = boxOf(element);
|
|
48
50
|
return { x: box.left + box.width / 2, y: box.top + Math.min(box.height / 2, 60) };
|
|
49
51
|
}
|
|
52
|
+
/** How much room the face needs at a block's left to stand beside it, in px. */
|
|
53
|
+
const BESIDE = 72;
|
|
54
|
+
/**
|
|
55
|
+
* Where the pointer stands to show a block being read without covering it: its tip at the block's first
|
|
56
|
+
* line, the face to its left, in the margin (`west`); above the block where the left has no room.
|
|
57
|
+
*/
|
|
58
|
+
export function besideOf(element) {
|
|
59
|
+
const box = boxOf(element);
|
|
60
|
+
if (box.left >= BESIDE)
|
|
61
|
+
return { aim: { x: box.left - 2, y: box.top + Math.min(10, box.height / 2) }, side: { west: true, up: false } };
|
|
62
|
+
return { aim: { x: box.left + 16, y: box.top - 4 }, side: { west: false, up: true } };
|
|
63
|
+
}
|
|
50
64
|
/** Run `step(u)` from 0 to 1 over `ms`, once a frame; resolves at 1. */
|
|
51
65
|
export function animate(ms, step) {
|
|
52
66
|
const start = performance.now();
|
|
@@ -62,31 +76,139 @@ export function animate(ms, step) {
|
|
|
62
76
|
requestAnimationFrame(frame);
|
|
63
77
|
});
|
|
64
78
|
}
|
|
65
|
-
/** How
|
|
66
|
-
const
|
|
67
|
-
/** Where a tall element's start stands, as a share of the screen's height. */
|
|
68
|
-
const START = 0.1;
|
|
79
|
+
/** How far from the edges of the free part of the screen what is shown stands, in px. */
|
|
80
|
+
const MARGIN = 16;
|
|
69
81
|
/**
|
|
70
|
-
* The scroll at which `box` (as the screen shows it at `scrollY`)
|
|
71
|
-
* tall
|
|
72
|
-
*
|
|
82
|
+
* The scroll at which `box` (as the screen shows it at `scrollY`) is best seen in the part of a screen
|
|
83
|
+
* `height` tall that the site's own header leaves free (`covered` px at its top), within a page
|
|
84
|
+
* `pageHeight` tall. One that fits is shown whole, its middle as near `where` of that part as it can be
|
|
85
|
+
* with nothing cut; one that does not (a long section, a phone) shows from its start, just under the
|
|
86
|
+
* header, so as much of it as fits is seen.
|
|
73
87
|
*/
|
|
74
|
-
export function scrollGoal(box, scrollY, height, pageHeight, where) {
|
|
75
|
-
const
|
|
76
|
-
|
|
88
|
+
export function scrollGoal(box, scrollY, height, pageHeight, where, covered = 0) {
|
|
89
|
+
const free = height - covered;
|
|
90
|
+
// Where its top should stand on the screen.
|
|
91
|
+
let top = covered + MARGIN;
|
|
92
|
+
if (box.height <= free - 2 * MARGIN) {
|
|
93
|
+
const centred = covered + free * where - box.height / 2;
|
|
94
|
+
top = Math.min(Math.max(centred, covered + MARGIN), height - MARGIN - box.height);
|
|
95
|
+
}
|
|
96
|
+
return Math.max(0, Math.min(pageHeight - height, scrollY + box.top - top));
|
|
97
|
+
}
|
|
98
|
+
/** The most of the screen's top a site's bar may cover and still count as a header, as a share of the screen's height. */
|
|
99
|
+
const A_HEADER = 0.4;
|
|
100
|
+
/**
|
|
101
|
+
* How much of the screen's top the site itself covers, in px: its `scroll-padding-top` when it says, and
|
|
102
|
+
* the bottom of any fixed or sticky bar along the top edge (a header), whichever is lower. The tutor's own
|
|
103
|
+
* layer does not count.
|
|
104
|
+
*/
|
|
105
|
+
export function coveredTop(document) {
|
|
106
|
+
const view = document.defaultView;
|
|
107
|
+
if (view === null)
|
|
108
|
+
return 0;
|
|
109
|
+
const padding = Number.parseFloat(view.getComputedStyle(document.documentElement).scrollPaddingTop);
|
|
110
|
+
let covered = Number.isFinite(padding) ? padding : 0;
|
|
111
|
+
const most = view.innerHeight * A_HEADER;
|
|
112
|
+
for (const x of [0.25, 0.5, 0.75].map((share) => view.innerWidth * share)) {
|
|
113
|
+
for (const hit of document.elementsFromPoint?.(x, 1) ?? []) {
|
|
114
|
+
for (let node = hit; node !== null; node = node.parentElement) {
|
|
115
|
+
if (node.closest("[data-pinecall-skip]") !== null)
|
|
116
|
+
break;
|
|
117
|
+
const position = view.getComputedStyle(node).position;
|
|
118
|
+
if (position !== "fixed" && position !== "sticky")
|
|
119
|
+
continue;
|
|
120
|
+
const box = node.getBoundingClientRect();
|
|
121
|
+
if (box.top <= 1 && box.height < most)
|
|
122
|
+
covered = Math.max(covered, box.bottom);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return Math.min(covered, most);
|
|
77
127
|
}
|
|
78
128
|
/** Scroll the page, eased, until the element sits at `where` of the screen's height. Nothing when it is there already. */
|
|
79
129
|
export async function scrollOnto(element, where, still) {
|
|
80
130
|
const view = element.ownerDocument.defaultView;
|
|
81
131
|
if (view === null)
|
|
82
132
|
return;
|
|
133
|
+
// The innermost box first, then each one it stands in, then the page: a line of an output that scrolls is
|
|
134
|
+
// brought into the output, and the output into the page. In a frame, its page, then the frame in the one around it.
|
|
135
|
+
let scroller = scrollerOf(element);
|
|
136
|
+
for (;;) {
|
|
137
|
+
await scrollWithin(element, scroller, where, still, view);
|
|
138
|
+
if (scroller === null)
|
|
139
|
+
break;
|
|
140
|
+
scroller = scrollerOf(scroller);
|
|
141
|
+
}
|
|
142
|
+
const frame = frameOf(element.ownerDocument);
|
|
143
|
+
if (frame !== null)
|
|
144
|
+
await scrollOnto(frame, where, still);
|
|
145
|
+
}
|
|
146
|
+
/** What a box that scrolls keeps clear at its top, in px: its own `scroll-padding-top` (a bar stuck inside it). */
|
|
147
|
+
export function paddingOf(scroller) {
|
|
148
|
+
const padding = Number.parseFloat(scroller.ownerDocument.defaultView?.getComputedStyle(scroller).scrollPaddingTop ?? "");
|
|
149
|
+
return Number.isFinite(padding) ? Math.max(0, padding) : 0;
|
|
150
|
+
}
|
|
151
|
+
/** `element` scrolled into view within one box: `scroller`, or the page when null. */
|
|
152
|
+
async function scrollWithin(element, scroller, where, still, view) {
|
|
83
153
|
const box = element.getBoundingClientRect();
|
|
84
|
-
const
|
|
85
|
-
const
|
|
154
|
+
const frame = scroller === null ? { top: 0, height: view.innerHeight } : scroller.getBoundingClientRect();
|
|
155
|
+
const covered = Math.max(0, coveredTop(element.ownerDocument) - frame.top, scroller === null ? 0 : paddingOf(scroller));
|
|
156
|
+
const from = scroller === null ? view.scrollY : scroller.scrollTop;
|
|
157
|
+
const total = scroller === null ? element.ownerDocument.documentElement.scrollHeight : scroller.scrollHeight;
|
|
158
|
+
const height = scroller === null ? view.innerHeight : scroller.clientHeight;
|
|
159
|
+
const goal = scrollGoal({ top: box.top - frame.top, height: box.height }, from, height, total, where, covered);
|
|
86
160
|
const dy = goal - from;
|
|
87
161
|
if (Math.abs(dy) < 8)
|
|
88
162
|
return;
|
|
89
|
-
const ms = still ? 0 : Math.round(520 + 680 * Math.min(1, Math.abs(dy) / (
|
|
90
|
-
await animate(ms, (u) => view.scrollTo(0, from + dy * minJerk(u)));
|
|
163
|
+
const ms = still ? 0 : Math.round(520 + 680 * Math.min(1, Math.abs(dy) / (height * 2)));
|
|
164
|
+
await animate(ms, (u) => (scroller === null ? view.scrollTo(0, from + dy * minJerk(u)) : scroller.scrollTo(0, from + dy * minJerk(u))));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* What can be seen where `element` stands, on the top page's screen: the screen under the site's header, cut down
|
|
168
|
+
* by every box the element scrolls in, and in a frame, by the frame's screen and every box the frame scrolls in.
|
|
169
|
+
*/
|
|
170
|
+
export function seenOf(element) {
|
|
171
|
+
let top = -Infinity;
|
|
172
|
+
let bottom = Infinity;
|
|
173
|
+
for (let node = element; node !== null; node = frameOf(node.ownerDocument)) {
|
|
174
|
+
const page = node.ownerDocument;
|
|
175
|
+
const view = page.defaultView;
|
|
176
|
+
if (view === null)
|
|
177
|
+
break;
|
|
178
|
+
const at = originOf(page).y;
|
|
179
|
+
top = Math.max(top, at + (frameOf(page) === null ? coveredTop(page) : 0));
|
|
180
|
+
bottom = Math.min(bottom, at + view.innerHeight);
|
|
181
|
+
for (let scroller = scrollerOf(node); scroller !== null; scroller = scrollerOf(scroller)) {
|
|
182
|
+
const frame = scroller.getBoundingClientRect();
|
|
183
|
+
top = Math.max(top, at + frame.top + paddingOf(scroller));
|
|
184
|
+
bottom = Math.min(bottom, at + frame.bottom);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { top, bottom };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Whether `element` is shown whole in the part of the screen it scrolls in that the site leaves free (its
|
|
191
|
+
* scrolling box, under the site's header); one taller than that part, from its start, near the top.
|
|
192
|
+
*/
|
|
193
|
+
export function shownWhole(element) {
|
|
194
|
+
if (element.ownerDocument.defaultView === null)
|
|
195
|
+
return true;
|
|
196
|
+
const seen = seenOf(element);
|
|
197
|
+
const top = seen.top + MARGIN / 2;
|
|
198
|
+
const bottom = seen.bottom - MARGIN / 2;
|
|
199
|
+
const box = boxOf(element);
|
|
200
|
+
if (box.height > bottom - top)
|
|
201
|
+
return box.top >= top && box.top <= top + (bottom - top) * 0.3;
|
|
202
|
+
return box.top >= top && box.bottom <= bottom;
|
|
203
|
+
}
|
|
204
|
+
/** The box that scrolls `element` up and down: its nearest ancestor that does, or null when it is the page itself. */
|
|
205
|
+
export function scrollerOf(element) {
|
|
206
|
+
const view = element.ownerDocument.defaultView;
|
|
207
|
+
for (let node = element.parentElement; node !== null && node !== element.ownerDocument.body && node !== element.ownerDocument.documentElement; node = node.parentElement) {
|
|
208
|
+
const overflow = view?.getComputedStyle(node).overflowY ?? "";
|
|
209
|
+
if ((overflow === "auto" || overflow === "scroll") && node.scrollHeight > node.clientHeight)
|
|
210
|
+
return node;
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
91
213
|
}
|
|
92
214
|
//# sourceMappingURL=flight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight.js","sourceRoot":"","sources":["../../src/pointer/flight.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flight.js","sourceRoot":"","sources":["../../src/pointer/flight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** A frame of the site's own (same origin) as the pointer sees it: where its elements stand on the page's screen, and the documents it holds. */
|
|
2
|
+
/** A box on the top page's screen. */
|
|
3
|
+
export interface Box {
|
|
4
|
+
left: number;
|
|
5
|
+
top: number;
|
|
6
|
+
right: number;
|
|
7
|
+
bottom: number;
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
}
|
|
11
|
+
/** The frame `document` is shown in, or null for the top page (or a frame whose page is closed to this one). */
|
|
12
|
+
export declare function frameOf(document: Document): Element | null;
|
|
13
|
+
/** The page a frame shows, when it is the site's own and loaded; null for another origin's, or none yet. */
|
|
14
|
+
export declare function pageOf(frame: Element): Document | null;
|
|
15
|
+
/** Where `document`'s screen starts on the top page's. */
|
|
16
|
+
export declare function originOf(document: Document): {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
/** A box of `document`'s screen, on the top page's. */
|
|
21
|
+
export declare function onTop(box: Box, document: Document): Box;
|
|
22
|
+
/** `element`'s box on the top page's screen. */
|
|
23
|
+
export declare function boxOf(element: Element): Box;
|
|
24
|
+
/** The pages of the site's own frames inside `root`, in order; a frame of another origin, or not loaded, is left out. */
|
|
25
|
+
export declare function framesIn(root: ParentNode): Document[];
|
|
26
|
+
/** Whether `node` is an element, in any window. */
|
|
27
|
+
export declare function isElement(node: Node | null | undefined): node is Element;
|
|
28
|
+
//# sourceMappingURL=frames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/pointer/frames.ts"],"names":[],"mappings":"AAAA,iJAAiJ;AAQjJ,sCAAsC;AACtC,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gHAAgH;AAChH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAW1D;AAED,4GAA4G;AAC5G,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAOtD;AAED,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CASrE;AAED,uDAAuD;AACvD,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAGvD;AAED,gDAAgD;AAChD,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAE3C;AAED,yHAAyH;AACzH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,CAKrD;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,OAAO,CAExE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** A frame of the site's own (same origin) as the pointer sees it: where its elements stand on the page's screen, and the documents it holds. */
|
|
2
|
+
//
|
|
3
|
+
// The pointer lives on the top page. An element in a frame the site serves itself (a chat, a widget) is
|
|
4
|
+
// measured on the frame's own screen; its box is moved by every frame it stands in, so the pointer flies to
|
|
5
|
+
// it, the light falls on it and the page scrolls to it as to any other. A frame of another origin is closed
|
|
6
|
+
// to the page, and so to the pointer. An element of a frame is of the frame's window, not the page's, so
|
|
7
|
+
// it is told by its tag, never by `instanceof`.
|
|
8
|
+
/** The frame `document` is shown in, or null for the top page (or a frame whose page is closed to this one). */
|
|
9
|
+
export function frameOf(document) {
|
|
10
|
+
const view = document.defaultView;
|
|
11
|
+
if (view === null)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
if (view.frameElement != null)
|
|
15
|
+
return view.frameElement;
|
|
16
|
+
// A window that does not say (a test's): the frame, on the page around it, whose page this is.
|
|
17
|
+
if (view.parent === view)
|
|
18
|
+
return null;
|
|
19
|
+
return [...view.parent.document.querySelectorAll("iframe")].find((frame) => pageOf(frame) === document) ?? null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** The page a frame shows, when it is the site's own and loaded; null for another origin's, or none yet. */
|
|
26
|
+
export function pageOf(frame) {
|
|
27
|
+
try {
|
|
28
|
+
const page = frame.contentDocument;
|
|
29
|
+
return page?.body != null ? page : null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Where `document`'s screen starts on the top page's. */
|
|
36
|
+
export function originOf(document) {
|
|
37
|
+
let x = 0;
|
|
38
|
+
let y = 0;
|
|
39
|
+
for (let frame = frameOf(document); frame !== null; frame = frameOf(frame.ownerDocument)) {
|
|
40
|
+
const box = frame.getBoundingClientRect();
|
|
41
|
+
x += box.left + frame.clientLeft;
|
|
42
|
+
y += box.top + frame.clientTop;
|
|
43
|
+
}
|
|
44
|
+
return { x, y };
|
|
45
|
+
}
|
|
46
|
+
/** A box of `document`'s screen, on the top page's. */
|
|
47
|
+
export function onTop(box, document) {
|
|
48
|
+
const { x, y } = originOf(document);
|
|
49
|
+
return { left: box.left + x, top: box.top + y, right: box.right + x, bottom: box.bottom + y, width: box.width, height: box.height };
|
|
50
|
+
}
|
|
51
|
+
/** `element`'s box on the top page's screen. */
|
|
52
|
+
export function boxOf(element) {
|
|
53
|
+
return onTop(element.getBoundingClientRect(), element.ownerDocument);
|
|
54
|
+
}
|
|
55
|
+
/** The pages of the site's own frames inside `root`, in order; a frame of another origin, or not loaded, is left out. */
|
|
56
|
+
export function framesIn(root) {
|
|
57
|
+
return [...root.querySelectorAll("iframe")].flatMap((frame) => {
|
|
58
|
+
const page = pageOf(frame);
|
|
59
|
+
return page === null ? [] : [page];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** Whether `node` is an element, in any window. */
|
|
63
|
+
export function isElement(node) {
|
|
64
|
+
return node != null && node.nodeType === 1;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/pointer/frames.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The person's drawings: its pointer (arrow, hand, I-beam) and the icons of the corner's buttons. */
|
|
2
|
+
export declare const CAPTIONS: (size: number) => string;
|
|
3
|
+
export declare const PAUSE = "<svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" aria-hidden=\"true\"><path class=\"pc-hold\" d=\"M8.5 6v12M15.5 6v12\" stroke-width=\"3\"/><path class=\"pc-go\" d=\"M8 5.5v13l10-6.5Z\"/></svg>";
|
|
4
|
+
export declare const STOP = "<svg viewBox=\"0 0 24 24\" width=\"10\" height=\"10\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" rx=\"2.5\"/></svg>";
|
|
5
|
+
export declare const ARROW = "<svg class=\"pc-arrow\" viewBox=\"0 0 26 26\" data-kind=\"arrow\" aria-hidden=\"true\">\n<path class=\"pc-kind-arrow\" d=\"M3 2 L3 21 L8 16.5 L11.4 24 L14.6 22.6 L11.3 15.3 L18 15.3 Z\" fill=\"var(--pc-face, #1f6b55)\" stroke=\"#fff\" stroke-width=\"1.6\" stroke-linejoin=\"round\"/>\n<path class=\"pc-kind-hand\" d=\"M8 3.5c0-1.1 1.8-1.1 1.8 0V11h.6V9.2c0-1.1 1.8-1.1 1.8 0V11h.6V9.8c0-1.1 1.8-1.1 1.8 0V11.4h.6v-.8c0-1.1 1.8-1.1 1.8 0V16c0 3.6-2.2 6.5-5.6 6.5-2.5 0-3.8-1.2-5-3.2l-2.6-4.4c-.6-1 .7-2 1.6-1.2L8 15.4Z\" fill=\"var(--pc-face, #1f6b55)\" stroke=\"#fff\" stroke-width=\"1.4\" stroke-linejoin=\"round\"/>\n<path class=\"pc-kind-ibeam\" d=\"M9 3h5M9 23h5M11.5 3v20\" fill=\"none\" stroke=\"var(--pc-face, #1f6b55)\" stroke-width=\"2.4\" stroke-linecap=\"round\"/>\n</svg>";
|
|
6
|
+
export declare const BACK = "<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" aria-hidden=\"true\"><path d=\"M6.5 6v12\" stroke-width=\"2.6\"/><path d=\"M18 6.5v11L9 12Z\" fill=\"currentColor\" stroke=\"none\"/></svg>";
|
|
7
|
+
export declare const NEXT = "<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" aria-hidden=\"true\"><path d=\"M17.5 6v12\" stroke-width=\"2.6\"/><path d=\"M6 6.5v11l9-5.5Z\" fill=\"currentColor\" stroke=\"none\"/></svg>";
|
|
8
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/pointer/icons.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAGtG,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAC2L,CAAC;AACpO,eAAO,MAAM,KAAK,2MAAyL,CAAC;AAC5M,eAAO,MAAM,IAAI,mJAAiI,CAAC;AAGnJ,eAAO,MAAM,KAAK,oxBAIX,CAAC;AAGR,eAAO,MAAM,IAAI,sMAAoL,CAAC;AACtM,eAAO,MAAM,IAAI,uMAAqL,CAAC"}
|