@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,4 +1,6 @@
1
1
  import type { TextMarker } from './spec.js';
2
+ /** Stable, fully closed circle or bounded underline; independent of render frame/order. */
3
+ export declare function pencilMarkerPaths(kind: TextMarker['kind'], seed?: string | number): string[];
2
4
  export declare function Marker({ spec, progress }: {
3
5
  spec: TextMarker;
4
6
  progress: number;
@@ -5,6 +5,9 @@ export interface TextRecolor {
5
5
  export interface TextMarker {
6
6
  kind: 'circle' | 'underline';
7
7
  color: string;
8
+ strokeWidth?: number;
9
+ texture?: 'clean' | 'pencil';
10
+ seed?: string | number;
8
11
  }
9
12
  export interface TextPlate {
10
13
  color: string;
package/dist/animate.js CHANGED
@@ -102,7 +102,7 @@ import {
102
102
  useStage,
103
103
  weightsAt,
104
104
  worldTransform
105
- } from "./chunk-D5E5XFHK.js";
105
+ } from "./chunk-FHMTAZD4.js";
106
106
  import {
107
107
  DEFAULT_LIGHTING_PROFILE,
108
108
  DEVICE_GLASS_OPACITY_ENCODED,
@@ -185,7 +185,7 @@ import {
185
185
  selectSceneBakeScale
186
186
  } from "./chunk-CL5Y6V6K.js";
187
187
  import "./chunk-2L7PYYJK.js";
188
- import "./chunk-7RGDRDAR.js";
188
+ import "./chunk-OOL7ZUG7.js";
189
189
  import "./chunk-2ESYSVXG.js";
190
190
  export {
191
191
  ALLOWED_BAKE_SCALES,
@@ -4,19 +4,19 @@ import {
4
4
  buildPlannerTools,
5
5
  buildToolsFromSchemas,
6
6
  extractProviderError
7
- } from "../chunk-5E4YP44R.js";
8
- import "../chunk-4DM63RTI.js";
7
+ } from "../chunk-E2LKX6C4.js";
8
+ import "../chunk-EGIVPZCJ.js";
9
9
  import "../chunk-JOURGVOR.js";
10
10
  import "../chunk-7AZLFN26.js";
11
- import "../chunk-TPKPU4PE.js";
12
- import "../chunk-CJMUTCJW.js";
13
- import "../chunk-UFNIB3JL.js";
11
+ import "../chunk-LBJ5LI5V.js";
12
+ import "../chunk-VDNMCD6S.js";
13
+ import "../chunk-UFD4EZHM.js";
14
14
  import "../chunk-WPZKOVYF.js";
15
15
  import "../chunk-B7J5UUUV.js";
16
16
  import "../chunk-KYRDKK2D.js";
17
17
  import "../chunk-WREYUH2E.js";
18
18
  import "../chunk-7PA7FGLD.js";
19
- import "../chunk-7RGDRDAR.js";
19
+ import "../chunk-OOL7ZUG7.js";
20
20
  import "../chunk-2ESYSVXG.js";
21
21
  export {
22
22
  ZERO_USAGE,
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  buildDirectorContext
3
- } from "../chunk-ZIPGDGBR.js";
4
- import "../chunk-TPKPU4PE.js";
5
- import "../chunk-CJMUTCJW.js";
6
- import "../chunk-UFNIB3JL.js";
3
+ } from "../chunk-UMXES6ED.js";
4
+ import "../chunk-LBJ5LI5V.js";
5
+ import "../chunk-VDNMCD6S.js";
6
+ import "../chunk-UFD4EZHM.js";
7
7
  import "../chunk-WPZKOVYF.js";
8
8
  import "../chunk-B7J5UUUV.js";
9
9
  import "../chunk-KYRDKK2D.js";
10
10
  import "../chunk-WREYUH2E.js";
11
- import "../chunk-7RGDRDAR.js";
11
+ import "../chunk-OOL7ZUG7.js";
12
12
  import "../chunk-2ESYSVXG.js";
13
13
  export {
14
14
  buildDirectorContext
@@ -6,18 +6,18 @@ import {
6
6
  COMPOSE_ROLE_TOOLS,
7
7
  COMPOSE_ROLE_TOOL_NAMES,
8
8
  dispatchComposeRoleTool
9
- } from "../chunk-4DM63RTI.js";
9
+ } from "../chunk-EGIVPZCJ.js";
10
10
  import "../chunk-JOURGVOR.js";
11
11
  import "../chunk-7AZLFN26.js";
12
- import "../chunk-TPKPU4PE.js";
13
- import "../chunk-CJMUTCJW.js";
14
- import "../chunk-UFNIB3JL.js";
12
+ import "../chunk-LBJ5LI5V.js";
13
+ import "../chunk-VDNMCD6S.js";
14
+ import "../chunk-UFD4EZHM.js";
15
15
  import "../chunk-WPZKOVYF.js";
16
16
  import "../chunk-B7J5UUUV.js";
17
17
  import "../chunk-KYRDKK2D.js";
18
18
  import "../chunk-WREYUH2E.js";
19
19
  import "../chunk-7PA7FGLD.js";
20
- import "../chunk-7RGDRDAR.js";
20
+ import "../chunk-OOL7ZUG7.js";
21
21
  import "../chunk-2ESYSVXG.js";
22
22
  export {
23
23
  COMPOSE_MOTION_TOOLS,
package/dist/authoring.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  buildPlannerTools,
12
12
  buildToolsFromSchemas,
13
13
  extractProviderError
14
- } from "./chunk-5E4YP44R.js";
14
+ } from "./chunk-E2LKX6C4.js";
15
15
  import {
16
16
  COMPOSE_MOTION_TOOLS,
17
17
  COMPOSE_MOTION_VERIFY_TOOLS,
@@ -20,14 +20,14 @@ import {
20
20
  COMPOSE_ROLE_TOOLS,
21
21
  COMPOSE_ROLE_TOOL_NAMES,
22
22
  dispatchComposeRoleTool
23
- } from "./chunk-4DM63RTI.js";
23
+ } from "./chunk-EGIVPZCJ.js";
24
24
  import {
25
25
  AgentFixableCaptureError,
26
26
  getExcludedTools
27
27
  } from "./chunk-JOURGVOR.js";
28
28
  import {
29
29
  buildDirectorContext
30
- } from "./chunk-ZIPGDGBR.js";
30
+ } from "./chunk-UMXES6ED.js";
31
31
  import {
32
32
  buildFastModel,
33
33
  buildModel,
@@ -49,16 +49,16 @@ import {
49
49
  initCodeGenPrompts
50
50
  } from "./chunk-Y4HPN4BC.js";
51
51
  import "./chunk-7AZLFN26.js";
52
- import "./chunk-TPKPU4PE.js";
53
- import "./chunk-CJMUTCJW.js";
54
- import "./chunk-UFNIB3JL.js";
52
+ import "./chunk-LBJ5LI5V.js";
53
+ import "./chunk-VDNMCD6S.js";
54
+ import "./chunk-UFD4EZHM.js";
55
55
  import "./chunk-WPZKOVYF.js";
56
56
  import "./chunk-B7J5UUUV.js";
57
57
  import "./chunk-KYRDKK2D.js";
58
- import "./chunk-G7ZSFSQG.js";
58
+ import "./chunk-FOST4XYJ.js";
59
59
  import {
60
60
  cssLayoutVars
61
- } from "./chunk-RMLGMYEJ.js";
61
+ } from "./chunk-TLOYCCCI.js";
62
62
  import "./chunk-WREYUH2E.js";
63
63
  import "./chunk-ILO4NEZ3.js";
64
64
  import "./chunk-E63UEO5C.js";
@@ -69,7 +69,7 @@ import {
69
69
  isSceneShotClip
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
  // ../authoring/src/agent.ts
@@ -0,0 +1,76 @@
1
+ import {
2
+ SeededPRNG
3
+ } from "./chunk-GULDS3VE.js";
4
+
5
+ // ../execution/primitives/src/lib/text/marker.tsx
6
+ var CLEAN_UNDERLINE = "M 3,82 C 26,90 56,92 97,76";
7
+ var CLEAN_CIRCLE = "M 13,52 C 9,28 35,12 57,13 C 83,14 96,30 93,52 C 90,73 67,88 45,86 C 25,84 8,72 11,52 C 12,45 16,37 21,33";
8
+ function hashSeed(seed) {
9
+ let hash = 2166136261;
10
+ for (const char of String(seed)) {
11
+ hash ^= char.charCodeAt(0);
12
+ hash = Math.imul(hash, 16777619);
13
+ }
14
+ return hash >>> 0 || 1;
15
+ }
16
+ function pencilMarkerPaths(kind, seed = kind) {
17
+ return [0, 1, 2].map((layer) => {
18
+ const random = new SeededPRNG(hashSeed(`${seed}:${kind}:${layer}`));
19
+ if (kind === "underline") {
20
+ const points2 = Array.from({ length: 49 }, (_, index) => {
21
+ const t = index / 48;
22
+ const x = 3 + 94 * t;
23
+ const y = 82 + 8 * Math.sin(Math.PI * t) - 6 * t + (random.next() - 0.5) * 2.8;
24
+ return `${index ? "L" : "M"} ${x.toFixed(2)},${y.toFixed(2)}`;
25
+ });
26
+ return points2.join(" ");
27
+ }
28
+ const points = Array.from({ length: 96 }, (_, index) => {
29
+ const angle = -Math.PI / 2 + index * Math.PI * 2 / 96;
30
+ const jitter = (random.next() - 0.5) * 2.8;
31
+ const x = 52 + Math.cos(angle) * (41 + jitter);
32
+ const y = 50 + Math.sin(angle) * (36 + jitter);
33
+ return `${index ? "L" : "M"} ${x.toFixed(2)},${y.toFixed(2)}`;
34
+ });
35
+ return `${points.join(" ")} Z`;
36
+ });
37
+ }
38
+ function Marker({ spec, progress }) {
39
+ const p = Math.max(0, Math.min(1, progress));
40
+ const strokeWidth = spec.strokeWidth ?? 4;
41
+ const pencil = spec.texture === "pencil";
42
+ const grainSeed = hashSeed(spec.seed ?? spec.kind);
43
+ const grainId = `marker-grain-${grainSeed.toString(16)}-${spec.kind}`;
44
+ const paths = pencil ? pencilMarkerPaths(spec.kind, spec.seed ?? spec.kind) : [spec.kind === "underline" ? CLEAN_UNDERLINE : CLEAN_CIRCLE];
45
+ return /* @__PURE__ */ React.createElement(
46
+ "svg",
47
+ {
48
+ viewBox: "0 0 100 100",
49
+ preserveAspectRatio: "none",
50
+ style: { position: "absolute", left: "-7%", top: "-26%", width: "114%", height: "156%", overflow: "visible", pointerEvents: "none" }
51
+ },
52
+ pencil && /* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("filter", { id: grainId, x: "0", y: "0", width: "100", height: "100", filterUnits: "userSpaceOnUse", primitiveUnits: "userSpaceOnUse", colorInterpolationFilters: "sRGB" }, /* @__PURE__ */ React.createElement("feTurbulence", { type: "fractalNoise", baseFrequency: "0.65", numOctaves: 2, seed: grainSeed % 1e5, result: "noise" }), /* @__PURE__ */ React.createElement("feColorMatrix", { in: "noise", type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.6 0 0 0 -0.8", result: "grain" }), /* @__PURE__ */ React.createElement("feComposite", { in: "SourceGraphic", in2: "grain", operator: "in" }))),
53
+ paths.map((path, index) => /* @__PURE__ */ React.createElement(
54
+ "path",
55
+ {
56
+ key: index,
57
+ d: path,
58
+ fill: "none",
59
+ stroke: spec.color,
60
+ strokeWidth: pencil ? strokeWidth * [0.72, 0.3, 0.24][index] : strokeWidth,
61
+ strokeOpacity: pencil ? [0.85, 0.45, 0.35][index] : void 0,
62
+ filter: pencil ? `url(#${grainId})` : void 0,
63
+ strokeLinecap: "round",
64
+ strokeLinejoin: "round",
65
+ pathLength: 1,
66
+ strokeDasharray: 1,
67
+ strokeDashoffset: 1 - p
68
+ }
69
+ ))
70
+ );
71
+ }
72
+
73
+ export {
74
+ pencilMarkerPaths,
75
+ Marker
76
+ };
@@ -5,7 +5,7 @@ import {
5
5
  bundledFontFamilyFaces,
6
6
  isGenericOnlyStack,
7
7
  parseFontStack
8
- } from "./chunk-7RGDRDAR.js";
8
+ } from "./chunk-OOL7ZUG7.js";
9
9
 
10
10
  // ../execution/render-harness/src/cardFonts.ts
11
11
  import parseCss from "css-tree/parser";
@@ -3,7 +3,7 @@ import {
3
3
  assertSceneShotParamsAdmitted,
4
4
  materializeComponentSource,
5
5
  renderComponentAlpha
6
- } from "./chunk-AONWKKXK.js";
6
+ } from "./chunk-HGCYZMII.js";
7
7
  import {
8
8
  componentArtifactId,
9
9
  componentBundleId,
@@ -2,7 +2,7 @@ import {
2
2
  COMPOSE_PLANNER_TOOLS,
3
3
  COMPOSE_ROLE_TOOLS,
4
4
  dispatchComposeRoleTool
5
- } from "./chunk-4DM63RTI.js";
5
+ } from "./chunk-EGIVPZCJ.js";
6
6
 
7
7
  // ../authoring/src/agent/buildTools.ts
8
8
  import { tool } from "ai";
@@ -7,13 +7,13 @@ import {
7
7
  } from "./chunk-7AZLFN26.js";
8
8
  import {
9
9
  selectAllOverlays
10
- } from "./chunk-TPKPU4PE.js";
10
+ } from "./chunk-LBJ5LI5V.js";
11
11
  import {
12
12
  ComposePlan
13
- } from "./chunk-CJMUTCJW.js";
13
+ } from "./chunk-VDNMCD6S.js";
14
14
  import {
15
15
  OverlayClipSource
16
- } from "./chunk-UFNIB3JL.js";
16
+ } from "./chunk-UFD4EZHM.js";
17
17
 
