stagebook 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/dist/chunk-I2WMGA4Q.cjs +409 -0
- package/dist/chunk-I2WMGA4Q.cjs.map +1 -0
- package/dist/chunk-SSOMQ3BK.js +409 -0
- package/dist/chunk-SSOMQ3BK.js.map +1 -0
- package/dist/components/index.cjs +6084 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +400 -0
- package/dist/components/index.d.ts +400 -0
- package/dist/components/index.js +6084 -0
- package/dist/components/index.js.map +1 -0
- package/dist/evaluateConditions-DzlC6fez.d.cts +1741 -0
- package/dist/evaluateConditions-DzlC6fez.d.ts +1741 -0
- package/dist/index.cjs +1551 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5644 -0
- package/dist/index.d.ts +5644 -0
- package/dist/index.js +1551 -0
- package/dist/index.js.map +1 -0
- package/package.json +94 -0
- package/src/styles.css +275 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React$1 from 'react';
|
|
3
|
+
import { b as DiscussionType, i as MetadataType, C as Condition } from '../evaluateConditions-DzlC6fez.js';
|
|
4
|
+
export { al as MediaPlayer, am as MediaPlayerProps, V as VideoEvent } from '../evaluateConditions-DzlC6fez.js';
|
|
5
|
+
import 'zod';
|
|
6
|
+
|
|
7
|
+
interface StagebookContext {
|
|
8
|
+
resolve(reference: string, position?: string): unknown[];
|
|
9
|
+
save(key: string, value: unknown, scope?: "player" | "shared"): void;
|
|
10
|
+
getElapsedTime(): number;
|
|
11
|
+
submit(): void;
|
|
12
|
+
getAssetURL(path: string): string;
|
|
13
|
+
getTextContent(path: string): Promise<string>;
|
|
14
|
+
progressLabel: string;
|
|
15
|
+
playerId: string;
|
|
16
|
+
position: number | undefined;
|
|
17
|
+
playerCount: number | undefined;
|
|
18
|
+
isSubmitted: boolean;
|
|
19
|
+
setAllowIdle?: (allow: boolean) => void;
|
|
20
|
+
renderDiscussion?: (config: DiscussionType) => React$1.ReactNode;
|
|
21
|
+
renderSharedNotepad?: (config: {
|
|
22
|
+
padName: string;
|
|
23
|
+
}) => React$1.ReactNode;
|
|
24
|
+
renderTalkMeter?: () => React$1.ReactNode;
|
|
25
|
+
renderSurvey?: (config: {
|
|
26
|
+
surveyName: string;
|
|
27
|
+
onComplete: (results: unknown) => void;
|
|
28
|
+
}) => React$1.ReactNode;
|
|
29
|
+
}
|
|
30
|
+
declare function StagebookProvider({ value, children, }: {
|
|
31
|
+
value: StagebookContext;
|
|
32
|
+
children: React$1.ReactNode;
|
|
33
|
+
}): react_jsx_runtime.JSX.Element;
|
|
34
|
+
declare function useStagebookContext(): StagebookContext;
|
|
35
|
+
declare function useResolve(reference: string, position?: string): unknown[];
|
|
36
|
+
declare function useSave(): StagebookContext["save"];
|
|
37
|
+
declare function useElapsedTime(): number;
|
|
38
|
+
interface TextContentResult {
|
|
39
|
+
data: string | undefined;
|
|
40
|
+
isLoading: boolean;
|
|
41
|
+
error: Error | undefined;
|
|
42
|
+
}
|
|
43
|
+
declare function useTextContent(path: string): TextContentResult;
|
|
44
|
+
|
|
45
|
+
interface ElementConfig {
|
|
46
|
+
type: string;
|
|
47
|
+
name?: string;
|
|
48
|
+
file?: string;
|
|
49
|
+
style?: "" | "thin" | "regular" | "thick";
|
|
50
|
+
reference?: string;
|
|
51
|
+
position?: string;
|
|
52
|
+
shared?: boolean;
|
|
53
|
+
buttonText?: string;
|
|
54
|
+
url?: string;
|
|
55
|
+
source?: string;
|
|
56
|
+
displayText?: string;
|
|
57
|
+
helperText?: string;
|
|
58
|
+
urlParams?: Array<{
|
|
59
|
+
key: string;
|
|
60
|
+
value?: unknown;
|
|
61
|
+
reference?: string;
|
|
62
|
+
position?: string;
|
|
63
|
+
}>;
|
|
64
|
+
width?: number;
|
|
65
|
+
startTime?: number;
|
|
66
|
+
endTime?: number;
|
|
67
|
+
displayTime?: number;
|
|
68
|
+
hideTime?: number;
|
|
69
|
+
warnTimeRemaining?: number;
|
|
70
|
+
surveyName?: string;
|
|
71
|
+
[key: string]: unknown;
|
|
72
|
+
}
|
|
73
|
+
interface ElementProps {
|
|
74
|
+
element: ElementConfig;
|
|
75
|
+
onSubmit: () => void;
|
|
76
|
+
stageDuration?: number;
|
|
77
|
+
}
|
|
78
|
+
declare function Element({ element, onSubmit, stageDuration }: ElementProps): string | number | bigint | boolean | Iterable<React$1.ReactNode> | Promise<string | number | bigint | boolean | React$1.ReactPortal | React$1.ReactElement<unknown, string | React$1.JSXElementConstructor<any>> | Iterable<React$1.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null;
|
|
79
|
+
|
|
80
|
+
interface StageConfig {
|
|
81
|
+
name: string;
|
|
82
|
+
duration?: number;
|
|
83
|
+
elements: ElementConfig[];
|
|
84
|
+
discussion?: DiscussionType;
|
|
85
|
+
}
|
|
86
|
+
interface StageProps {
|
|
87
|
+
stage: StageConfig;
|
|
88
|
+
onSubmit: () => void;
|
|
89
|
+
}
|
|
90
|
+
declare function Stage({ stage, onSubmit }: StageProps): react_jsx_runtime.JSX.Element;
|
|
91
|
+
|
|
92
|
+
interface ButtonProps {
|
|
93
|
+
children: React$1.ReactNode;
|
|
94
|
+
onClick?: React$1.MouseEventHandler<HTMLButtonElement> | null;
|
|
95
|
+
className?: string;
|
|
96
|
+
style?: React$1.CSSProperties;
|
|
97
|
+
primary?: boolean;
|
|
98
|
+
type?: "button" | "submit" | "reset";
|
|
99
|
+
autoFocus?: boolean;
|
|
100
|
+
disabled?: boolean;
|
|
101
|
+
id?: string;
|
|
102
|
+
"data-testid"?: string;
|
|
103
|
+
}
|
|
104
|
+
declare function Button({ children, onClick, className, style, primary, type, autoFocus, disabled, id, "data-testid": dataTestId, }: ButtonProps): react_jsx_runtime.JSX.Element;
|
|
105
|
+
|
|
106
|
+
interface SeparatorProps {
|
|
107
|
+
style?: "" | "thin" | "regular" | "thick";
|
|
108
|
+
}
|
|
109
|
+
declare function Separator({ style }: SeparatorProps): react_jsx_runtime.JSX.Element;
|
|
110
|
+
|
|
111
|
+
interface RadioOption {
|
|
112
|
+
key: string;
|
|
113
|
+
value: string;
|
|
114
|
+
}
|
|
115
|
+
type RadioLayout = "vertical" | "horizontal";
|
|
116
|
+
interface RadioGroupProps {
|
|
117
|
+
options: RadioOption[];
|
|
118
|
+
value?: string;
|
|
119
|
+
onChange: (e: React$1.ChangeEvent<HTMLInputElement>) => void;
|
|
120
|
+
label?: string;
|
|
121
|
+
layout?: RadioLayout;
|
|
122
|
+
id?: string;
|
|
123
|
+
"data-testid"?: string;
|
|
124
|
+
}
|
|
125
|
+
declare function RadioGroup({ options, value, onChange, label, layout, id, "data-testid": dataTestId, }: RadioGroupProps): react_jsx_runtime.JSX.Element;
|
|
126
|
+
|
|
127
|
+
interface CheckboxOption {
|
|
128
|
+
key: string;
|
|
129
|
+
value: string;
|
|
130
|
+
}
|
|
131
|
+
type CheckboxLayout = "vertical" | "horizontal";
|
|
132
|
+
interface CheckboxGroupProps {
|
|
133
|
+
options: CheckboxOption[];
|
|
134
|
+
value: string[];
|
|
135
|
+
onChange: (selected: string[]) => void;
|
|
136
|
+
label?: string;
|
|
137
|
+
layout?: CheckboxLayout;
|
|
138
|
+
id?: string;
|
|
139
|
+
"data-testid"?: string;
|
|
140
|
+
}
|
|
141
|
+
declare function CheckboxGroup({ options, value, onChange, label, layout, id, "data-testid": dataTestId, }: CheckboxGroupProps): react_jsx_runtime.JSX.Element;
|
|
142
|
+
|
|
143
|
+
interface TypingStats {
|
|
144
|
+
type: "typingStats";
|
|
145
|
+
totalKeystrokes: number;
|
|
146
|
+
avgInterval: number;
|
|
147
|
+
stdDev: number;
|
|
148
|
+
}
|
|
149
|
+
interface PasteAttempt {
|
|
150
|
+
type: "pasteAttempt";
|
|
151
|
+
length: number;
|
|
152
|
+
timestamp: number;
|
|
153
|
+
}
|
|
154
|
+
type DebugMessage = TypingStats | PasteAttempt;
|
|
155
|
+
interface TextAreaProps {
|
|
156
|
+
defaultText?: string;
|
|
157
|
+
onChange?: (value: string) => void;
|
|
158
|
+
onDebugMessage?: (message: DebugMessage) => void;
|
|
159
|
+
value?: string;
|
|
160
|
+
rows?: number;
|
|
161
|
+
showCharacterCount?: boolean;
|
|
162
|
+
minLength?: number;
|
|
163
|
+
maxLength?: number;
|
|
164
|
+
debounceDelay?: number;
|
|
165
|
+
id?: string;
|
|
166
|
+
}
|
|
167
|
+
declare function TextArea({ defaultText, onChange, onDebugMessage, value, rows, showCharacterCount, minLength, maxLength, debounceDelay, id, }: TextAreaProps): react_jsx_runtime.JSX.Element;
|
|
168
|
+
|
|
169
|
+
interface SliderProps {
|
|
170
|
+
min?: number;
|
|
171
|
+
max?: number;
|
|
172
|
+
interval?: number;
|
|
173
|
+
labelPts?: number[];
|
|
174
|
+
labels?: string[];
|
|
175
|
+
value?: number;
|
|
176
|
+
onChange?: (value: number) => void;
|
|
177
|
+
}
|
|
178
|
+
declare function Slider({ min, max, interval, labelPts, labels, value, onChange, }: SliderProps): react_jsx_runtime.JSX.Element;
|
|
179
|
+
|
|
180
|
+
interface ListSorterProps {
|
|
181
|
+
items: string[];
|
|
182
|
+
onChange: (reordered: string[]) => void;
|
|
183
|
+
}
|
|
184
|
+
declare function ListSorter({ items, onChange }: ListSorterProps): react_jsx_runtime.JSX.Element;
|
|
185
|
+
|
|
186
|
+
interface MarkdownProps {
|
|
187
|
+
text: string;
|
|
188
|
+
resolveURL?: (path: string) => string;
|
|
189
|
+
}
|
|
190
|
+
declare function Markdown({ text, resolveURL }: MarkdownProps): react_jsx_runtime.JSX.Element;
|
|
191
|
+
|
|
192
|
+
interface LoadingProps {
|
|
193
|
+
size?: "sm" | "md" | "lg";
|
|
194
|
+
}
|
|
195
|
+
declare function Loading({ size }: LoadingProps): react_jsx_runtime.JSX.Element;
|
|
196
|
+
|
|
197
|
+
interface DisplayProps {
|
|
198
|
+
reference: string;
|
|
199
|
+
position?: string;
|
|
200
|
+
values: unknown[];
|
|
201
|
+
}
|
|
202
|
+
declare function Display({ reference, values }: DisplayProps): react_jsx_runtime.JSX.Element;
|
|
203
|
+
|
|
204
|
+
interface SubmitButtonProps {
|
|
205
|
+
onSubmit: () => void;
|
|
206
|
+
name: string;
|
|
207
|
+
buttonText?: string;
|
|
208
|
+
save: (key: string, value: unknown) => void;
|
|
209
|
+
}
|
|
210
|
+
declare function SubmitButton({ onSubmit, name, buttonText, save, }: SubmitButtonProps): react_jsx_runtime.JSX.Element;
|
|
211
|
+
|
|
212
|
+
interface AudioElementProps {
|
|
213
|
+
src: string;
|
|
214
|
+
save?: (key: string, value: unknown) => void;
|
|
215
|
+
name?: string;
|
|
216
|
+
}
|
|
217
|
+
declare function AudioElement({ src, save, name }: AudioElementProps): null;
|
|
218
|
+
|
|
219
|
+
interface ImageElementProps {
|
|
220
|
+
src: string;
|
|
221
|
+
width?: number;
|
|
222
|
+
}
|
|
223
|
+
declare function ImageElement({ src, width }: ImageElementProps): react_jsx_runtime.JSX.Element | null;
|
|
224
|
+
|
|
225
|
+
interface KitchenTimerProps {
|
|
226
|
+
startTime: number;
|
|
227
|
+
endTime: number;
|
|
228
|
+
warnTimeRemaining?: number;
|
|
229
|
+
getElapsedTime: () => number;
|
|
230
|
+
}
|
|
231
|
+
declare function KitchenTimer({ startTime, endTime, warnTimeRemaining, getElapsedTime, }: KitchenTimerProps): react_jsx_runtime.JSX.Element;
|
|
232
|
+
|
|
233
|
+
interface ResolvedParam$1 {
|
|
234
|
+
key: string;
|
|
235
|
+
value: string;
|
|
236
|
+
}
|
|
237
|
+
interface TrackedLinkProps {
|
|
238
|
+
name: string;
|
|
239
|
+
url: string;
|
|
240
|
+
displayText: string;
|
|
241
|
+
helperText?: string;
|
|
242
|
+
resolvedParams?: ResolvedParam$1[];
|
|
243
|
+
save: (key: string, value: unknown) => void;
|
|
244
|
+
getElapsedTime: () => number;
|
|
245
|
+
progressLabel: string;
|
|
246
|
+
setAllowIdle?: (allow: boolean) => void;
|
|
247
|
+
}
|
|
248
|
+
declare function TrackedLink({ name, url, displayText, helperText, resolvedParams, save, getElapsedTime, progressLabel, setAllowIdle, }: TrackedLinkProps): react_jsx_runtime.JSX.Element;
|
|
249
|
+
|
|
250
|
+
interface PromptProps {
|
|
251
|
+
metadata: MetadataType;
|
|
252
|
+
body: string;
|
|
253
|
+
responseItems: string[];
|
|
254
|
+
name: string;
|
|
255
|
+
file?: string;
|
|
256
|
+
shared?: boolean;
|
|
257
|
+
value: unknown;
|
|
258
|
+
save: (key: string, value: unknown, scope?: "player" | "shared") => void;
|
|
259
|
+
resolveURL?: (path: string) => string;
|
|
260
|
+
renderSharedNotepad?: (config: {
|
|
261
|
+
padName: string;
|
|
262
|
+
defaultText?: string;
|
|
263
|
+
rows?: number;
|
|
264
|
+
}) => React$1.ReactNode;
|
|
265
|
+
}
|
|
266
|
+
declare function Prompt({ metadata, body, responseItems, name, file, shared, value, save, resolveURL, renderSharedNotepad, }: PromptProps): react_jsx_runtime.JSX.Element;
|
|
267
|
+
|
|
268
|
+
interface ResolvedParam {
|
|
269
|
+
key: string;
|
|
270
|
+
value: string;
|
|
271
|
+
}
|
|
272
|
+
interface QualtricsProps {
|
|
273
|
+
url: string;
|
|
274
|
+
resolvedParams?: ResolvedParam[];
|
|
275
|
+
participantId?: string;
|
|
276
|
+
groupId?: string;
|
|
277
|
+
save: (key: string, value: unknown) => void;
|
|
278
|
+
onComplete: () => void;
|
|
279
|
+
}
|
|
280
|
+
declare function Qualtrics({ url, resolvedParams, participantId, groupId, save, onComplete, }: QualtricsProps): react_jsx_runtime.JSX.Element;
|
|
281
|
+
|
|
282
|
+
interface TimelineProps {
|
|
283
|
+
source: string;
|
|
284
|
+
name: string;
|
|
285
|
+
selectionType: "range" | "point";
|
|
286
|
+
selectionScope?: "track" | "all";
|
|
287
|
+
multiSelect?: boolean;
|
|
288
|
+
showWaveform?: boolean;
|
|
289
|
+
trackLabels?: string[];
|
|
290
|
+
/**
|
|
291
|
+
* Previously saved selections to restore on mount. Element.tsx resolves
|
|
292
|
+
* this from `timeline.<name>` so participants who reload the stage see
|
|
293
|
+
* their existing marks. Untrusted shape — validated before use.
|
|
294
|
+
*/
|
|
295
|
+
initialSelections?: unknown;
|
|
296
|
+
save: (key: string, value: unknown) => void;
|
|
297
|
+
}
|
|
298
|
+
declare function Timeline({ source, name, selectionType, selectionScope, multiSelect, showWaveform, trackLabels, initialSelections, save, }: TimelineProps): react_jsx_runtime.JSX.Element;
|
|
299
|
+
|
|
300
|
+
interface TimeConditionalRenderProps {
|
|
301
|
+
displayTime?: number;
|
|
302
|
+
hideTime?: number;
|
|
303
|
+
getElapsedTime: () => number;
|
|
304
|
+
children: React$1.ReactNode;
|
|
305
|
+
}
|
|
306
|
+
declare function TimeConditionalRender({ displayTime, hideTime, getElapsedTime, children, }: TimeConditionalRenderProps): react_jsx_runtime.JSX.Element | null;
|
|
307
|
+
|
|
308
|
+
interface PositionConditionalRenderProps {
|
|
309
|
+
showToPositions?: number[];
|
|
310
|
+
hideFromPositions?: number[];
|
|
311
|
+
position: number | undefined;
|
|
312
|
+
children: React$1.ReactNode;
|
|
313
|
+
}
|
|
314
|
+
declare function PositionConditionalRender({ showToPositions, hideFromPositions, position, children, }: PositionConditionalRenderProps): react_jsx_runtime.JSX.Element | null;
|
|
315
|
+
|
|
316
|
+
interface ConditionsConditionalRenderProps {
|
|
317
|
+
conditions: Condition[];
|
|
318
|
+
resolve: (reference: string, position?: string) => unknown[];
|
|
319
|
+
children: React$1.ReactNode;
|
|
320
|
+
fallback?: React$1.ReactNode;
|
|
321
|
+
}
|
|
322
|
+
declare function ConditionsConditionalRender({ conditions, resolve, children, fallback, }: ConditionsConditionalRenderProps): react_jsx_runtime.JSX.Element;
|
|
323
|
+
|
|
324
|
+
interface SubmissionConditionalRenderProps {
|
|
325
|
+
isSubmitted: boolean;
|
|
326
|
+
playerCount: number | undefined;
|
|
327
|
+
children: React$1.ReactNode;
|
|
328
|
+
}
|
|
329
|
+
declare function SubmissionConditionalRender({ isSubmitted, playerCount, children, }: SubmissionConditionalRenderProps): react_jsx_runtime.JSX.Element;
|
|
330
|
+
|
|
331
|
+
interface ScrollIndicatorProps {
|
|
332
|
+
visible: boolean;
|
|
333
|
+
}
|
|
334
|
+
declare function ScrollIndicator({ visible }: ScrollIndicatorProps): react_jsx_runtime.JSX.Element | null;
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Detects when new content appears below the viewport and either:
|
|
338
|
+
* - Auto-scrolls to "peek" the content if user is near bottom
|
|
339
|
+
* - Shows an indicator if user is not near bottom
|
|
340
|
+
*/
|
|
341
|
+
declare function useScrollAwareness(containerRef: React.RefObject<HTMLElement | null>, options?: {
|
|
342
|
+
threshold?: number;
|
|
343
|
+
}): {
|
|
344
|
+
showIndicator: boolean;
|
|
345
|
+
dismissIndicator: () => void;
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
/** Unified playback interface. Both HTML5 VideoCore and YouTubePlayer expose this via ref. */
|
|
349
|
+
interface PlaybackHandle {
|
|
350
|
+
play(): void;
|
|
351
|
+
pause(): void;
|
|
352
|
+
seekTo(seconds: number): void;
|
|
353
|
+
getCurrentTime(): number;
|
|
354
|
+
getDuration(): number;
|
|
355
|
+
isPaused(): boolean;
|
|
356
|
+
/** True when backed by the YouTube IFrame API; frame-step controls should be hidden. */
|
|
357
|
+
readonly isYouTube: boolean;
|
|
358
|
+
/** Number of audio channels in the media. 0 until waveform capture starts. */
|
|
359
|
+
readonly channelCount: number;
|
|
360
|
+
/**
|
|
361
|
+
* Per-channel waveform peaks. One Float32Array per channel, containing
|
|
362
|
+
* interleaved min/max pairs per time bucket. Empty until capture starts.
|
|
363
|
+
* Shared across all timelines — read-only.
|
|
364
|
+
*
|
|
365
|
+
* IMPORTANT: these arrays are mutated in place during capture. Consumers
|
|
366
|
+
* that need to know when the data changed should read `peaksVersion`,
|
|
367
|
+
* which bumps every time a frame is accumulated.
|
|
368
|
+
*/
|
|
369
|
+
readonly peaks: Float32Array[];
|
|
370
|
+
/**
|
|
371
|
+
* Monotonically increasing counter that bumps every time `peaks` is
|
|
372
|
+
* mutated by the capture loop. Use this as a render-token in React effects
|
|
373
|
+
* (e.g., a canvas redraw effect) so they re-run when peaks change despite
|
|
374
|
+
* the array reference being stable.
|
|
375
|
+
*/
|
|
376
|
+
readonly peaksVersion: number;
|
|
377
|
+
/**
|
|
378
|
+
* Request the MediaPlayer to start capturing waveform data.
|
|
379
|
+
* Lazily creates AudioContext + AnalyserNodes on first call.
|
|
380
|
+
* No-op on subsequent calls. No-op for YouTube sources.
|
|
381
|
+
*/
|
|
382
|
+
requestWaveformCapture(): void;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
declare function PlaybackProvider({ children }: {
|
|
386
|
+
children: React$1.ReactNode;
|
|
387
|
+
}): react_jsx_runtime.JSX.Element;
|
|
388
|
+
/**
|
|
389
|
+
* Register a PlaybackHandle under `name` for the duration of the component's
|
|
390
|
+
* life. Safe to call without a PlaybackProvider — silently no-ops.
|
|
391
|
+
*/
|
|
392
|
+
declare function useRegisterPlayback(name: string, handle: PlaybackHandle): void;
|
|
393
|
+
/**
|
|
394
|
+
* Look up a PlaybackHandle by the name registered by a sibling MediaPlayer.
|
|
395
|
+
* Returns `undefined` if no player with that name is mounted yet.
|
|
396
|
+
* Must be called inside a PlaybackProvider.
|
|
397
|
+
*/
|
|
398
|
+
declare function usePlayback(source: string): PlaybackHandle | undefined;
|
|
399
|
+
|
|
400
|
+
export { AudioElement, type AudioElementProps, Button, type ButtonProps, CheckboxGroup, type CheckboxGroupProps, type CheckboxOption, Condition, ConditionsConditionalRender, type ConditionsConditionalRenderProps, type DebugMessage, Display, type DisplayProps, Element, type ElementConfig, type ElementProps, ImageElement, type ImageElementProps, KitchenTimer, type KitchenTimerProps, ListSorter, type ListSorterProps, Loading, type LoadingProps, Markdown, type MarkdownProps, type PasteAttempt, type PlaybackHandle, PlaybackProvider, PositionConditionalRender, type PositionConditionalRenderProps, Prompt, type PromptProps, Qualtrics, type QualtricsProps, RadioGroup, type RadioGroupProps, type RadioOption, type ResolvedParam$1 as ResolvedParam, ScrollIndicator, type ScrollIndicatorProps, Separator, type SeparatorProps, Slider, type SliderProps, Stage, type StageConfig, type StageProps, type StagebookContext, StagebookProvider, SubmissionConditionalRender, type SubmissionConditionalRenderProps, SubmitButton, type SubmitButtonProps, TextArea, type TextAreaProps, type TextContentResult, TimeConditionalRender, type TimeConditionalRenderProps, Timeline, type TimelineProps, TrackedLink, type TrackedLinkProps, type TypingStats, useElapsedTime, usePlayback, useRegisterPlayback, useResolve, useSave, useScrollAwareness, useStagebookContext, useTextContent };
|