@kadal/deck 0.0.0-stage → 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.
- package/LICENSE +661 -0
- package/LICENSING.md +40 -0
- package/README.md +170 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/audience/index.d.ts +14 -0
- package/dist/audience/index.js +680 -0
- package/dist/backgrounds/index.d.ts +65 -0
- package/dist/backgrounds/index.js +604 -0
- package/dist/backgrounds/shared.d.ts +7 -0
- package/dist/backgrounds/shared.js +89 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +8 -0
- package/dist/cli/host.js +111 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +140 -0
- package/dist/cli/login.js +56 -0
- package/dist/cli/publish.js +159 -0
- package/dist/cli/vite.js +39 -0
- package/dist/compiler/code-meta.d.ts +33 -0
- package/dist/compiler/code-meta.js +81 -0
- package/dist/compiler/index.d.ts +8 -0
- package/dist/compiler/index.js +8 -0
- package/dist/compiler/magic-move.d.ts +26 -0
- package/dist/compiler/magic-move.js +33 -0
- package/dist/compiler/plain-text.js +7 -0
- package/dist/compiler/rehype-code.d.ts +18 -0
- package/dist/compiler/rehype-code.js +66 -0
- package/dist/compiler/rehype-glossary.d.ts +35 -0
- package/dist/compiler/rehype-glossary.js +211 -0
- package/dist/compiler/slots.d.ts +3 -0
- package/dist/compiler/slots.js +36 -0
- package/dist/compiler/split.d.ts +63 -0
- package/dist/compiler/split.js +195 -0
- package/dist/components/Background.d.ts +15 -0
- package/dist/components/Background.js +24 -0
- package/dist/components/Click.d.ts +54 -0
- package/dist/components/Click.js +129 -0
- package/dist/components/Code.d.ts +27 -0
- package/dist/components/Code.js +124 -0
- package/dist/components/Motion.d.ts +25 -0
- package/dist/components/Motion.js +45 -0
- package/dist/components/Sketch.d.ts +44 -0
- package/dist/components/Sketch.js +141 -0
- package/dist/components/Term.d.ts +63 -0
- package/dist/components/Term.js +492 -0
- package/dist/components/bling.d.ts +75 -0
- package/dist/components/bling.js +146 -0
- package/dist/components/content.d.ts +232 -0
- package/dist/components/content.js +637 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.js +88 -0
- package/dist/core/clicks.d.ts +45 -0
- package/dist/core/clicks.js +75 -0
- package/dist/core/hash.d.ts +33 -0
- package/dist/core/hash.js +49 -0
- package/dist/core/keyboard.d.ts +17 -0
- package/dist/core/keyboard.js +198 -0
- package/dist/core/layout.d.ts +16 -0
- package/dist/core/layout.js +25 -0
- package/dist/core/model.d.ts +259 -0
- package/dist/core/model.js +377 -0
- package/dist/core/navigation.d.ts +74 -0
- package/dist/core/navigation.js +244 -0
- package/dist/core/poster.js +30 -0
- package/dist/core/store.d.ts +20 -0
- package/dist/core/store.js +64 -0
- package/dist/core/touch.js +27 -0
- package/dist/draw/DrawingLayer.js +315 -0
- package/dist/draw/strokes.js +188 -0
- package/dist/export/index.d.ts +68 -0
- package/dist/export/index.js +251 -0
- package/dist/export/run.js +81 -0
- package/dist/glossary/model.d.ts +81 -0
- package/dist/glossary/model.js +156 -0
- package/dist/glossary/parse.d.ts +27 -0
- package/dist/glossary/parse.js +90 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +30 -0
- package/dist/live/LiveProvider.d.ts +20 -0
- package/dist/live/LiveProvider.js +450 -0
- package/dist/live/analytics.d.ts +15 -0
- package/dist/live/analytics.js +103 -0
- package/dist/live/client.d.ts +51 -0
- package/dist/live/client.js +193 -0
- package/dist/live/components.d.ts +64 -0
- package/dist/live/components.js +471 -0
- package/dist/live/context.d.ts +15 -0
- package/dist/live/context.js +28 -0
- package/dist/live/index.d.ts +7 -0
- package/dist/live/index.js +7 -0
- package/dist/live/protocol.d.ts +284 -0
- package/dist/live/protocol.js +42 -0
- package/dist/live/turnstile.js +49 -0
- package/dist/presenter/index.d.ts +20 -0
- package/dist/presenter/index.js +1211 -0
- package/dist/react/AutoAnimate.js +92 -0
- package/dist/react/Backgrounds.d.ts +11 -0
- package/dist/react/Backgrounds.js +154 -0
- package/dist/react/ConfettiLayer.js +85 -0
- package/dist/react/Deck.d.ts +35 -0
- package/dist/react/Deck.js +983 -0
- package/dist/react/Frame.d.ts +16 -0
- package/dist/react/Frame.js +174 -0
- package/dist/react/Hints.d.ts +3 -0
- package/dist/react/Hints.js +201 -0
- package/dist/react/Lightbox.js +54 -0
- package/dist/react/Overview.js +93 -0
- package/dist/react/PrintView.js +128 -0
- package/dist/react/ScrollView.js +128 -0
- package/dist/react/SlideFrame.d.ts +51 -0
- package/dist/react/SlideFrame.js +323 -0
- package/dist/react/Stage.js +151 -0
- package/dist/react/ThemeMenu.d.ts +5 -0
- package/dist/react/ThemeMenu.js +124 -0
- package/dist/react/Zoom.js +23 -0
- package/dist/react/chrome.js +339 -0
- package/dist/react/context.d.ts +165 -0
- package/dist/react/context.js +19 -0
- package/dist/react/hooks.d.ts +33 -0
- package/dist/react/hooks.js +70 -0
- package/dist/react/layouts.d.ts +21 -0
- package/dist/react/layouts.js +104 -0
- package/dist/react/mdx.d.ts +4 -0
- package/dist/react/mdx.js +33 -0
- package/dist/react/terms.d.ts +6 -0
- package/dist/react/terms.js +66 -0
- package/dist/renderers/Island.d.ts +57 -0
- package/dist/renderers/Island.js +223 -0
- package/dist/renderers/contract.d.ts +173 -0
- package/dist/renderers/contract.js +152 -0
- package/dist/renderers/index.d.ts +12 -0
- package/dist/renderers/index.js +16 -0
- package/dist/renderers/react.d.ts +16 -0
- package/dist/renderers/react.js +32 -0
- package/dist/renderers/web-components.d.ts +4 -0
- package/dist/renderers/web-components.js +103 -0
- package/dist/sketch/Canvas.js +49 -0
- package/dist/sketch/dsl.d.ts +131 -0
- package/dist/sketch/dsl.js +281 -0
- package/dist/sketch/index.d.ts +4 -0
- package/dist/sketch/index.js +3 -0
- package/dist/sketch/palette.d.ts +21 -0
- package/dist/sketch/palette.js +66 -0
- package/dist/sketch/render.d.ts +43 -0
- package/dist/sketch/render.js +198 -0
- package/dist/themes/base.css +1704 -0
- package/dist/themes/bling.css +592 -0
- package/dist/themes/glossary.css +317 -0
- package/dist/themes/live.css +1557 -0
- package/dist/themes/minimal.css +83 -0
- package/dist/themes/rla.css +92 -0
- package/dist/themes/sketch.css +121 -0
- package/dist/themes/stack.css +62 -0
- package/dist/vite/index.d.ts +15 -0
- package/dist/vite/index.js +320 -0
- package/package.json +159 -4
- package/tools/verify-island.mjs +150 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
//#region src/live/protocol.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
* THE ROOM PROTOCOL
|
|
5
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* One room per deck, held by a Durable Object on the host (apps/deck-worker). The presenter
|
|
8
|
+
* drives it; viewers follow it or wander and catch up; everyone can react, ask and vote. Messages
|
|
9
|
+
* are small JSON over one WebSocket per window. The same types are used by the client and the
|
|
10
|
+
* worker, so the wire format lives here and nowhere else.
|
|
11
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
*/
|
|
13
|
+
export type Role = "presenter" | "viewer";
|
|
14
|
+
export interface RoomPosition {
|
|
15
|
+
h: number;
|
|
16
|
+
v: number;
|
|
17
|
+
click: number;
|
|
18
|
+
}
|
|
19
|
+
export interface Stroke {
|
|
20
|
+
id: string;
|
|
21
|
+
tool: "pen" | "highlighter";
|
|
22
|
+
color: string;
|
|
23
|
+
size: number;
|
|
24
|
+
/** Stage coordinates, 0..width × 0..height. */
|
|
25
|
+
points: [number, number][];
|
|
26
|
+
/** A scribble that lingers a few seconds, then unwinds along its own path on every screen. */
|
|
27
|
+
fade?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface Question {
|
|
30
|
+
id: string;
|
|
31
|
+
text: string;
|
|
32
|
+
votes: number;
|
|
33
|
+
answered: boolean;
|
|
34
|
+
at: number;
|
|
35
|
+
/** The slide it was asked on, "h,v". */
|
|
36
|
+
slide: string;
|
|
37
|
+
/** Set on the client for the asker's own questions. */
|
|
38
|
+
mine?: boolean;
|
|
39
|
+
/** Set on the client when this viewer has voted. */
|
|
40
|
+
voted?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export type PollKind = "choice" | "multi" | "rating" | "words";
|
|
43
|
+
export interface PollDef {
|
|
44
|
+
id: string;
|
|
45
|
+
kind: PollKind;
|
|
46
|
+
question: string;
|
|
47
|
+
options: string[];
|
|
48
|
+
/** For rating polls: the scale's top, 5 by default. */
|
|
49
|
+
scale?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface PollState {
|
|
52
|
+
def: PollDef;
|
|
53
|
+
open: boolean;
|
|
54
|
+
/** Votes per option (choice/multi/rating buckets). */
|
|
55
|
+
counts: number[];
|
|
56
|
+
/** For word polls: word → count. */
|
|
57
|
+
words: Record<string, number>;
|
|
58
|
+
total: number;
|
|
59
|
+
/** Set on the client: what this viewer answered. */
|
|
60
|
+
mine?: number | number[] | string | null;
|
|
61
|
+
}
|
|
62
|
+
export interface QuizDef {
|
|
63
|
+
id: string;
|
|
64
|
+
question: string;
|
|
65
|
+
options: string[];
|
|
66
|
+
correct: number;
|
|
67
|
+
/** Seconds to answer once opened. */
|
|
68
|
+
seconds: number;
|
|
69
|
+
}
|
|
70
|
+
export interface QuizState {
|
|
71
|
+
def: QuizDef;
|
|
72
|
+
open: boolean;
|
|
73
|
+
/** When the current round closes, epoch ms; null when not open. */
|
|
74
|
+
deadline: number | null;
|
|
75
|
+
counts: number[];
|
|
76
|
+
/** Whether the answer has been revealed. */
|
|
77
|
+
revealed: boolean;
|
|
78
|
+
leaderboard: {
|
|
79
|
+
name: string;
|
|
80
|
+
score: number;
|
|
81
|
+
}[];
|
|
82
|
+
mine?: number | null;
|
|
83
|
+
}
|
|
84
|
+
export interface Presence {
|
|
85
|
+
viewers: number;
|
|
86
|
+
presenter: boolean;
|
|
87
|
+
/** Viewers by slide "h,v". */
|
|
88
|
+
bySlide: Record<string, number>;
|
|
89
|
+
/** Live pace feedback from viewers: how many want slower / faster. */
|
|
90
|
+
pace: {
|
|
91
|
+
slower: number;
|
|
92
|
+
faster: number;
|
|
93
|
+
total: number;
|
|
94
|
+
};
|
|
95
|
+
/** Hands raised. */
|
|
96
|
+
hands: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A glossary card the presenter is sharing: a mention, not a definition. Every screen runs the
|
|
100
|
+
* same build, so each finds the words in its own glossary and the element on its own slide.
|
|
101
|
+
*/
|
|
102
|
+
export interface RoomTerm {
|
|
103
|
+
/** The slide, "h,v". */
|
|
104
|
+
slide: string;
|
|
105
|
+
/** The glossary entry's id (or a one-off `<Term def>`'s). */
|
|
106
|
+
id: string;
|
|
107
|
+
/** Which of the slide's mentions of it, in document order. */
|
|
108
|
+
n: number;
|
|
109
|
+
/** The related entry the card was swapped to, or null. */
|
|
110
|
+
view: string | null;
|
|
111
|
+
}
|
|
112
|
+
export interface RoomState {
|
|
113
|
+
position: RoomPosition;
|
|
114
|
+
presence: Presence;
|
|
115
|
+
questions: Question[];
|
|
116
|
+
polls: Record<string, PollState>;
|
|
117
|
+
quizzes: Record<string, QuizState>;
|
|
118
|
+
/** Strokes by slide "h,v". */
|
|
119
|
+
drawings: Record<string, Stroke[]>;
|
|
120
|
+
pointer: {
|
|
121
|
+
x: number;
|
|
122
|
+
y: number;
|
|
123
|
+
} | null;
|
|
124
|
+
/** The term card the presenter has open for everyone, or null. Absent in older rooms' state. */
|
|
125
|
+
term?: RoomTerm | null;
|
|
126
|
+
spotlight: boolean;
|
|
127
|
+
blackout: boolean;
|
|
128
|
+
/** Whether the presenter has made the notes visible to the audience page. */
|
|
129
|
+
notesPublic: boolean;
|
|
130
|
+
/** Session start, epoch ms, or null when nobody is presenting. */
|
|
131
|
+
startedAt: number | null;
|
|
132
|
+
/** Reaction totals for the session, by emoji. */
|
|
133
|
+
reactions: Record<string, number>;
|
|
134
|
+
}
|
|
135
|
+
export declare const EMPTY_ROOM: RoomState;
|
|
136
|
+
export type ClientMessage = {
|
|
137
|
+
type: "hello";
|
|
138
|
+
role: Role;
|
|
139
|
+
viewer: string;
|
|
140
|
+
name?: string;
|
|
141
|
+
position?: RoomPosition;
|
|
142
|
+
} | {
|
|
143
|
+
type: "nav";
|
|
144
|
+
position: RoomPosition;
|
|
145
|
+
} | {
|
|
146
|
+
type: "pointer";
|
|
147
|
+
x: number;
|
|
148
|
+
y: number;
|
|
149
|
+
} | {
|
|
150
|
+
type: "pointer:off";
|
|
151
|
+
} | ({
|
|
152
|
+
type: "term";
|
|
153
|
+
} & RoomTerm) | {
|
|
154
|
+
type: "term:off";
|
|
155
|
+
} | {
|
|
156
|
+
type: "spotlight";
|
|
157
|
+
on: boolean;
|
|
158
|
+
} | {
|
|
159
|
+
type: "blackout";
|
|
160
|
+
on: boolean;
|
|
161
|
+
} | {
|
|
162
|
+
type: "draw";
|
|
163
|
+
slide: string;
|
|
164
|
+
stroke: Stroke;
|
|
165
|
+
} | {
|
|
166
|
+
type: "draw:undo";
|
|
167
|
+
slide: string;
|
|
168
|
+
} | {
|
|
169
|
+
type: "draw:clear";
|
|
170
|
+
slide: string;
|
|
171
|
+
} | {
|
|
172
|
+
type: "react";
|
|
173
|
+
emoji: string;
|
|
174
|
+
} | {
|
|
175
|
+
type: "qa:ask";
|
|
176
|
+
text: string;
|
|
177
|
+
slide: string;
|
|
178
|
+
} | {
|
|
179
|
+
type: "qa:vote";
|
|
180
|
+
id: string;
|
|
181
|
+
} | {
|
|
182
|
+
type: "qa:answered";
|
|
183
|
+
id: string;
|
|
184
|
+
answered: boolean;
|
|
185
|
+
} | {
|
|
186
|
+
type: "qa:delete";
|
|
187
|
+
id: string;
|
|
188
|
+
} | {
|
|
189
|
+
type: "poll:define";
|
|
190
|
+
poll: PollDef;
|
|
191
|
+
} | {
|
|
192
|
+
type: "poll:open";
|
|
193
|
+
id: string;
|
|
194
|
+
open: boolean;
|
|
195
|
+
} | {
|
|
196
|
+
type: "poll:reset";
|
|
197
|
+
id: string;
|
|
198
|
+
} | {
|
|
199
|
+
type: "poll:vote";
|
|
200
|
+
id: string;
|
|
201
|
+
option?: number;
|
|
202
|
+
options?: number[];
|
|
203
|
+
word?: string;
|
|
204
|
+
rating?: number;
|
|
205
|
+
} | {
|
|
206
|
+
type: "quiz:define";
|
|
207
|
+
quiz: QuizDef;
|
|
208
|
+
} | {
|
|
209
|
+
type: "quiz:open";
|
|
210
|
+
id: string;
|
|
211
|
+
open: boolean;
|
|
212
|
+
} | {
|
|
213
|
+
type: "quiz:reveal";
|
|
214
|
+
id: string;
|
|
215
|
+
} | {
|
|
216
|
+
type: "quiz:answer";
|
|
217
|
+
id: string;
|
|
218
|
+
option: number;
|
|
219
|
+
name: string;
|
|
220
|
+
} | {
|
|
221
|
+
type: "presence";
|
|
222
|
+
slide: string;
|
|
223
|
+
} | {
|
|
224
|
+
type: "pace";
|
|
225
|
+
value: -1 | 0 | 1;
|
|
226
|
+
} | {
|
|
227
|
+
type: "hand";
|
|
228
|
+
up: boolean;
|
|
229
|
+
} | {
|
|
230
|
+
type: "notes:public";
|
|
231
|
+
on: boolean;
|
|
232
|
+
} | {
|
|
233
|
+
type: "session";
|
|
234
|
+
action: "start" | "end";
|
|
235
|
+
} | {
|
|
236
|
+
type: "confetti";
|
|
237
|
+
} | {
|
|
238
|
+
type: "ping";
|
|
239
|
+
};
|
|
240
|
+
export type ServerMessage = {
|
|
241
|
+
type: "welcome";
|
|
242
|
+
role: Role;
|
|
243
|
+
you: string;
|
|
244
|
+
state: RoomState;
|
|
245
|
+
} | {
|
|
246
|
+
type: "state";
|
|
247
|
+
patch: Partial<RoomState>;
|
|
248
|
+
} | {
|
|
249
|
+
type: "nav";
|
|
250
|
+
position: RoomPosition;
|
|
251
|
+
} | {
|
|
252
|
+
type: "pointer";
|
|
253
|
+
x: number;
|
|
254
|
+
y: number;
|
|
255
|
+
} | {
|
|
256
|
+
type: "pointer:off";
|
|
257
|
+
} | ({
|
|
258
|
+
type: "term";
|
|
259
|
+
} & RoomTerm) | {
|
|
260
|
+
type: "term:off";
|
|
261
|
+
} | {
|
|
262
|
+
type: "react";
|
|
263
|
+
emoji: string;
|
|
264
|
+
n: number;
|
|
265
|
+
} | {
|
|
266
|
+
type: "draw";
|
|
267
|
+
slide: string;
|
|
268
|
+
stroke: Stroke;
|
|
269
|
+
} | {
|
|
270
|
+
type: "draw:undo";
|
|
271
|
+
slide: string;
|
|
272
|
+
} | {
|
|
273
|
+
type: "draw:clear";
|
|
274
|
+
slide: string;
|
|
275
|
+
} | {
|
|
276
|
+
type: "confetti";
|
|
277
|
+
} | {
|
|
278
|
+
type: "error";
|
|
279
|
+
message: string;
|
|
280
|
+
} | {
|
|
281
|
+
type: "pong";
|
|
282
|
+
};
|
|
283
|
+
export declare const REACTIONS: readonly ["👏", "🔥", "❤️", "😂", "🤯", "👀", "🙋", "💡"];
|
|
284
|
+
//#endregion
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/live/protocol.ts
|
|
2
|
+
const EMPTY_ROOM = {
|
|
3
|
+
position: {
|
|
4
|
+
h: 0,
|
|
5
|
+
v: 0,
|
|
6
|
+
click: 0
|
|
7
|
+
},
|
|
8
|
+
presence: {
|
|
9
|
+
viewers: 0,
|
|
10
|
+
presenter: false,
|
|
11
|
+
bySlide: {},
|
|
12
|
+
pace: {
|
|
13
|
+
slower: 0,
|
|
14
|
+
faster: 0,
|
|
15
|
+
total: 0
|
|
16
|
+
},
|
|
17
|
+
hands: 0
|
|
18
|
+
},
|
|
19
|
+
questions: [],
|
|
20
|
+
polls: {},
|
|
21
|
+
quizzes: {},
|
|
22
|
+
drawings: {},
|
|
23
|
+
pointer: null,
|
|
24
|
+
term: null,
|
|
25
|
+
spotlight: false,
|
|
26
|
+
blackout: false,
|
|
27
|
+
notesPublic: false,
|
|
28
|
+
startedAt: null,
|
|
29
|
+
reactions: {}
|
|
30
|
+
};
|
|
31
|
+
const REACTIONS = [
|
|
32
|
+
"👏",
|
|
33
|
+
"🔥",
|
|
34
|
+
"❤️",
|
|
35
|
+
"😂",
|
|
36
|
+
"🤯",
|
|
37
|
+
"👀",
|
|
38
|
+
"🙋",
|
|
39
|
+
"💡"
|
|
40
|
+
];
|
|
41
|
+
//#endregion
|
|
42
|
+
export { EMPTY_ROOM, REACTIONS };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/live/turnstile.ts
|
|
2
|
+
let loading = null;
|
|
3
|
+
function loadScript() {
|
|
4
|
+
if (window.turnstile) return Promise.resolve();
|
|
5
|
+
loading ??= new Promise((resolve, reject) => {
|
|
6
|
+
const s = document.createElement("script");
|
|
7
|
+
s.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
|
|
8
|
+
s.async = true;
|
|
9
|
+
s.onload = () => resolve();
|
|
10
|
+
s.onerror = () => reject(/* @__PURE__ */ new Error("Turnstile failed to load"));
|
|
11
|
+
document.head.appendChild(s);
|
|
12
|
+
});
|
|
13
|
+
return loading;
|
|
14
|
+
}
|
|
15
|
+
async function turnstileToken(siteKey) {
|
|
16
|
+
try {
|
|
17
|
+
await loadScript();
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const api = window.turnstile;
|
|
22
|
+
if (!api) return null;
|
|
23
|
+
const host = document.createElement("div");
|
|
24
|
+
host.style.cssText = "position:fixed;left:-9999px;top:-9999px;";
|
|
25
|
+
document.body.appendChild(host);
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
let id = "";
|
|
28
|
+
const done = (token) => {
|
|
29
|
+
if (id) api.remove(id);
|
|
30
|
+
host.remove();
|
|
31
|
+
resolve(token);
|
|
32
|
+
};
|
|
33
|
+
const timer = setTimeout(() => done(null), 15e3);
|
|
34
|
+
id = api.render(host, {
|
|
35
|
+
sitekey: siteKey,
|
|
36
|
+
size: "invisible",
|
|
37
|
+
callback: (token) => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
done(token);
|
|
40
|
+
},
|
|
41
|
+
"error-callback": () => {
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
done(null);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { turnstileToken };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/presenter/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
* THE PRESENTER VIEW — /<slug>/presenter
|
|
5
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* What the speaker sees: the current slide live, the next step, the notes with [click] markers,
|
|
8
|
+
* a timer with pacing, the clock, the drawing and pointer tools, and the room — who is watching,
|
|
9
|
+
* the pace they want, their questions, the polls to open. Opened with `S` from the deck; both
|
|
10
|
+
* windows stay in step through a BroadcastChannel, and the room follows the presenter.
|
|
11
|
+
*
|
|
12
|
+
* Layouts (toggle with L): notes-right (default), notes-left, next-big.
|
|
13
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
*/
|
|
15
|
+
export declare function PresenterPage(): import("react").JSX.Element;
|
|
16
|
+
/** Notes, with `[click]` markers splitting them into the segments the clicks reveal. */
|
|
17
|
+
export declare function NotesPanel(): import("react").JSX.Element;
|
|
18
|
+
export declare function NotesPage(): import("react").JSX.Element;
|
|
19
|
+
export declare function StatsPage(): import("react").JSX.Element;
|
|
20
|
+
//#endregion
|