18
18
  // ../authoring/src/tools/toolSets.ts
19
19
  var COMPOSE_PLANNER_TOOLS = [
@@ -63,7 +63,7 @@ var COMPOSE_ROLE_TOOLS = Object.freeze({
63
63
  schema: z.object({}),
64
64
  metadata: { label: "Get Context" },
65
65
  handler: async (_args, capabilities) => {
66
- const { buildDirectorContext } = await import("./context-UAS5WJRB.js");
66
+ const { buildDirectorContext } = await import("./context-O2HHUVSA.js");
67
67
  return buildDirectorContext(capabilities);
68
68
  }
69
69
  },
@@ -3,6 +3,14 @@ import {
3
3
  buildEasedZooms,
4
4
  buildPannedCenters
5
5
  } from "./chunk-QH3YI3ND.js";
6
+ import {
7
+ flattenCompoundClips,
8
+ hasCompoundClips
9
+ } from "./chunk-IMIUHG2E.js";
10
+ import {
11
+ compositionHasVo,
12
+ roleDefaultGainDb
13
+ } from "./chunk-VZ7TYX6Z.js";
6
14
  import {
7
15
  DOMINANCE_WEIGHTS,
8
16
  ENTER_SEC,
@@ -21,17 +29,9 @@ import {
21
29
  segmentShots,
22
30
  stabilizeSelectionHysteresis
23
31
  } from "./chunk-JPMVNMF3.js";
24
- import {
25
- flattenCompoundClips,
26
- hasCompoundClips
27
- } from "./chunk-IMIUHG2E.js";
28
- import {
29
- compositionHasVo,
30
- roleDefaultGainDb
31
- } from "./chunk-VZ7TYX6Z.js";
32
32
  import {
33
33
  resolveBrandRef
34
- } from "./chunk-RMLGMYEJ.js";
34
+ } from "./chunk-TLOYCCCI.js";
35
35
  import {
36
36
  SHOT_SCALE_TARGET,
37
37
  shotScaleZoom
@@ -64,7 +64,7 @@ import {
64
64
  bundledFontFaceExists,
65
65
  mergedCaptionFaceIssues,
66
66
  unrenderableFaceField
67
- } from "./chunk-7RGDRDAR.js";
67
+ } from "./chunk-OOL7ZUG7.js";
68
68
 
69
69
  // ../execution/core/src/render/sceneCaptureIdentity.ts
70
70
  var INTENT_FIELDS = [
@@ -1283,6 +1283,11 @@ function coversLowerPictures(upper, lower, output, effects) {
1283
1283
  return upperRect.left <= rect.left + epsilon && upperRect.top <= rect.top + epsilon && upperRect.right + epsilon >= rect.right && upperRect.bottom + epsilon >= rect.bottom;
1284
1284
  });
1285
1285
  }
1286
+ function explicitlyHidesCaptions(clip, effects) {
1287
+ if (!clip || clip.captionVisibility !== "hidden" || clip.mediaType === "image") return false;
1288
+ const region = clip.region;
1289
+ return !!region && region.x === 0 && region.y === 0 && region.w === 1 && region.h === 1 && (clip.opacity ?? 1) === 1 && (clip.scale ?? 1) === 1 && (clip.rotation ?? 0) === 0 && !clip.animate && !clip.cropTrajectory && !clip.cropTrajectoryUrl && !clip.hasCropIntent && !hasClipEffect(clip, effects) && !clip.hasTransition && (!clip.transitionIn || clip.transitionIn === "none");
1290
+ }
1286
1291
  function visiblePackedHostWindows(clips, startFrame, endFrame, output, effects = [], hostMode = "packed-only") {
1287
1292
  if (endFrame <= startFrame) return [];
1288
1293
  const boundaries = /* @__PURE__ */ new Set([startFrame, endFrame]);
@@ -1318,7 +1323,7 @@ function visiblePackedHostWindows(clips, startFrame, endFrame, output, effects =
1318
1323
  effects
1319
1324
  ));
1320
1325
  const suppressesCaption = provesOcclusion && !globalEffectActive && pictureRect(top[0], output, effects) !== void 0;
1321
- const captionVisible = !(suppressesCaption && top[0].captionVisibility === "hidden");
1326
+ const captionVisible = !(top.length === 1 && !globalEffectActive && (suppressesCaption && top[0].captionVisibility === "hidden" || explicitlyHidesCaptions(top[0], effects)));
1322
1327
  const candidateHost = (clip) => hostMode === "all-video-candidates" ? clip.mediaType !== "image" : !!clip.packedUrl;
1323
1328
  const host = provesOcclusion && candidateHost(top[0]) ? top[0] : void 0;
1324
1329
  const unresolvedOverlap = top.length > 1 || top.length === 1 && active.length > 1 && !provesOcclusion;
@@ -1890,6 +1895,11 @@ function captionVisibilityWindowsForComposition(composition, sourceDimensions) {
1890
1895
  ...item.region ? { region: item.region } : {},
1891
1896
  ...item.fit ? { fit: item.fit } : {},
1892
1897
  ...track.kind === "video" && item.captionVisibility ? { captionVisibility: item.captionVisibility } : {},
1898
+ ...item.opacity !== void 0 ? { opacity: item.opacity } : {},
1899
+ ...item.scale !== void 0 ? { scale: item.scale } : {},
1900
+ ...item.rotation !== void 0 ? { rotation: item.rotation } : {},
1901
+ ...item.animate !== void 0 ? { animate: item.animate } : {},
1902
+ ...spanIndex === 0 && item.transitionIn?.type !== void 0 && item.transitionIn.type !== "cut" && item.transitionIn.type !== "none" ? { hasTransition: true } : {},
1893
1903
  ...item.source.reframe?.segments.length ? { hasCropIntent: true } : {},
1894
1904
  ...item.effects?.length ? { hasClipEffects: true } : {}
1895
1905
  });
