@cueframe/kernel 0.2.53 → 0.2.55

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.
Files changed (71) hide show
  1. package/dist/_members/composition/ops/compositionOps.shared.d.ts +1 -0
  2. package/dist/_members/composition/validators/composition.d.ts +144 -0
  3. package/dist/_members/composition/validators/render.d.ts +72 -0
  4. package/dist/_members/composition-ops/index.d.ts +27 -0
  5. package/dist/_members/core/render/compositionAudioAndDepth.d.ts +2 -1
  6. package/dist/_members/primitives/lib/text/marker.d.ts +2 -0
  7. package/dist/_members/primitives/lib/text/spec.d.ts +3 -0
  8. package/dist/animate.js +2 -2
  9. package/dist/authoring/build-tools.js +6 -6
  10. package/dist/authoring/context.js +5 -5
  11. package/dist/authoring/tools.js +5 -5
  12. package/dist/authoring.js +9 -9
  13. package/dist/chunk-6RWIPDJ3.js +76 -0
  14. package/dist/{chunk-UKKY7HWN.js → chunk-BDFAA747.js} +1 -1
  15. package/dist/{chunk-2BVKNYRB.js → chunk-BEFSJMFF.js} +1 -1
  16. package/dist/{chunk-5E4YP44R.js → chunk-E2LKX6C4.js} +1 -1
  17. package/dist/{chunk-4DM63RTI.js → chunk-EGIVPZCJ.js} +4 -4
  18. package/dist/{chunk-LPUQTBKU.js → chunk-EYQMFL53.js} +21 -11
  19. package/dist/{chunk-D5E5XFHK.js → chunk-FHMTAZD4.js} +1 -1
  20. package/dist/{chunk-G7ZSFSQG.js → chunk-FOST4XYJ.js} +1 -1
  21. package/dist/{chunk-AONWKKXK.js → chunk-HGCYZMII.js} +1 -1
  22. package/dist/{chunk-TPKPU4PE.js → chunk-LBJ5LI5V.js} +8 -7
  23. package/dist/{chunk-P3DYA5NA.js → chunk-NEZHGYZL.js} +8 -8
  24. package/dist/{chunk-7RGDRDAR.js → chunk-OOL7ZUG7.js} +1 -1
  25. package/dist/{chunk-CR3G2JQP.js → chunk-PTVTWQ4T.js} +1 -1
  26. package/dist/{chunk-GAACUQAB.js → chunk-SQ4XTSIN.js} +4 -4
  27. package/dist/{chunk-RMLGMYEJ.js → chunk-TLOYCCCI.js} +1 -1
  28. package/dist/{chunk-UFNIB3JL.js → chunk-UFD4EZHM.js} +14 -2
  29. package/dist/{chunk-C6ONUJIO.js → chunk-UKDBU7HM.js} +5 -5
  30. package/dist/{chunk-ZIPGDGBR.js → chunk-UMXES6ED.js} +1 -1
  31. package/dist/{chunk-46DGDPXR.js → chunk-V6GL37RZ.js} +98 -7
  32. package/dist/{chunk-CJMUTCJW.js → chunk-VDNMCD6S.js} +2 -2
  33. package/dist/{chunk-ZFW35DLG.js → chunk-VYSBZUXZ.js} +1 -1
  34. package/dist/{chunk-VTM7NEJC.js → chunk-VZOAELFF.js} +4 -4
  35. package/dist/{chunk-7AUHC2X7.js → chunk-ZDE5S3DE.js} +1 -1
  36. package/dist/component-runtime/render.js +2 -2
  37. package/dist/component-runtime.js +3 -3
  38. package/dist/compose.js +24 -24
  39. package/dist/composition/fonts.js +1 -1
  40. package/dist/composition/graphics-plan.js +3 -3
  41. package/dist/composition/ops.js +4 -4
  42. package/dist/composition/projection.js +3 -3
  43. package/dist/composition/validators.js +3 -3
  44. package/dist/composition-ops.js +9 -9
  45. package/dist/composition.js +5 -5
  46. package/dist/{context-UAS5WJRB.js → context-O2HHUVSA.js} +5 -5
  47. package/dist/core/render.js +5 -5
  48. package/dist/core.js +5 -5
  49. package/dist/mcp/adapter.js +2 -2
  50. package/dist/mcp/core.js +1 -1
  51. package/dist/mcp/scene-shot.js +2 -2
  52. package/dist/mcp/server.js +13 -13
  53. package/dist/mcp.js +18 -18
  54. package/dist/primitives/captions.js +118 -47
  55. package/dist/primitives/effects.js +4 -4
  56. package/dist/primitives/hero-text.js +2 -2
  57. package/dist/primitives/layouts.js +3 -3
  58. package/dist/primitives/lib/index.js +6 -6
  59. package/dist/primitives/lib/text/marker.js +6 -3
  60. package/dist/primitives/lib.js +6 -6
  61. package/dist/primitives/scenes.js +4 -4
  62. package/dist/primitives/text.js +2 -2
  63. package/dist/primitives/ui-blocks.js +4 -4
  64. package/dist/primitives.js +23 -23
  65. package/dist/render-harness/cardFonts.js +2 -2
  66. package/dist/render-harness.js +13 -13
  67. package/package.json +11 -11
  68. package/dist/chunk-D2EG7J7X.js +0 -31
  69. package/dist/{chunk-VLJOIUHL.js → chunk-B3GSTQLR.js} +6 -6
  70. package/dist/{chunk-X34KW2SL.js → chunk-RBWS5XHE.js} +4 -4
  71. package/dist/{chunk-7SQOXIWR.js → chunk-RL5SO653.js} +3 -3
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  Marker
3
- } from "../chunk-D2EG7J7X.js";
3
+ } from "../chunk-6RWIPDJ3.js";
4
4
  import {
5
5
  fillStyle
6
6
  } from "../chunk-XLIPPLG3.js";
