@hypit/caption-fine 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,854 @@
1
+ import type { ModuleManifest } from "@hypit/hypit/protocol";
2
+ export declare const captionFineModuleRef: {
3
+ readonly name: "@hypit/caption-fine";
4
+ readonly version: "1";
5
+ };
6
+ export declare const captionFineTypes: {
7
+ readonly schedule: {
8
+ readonly module: {
9
+ readonly name: "@hypit/caption-fine";
10
+ readonly version: "1";
11
+ };
12
+ readonly name: "FineCaptionSchedule";
13
+ };
14
+ };
15
+ export declare const captionFineProducers: {
16
+ schedule: {
17
+ module: {
18
+ readonly name: "@hypit/caption-fine";
19
+ readonly version: "1";
20
+ };
21
+ name: string;
22
+ };
23
+ render: {
24
+ module: {
25
+ readonly name: "@hypit/caption-fine";
26
+ readonly version: "1";
27
+ };
28
+ name: string;
29
+ };
30
+ renderWithRegions: {
31
+ module: {
32
+ readonly name: "@hypit/caption-fine";
33
+ readonly version: "1";
34
+ };
35
+ name: string;
36
+ };
37
+ };
38
+ export declare const captionFineMarkupSurfaces: readonly [{
39
+ readonly name: "style";
40
+ readonly tag: "Style";
41
+ readonly mode: "structured";
42
+ readonly outputs: readonly [{
43
+ module: {
44
+ readonly name: "@hypit/caption";
45
+ readonly version: "1";
46
+ };
47
+ name: string;
48
+ }];
49
+ readonly vocabulary: {
50
+ readonly summary: "Resolves one SVS Recipe and one exact font stack into a complete fine-grained Caption Style.";
51
+ readonly attributes: readonly [{
52
+ readonly name: "id";
53
+ readonly kind: "identifier";
54
+ readonly required: true;
55
+ readonly summary: "Names this Style so a Use can select it.";
56
+ }, {
57
+ readonly name: "recipe";
58
+ readonly kind: "reference";
59
+ readonly required: true;
60
+ readonly accepts: readonly [{
61
+ module: {
62
+ readonly name: "@hypit/recipe";
63
+ readonly version: "1";
64
+ };
65
+ name: string;
66
+ }];
67
+ readonly summary: "Chooses the Recipe that carries Cue geometry, Paint and local motion.";
68
+ readonly recipe: readonly [{
69
+ readonly name: "stack-order";
70
+ readonly required: true;
71
+ readonly summary: "Places this Style's Cues in the composition drawing order, low behind high.";
72
+ }, {
73
+ readonly name: "x";
74
+ readonly required: true;
75
+ readonly summary: "Places the Cue box horizontally as a fraction of the selected Frame's width.";
76
+ }, {
77
+ readonly name: "y";
78
+ readonly required: true;
79
+ readonly summary: "Places the Cue box vertically as a fraction of the selected Frame's height.";
80
+ }, {
81
+ readonly name: "width";
82
+ readonly required: true;
83
+ readonly summary: "Sets the Cue box width as a fraction of the selected Frame's width.";
84
+ }, {
85
+ readonly name: "height";
86
+ readonly required: false;
87
+ readonly summary: "Optionally gives the Caption Region a fixed fraction of the selected Frame's height; without it the Region hugs its Cue.";
88
+ }, {
89
+ readonly name: "anchor-x";
90
+ readonly required: false;
91
+ readonly values: readonly ["left", "center", "right"];
92
+ readonly fallback: "left";
93
+ readonly summary: "Decides which horizontal edge of the Cue box sits on the placement point.";
94
+ }, {
95
+ readonly name: "anchor-y";
96
+ readonly required: false;
97
+ readonly values: readonly ["top", "center", "bottom"];
98
+ readonly fallback: "top";
99
+ readonly summary: "Decides which vertical edge of the Cue box sits on the placement point.";
100
+ }, {
101
+ readonly name: "align";
102
+ readonly required: true;
103
+ readonly values: readonly ["left", "center", "right"];
104
+ readonly summary: "Aligns the Words within each line of the Cue.";
105
+ }, {
106
+ readonly name: "block-align";
107
+ readonly required: false;
108
+ readonly values: readonly ["start", "center", "end"];
109
+ readonly fallback: "center";
110
+ readonly summary: "Aligns the Cue vertically inside a fixed-height Caption Region.";
111
+ }, {
112
+ readonly name: "inline-size";
113
+ readonly required: false;
114
+ readonly values: readonly ["hug", "fixed"];
115
+ readonly fallback: "hug";
116
+ readonly summary: "Chooses whether the Cue hugs its text up to the Region width or fills the Region width.";
117
+ }, {
118
+ readonly name: "wrap";
119
+ readonly required: false;
120
+ readonly values: readonly ["word", "grapheme"];
121
+ readonly fallback: "word";
122
+ readonly summary: "Wraps at Word boundaries, falling back for an over-wide Word, or permits a break at any grapheme.";
123
+ }, {
124
+ readonly name: "max-lines";
125
+ readonly required: false;
126
+ readonly summary: "Rejects too many counted rows; requires max-words-per-line. Does not measure browser wrapping or guarantee a single physical line.";
127
+ }, {
128
+ readonly name: "max-words-per-line";
129
+ readonly required: false;
130
+ readonly summary: "Optional counted row breaks between complete alignment units. Counts display Words, normally individual characters in Chinese; preserves Cues. Omit for width-based flow.";
131
+ }, {
132
+ readonly name: "direction";
133
+ readonly required: false;
134
+ readonly values: readonly ["ltr", "rtl"];
135
+ readonly fallback: "ltr";
136
+ readonly summary: "Sets the writing direction the Words are laid out in.";
137
+ }, {
138
+ readonly name: "line-height";
139
+ readonly required: true;
140
+ readonly summary: "Sets the line box height as a multiple of the type size.";
141
+ }, {
142
+ readonly name: "letter-spacing";
143
+ readonly required: false;
144
+ readonly fallback: "0";
145
+ readonly summary: "Adds pixels of tracking between glyphs.";
146
+ }, {
147
+ readonly name: "word-gap";
148
+ readonly required: false;
149
+ readonly fallback: "a quarter of size";
150
+ readonly summary: "Sets the pixel width of authored display separators. Writing-system and numeric boundaries do not create spaces; use letter-spacing for glyph tracking.";
151
+ }, {
152
+ readonly name: "size";
153
+ readonly required: true;
154
+ readonly summary: "Sets the type size in pixels.";
155
+ }, {
156
+ readonly name: "kerning";
157
+ readonly required: false;
158
+ readonly values: readonly ["auto", "normal", "none"];
159
+ readonly fallback: "auto";
160
+ readonly summary: "Controls font kerning for the complete uniform Cue flow.";
161
+ }, {
162
+ readonly name: "caps";
163
+ readonly required: false;
164
+ readonly values: readonly ["normal", "small-caps", "all-small-caps"];
165
+ readonly fallback: "normal";
166
+ readonly summary: "Chooses the OpenType caps presentation for every Word.";
167
+ }, {
168
+ readonly name: "text-transform";
169
+ readonly required: false;
170
+ readonly values: readonly ["none", "uppercase", "lowercase", "capitalize"];
171
+ readonly fallback: "none";
172
+ readonly summary: "Recases every display Word before it is drawn.";
173
+ }, {
174
+ readonly name: "fill";
175
+ readonly required: true;
176
+ readonly summary: "Paints the glyph body of an ordinary Word, as an RGB or RGBA hex color.";
177
+ }, {
178
+ readonly name: "opacity";
179
+ readonly required: false;
180
+ readonly fallback: "1";
181
+ readonly summary: "Fades the whole glyph Paint of an ordinary Word.";
182
+ }, {
183
+ readonly name: "gradient-from";
184
+ readonly required: false;
185
+ readonly summary: "Starts a glyph gradient that replaces the flat fill, and must be written together with gradient-to.";
186
+ }, {
187
+ readonly name: "gradient-to";
188
+ readonly required: false;
189
+ readonly summary: "Ends the glyph gradient, and must be written together with gradient-from.";
190
+ }, {
191
+ readonly name: "gradient-angle";
192
+ readonly required: false;
193
+ readonly fallback: "90";
194
+ readonly summary: "Turns the glyph gradient by this many degrees.";
195
+ }, {
196
+ readonly name: "stroke-color";
197
+ readonly required: false;
198
+ readonly fallback: "#000000";
199
+ readonly summary: "Paints the outline drawn around each glyph.";
200
+ }, {
201
+ readonly name: "stroke-width";
202
+ readonly required: false;
203
+ readonly fallback: "0";
204
+ readonly summary: "Sets the glyph outline thickness in pixels, and the number that matters is its share of `size`: about a twentieth. At a `size` of 46 that is 2px, at 54 it is 3px. Write it from `size` every time rather than picking a pixel count, because the whole width shows — the outline is placed outside the letter, so it keeps the letterform but grows into the space around it twice as fast as a centred one would. Past about a tenth of `size` neighbouring letters meet, the counters fill in, and the caption reads as a slab rather than as words.";
205
+ }, {
206
+ readonly name: "shadow-color";
207
+ readonly required: false;
208
+ readonly fallback: "#000000";
209
+ readonly summary: "Paints the soft drop shadow behind each glyph.";
210
+ }, {
211
+ readonly name: "shadow-opacity";
212
+ readonly required: false;
213
+ readonly fallback: "0";
214
+ readonly summary: "Sets how strongly the glyph drop shadow reads.";
215
+ }, {
216
+ readonly name: "shadow-x";
217
+ readonly required: false;
218
+ readonly fallback: "0";
219
+ readonly summary: "Slides the whole shadow sideways, so its ink lands at this plus `shadow-spread` plus about one and a half times `shadow-blur` from the letter. A shadow that reads as depth rather than as a second copy of the word stays under its own blur: around a fortieth of `size`, 1px at 46.";
220
+ }, {
221
+ readonly name: "shadow-y";
222
+ readonly required: false;
223
+ readonly fallback: "0";
224
+ readonly summary: "Drops the whole shadow, positive downward, reaching this plus `shadow-spread` plus about one and a half times `shadow-blur`. Down is the direction that runs out of room: the gap between line boxes is `line-height` minus one, times `size`, and past it the shadow lands on the line below. Around a fortieth of `size`, 1px at 46.";
225
+ }, {
226
+ readonly name: "shadow-blur";
227
+ readonly required: false;
228
+ readonly fallback: "0";
229
+ readonly summary: "Softens the glyph drop shadow by this many pixels. A shadow that only has to lift the caption off the picture is soft and short — a blur near a tenth of `size` with an offset a fraction of that. Much more and the shadow stops being an edge and becomes a grey cloud the letters sit in, which costs the contrast the shadow was there to protect.";
230
+ }, {
231
+ readonly name: "shadow-spread";
232
+ readonly required: false;
233
+ readonly fallback: "0";
234
+ readonly summary: "Grows the shadow's silhouette before it is blurred, on every side. The shadow then reaches this plus the offset plus about one and a half times `shadow-blur`, so it is the smallest of the three: around a fiftieth of `size`, 1px at 46. Zero and below dilate nothing; the filter grows the shape and has no way to shrink it.";
235
+ }, {
236
+ readonly name: "long-shadow-color";
237
+ readonly required: false;
238
+ readonly fallback: "#000000";
239
+ readonly summary: "Paints the solid extruded shadow trailing each glyph.";
240
+ }, {
241
+ readonly name: "long-shadow-opacity";
242
+ readonly required: false;
243
+ readonly fallback: "0";
244
+ readonly summary: "Sets how strongly the extruded glyph shadow reads.";
245
+ }, {
246
+ readonly name: "long-shadow-distance";
247
+ readonly required: false;
248
+ readonly fallback: "0";
249
+ readonly summary: "Sets how far the extruded glyph shadow travels in pixels. It is a deliberate graphic effect rather than separation from the picture, so it is chosen on purpose or left at zero. When used, a travel of a tenth to a fifth of `size` reads as depth; beyond that the extrusion reaches the line below and the block stops being readable as lines of text.";
250
+ }, {
251
+ readonly name: "long-shadow-angle";
252
+ readonly required: false;
253
+ readonly fallback: "45";
254
+ readonly summary: "Sets the direction the extruded glyph shadow travels in degrees.";
255
+ }, {
256
+ readonly name: "glow-color";
257
+ readonly required: false;
258
+ readonly fallback: "#FFFFFF";
259
+ readonly summary: "Paints the halo bloomed around each glyph.";
260
+ }, {
261
+ readonly name: "glow-opacity";
262
+ readonly required: false;
263
+ readonly fallback: "0";
264
+ readonly summary: "Sets how strongly the glyph halo reads.";
265
+ }, {
266
+ readonly name: "glow-blur";
267
+ readonly required: false;
268
+ readonly fallback: "0";
269
+ readonly summary: "Spreads the glyph halo by this many pixels. A halo reads as a halo while it stays close to the glyph — near a tenth of `size`. Spread wide it stops tracing the letters, fills the space between them and washes the caption into a bright smear; the gaps between letters go first, exactly as they do under a heavy outline.";
270
+ }, {
271
+ readonly name: "glow-spread";
272
+ readonly required: false;
273
+ readonly fallback: "0";
274
+ readonly summary: "Grows the letterform before the halo is blurred, hard-edged, on every side. It adds to the blur rather than replacing it — the halo reaches this plus about one and a half times `glow-blur` — so it is the smaller number of the two: around a fiftieth of `size`, 1px at 46. At a fifth of `size` the dilated letters touch before any softening and the counters close.";
275
+ }, {
276
+ readonly name: "active-fill";
277
+ readonly required: false;
278
+ readonly fallback: "#FFD54A";
279
+ readonly summary: "Paints the glyph body of the Word being spoken.";
280
+ }, {
281
+ readonly name: "active-opacity";
282
+ readonly required: false;
283
+ readonly fallback: "opacity";
284
+ readonly summary: "Fades the whole glyph Paint of the Word being spoken.";
285
+ }, {
286
+ readonly name: "active-gradient-from";
287
+ readonly required: false;
288
+ readonly summary: "Starts the active glyph gradient, and must be written together with active-gradient-to.";
289
+ }, {
290
+ readonly name: "active-gradient-to";
291
+ readonly required: false;
292
+ readonly summary: "Ends the active glyph gradient, and must be written together with active-gradient-from.";
293
+ }, {
294
+ readonly name: "active-gradient-angle";
295
+ readonly required: false;
296
+ readonly fallback: "gradient-angle";
297
+ readonly summary: "Turns the active glyph gradient by this many degrees.";
298
+ }, {
299
+ readonly name: "active-stroke-color";
300
+ readonly required: false;
301
+ readonly fallback: "stroke-color";
302
+ readonly summary: "Paints the outline around the Word being spoken.";
303
+ }, {
304
+ readonly name: "active-stroke-width";
305
+ readonly required: false;
306
+ readonly fallback: "stroke-width";
307
+ readonly summary: "Sets the active glyph outline thickness in pixels. It inherits `stroke-width`, and the same share of `size` holds: emphasis on the spoken Word is carried by its Paint, so thickening its outline past the rest buys little and closes the gaps between its letters first.";
308
+ }, {
309
+ readonly name: "active-shadow-color";
310
+ readonly required: false;
311
+ readonly fallback: "shadow-color";
312
+ readonly summary: "Paints the drop shadow behind the Word being spoken.";
313
+ }, {
314
+ readonly name: "active-shadow-opacity";
315
+ readonly required: false;
316
+ readonly fallback: "shadow-opacity";
317
+ readonly summary: "Sets how strongly the active drop shadow reads.";
318
+ }, {
319
+ readonly name: "active-shadow-x";
320
+ readonly required: false;
321
+ readonly fallback: "shadow-x";
322
+ readonly summary: "Slides the spoken Word's shadow sideways. It inherits `shadow-x`, and the visible quantity is the difference: the shadow jumps by it as the Word becomes active and jumps back as it stops, which reads as the light moving mid-line.";
323
+ }, {
324
+ readonly name: "active-shadow-y";
325
+ readonly required: false;
326
+ readonly fallback: "shadow-y";
327
+ readonly summary: "Drops the spoken Word's shadow, positive downward. It inherits `shadow-y`, and the visible quantity is the difference: the shadow steps down as the Word becomes active and back up as it stops, which reads as the Word lifting off the line.";
328
+ }, {
329
+ readonly name: "active-shadow-blur";
330
+ readonly required: false;
331
+ readonly fallback: "shadow-blur";
332
+ readonly summary: "Softens the spoken Word's drop shadow, reaching about one and a half times this number. It inherits `shadow-blur`, and the visible quantity is the difference: any gap between the two reads as the Word sitting at a different depth from the words beside it.";
333
+ }, {
334
+ readonly name: "active-shadow-spread";
335
+ readonly required: false;
336
+ readonly fallback: "shadow-spread";
337
+ readonly summary: "Grows the spoken Word's shadow silhouette before blur. It inherits `shadow-spread`, and the visible quantity is the difference. Zero and below dilate nothing; the filter grows the shape and has no way to shrink it.";
338
+ }, {
339
+ readonly name: "active-long-shadow-color";
340
+ readonly required: false;
341
+ readonly fallback: "long-shadow-color";
342
+ readonly summary: "Paints the extruded shadow trailing the Word being spoken.";
343
+ }, {
344
+ readonly name: "active-long-shadow-opacity";
345
+ readonly required: false;
346
+ readonly fallback: "long-shadow-opacity";
347
+ readonly summary: "Sets how strongly the active extruded shadow reads.";
348
+ }, {
349
+ readonly name: "active-long-shadow-distance";
350
+ readonly required: false;
351
+ readonly fallback: "long-shadow-distance";
352
+ readonly summary: "Sets how far the active extruded shadow travels in pixels.";
353
+ }, {
354
+ readonly name: "active-long-shadow-angle";
355
+ readonly required: false;
356
+ readonly fallback: "long-shadow-angle";
357
+ readonly summary: "Sets the direction the active extruded shadow travels in degrees.";
358
+ }, {
359
+ readonly name: "active-glow-color";
360
+ readonly required: false;
361
+ readonly fallback: "glow-color";
362
+ readonly summary: "Paints the halo bloomed around the Word being spoken.";
363
+ }, {
364
+ readonly name: "active-glow-opacity";
365
+ readonly required: false;
366
+ readonly fallback: "glow-opacity";
367
+ readonly summary: "Sets how strongly the active halo reads.";
368
+ }, {
369
+ readonly name: "active-glow-blur";
370
+ readonly required: false;
371
+ readonly fallback: "glow-blur";
372
+ readonly summary: "Spreads the active halo by this many pixels. Widening it is the usual way of trying to make the spoken Word stand out, and the usual way of losing it: the halo leaves the glyph, fills the gaps to its neighbours and blurs the very Word it was meant to pick out. The Word is already picked out by its own Paint — leave this near `glow-blur`.";
373
+ }, {
374
+ readonly name: "active-glow-spread";
375
+ readonly required: false;
376
+ readonly fallback: "glow-spread";
377
+ readonly summary: "Grows the spoken Word's letterform before its halo is blurred. It inherits `glow-spread`, and the visible quantity is the difference: the Word's halo is thicker than its neighbours' by exactly that, and the gap it closes first is `word-gap`.";
378
+ }, {
379
+ readonly name: "background";
380
+ readonly required: true;
381
+ readonly summary: "Paints the Cue box behind the Words, as an RGB or RGBA hex color.";
382
+ }, {
383
+ readonly name: "border-color";
384
+ readonly required: false;
385
+ readonly fallback: "#00000000";
386
+ readonly summary: "Paints the Cue box border.";
387
+ }, {
388
+ readonly name: "border-width";
389
+ readonly required: false;
390
+ readonly fallback: "0";
391
+ readonly summary: "Sets the Cue box border thickness in pixels.";
392
+ }, {
393
+ readonly name: "padding";
394
+ readonly required: true;
395
+ readonly summary: "Insets the Words from the Cue box edge, as one pixel number or a vertical and horizontal pair.";
396
+ }, {
397
+ readonly name: "radius";
398
+ readonly required: true;
399
+ readonly summary: "Rounds the Cue box corners by this many pixels.";
400
+ }, {
401
+ readonly name: "cue-shadow-color";
402
+ readonly required: false;
403
+ readonly fallback: "#000000";
404
+ readonly summary: "Paints the shadow cast by the Cue box rather than by its glyphs.";
405
+ }, {
406
+ readonly name: "cue-shadow-opacity";
407
+ readonly required: false;
408
+ readonly fallback: "0";
409
+ readonly summary: "Sets the Cue box shadow opacity.";
410
+ }, {
411
+ readonly name: "cue-shadow-x";
412
+ readonly required: false;
413
+ readonly fallback: "0";
414
+ readonly summary: "Slides the whole Cue box shadow sideways, so it clears the box on one side by this plus spread plus blur and is hidden behind it on the other. Kept under the blur it reads as depth; past it the shadow becomes a band beside the box.";
415
+ }, {
416
+ readonly name: "cue-shadow-y";
417
+ readonly required: false;
418
+ readonly fallback: "0";
419
+ readonly summary: "Drops the whole Cue box shadow, positive downward. Kept under `cue-shadow-blur` it reads as the box lifting off the picture; past it the shadow's top edge clears the box and shows as a bare band under it.";
420
+ }, {
421
+ readonly name: "cue-shadow-blur";
422
+ readonly required: false;
423
+ readonly fallback: "0";
424
+ readonly summary: "Softens the Cue box shadow, reaching about this far past the box and no further. This is the one place the two shadow families differ: a glyph `shadow-blur` is halved into a deviation and reaches half again as far, while this number is the reach. Around a tenth of `size`, 5px at 46.";
425
+ }, {
426
+ readonly name: "cue-shadow-spread";
427
+ readonly required: false;
428
+ readonly fallback: "0";
429
+ readonly summary: "Grows the shadow rectangle before it is blurred, and unlike the glyph shadow it does contract: a negative spread equal to the blur pulls the shadow entirely behind the box. The edge sits at this plus `cue-shadow-blur` past every side, before any offset.";
430
+ }, {
431
+ readonly name: "underline";
432
+ readonly required: false;
433
+ readonly values: readonly ["off", "always"];
434
+ readonly fallback: "off";
435
+ readonly summary: "Decides whether every Word carries a rule beneath it.";
436
+ }, {
437
+ readonly name: "underline-color";
438
+ readonly required: false;
439
+ readonly fallback: "fill";
440
+ readonly summary: "Paints the ordinary Word underline.";
441
+ }, {
442
+ readonly name: "underline-thickness";
443
+ readonly required: false;
444
+ readonly fallback: "2";
445
+ readonly summary: "Sets the ordinary Word underline thickness in pixels.";
446
+ }, {
447
+ readonly name: "underline-offset";
448
+ readonly required: false;
449
+ readonly fallback: "4";
450
+ readonly summary: "Drops the ordinary Word underline this many pixels below the baseline.";
451
+ }, {
452
+ readonly name: "active-underline";
453
+ readonly required: false;
454
+ readonly values: readonly ["off", "current", "trail"];
455
+ readonly fallback: "off";
456
+ readonly summary: "Decides whether the Word being spoken, or every Word up to it, carries a rule beneath it.";
457
+ }, {
458
+ readonly name: "active-underline-color";
459
+ readonly required: false;
460
+ readonly fallback: "#FFD54A";
461
+ readonly summary: "Paints the active Word underline.";
462
+ }, {
463
+ readonly name: "active-underline-thickness";
464
+ readonly required: false;
465
+ readonly fallback: "3";
466
+ readonly summary: "Sets the active Word underline thickness in pixels.";
467
+ }, {
468
+ readonly name: "active-underline-offset";
469
+ readonly required: false;
470
+ readonly fallback: "4";
471
+ readonly summary: "Drops the active Word underline this many pixels below the baseline.";
472
+ }, {
473
+ readonly name: "karaoke";
474
+ readonly required: false;
475
+ readonly values: readonly ["off", "current", "trail"];
476
+ readonly fallback: "off";
477
+ readonly summary: "Decides whether the active Paint marks only the Word being spoken or every Word up to it.";
478
+ }, {
479
+ readonly name: "karaoke-transition";
480
+ readonly required: false;
481
+ readonly values: readonly ["step", "wipe"];
482
+ readonly fallback: "step";
483
+ readonly summary: "step activates each whole timed unit at its start (normally one Han character in Chinese); wipe sweeps inside that unit's glyphs during its own interval.";
484
+ }, {
485
+ readonly name: "active-box";
486
+ readonly required: false;
487
+ readonly values: readonly ["off", "current", "trail"];
488
+ readonly fallback: "off";
489
+ readonly summary: "Decides whether a highlight box sits behind the Word being spoken or behind every Word up to it.";
490
+ }, {
491
+ readonly name: "active-box-continuity";
492
+ readonly required: false;
493
+ readonly values: readonly ["isolated", "joined"];
494
+ readonly fallback: "isolated";
495
+ readonly summary: "Decides whether trailing highlight boxes stand apart or merge into one run.";
496
+ }, {
497
+ readonly name: "active-box-background";
498
+ readonly required: false;
499
+ readonly fallback: "#FFD54A";
500
+ readonly summary: "Paints the highlight box behind the active Word.";
501
+ }, {
502
+ readonly name: "active-box-border-color";
503
+ readonly required: false;
504
+ readonly fallback: "#00000000";
505
+ readonly summary: "Paints the highlight box border.";
506
+ }, {
507
+ readonly name: "active-box-border-width";
508
+ readonly required: false;
509
+ readonly fallback: "0";
510
+ readonly summary: "Sets the highlight box border thickness in pixels.";
511
+ }, {
512
+ readonly name: "active-box-padding";
513
+ readonly required: false;
514
+ readonly fallback: "0";
515
+ readonly summary: "Insets the Word from the highlight box edge, as one pixel number or a vertical and horizontal pair.";
516
+ }, {
517
+ readonly name: "active-box-radius";
518
+ readonly required: false;
519
+ readonly fallback: "8";
520
+ readonly summary: "Rounds the highlight box corners by this many pixels.";
521
+ }, {
522
+ readonly name: "active-box-enter";
523
+ readonly required: false;
524
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
525
+ readonly fallback: "none";
526
+ readonly summary: "Plays this motion as the highlight box arrives on a Word.";
527
+ }, {
528
+ readonly name: "active-box-exit";
529
+ readonly required: false;
530
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
531
+ readonly fallback: "none";
532
+ readonly summary: "Plays this motion as the highlight box leaves a Word.";
533
+ }, {
534
+ readonly name: "active-box-transition-frames";
535
+ readonly required: false;
536
+ readonly fallback: "0";
537
+ readonly summary: "Sets how many Frames the highlight box entrance and exit each run for.";
538
+ }, {
539
+ readonly name: "cue-enter";
540
+ readonly required: false;
541
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
542
+ readonly fallback: "none";
543
+ readonly summary: "Plays this motion as a Cue arrives.";
544
+ }, {
545
+ readonly name: "cue-enter-frames";
546
+ readonly required: false;
547
+ readonly fallback: "0";
548
+ readonly summary: "Sets how many Frames the Cue entrance runs for.";
549
+ }, {
550
+ readonly name: "cue-enter-start-scale";
551
+ readonly required: false;
552
+ readonly summary: "Overrides the Cue entrance motion's initial uniform scale while preserving that motion's own curve; 0.55 begins at fifty-five percent size and settles at one.";
553
+ }, {
554
+ readonly name: "cue-exit";
555
+ readonly required: false;
556
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
557
+ readonly fallback: "none";
558
+ readonly summary: "Plays this motion as a Cue leaves.";
559
+ }, {
560
+ readonly name: "cue-exit-frames";
561
+ readonly required: false;
562
+ readonly fallback: "0";
563
+ readonly summary: "Sets how many Frames the Cue exit runs for.";
564
+ }, {
565
+ readonly name: "atom-enter";
566
+ readonly required: false;
567
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
568
+ readonly fallback: "none";
569
+ readonly summary: "Plays this motion as an Atom arrives within its Cue.";
570
+ }, {
571
+ readonly name: "atom-enter-frames";
572
+ readonly required: false;
573
+ readonly fallback: "0";
574
+ readonly summary: "Sets how many Frames the Atom entrance runs for.";
575
+ }, {
576
+ readonly name: "atom-exit";
577
+ readonly required: false;
578
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
579
+ readonly fallback: "none";
580
+ readonly summary: "Plays this motion as an Atom leaves within its Cue.";
581
+ }, {
582
+ readonly name: "atom-exit-frames";
583
+ readonly required: false;
584
+ readonly fallback: "0";
585
+ readonly summary: "Sets how many Frames the Atom exit runs for.";
586
+ }, {
587
+ readonly name: "atom-reveal";
588
+ readonly required: false;
589
+ readonly values: readonly ["all", "on-start", "typewriter"];
590
+ readonly fallback: "all";
591
+ readonly summary: "Decides whether a Cue shows all of its Atoms at once or uncovers them as they are spoken.";
592
+ }, {
593
+ readonly name: "active-response";
594
+ readonly required: false;
595
+ readonly values: readonly ["none", "fade", "pop", "scale", "spring", "bounce", "elastic", "stamp", "tilt", "zoom-blur", "flip-x", "flip-y", "spin", "squash", "stretch", "slide-left", "slide-right", "slide-up", "slide-down", "blur-in", "wipe-left", "wipe-right", "wipe-up", "wipe-down"];
596
+ readonly fallback: "none";
597
+ readonly summary: "Plays this motion on a Word at the moment it becomes the spoken one.";
598
+ }, {
599
+ readonly name: "active-response-frames";
600
+ readonly required: false;
601
+ readonly fallback: "6";
602
+ readonly summary: "Sets how many Frames the active response runs for.";
603
+ }, {
604
+ readonly name: "active-scale";
605
+ readonly required: false;
606
+ readonly fallback: "1.08";
607
+ readonly summary: "Sets how far the active response grows the Word.";
608
+ }, {
609
+ readonly name: "slide-distance";
610
+ readonly required: false;
611
+ readonly fallback: "24";
612
+ readonly summary: "Sets how far the sliding and wiping motions travel in pixels.";
613
+ }, {
614
+ readonly name: "loop";
615
+ readonly required: false;
616
+ readonly fallback: "none";
617
+ readonly values: readonly ["none", "shake", "wobble", "glow-pulse", "breathe", "float", "pulse", "flicker"];
618
+ readonly summary: "Plays this motion continuously for as long as its target is on screen.";
619
+ }, {
620
+ readonly name: "loop-target";
621
+ readonly required: false;
622
+ readonly values: readonly ["cue", "active-atom"];
623
+ readonly fallback: "cue";
624
+ readonly summary: "Decides whether the looping motion moves the whole Cue or only the Atom being spoken.";
625
+ }, {
626
+ readonly name: "loop-period-frames";
627
+ readonly required: false;
628
+ readonly fallback: "12";
629
+ readonly summary: "Sets how many Frames one cycle of the looping motion takes.";
630
+ }, {
631
+ readonly name: "loop-intensity";
632
+ readonly required: false;
633
+ readonly fallback: "1";
634
+ readonly summary: "Scales how far the looping motion carries.";
635
+ }, {
636
+ readonly name: "lead-frames";
637
+ readonly required: false;
638
+ readonly fallback: "0";
639
+ readonly summary: "Makes the Cue visible this many Frames before its first timed unit without moving any unit timing.";
640
+ }, {
641
+ readonly name: "tail-frames";
642
+ readonly required: false;
643
+ readonly fallback: "0";
644
+ readonly summary: "Keeps the Cue visible this many Frames after its last timed unit without extending any unit timing.";
645
+ }, {
646
+ readonly name: "handoff";
647
+ readonly required: false;
648
+ readonly values: readonly ["cut", "overlap"];
649
+ readonly fallback: "cut";
650
+ readonly summary: "Chooses whether adjacent Cue visibility envelopes meet without overlap or may coexist.";
651
+ }];
652
+ }, {
653
+ readonly name: "font";
654
+ readonly kind: "reference";
655
+ readonly required: true;
656
+ readonly accepts: readonly [{
657
+ module: {
658
+ readonly name: "@hypit/media";
659
+ readonly version: "1";
660
+ };
661
+ name: string;
662
+ }, {
663
+ module: {
664
+ readonly name: "@hypit/media";
665
+ readonly version: "1";
666
+ };
667
+ name: string;
668
+ }];
669
+ readonly summary: "Chooses the primary face, or a whole reusable stack that already carries its own fallbacks.";
670
+ }];
671
+ readonly children: readonly [{
672
+ readonly tag: "Fallback";
673
+ readonly cardinality: "many";
674
+ readonly summary: "Appends one more exact face after the primary one, in the order written, and accepts no children of its own.";
675
+ readonly attributes: readonly [{
676
+ readonly name: "font";
677
+ readonly kind: "reference";
678
+ readonly required: true;
679
+ readonly accepts: readonly [{
680
+ module: {
681
+ readonly name: "@hypit/media";
682
+ readonly version: "1";
683
+ };
684
+ name: string;
685
+ }];
686
+ readonly summary: "Chooses the single face this fallback contributes.";
687
+ }];
688
+ }];
689
+ readonly example: "<fontsource:Face id=\"caption-font\" package=\"@fontsource-variable/inter\" weight=\"800\" style=\"normal\"/>\n<caption-fine:Style id=\"primary-caption\" recipe={recipes.caption.primary} font={caption-font}/>";
690
+ readonly notes: readonly ["Referencing a font stack in `font` and writing `<Fallback>` children are both allowed; the stack's faces come first.", "The Style is addressed by its own id, and the element accepts no text.", "The Recipe accepts only the properties declared here; any other property is rejected.", "A gradient needs both of its colors: writing any one of `gradient-from`, `gradient-to` or `gradient-angle` without both colors is rejected, and the same holds for the `active-` gradient.", "The active glyph Paint inherits every base property it does not override, except the gradient, which the active Paint drops unless it writes its own."];
691
+ };
692
+ }, {
693
+ readonly name: "caption";
694
+ readonly tag: "Caption";
695
+ readonly mode: "structured";
696
+ readonly outputs: readonly [{
697
+ readonly module: {
698
+ readonly name: "@hypit/caption-fine";
699
+ readonly version: "1";
700
+ };
701
+ readonly name: "FineCaptionSchedule";
702
+ }, {
703
+ module: {
704
+ readonly name: "@hypit/composition";
705
+ readonly version: "1";
706
+ };
707
+ name: string;
708
+ }, {
709
+ module: {
710
+ readonly name: "@hypit/caption";
711
+ readonly version: "1";
712
+ };
713
+ name: string;
714
+ }, {
715
+ module: {
716
+ readonly name: "@hypit/caption";
717
+ readonly version: "1";
718
+ };
719
+ name: string;
720
+ }, {
721
+ module: {
722
+ readonly name: "@hypit/caption";
723
+ readonly version: "1";
724
+ };
725
+ name: string;
726
+ }];
727
+ readonly vocabulary: {
728
+ readonly summary: "Renders an authored CaptionDocument at its already resolved CaptionTiming as one ordinary peer VisualTrack.";
729
+ readonly appearance: "One block of caption text wrapped into lines inside a rounded Cue box, placed at a Recipe-chosen point in the selected Frame and spanning a fraction of its width. Cues follow the speech one after another, each arriving and leaving with its own motion, and the Words of a Cue either stand there together from its first Frame or uncover as they are spoken. As the speech advances, the Word being spoken, or every Word up to it, is repainted in the active Paint, snapping at the Word boundary or sweeping across the glyphs, and it may take a rule beneath it, a rounded highlight capsule behind it and a brief pop at the moment it becomes the spoken one. That capsule either stands alone on each Atom or grows as one continuous run over everything already read, following the Words across line breaks.\n\nEvery Cue uses the ordered exact font stack its Style names, with fallback faces supplying glyphs for other scripts. Emphasis varies by timed unit through the active Paint. Lines follow the common flow, so a line cannot be given a separate face, colour or weight of its own. A caption whose lines are set in different typefaces is outside what this Caption can draw.";
730
+ readonly preview: {
731
+ mediaType: string;
732
+ path: string;
733
+ open: () => Promise<Uint8Array<ArrayBuffer>>;
734
+ };
735
+ readonly attributes: readonly [{
736
+ readonly name: "id";
737
+ readonly kind: "identifier";
738
+ readonly required: true;
739
+ readonly summary: "Names this Caption so its rendered visual contribution can be placed in a Film.";
740
+ }, {
741
+ readonly name: "document";
742
+ readonly kind: "reference";
743
+ readonly required: true;
744
+ readonly accepts: readonly [{
745
+ module: {
746
+ readonly name: "@hypit/caption";
747
+ readonly version: "1";
748
+ };
749
+ name: string;
750
+ }];
751
+ readonly summary: "Chooses the source-neutral CaptionDocument.";
752
+ }, {
753
+ readonly name: "timing";
754
+ readonly kind: "reference";
755
+ readonly required: true;
756
+ readonly accepts: readonly [{
757
+ module: {
758
+ readonly name: "@hypit/caption";
759
+ readonly version: "1";
760
+ };
761
+ name: string;
762
+ }];
763
+ readonly summary: "Chooses resolved absolute timing for this CaptionDocument.";
764
+ }, {
765
+ readonly name: "timeline";
766
+ readonly kind: "reference";
767
+ readonly required: true;
768
+ readonly accepts: readonly [{
769
+ module: {
770
+ readonly name: "@hypit/timeline";
771
+ readonly version: "1";
772
+ };
773
+ name: string;
774
+ }];
775
+ readonly summary: "The complete absolute film Timeline.";
776
+ }, {
777
+ readonly name: "within";
778
+ readonly kind: "reference";
779
+ readonly required: true;
780
+ readonly accepts: readonly [{
781
+ module: {
782
+ readonly name: "@hypit/spatial";
783
+ readonly version: "1";
784
+ };
785
+ name: string;
786
+ }];
787
+ readonly summary: "Chooses the resolved picture-plane Frame used by Recipe x, y, width and height.";
788
+ }, {
789
+ readonly name: "regions";
790
+ readonly kind: "reference";
791
+ readonly required: false;
792
+ readonly accepts: readonly [{
793
+ module: {
794
+ readonly name: "@hypit/region-evidence";
795
+ readonly version: "1";
796
+ };
797
+ name: string;
798
+ }];
799
+ readonly summary: "Optionally follows external, frame-exact regions whose ids equal Script Roles, placing a Cue at its measured speaker region's top center and hiding it on null Frames.";
800
+ }];
801
+ readonly children: readonly [{
802
+ readonly tag: "Use";
803
+ readonly cardinality: "many";
804
+ readonly summary: "Presents matching complete Cues. A Window can narrow its scope; later matching Uses replace earlier ones.";
805
+ readonly attributes: readonly [{
806
+ readonly name: "id";
807
+ readonly kind: "identifier";
808
+ readonly required: false;
809
+ readonly summary: "Optional occurrence identity.";
810
+ }, {
811
+ readonly name: "style";
812
+ readonly kind: "reference";
813
+ readonly required: true;
814
+ readonly accepts: readonly [{
815
+ module: {
816
+ readonly name: "@hypit/caption";
817
+ readonly version: "1";
818
+ };
819
+ name: string;
820
+ }];
821
+ readonly summary: "Complete Caption Style, including Hidden.";
822
+ }, {
823
+ readonly name: "role";
824
+ readonly kind: "literal";
825
+ readonly required: false;
826
+ readonly summary: "Optional speaker filter, independent of the time window.";
827
+ }, ...import("@hypit/hypit/markup").SurfaceAttributeVocabulary[]];
828
+ }];
829
+ readonly ports: readonly [{
830
+ readonly name: "schedule";
831
+ readonly type: {
832
+ readonly module: {
833
+ readonly name: "@hypit/caption-fine";
834
+ readonly version: "1";
835
+ };
836
+ readonly name: "FineCaptionSchedule";
837
+ };
838
+ readonly summary: "The visible Cue schedule consumed by the renderer and other declared tools.";
839
+ }, {
840
+ readonly name: "visual";
841
+ readonly type: {
842
+ module: {
843
+ readonly name: "@hypit/composition";
844
+ readonly version: "1";
845
+ };
846
+ name: string;
847
+ };
848
+ readonly summary: "The rendered Caption as one self-contained VisualTrack.";
849
+ }];
850
+ readonly example: "<caption-fine:Caption id=\"captions\" document={story.caption} timing={story-captions} timeline={film.timeline} within={vertical.bounds}>\n <caption-fine:Use style={primary-caption}/>\n <caption-fine:Use during={answer} style={answer-caption}/>\n</caption-fine:Caption>";
851
+ readonly notes: readonly ["Use without time attributes applies to every matching Cue in the CaptionDocument. Role filters content without changing a Window.", "Script authors complete Cues; Use windows change presentation without cutting those Cues or restarting Unit timing. A hidden Use still replaces earlier presentation.", "Without regions, Recipe x/y placement is unchanged. With regions, a measured region overrides x/y for that Frame; a null Frame in that Role series hides the Cue, while a missing Role series retains authored x/y.", "The tracked point replaces Recipe x/y while width and the Recipe anchor still decide the Caption box geometry; anchor-x=center and anchor-y=bottom place the box immediately above the measured region."];
852
+ };
853
+ }];
854
+ export declare const captionFineManifest: ModuleManifest;