@@ -34,7 +34,7 @@ import {
34
34
  } from "./chunk-CL5Y6V6K.js";
35
35
  import {
36
36
  resolveCaptionFaces
37
- } from "./chunk-7RGDRDAR.js";
37
+ } from "./chunk-OOL7ZUG7.js";
38
38
 
39
39
  // ../execution/animate/src/easing/smooth.ts
40
40
  var sigmoid = (x) => 1 / (1 + Math.exp(-x));
@@ -2,7 +2,7 @@ import {
2
2
  activeFaceKeepOutSeries,
3
3
  boundingBox,
4
4
  resolveBrandRefsDeep
5
- } from "./chunk-RMLGMYEJ.js";
5
+ } from "./chunk-TLOYCCCI.js";
6
6
  import {
7
7
  CueframeError,
8
8
  encodeError
@@ -31,7 +31,7 @@ import {
31
31
  } from "./chunk-CL5Y6V6K.js";
32
32
  import {
33
33
  BUNDLED_FONT_FACES
34
- } from "./chunk-7RGDRDAR.js";
34
+ } from "./chunk-OOL7ZUG7.js";
35
35
 
36
36
  // ../execution/component-runtime/src/sceneAdmission.ts
37
37
  import { ZodError } from "zod";
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  Composition
3
- } from "./chunk-UFNIB3JL.js";
3
+ } from "./chunk-UFD4EZHM.js";
4
4
  import {
5
5
  expandToLinkGroup
6
6
  } from "./chunk-KYRDKK2D.js";