7
+ import "../chunk-GULDS3VE.js";
7
8
  import {
8
9
  wordPop
9
10
  } from "../chunk-ZFEXATWN.js";
@@ -13,7 +14,7 @@ import {
13
14
  } from "../chunk-W2245F6G.js";
14
15
  import {
15
16
  resolveCaptionFaces
16
- } from "../chunk-7RGDRDAR.js";
17
+ } from "../chunk-OOL7ZUG7.js";
17
18
  import "../chunk-2ESYSVXG.js";
18
19
 
19
20
  // ../execution/primitives/src/captions/Captions.tsx
@@ -154,15 +155,16 @@ function plateStyleFor(kind, backgroundColor) {
154
155
  }
155
156
  var COMBINE_TOKENS_MS = 1500;
156
157
  var CAPTION_LINGER_MS = 600;
157
- function italicAwareTextBox(maxWidth, maxLines) {
158
+ function measuredTextBox(maxWidth, maxLines, gapPx) {
158
159
  const lineWidths = [0];
159
160
  return {
160
161
  add: (word) => {
161
162
  const widthOf = (text) => measureText({ ...word, text }).width;
162
163
  const current = lineWidths.length - 1;
163
164
  const width = widthOf(lineWidths[current] === 0 ? word.text.trimStart() : word.text);
164
- if (Math.ceil(lineWidths[current] + width) < maxWidth) {
165
- lineWidths[current] += width;
165
+ const nextWidth = lineWidths[current] + (lineWidths[current] ? gapPx : 0) + width;
166
+ if (Math.ceil(nextWidth) < maxWidth) {
167
+ lineWidths[current] = nextWidth;
166
168
  return { exceedsBox: false, newLine: false };
167
169
  }
168
170
  const firstWidth = widthOf(word.text.trimStart());
@@ -174,10 +176,11 @@ function italicAwareTextBox(maxWidth, maxLines) {
174
176
  }
175
177
  };
176
178
  }
177
- function tokenBox(maxWidth, maxLines, emphasis) {
178
- return emphasis?.emphasisFontStyle === "italic" ? italicAwareTextBox(maxWidth, maxLines) : fillTextBox({ maxBoxWidth: maxWidth, maxLines });
179
+ function tokenBox(maxWidth, maxLines, fontSize, letterSpacing, wordGapEm, textTransform, emphasis) {
180
+ const needsMeasured = emphasis?.emphasisFontStyle === "italic" || letterSpacing !== 0 || (emphasis?.emphasisLetterSpacing ?? 0) !== 0 || wordGapEm !== void 0 || textTransform !== void 0 && textTransform !== "none" || emphasis?.emphasisTextTransform !== void 0 && emphasis.emphasisTextTransform !== "none";
181
+ return needsMeasured ? measuredTextBox(maxWidth, maxLines, fontSize * (wordGapEm ?? 0.35)) : fillTextBox({ maxBoxWidth: maxWidth, maxLines });
179
182
  }
180
- function addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis) {
183
+ function addTokenToBox(box, token, fontFamily, fontSize, fontWeight, letterSpacing, textTransform, emphasis) {
181
184
  const isEmp = emphasis?.emphasisSet.has(token.fromMs) ?? false;
182
185
  const tokenSize = isEmp ? Math.round(fontSize * (emphasis?.emphasisScale ?? 1.2)) : fontSize;
183
186
  const tokenWeight = emphasis && isEmp ? emphasis.emphasisFontWeight : fontWeight;
@@ -187,22 +190,24 @@ function addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis) {
187
190
  fontFamily: tokenFamily,
188
191
  fontSize: tokenSize,
189
192
  fontWeight: String(tokenWeight),
193
+ ...(isEmp ? emphasis?.emphasisLetterSpacing : letterSpacing) ? { letterSpacing: `${isEmp ? emphasis?.emphasisLetterSpacing : letterSpacing}px` } : {},
194
+ ...isEmp ? { textTransform: emphasis?.emphasisTextTransform } : { textTransform },
190
195
  ...isEmp && emphasis?.emphasisFontStyle === "italic" ? { additionalStyles: { fontStyle: "italic" } } : {}
191
196
  });
192
197
  }
193
- function makeBoxFactory(maxWidth, maxLines, fontFamily, fontSize, fontWeight, emphasis) {
198
+ function makeBoxFactory(maxWidth, maxLines, fontFamily, fontSize, fontWeight, letterSpacing, wordGapEm, textTransform, emphasis) {
194
199
  return () => {
195
- const box = tokenBox(maxWidth, maxLines, emphasis);
200
+ const box = tokenBox(maxWidth, maxLines, fontSize, letterSpacing, wordGapEm, textTransform, emphasis);
196
201
  return {
197
- add: (token) => !addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis).exceedsBox
202
+ add: (token) => !addTokenToBox(box, token, fontFamily, fontSize, fontWeight, letterSpacing, textTransform, emphasis).exceedsBox
198
203
  };
199
204
  };
200
205
  }
201
- function layoutTokensIntoLines(tokens, maxWidth, maxLines, fontFamily, fontSize, fontWeight, emphasis) {
202
- const box = tokenBox(maxWidth, maxLines, emphasis);
206
+ function layoutTokensIntoLines(tokens, maxWidth, maxLines, fontFamily, fontSize, fontWeight, letterSpacing, wordGapEm, textTransform, emphasis) {
207
+ const box = tokenBox(maxWidth, maxLines, fontSize, letterSpacing, wordGapEm, textTransform, emphasis);
203
208
  const lines = [[]];
204
209
  for (const token of tokens) {
205
- const result = addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis);
210
+ const result = addTokenToBox(box, token, fontFamily, fontSize, fontWeight, letterSpacing, textTransform, emphasis);
206
211
  if (result.newLine) {
207
212
  lines.push([token]);
208
213
  } else {
@@ -211,8 +216,10 @@ function layoutTokensIntoLines(tokens, maxWidth, maxLines, fontFamily, fontSize,
211
216
  }
212
217
  return lines.filter((line) => line.length > 0);
213
218
  }
214
- function layoutFitError(label) {
215
- return new Error(`Caption layout${label ? ` ${label}` : " word range"} does not fit one page in its region; enlarge the region or split the range`);
219
+ function layoutFitError(label, detail) {
220
+ const error = new Error(`Caption layout${label ? ` ${label}` : " word range"} does not fit one page in its region${detail ? ` (${detail})` : ""}; enlarge the region or split the range`);
221
+ error.name = "CaptionLayoutFitError";
222
+ return error;
216
223
  }
217
224
  function tokenRuns(tokens, emphasisSet, emphasisPlate) {
218
225
  const runs = [];
@@ -224,34 +231,38 @@ function tokenRuns(tokens, emphasisSet, emphasisPlate) {
224
231
  }
225
232
  return runs;
226
233
  }
234
+ function measureVisualRun(run, fontSize, style, faces) {
235
+ const plate = style.emphasisPlate ?? false;
236
+ const emph = run.emph;
237
+ const text = emph && plate ? run.tokens.map((token) => token.text.trim()).join(" ") : plate ? run.tokens[0].text.trim() : run.tokens[0].text;
238
+ const size = emph ? Math.round(fontSize * (style.emphasisScale ?? 1.08)) : fontSize;
239
+ const transform = emph ? style.emphasisTextTransform ?? style.textTransform : style.textTransform;
240
+ const letterSpacing = emph ? style.emphasisLetterSpacing ?? style.letterSpacing : style.letterSpacing;
241
+ return measureText({
242
+ text,
243
+ fontFamily: emph ? faces.emphasis.stack : faces.base.stack,
244
+ fontSize: size,
245
+ fontWeight: String(emph ? faces.emphasis.weight : faces.base.weight),
246
+ ...transform ? { textTransform: transform } : {},
247
+ ...letterSpacing !== void 0 ? { letterSpacing: `${letterSpacing}px` } : {},
248
+ ...emph && faces.emphasis.style === "italic" ? { additionalStyles: { fontStyle: "italic" } } : {}
249
+ }).width + (emph && plate ? 2 * Math.round(size * (style.emphasisPlatePadX ?? 0.16)) : 0);
250
+ }
227
251
  function layoutAuthoredTokensIntoLines(tokens, maxWidth, maxLines, fontSize, style, emphasisSet, faces, label) {
228
252
  const lines = [[]];
229
253
  let lineWidth = 0;
230
254
  const plate = style.emphasisPlate ?? false;
231
- const runGap = fontSize * 0.35;
255
+ const runGap = fontSize * (style.wordGapEm ?? 0.35);
232
256
  for (const run of tokenRuns(tokens, emphasisSet, plate)) {
233
- const emph = run.emph;
234
- const text = emph && plate ? run.tokens.map((token) => token.text.trim()).join(" ") : plate ? run.tokens[0].text.trim() : run.tokens[0].text;
235
- const size = emph ? Math.round(fontSize * (style.emphasisScale ?? 1.08)) : fontSize;
236
- const transform = emph ? style.emphasisTextTransform ?? style.textTransform : style.textTransform;
237
- const letterSpacing = emph ? style.emphasisLetterSpacing : void 0;
238
- const width = measureText({
239
- text,
240
- fontFamily: emph ? faces.emphasis.stack : faces.base.stack,
241
- fontSize: size,
242
- fontWeight: String(emph ? faces.emphasis.weight : faces.base.weight),
243
- ...transform ? { textTransform: transform } : {},
244
- ...letterSpacing ? { letterSpacing: `${letterSpacing}px` } : {},
245
- ...emph && faces.emphasis.style === "italic" ? { additionalStyles: { fontStyle: "italic" } } : {}
246
- }).width + (emph && plate ? 2 * Math.round(size * (style.emphasisPlatePadX ?? 0.16)) : 0);
257
+ const width = measureVisualRun(run, fontSize, style, faces);
247
258
  if (Math.ceil(width) > maxWidth) {
248
- throw layoutFitError(label);
259
+ throw layoutFitError(label, `run needs ${Math.ceil(width)}px, box has ${Math.floor(maxWidth)}px`);
249
260
  }
250
261
  const current = lines[lines.length - 1];
251
262
  const nextWidth = lineWidth + (current.length ? runGap : 0) + width;
252
263
  if (Math.ceil(nextWidth) > maxWidth) {
253
264
  if (lines.length >= maxLines) {
254
- throw layoutFitError(label);
265
+ throw layoutFitError(label, `needs ${lines.length + 1} lines, box allows ${maxLines}`);
255
266
  }
256
267
  lines.push([...run.tokens]);
257
268
  lineWidth = width;
@@ -287,7 +298,8 @@ function Captions({
287
298
  const emphasisFontFamily = faces.emphasis.stack;
288
299
  const emphasisFontWeight = faces.emphasis.weight;
289
300
  const emphasisTextTransform = style.emphasisTextTransform ?? style.textTransform;
290
- const emphasisLetterSpacing = style.emphasisLetterSpacing ?? 0;
301
+ const letterSpacing = style.letterSpacing ?? 0;
302
+ const emphasisLetterSpacing = style.emphasisLetterSpacing ?? letterSpacing;
291
303
  const emphasisFontStyle = faces.emphasis.style;
292
304
  const entrance = style.entrance ?? "none";
293
305
  const entranceFrames = Math.max(1, Math.round((style.entranceMs ?? 160) / 1e3 * fps));
@@ -301,18 +313,26 @@ function Captions({
301
313
  const plateRadius = style.emphasisPlateRadius ?? 6;
302
314
  const platePadX = style.emphasisPlatePadX ?? 0.16;
303
315
  const platePadY = style.emphasisPlatePadY ?? 0.04;
316
+ const plateReveal = style.emphasisPlateReveal ?? false;
304
317
  const annotationColor = style.annotationColor ?? VIOLET;
318
+ const annotationStrokeWidth = style.annotationStrokeWidth ?? 4;
319
+ const annotationTexture = style.annotationTexture ?? "clean";
305
320
  const maxWidthPercent = style.maxWidthPercent ?? 80;
306
321
  const plateStyle = plateStyleFor(style.plate ?? "glass", style.backgroundColor);
307
322
  const fontSize = Math.round(height * (style.fontSize / 100));
323
+ const wordGapPx = fontSize * (style.wordGapEm ?? 0.35);
324
+ const lineGapPx = fontSize * (style.lineGapEm ?? 0.25);
308
325
  const authoredRegion = userStyle?.region;
309
326
  const regionWidth = authoredRegion ? width * authoredRegion.w : width;
310
327
  const maxTextWidth = authoredRegion ? Math.min(width * (maxWidthPercent / 100), regionWidth - fontSize * 1.6) : width * (maxWidthPercent / 100);
311
328
  const availableHeight = authoredRegion ? height * authoredRegion.h - fontSize * 0.8 : Infinity;
312
329
  const lineHeight = fontSize * Math.max(1, emphasisScale) * 1.2;
313
- const maxLines = authoredRegion ? Math.min(3, Math.floor((availableHeight + fontSize * 0.25) / (lineHeight + fontSize * 0.25))) : 3;
330
+ const maxLines = authoredRegion ? Math.min(3, Math.floor((availableHeight + lineGapPx) / (lineHeight + lineGapPx))) : 3;
314
331
  if (authoredRegion && (maxTextWidth <= 0 || maxLines < 1)) {
315
- if (singlePageRequired) throw layoutFitError(layoutLabel);
332
+ if (singlePageRequired) throw layoutFitError(
333
+ layoutLabel,
334
+ maxTextWidth <= 0 ? `box has ${Math.floor(maxTextWidth)}px text width` : "box allows no complete line"
335
+ );
316
336
  throw new Error("Caption style.region is too small for one caption line at the authored font size");
317
337
  }
318
338
  const { emphasisStartMs, annotateKind } = useMemo(() => {
@@ -325,12 +345,38 @@ function Captions({
325
345
  return { emphasisStartMs: emph, annotateKind: ann };
326
346
  }, [segments]);
327
347
  const emphasisLayout = useMemo(
328
- () => emphasisStartMs.size > 0 ? { emphasisSet: emphasisStartMs, emphasisScale, emphasisFontFamily, emphasisFontWeight, emphasisFontStyle } : void 0,
329
- [emphasisStartMs, emphasisScale, emphasisFontFamily, emphasisFontWeight, emphasisFontStyle]
348
+ () => emphasisStartMs.size > 0 ? {
349
+ emphasisSet: emphasisStartMs,
350
+ emphasisScale,
351
+ emphasisFontFamily,
352
+ emphasisFontWeight,
353
+ emphasisFontStyle,
354
+ emphasisLetterSpacing,
355
+ emphasisTextTransform
356
+ } : void 0,
357
+ [
358
+ emphasisStartMs,
359
+ emphasisScale,
360
+ emphasisFontFamily,
361
+ emphasisFontWeight,
362
+ emphasisFontStyle,
363
+ emphasisLetterSpacing,
364
+ emphasisTextTransform
365
+ ]
330
366
  );
331
367
  const pages = useMemo(
332
368
  () => {
333
- const makeBox = makeBoxFactory(maxTextWidth, maxLines, style.fontFamily, fontSize, style.fontWeight, emphasisLayout);
369
+ const makeBox = makeBoxFactory(
370
+ maxTextWidth,
371
+ maxLines,
372
+ style.fontFamily,
373
+ fontSize,
374
+ style.fontWeight,
375
+ letterSpacing,
376
+ style.wordGapEm,
377
+ style.textTransform,
378
+ emphasisLayout
379
+ );
334
380
  const paginated = paginateCaptionSegments(segments, {
335
381
  combineMs: singlePageRequired ? Number.MAX_SAFE_INTEGER : COMBINE_TOKENS_MS,
336
382
  makeBox: singlePageRequired ? () => ({ add: () => true }) : makeBox,
@@ -357,7 +403,20 @@ function Captions({
357
403
  }
358
404
  return paginated;
359
405
  },
360
- [segments, maxTextWidth, maxLines, fontSize, style, emphasisStartMs, faces, emphasisLayout, holdUntilMs, singlePageRequired, layoutLabel]
406
+ [
407
+ segments,
408
+ maxTextWidth,
409
+ maxLines,
410
+ fontSize,
411
+ style,
412
+ emphasisStartMs,
413
+ faces,
414
+ emphasisLayout,
415
+ letterSpacing,
416
+ holdUntilMs,
417
+ singlePageRequired,
418
+ layoutLabel
419
+ ]
361
420
  );
362
421
  if (pages.length === 0) return null;
363
422
  const currentTimeMs = frame / fps * 1e3;
@@ -398,6 +457,9 @@ function Captions({
398
457
  style.fontFamily,
399
458
  fontSize,
400
459
  style.fontWeight,
460
+ letterSpacing,
461
+ style.wordGapEm,
462
+ style.textTransform,
401
463
  emphasisLayout
402
464
  );
403
465
  const wrapperStyle = resolveCaptionPlacement(userStyle?.position, region, authoredRegion);
@@ -413,7 +475,7 @@ function Captions({
413
475
  display: "flex",
414
476
  flexDirection: "column",
415
477
  alignItems: authoredRegion ? "flex-start" : "center",
416
- gap: `${fontSize * 0.25}px`,
478
+ gap: `${lineGapPx}px`,
417
479
  padding: `${fontSize * 0.4}px ${fontSize * 0.8}px`,
418
480
  borderRadius: fontSize * 0.5,
419
481
  ...plateStyle,
@@ -451,7 +513,7 @@ function Captions({
451
513
  };
452
514
  return lines.map((line, lineIdx) => {
453
515
  const segs = tokenRuns(line, emphasisStartMs, emphasisPlate);
454
- return /* @__PURE__ */ React.createElement("div", { key: lineIdx, style: { display: "flex", justifyContent: authoredRegion ? "flex-start" : "center", alignItems: "baseline", gap: `${fontSize * 0.35}px` } }, segs.map((seg, si) => {
516
+ return /* @__PURE__ */ React.createElement("div", { key: lineIdx, style: { display: "flex", justifyContent: authoredRegion ? "flex-start" : "center", alignItems: "baseline", gap: `${wordGapPx}px` } }, segs.map((seg, si) => {
455
517
  const first = seg.tokens[0];
456
518
  const entered = entranceOf(first, seg.emph);
457
519
  const opacity = syncWordVisibility && currentTimeMs < first.fromMs ? 0 : entered.opacity;
@@ -469,7 +531,16 @@ function Captions({
469
531
  const bg = idx % 2 === 0 ? plateColor : plateAltColor;
470
532
  const fg = idx % 2 === 0 ? plateTextColor : plateAltTextColor;
471
533
  const efs = Math.round(fontSize * emphasisScale);
472
- return /* @__PURE__ */ React.createElement("span", { key: si, style: { position: "relative", display: "inline-block", opacity, transform: entranceTransform, transformOrigin: "center" } }, /* @__PURE__ */ React.createElement(
534
+ const plateTokens = plateReveal ? seg.tokens.filter((token2) => currentTimeMs >= token2.fromMs) : seg.tokens;
535
+ const reservedWidth = plateReveal ? measureVisualRun(seg, fontSize, style, faces) : void 0;
536
+ return /* @__PURE__ */ React.createElement("span", { key: si, style: {
537
+ position: "relative",
538
+ display: "inline-block",
539
+ ...reservedWidth !== void 0 ? { width: reservedWidth } : {},
540
+ opacity,
541
+ transform: entranceTransform,
542
+ transformOrigin: "center"
543
+ } }, /* @__PURE__ */ React.createElement(
473
544
  "span",
474
545
  {
475
546
  style: {
@@ -488,10 +559,10 @@ function Captions({
488
559
  whiteSpace: "nowrap"
489
560
  }
490
561
  },
491
- seg.tokens.map((token2, tokenIndex) => /* @__PURE__ */ React.createElement("span", { key: token2.fromMs, style: {
562
+ plateTokens.map((token2, tokenIndex) => /* @__PURE__ */ React.createElement("span", { key: token2.fromMs, style: {
492
563
  opacity: syncWordVisibility && tokenIndex > 0 ? currentTimeMs < token2.fromMs ? 0 : entranceOf(token2, true).opacity : 1
493
564
  } }, tokenIndex > 0 ? " " : "", token2.text.trim()))
494
- ), annKind && annotatedToken && currentTimeMs >= annotatedToken.fromMs ? /* @__PURE__ */ React.createElement(Marker, { spec: { kind: annKind, color: annotationColor }, progress: markerP }) : null);
565
+ ), annKind && annotatedToken && currentTimeMs >= annotatedToken.fromMs ? /* @__PURE__ */ React.createElement(Marker, { spec: { kind: annKind, color: annotationColor, strokeWidth: annotationStrokeWidth, texture: annotationTexture, seed: `${annotatedToken.fromMs}:${annotatedToken.text}` }, progress: markerP }) : null);
495
566
  }
496
567
  const token = first;
497
568
  const isActive = token === activeToken;
@@ -500,7 +571,7 @@ function Captions({
500
571
  const tokenWeight = isEmphasis ? emphasisFontWeight : style.fontWeight;
501
572
  const tokenFamily = isEmphasis ? emphasisFontFamily : style.fontFamily;
502
573
  const tokenTransform = isEmphasis ? emphasisTextTransform : style.textTransform;
503
- const tokenLetterSpacing = isEmphasis && emphasisLetterSpacing ? `${emphasisLetterSpacing}px` : void 0;
574
+ const tokenLetterSpacing = isEmphasis ? emphasisLetterSpacing ? `${emphasisLetterSpacing}px` : void 0 : letterSpacing ? `${letterSpacing}px` : void 0;
504
575
  const tokenFontStyle = isEmphasis ? emphasisFontStyle : "normal";
505
576
  let tokenColor = style.color;
506
577
  if (isActive && !emphasisPlate) tokenColor = style.highlightColor;
@@ -523,7 +594,7 @@ function Captions({
523
594
  },
524
595
  emphasisPlate ? token.text.trim() : token.text
525
596
  );
526
- return /* @__PURE__ */ React.createElement("span", { key: si, style: { position: "relative", display: "inline-block", opacity, transform: entranceTransform, transformOrigin: "center" } }, inner, annKind && annotatedToken && currentTimeMs >= annotatedToken.fromMs ? /* @__PURE__ */ React.createElement(Marker, { spec: { kind: annKind, color: annotationColor }, progress: markerP }) : null);
597
+ return /* @__PURE__ */ React.createElement("span", { key: si, style: { position: "relative", display: "inline-block", opacity, transform: entranceTransform, transformOrigin: "center" } }, inner, annKind && annotatedToken && currentTimeMs >= annotatedToken.fromMs ? /* @__PURE__ */ React.createElement(Marker, { spec: { kind: annKind, color: annotationColor, strokeWidth: annotationStrokeWidth, texture: annotationTexture, seed: `${annotatedToken.fromMs}:${annotatedToken.text}` }, progress: markerP }) : null);
527
598
  }));
528
599
  });
529
600
  })()
@@ -12,15 +12,15 @@ import {
12
12
  Vignette,
13
13
  catalog,
14
14
  laneDepths
15
- } from "../chunk-GAACUQAB.js";
16
- import "../chunk-MFHXCHRI.js";
15
+ } from "../chunk-SQ4XTSIN.js";
17
16
  import "../chunk-XHGZ2E77.js";
17
+ import "../chunk-MFHXCHRI.js";
18
18
  import "../chunk-W2245F6G.js";
19
- import "../chunk-D5E5XFHK.js";
19
+ import "../chunk-FHMTAZD4.js";
20
20
  import "../chunk-XV2K3AQT.js";
21
21
  import "../chunk-CL5Y6V6K.js";
22
22
  import "../chunk-2L7PYYJK.js";
23
- import "../chunk-7RGDRDAR.js";
23
+ import "../chunk-OOL7ZUG7.js";
24
24
  import "../chunk-2ESYSVXG.js";
25
25
  export {
26
26
  Blur,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  HeroText,
3
3
  catalog
4
- } from "../chunk-7SQOXIWR.js";
4
+ } from "../chunk-RL5SO653.js";
5
5
  import "../chunk-LT4PWSR2.js";
6
6
  import "../chunk-FWSJLHSV.js";
7
- import "../chunk-XHGZ2E77.js";
8
7
  import "../chunk-ZFEXATWN.js";
8
+ import "../chunk-XHGZ2E77.js";
9
9
  import "../chunk-W2245F6G.js";
10
10
  import "../chunk-2ESYSVXG.js";
11
11
  export {
@@ -8,14 +8,14 @@ import {
8
8
  SplitScreen,
9
9
  StaggeredBentoGrid,
10
10
  catalog
11
- } from "../chunk-CR3G2JQP.js";
11
+ } from "../chunk-PTVTWQ4T.js";
12
12
  import "../chunk-XHGZ2E77.js";
13
13
  import "../chunk-W2245F6G.js";
14
- import "../chunk-D5E5XFHK.js";
14
+ import "../chunk-FHMTAZD4.js";
15
15
  import "../chunk-XV2K3AQT.js";
16
16
  import "../chunk-CL5Y6V6K.js";
17
17
  import "../chunk-2L7PYYJK.js";
18
- import "../chunk-7RGDRDAR.js";
18
+ import "../chunk-OOL7ZUG7.js";
19
19
  import "../chunk-2ESYSVXG.js";
20
20
  export {
21
21
  ChatToPreviewLayout,
@@ -7,12 +7,6 @@ import {
7
7
  zodToDefaults,
8
8
  zodToJsonSchemaFor
9
9
  } from "../../chunk-ZZRBKGDA.js";
10
- import {
11
- SeededPRNG,
12
- gauss,
13
- pick,
14
- range
15
- } from "../../chunk-GULDS3VE.js";
16
10
  import {
17
11
  ALLOWED_BRAND_PATHS,
18
12
  CONTRAST_CRITICAL_PATHS,
@@ -24,6 +18,12 @@ import {
24
18
  resolveParams,
25
19
  resolveTokenValue
26
20
  } from "../../chunk-QDBVYZSF.js";
21
+ import {
22
+ SeededPRNG,
23
+ gauss,
24
+ pick,
25
+ range
26
+ } from "../../chunk-GULDS3VE.js";
27
27
  import {
28
28
  FRAME_BASELINE_WIDTH,
29
29
  frameScale,
@@ -1,7 +1,10 @@
1
1
  import {
2
- Marker
3
- } from "../../../chunk-D2EG7J7X.js";
2
+ Marker,
3
+ pencilMarkerPaths
4
+ } from "../../../chunk-6RWIPDJ3.js";
5
+ import "../../../chunk-GULDS3VE.js";
4
6
  import "../../../chunk-2ESYSVXG.js";
5
7
  export {
6
- Marker
8
+ Marker,
9
+ pencilMarkerPaths
7
10
  };
@@ -7,12 +7,6 @@ import {
7
7
  zodToDefaults,
8
8
  zodToJsonSchemaFor
9
9
  } from "../chunk-ZZRBKGDA.js";
10
- import {
11
- SeededPRNG,
12
- gauss,
13
- pick,
14
- range
15
- } from "../chunk-GULDS3VE.js";
16
10
  import {
17
11
  ALLOWED_BRAND_PATHS,
18
12
  CONTRAST_CRITICAL_PATHS,
@@ -24,6 +18,12 @@ import {
24
18
  resolveParams,
25
19
  resolveTokenValue
26
20
  } from "../chunk-QDBVYZSF.js";
21
+ import {
22
+ SeededPRNG,
23
+ gauss,
24
+ pick,
25
+ range
26
+ } from "../chunk-GULDS3VE.js";
27
27
  import {
28
28
  FRAME_BASELINE_WIDTH,
29
29
  frameScale,
@@ -8,17 +8,17 @@ import {
8
8
  ProductLaunchTrailer,
9
9
  TerminalToBrowserDeploy,
10
10
  catalog
11
- } from "../chunk-C6ONUJIO.js";
11
+ } from "../chunk-UKDBU7HM.js";
12
+ import "../chunk-QGAWDLYX.js";
12
13
  import "../chunk-S5H6GH6M.js";
13
14
  import "../chunk-QAGGJHAF.js";
14
15
  import "../chunk-MFHXCHRI.js";
15
- import "../chunk-QGAWDLYX.js";
16
16
  import "../chunk-W2245F6G.js";
17
- import "../chunk-D5E5XFHK.js";
17
+ import "../chunk-FHMTAZD4.js";
18
18
  import "../chunk-XV2K3AQT.js";
19
19
  import "../chunk-CL5Y6V6K.js";
20
20
  import "../chunk-2L7PYYJK.js";
21
- import "../chunk-7RGDRDAR.js";
21
+ import "../chunk-OOL7ZUG7.js";
22
22
  import "../chunk-2ESYSVXG.js";
23
23
  export {
24
24
  ChangelogBite,
@@ -21,13 +21,13 @@ import {
21
21
  TrackingIn,
22
22
  Typewriter,
23
23
  catalog
24
- } from "../chunk-X34KW2SL.js";
24
+ } from "../chunk-RBWS5XHE.js";
25
25
  import "../chunk-DLF4WVSE.js";
26
26
  import "../chunk-U4V4FZGE.js";
27
27
  import "../chunk-LT4PWSR2.js";
28
28
  import "../chunk-FWSJLHSV.js";
29
- import "../chunk-XHGZ2E77.js";
30
29
  import "../chunk-ZFEXATWN.js";
30
+ import "../chunk-XHGZ2E77.js";
31
31
  import "../chunk-W2245F6G.js";
32
32
  import "../chunk-2ESYSVXG.js";
33
33
  export {
@@ -30,14 +30,14 @@ import {
30
30
  VisualDocsSnippet,
31
31
  VoiceWaveform,
32
32
  catalog
33
- } from "../chunk-VLJOIUHL.js";
33
+ } from "../chunk-B3GSTQLR.js";
34
+ import "../chunk-LT4PWSR2.js";
35
+ import "../chunk-FWSJLHSV.js";
36
+ import "../chunk-XHGZ2E77.js";
34
37
  import {
35
38
  DashboardPopulate
36
39
  } from "../chunk-S5H6GH6M.js";
37
40
  import "../chunk-QAGGJHAF.js";
38
- import "../chunk-LT4PWSR2.js";
39
- import "../chunk-FWSJLHSV.js";
40
- import "../chunk-XHGZ2E77.js";
41
41
  import "../chunk-W2245F6G.js";
42
42
  import "../chunk-2ESYSVXG.js";
43
43
  export {
@@ -1,43 +1,43 @@
1
+ import {
2
+ catalog
3
+ } from "./chunk-RBWS5XHE.js";
4
+ import "./chunk-DLF4WVSE.js";
5
+ import "./chunk-U4V4FZGE.js";
6
+ import {
7
+ catalog as catalog3
8
+ } from "./chunk-FVDFPJHT.js";
1
9
  import {
2
10
  catalog as catalog6
3
- } from "./chunk-VLJOIUHL.js";
11
+ } from "./chunk-B3GSTQLR.js";
12
+ import {
13
+ catalog as catalog5
14
+ } from "./chunk-RAXHCRVV.js";
4
15
  import {
5
16
  catalog as catalog2
6
- } from "./chunk-GAACUQAB.js";
17
+ } from "./chunk-SQ4XTSIN.js";
7
18
  import {
8
19
  catalog as catalog8
9
- } from "./chunk-7SQOXIWR.js";
20
+ } from "./chunk-RL5SO653.js";
21
+ import "./chunk-LT4PWSR2.js";
22
+ import "./chunk-FWSJLHSV.js";
23
+ import "./chunk-ZFEXATWN.js";
10
24
  import {
11
25
  catalog as catalog4
12
- } from "./chunk-CR3G2JQP.js";
26
+ } from "./chunk-PTVTWQ4T.js";
27
+ import "./chunk-XHGZ2E77.js";
13
28
  import {
14
29
  catalog as catalog7
15
- } from "./chunk-C6ONUJIO.js";
30
+ } from "./chunk-UKDBU7HM.js";
31
+ import "./chunk-QGAWDLYX.js";
16
32
  import "./chunk-S5H6GH6M.js";
17
33
  import "./chunk-QAGGJHAF.js";
18
34
  import "./chunk-MFHXCHRI.js";
19
- import {
20
- catalog
21
- } from "./chunk-X34KW2SL.js";
22
- import "./chunk-DLF4WVSE.js";
23
- import "./chunk-U4V4FZGE.js";
24
- import "./chunk-LT4PWSR2.js";
25
- import "./chunk-FWSJLHSV.js";
26
- import {
27
- catalog as catalog3
28
- } from "./chunk-FVDFPJHT.js";
29
- import "./chunk-QGAWDLYX.js";
30
- import {
31
- catalog as catalog5
32
- } from "./chunk-RAXHCRVV.js";
33
- import "./chunk-XHGZ2E77.js";
34
- import "./chunk-ZFEXATWN.js";
35
35
  import "./chunk-W2245F6G.js";
36
- import "./chunk-D5E5XFHK.js";
36
+ import "./chunk-FHMTAZD4.js";
37
37
  import "./chunk-XV2K3AQT.js";
38
38
  import "./chunk-CL5Y6V6K.js";
39
39
  import "./chunk-2L7PYYJK.js";
40
- import "./chunk-7RGDRDAR.js";
40
+ import "./chunk-OOL7ZUG7.js";
41
41
  import "./chunk-2ESYSVXG.js";
42
42
 
43
43
  // ../execution/primitives/src/index.ts
@@ -2,9 +2,9 @@ import {
2
2
  assertCardFontsAdmitted,
3
3
  cardBundledFamilies,
4
4
  cardFontFamilyStacks
5
- } from "../chunk-UKKY7HWN.js";
5
+ } from "../chunk-BDFAA747.js";
6
6
  import "../chunk-E63UEO5C.js";
7
- import "../chunk-7RGDRDAR.js";
7
+ import "../chunk-OOL7ZUG7.js";
8
8
  import "../chunk-2ESYSVXG.js";
9
9
  export {
10
10
  assertCardFontsAdmitted,
@@ -1,9 +1,3 @@
1
- import {
2
- assertCardHtmlAssetFree
3
- } from "./chunk-DV7ZFVL4.js";
4
- import {
5
- assertCardFontsAdmitted
6
- } from "./chunk-UKKY7HWN.js";
7
1
  import {
8
2
  assertNoRemoteRefs,
9
3
  assetSlots,
@@ -11,8 +5,14 @@ import {
11
5
  isRemoteUrl,
12
6
  renderInputAssets
13
7
  } from "./chunk-KSRFYFUZ.js";
8
+ import {
9
+ assertCardHtmlAssetFree
10
+ } from "./chunk-DV7ZFVL4.js";
14
11
  import "./chunk-OSMXQV5V.js";
15
- import "./chunk-2BVKNYRB.js";
12
+ import {
13
+ assertCardFontsAdmitted
14
+ } from "./chunk-BDFAA747.js";
15
+ import "./chunk-BEFSJMFF.js";
16
16
  import "./chunk-BVA3537Z.js";
17
17
  import {
18
18
  COMPONENT_STILL_RUNTIME_IDENTITY,
@@ -23,7 +23,7 @@ import {
23
23
  readMaterializedComponentSource,
24
24
  resolveRenderEntryRoot,
25
25
  verifyLocalStagedBrowser
26
- } from "./chunk-AONWKKXK.js";
26
+ } from "./chunk-HGCYZMII.js";
27
27
  import "./chunk-WB2VFDQZ.js";
28
28
  import {
29
29
  sourceVersionId
@@ -46,15 +46,15 @@ import {
46
46
  parseSceneComponentCaptureIntentV1,
47
47
  prepareSceneShotRenderInput,
48
48
  readSceneShotManifest
49
- } from "./chunk-LPUQTBKU.js";
49
+ } from "./chunk-EYQMFL53.js";
50
50
  import "./chunk-QH3YI3ND.js";
51
- import "./chunk-JPMVNMF3.js";
52
51
  import "./chunk-IMIUHG2E.js";
53
52
  import "./chunk-VZ7TYX6Z.js";
53
+ import "./chunk-JPMVNMF3.js";
54
54
  import "./chunk-T56BK7NS.js";
55
55
  import "./chunk-KYRDKK2D.js";
56
- import "./chunk-G7ZSFSQG.js";
57
- import "./chunk-RMLGMYEJ.js";
56
+ import "./chunk-FOST4XYJ.js";
57
+ import "./chunk-TLOYCCCI.js";
58
58
  import "./chunk-WREYUH2E.js";
59
59
  import "./chunk-ILO4NEZ3.js";
60
60
  import {
@@ -69,7 +69,7 @@ import {
69
69
  sceneCameraPlanesV2
70
70
  } from "./chunk-CL5Y6V6K.js";
71
71
  import "./chunk-2L7PYYJK.js";
72
- import "./chunk-7RGDRDAR.js";
72
+ import "./chunk-OOL7ZUG7.js";
73
73
  import "./chunk-2ESYSVXG.js";
74
74
 
75
75
  // ../execution/render-harness/src/materializeSources.ts