@atom63/slides 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.
@@ -0,0 +1,1284 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode, HTMLAttributes, ImgHTMLAttributes } from 'react';
4
+ import { S as SlideLayout, a as SlideDeckItem } from './template-registry-BOJP4rlI.js';
5
+ export { P as ParsedSlide, b as SlideDeckMeta, c as SlotDef, d as SlotGroupDef, e as SlotKind, T as TemplateCategory, f as TemplateDef, g as TemplateName, h as getTemplate, l as listTemplates, t as templateNames, i as templateRegistry } from './template-registry-BOJP4rlI.js';
6
+ import * as zustand_middleware from 'zustand/middleware';
7
+ import * as zustand from 'zustand';
8
+
9
+ interface SlideGateProvider {
10
+ fetchConfigured: (slug: string) => Promise<boolean>;
11
+ gateEnvVarName: (slug: string) => string;
12
+ isUnlocked: (slug: string) => boolean;
13
+ setUnlocked: (slug: string) => void;
14
+ verify: (slug: string, code: string) => Promise<boolean>;
15
+ }
16
+
17
+ /** Presenter script for the current slide — hidden on stage, surfaced in panels. */
18
+ declare function TalkTrack({ children }: {
19
+ children: ReactNode;
20
+ }): react_jsx_runtime.JSX.Element | null;
21
+ declare namespace TalkTrack {
22
+ var displayName: string;
23
+ }
24
+ /** Hidden marker that sets the frame section label for this and following slides. */
25
+ declare function Section({ children }: {
26
+ children: ReactNode;
27
+ }): react_jsx_runtime.JSX.Element | null;
28
+ declare namespace Section {
29
+ var displayName: string;
30
+ }
31
+ declare function Slide({ children, layout }: {
32
+ children: ReactNode;
33
+ layout?: SlideLayout;
34
+ }): react_jsx_runtime.JSX.Element | null;
35
+ declare namespace Slide {
36
+ var displayName: string;
37
+ }
38
+ /** Small uppercase label — monospace, tracked-out. */
39
+ declare function Overline({ children }: {
40
+ children: ReactNode;
41
+ }): react_jsx_runtime.JSX.Element;
42
+ declare namespace Overline {
43
+ var displayName: string;
44
+ }
45
+ /** Small muted text — attribution, dates, metadata. */
46
+ declare function Caption({ children, reveal, index, }: {
47
+ children: ReactNode;
48
+ reveal?: boolean;
49
+ index?: number;
50
+ }): react_jsx_runtime.JSX.Element;
51
+ declare namespace Caption {
52
+ var displayName: string;
53
+ }
54
+ /** Thin decorative line — not a slide break. */
55
+ declare function Divider$1(): react_jsx_runtime.JSX.Element;
56
+ declare namespace Divider$1 {
57
+ var displayName: string;
58
+ }
59
+ /** Large numeral — monospace display number. */
60
+ declare function SlideNumber({ children }: {
61
+ children: ReactNode;
62
+ }): react_jsx_runtime.JSX.Element;
63
+ declare namespace SlideNumber {
64
+ var displayName: string;
65
+ }
66
+ declare function SlideImage({ src, alt, fill, className, }: {
67
+ src: string;
68
+ alt: string;
69
+ fill?: boolean;
70
+ className?: string;
71
+ }): react_jsx_runtime.JSX.Element;
72
+ declare namespace SlideImage {
73
+ var displayName: string;
74
+ }
75
+ declare function SlideVideo({ src, alt, fill, className, }: {
76
+ src: string;
77
+ alt: string;
78
+ fill?: boolean;
79
+ className?: string;
80
+ }): react_jsx_runtime.JSX.Element;
81
+ declare namespace SlideVideo {
82
+ var displayName: string;
83
+ }
84
+ declare function SlideGrid({ children, columns, gap, }: {
85
+ children: ReactNode;
86
+ columns?: 2 | 3 | 4;
87
+ gap?: 'sm' | 'md' | 'lg';
88
+ }): react_jsx_runtime.JSX.Element;
89
+ declare namespace SlideGrid {
90
+ var displayName: string;
91
+ }
92
+
93
+ type GapSize = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
94
+ type AlignOption = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
95
+ type JustifyOption = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
96
+ /** Multi-column layout with equal width columns */
97
+ declare function Columns({ children, count, gap, align, }: {
98
+ children: ReactNode;
99
+ count?: 2 | 3 | 4;
100
+ gap?: GapSize;
101
+ align?: AlignOption;
102
+ }): react_jsx_runtime.JSX.Element;
103
+ type SplitRatio = '1/1' | '2/1' | '1/2' | '3/1' | '1/3';
104
+ type TrioRatio = '1/1/1' | '2/1/1' | '1/2/1' | '1/1/2';
105
+ /**
106
+ * Two-up layout on the 12-column master grid. Use this for asymmetric
107
+ * splits (narrative + media, quote + photo, thesis + detail) without
108
+ * writing `colStart` / `colSpan` by hand. The ratio maps to fixed 12-col
109
+ * spans so slides using `Split` always align with slides using `<Grid>`.
110
+ *
111
+ * 1/1 → 6 + 6
112
+ * 2/1 → 8 + 4
113
+ * 1/2 → 4 + 8
114
+ * 3/1 → 9 + 3
115
+ * 1/3 → 3 + 9
116
+ *
117
+ * Pass two direct children; extra children are ignored.
118
+ */
119
+ declare function Split({ children, ratio, gap, align, }: {
120
+ children: ReactNode;
121
+ ratio?: SplitRatio;
122
+ gap?: GapSize;
123
+ align?: AlignOption;
124
+ }): react_jsx_runtime.JSX.Element;
125
+ /**
126
+ * Three-up layout on the 12-column master grid. Same rhythm rules as
127
+ * `Split` — ratios resolve to 12-col spans so trios align with the rest
128
+ * of the deck.
129
+ *
130
+ * 1/1/1 → 4 + 4 + 4
131
+ * 2/1/1 → 6 + 3 + 3
132
+ * 1/2/1 → 3 + 6 + 3
133
+ * 1/1/2 → 3 + 3 + 6
134
+ */
135
+ declare function Trio({ children, ratio, gap, align, }: {
136
+ children: ReactNode;
137
+ ratio?: TrioRatio;
138
+ gap?: GapSize;
139
+ align?: AlignOption;
140
+ }): react_jsx_runtime.JSX.Element;
141
+ /**
142
+ * CSS Grid foundation — the slide master grid.
143
+ *
144
+ * Every slide in the deck uses a shared **12-column** horizontal rhythm.
145
+ * This is what makes paging through the deck feel like one authored
146
+ * object instead of loose artboards: titles, media edges, and stat
147
+ * columns all snap to the same vertical lines slide-to-slide.
148
+ *
149
+ * Rows adapt to content (6 for three-up bentos, 8 for stat grids, etc.)
150
+ * but `cols` should stay at 12 unless you're writing a one-off full-bleed
151
+ * layout. If you find yourself overriding `cols`, consider whether the
152
+ * layout belongs behind a template instead.
153
+ *
154
+ * A Title rendered by `Grid` sits under a top hairline rule so the
155
+ * slide header reads as a Swiss editorial masthead.
156
+ */
157
+ declare function Grid({ children, cols, rows, gap, label, title, ruled, }: {
158
+ children: ReactNode;
159
+ cols?: number;
160
+ rows?: number;
161
+ gap?: GapSize;
162
+ label?: string;
163
+ title?: string;
164
+ /** Draw the masthead hairline above label/title. Default true. */
165
+ ruled?: boolean;
166
+ }): react_jsx_runtime.JSX.Element;
167
+ type CellVariant = 'none' | 'muted' | 'outline' | 'accent' | 'rule' | 'frame' | 'solid';
168
+ type CellPadding = 'none' | 'sm' | 'md' | 'lg';
169
+ type CellOverflow = 'hidden' | 'visible';
170
+ /**
171
+ * A cell inside a `Grid`. Place via colStart/rowStart and span via colSpan/rowSpan.
172
+ *
173
+ * Variant vocabulary (Swiss-first):
174
+ * none — no chrome, just layout
175
+ * rule — top hairline only, transparent bg (the default bento treatment)
176
+ * frame — 1px hairline on all four sides, transparent bg
177
+ * outline — legacy alias for `frame`
178
+ * muted — filled plate (use sparingly, for dense data cells)
179
+ * accent — solid signal-color block with inverted text
180
+ * solid — solid foreground block with inverted text
181
+ *
182
+ * Corners are square by default — pass `rounded` for the exception.
183
+ */
184
+ declare function Cell({ children, colSpan, rowSpan, colStart, rowStart, variant, padding, overflow, rounded, }: {
185
+ children: ReactNode;
186
+ colSpan?: number;
187
+ rowSpan?: number;
188
+ colStart?: number;
189
+ rowStart?: number;
190
+ variant?: CellVariant;
191
+ padding?: CellPadding;
192
+ overflow?: CellOverflow;
193
+ rounded?: boolean;
194
+ }): react_jsx_runtime.JSX.Element;
195
+ /** Vertical stack with consistent spacing */
196
+ declare function Stack({ children, gap, align, justify, className, }: {
197
+ children: ReactNode;
198
+ gap?: GapSize;
199
+ align?: AlignOption;
200
+ justify?: JustifyOption;
201
+ className?: string;
202
+ }): react_jsx_runtime.JSX.Element;
203
+ /** Horizontal row with alignment control */
204
+ declare function Row({ children, gap, align, justify, wrap, }: {
205
+ children: ReactNode;
206
+ gap?: GapSize;
207
+ align?: AlignOption;
208
+ justify?: JustifyOption;
209
+ wrap?: boolean;
210
+ }): react_jsx_runtime.JSX.Element;
211
+ /** Center content on both axes */
212
+ declare function Center({ children }: {
213
+ children: ReactNode;
214
+ }): react_jsx_runtime.JSX.Element;
215
+ /** Explicit whitespace — use for intentional spacing */
216
+ declare function Spacer({ size }: {
217
+ size?: GapSize;
218
+ }): react_jsx_runtime.JSX.Element;
219
+ type TextAlign = 'left' | 'center' | 'right';
220
+ type TextColor = 'default' | 'secondary' | 'muted' | 'accent' | 'inherit';
221
+ /**
222
+ * Hero numeral / single-word text. Light + tight tracking signals
223
+ * decorative, not authored. Use for big stats or one-word statements.
224
+ */
225
+ declare function Display({ children, align, color, size, weight, }: {
226
+ children: ReactNode;
227
+ align?: TextAlign;
228
+ color?: TextColor;
229
+ size?: 'sm' | 'md' | 'lg';
230
+ weight?: 'extralight' | 'light' | 'regular' | 'medium';
231
+ }): react_jsx_runtime.JSX.Element;
232
+ /**
233
+ * Full-slide statement headline. Use when the whole slide is one
234
+ * sentence (keynote thesis, section opener). Always 128px.
235
+ */
236
+ declare function Headline({ children, align, color, weight, }: {
237
+ children: ReactNode;
238
+ align?: TextAlign;
239
+ color?: TextColor;
240
+ weight?: 'light' | 'regular' | 'medium' | 'semibold';
241
+ }): react_jsx_runtime.JSX.Element;
242
+ /**
243
+ * Slide title. Use when the slide has supporting content below a heading.
244
+ * Always 72px. Defaults to medium — bump to semibold for covers.
245
+ */
246
+ declare function Title({ children, align, color, weight, }: {
247
+ children: ReactNode;
248
+ align?: TextAlign;
249
+ color?: TextColor;
250
+ weight?: 'light' | 'regular' | 'medium' | 'semibold';
251
+ }): react_jsx_runtime.JSX.Element;
252
+ /**
253
+ * Sub-head under a Title, or a section label that still needs to read
254
+ * as type (not a Label). Always 44px. Color defaults to foreground —
255
+ * pass `color="muted"` for quieter sub-heads.
256
+ */
257
+ declare function Subtitle({ children, align, color, weight, }: {
258
+ children: ReactNode;
259
+ align?: TextAlign;
260
+ color?: TextColor;
261
+ weight?: 'light' | 'regular' | 'medium' | 'semibold';
262
+ }): react_jsx_runtime.JSX.Element;
263
+ /** Paragraph text. `md` is the default — go sm for dense cells, lg for emphasis. */
264
+ declare function Body({ children, align, color, size, weight, reveal, index, }: {
265
+ children: ReactNode;
266
+ align?: TextAlign;
267
+ color?: TextColor;
268
+ size?: 'sm' | 'md' | 'lg';
269
+ weight?: 'light' | 'regular' | 'medium' | 'semibold';
270
+ reveal?: boolean;
271
+ index?: number;
272
+ }): react_jsx_runtime.JSX.Element;
273
+ /**
274
+ * Renders a body string that may contain `\n` line breaks as separate
275
+ * `<Body>` paragraphs with a gap between them. Use this instead of
276
+ * `<Body>{string}</Body>` whenever the text comes from a template prop.
277
+ */
278
+ declare function BodyLines({ children, size, color, }: {
279
+ children: string;
280
+ size?: 'sm' | 'md' | 'lg';
281
+ color?: 'default' | 'muted' | 'secondary' | 'accent' | 'inherit';
282
+ }): react_jsx_runtime.JSX.Element;
283
+ /**
284
+ * Small uppercase annotation. One size only (18px). Use for eyebrows,
285
+ * figure captions, section markers, attribution lines.
286
+ *
287
+ * `orientation="vertical"` sets the label in the margin, running
288
+ * bottom-to-top — the Swiss gutter label treatment.
289
+ */
290
+ declare function Label({ children, align, color, font, orientation, reveal, index, }: {
291
+ children: ReactNode;
292
+ align?: TextAlign;
293
+ color?: TextColor;
294
+ font?: 'mono' | 'sans';
295
+ orientation?: 'horizontal' | 'vertical';
296
+ reveal?: boolean;
297
+ index?: number;
298
+ }): react_jsx_runtime.JSX.Element;
299
+ /**
300
+ * Inline content highlight. `text-primary` is reserved for content
301
+ * emphasis — if you want a ghost tint, use `text-foreground/XX` directly.
302
+ */
303
+ declare function Accent({ children, color, }: {
304
+ children: ReactNode;
305
+ color?: 'accent' | 'default';
306
+ }): react_jsx_runtime.JSX.Element;
307
+ /** Inline monospace for numbers, code, technical content. */
308
+ declare function Mono({ children, size, }: {
309
+ children: ReactNode;
310
+ size?: 'sm' | 'md' | 'lg';
311
+ }): react_jsx_runtime.JSX.Element;
312
+ /**
313
+ * Inline code token for use inside Body or template body props.
314
+ * Uses `em`-relative sizing so it scales with whatever Body size it sits in.
315
+ */
316
+ declare function InlineCode({ children }: {
317
+ children: ReactNode;
318
+ }): react_jsx_runtime.JSX.Element;
319
+ /**
320
+ * Pull quote. `sm` for inline quotes inside a content slide, `lg` for a
321
+ * full-slide pull quote.
322
+ *
323
+ * The decorative open-quote glyph is positioned with a negative offset
324
+ * so it sits just outside the text block — beautiful inline but liable
325
+ * to clip when the quote is placed in the left column of a slide.
326
+ * Pass `decorated={false}` to suppress the glyph (the Swiss editorial
327
+ * treatment) and rely on rules + attribution to signal "quote".
328
+ */
329
+ declare function Quote({ children, attribution, size, decorated, }: {
330
+ children: ReactNode;
331
+ attribution?: string;
332
+ size?: 'sm' | 'lg';
333
+ decorated?: boolean;
334
+ }): react_jsx_runtime.JSX.Element;
335
+ type ObjectFit = 'cover' | 'contain' | 'fill';
336
+ type AspectRatio = '16/9' | '4/3' | '1/1' | 'auto';
337
+ /**
338
+ * Syntax-highlighted code block sized for the slide canvas.
339
+ *
340
+ * Two usage modes:
341
+ * - Fenced code blocks in MDX (```tsx) render through this automatically via
342
+ * the `pre` override in slideMdxComponents — pass nothing, `children` carries
343
+ * the already-highlighted rehype-pretty-code output.
344
+ * - Explicit JSX usage: pass a `code` string prop and Shiki highlights it at
345
+ * runtime using the github-dark-dimmed theme.
346
+ *
347
+ * Font scales with --slide-type-scale like all other slide typography.
348
+ */
349
+ declare function SlideCodeBlock({ children, language, code, dataTheme, }: {
350
+ children?: ReactNode;
351
+ language?: string;
352
+ /** Plain code string — triggers runtime Shiki highlighting. */
353
+ code?: string;
354
+ /** Forwarded from rehype-pretty-code's data-theme on the original <pre>. */
355
+ dataTheme?: string;
356
+ }): react_jsx_runtime.JSX.Element;
357
+ /** Image with fit modes and optional aspect-ratio container. Square corners by default. */
358
+ declare function Image({ src, alt, fit, rounded, aspectRatio, className, caption, }: {
359
+ src: string;
360
+ alt: string;
361
+ fit?: ObjectFit;
362
+ rounded?: boolean;
363
+ aspectRatio?: AspectRatio;
364
+ className?: string;
365
+ caption?: string;
366
+ }): react_jsx_runtime.JSX.Element;
367
+ /**
368
+ * Video with autoplay/loop and optional aspect-ratio container.
369
+ *
370
+ * Play/pause is driven by IntersectionObserver so the video only runs when
371
+ * its slide is visible. On exit the video pauses and resets to the start so
372
+ * revisiting the slide always replays from the beginning — standard
373
+ * presentation behavior. `autoPlay={false}` on the HTML element prevents
374
+ * the browser from playing before visibility is confirmed.
375
+ */
376
+ declare function Video({ src, fit, rounded, aspectRatio, autoPlay, loop, muted, poster, caption, }: {
377
+ src: string;
378
+ fit?: ObjectFit;
379
+ rounded?: boolean;
380
+ aspectRatio?: AspectRatio;
381
+ autoPlay?: boolean;
382
+ loop?: boolean;
383
+ muted?: boolean;
384
+ /** Static frame shown while the video is loading or the slide is off-screen. */
385
+ poster?: string;
386
+ caption?: string;
387
+ }): react_jsx_runtime.JSX.Element;
388
+ /** Material icon at slide scale */
389
+ declare function Icon({ name, size, color, }: {
390
+ name: string;
391
+ size?: 'sm' | 'md' | 'lg' | 'xl';
392
+ color?: TextColor;
393
+ }): react_jsx_runtime.JSX.Element;
394
+ /** Circular avatar image. Avatars are the one primitive that stays rounded — intentional human marker. */
395
+ declare function Avatar({ src, alt, size, }: {
396
+ src: string;
397
+ alt: string;
398
+ size?: 'sm' | 'md' | 'lg' | 'xl';
399
+ }): react_jsx_runtime.JSX.Element;
400
+ type BoxVariant = 'default' | 'muted' | 'outline' | 'accent' | 'solid';
401
+ /** Container with background/border/padding. Square corners by default. */
402
+ declare function Box({ children, variant, padding, rounded, className, }: {
403
+ children: ReactNode;
404
+ variant?: BoxVariant;
405
+ padding?: 'none' | 'sm' | 'md' | 'lg';
406
+ rounded?: boolean;
407
+ className?: string;
408
+ }): react_jsx_runtime.JSX.Element;
409
+ /** Horizontal or vertical rule. Accent is a solid 2px signal-color bar. */
410
+ declare function Divider({ direction, color, weight, }: {
411
+ direction?: 'horizontal' | 'vertical';
412
+ color?: 'muted' | 'accent' | 'default';
413
+ weight?: 'thin' | 'thick';
414
+ }): react_jsx_runtime.JSX.Element;
415
+ /** Small square tag. Shares type sizing with `Label` (18px) so a Badge
416
+ * beside a Label reads on the same baseline. Hard-edged, hairline-framed —
417
+ * the Swiss form-tag treatment. */
418
+ declare function Badge({ children, variant, }: {
419
+ children: ReactNode;
420
+ variant?: 'muted' | 'accent' | 'outline' | 'solid';
421
+ }): react_jsx_runtime.JSX.Element;
422
+ /** Framed highlight block — hairline on all sides, no fill tint. Accent swaps to a solid signal-color block. */
423
+ declare function Highlight({ children, variant, }: {
424
+ children: ReactNode;
425
+ variant?: 'accent' | 'muted' | 'frame';
426
+ }): react_jsx_runtime.JSX.Element;
427
+ /**
428
+ * Solid color block. Full-bleed primary / foreground rectangle — use
429
+ * behind a word of Headline or a stat numeral for the Müller-Brockmann
430
+ * "color plate" move. Accepts children so text sits on the block with
431
+ * inverted color.
432
+ */
433
+ declare function ColorBlock({ children, color, padding, className, }: {
434
+ children?: ReactNode;
435
+ color?: 'primary' | 'foreground';
436
+ padding?: 'none' | 'sm' | 'md' | 'lg';
437
+ className?: string;
438
+ }): react_jsx_runtime.JSX.Element;
439
+ /**
440
+ * Editorial form-stamp for media and data cells. Renders "FIG. 03 / 14"
441
+ * or any register/total pair in mono tabular nums. Use absolutely
442
+ * positioned inside a cell, or inline above a caption.
443
+ */
444
+ declare function FigureMark({ register, total, prefix, className, }: {
445
+ register: number | string;
446
+ total?: number | string;
447
+ prefix?: string;
448
+ className?: string;
449
+ }): react_jsx_runtime.JSX.Element;
450
+ /**
451
+ * Large margin numeral — the Müller-Brockmann section marker. Renders a
452
+ * giant extralight numeral pushed off to one side with a vertical
453
+ * orientation. Place inside a 2-column slice on the outer edge of a
454
+ * slide.
455
+ *
456
+ * <SectionMarker number="03" caption="Foundations" />
457
+ */
458
+ declare function SectionMarker({ number, caption, side, }: {
459
+ number: string;
460
+ caption?: string;
461
+ side?: 'left' | 'right';
462
+ }): react_jsx_runtime.JSX.Element;
463
+ /** Styled list with custom markers. Numbered lists use tabular mono for Swiss register. */
464
+ declare function List({ children, marker, gap, }: {
465
+ children: ReactNode;
466
+ marker?: 'dash' | 'number' | 'bullet' | 'none';
467
+ gap?: GapSize;
468
+ }): react_jsx_runtime.JSX.Element;
469
+ /** List item — use inside List. Size matches `Body` md so inline body
470
+ * text and list items read on the same baseline. */
471
+ declare function Item({ children, reveal, index, }: {
472
+ children: ReactNode;
473
+ reveal?: boolean;
474
+ index?: number;
475
+ }): react_jsx_runtime.JSX.Element;
476
+ /**
477
+ * Entrance animation wrapper. Wraps any content in a div that animates in
478
+ * when the slide becomes visible. Set `index` for staggered sequences.
479
+ *
480
+ * ```mdx
481
+ * <Reveal index={0}>First item</Reveal>
482
+ * <Reveal index={1}>Second item</Reveal>
483
+ * ```
484
+ */
485
+ declare function Reveal({ children, index }: {
486
+ children: ReactNode;
487
+ index?: number;
488
+ }): react_jsx_runtime.JSX.Element;
489
+ /** Full-bleed container that breaks out of padding */
490
+ declare function Bleed({ children }: {
491
+ children: ReactNode;
492
+ }): react_jsx_runtime.JSX.Element;
493
+ /** Flex grow to push content */
494
+ declare function Fill(): react_jsx_runtime.JSX.Element;
495
+ /**
496
+ * Live — renders a React component at natural browser scale inside a slide.
497
+ *
498
+ * The slide canvas (1920×1080) is shrunk via `transform: scale(s)` in
499
+ * SlideStage. `Live` counter-acts that with `zoom: 1/s` (precomputed by
500
+ * SlideStage as `--slide-stage-zoom`) so components render at their
501
+ * natural CSS pixel size regardless of the window size.
502
+ *
503
+ * Size components with explicit CSS dimensions or Tailwind size utilities
504
+ * (e.g. `w-96`, `max-w-lg`). The parent `<Demo>` frame clips overflow and
505
+ * centers the content. Slide typography primitives (Headline, Body, etc.)
506
+ * are isolated via `--slide-type-scale: 0`.
507
+ *
508
+ * ```mdx
509
+ * <Demo aspectRatio="16/9">
510
+ * <Carousel className="max-w-lg">…</Carousel>
511
+ * </Demo>
512
+ * ```
513
+ */
514
+ declare function Live({ children }: {
515
+ children: ReactNode;
516
+ }): react_jsx_runtime.JSX.Element;
517
+ declare namespace Live {
518
+ var displayName: string;
519
+ }
520
+ declare function Demo({ children, aspectRatio, padding, label, }: {
521
+ children: ReactNode;
522
+ /** CSS aspect-ratio — same ergonomics as the `aspectRatio` prop on `<Image>`. Defaults to `"16/9"`. */
523
+ aspectRatio?: string;
524
+ /** Inset padding inside the frame before the component renders. */
525
+ padding?: 'none' | 'sm' | 'md' | 'lg';
526
+ /** Optional figure caption rendered below the frame. */
527
+ label?: string;
528
+ }): react_jsx_runtime.JSX.Element;
529
+ declare namespace Demo {
530
+ var displayName: string;
531
+ }
532
+ /** Custom positioning wrapper */
533
+ declare function Position({ children, top, right, bottom, left, }: {
534
+ children: ReactNode;
535
+ top?: number | string;
536
+ right?: number | string;
537
+ bottom?: number | string;
538
+ left?: number | string;
539
+ }): react_jsx_runtime.JSX.Element;
540
+
541
+ /**
542
+ * Syllabus / handout block for a slide deck.
543
+ *
544
+ * In presentation mode: renders as a hidden DOM container so the slide stage
545
+ * extractors (useSlidesDom, useSyllabus) can clone it into the reading layout.
546
+ *
547
+ * In web-syllabus mode: renders as a visible, styled document section.
548
+ * Write standard MDX headings (## Overview, ## Objectives, etc.) as children —
549
+ * no sub-component wrappers needed. Only <Syllabus.Meta> remains for
550
+ * structured key-value metadata (duration, format, audience, etc.).
551
+ */
552
+ declare function Syllabus({ children }: {
553
+ children: ReactNode;
554
+ }): react_jsx_runtime.JSX.Element;
555
+ declare namespace Syllabus {
556
+ var displayName: string;
557
+ var Meta: {
558
+ ({ duration, audience, format, location, date }: SyllabusMetaProps): react_jsx_runtime.JSX.Element | null;
559
+ displayName: string;
560
+ };
561
+ }
562
+ interface SyllabusMetaProps {
563
+ audience?: string;
564
+ date?: string;
565
+ duration?: string;
566
+ format?: string;
567
+ location?: string;
568
+ }
569
+
570
+ /**
571
+ * Editorial cover slide — massive wrapping title top-left, optional eyebrow
572
+ * (typically a year or date) top-right, optional credit bottom-left.
573
+ * No subtitle, no badges, no image. Designed to feel like a magazine cover.
574
+ *
575
+ * The title uses the same pixel size as `Display lg` (160px) but semibold
576
+ * weight — Display is decorative/light, the cover is authored.
577
+ *
578
+ * A full-width hairline above the title turns the cover into a masthead.
579
+ */
580
+ declare function CoverSlide({ title, subtitle, eyebrow, credit, logo, }: {
581
+ title: string;
582
+ /** Optional deck hook — one line under the main title (editorial cover). */
583
+ subtitle?: string;
584
+ /** Small text anchored to the top-right corner — typically a year or date. */
585
+ eyebrow?: string;
586
+ /** Small text anchored to the bottom-left corner — typically an author credit. */
587
+ credit?: string;
588
+ /** Optional brand mark rendered inline just above the title. */
589
+ logo?: ReactNode;
590
+ }): react_jsx_runtime.JSX.Element | null;
591
+ /** Full-bleed media slide — image/video fills the entire canvas.
592
+ * Optional label+title render in a solid bottom-left block.
593
+ *
594
+ * The overlay uses a hard-edged black block with white type — no blur,
595
+ * no transparency, no rounded corners. Swiss posters don't wash titles
596
+ * over photos; they cut a plate and set them flat. */
597
+ declare function FullBleedSlide({ mediaSrc, mediaAlt, mediaType, label, title, }: {
598
+ mediaSrc: string;
599
+ mediaAlt?: string;
600
+ mediaType?: 'image' | 'video';
601
+ label?: string;
602
+ title?: string;
603
+ }): react_jsx_runtime.JSX.Element | null;
604
+ /**
605
+ * Full-bleed image or video with **cover-style** typography — top masthead band
606
+ * + bottom title plate, both solid black with white type (no blur, no tinted
607
+ * washes). Use for workshop openers, chapter covers, and hero beats where
608
+ * `CoverSlide` (type-only) is too empty but `FullBleedSlide` (small bottom-left
609
+ * caption only) is too little structure.
610
+ *
611
+ * The photo shows in the middle band; keep contrast on the plates only.
612
+ */
613
+ declare function FullBleedCoverSlide({ title, subtitle, eyebrow, credit, mediaSrc, mediaAlt, mediaType, mastheadLabel, }: {
614
+ title: string;
615
+ /** Hook under the main title — muted, like `CoverSlide` subtitle. */
616
+ subtitle?: string;
617
+ /** Small text on the top-right of the masthead band (e.g. year, “Workshop”). */
618
+ eyebrow?: string;
619
+ /** Credit line in the bottom plate, above a hairline — like `CoverSlide`. */
620
+ credit?: string;
621
+ mediaSrc: string;
622
+ mediaAlt?: string;
623
+ mediaType?: 'image' | 'video';
624
+ /** Left label in the top band; defaults to the deck’s cover glyph. */
625
+ mastheadLabel?: string;
626
+ }): react_jsx_runtime.JSX.Element | null;
627
+ /**
628
+ * Editorial quote slide — flush-left pull quote, attribution on its own
629
+ * line under a hairline. Previously centered; now composed on the 12-col
630
+ * grid so the quote sits on the same left edge as every other slide.
631
+ */
632
+ declare function QuoteSlide({ quote, attribution }: {
633
+ quote: string;
634
+ attribution?: string;
635
+ }): react_jsx_runtime.JSX.Element | null;
636
+ type SectionAxis = 'editorial' | 'flush-left' | 'centered';
637
+ /**
638
+ * Section title slide.
639
+ *
640
+ * axis="editorial" (default when `number` is set) — huge margin numeral
641
+ * on the left, headline flush-left in the content area.
642
+ * The Müller-Brockmann section marker treatment.
643
+ * axis="flush-left" — simple flush-left heading, no margin numeral.
644
+ * axis="centered" — legacy axial layout.
645
+ *
646
+ * With `imageSrc` the layout always falls into a text-left / media-right
647
+ * split regardless of axis so the rhythm matches `Split` slides.
648
+ */
649
+ declare function SectionSlide({ number, title, subtitle, imageSrc, imageAlt, axis, }: {
650
+ number?: string;
651
+ title: string;
652
+ subtitle?: string;
653
+ imageSrc?: string;
654
+ imageAlt?: string;
655
+ axis?: SectionAxis;
656
+ }): react_jsx_runtime.JSX.Element | null;
657
+ /**
658
+ * Thesis slide — one headline, optional kicker and subcopy.
659
+ *
660
+ * axis="flush-left" (default) — Swiss editorial: kicker + headline
661
+ * flush to the left, subtitle underneath capped at
662
+ * a readable measure. A hairline rule above the
663
+ * kicker ties the slide into the deck's frame.
664
+ * axis="centered" — legacy axial layout (opt-in only).
665
+ */
666
+ declare function StatementSlide({ kicker, title, subtitle, axis, }: {
667
+ kicker?: string;
668
+ title: string;
669
+ subtitle?: string;
670
+ axis?: 'flush-left' | 'centered';
671
+ }): react_jsx_runtime.JSX.Element | null;
672
+ declare const splitHalfGaps: {
673
+ readonly md: "gap-6";
674
+ readonly lg: "gap-10";
675
+ readonly xl: "gap-16";
676
+ };
677
+ declare function SplitHalfPanel({ children, justify, }: {
678
+ children: ReactNode;
679
+ justify?: 'start' | 'center' | 'end';
680
+ }): react_jsx_runtime.JSX.Element;
681
+ /**
682
+ * Fifty-fifty deck split — vertical (columns) or horizontal (rows).
683
+ * Use two `SplitHalf.Panel` children: narrative vs media, thesis vs proof, etc.
684
+ */
685
+ declare function SplitHalf({ children, axis, gap, label, title, }: {
686
+ children: ReactNode;
687
+ axis?: 'horizontal' | 'vertical';
688
+ gap?: keyof typeof splitHalfGaps;
689
+ label?: string;
690
+ title?: string;
691
+ }): react_jsx_runtime.JSX.Element | null;
692
+ declare namespace SplitHalf {
693
+ var Panel: typeof SplitHalfPanel;
694
+ }
695
+ interface ClosingContact {
696
+ /** Optional URL. When set, the value renders as an anchor — external
697
+ * http(s) links open in a new tab; mailto: and tel: open natively. */
698
+ href?: string;
699
+ label: string;
700
+ value: string;
701
+ }
702
+ /**
703
+ * Editorial closing slide — a deliberate bookend rather than a reversed
704
+ * cover. Title vertically centered so it reads as the final statement,
705
+ * flanked by a giant ▼ glyph acting as a typographic full-stop — part of
706
+ * the deck's primitive-shape vocabulary (▲ cover / ■ section / ◆ quote /
707
+ * ▼ closing). The footer is a tabular colophon — Web / Email / Also —
708
+ * each column labelled and aligned on the 12-col rhythm, so the last
709
+ * page of the deck reads like the colophon of a book.
710
+ */
711
+ declare function ClosingSlide({ title, eyebrow, website, email, handles, }: {
712
+ title: string;
713
+ /** Small text anchored to the top-right corner (e.g. "2026", "Q&A"). */
714
+ eyebrow?: string;
715
+ /** Primary website URL rendered on its own line. */
716
+ website?: string;
717
+ /** Contact email rendered below the website. */
718
+ email?: string;
719
+ /** Supplementary contacts (handles, sites, tools). Each entry takes
720
+ * its own labelled column on the colophon row. Pass an `href` to
721
+ * make the value clickable — `website` and `email` are auto-linked. */
722
+ handles?: ClosingContact[];
723
+ }): react_jsx_runtime.JSX.Element | null;
724
+ declare function HeroBentoHero({ src, alt }: {
725
+ src: string;
726
+ alt?: string;
727
+ }): react_jsx_runtime.JSX.Element;
728
+ declare function HeroBentoCard({ title, body }: {
729
+ title: string;
730
+ body?: ReactNode;
731
+ }): react_jsx_runtime.JSX.Element;
732
+ declare function HeroBento({ children, label, title, }: {
733
+ children: ReactNode;
734
+ label?: string;
735
+ title?: string;
736
+ }): react_jsx_runtime.JSX.Element | null;
737
+ declare namespace HeroBento {
738
+ var Hero: typeof HeroBentoHero;
739
+ var Card: typeof HeroBentoCard;
740
+ }
741
+ declare function MediaTrioHero({ src, alt }: {
742
+ src: string;
743
+ alt?: string;
744
+ }): react_jsx_runtime.JSX.Element;
745
+ declare function MediaTrioMedia({ src, alt }: {
746
+ src: string;
747
+ alt?: string;
748
+ }): react_jsx_runtime.JSX.Element;
749
+ declare function MediaTrio({ children, label, title, }: {
750
+ children: ReactNode;
751
+ label?: string;
752
+ title?: string;
753
+ }): react_jsx_runtime.JSX.Element | null;
754
+ declare namespace MediaTrio {
755
+ var Hero: typeof MediaTrioHero;
756
+ var Media: typeof MediaTrioMedia;
757
+ }
758
+ declare function StatBentoBody({ children }: {
759
+ children: ReactNode;
760
+ }): react_jsx_runtime.JSX.Element;
761
+ declare function StatBentoStat({ value, label }: {
762
+ value: string;
763
+ label: string;
764
+ }): react_jsx_runtime.JSX.Element;
765
+ declare function StatBento({ children, label, title, }: {
766
+ children: ReactNode;
767
+ label?: string;
768
+ title?: string;
769
+ }): react_jsx_runtime.JSX.Element | null;
770
+ declare namespace StatBento {
771
+ var Body: typeof StatBentoBody;
772
+ var Stat: typeof StatBentoStat;
773
+ }
774
+ declare function CollageFeatured({ src, alt }: {
775
+ src: string;
776
+ alt?: string;
777
+ }): react_jsx_runtime.JSX.Element;
778
+ declare function CollageImage({ src, alt }: {
779
+ src: string;
780
+ alt?: string;
781
+ }): react_jsx_runtime.JSX.Element;
782
+ declare function Collage({ children, label, title, }: {
783
+ children: ReactNode;
784
+ label?: string;
785
+ title?: string;
786
+ }): react_jsx_runtime.JSX.Element | null;
787
+ declare namespace Collage {
788
+ var Featured: typeof CollageFeatured;
789
+ var Image: typeof CollageImage;
790
+ }
791
+ declare function QuoteWithMediaQuote({ text, attribution }: {
792
+ text: string;
793
+ attribution?: string;
794
+ }): react_jsx_runtime.JSX.Element;
795
+ declare function QuoteWithMediaMedia({ src, alt }: {
796
+ src: string;
797
+ alt?: string;
798
+ }): react_jsx_runtime.JSX.Element;
799
+ declare function QuoteWithMedia({ children, label, title, }: {
800
+ children: ReactNode;
801
+ label?: string;
802
+ title?: string;
803
+ }): react_jsx_runtime.JSX.Element | null;
804
+ declare namespace QuoteWithMedia {
805
+ var Quote: typeof QuoteWithMediaQuote;
806
+ var Media: typeof QuoteWithMediaMedia;
807
+ }
808
+ declare function SplitWithStatText({ title: cellTitle, body, bullets, }: {
809
+ title: string;
810
+ body?: ReactNode;
811
+ bullets?: string[];
812
+ }): react_jsx_runtime.JSX.Element;
813
+ declare function SplitWithStatMedia({ src, alt }: {
814
+ src: string;
815
+ alt?: string;
816
+ }): react_jsx_runtime.JSX.Element;
817
+ declare function SplitWithStatStat({ value, label }: {
818
+ value: string;
819
+ label: string;
820
+ }): react_jsx_runtime.JSX.Element;
821
+ declare function SplitWithStat({ children, label, title, }: {
822
+ children: ReactNode;
823
+ label?: string;
824
+ title?: string;
825
+ }): react_jsx_runtime.JSX.Element | null;
826
+ declare namespace SplitWithStat {
827
+ var Text: typeof SplitWithStatText;
828
+ var Media: typeof SplitWithStatMedia;
829
+ var Stat: typeof SplitWithStatStat;
830
+ }
831
+ declare function TextLeadText({ title: cellTitle, body, bullets, }: {
832
+ title?: string;
833
+ body?: ReactNode;
834
+ bullets?: string[];
835
+ }): react_jsx_runtime.JSX.Element;
836
+ declare function TextLeadMedia({ src, alt }: {
837
+ src: string;
838
+ alt?: string;
839
+ }): react_jsx_runtime.JSX.Element;
840
+ declare function TextLead({ children, label, title, }: {
841
+ children: ReactNode;
842
+ label?: string;
843
+ title?: string;
844
+ }): react_jsx_runtime.JSX.Element | null;
845
+ declare namespace TextLead {
846
+ var Text: typeof TextLeadText;
847
+ var Media: typeof TextLeadMedia;
848
+ }
849
+ declare function TimelineBentoIntro({ title: cellTitle, body }: {
850
+ title: string;
851
+ body?: ReactNode;
852
+ }): react_jsx_runtime.JSX.Element;
853
+ declare function TimelineBentoStep({ step, title: cellTitle, body, }: {
854
+ step?: string;
855
+ title: string;
856
+ body?: ReactNode;
857
+ }): react_jsx_runtime.JSX.Element;
858
+ declare function TimelineBento({ children, label, title, }: {
859
+ children: ReactNode;
860
+ label?: string;
861
+ title?: string;
862
+ }): react_jsx_runtime.JSX.Element | null;
863
+ declare namespace TimelineBento {
864
+ var Intro: typeof TimelineBentoIntro;
865
+ var Step: typeof TimelineBentoStep;
866
+ }
867
+ declare function FullBleedGalleryImage({ src, alt }: {
868
+ src: string;
869
+ alt?: string;
870
+ }): react_jsx_runtime.JSX.Element;
871
+ declare function FullBleedGallery({ children, label, title, }: {
872
+ children: ReactNode;
873
+ label?: string;
874
+ title?: string;
875
+ }): react_jsx_runtime.JSX.Element | null;
876
+ declare namespace FullBleedGallery {
877
+ var Image: typeof FullBleedGalleryImage;
878
+ }
879
+ /**
880
+ * Single full-bleed image. Use when the visual is the entire message.
881
+ * Optional caption renders as a translucent bottom bar.
882
+ */
883
+ declare function ImageSlide({ src, alt, caption, }: {
884
+ src: string;
885
+ alt?: string;
886
+ /** Short descriptor — renders as a translucent bottom bar. */
887
+ caption?: string;
888
+ }): react_jsx_runtime.JSX.Element | null;
889
+ /**
890
+ * Two images side by side, equal width, full bleed.
891
+ * A hairline gap separates the panels — editorial column rule.
892
+ */
893
+ declare function ImageDuoSlide({ left, right, caption, }: {
894
+ left: {
895
+ src: string;
896
+ alt?: string;
897
+ };
898
+ right: {
899
+ src: string;
900
+ alt?: string;
901
+ };
902
+ /** Short descriptor — renders as a translucent bottom bar spanning both images. */
903
+ caption?: string;
904
+ }): react_jsx_runtime.JSX.Element | null;
905
+ /**
906
+ * Three images in equal columns, full bleed.
907
+ * Accepts 2–3 images; fewer than 3 leaves remaining columns as a muted placeholder.
908
+ */
909
+ declare function ImageTrioSlide({ images, caption, }: {
910
+ images: {
911
+ src: string;
912
+ alt?: string;
913
+ }[];
914
+ /** Short descriptor — renders as a translucent bottom bar spanning all columns. */
915
+ caption?: string;
916
+ }): react_jsx_runtime.JSX.Element | null;
917
+
918
+ declare function SlideBreak(): react_jsx_runtime.JSX.Element;
919
+ declare namespace SlideBreak {
920
+ var displayName: string;
921
+ }
922
+ declare const slideMdxComponents: {
923
+ h1: ({ children }: {
924
+ children?: ReactNode;
925
+ }) => react_jsx_runtime.JSX.Element;
926
+ h2: ({ children }: {
927
+ children?: ReactNode;
928
+ }) => react_jsx_runtime.JSX.Element;
929
+ h3: ({ children }: {
930
+ children?: ReactNode;
931
+ }) => react_jsx_runtime.JSX.Element;
932
+ p: ({ children }: {
933
+ children?: ReactNode;
934
+ }) => react_jsx_runtime.JSX.Element;
935
+ ul: ({ children }: {
936
+ children?: ReactNode;
937
+ }) => react_jsx_runtime.JSX.Element;
938
+ ol: ({ children }: {
939
+ children?: ReactNode;
940
+ }) => react_jsx_runtime.JSX.Element;
941
+ li: ({ children }: {
942
+ children?: ReactNode;
943
+ }) => react_jsx_runtime.JSX.Element;
944
+ strong: ({ children }: {
945
+ children?: ReactNode;
946
+ }) => react_jsx_runtime.JSX.Element;
947
+ code: ({ children }: {
948
+ children?: ReactNode;
949
+ }) => react_jsx_runtime.JSX.Element;
950
+ blockquote: ({ children }: {
951
+ children?: ReactNode;
952
+ }) => react_jsx_runtime.JSX.Element;
953
+ figure: ({ children }: {
954
+ children?: ReactNode;
955
+ }) => react_jsx_runtime.JSX.Element;
956
+ pre: ({ children, ...props }: React.HTMLAttributes<HTMLPreElement> & {
957
+ "data-language"?: string;
958
+ "data-theme"?: string;
959
+ }) => react_jsx_runtime.JSX.Element;
960
+ hr: typeof SlideBreak;
961
+ TalkTrack: typeof TalkTrack;
962
+ Syllabus: typeof Syllabus;
963
+ Slide: typeof Slide;
964
+ SlideImage: typeof SlideImage;
965
+ SlideVideo: typeof SlideVideo;
966
+ SlideGrid: typeof SlideGrid;
967
+ Overline: typeof Overline;
968
+ Caption: typeof Caption;
969
+ LegacyDivider: typeof Divider$1;
970
+ SlideNumber: typeof SlideNumber;
971
+ Section: typeof Section;
972
+ Columns: typeof Columns;
973
+ Grid: typeof Grid;
974
+ Cell: typeof Cell;
975
+ Split: typeof Split;
976
+ Trio: typeof Trio;
977
+ Stack: typeof Stack;
978
+ Row: typeof Row;
979
+ Center: typeof Center;
980
+ Spacer: typeof Spacer;
981
+ Display: typeof Display;
982
+ Headline: typeof Headline;
983
+ Title: typeof Title;
984
+ Subtitle: typeof Subtitle;
985
+ Body: typeof Body;
986
+ Label: typeof Label;
987
+ Accent: typeof Accent;
988
+ Mono: typeof Mono;
989
+ InlineCode: typeof InlineCode;
990
+ Quote: typeof Quote;
991
+ SlideCodeBlock: typeof SlideCodeBlock;
992
+ Image: typeof Image;
993
+ Video: typeof Video;
994
+ Icon: typeof Icon;
995
+ Avatar: typeof Avatar;
996
+ Box: typeof Box;
997
+ Divider: typeof Divider;
998
+ Badge: typeof Badge;
999
+ Highlight: typeof Highlight;
1000
+ ColorBlock: typeof ColorBlock;
1001
+ FigureMark: typeof FigureMark;
1002
+ SectionMarker: typeof SectionMarker;
1003
+ List: typeof List;
1004
+ Item: typeof Item;
1005
+ Bleed: typeof Bleed;
1006
+ Fill: typeof Fill;
1007
+ Demo: typeof Demo;
1008
+ Live: typeof Live;
1009
+ Position: typeof Position;
1010
+ Reveal: typeof Reveal;
1011
+ CoverSlide: typeof CoverSlide;
1012
+ FullBleedCoverSlide: typeof FullBleedCoverSlide;
1013
+ QuoteSlide: typeof QuoteSlide;
1014
+ SectionSlide: typeof SectionSlide;
1015
+ StatementSlide: typeof StatementSlide;
1016
+ SplitHalf: typeof SplitHalf;
1017
+ ClosingSlide: typeof ClosingSlide;
1018
+ HeroBento: typeof HeroBento;
1019
+ MediaTrio: typeof MediaTrio;
1020
+ StatBento: typeof StatBento;
1021
+ Collage: typeof Collage;
1022
+ FullBleedGallery: typeof FullBleedGallery;
1023
+ QuoteWithMedia: typeof QuoteWithMedia;
1024
+ SplitWithStat: typeof SplitWithStat;
1025
+ TextLead: typeof TextLead;
1026
+ TimelineBento: typeof TimelineBento;
1027
+ h4: ({ className, ...props }: react.ComponentProps<"h4">) => react_jsx_runtime.JSX.Element;
1028
+ h5: ({ className, ...props }: react.ComponentProps<"h5">) => react_jsx_runtime.JSX.Element;
1029
+ h6: ({ className, ...props }: react.ComponentProps<"h6">) => react_jsx_runtime.JSX.Element;
1030
+ a: ({ className, href, target, rel, children, ...props }: react.ComponentProps<"a">) => react_jsx_runtime.JSX.Element;
1031
+ em: ({ className, ...props }: react.ComponentProps<"em">) => react_jsx_runtime.JSX.Element;
1032
+ del: ({ className, ...props }: react.ComponentProps<"del">) => react_jsx_runtime.JSX.Element;
1033
+ ins: ({ className, ...props }: react.ComponentProps<"ins">) => react_jsx_runtime.JSX.Element;
1034
+ kbd: ({ className, ...props }: react.ComponentProps<"kbd">) => react_jsx_runtime.JSX.Element;
1035
+ mark: ({ className, ...props }: react.ComponentProps<"mark">) => react_jsx_runtime.JSX.Element;
1036
+ sub: ({ className, ...props }: react.ComponentProps<"sub">) => react_jsx_runtime.JSX.Element;
1037
+ sup: ({ className, ...props }: react.ComponentProps<"sup">) => react_jsx_runtime.JSX.Element;
1038
+ abbr: ({ className, ...props }: react.ComponentProps<"abbr">) => react_jsx_runtime.JSX.Element;
1039
+ cite: ({ className, ...props }: react.ComponentProps<"cite">) => react_jsx_runtime.JSX.Element;
1040
+ dfn: ({ className, ...props }: react.ComponentProps<"dfn">) => react_jsx_runtime.JSX.Element;
1041
+ time: ({ className, ...props }: react.ComponentProps<"time">) => react_jsx_runtime.JSX.Element;
1042
+ var: ({ className, ...props }: react.ComponentProps<"var">) => react_jsx_runtime.JSX.Element;
1043
+ samp: ({ className, ...props }: react.ComponentProps<"samp">) => react_jsx_runtime.JSX.Element;
1044
+ output: ({ className, ...props }: react.ComponentProps<"output">) => react_jsx_runtime.JSX.Element;
1045
+ details: ({ className, ...props }: react.ComponentProps<"details">) => react_jsx_runtime.JSX.Element;
1046
+ summary: ({ className, ...props }: react.ComponentProps<"summary">) => react_jsx_runtime.JSX.Element;
1047
+ iframe: ({ className, ...props }: react.ComponentProps<"iframe">) => react_jsx_runtime.JSX.Element;
1048
+ video: ({ className, ...props }: react.ComponentProps<"video">) => react_jsx_runtime.JSX.Element;
1049
+ audio: ({ className, ...props }: react.ComponentProps<"audio">) => react_jsx_runtime.JSX.Element;
1050
+ img: ({ className, alt, ...props }: react.ComponentProps<"img">) => react_jsx_runtime.JSX.Element;
1051
+ table: ({ className, ...props }: react.ComponentProps<"table">) => react_jsx_runtime.JSX.Element;
1052
+ thead: ({ className, ...props }: react.ComponentProps<"thead">) => react_jsx_runtime.JSX.Element;
1053
+ tbody: ({ className, ...props }: react.ComponentProps<"tbody">) => react_jsx_runtime.JSX.Element;
1054
+ tr: ({ className, ...props }: react.ComponentProps<"tr">) => react_jsx_runtime.JSX.Element;
1055
+ th: ({ className, ...props }: react.ComponentProps<"th">) => react_jsx_runtime.JSX.Element;
1056
+ td: ({ className, ...props }: react.ComponentProps<"td">) => react_jsx_runtime.JSX.Element;
1057
+ caption: ({ className, ...props }: react.ComponentProps<"caption">) => react_jsx_runtime.JSX.Element;
1058
+ };
1059
+
1060
+ declare function SyllabusBody({ children }: {
1061
+ children?: ReactNode;
1062
+ }): react_jsx_runtime.JSX.Element;
1063
+ declare function SyllabusHeadline({ children }: {
1064
+ children?: ReactNode;
1065
+ }): react_jsx_runtime.JSX.Element;
1066
+ declare function SyllabusTitle({ children }: {
1067
+ children?: ReactNode;
1068
+ }): react_jsx_runtime.JSX.Element;
1069
+ declare function SyllabusSubtitle({ children }: {
1070
+ children?: ReactNode;
1071
+ }): react_jsx_runtime.JSX.Element;
1072
+ declare function SyllabusDisplay({ children }: {
1073
+ children?: ReactNode;
1074
+ }): react_jsx_runtime.JSX.Element;
1075
+ declare function SyllabusLabel({ children }: {
1076
+ children?: ReactNode;
1077
+ }): react_jsx_runtime.JSX.Element;
1078
+ declare function SyllabusMono({ children }: {
1079
+ children?: ReactNode;
1080
+ }): react_jsx_runtime.JSX.Element;
1081
+ declare function SyllabusAccent({ children }: {
1082
+ children?: ReactNode;
1083
+ }): react_jsx_runtime.JSX.Element;
1084
+ interface SyllabusQuoteProps {
1085
+ attribution?: string;
1086
+ children?: ReactNode;
1087
+ decorated?: boolean;
1088
+ size?: 'lg' | 'sm';
1089
+ }
1090
+ declare function SyllabusQuote({ children, attribution }: SyllabusQuoteProps): react_jsx_runtime.JSX.Element;
1091
+ declare const listGap: {
1092
+ readonly sm: "space-y-1";
1093
+ readonly md: "space-y-1.5";
1094
+ readonly lg: "space-y-2";
1095
+ };
1096
+ declare function SyllabusList({ children, marker, gap, }: {
1097
+ children?: ReactNode;
1098
+ gap?: keyof typeof listGap;
1099
+ marker?: 'bullet' | 'dash' | 'none' | 'number';
1100
+ }): react_jsx_runtime.JSX.Element;
1101
+ declare function SyllabusItem({ children }: {
1102
+ children?: ReactNode;
1103
+ }): react_jsx_runtime.JSX.Element;
1104
+ declare const syllabusMdxComponents: {
1105
+ h1: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1106
+ h2: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1107
+ h3: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1108
+ h4: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1109
+ h5: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1110
+ h6: (props: HTMLAttributes<HTMLHeadingElement>) => react_jsx_runtime.JSX.Element;
1111
+ p: (props: HTMLAttributes<HTMLParagraphElement>) => react_jsx_runtime.JSX.Element;
1112
+ ul: (props: HTMLAttributes<HTMLUListElement>) => react_jsx_runtime.JSX.Element;
1113
+ ol: (props: HTMLAttributes<HTMLOListElement>) => react_jsx_runtime.JSX.Element;
1114
+ li: (props: HTMLAttributes<HTMLLIElement>) => react_jsx_runtime.JSX.Element;
1115
+ blockquote: (props: HTMLAttributes<HTMLElement>) => react_jsx_runtime.JSX.Element;
1116
+ img: ({ alt, className, ...props }: ImgHTMLAttributes<HTMLImageElement>) => react_jsx_runtime.JSX.Element;
1117
+ Body: typeof SyllabusBody;
1118
+ Headline: typeof SyllabusHeadline;
1119
+ Title: typeof SyllabusTitle;
1120
+ Subtitle: typeof SyllabusSubtitle;
1121
+ Display: typeof SyllabusDisplay;
1122
+ Label: typeof SyllabusLabel;
1123
+ Mono: typeof SyllabusMono;
1124
+ Accent: typeof SyllabusAccent;
1125
+ Quote: typeof SyllabusQuote;
1126
+ List: typeof SyllabusList;
1127
+ Item: typeof SyllabusItem;
1128
+ a: ({ className, href, target, rel, children, ...props }: react.ComponentProps<"a">) => react_jsx_runtime.JSX.Element;
1129
+ strong: ({ className, ...props }: react.ComponentProps<"strong">) => react_jsx_runtime.JSX.Element;
1130
+ em: ({ className, ...props }: react.ComponentProps<"em">) => react_jsx_runtime.JSX.Element;
1131
+ del: ({ className, ...props }: react.ComponentProps<"del">) => react_jsx_runtime.JSX.Element;
1132
+ ins: ({ className, ...props }: react.ComponentProps<"ins">) => react_jsx_runtime.JSX.Element;
1133
+ code: ({ className, ...props }: react.ComponentProps<"code">) => react_jsx_runtime.JSX.Element;
1134
+ kbd: ({ className, ...props }: react.ComponentProps<"kbd">) => react_jsx_runtime.JSX.Element;
1135
+ mark: ({ className, ...props }: react.ComponentProps<"mark">) => react_jsx_runtime.JSX.Element;
1136
+ sub: ({ className, ...props }: react.ComponentProps<"sub">) => react_jsx_runtime.JSX.Element;
1137
+ sup: ({ className, ...props }: react.ComponentProps<"sup">) => react_jsx_runtime.JSX.Element;
1138
+ abbr: ({ className, ...props }: react.ComponentProps<"abbr">) => react_jsx_runtime.JSX.Element;
1139
+ cite: ({ className, ...props }: react.ComponentProps<"cite">) => react_jsx_runtime.JSX.Element;
1140
+ dfn: ({ className, ...props }: react.ComponentProps<"dfn">) => react_jsx_runtime.JSX.Element;
1141
+ time: ({ className, ...props }: react.ComponentProps<"time">) => react_jsx_runtime.JSX.Element;
1142
+ var: ({ className, ...props }: react.ComponentProps<"var">) => react_jsx_runtime.JSX.Element;
1143
+ samp: ({ className, ...props }: react.ComponentProps<"samp">) => react_jsx_runtime.JSX.Element;
1144
+ output: ({ className, ...props }: react.ComponentProps<"output">) => react_jsx_runtime.JSX.Element;
1145
+ details: ({ className, ...props }: react.ComponentProps<"details">) => react_jsx_runtime.JSX.Element;
1146
+ summary: ({ className, ...props }: react.ComponentProps<"summary">) => react_jsx_runtime.JSX.Element;
1147
+ iframe: ({ className, ...props }: react.ComponentProps<"iframe">) => react_jsx_runtime.JSX.Element;
1148
+ video: ({ className, ...props }: react.ComponentProps<"video">) => react_jsx_runtime.JSX.Element;
1149
+ audio: ({ className, ...props }: react.ComponentProps<"audio">) => react_jsx_runtime.JSX.Element;
1150
+ pre: ({ className, children, ...props }: react.ComponentProps<"pre">) => react_jsx_runtime.JSX.Element;
1151
+ hr: ({ className, ...props }: react.ComponentProps<"hr">) => react_jsx_runtime.JSX.Element;
1152
+ table: ({ className, ...props }: react.ComponentProps<"table">) => react_jsx_runtime.JSX.Element;
1153
+ thead: ({ className, ...props }: react.ComponentProps<"thead">) => react_jsx_runtime.JSX.Element;
1154
+ tbody: ({ className, ...props }: react.ComponentProps<"tbody">) => react_jsx_runtime.JSX.Element;
1155
+ tr: ({ className, ...props }: react.ComponentProps<"tr">) => react_jsx_runtime.JSX.Element;
1156
+ th: ({ className, ...props }: react.ComponentProps<"th">) => react_jsx_runtime.JSX.Element;
1157
+ td: ({ className, ...props }: react.ComponentProps<"td">) => react_jsx_runtime.JSX.Element;
1158
+ caption: ({ className, ...props }: react.ComponentProps<"caption">) => react_jsx_runtime.JSX.Element;
1159
+ };
1160
+
1161
+ interface SlidesPlayerProps {
1162
+ deck: SlideDeckItem;
1163
+ initialSlide?: number;
1164
+ onBack: () => void;
1165
+ onSlideChange?: (index: number) => void;
1166
+ /** When provided, the toolbar shows a "</> MDX" toggle that calls this. */
1167
+ onToggleSource?: () => void;
1168
+ isSourceOpen?: boolean;
1169
+ gateProvider?: SlideGateProvider;
1170
+ renderCodeGate?: (props: {
1171
+ backLabel: string;
1172
+ onBack: () => void;
1173
+ onUnlock: () => void;
1174
+ subtitle: string;
1175
+ title: string;
1176
+ verifyCode: (code: string) => Promise<boolean>;
1177
+ }) => React.ReactNode;
1178
+ }
1179
+
1180
+ /**
1181
+ * Host-agnostic presentation player. Receives a fully-loaded deck and renders
1182
+ * the full presentation UI (stage, sidebar, toolbar, keyboard nav).
1183
+ *
1184
+ * The host is responsible for: page meta, content loading, gate persistence,
1185
+ * and routing. This component only handles presentation orchestration.
1186
+ */
1187
+ declare function SlidesPlayer({ deck, initialSlide, onBack, onSlideChange, onToggleSource, isSourceOpen, gateProvider, renderCodeGate, }: SlidesPlayerProps): react_jsx_runtime.JSX.Element;
1188
+
1189
+ /**
1190
+ * Slide Configurator Store
1191
+ *
1192
+ * Global visual density config for the slides app. Phase 1 exposes a
1193
+ * single `padding` setting that drives the default `Cell` padding and
1194
+ * `Grid` gap. Phase 2 will extend this with color/typography fields.
1195
+ *
1196
+ * Persisted to localStorage so the selected padding survives reloads.
1197
+ */
1198
+ type SlideConfigPadding = 'sm' | 'md' | 'lg';
1199
+ /**
1200
+ * Slide-only type multiplier. Applied as a CSS variable
1201
+ * (`--slide-type-scale`) on the slide content root; every slide
1202
+ * primitive wraps its canvas-px sizes in `calc(Npx * var(--slide-type-scale, 1))`
1203
+ * so nudging this knob scales every piece of slide text in lockstep.
1204
+ *
1205
+ * Deliberately isolated from the site-wide `--typography-scale`: the
1206
+ * slide artboard is sovereign, tuned to exact px ratios, and should
1207
+ * not follow global UI density changes.
1208
+ */
1209
+ type SlideConfigTypographyScale = 'sm' | 'md' | 'lg' | 'xl';
1210
+ declare const TYPOGRAPHY_SCALE_VALUES: Record<SlideConfigTypographyScale, number>;
1211
+ interface SlideConfigState {
1212
+ padding: SlideConfigPadding;
1213
+ reset: () => void;
1214
+ showInlineTalkTrack: boolean;
1215
+ showPagination: boolean;
1216
+ typographyScale: SlideConfigTypographyScale;
1217
+ updateConfig: (patch: Partial<Omit<SlideConfigState, 'updateConfig' | 'reset'>>) => void;
1218
+ }
1219
+ /**
1220
+ * Content safe-area inset in pixels. Horizontal `px` matches where folio
1221
+ * chrome aligns on the left/right. Vertical `py` is larger than
1222
+ * `SLIDE_FRAME_WATERMARK_PX` so the layout grid sits below/above the thin
1223
+ * watermark band at the slide edges.
1224
+ */
1225
+ declare const FRAME_PADDING_PX: Record<SlideConfigPadding, {
1226
+ px: number;
1227
+ py: number;
1228
+ }>;
1229
+ /**
1230
+ * Folio chrome offset from the slide top/bottom edges. Tighter than
1231
+ * `FRAME_PADDING_PX.py` so labels read as a margin watermark outside the
1232
+ * content grid while sharing the same horizontal gutters as `px`.
1233
+ */
1234
+ declare const SLIDE_FRAME_WATERMARK_PX: Record<SlideConfigPadding, {
1235
+ pb: number;
1236
+ pt: number;
1237
+ }>;
1238
+ /**
1239
+ * Grid gap in pixels for each config padding level. Matches Tailwind's
1240
+ * `gap-4` / `gap-6` / `gap-10` utilities which the `Grid` primitive uses via
1241
+ * its `gapClasses` map, so the grid overlay renders the same gutters as the
1242
+ * real slide layout.
1243
+ */
1244
+ declare const CONFIG_GAP_PX: Record<SlideConfigPadding, number>;
1245
+ declare const useSlideConfig: zustand.UseBoundStore<Omit<zustand.StoreApi<SlideConfigState>, "setState" | "persist"> & {
1246
+ setState(partial: SlideConfigState | Partial<SlideConfigState> | ((state: SlideConfigState) => SlideConfigState | Partial<SlideConfigState>), replace?: false | undefined): unknown;
1247
+ setState(state: SlideConfigState | ((state: SlideConfigState) => SlideConfigState), replace: true): unknown;
1248
+ persist: {
1249
+ setOptions: (options: Partial<zustand_middleware.PersistOptions<SlideConfigState, {
1250
+ padding: SlideConfigPadding;
1251
+ showPagination: boolean;
1252
+ showInlineTalkTrack: boolean;
1253
+ typographyScale: SlideConfigTypographyScale;
1254
+ }, unknown>>) => void;
1255
+ clearStorage: () => void;
1256
+ rehydrate: () => Promise<void> | void;
1257
+ hasHydrated: () => boolean;
1258
+ onHydrate: (fn: (state: SlideConfigState) => void) => () => void;
1259
+ onFinishHydration: (fn: (state: SlideConfigState) => void) => () => void;
1260
+ getOptions: () => Partial<zustand_middleware.PersistOptions<SlideConfigState, {
1261
+ padding: SlideConfigPadding;
1262
+ showPagination: boolean;
1263
+ showInlineTalkTrack: boolean;
1264
+ typographyScale: SlideConfigTypographyScale;
1265
+ }, unknown>>;
1266
+ };
1267
+ }>;
1268
+ /**
1269
+ * Replaces per-primitive Zustand subscriptions for `padding` with a single
1270
+ * subscription at the slide content root. Grid and Cell read this context
1271
+ * instead of subscribing independently — N subscriptions become 1.
1272
+ * Default matches the store default so the fallback is always correct.
1273
+ */
1274
+ declare const SlidePaddingContext: react.Context<SlideConfigPadding>;
1275
+ declare const useSlidePadding: () => SlideConfigPadding;
1276
+
1277
+ type SlideRenderMode = 'presentation' | 'web-syllabus';
1278
+ /** Controls how slide components render. Default is presentation mode. */
1279
+ declare const SlideRenderModeContext: react.Context<SlideRenderMode>;
1280
+ declare function useSlideRenderMode(): SlideRenderMode;
1281
+ /** Signals to the syllabus page that a <Syllabus> block was actually rendered. */
1282
+ declare const SyllabusDetectContext: react.Context<(() => void) | null>;
1283
+
1284
+ export { Accent, Avatar, Badge, Bleed, Body, BodyLines, Box, CONFIG_GAP_PX, Cell, Center, ClosingSlide, Collage, ColorBlock, Columns, CoverSlide, Demo, Display, Divider, FRAME_PADDING_PX, FigureMark, Fill, FullBleedCoverSlide, FullBleedGallery, FullBleedSlide, Grid, Headline, HeroBento, Highlight, Icon, Image, ImageDuoSlide, ImageSlide, ImageTrioSlide, InlineCode, Item, Label, List, Live, MediaTrio, Mono, Position, Quote, QuoteSlide, QuoteWithMedia, Reveal, Row, SLIDE_FRAME_WATERMARK_PX, Section, SectionMarker, SectionSlide, SlideCodeBlock, type SlideConfigPadding, type SlideConfigTypographyScale, SlideDeckItem, type SlideGateProvider, SlideLayout, SlidePaddingContext, type SlideRenderMode, SlideRenderModeContext, SlidesPlayer, type SlidesPlayerProps, Spacer, Split, SplitHalf, SplitWithStat, Stack, StatBento, StatementSlide, Subtitle, Syllabus, SyllabusDetectContext, TYPOGRAPHY_SCALE_VALUES, TalkTrack, TextLead, TimelineBento, Title, Trio, Video, slideMdxComponents, syllabusMdxComponents, useSlideConfig, useSlidePadding, useSlideRenderMode };