@nodaro/shared 3.4.0 → 3.6.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.
package/dist/index.cjs CHANGED
@@ -4945,6 +4945,63 @@ function assembleNarratedVideoCredits(blockCount) {
4945
4945
  return 3 + Math.ceil(blockCount / 6);
4946
4946
  }
4947
4947
 
4948
+ // src/image-overlay-platforms.ts
4949
+ var YT_BANNER_ALL = { x: (2560 - 1546) / 2 / 2560, y: (1440 - 423) / 2 / 1440, w: 1546 / 2560, h: 423 / 1440 };
4950
+ var OVERLAY_PLATFORMS = [
4951
+ { id: "youtube-thumbnail", label: "YouTube thumbnail", width: 1280, height: 720, safe: { x: 0, y: 0, w: 1, h: 0.86 }, note: "The bottom-right corner carries the duration badge." },
4952
+ {
4953
+ id: "youtube-banner",
4954
+ label: "YouTube channel banner",
4955
+ width: 2560,
4956
+ height: 1440,
4957
+ safe: YT_BANNER_ALL,
4958
+ zones: [
4959
+ { id: "tv", x: 0, y: 0, w: 1, h: 1 },
4960
+ { id: "desktop", x: 0, y: (1440 - 423) / 2 / 1440, w: 1, h: 423 / 1440 },
4961
+ { id: "all", ...YT_BANNER_ALL }
4962
+ ],
4963
+ note: "TV shows the whole banner, desktop a 2560\xD7423 strip, phones only the centre 1546\xD7423."
4964
+ },
4965
+ { id: "linkedin-company", label: "LinkedIn company cover", width: 1128, height: 191, safe: { x: 0.18, y: 0, w: 0.82, h: 1 }, note: "The company logo sits over the left ~200px." },
4966
+ { id: "linkedin-personal", label: "LinkedIn personal cover", width: 1584, height: 396, safe: { x: 0.24, y: 0, w: 0.76, h: 0.9 }, note: "The profile photo covers the bottom-left." },
4967
+ { id: "x-header", label: "X / Twitter header", width: 1500, height: 500, safe: { x: 0.2, y: 0.05, w: 0.78, h: 0.9 }, note: "The profile photo covers the bottom-left." },
4968
+ { id: "facebook-cover", label: "Facebook page cover", width: 820, height: 312, safe: { x: 0.05, y: 0.08, w: 0.9, h: 0.84 } },
4969
+ { id: "instagram-post", label: "Instagram post (1:1)", width: 1080, height: 1080 },
4970
+ { id: "instagram-portrait", label: "Instagram post (4:5)", width: 1080, height: 1350 },
4971
+ { id: "instagram-story", label: "Instagram / TikTok story (9:16)", width: 1080, height: 1920, safe: { x: 0, y: 250 / 1920, w: 1, h: (1920 - 500) / 1920 }, note: "The top and bottom 250px sit under the story UI." },
4972
+ { id: "open-graph", label: "Link preview (Open Graph)", width: 1200, height: 630 },
4973
+ { id: "presentation", label: "Presentation slide (16:9)", width: 1920, height: 1080 },
4974
+ { id: "a4-print", label: "Print A4 @300dpi", width: 2480, height: 3508, safe: { x: 0.05, y: 0.05, w: 0.9, h: 0.9 }, note: "5% bleed margin." }
4975
+ ];
4976
+ var OVERLAY_PLATFORM_IDS = OVERLAY_PLATFORMS.map((p) => p.id);
4977
+ function overlayPlatformById(id) {
4978
+ return id ? OVERLAY_PLATFORMS.find((p) => p.id === id) : void 0;
4979
+ }
4980
+ var OVERLAY_MAX_VARIANTS = OVERLAY_PLATFORMS.length;
4981
+ var OVERLAY_VARIANT_HANDLE_PREFIX = "variant:";
4982
+ function overlayVariantHandle(platformId) {
4983
+ return `${OVERLAY_VARIANT_HANDLE_PREFIX}${platformId}`;
4984
+ }
4985
+ function overlayVariantIdFromHandle(handle) {
4986
+ if (!handle || !handle.startsWith(OVERLAY_VARIANT_HANDLE_PREFIX)) return null;
4987
+ const id = handle.slice(OVERLAY_VARIANT_HANDLE_PREFIX.length);
4988
+ return overlayPlatformById(id) ? id : null;
4989
+ }
4990
+
4991
+ // src/credit-estimators/image-overlay.ts
4992
+ var IMAGE_OVERLAY_BASE_CREDITS = 10;
4993
+ var IMAGE_OVERLAY_VARIANT_CREDITS = 2;
4994
+ function imageOverlayBillableVariants(variants) {
4995
+ const seen = /* @__PURE__ */ new Set();
4996
+ for (const v of variants ?? []) {
4997
+ if (typeof v === "string" && overlayPlatformById(v)) seen.add(v);
4998
+ }
4999
+ return [...seen];
5000
+ }
5001
+ function imageOverlayCredits(variants) {
5002
+ return IMAGE_OVERLAY_BASE_CREDITS + IMAGE_OVERLAY_VARIANT_CREDITS * imageOverlayBillableVariants(variants).length;
5003
+ }
5004
+
4948
5005
  // src/video-duration.ts
