@bendyline/squisq-react 2.11.0 → 2.11.2

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.
@@ -0,0 +1,539 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Block, VideoPresentation as VideoPresentation$1, VideoPipSize, VideoPipShape, VideoPipPosition, Doc, Theme, SurfaceScheme, Transition, CaptionTrack, ViewportConfig as ViewportConfig$1, CustomTemplateDefinition, ScheduledClip } from '@bendyline/squisq/schemas';
3
+ import { ViewportConfig, DashboardStyleId, CoverSlideTemplate, CoverSlidePlayback, FlashcardFace, FlashcardSourceMode } from '@bendyline/squisq/doc';
4
+ import { FenceRendererMap } from '@bendyline/squisq/fence';
5
+ import { a as AudioController } from './AudioController-DwMsPe38.js';
6
+ import { C as CodeBlockCopyHandler } from './MarkdownRenderer-CC9dOc6b.js';
7
+ import { CSSProperties } from 'react';
8
+
9
+ /**
10
+ * Doc Player Control Types
11
+ *
12
+ * Shared type definitions for doc player controls across different
13
+ * layout modes (overlay, sidebar, bottom). These interfaces allow
14
+ * control components to be decoupled from the core DocPlayer.
15
+ *
16
+ * Related Files:
17
+ * - DocPlayer.tsx — Core player component
18
+ * - DocProgressBar.tsx — Extracted progress bar
19
+ * - DocControlsOverlay.tsx — Overlay controls (default)
20
+ * - DocControlsSidebar.tsx — Vertical sidebar controls
21
+ * - DocControlsBottom.tsx — Horizontal bottom strip controls
22
+ */
23
+
24
+ /** Layout mode for doc player controls */
25
+ type ControlsLayout = 'overlay' | 'sidebar' | 'bottom';
26
+ /**
27
+ * Placement of scheduled video relative to the rendered slide.
28
+ *
29
+ * `'background'` preserves the legacy full-bleed treatment behind the
30
+ * content. The other variants render above the content for presenter video.
31
+ */
32
+ type VideoPresentation = VideoPresentation$1;
33
+ /** Size of a picture-in-picture presenter video. */
34
+ type PipSize = VideoPipSize;
35
+ /** Shape of a picture-in-picture presenter video. */
36
+ type PipShape = VideoPipShape;
37
+ /** Corner occupied by a picture-in-picture presenter video. */
38
+ type PipPosition = VideoPipPosition;
39
+ /**
40
+ * Display mode for DocPlayer.
41
+ *
42
+ * - `'video'` — Traditional video-style playback with play/pause, scrub bar,
43
+ * and time-based auto-advance. Default mode.
44
+ * - `'slideshow'` — PowerPoint-style presentation with prev/next navigation.
45
+ * Blocks are treated as static slides that only change on user click.
46
+ * No auto-advance, no scrub bar.
47
+ * - `'linear'` — Long-scrolling document view. Renders the full markdown as
48
+ * readable HTML with template-annotated sections shown as inline SVG cards.
49
+ * No audio, no timeline, no controls — just a scrollable page.
50
+ * - `'page'` — Plain semantic HTML preview matching what the
51
+ * `markdownDocToPlainHtml` export produces. No SquisqPlayer, no SVG
52
+ * cards — just `<h1>`/`<p>`/`<ul>` etc. inside a sandboxed iframe.
53
+ * Use when you want a WYSIWYG view of the simple HTML export.
54
+ * - `'narrate'` — Teleprompter/performance surface. DocPlayer does not
55
+ * implement this mode; it is owned by the editor package
56
+ * (`@bendyline/squisq-editor-react`), which renders its own
57
+ * voice-paced teleprompter view for it.
58
+ * - `'dashboard'` — One static canvas that arranges every block into a
59
+ * layout's cells (grids, hero mosaics). No timeline, no navigation;
60
+ * overflow blocks beyond the layout's capacity are not rendered.
61
+ * - `'flashcards'` — A progressively revealed study deck derived from the
62
+ * document's nested block hierarchy, including multiple-choice quizzes.
63
+ */
64
+ type DisplayMode = 'video' | 'slideshow' | 'linear' | 'page' | 'narrate' | 'dashboard' | 'flashcards';
65
+ /**
66
+ * Caption display style.
67
+ *
68
+ * - `'standard'` — Traditional broadcast-style captions: small white text
69
+ * on a semi-transparent black badge at the top of the player.
70
+ * - `'social'` — Social media-style (Instagram/TikTok): large centered words
71
+ * showing 3-5 words at a time with the active word highlighted in the
72
+ * theme's primary color. Font and colors pulled from the active theme.
73
+ */
74
+ type CaptionStyle = 'standard' | 'social';
75
+ /**
76
+ * Where captions sit over the frame. `'bottom'` is the classic lower band
77
+ * (social default), `'top'` keeps them clear of content that lives in the
78
+ * lower half (chat bubbles, summaries), `'center'` is the full-frame social
79
+ * look. Standard captions default to `'top'`, social to `'bottom'`.
80
+ */
81
+ type CaptionPosition = 'top' | 'center' | 'bottom';
82
+ /**
83
+ * Caption display mode — combines enable/disable with style selection.
84
+ * The CC button cycles through: off → standard → social → off.
85
+ */
86
+ type CaptionMode = 'off' | 'standard' | 'social';
87
+ /** Slide navigation actions for slideshow display mode */
88
+ interface SlideNavActions {
89
+ /** Navigate to the next slide */
90
+ nextSlide: () => void;
91
+ /** Navigate to the previous slide */
92
+ prevSlide: () => void;
93
+ /** Navigate to a specific slide by index (0-based) */
94
+ goToSlide: (index: number) => void;
95
+ }
96
+ /** Playback state exposed to external control components */
97
+ interface PlaybackState {
98
+ isPlaying: boolean;
99
+ currentTime: number;
100
+ totalDuration: number;
101
+ /** Whether the managed cover is the visual currently shown. */
102
+ isCoverVisible?: boolean;
103
+ currentBlockIndex: number;
104
+ totalBlocks: number;
105
+ docProgress: number;
106
+ hasCaptions: boolean;
107
+ captionsEnabled: boolean;
108
+ /** Current caption display mode (off, standard, social). */
109
+ captionMode: CaptionMode;
110
+ isFullscreen?: boolean;
111
+ /** Current audio segment index (0-based) */
112
+ currentSegmentIndex: number;
113
+ /** Current audio segment name (e.g., 'intro', 'history') */
114
+ currentSegmentName: string | null;
115
+ /** Current block data (for extracting image info, etc.) */
116
+ currentBlock: Block | null;
117
+ /** Optional display label for non-block slides, e.g. the managed cover. */
118
+ currentSlideLabel?: string;
119
+ /** Optional human-facing slide number, separate from internal nav index. */
120
+ currentSlideNumber?: number;
121
+ /** Optional human-facing slide total, separate from internal nav total. */
122
+ totalSlideNumber?: number;
123
+ }
124
+ /** Playback actions exposed to external control components */
125
+ interface PlaybackActions {
126
+ toggle: () => void;
127
+ restart: () => void;
128
+ seekTo: (time: number) => void;
129
+ setCaptionsEnabled: (enabled: boolean) => void;
130
+ /** Cycle caption mode: off → standard → social → off */
131
+ cycleCaptionMode: () => void;
132
+ toggleFullscreen?: () => void;
133
+ }
134
+ /** Block marker data for the progress bar */
135
+ interface BlockMarker {
136
+ block: Block;
137
+ index: number;
138
+ position: number;
139
+ title: string;
140
+ /** True if this block is the first in a new audio segment (section boundary) */
141
+ isSectionStart: boolean;
142
+ }
143
+ /** Block metadata returned by SquisqRenderAPI.getBlocks() */
144
+ interface RenderBlockInfo {
145
+ id: string;
146
+ template: string;
147
+ startTime: number;
148
+ duration: number;
149
+ }
150
+ /** Audio segment info returned by SquisqRenderAPI.getAudioSegments() */
151
+ interface RenderAudioSegmentInfo {
152
+ src: string;
153
+ name: string;
154
+ duration: number;
155
+ startTime: number;
156
+ }
157
+ /** Caption phrase info returned by SquisqRenderAPI.getCaptions() */
158
+ interface RenderCaptionInfo {
159
+ text: string;
160
+ startTime: number;
161
+ endTime: number;
162
+ }
163
+ /** Chapter marker returned by SquisqRenderAPI.getChapters() */
164
+ interface RenderChapterInfo {
165
+ title: string;
166
+ startTime: number;
167
+ duration: number;
168
+ }
169
+ /**
170
+ * Instance-scoped API created in render mode and debug mode.
171
+ * React hosts receive it via `DocPlayer.onRenderAPIReady`; standalone hosts
172
+ * receive it from their mount handle.
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * const handle = SquisqPlayer.getHandle(rootElement);
177
+ * const api = await handle?.renderAPI;
178
+ * await api?.seekTo(5.0);
179
+ * ```
180
+ */
181
+ interface SquisqRenderAPI {
182
+ /** Seek and resolve only after the requested visual state is capture-ready. */
183
+ seekTo: (time: number) => Promise<void>;
184
+ /** Timeline time most recently committed to the player DOM. */
185
+ getRenderedTime: () => number;
186
+ getDuration: () => number;
187
+ getBlocks: () => RenderBlockInfo[];
188
+ getAudioSegments: () => RenderAudioSegmentInfo[];
189
+ getCaptions: () => RenderCaptionInfo[];
190
+ getChapters: () => RenderChapterInfo[];
191
+ showCover: () => Promise<void>;
192
+ hideCover: () => Promise<void>;
193
+ hasCoverBlock: () => boolean;
194
+ }
195
+ /** Format time in seconds to MM:SS string */
196
+ declare function formatTime(seconds: number): string;
197
+
198
+ interface DocPlayerProps {
199
+ /** The Doc to play. Wins over `markdown` when both are provided. */
200
+ doc?: Doc;
201
+ /** Markdown source to convert when `doc` is absent. */
202
+ markdown?: string;
203
+ /** Base path for resolving media URLs (default: `'.'`). */
204
+ basePath?: string;
205
+ /** Render mode for deterministic video capture. */
206
+ renderMode?: boolean;
207
+ /** Render slide transitions and per-layer animations (default: true). */
208
+ animationsEnabled?: boolean;
209
+ /** Receives the instance-scoped render API, and `null` on cleanup. */
210
+ onRenderAPIReady?: (api: SquisqRenderAPI | null) => void;
211
+ autoPlay?: boolean;
212
+ /** Restart Video-mode playback automatically when the timeline ends. */
213
+ loop?: boolean;
214
+ onEnded?: () => void;
215
+ onTimeUpdate?: (time: number) => void;
216
+ /** Optional host-owned audio controller. */
217
+ audioController?: AudioController;
218
+ /** Explicit synthetic clock for timed documents that intentionally have no audio asset. */
219
+ audioMode?: 'media' | 'synthetic';
220
+ showControls?: boolean;
221
+ showScrubber?: boolean;
222
+ muted?: boolean;
223
+ captionsEnabled?: boolean;
224
+ onCaptionsToggle?: (enabled: boolean) => void;
225
+ onPlaybackStateChange?: (state: PlaybackState) => void;
226
+ onControlsReady?: (controls: PlaybackActions & {
227
+ play: () => void;
228
+ pause: () => void;
229
+ }) => void;
230
+ isFullscreen?: boolean;
231
+ onFullscreenToggle?: () => void;
232
+ onBlockMarkers?: (markers: BlockMarker[]) => void;
233
+ forceViewport?: ViewportConfig;
234
+ theme?: Theme;
235
+ surface?: SurfaceScheme | 'auto';
236
+ /** Video, slideshow, page, dashboard, or flashcards rendition. */
237
+ displayMode?: DisplayMode;
238
+ /** Dashboard mode: layout id or `'auto'`. Overrides doc frontmatter. */
239
+ dashboardLayout?: string;
240
+ /** Dashboard mode: title-band override. Overrides doc frontmatter. */
241
+ dashboardShowTitle?: boolean;
242
+ /** Dashboard mode: cell style variant. Overrides doc frontmatter. */
243
+ dashboardStyle?: DashboardStyleId;
244
+ /** Dashboard mode: host-supplied title fallback (typically the file name). */
245
+ dashboardDocumentTitle?: string;
246
+ showCoverSlide?: boolean;
247
+ /** Visual template used to materialize the managed cover. */
248
+ coverSlideTemplate?: CoverSlideTemplate;
249
+ /** Seconds the cover remains visible after Video playback starts. */
250
+ coverSlideDuration?: number;
251
+ /** Whether video export advances or delays the story while the cover is visible. */
252
+ coverSlidePlayback?: CoverSlidePlayback;
253
+ coverVisible?: boolean;
254
+ captionStyle?: CaptionStyle;
255
+ /**
256
+ * Where captions sit over the frame. Omitted → the style's classic spot
257
+ * (standard: top edge; social: lower band). Use `'top'` when the lower
258
+ * half of the frame carries content the band would cover.
259
+ */
260
+ captionPosition?: CaptionPosition;
261
+ /**
262
+ * Placement of scheduled video relative to the slide content.
263
+ * Defaults to `'background'` for backward compatibility.
264
+ */
265
+ videoPresentation?: VideoPresentation;
266
+ /** Size of presenter video in picture-in-picture mode (default `'small'`). */
267
+ pipSize?: PipSize;
268
+ /** Shape of presenter video in picture-in-picture mode (default `'square'`). */
269
+ pipShape?: PipShape;
270
+ /** Corner used by presenter video in picture-in-picture mode. */
271
+ pipPosition?: PipPosition;
272
+ enableSwipe?: boolean;
273
+ globalKeyboardShortcuts?: boolean;
274
+ /** Show a Copy button on fenced code blocks in linear mode (default: false). */
275
+ showCodeCopyButton?: boolean;
276
+ /** Optional host clipboard adapter; otherwise the browser Clipboard API is used. */
277
+ onCopyCode?: CodeBlockCopyHandler;
278
+ /**
279
+ * Host fence-renderer registry (`@bendyline/squisq/fence`), applied in
280
+ * linear mode's markdown sections. Video/slideshow modes render blocks
281
+ * as SVG layers and do not consult it.
282
+ */
283
+ fenceRenderers?: FenceRendererMap;
284
+ }
285
+
286
+ /**
287
+ * Front-door component: resolves the `doc` / `markdown` props into a Doc
288
+ * and renders a themed empty state when neither is provided. The playback
289
+ * machinery lives in `DocPlayerContent` so its hook order never changes
290
+ * when a doc appears or disappears.
291
+ */
292
+ declare function DocPlayer(props: DocPlayerProps): react_jsx_runtime.JSX.Element;
293
+
294
+ /** Viewport configuration type */
295
+ interface ViewportDimensions {
296
+ width: number;
297
+ height: number;
298
+ }
299
+ interface BlockRendererProps {
300
+ /** The block to render */
301
+ block: Block;
302
+ /** Current time relative to block start (seconds) */
303
+ blockTime: number;
304
+ /** Base path for resolving media URLs */
305
+ basePath: string;
306
+ /** Whether this block is entering (for transition) */
307
+ isEntering?: boolean;
308
+ /** Whether this block is exiting (for transition) */
309
+ isExiting?: boolean;
310
+ /** Transition to apply. Defaults to block.transition. */
311
+ transition?: Transition;
312
+ /** Viewport dimensions (defaults to 1920x1080 landscape) */
313
+ viewport?: ViewportDimensions;
314
+ /** Whether the doc is currently playing (controls video playback) */
315
+ isPlaying?: boolean;
316
+ /** Silence audio carried by video layers. */
317
+ muted?: boolean;
318
+ /**
319
+ * Whether to render block transitions and layer animations (default: true).
320
+ * Disabling this only removes authored/render-style motion; timed video
321
+ * layers continue to advance normally.
322
+ */
323
+ animationsEnabled?: boolean;
324
+ /** Resolved theme inherited by rich-media renderers such as Mermaid. */
325
+ theme?: Theme;
326
+ }
327
+ declare function BlockRenderer({ block, blockTime, basePath, isEntering, isExiting, transition, viewport, isPlaying, muted, animationsEnabled, theme, }: BlockRendererProps): react_jsx_runtime.JSX.Element;
328
+
329
+ interface CaptionOverlayProps {
330
+ /** Caption track with timestamped phrases */
331
+ captions: CaptionTrack | undefined;
332
+ /** Current playback time in seconds */
333
+ currentTime: number;
334
+ /** Whether captions are enabled */
335
+ enabled?: boolean;
336
+ /** Font size in pixels for standard style (default: 16) */
337
+ fontSize?: number;
338
+ /** Caption display style (default: 'standard') */
339
+ captionStyle?: CaptionStyle;
340
+ /**
341
+ * Frame placement. Omitted → each style's classic spot: standard at the
342
+ * top edge, social in the lower band.
343
+ */
344
+ captionPosition?: CaptionPosition;
345
+ /** Theme for social-style caption colors and fonts */
346
+ theme?: Theme;
347
+ /** Viewport config for social-style font scaling */
348
+ viewport?: ViewportConfig$1;
349
+ }
350
+ declare function CaptionOverlay({ captions, currentTime, enabled, fontSize, captionStyle, captionPosition, theme, viewport, }: CaptionOverlayProps): react_jsx_runtime.JSX.Element;
351
+
352
+ interface SocialCaptionOverlayProps {
353
+ captions: CaptionTrack | undefined;
354
+ currentTime: number;
355
+ enabled?: boolean;
356
+ theme?: Theme;
357
+ viewport?: ViewportConfig$1;
358
+ /** Frame placement (default `'bottom'`). */
359
+ position?: CaptionPosition;
360
+ }
361
+ declare function SocialCaptionOverlay({ captions, currentTime, enabled, theme, viewport, position, }: SocialCaptionOverlayProps): react_jsx_runtime.JSX.Element | null;
362
+
363
+ interface DocControlsOverlayProps {
364
+ state: PlaybackState;
365
+ actions: PlaybackActions;
366
+ blockMarkers: BlockMarker[];
367
+ expandedBlocks: Block[];
368
+ getBlockTitle?: (block: Block) => string;
369
+ }
370
+ declare function DocControlsOverlay({ state, actions, blockMarkers, expandedBlocks, getBlockTitle, }: DocControlsOverlayProps): react_jsx_runtime.JSX.Element;
371
+
372
+ interface DocControlsBottomProps {
373
+ state: PlaybackState;
374
+ actions: PlaybackActions;
375
+ blockMarkers: BlockMarker[];
376
+ expandedBlocks: Block[];
377
+ getBlockTitle?: (block: Block) => string;
378
+ }
379
+ declare function DocControlsBottom({ state, actions, blockMarkers, expandedBlocks, getBlockTitle, }: DocControlsBottomProps): react_jsx_runtime.JSX.Element;
380
+
381
+ interface DocControlsSidebarProps {
382
+ state: PlaybackState;
383
+ actions: PlaybackActions;
384
+ }
385
+ declare function DocControlsSidebar({ state, actions }: DocControlsSidebarProps): react_jsx_runtime.JSX.Element;
386
+
387
+ interface SlideshowPickerItem {
388
+ /** Stable identifier for the slide/block. */
389
+ id: string;
390
+ /** Human-facing slide number, or a special label such as "Cover". */
391
+ label: string;
392
+ /** Short description shown in the slide picker. */
393
+ summary: string;
394
+ }
395
+ interface DocControlsSlideshowProps {
396
+ state: PlaybackState;
397
+ slideNav: SlideNavActions;
398
+ /** Slides available for direct navigation from the counter popover. */
399
+ slides?: readonly SlideshowPickerItem[];
400
+ /** Controlled open state for hosts that expose their own picker shortcut. */
401
+ pickerOpen?: boolean;
402
+ /** Called whenever the slide picker should open or close. */
403
+ onPickerOpenChange?: (open: boolean) => void;
404
+ }
405
+ declare function DocControlsSlideshow({ state, slideNav, slides, pickerOpen, onPickerOpenChange, }: DocControlsSlideshowProps): react_jsx_runtime.JSX.Element;
406
+
407
+ interface DocPlayerWithSidebarProps {
408
+ /** The Doc to play */
409
+ doc: Doc;
410
+ /** Base path for resolving media URLs (default: `'.'`) */
411
+ basePath?: string;
412
+ autoPlay?: boolean;
413
+ /** Restart playback automatically when the video timeline ends. */
414
+ loop?: boolean;
415
+ onEnded?: () => void;
416
+ onTimeUpdate?: (time: number) => void;
417
+ /** Optional audio controller (if not provided, uses default HTML5 audio) */
418
+ audioController?: AudioController;
419
+ /** Whether to render slide transitions and per-layer animations (default: true). */
420
+ animationsEnabled?: boolean;
421
+ muted?: boolean;
422
+ captionsEnabled?: boolean;
423
+ isFullscreen?: boolean;
424
+ onFullscreenToggle?: () => void;
425
+ /** Force a specific viewport preset, bypassing window-based orientation detection. */
426
+ forceViewport?: ViewportConfig$1;
427
+ /** Called when playing state changes */
428
+ onPlayingChange?: (isPlaying: boolean) => void;
429
+ /**
430
+ * Theme for rendering. Forwarded to the inner DocPlayer so the sidebar
431
+ * (portrait) layout matches the default (landscape) layout — without it the
432
+ * inner player falls back to DEFAULT_THEME, whose dark text is unreadable
433
+ * over a hero cover image.
434
+ */
435
+ theme?: Theme;
436
+ }
437
+ declare function DocPlayerWithSidebar({ doc, basePath, autoPlay, loop, onEnded, onTimeUpdate, audioController, animationsEnabled, muted, captionsEnabled, isFullscreen, onFullscreenToggle, forceViewport, onPlayingChange, theme, }: DocPlayerWithSidebarProps): react_jsx_runtime.JSX.Element;
438
+
439
+ interface DocProgressBarProps {
440
+ state: PlaybackState;
441
+ actions: PlaybackActions;
442
+ blockMarkers: BlockMarker[];
443
+ /** All expanded blocks for hover lookup */
444
+ expandedBlocks: Block[];
445
+ /** Optional: get block title for hover tooltip */
446
+ getBlockTitle?: (block: Block) => string;
447
+ }
448
+ declare function DocProgressBar({ state, actions, blockMarkers, expandedBlocks, getBlockTitle, }: DocProgressBarProps): react_jsx_runtime.JSX.Element;
449
+
450
+ interface FlashcardViewProps {
451
+ doc: Doc;
452
+ theme?: Theme;
453
+ basePath?: string;
454
+ source?: FlashcardSourceMode;
455
+ /** Start the deck in shuffled order (default false). */
456
+ shuffle?: boolean;
457
+ /** Capture shortcuts without requiring focus (default false). */
458
+ globalKeyboardShortcuts?: boolean;
459
+ showCodeCopyButton?: boolean;
460
+ onCopyCode?: CodeBlockCopyHandler;
461
+ fenceRenderers?: FenceRendererMap;
462
+ /** Viewport used to materialize diagrams and other spatial content. */
463
+ viewport?: ViewportConfig$1;
464
+ className?: string;
465
+ }
466
+ interface FlashcardFaceViewProps {
467
+ face: FlashcardFace;
468
+ theme: Theme;
469
+ basePath: string;
470
+ showCodeCopyButton: boolean;
471
+ onCopyCode?: CodeBlockCopyHandler;
472
+ fenceRenderers?: FenceRendererMap;
473
+ viewport?: ViewportConfig$1;
474
+ customTemplates?: readonly CustomTemplateDefinition[];
475
+ }
476
+ /** Rich, theme-aware renderer for one materialized flashcard face. */
477
+ declare function FlashcardFaceView(props: FlashcardFaceViewProps): react_jsx_runtime.JSX.Element;
478
+ declare function FlashcardView({ doc, theme, basePath, source, shuffle: initialShuffle, globalKeyboardShortcuts, showCodeCopyButton, onCopyCode, fenceRenderers, viewport, className, }: FlashcardViewProps): react_jsx_runtime.JSX.Element;
479
+
480
+ interface InlineVideoPlayerProps {
481
+ /** Source path — resolved through MediaContext when relative. */
482
+ src: string;
483
+ /** Base path used when no MediaProvider is in context. */
484
+ basePath?: string;
485
+ /** Optional explicit width (pixels or CSS length). */
486
+ width?: number | string;
487
+ /** Optional explicit height (pixels or CSS length). */
488
+ height?: number | string;
489
+ /** Optional poster image src — also resolved through MediaContext. */
490
+ poster?: string;
491
+ /** Whether to show native controls. Defaults to true. */
492
+ controls?: boolean;
493
+ /** `preload` attribute passthrough. Defaults to `'metadata'`. */
494
+ preload?: 'none' | 'metadata' | 'auto';
495
+ /** Extra className on the wrapper. */
496
+ className?: string;
497
+ }
498
+ declare function InlineVideoPlayer({ src, basePath, width, height, poster, controls, preload, className, }: InlineVideoPlayerProps): react_jsx_runtime.JSX.Element | null;
499
+
500
+ interface InlineAudioPlayerProps {
501
+ /** Source path — resolved through MediaContext when relative. */
502
+ src: string;
503
+ /** Base path used when no MediaProvider is in context. */
504
+ basePath?: string;
505
+ /** Whether to show native controls. Defaults to true. */
506
+ controls?: boolean;
507
+ /** `preload` attribute passthrough. Defaults to `'metadata'`. */
508
+ preload?: 'none' | 'metadata' | 'auto';
509
+ /** Extra className on the wrapper. */
510
+ className?: string;
511
+ }
512
+ declare function InlineAudioPlayer({ src, basePath, controls, preload, className, }: InlineAudioPlayerProps): react_jsx_runtime.JSX.Element | null;
513
+
514
+ interface MediaClipLayerProps {
515
+ schedule: ScheduledClip[];
516
+ currentTime: number;
517
+ isPlaying: boolean;
518
+ basePath: string;
519
+ renderMode?: boolean;
520
+ /** Silence every scheduled clip during live playback. */
521
+ muted?: boolean;
522
+ /** Placement of video clips relative to the rendered document. */
523
+ presentation?: VideoPresentation;
524
+ /** Size of picture-in-picture video (small or large). */
525
+ pipSize?: PipSize;
526
+ /** Shape of picture-in-picture video (square or 16:9 wide). */
527
+ pipShape?: PipShape;
528
+ /** Corner occupied by picture-in-picture video. */
529
+ pipPosition?: PipPosition;
530
+ /** Orientation of the rendered player viewport. */
531
+ pipOrientation?: 'landscape' | 'portrait';
532
+ /** Resolved theme frame applied directly to PIP video during raster capture. */
533
+ pipFrameStyle?: Pick<CSSProperties, 'border' | 'borderRadius' | 'boxShadow'>;
534
+ /** Honor each scheduled video's authored placement override. Default true. */
535
+ honorClipPresentation?: boolean;
536
+ }
537
+ declare function MediaClipLayer({ schedule, currentTime, isPlaying, basePath, renderMode, muted, presentation, pipSize, pipShape, pipPosition, pipOrientation, pipFrameStyle, honorClipPresentation, }: MediaClipLayerProps): react_jsx_runtime.JSX.Element | null;
538
+
539
+ export { type RenderChapterInfo as A, type BlockMarker as B, type CaptionMode as C, type DisplayMode as D, type SlideNavActions as E, FlashcardFaceView as F, SocialCaptionOverlay as G, formatTime as H, InlineAudioPlayer as I, MediaClipLayer as M, type PipSize as P, type RenderAudioSegmentInfo as R, type SquisqRenderAPI as S, type VideoPresentation as V, type PipShape as a, type PipPosition as b, BlockRenderer as c, CaptionOverlay as d, type CaptionPosition as e, type CaptionStyle as f, type ControlsLayout as g, DocControlsBottom as h, DocControlsOverlay as i, DocControlsSidebar as j, DocControlsSlideshow as k, DocPlayer as l, type DocPlayerProps as m, DocPlayerWithSidebar as n, DocProgressBar as o, type FlashcardFaceViewProps as p, FlashcardView as q, type FlashcardViewProps as r, type InlineAudioPlayerProps as s, InlineVideoPlayer as t, type InlineVideoPlayerProps as u, type MediaClipLayerProps as v, type PlaybackActions as w, type PlaybackState as x, type RenderBlockInfo as y, type RenderCaptionInfo as z };