7
7
 
8
8
  // ../composition/src/ops/compositionOps.shared.ts
9
+ var TIMELINE_BOUNDARY_EPSILON_SECONDS = 1e-9;
9
10
  function findOrCreateTrackByKind(composition, kind) {
10
11
  const existing = composition.tracks.find((t) => t.kind === kind);
11
12
  if (existing) return existing;
@@ -67,8 +68,8 @@ function trimSourceFor(source, clipRelStart, clipRelEnd, clipDuration) {
67
68
  for (let i = 0; i < playable.length; i++) {
68
69
  const span = playable[i];
69
70
  const length = span.end - span.start;
70
- if (remaining < length - 1e-9) return span.start + remaining;
71
- if (Math.abs(remaining - length) <= 1e-9) {
71
+ if (remaining < length - TIMELINE_BOUNDARY_EPSILON_SECONDS) return span.start + remaining;
72
+ if (Math.abs(remaining - length) <= TIMELINE_BOUNDARY_EPSILON_SECONDS) {
72
73
  return edge === "start" && playable[i + 1] ? playable[i + 1].start : span.end;
73
74
  }
74
75
  remaining -= length;
@@ -508,20 +509,20 @@ function createCompositionOps(get, set) {
508
509
  const c = item;
509
510
  const cs = c.startTime;
510
511
  const ce = c.startTime + c.duration;
511
- if (ce <= start) {
512
+ if (ce <= start + TIMELINE_BOUNDARY_EPSILON_SECONDS) {
512
513
  next.push(c);
513
514
  continue;
514
515
  }
515
- if (cs >= end) {
516
+ if (cs >= end - TIMELINE_BOUNDARY_EPSILON_SECONDS) {
516
517
  next.push({ ...c, startTime: Math.max(0, cs - span) });
517
518
  continue;
518
519
  }
519
- if (cs < start) {
520
+ if (cs < start - TIMELINE_BOUNDARY_EPSILON_SECONDS) {
520
521
  const leftDuration = start - cs;
521
522
  const leftSource = trimSourceFor(c.source, 0, leftDuration, c.duration);
522
523
  next.push({ ...c, id: c.id, duration: leftDuration, source: leftSource });
523
524
  }
524
- if (ce > end) {
525
+ if (ce > end + TIMELINE_BOUNDARY_EPSILON_SECONDS) {
525
526
  const rightDuration = ce - end;
526
527
  const sourceOffsetIntoOriginal = end - cs;
527
528
  const rightSource = trimSourceFor(
@@ -1,16 +1,16 @@
1
- import {
2
- SCENE_SHOT_RESOURCE_DESCRIPTION,
3
- SCENE_SHOT_RESOURCE_URI,
4
- sceneShotContract
5
- } from "./chunk-7AUHC2X7.js";
6
1
  import {
7
2
  querySchemaShape,
8
3
  serializeQuery,
9
4
  waitForJob
10
- } from "./chunk-ZFW35DLG.js";
5
+ } from "./chunk-VYSBZUXZ.js";
11
6
  import {
12
7
  CURATED_TOOLS
13
8
  } from "./chunk-4WBSXHQA.js";
9
+ import {
10
+ SCENE_SHOT_RESOURCE_DESCRIPTION,
11
+ SCENE_SHOT_RESOURCE_URI,
12
+ sceneShotContract
13
+ } from "./chunk-ZDE5S3DE.js";
14
14
  import {
15
15
  GENERATED_OPERATIONS,
16
16
  apiErrorFrom,
@@ -28,10 +28,10 @@ import {
28
28
  text,
29
29
  textWithData,
30
30
  withMedia
31
- } from "./chunk-46DGDPXR.js";
31
+ } from "./chunk-V6GL37RZ.js";
32
32
  import {
33
33
  CompositionOp
34
- } from "./chunk-VTM7NEJC.js";
34
+ } from "./chunk-VZOAELFF.js";
35
35
 
36
36
  // ../mcp/src/prompts.ts
37
37
  var skillListCache = null;
@@ -41,7 +41,7 @@ var BUNDLED_FONT_FACES = Object.freeze({
41
41
  },
42
42
  "Playfair Display": {
43
43
  slug: "playfair-display",
44
- faces: [{ weight: "400 900", file: "400" }],
44
+ faces: [{ weight: "400 900", file: "400" }, { weight: "400 900", file: "400-italic", style: "italic" }],
45
45
  captionDefaults: { base: 600, emphasis: 800 }
46
46
  },
47
47
  "Bricolage Grotesque": {
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-W2245F6G.js";
25
25
  import {
26
26
  FlexLayout
27
- } from "./chunk-D5E5XFHK.js";
27
+ } from "./chunk-FHMTAZD4.js";
28
28
 
29
29
  // ../execution/primitives/src/layouts/chat-to-preview-layout/index.tsx
30
30
  import { Easing, interpolate, useCurrentFrame, useVideoConfig } from "remotion";
@@ -1,9 +1,9 @@
1
- import {
2
- EASING_BY_INTENT
3
- } from "./chunk-MFHXCHRI.js";
4
1
  import {
5
2
  FitText
6
3
  } from "./chunk-XHGZ2E77.js";
4
+ import {
5
+ EASING_BY_INTENT
6
+ } from "./chunk-MFHXCHRI.js";
7
7
  import {
8
8
  ACCENT,
9
9
  ACCENT_STRONG,
@@ -26,7 +26,7 @@ import {
26
26
  perspectiveFor,
27
27
  resolveCamera,
28
28
  useStage
29
- } from "./chunk-D5E5XFHK.js";
29
+ } from "./chunk-FHMTAZD4.js";
30
30
 
31
31
  // ../execution/primitives/src/effects/blur/index.tsx
32
32
  import React2 from "react";
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  captionFontSource,
12
12
  effectiveCaptionFamily
13
- } from "./chunk-7RGDRDAR.js";
13
+ } from "./chunk-OOL7ZUG7.js";
14
14
 
15
15
  // ../composition/src/projection/brandKit.ts
16
16
  var LOGO_DEFAULT_PLACEMENT = "br";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-B7J5UUUV.js";
4
4
  import {
5
5
  captionFaceIssues
6
- } from "./chunk-7RGDRDAR.js";
6
+ } from "./chunk-OOL7ZUG7.js";
7
7
 
8
8
  // ../composition/src/validators/opaqueId.ts
9
9
  import { z } from "zod";
@@ -170,7 +170,7 @@ var TimelineClip = z2.object({
170
170
  region: Region.optional(),
171
171
  fit: ClipFit.optional(),
172
172
  captionVisibility: CaptionVisibility.optional().describe(
173
- "Video media clip only. Hide native captions while this clip is the visible full-frame picture; caption words and timings remain stored and resume when another visible clip takes over."
173
+ "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over."
174
174
  ),
175
175
  effects: z2.array(PerClipEffect).optional(),
176
176
  transitionIn: Transition.optional(),
@@ -267,6 +267,9 @@ var CaptionStyle = z2.object({
267
267
  "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height."
268
268
  ),
269
269
  textTransform: z2.enum(["none", "uppercase", "capitalize"]).optional(),
270
+ letterSpacing: z2.number().min(-5).max(20).optional().describe("Base caption glyph spacing in pixels."),
271
+ wordGapEm: z2.number().min(0).max(2).optional().describe("Gap between caption runs as a multiple of base font size; default 0.35."),
272
+ lineGapEm: z2.number().min(0).max(2).optional().describe("Gap between caption lines as a multiple of base font size; default 0.25."),
270
273
  emphasisColor: z2.string().optional(),
271
274
  emphasisGradient: z2.string().optional(),
272
275
  emphasisScale: z2.number().positive().optional(),
@@ -287,7 +290,10 @@ var CaptionStyle = z2.object({
287
290
  emphasisPlateRadius: z2.number().nonnegative().optional(),
288
291
  emphasisPlatePadX: z2.number().optional(),
289
292
  emphasisPlatePadY: z2.number().optional(),
293
+ emphasisPlateReveal: z2.boolean().optional().describe("Grow a shared emphasis plate as saved words appear while reserving its final layout width."),
290
294
  annotationColor: z2.string().optional(),
295
+ annotationStrokeWidth: z2.number().min(0.5).max(12).optional().describe("Annotation stroke width in its 100\xD7100 SVG coordinate system; default 4."),
296
+ annotationTexture: z2.enum(["clean", "pencil"]).optional().describe("Native annotation stroke finish; default clean."),
291
297
  maxWidthPercent: z2.number().positive().max(100, "captions style.maxWidthPercent is % of composition width (max 100)").optional()
292
298
  });
293
299
  var CaptionLayoutStyle = CaptionStyle.pick({
@@ -299,6 +305,9 @@ var CaptionLayoutStyle = CaptionStyle.pick({
299
305
  backgroundColor: true,
300
306
  plate: true,
301
307
  textTransform: true,
308
+ letterSpacing: true,
309
+ wordGapEm: true,
310
+ lineGapEm: true,
302
311
  emphasisColor: true,
303
312
  emphasisScale: true,
304
313
  emphasisFontFamily: true,
@@ -314,7 +323,10 @@ var CaptionLayoutStyle = CaptionStyle.pick({
314
323
  emphasisPlateRadius: true,
315
324
  emphasisPlatePadX: true,
316
325
  emphasisPlatePadY: true,
326
+ emphasisPlateReveal: true,
317
327
  annotationColor: true,
328
+ annotationStrokeWidth: true,
329
+ annotationTexture: true,
318
330
  entrance: true,
319
331
  entranceMs: true,
320
332
  entranceStaggerMs: true,
@@ -1,3 +1,7 @@
1
+ import {
2
+ frostedGlassWipe,
3
+ spatialPush
4
+ } from "./chunk-QGAWDLYX.js";
1
5
  import {
2
6
  DashboardPopulate
3
7
  } from "./chunk-S5H6GH6M.js";
@@ -7,10 +11,6 @@ import {
7
11
  import {
8
12
  EASING_BY_INTENT
9
13
  } from "./chunk-MFHXCHRI.js";
10
- import {
11
- frostedGlassWipe,
12
- spatialPush
13
- } from "./chunk-QGAWDLYX.js";
14
14
  import {
15
15
  ACCENT,
16
16
  ACCENT_SOFT,
@@ -43,7 +43,7 @@ import {
43
43
  makeDefaultScreenTexture,
44
44
  resolveCamera,
45
45
  useImageTexture
46
- } from "./chunk-D5E5XFHK.js";
46
+ } from "./chunk-FHMTAZD4.js";
47
47
  import {
48
48
  DEVICE_GLASS_OPACITY_ENCODED,
49
49
  DeviceMesh,
@@ -2,7 +2,7 @@ import {
2
2
  selectAllClips,
3
3
  selectAllOverlays,
4
4
  selectSceneMarkers
5
- } from "./chunk-TPKPU4PE.js";
5
+ } from "./chunk-LBJ5LI5V.js";
6
6
 
7
7
  // ../authoring/src/context/transcript.ts
8
8
  var MAX_TRANSCRIPT_CHARS = 6e4;