@velumo/cli 0.1.0-beta.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.
- package/dist/browser-overview.d.ts +72 -0
- package/dist/browser-overview.d.ts.map +1 -0
- package/dist/browser-overview.js +431 -0
- package/dist/browser-overview.js.map +1 -0
- package/dist/browser-presenter.d.ts +63 -0
- package/dist/browser-presenter.d.ts.map +1 -0
- package/dist/browser-presenter.js +304 -0
- package/dist/browser-presenter.js.map +1 -0
- package/dist/browser-runtime.d.ts +43 -0
- package/dist/browser-runtime.d.ts.map +1 -0
- package/dist/browser-runtime.js +293 -0
- package/dist/browser-runtime.js.map +1 -0
- package/dist/browser-spatial.d.ts +42 -0
- package/dist/browser-spatial.d.ts.map +1 -0
- package/dist/browser-spatial.js +207 -0
- package/dist/browser-spatial.js.map +1 -0
- package/dist/browser-sync.d.ts +37 -0
- package/dist/browser-sync.d.ts.map +1 -0
- package/dist/browser-sync.js +77 -0
- package/dist/browser-sync.js.map +1 -0
- package/dist/browser-timer.d.ts +9 -0
- package/dist/browser-timer.d.ts.map +1 -0
- package/dist/browser-timer.js +13 -0
- package/dist/browser-timer.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +902 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +42 -0
- package/src/browser-overview.ts +641 -0
- package/src/browser-presenter.ts +602 -0
- package/src/browser-runtime.ts +493 -0
- package/src/browser-spatial.ts +292 -0
- package/src/browser-sync.ts +151 -0
- package/src/browser-timer.ts +24 -0
- package/src/index.ts +1273 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Manifest } from "@velumo/core";
|
|
2
|
+
import type { RuntimeController } from "@velumo/runtime";
|
|
3
|
+
interface OverviewKeyboardEvent {
|
|
4
|
+
readonly key: string;
|
|
5
|
+
readonly target: unknown;
|
|
6
|
+
preventDefault(): void;
|
|
7
|
+
}
|
|
8
|
+
interface OverviewClickEvent {
|
|
9
|
+
readonly type: string;
|
|
10
|
+
}
|
|
11
|
+
type OverviewChild = OverviewElementLike | OverviewTextNodeLike | string;
|
|
12
|
+
interface OverviewTextNodeLike {
|
|
13
|
+
readonly textContent: string;
|
|
14
|
+
}
|
|
15
|
+
export interface OverviewElementLike {
|
|
16
|
+
readonly ownerDocument: OverviewDocumentLike;
|
|
17
|
+
readonly tagName?: string;
|
|
18
|
+
readonly isContentEditable?: boolean;
|
|
19
|
+
addEventListener(type: "click", listener: (event: OverviewClickEvent) => void): void;
|
|
20
|
+
append(...children: OverviewChild[]): void;
|
|
21
|
+
appendChild(child: OverviewElementLike | OverviewTextNodeLike): OverviewElementLike | OverviewTextNodeLike;
|
|
22
|
+
getAttribute(name: string): string | null;
|
|
23
|
+
remove?(): void;
|
|
24
|
+
removeAttribute(name: string): void;
|
|
25
|
+
replaceChildren(...children: OverviewChild[]): void;
|
|
26
|
+
setAttribute(name: string, value: string): void;
|
|
27
|
+
focus?(): void;
|
|
28
|
+
}
|
|
29
|
+
export interface OverviewRootLike {
|
|
30
|
+
readonly ownerDocument: OverviewDocumentLike;
|
|
31
|
+
focus?(): void;
|
|
32
|
+
}
|
|
33
|
+
export interface OverviewDocumentLike {
|
|
34
|
+
readonly head?: OverviewElementLike;
|
|
35
|
+
readonly body?: OverviewElementLike;
|
|
36
|
+
createElement(tagName: string): OverviewElementLike;
|
|
37
|
+
createTextNode(text: string): OverviewTextNodeLike;
|
|
38
|
+
}
|
|
39
|
+
interface OverviewBroadcastChannelConstructor {
|
|
40
|
+
new (name: string): unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface OverviewWindowLike {
|
|
43
|
+
readonly BroadcastChannel?: OverviewBroadcastChannelConstructor;
|
|
44
|
+
readonly crypto?: {
|
|
45
|
+
randomUUID?(): string;
|
|
46
|
+
};
|
|
47
|
+
addEventListener(type: "keydown", listener: (event: OverviewKeyboardEvent) => void): void;
|
|
48
|
+
removeEventListener(type: "keydown", listener: (event: OverviewKeyboardEvent) => void): void;
|
|
49
|
+
}
|
|
50
|
+
export type OverviewRoot = OverviewRootLike;
|
|
51
|
+
export interface OverviewMountOptions {
|
|
52
|
+
readonly root: OverviewRoot | null | undefined;
|
|
53
|
+
readonly runtime: RuntimeController;
|
|
54
|
+
readonly manifest: Manifest;
|
|
55
|
+
readonly window?: OverviewWindowLike;
|
|
56
|
+
readonly document?: OverviewDocumentLike;
|
|
57
|
+
readonly host?: OverviewElementLike;
|
|
58
|
+
readonly onAfterJump?: () => void;
|
|
59
|
+
readonly mountThumbnail?: (opts: {
|
|
60
|
+
root: OverviewElementLike;
|
|
61
|
+
manifest: Manifest;
|
|
62
|
+
slideId: string;
|
|
63
|
+
}) => {
|
|
64
|
+
dispose(): void;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface OverviewMountResult {
|
|
68
|
+
dispose(): void;
|
|
69
|
+
}
|
|
70
|
+
export declare function setupOverviewMode(options: OverviewMountOptions): OverviewMountResult;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=browser-overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-overview.d.ts","sourceRoot":"","sources":["../src/browser-overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
const OVERVIEW_ATTRIBUTE = "data-velumo-overview";
|
|
2
|
+
const OVERVIEW_OVERLAY_ATTRIBUTE = "data-velumo-overview-overlay";
|
|
3
|
+
const OVERVIEW_GRID_ATTRIBUTE = "data-velumo-overview-grid";
|
|
4
|
+
const OVERVIEW_BUTTON_ATTRIBUTE = "data-velumo-overview-button";
|
|
5
|
+
const OVERVIEW_SLIDE_ID_ATTRIBUTE = "data-velumo-overview-slide-id";
|
|
6
|
+
const OVERVIEW_STYLE_ATTRIBUTE = "data-velumo-overview-style";
|
|
7
|
+
const OVERVIEW_ARIA_LABEL = "Slide overview";
|
|
8
|
+
const OVERVIEW_CSS = `
|
|
9
|
+
[${OVERVIEW_ATTRIBUTE}="open"] [${OVERVIEW_OVERLAY_ATTRIBUTE}] {
|
|
10
|
+
position: fixed;
|
|
11
|
+
inset: 0;
|
|
12
|
+
z-index: 9999;
|
|
13
|
+
display: grid;
|
|
14
|
+
grid-template-rows: auto 1fr;
|
|
15
|
+
gap: 1rem;
|
|
16
|
+
padding: 1.5rem;
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
background: var(--velumo-color-background, #0b1220);
|
|
19
|
+
color: var(--velumo-color-foreground, #f8fafc);
|
|
20
|
+
font-family: var(--velumo-typography-body-font-family, system-ui, sans-serif);
|
|
21
|
+
overflow: auto;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
[${OVERVIEW_ATTRIBUTE}="closed"] [${OVERVIEW_OVERLAY_ATTRIBUTE}] {
|
|
25
|
+
display: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
[${OVERVIEW_OVERLAY_ATTRIBUTE}] h2 {
|
|
29
|
+
margin: 0;
|
|
30
|
+
font-family: var(--velumo-typography-body-font-family, inherit);
|
|
31
|
+
color: var(--velumo-color-foreground, currentColor);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
[${OVERVIEW_GRID_ATTRIBUTE}] {
|
|
35
|
+
display: grid;
|
|
36
|
+
grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
|
|
37
|
+
gap: 0.75rem;
|
|
38
|
+
align-content: start;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}] {
|
|
42
|
+
background: var(--velumo-color-background, transparent);
|
|
43
|
+
color: var(--velumo-color-foreground, inherit);
|
|
44
|
+
border: 1px solid var(--velumo-color-foreground, currentColor);
|
|
45
|
+
border-radius: 0.5rem;
|
|
46
|
+
padding: 0.75rem 0.85rem;
|
|
47
|
+
text-align: left;
|
|
48
|
+
font: inherit;
|
|
49
|
+
font-family: var(--velumo-typography-body-font-family, inherit);
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
display: grid;
|
|
52
|
+
gap: 0.2rem;
|
|
53
|
+
align-self: start;
|
|
54
|
+
min-height: 5rem;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}] > span:nth-child(1) {
|
|
58
|
+
font-size: 0.7rem;
|
|
59
|
+
opacity: 0.55;
|
|
60
|
+
letter-spacing: 0.04em;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}] > span:nth-child(2) {
|
|
64
|
+
font-size: 0.95rem;
|
|
65
|
+
font-weight: 600;
|
|
66
|
+
word-break: break-word;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}] > span:nth-child(3) {
|
|
70
|
+
font-size: 0.65rem;
|
|
71
|
+
opacity: 0.5;
|
|
72
|
+
text-transform: uppercase;
|
|
73
|
+
letter-spacing: 0.08em;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}] > span:nth-child(4) {
|
|
77
|
+
font-size: 0.85rem;
|
|
78
|
+
opacity: 0.75;
|
|
79
|
+
margin-top: 0.2rem;
|
|
80
|
+
word-break: break-word;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}][aria-current="true"] {
|
|
84
|
+
border-color: var(--velumo-color-accent, currentColor);
|
|
85
|
+
box-shadow: 0 0 0 2px var(--velumo-color-accent, currentColor) inset;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
[data-velumo-thumbnail-host] {
|
|
89
|
+
width: 100%;
|
|
90
|
+
aspect-ratio: 16 / 9;
|
|
91
|
+
overflow: hidden;
|
|
92
|
+
border-radius: 0.25rem;
|
|
93
|
+
background: var(--velumo-color-background, #0b1220);
|
|
94
|
+
margin-bottom: 0.25rem;
|
|
95
|
+
flex-shrink: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Thumbnail mode: the button's children are [thumbnail-host, index, slide-id],
|
|
99
|
+
so the positional span:nth-child rules above would style the caption by
|
|
100
|
+
accident. Style the caption intentionally here — a small index prefix over a
|
|
101
|
+
readable slide-id label (the useful identifier on a contact sheet). */
|
|
102
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}][data-velumo-overview-thumb] > span:nth-child(2) {
|
|
103
|
+
font-size: 0.7rem;
|
|
104
|
+
font-weight: 400;
|
|
105
|
+
opacity: 0.55;
|
|
106
|
+
text-transform: none;
|
|
107
|
+
letter-spacing: 0.04em;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
[${OVERVIEW_BUTTON_ATTRIBUTE}][data-velumo-overview-thumb] > span:nth-child(3) {
|
|
111
|
+
font-size: 0.85rem;
|
|
112
|
+
font-weight: 600;
|
|
113
|
+
opacity: 0.9;
|
|
114
|
+
text-transform: none;
|
|
115
|
+
letter-spacing: normal;
|
|
116
|
+
word-break: break-word;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
[data-velumo-overview-sr] {
|
|
120
|
+
position: absolute;
|
|
121
|
+
width: 1px;
|
|
122
|
+
height: 1px;
|
|
123
|
+
padding: 0;
|
|
124
|
+
margin: -1px;
|
|
125
|
+
overflow: hidden;
|
|
126
|
+
clip: rect(0 0 0 0);
|
|
127
|
+
clip-path: inset(50%);
|
|
128
|
+
white-space: nowrap;
|
|
129
|
+
border: 0;
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
const overviewRegistry = new WeakMap();
|
|
133
|
+
export function setupOverviewMode(options) {
|
|
134
|
+
if (options.root === null || options.root === undefined) {
|
|
135
|
+
throw new Error("Velumo overview root element not found");
|
|
136
|
+
}
|
|
137
|
+
const root = options.root;
|
|
138
|
+
const browserWindow = options.window ?? getGlobalWindow();
|
|
139
|
+
if (browserWindow === undefined) {
|
|
140
|
+
throw new Error("Velumo overview window is not available");
|
|
141
|
+
}
|
|
142
|
+
const browserDocument = options.document ?? getDocumentFromRoot(root) ?? getGlobalDocument();
|
|
143
|
+
if (browserDocument === undefined) {
|
|
144
|
+
throw new Error("Velumo overview document is not available");
|
|
145
|
+
}
|
|
146
|
+
const documentForOverview = browserDocument;
|
|
147
|
+
const fallbackHost = documentForOverview.body ?? fallbackHostFromRoot(root);
|
|
148
|
+
if (options.host === undefined && fallbackHost === undefined) {
|
|
149
|
+
throw new Error("Velumo overview host element is not available");
|
|
150
|
+
}
|
|
151
|
+
const host = options.host ?? fallbackHost;
|
|
152
|
+
const previous = overviewRegistry.get(browserWindow);
|
|
153
|
+
if (previous !== undefined) {
|
|
154
|
+
previous.active = false;
|
|
155
|
+
overviewRegistry.delete(browserWindow);
|
|
156
|
+
previous.teardown();
|
|
157
|
+
}
|
|
158
|
+
ensureStyleInjected(documentForOverview);
|
|
159
|
+
let overlay;
|
|
160
|
+
let stateChangeUnsubscribe;
|
|
161
|
+
let thumbnailHandles = [];
|
|
162
|
+
host.setAttribute(OVERVIEW_ATTRIBUTE, "closed");
|
|
163
|
+
function disposeThumbnails() {
|
|
164
|
+
for (const handle of thumbnailHandles) {
|
|
165
|
+
handle.dispose();
|
|
166
|
+
}
|
|
167
|
+
thumbnailHandles = [];
|
|
168
|
+
}
|
|
169
|
+
function isOpen() {
|
|
170
|
+
return overlay !== undefined;
|
|
171
|
+
}
|
|
172
|
+
function openOverview() {
|
|
173
|
+
if (isOpen()) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const mountQueue = [];
|
|
177
|
+
overlay = renderOverlay(documentForOverview, options.runtime, options.manifest, options.mountThumbnail, mountQueue);
|
|
178
|
+
host.append(overlay);
|
|
179
|
+
host.setAttribute(OVERVIEW_ATTRIBUTE, "open");
|
|
180
|
+
// Second pass: mount thumbnails after overlay is in the DOM so each host
|
|
181
|
+
// has a definite layout width for scale calculations.
|
|
182
|
+
if (options.mountThumbnail !== undefined) {
|
|
183
|
+
for (const { host: thumbHost, slideId } of mountQueue) {
|
|
184
|
+
const handle = options.mountThumbnail({
|
|
185
|
+
root: thumbHost,
|
|
186
|
+
manifest: options.manifest,
|
|
187
|
+
slideId,
|
|
188
|
+
});
|
|
189
|
+
thumbnailHandles.push(handle);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
moveFocusToCurrentButton(overlay, options.runtime);
|
|
193
|
+
stateChangeUnsubscribe = options.runtime.on("state:change", () => {
|
|
194
|
+
refreshCurrentHighlight(overlay, options.runtime);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function closeOverview() {
|
|
198
|
+
if (!isOpen()) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
stateChangeUnsubscribe?.();
|
|
202
|
+
stateChangeUnsubscribe = undefined;
|
|
203
|
+
disposeThumbnails();
|
|
204
|
+
if (overlay !== undefined) {
|
|
205
|
+
removeFromHost(host, overlay);
|
|
206
|
+
overlay = undefined;
|
|
207
|
+
}
|
|
208
|
+
host.setAttribute(OVERVIEW_ATTRIBUTE, "closed");
|
|
209
|
+
root.focus?.();
|
|
210
|
+
}
|
|
211
|
+
function handleKeydown(event) {
|
|
212
|
+
if (event.key === "Escape") {
|
|
213
|
+
if (isOpen()) {
|
|
214
|
+
closeOverview();
|
|
215
|
+
event.preventDefault();
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (isEditableTarget(event.target)) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (event.key === "o" && !isOpen()) {
|
|
223
|
+
openOverview();
|
|
224
|
+
event.preventDefault();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function jumpAndClose(slideId) {
|
|
228
|
+
const changed = options.runtime.jumpToSlide(slideId);
|
|
229
|
+
if (changed) {
|
|
230
|
+
options.onAfterJump?.();
|
|
231
|
+
}
|
|
232
|
+
closeOverview();
|
|
233
|
+
}
|
|
234
|
+
function renderOverlay(document, runtime, manifest, mountThumbnailOption, mountQueue) {
|
|
235
|
+
const overlayElement = document.createElement("div");
|
|
236
|
+
overlayElement.setAttribute("role", "dialog");
|
|
237
|
+
overlayElement.setAttribute("aria-label", OVERVIEW_ARIA_LABEL);
|
|
238
|
+
overlayElement.setAttribute(OVERVIEW_OVERLAY_ATTRIBUTE, "");
|
|
239
|
+
const heading = document.createElement("h2");
|
|
240
|
+
heading.append(OVERVIEW_ARIA_LABEL);
|
|
241
|
+
overlayElement.append(heading);
|
|
242
|
+
const grid = document.createElement("div");
|
|
243
|
+
grid.setAttribute(OVERVIEW_GRID_ATTRIBUTE, "");
|
|
244
|
+
const currentSlideId = runtime.getState().slideId;
|
|
245
|
+
manifest.slides.forEach((slide, index) => {
|
|
246
|
+
const button = document.createElement("button");
|
|
247
|
+
button.setAttribute("type", "button");
|
|
248
|
+
button.setAttribute(OVERVIEW_BUTTON_ATTRIBUTE, "");
|
|
249
|
+
button.setAttribute(OVERVIEW_SLIDE_ID_ATTRIBUTE, slide.id);
|
|
250
|
+
if (slide.id === currentSlideId) {
|
|
251
|
+
button.setAttribute("aria-current", "true");
|
|
252
|
+
}
|
|
253
|
+
const indexLabel = document.createElement("span");
|
|
254
|
+
indexLabel.append(`${index + 1}`);
|
|
255
|
+
const idLabel = document.createElement("span");
|
|
256
|
+
idLabel.append(slide.id);
|
|
257
|
+
if (mountThumbnailOption !== undefined) {
|
|
258
|
+
// Thumbnail mode: aria-hidden host + index badge + slide-id caption.
|
|
259
|
+
// The rendered thumbnail (aria-hidden) replaces the kind/heading VISUALLY,
|
|
260
|
+
// but the heading/kind is kept as visually-hidden text so screen-reader
|
|
261
|
+
// users can still identify slides with non-descriptive ids.
|
|
262
|
+
button.setAttribute("data-velumo-overview-thumb", "");
|
|
263
|
+
const thumbnailHost = document.createElement("div");
|
|
264
|
+
thumbnailHost.setAttribute("aria-hidden", "true");
|
|
265
|
+
thumbnailHost.setAttribute("data-velumo-thumbnail-host", "");
|
|
266
|
+
button.append(thumbnailHost, indexLabel, idLabel);
|
|
267
|
+
const headingText = findFirstHeadingText(slide.layout);
|
|
268
|
+
const srText = headingText !== undefined && headingText !== ""
|
|
269
|
+
? `${slide.kind}, ${headingText}`
|
|
270
|
+
: slide.kind;
|
|
271
|
+
const srLabel = document.createElement("span");
|
|
272
|
+
srLabel.setAttribute("data-velumo-overview-sr", "");
|
|
273
|
+
srLabel.append(srText);
|
|
274
|
+
button.append(srLabel);
|
|
275
|
+
// Record for the second-pass mount (after overlay is in the DOM).
|
|
276
|
+
mountQueue.push({ host: thumbnailHost, slideId: slide.id });
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// Text-card mode (no mountThumbnail): keep existing behavior.
|
|
280
|
+
const kindLabel = document.createElement("span");
|
|
281
|
+
kindLabel.append(slide.kind);
|
|
282
|
+
button.append(indexLabel, idLabel, kindLabel);
|
|
283
|
+
const headingText = findFirstHeadingText(slide.layout);
|
|
284
|
+
if (headingText !== undefined && headingText !== "") {
|
|
285
|
+
const previewLabel = document.createElement("span");
|
|
286
|
+
previewLabel.append(headingText);
|
|
287
|
+
button.append(previewLabel);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
button.addEventListener("click", () => jumpAndClose(slide.id));
|
|
291
|
+
grid.append(button);
|
|
292
|
+
});
|
|
293
|
+
overlayElement.append(grid);
|
|
294
|
+
return overlayElement;
|
|
295
|
+
}
|
|
296
|
+
browserWindow.addEventListener("keydown", handleKeydown);
|
|
297
|
+
const record = {
|
|
298
|
+
active: true,
|
|
299
|
+
teardown() {
|
|
300
|
+
browserWindow.removeEventListener("keydown", handleKeydown);
|
|
301
|
+
stateChangeUnsubscribe?.();
|
|
302
|
+
stateChangeUnsubscribe = undefined;
|
|
303
|
+
disposeThumbnails();
|
|
304
|
+
if (overlay !== undefined) {
|
|
305
|
+
removeFromHost(host, overlay);
|
|
306
|
+
overlay = undefined;
|
|
307
|
+
}
|
|
308
|
+
host.removeAttribute(OVERVIEW_ATTRIBUTE);
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
overviewRegistry.set(browserWindow, record);
|
|
312
|
+
return {
|
|
313
|
+
dispose() {
|
|
314
|
+
if (!record.active) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
record.active = false;
|
|
318
|
+
record.teardown();
|
|
319
|
+
const current = overviewRegistry.get(browserWindow);
|
|
320
|
+
if (current === record) {
|
|
321
|
+
overviewRegistry.delete(browserWindow);
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function ensureStyleInjected(document) {
|
|
327
|
+
const head = document.head;
|
|
328
|
+
if (head === undefined) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const existing = headHasStyleElement(head);
|
|
332
|
+
if (existing) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const style = document.createElement("style");
|
|
336
|
+
style.setAttribute(OVERVIEW_STYLE_ATTRIBUTE, "");
|
|
337
|
+
style.append(OVERVIEW_CSS);
|
|
338
|
+
head.append(style);
|
|
339
|
+
}
|
|
340
|
+
function headHasStyleElement(head) {
|
|
341
|
+
const queryable = head;
|
|
342
|
+
if (typeof queryable.querySelector === "function") {
|
|
343
|
+
return queryable.querySelector(`[${OVERVIEW_STYLE_ATTRIBUTE}]`) !== null;
|
|
344
|
+
}
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
function moveFocusToCurrentButton(overlay, runtime) {
|
|
348
|
+
const buttons = listButtons(overlay);
|
|
349
|
+
if (buttons.length === 0) {
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const currentSlideId = runtime.getState().slideId;
|
|
353
|
+
const currentButton = buttons.find((button) => button.getAttribute(OVERVIEW_SLIDE_ID_ATTRIBUTE) === currentSlideId) ?? buttons[0];
|
|
354
|
+
currentButton.focus?.();
|
|
355
|
+
}
|
|
356
|
+
function refreshCurrentHighlight(overlay, runtime) {
|
|
357
|
+
if (overlay === undefined) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const currentSlideId = runtime.getState().slideId;
|
|
361
|
+
for (const button of listButtons(overlay)) {
|
|
362
|
+
if (button.getAttribute(OVERVIEW_SLIDE_ID_ATTRIBUTE) === currentSlideId) {
|
|
363
|
+
button.setAttribute("aria-current", "true");
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
button.removeAttribute("aria-current");
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
function listButtons(overlay) {
|
|
371
|
+
const queryable = overlay;
|
|
372
|
+
if (typeof queryable.querySelectorAll === "function") {
|
|
373
|
+
const collected = queryable.querySelectorAll(`[${OVERVIEW_BUTTON_ATTRIBUTE}]`);
|
|
374
|
+
return Array.from(collected);
|
|
375
|
+
}
|
|
376
|
+
return [];
|
|
377
|
+
}
|
|
378
|
+
function removeFromHost(host, child) {
|
|
379
|
+
if (typeof child.remove === "function") {
|
|
380
|
+
child.remove();
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const removable = host;
|
|
384
|
+
removable.removeChild?.(child);
|
|
385
|
+
}
|
|
386
|
+
function isEditableTarget(target) {
|
|
387
|
+
if (target === null || typeof target !== "object") {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
const candidate = target;
|
|
391
|
+
if (candidate.isContentEditable === true) {
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
const tagName = candidate.tagName?.toLowerCase();
|
|
395
|
+
return (tagName === "input" ||
|
|
396
|
+
tagName === "textarea" ||
|
|
397
|
+
tagName === "select" ||
|
|
398
|
+
tagName === "button");
|
|
399
|
+
}
|
|
400
|
+
function findFirstHeadingText(node) {
|
|
401
|
+
if (typeof node !== "object" || node === null) {
|
|
402
|
+
return undefined;
|
|
403
|
+
}
|
|
404
|
+
const candidate = node;
|
|
405
|
+
if (candidate.kind === "heading" && typeof candidate.text === "string") {
|
|
406
|
+
return candidate.text;
|
|
407
|
+
}
|
|
408
|
+
if (Array.isArray(candidate.children)) {
|
|
409
|
+
for (const child of candidate.children) {
|
|
410
|
+
const found = findFirstHeadingText(child);
|
|
411
|
+
if (found !== undefined) {
|
|
412
|
+
return found;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return undefined;
|
|
417
|
+
}
|
|
418
|
+
function getGlobalWindow() {
|
|
419
|
+
return globalThis.window;
|
|
420
|
+
}
|
|
421
|
+
function getGlobalDocument() {
|
|
422
|
+
return globalThis.document;
|
|
423
|
+
}
|
|
424
|
+
function getDocumentFromRoot(root) {
|
|
425
|
+
return root.ownerDocument;
|
|
426
|
+
}
|
|
427
|
+
function fallbackHostFromRoot(root) {
|
|
428
|
+
const document = getDocumentFromRoot(root);
|
|
429
|
+
return document?.body;
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=browser-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-overview.js","sourceRoot":"","sources":["../src/browser-overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Manifest } from "@velumo/core";
|
|
2
|
+
import { type RuntimeState } from "@velumo/runtime";
|
|
3
|
+
import { type PresenterCommand, type PresenterSync, type PresenterSyncChannel } from "./browser-sync.js";
|
|
4
|
+
import { type PresenterTimer } from "./browser-timer.js";
|
|
5
|
+
type PresenterChild = PresenterElement | PresenterTextNode | string;
|
|
6
|
+
interface PresenterTextNode {
|
|
7
|
+
parentNode?: unknown;
|
|
8
|
+
textContent: string;
|
|
9
|
+
}
|
|
10
|
+
interface PresenterElement extends PresenterTextNode {
|
|
11
|
+
readonly ownerDocument: PresenterDocument;
|
|
12
|
+
addEventListener?(type: "click", listener: () => void): void;
|
|
13
|
+
append(...children: PresenterChild[]): void;
|
|
14
|
+
appendChild(child: PresenterElement | PresenterTextNode): PresenterElement | PresenterTextNode;
|
|
15
|
+
querySelector(selector: string): PresenterElement | null;
|
|
16
|
+
removeAttribute(name: string): void;
|
|
17
|
+
replaceChildren(...children: PresenterChild[]): void;
|
|
18
|
+
setAttribute(name: string, value: string): void;
|
|
19
|
+
}
|
|
20
|
+
interface PresenterDocument {
|
|
21
|
+
createElement(tagName: string): PresenterElement;
|
|
22
|
+
createElementNS(namespace: string, tagName: string): PresenterElement;
|
|
23
|
+
createTextNode(text: string): PresenterTextNode;
|
|
24
|
+
}
|
|
25
|
+
type PresenterRoot = PresenterElement;
|
|
26
|
+
interface PresenterCommandPublisher {
|
|
27
|
+
publishCommand(command: PresenterCommand): void;
|
|
28
|
+
}
|
|
29
|
+
interface PresenterInjectedSync {
|
|
30
|
+
readonly channel: PresenterSyncChannel;
|
|
31
|
+
readonly instanceId: string;
|
|
32
|
+
}
|
|
33
|
+
interface PresenterTimerScheduler {
|
|
34
|
+
clearInterval?(id: unknown): void;
|
|
35
|
+
setInterval(handler: () => void, ms: number): unknown;
|
|
36
|
+
}
|
|
37
|
+
interface ThumbnailHandle {
|
|
38
|
+
dispose(): void;
|
|
39
|
+
}
|
|
40
|
+
type MountThumbnailFn = (opts: {
|
|
41
|
+
readonly root: PresenterElement;
|
|
42
|
+
readonly manifest: Manifest;
|
|
43
|
+
readonly slideId: string;
|
|
44
|
+
}) => ThumbnailHandle;
|
|
45
|
+
export interface PresenterMountOptions {
|
|
46
|
+
readonly root: PresenterRoot | null | undefined;
|
|
47
|
+
readonly manifestUrl: string;
|
|
48
|
+
readonly initialState?: RuntimeState;
|
|
49
|
+
readonly sync?: false | PresenterCommandPublisher | PresenterInjectedSync;
|
|
50
|
+
readonly timer?: PresenterTimer;
|
|
51
|
+
readonly timerIntervalMs?: number;
|
|
52
|
+
readonly timerScheduler?: PresenterTimerScheduler;
|
|
53
|
+
readonly mountThumbnail?: MountThumbnailFn;
|
|
54
|
+
}
|
|
55
|
+
export interface PresenterMountResult {
|
|
56
|
+
dispose(): void;
|
|
57
|
+
readonly manifest: Manifest;
|
|
58
|
+
readonly sync?: PresenterSync;
|
|
59
|
+
readonly timer: PresenterTimer;
|
|
60
|
+
}
|
|
61
|
+
export declare function mountVelumoPresenterView(options: PresenterMountOptions): Promise<PresenterMountResult | undefined>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=browser-presenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-presenter.d.ts","sourceRoot":"","sources":["../src/browser-presenter.ts"],"names":[],"mappings":"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"}
|