4949
5006
  function extractVideoDurationFromNode(data) {
4950
5007
  if (!data) return void 0;
@@ -13922,6 +13979,167 @@ var SUPPORTED_FONT_NAMES = [
13922
13979
  "Tajawal"
13923
13980
  ];
13924
13981
 
13982
+ // src/image-overlay-shapes.ts
13983
+ var OVERLAY_SHAPES = [
13984
+ "rect",
13985
+ "rounded",
13986
+ "pill",
13987
+ "circle",
13988
+ "ribbon",
13989
+ "triangle",
13990
+ "diamond",
13991
+ "hexagon",
13992
+ "star",
13993
+ "burst",
13994
+ "arrow"
13995
+ ];
13996
+ function round(n) {
13997
+ return Math.round(n * 100) / 100;
13998
+ }
13999
+ function points(list) {
14000
+ return list.map(([x, y]) => `${round(x)},${round(y)}`).join(" ");
14001
+ }
14002
+ function radial(cx, cy, rx, ry, n, inner) {
14003
+ const pts = [];
14004
+ for (let i = 0; i < n * 2; i++) {
14005
+ const a = -Math.PI / 2 + i * Math.PI / n;
14006
+ const f = i % 2 === 0 ? 1 : inner;
14007
+ pts.push([cx + Math.cos(a) * rx * f, cy + Math.sin(a) * ry * f]);
14008
+ }
14009
+ return points(pts);
14010
+ }
14011
+ function overlayShapeElement(shape, w, h, inset = 0) {
14012
+ const i = Math.max(0, inset);
14013
+ const iw = Math.max(0, w - 2 * i);
14014
+ const ih = Math.max(0, h - 2 * i);
14015
+ const cx = w / 2;
14016
+ const cy = h / 2;
14017
+ switch (shape) {
14018
+ case "rounded":
14019
+ return { tag: "rect", attrs: { x: i, y: i, width: iw, height: ih, rx: round(Math.min(iw, ih) * 0.18) } };
14020
+ case "pill":
14021
+ return { tag: "rect", attrs: { x: i, y: i, width: iw, height: ih, rx: round(ih / 2) } };
14022
+ case "circle":
14023
+ return { tag: "ellipse", attrs: { cx, cy, rx: round(iw / 2), ry: round(ih / 2) } };
14024
+ case "ribbon": {
14025
+ const notch = Math.min(w / 4, h / 2);
14026
+ return { tag: "polygon", attrs: { points: points([[i, i], [w - i, i], [w - notch, cy], [w - i, h - i], [i, h - i], [notch, cy]]) } };
14027
+ }
14028
+ case "triangle":
14029
+ return { tag: "polygon", attrs: { points: points([[cx, i], [w - i, h - i], [i, h - i]]) } };
14030
+ case "diamond":
14031
+ return { tag: "polygon", attrs: { points: points([[cx, i], [w - i, cy], [cx, h - i], [i, cy]]) } };
14032
+ case "hexagon":
14033
+ return { tag: "polygon", attrs: { points: points([[w * 0.25, i], [w * 0.75, i], [w - i, cy], [w * 0.75, h - i], [w * 0.25, h - i], [i, cy]]) } };
14034
+ case "star":
14035
+ return { tag: "polygon", attrs: { points: radial(cx, cy, iw / 2, ih / 2, 5, 0.42) } };
14036
+ case "burst":
14037
+ return { tag: "polygon", attrs: { points: radial(cx, cy, iw / 2, ih / 2, 14, 0.82) } };
14038
+ case "arrow":
14039
+ return {
14040
+ tag: "polygon",
14041
+ attrs: { points: points([[i, h * 0.25], [w * 0.6, h * 0.25], [w * 0.6, i], [w - i, cy], [w * 0.6, h - i], [w * 0.6, h * 0.75], [i, h * 0.75]]) }
14042
+ };
14043
+ default:
14044
+ return { tag: "rect", attrs: { x: i, y: i, width: iw, height: ih } };
14045
+ }
14046
+ }
14047
+
14048
+ // src/image-overlay-layers.ts
14049
+ var OVERLAY_LAYER_KINDS = ["image", "text", "qr", "shape"];
14050
+ var OVERLAY_TEXT_ALIGNS = ["left", "center", "right"];
14051
+ var OVERLAY_IMAGE_MASKS = ["none", "circle"];
14052
+ var OVERLAY_FONTS = [
14053
+ { id: "inter", family: "Inter", file: "Inter.ttf", variable: true, scripts: ["latin"], category: "sans" },
14054
+ { id: "montserrat", family: "Montserrat", file: "Montserrat.ttf", variable: true, scripts: ["latin"], category: "sans" },
14055
+ { id: "space-grotesk", family: "Space Grotesk", file: "SpaceGrotesk.ttf", variable: true, scripts: ["latin"], category: "sans" },
14056
+ { id: "playfair-display", family: "Playfair Display", file: "PlayfairDisplay.ttf", variable: true, scripts: ["latin"], category: "serif" },
14057
+ { id: "oswald", family: "Oswald", file: "Oswald.ttf", variable: true, scripts: ["latin"], category: "display" },
14058
+ { id: "bebas-neue", family: "Bebas Neue", file: "BebasNeue.ttf", variable: false, scripts: ["latin"], category: "display" },
14059
+ { id: "anton", family: "Anton", file: "Anton.ttf", variable: false, scripts: ["latin"], category: "display" },
14060
+ { id: "pacifico", family: "Pacifico", file: "Pacifico.ttf", variable: false, scripts: ["latin"], category: "script" },
14061
+ { id: "rubik", family: "Rubik", file: "Rubik.ttf", variable: true, scripts: ["latin", "hebrew"], category: "sans" },
14062
+ { id: "heebo", family: "Heebo", file: "Heebo.ttf", variable: true, scripts: ["latin", "hebrew"], category: "sans" }
14063
+ ];
14064
+ var OVERLAY_FONT_IDS = OVERLAY_FONTS.map((f) => f.id);
14065
+ function overlayFontById(id) {
14066
+ return OVERLAY_FONTS.find((f) => f.id === id);
14067
+ }
14068
+ var hex6 = zod.z.string().regex(/^#[0-9a-fA-F]{6}$/, "Expected a #RRGGBB color");
14069
+ var overlayStrokeSchema = zod.z.object({
14070
+ /** px on the base image */
14071
+ width: zod.z.number().min(0).max(50),
14072
+ color: hex6
14073
+ });
14074
+ var overlayTextStyleSchema = zod.z.object({
14075
+ text: zod.z.string().min(1).max(500),
14076
+ fontId: zod.z.enum(OVERLAY_FONT_IDS).default("inter"),
14077
+ fontWeight: zod.z.number().int().min(100).max(900).default(700),
14078
+ /** % of the BASE height */
14079
+ fontSize: zod.z.number().min(1).max(50).default(8),
14080
+ color: hex6.default("#ffffff"),
14081
+ align: zod.z.enum(OVERLAY_TEXT_ALIGNS).default("center"),
14082
+ /** em */
14083
+ letterSpacing: zod.z.number().min(-0.2).max(1).default(0),
14084
+ lineHeight: zod.z.number().min(0.8).max(2.5).default(1.15),
14085
+ uppercase: zod.z.boolean().default(false),
14086
+ stroke: overlayStrokeSchema.optional(),
14087
+ /** A filled box behind the text — a pill, a badge, a lower third. */
14088
+ background: zod.z.object({
14089
+ color: hex6,
14090
+ opacity: zod.z.number().min(0).max(1).default(1),
14091
+ /** px on the base image */
14092
+ padding: zod.z.number().min(0).max(300).default(24),
14093
+ /** px corner radius; a huge value makes a pill */
14094
+ radius: zod.z.number().min(0).max(1e3).default(0)
14095
+ }).optional()
14096
+ });
14097
+ var overlayQrStyleSchema = zod.z.object({
14098
+ /** The link / text the code opens. May be empty ONLY while `fromInput` is
14099
+ * set — the run then fills it from the node's "QR link" text handle. */
14100
+ text: zod.z.string().max(2e3).default(""),
14101
+ /** Take the payload from the node's QR link handle (a Text node, a List
14102
+ * column, any text output) instead of this style's `text`. */
14103
+ fromInput: zod.z.boolean().optional(),
14104
+ color: hex6.default("#000000"),
14105
+ /** Absent = transparent quiet zone and background. */
14106
+ background: hex6.optional(),
14107
+ /** Quiet-zone modules */
14108
+ margin: zod.z.number().int().min(0).max(8).default(1)
14109
+ });
14110
+ var overlayShapeStyleSchema = zod.z.object({
14111
+ shape: zod.z.enum(OVERLAY_SHAPES).default("rect"),
14112
+ color: hex6.default("#ff0073"),
14113
+ stroke: overlayStrokeSchema.optional()
14114
+ });
14115
+ var overlayImageEffectsSchema = zod.z.object({
14116
+ mask: zod.z.enum(OVERLAY_IMAGE_MASKS).optional(),
14117
+ /** px on the base image — edge fade width */
14118
+ feather: zod.z.number().min(0).max(500).optional(),
14119
+ stroke: overlayStrokeSchema.optional(),
14120
+ glow: zod.z.object({
14121
+ blur: zod.z.number().min(0).max(200),
14122
+ color: hex6,
14123
+ opacity: zod.z.number().min(0).max(1)
14124
+ }).optional()
14125
+ });
14126
+ var DEFAULT_OVERLAY_TEXT = {
14127
+ text: "Your text",
14128
+ fontId: "inter",
14129
+ fontWeight: 700,
14130
+ fontSize: 8,
14131
+ color: "#ffffff",
14132
+ align: "center",
14133
+ letterSpacing: 0,
14134
+ lineHeight: 1.15,
14135
+ uppercase: false
14136
+ };
14137
+ var DEFAULT_OVERLAY_QR = { text: "https://nodaro.ai", color: "#000000", background: "#ffffff", margin: 1 };
14138
+ var DEFAULT_OVERLAY_SHAPE = { shape: "pill", color: "#ff0073" };
14139
+ function isRtlText(text) {
14140
+ return /[֐-׿؀-ۿݐ-ݿࢠ-ࣿיִ-﷿ﹰ-]/.test(text);
14141
+ }
14142
+
13925
14143
  // src/entity-image-handle.ts
13926
14144
  var ENTITY_IMAGE_HANDLE_TYPES = /* @__PURE__ */ new Set([
13927
14145
  "character",
@@ -15257,6 +15475,7 @@ var SCENE3D_V2_LIMITS = {
15257
15475
  maxIdLength: SCENE3D_LIMITS.maxIdLength,
15258
15476
  maxAssetIdLength: 128,
15259
15477
  maxNodeIdLength: 128,
15478
+ maxNodeNameLength: 256,
15260
15479
  maxNameLength: SCENE3D_LIMITS.maxNameLength,
15261
15480
  maxLabelLength: SCENE3D_LIMITS.maxNameLength,
15262
15481
  maxMaterialNameLength: 120,
@@ -15325,9 +15544,10 @@ var SCENE3D_RENDERER_ASSET_KINDS = [
15325
15544
  "poster"
15326
15545
  ];
15327
15546
  var SCENE3D_PRIMITIVE_MATERIAL_ROLE = "identity";
15328
- var SCENE3D_CLAY_LIGHTING_PRESETS = ["clay-studio-v1"];
15547
+ var SCENE3D_CLAY_LIGHTING_PRESETS = ["clay-studio-v1", "clay-studio-v2"];
15329
15548
  var scene3DAssetIdSchema = zod.z.string().min(1).max(SCENE3D_V2_LIMITS.maxAssetIdLength).regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/, "assetId must be an opaque id (letters, digits, '_', '-', '.', ':')").refine((value) => !value.includes(".."), "assetId must not contain '..'");
15330
15549
  var scene3DNodeIdSchema = zod.z.string().min(1).max(SCENE3D_V2_LIMITS.maxNodeIdLength).regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/, "node id must be an exporter-generated stable id");
15550
+ var scene3DNodeNameSchema = zod.z.string().min(1).max(SCENE3D_V2_LIMITS.maxNodeNameLength).regex(/^[^\u0000-\u001f\u007f]+$/, "node name must not contain control characters");
15331
15551
  var scene3DSha256Schema = zod.z.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex characters");
15332
15552
  var scene3DVersionTokenSchema = zod.z.string().min(1).max(SCENE3D_V2_LIMITS.maxVersionLength).regex(
15333
15553
  /^[A-Za-z0-9][A-Za-z0-9_.+-]*$/,
@@ -15342,6 +15562,7 @@ var scene3DEntityCapabilitySchema = zod.z.enum(["transform", "color", "visibilit
15342
15562
  var scene3DAnchorSchema = zod.z.object({
15343
15563
  name: scene3DAnchorNameSchema,
15344
15564
  position: vec3Schema,
15565
+ nodeName: scene3DNodeNameSchema.optional(),
15345
15566
  rotation: rotationVec3Schema.optional()
15346
15567
  }).strict();
15347
15568
  var scene3DMaterialBindingSchema = zod.z.object({
@@ -15526,6 +15747,12 @@ function checkEntities(plan, byId, issues) {
15526
15747
  });
15527
15748
  const anchorNames = /* @__PURE__ */ new Set();
15528
15749
  (entity.anchors ?? []).forEach((anchor, anchorIndex) => {
15750
+ if (anchor.nodeName !== void 0 && entity.visual.kind !== "asset") {
15751
+ issues.push({
15752
+ path: at("anchors", anchorIndex, "nodeName"),
15753
+ message: `entity "${entity.id}" can bind anchor nodes only with an asset visual`
15754
+ });
15755
+ }
15529
15756
  if (anchorNames.has(anchor.name)) {
15530
15757
  issues.push({
15531
15758
  path: at("anchors", anchorIndex, "name"),
@@ -16274,8 +16501,8 @@ function scene3DCameraTrackIssues(track) {
16274
16501
  }
16275
16502
  const quaternionTolerance = SCENE3D_CAMERA_TRACK_LIMITS.quaternionTolerance;
16276
16503
  track.samples.forEach((sample, index) => {
16277
- const [x, y, z24, w] = sample.quaternion;
16278
- const norm = Math.sqrt(x * x + y * y + z24 * z24 + w * w);
16504
+ const [x, y, z25, w] = sample.quaternion;
16505
+ const norm = Math.sqrt(x * x + y * y + z25 * z25 + w * w);
16279
16506
  if (Math.abs(norm - 1) > quaternionTolerance) {
16280
16507
  issues.push({
16281
16508
  path: ["samples", index, "quaternion"],
@@ -16878,6 +17105,9 @@ exports.DEFAULT_CHARACTER_EXPRESSION_COUNT = DEFAULT_CHARACTER_EXPRESSION_COUNT;
16878
17105
  exports.DEFAULT_CHARACTER_FACET = DEFAULT_CHARACTER_FACET;
16879
17106
  exports.DEFAULT_LABEL_BY_SOURCE = DEFAULT_LABEL_BY_SOURCE;
16880
17107
  exports.DEFAULT_LOCATION_USAGE_MODE = DEFAULT_LOCATION_USAGE_MODE;
17108
+ exports.DEFAULT_OVERLAY_QR = DEFAULT_OVERLAY_QR;
17109
+ exports.DEFAULT_OVERLAY_SHAPE = DEFAULT_OVERLAY_SHAPE;
17110
+ exports.DEFAULT_OVERLAY_TEXT = DEFAULT_OVERLAY_TEXT;
16881
17111
  exports.DEFAULT_PANEL_COUNT = DEFAULT_PANEL_COUNT;
16882
17112
  exports.DEFAULT_REF_IMAGE_MAX = DEFAULT_REF_IMAGE_MAX;
16883
17113
  exports.DEFAULT_SECTIONS = DEFAULT_SECTIONS;
@@ -16964,6 +17194,8 @@ exports.IMAGE_EDIT_PROVIDERS = IMAGE_EDIT_PROVIDERS;
16964
17194
  exports.IMAGE_GEN_PROVIDERS = IMAGE_GEN_PROVIDERS;
16965
17195
  exports.IMAGE_I2I_PROVIDERS = IMAGE_I2I_PROVIDERS;
16966
17196
  exports.IMAGE_MASK_MODE = IMAGE_MASK_MODE;
17197
+ exports.IMAGE_OVERLAY_BASE_CREDITS = IMAGE_OVERLAY_BASE_CREDITS;
17198
+ exports.IMAGE_OVERLAY_VARIANT_CREDITS = IMAGE_OVERLAY_VARIANT_CREDITS;
16967
17199
  exports.IMAGE_PROMPT_MAX = IMAGE_PROMPT_MAX;
16968
17200
  exports.IMAGE_REF_TYPES = IMAGE_REF_TYPES;
16969
17201
  exports.IMAGE_TO_VIDEO_PROVIDERS = IMAGE_TO_VIDEO_PROVIDERS;
@@ -17054,6 +17286,16 @@ exports.ORG_ROLES = ORG_ROLES;
17054
17286
  exports.ORG_STATUSES = ORG_STATUSES;
17055
17287
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
17056
17288
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
17289
+ exports.OVERLAY_FONTS = OVERLAY_FONTS;
17290
+ exports.OVERLAY_FONT_IDS = OVERLAY_FONT_IDS;
17291
+ exports.OVERLAY_IMAGE_MASKS = OVERLAY_IMAGE_MASKS;
17292
+ exports.OVERLAY_LAYER_KINDS = OVERLAY_LAYER_KINDS;
17293
+ exports.OVERLAY_MAX_VARIANTS = OVERLAY_MAX_VARIANTS;
17294
+ exports.OVERLAY_PLATFORMS = OVERLAY_PLATFORMS;
17295
+ exports.OVERLAY_PLATFORM_IDS = OVERLAY_PLATFORM_IDS;
17296
+ exports.OVERLAY_SHAPES = OVERLAY_SHAPES;
17297
+ exports.OVERLAY_TEXT_ALIGNS = OVERLAY_TEXT_ALIGNS;
17298
+ exports.OVERLAY_VARIANT_HANDLE_PREFIX = OVERLAY_VARIANT_HANDLE_PREFIX;
17057
17299
  exports.ObjectMetadataSchema = ObjectMetadataSchema;
17058
17300
  exports.OptimizeForModelInputSchema = OptimizeForModelInputSchema;
17059
17301
  exports.OptimizeForModelResultSchema = OptimizeForModelResultSchema;
@@ -17499,6 +17741,8 @@ exports.hexToRgbaArray = hexToRgbaArray;
17499
17741
  exports.humanizeSlotSid = humanizeSlotSid;
17500
17742
  exports.imageMentionSlug = imageMentionSlug;
17501
17743
  exports.imageMentionSlugForRef = imageMentionSlugForRef;
17744
+ exports.imageOverlayBillableVariants = imageOverlayBillableVariants;
17745
+ exports.imageOverlayCredits = imageOverlayCredits;
17502
17746
  exports.imageReferenceLimit = imageReferenceLimit;
17503
17747
  exports.inferMusicVideo = inferMusicVideo;
17504
17748
  exports.isAggregateableType = isAggregateableType;
@@ -17521,6 +17765,7 @@ exports.isPerSecondLipSyncProvider = isPerSecondLipSyncProvider;
17521
17765
  exports.isPro3DRenderJobOutput = isPro3DRenderJobOutput;
17522
17766
  exports.isPro3DRenderQuote = isPro3DRenderQuote;
17523
17767
  exports.isPro3DRenderRenderOnly = isPro3DRenderRenderOnly;
17768
+ exports.isRtlText = isRtlText;
17524
17769
  exports.isScene3DAuthoringEngine = isScene3DAuthoringEngine;
17525
17770
  exports.isScene3DCameraTrack = isScene3DCameraTrack;
17526
17771
  exports.isScene3DHttpUrl = isScene3DHttpUrl;
@@ -17572,6 +17817,16 @@ exports.normalizeRoleSlug = normalizeRoleSlug;
17572
17817
  exports.normalizeVideoRequestParams = normalizeVideoRequestParams;
17573
17818
  exports.normalizeWan3Resolution = normalizeWan3Resolution;
17574
17819
  exports.orderedLlmModels = orderedLlmModels;
17820
+ exports.overlayFontById = overlayFontById;
17821
+ exports.overlayImageEffectsSchema = overlayImageEffectsSchema;
17822
+ exports.overlayPlatformById = overlayPlatformById;
17823
+ exports.overlayQrStyleSchema = overlayQrStyleSchema;
17824
+ exports.overlayShapeElement = overlayShapeElement;
17825
+ exports.overlayShapeStyleSchema = overlayShapeStyleSchema;
17826
+ exports.overlayStrokeSchema = overlayStrokeSchema;
17827
+ exports.overlayTextStyleSchema = overlayTextStyleSchema;
17828
+ exports.overlayVariantHandle = overlayVariantHandle;
17829
+ exports.overlayVariantIdFromHandle = overlayVariantIdFromHandle;
17575
17830
  exports.parseAttributedDialogue = parseAttributedDialogue;
17576
17831
  exports.parseCharacterMentionToken = parseCharacterMentionToken;
17577
17832
  exports.parseEntityMentionToken = parseEntityMentionToken;
@@ -17700,6 +17955,7 @@ exports.scene3DMaterialBindingSchema = scene3DMaterialBindingSchema;
17700
17955
  exports.scene3DMaterialNameSchema = scene3DMaterialNameSchema;
17701
17956
  exports.scene3DMaterialRoleSchema = scene3DMaterialRoleSchema;
17702
17957
  exports.scene3DNodeIdSchema = scene3DNodeIdSchema;
17958
+ exports.scene3DNodeNameSchema = scene3DNodeNameSchema;
17703
17959
  exports.scene3DObjectChangesSchema = scene3DObjectChangesSchema;
17704
17960
  exports.scene3DObjectKeyframeSchema = scene3DObjectKeyframeSchema;
17705
17961
  exports.scene3DObjectSchema = scene3DObjectSchema;