@shotstack/shotstack-canvas 1.9.3 → 1.9.4

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/README.md CHANGED
@@ -1,13 +1,13 @@
1
- # @shotstack/shotstack-canvas
2
-
3
- One package → identical text shaping/wrapping/animation on Web & Node.
4
- - HarfBuzz WASM for shaping and glyph outlines (via `harfbuzzjs`).
5
- - Device-independent draw-ops.
6
- - Painters: Canvas2D (web) and node-canvas (node).
7
- - Deterministic time-driven animations.
8
-
9
- ## Install
10
-
11
- ```bash
12
- pnpm add @shotstack/shotstack-canvas
13
- # or npm i / yarn add
1
+ # @shotstack/shotstack-canvas
2
+
3
+ One package → identical text shaping/wrapping/animation on Web & Node.
4
+ - HarfBuzz WASM for shaping and glyph outlines (via `harfbuzzjs`).
5
+ - Device-independent draw-ops.
6
+ - Painters: Canvas2D (web) and node-canvas (node).
7
+ - Deterministic time-driven animations.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ pnpm add @shotstack/shotstack-canvas
13
+ # or npm i / yarn add
@@ -3123,6 +3123,10 @@ function quadraticToCubic(x0, y0, qx, qy, x, y) {
3123
3123
  }
3124
3124
 
3125
3125
  // src/core/resvg-renderer.ts
3126
+ function toNumber(value, defaultValue) {
3127
+ if (value === void 0) return defaultValue;
3128
+ return typeof value === "string" ? parseFloat(value) : value;
3129
+ }
3126
3130
  var resvgModule = null;
3127
3131
  async function getResvg() {
3128
3132
  if (!resvgModule) {
@@ -3156,8 +3160,8 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3156
3160
  if (!asset.shape) {
3157
3161
  throw new Error("Shape is required for shape mode");
3158
3162
  }
3159
- const width = asset.width ?? defaultWidth;
3160
- const height = asset.height ?? defaultHeight;
3163
+ const width = toNumber(asset.width, defaultWidth);
3164
+ const height = toNumber(asset.height, defaultHeight);
3161
3165
  const pathData = generateShapePathData(asset.shape);
3162
3166
  const bounds = computeSimplePathBounds(pathData);
3163
3167
  const centerX = width / 2;
@@ -3167,15 +3171,15 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3167
3171
  let offsetX = centerX - pathCenterX;
3168
3172
  let offsetY = centerY - pathCenterY;
3169
3173
  if (asset.transform) {
3170
- offsetX += asset.transform.x ?? 0;
3171
- offsetY += asset.transform.y ?? 0;
3174
+ offsetX += toNumber(asset.transform.x, 0);
3175
+ offsetY += toNumber(asset.transform.y, 0);
3172
3176
  }
3173
3177
  const elements = [];
3174
3178
  if (asset.shadow) {
3175
- const shadowOffsetX = asset.shadow.offsetX ?? 4;
3176
- const shadowOffsetY = asset.shadow.offsetY ?? 4;
3179
+ const shadowOffsetX = toNumber(asset.shadow.offsetX, 4);
3180
+ const shadowOffsetY = toNumber(asset.shadow.offsetY, 4);
3177
3181
  const shadowColor = asset.shadow.color ?? "#000000";
3178
- const shadowOpacity = asset.shadow.opacity ?? 0.5;
3182
+ const shadowOpacity = toNumber(asset.shadow.opacity, 0.5);
3179
3183
  elements.push(
3180
3184
  `<path d="${pathData}" transform="translate(${offsetX + shadowOffsetX}, ${offsetY + shadowOffsetY})" fill="${shadowColor}" fill-opacity="${shadowOpacity}"/>`
3181
3185
  );
@@ -3194,7 +3198,7 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3194
3198
  } else {
3195
3199
  pathAttrs.push(`fill="none"`);
3196
3200
  }
3197
- if (asset.stroke && asset.stroke.width && asset.stroke.width > 0) {
3201
+ if (asset.stroke && asset.stroke.width && toNumber(asset.stroke.width, 0) > 0) {
3198
3202
  pathAttrs.push(`stroke="${asset.stroke.color ?? "#000000"}"`);
3199
3203
  pathAttrs.push(`stroke-width="${asset.stroke.width}"`);
3200
3204
  if (asset.stroke.opacity !== void 0 && asset.stroke.opacity !== 1) {
@@ -3223,18 +3227,18 @@ function generateFillDefinition(fill, id, bounds) {
3223
3227
  return { fill: fill.color };
3224
3228
  }
3225
3229
  if (fill.type === "linear") {
3226
- const angle = fill.angle ?? 0;
3230
+ const angle = toNumber(fill.angle, 0);
3227
3231
  const rad = angle * Math.PI / 180;
3228
3232
  const x1 = 50 - Math.cos(rad) * 50;
3229
3233
  const y1 = 50 - Math.sin(rad) * 50;
3230
3234
  const x2 = 50 + Math.cos(rad) * 50;
3231
3235
  const y2 = 50 + Math.sin(rad) * 50;
3232
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
3236
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
3233
3237
  const defs = `<defs><linearGradient id="${id}" x1="${x1}%" y1="${y1}%" x2="${x2}%" y2="${y2}%">${stops}</linearGradient></defs>`;
3234
3238
  return { fill: `url(#${id})`, defs };
3235
3239
  }
3236
3240
  if (fill.type === "radial") {
3237
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
3241
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
3238
3242
  const defs = `<defs><radialGradient id="${id}" cx="50%" cy="50%" r="50%">${stops}</radialGradient></defs>`;
3239
3243
  return { fill: `url(#${id})`, defs };
3240
3244
  }
@@ -3636,8 +3640,8 @@ async function renderSvgAssetToPng(asset, options = {}) {
3636
3640
  targetWidth = dimensions.width || defaultWidth;
3637
3641
  targetHeight = dimensions.height || defaultHeight;
3638
3642
  } else if (asset.shape) {
3639
- targetWidth = asset.width ?? defaultWidth;
3640
- targetHeight = asset.height ?? defaultHeight;
3643
+ targetWidth = toNumber(asset.width, defaultWidth);
3644
+ targetHeight = toNumber(asset.height, defaultHeight);
3641
3645
  svgString = shapeToSvgString(asset, targetWidth, targetHeight);
3642
3646
  } else {
3643
3647
  throw new Error("Either 'src' or 'shape' must be provided");
@@ -9,9 +9,9 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
9
9
  height: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
10
  font: z.ZodOptional<z.ZodObject<{
11
11
  stroke: z.ZodOptional<z.ZodObject<{
12
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
13
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
14
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
12
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
13
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
14
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
15
15
  }, z.core.$strip>>;
16
16
  family: z.ZodDefault<z.ZodString>;
17
17
  size: z.ZodDefault<z.ZodNumber>;
@@ -59,7 +59,7 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
59
59
  opacity: z.ZodDefault<z.ZodNumber>;
60
60
  }, z.core.$strip>>;
61
61
  background: z.ZodOptional<z.ZodObject<{
62
- borderRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
62
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
63
63
  color: z.ZodOptional<z.ZodString>;
64
64
  opacity: z.ZodDefault<z.ZodNumber>;
65
65
  }, z.core.$strip>>;
@@ -127,65 +127,65 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
127
127
  type: z.ZodEnum<{
128
128
  rectangle: "rectangle";
129
129
  }>;
130
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
131
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
132
- cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
130
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
131
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
132
+ cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
133
133
  }, z.core.$strip>, z.ZodObject<{
134
134
  type: z.ZodEnum<{
135
135
  circle: "circle";
136
136
  }>;
137
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
137
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
138
138
  }, z.core.$strip>, z.ZodObject<{
139
139
  type: z.ZodEnum<{
140
140
  ellipse: "ellipse";
141
141
  }>;
142
- radiusX: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
143
- radiusY: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
142
+ radiusX: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
143
+ radiusY: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
144
144
  }, z.core.$strip>, z.ZodObject<{
145
145
  type: z.ZodEnum<{
146
146
  line: "line";
147
147
  }>;
148
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
149
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
148
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
149
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
150
150
  }, z.core.$strip>, z.ZodObject<{
151
151
  type: z.ZodEnum<{
152
152
  polygon: "polygon";
153
153
  }>;
154
- sides: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
155
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
154
+ sides: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
155
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
156
156
  }, z.core.$strip>, z.ZodObject<{
157
157
  type: z.ZodEnum<{
158
158
  star: "star";
159
159
  }>;
160
- points: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
161
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
162
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
160
+ points: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
161
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
162
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
163
163
  }, z.core.$strip>, z.ZodObject<{
164
164
  type: z.ZodEnum<{
165
165
  arrow: "arrow";
166
166
  }>;
167
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
168
- headWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
169
- headLength: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
170
- shaftWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
167
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
168
+ headWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
169
+ headLength: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
170
+ shaftWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
171
171
  }, z.core.$strip>, z.ZodObject<{
172
172
  type: z.ZodEnum<{
173
173
  heart: "heart";
174
174
  }>;
175
- size: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
175
+ size: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
176
176
  }, z.core.$strip>, z.ZodObject<{
177
177
  type: z.ZodEnum<{
178
178
  cross: "cross";
179
179
  }>;
180
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
181
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
182
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
180
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
181
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
182
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
183
183
  }, z.core.$strip>, z.ZodObject<{
184
184
  type: z.ZodEnum<{
185
185
  ring: "ring";
186
186
  }>;
187
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
188
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
187
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
188
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
189
189
  }, z.core.$strip>, z.ZodObject<{
190
190
  type: z.ZodEnum<{
191
191
  path: "path";
@@ -197,31 +197,31 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
197
197
  solid: "solid";
198
198
  }>;
199
199
  color: z.ZodDefault<z.ZodString>;
200
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
200
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
201
201
  }, z.core.$strip>, z.ZodObject<{
202
202
  type: z.ZodEnum<{
203
203
  linear: "linear";
204
204
  }>;
205
- angle: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
205
+ angle: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
206
206
  stops: z.ZodArray<z.ZodObject<{
207
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
208
- color: z.ZodString;
207
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
208
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
209
209
  }, z.core.$strip>>;
210
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
210
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
211
211
  }, z.core.$strip>, z.ZodObject<{
212
212
  type: z.ZodEnum<{
213
213
  radial: "radial";
214
214
  }>;
215
215
  stops: z.ZodArray<z.ZodObject<{
216
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
217
- color: z.ZodString;
216
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
217
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
218
218
  }, z.core.$strip>>;
219
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
219
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
220
220
  }, z.core.$strip>], "type">>;
221
221
  stroke: z.ZodOptional<z.ZodObject<{
222
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
223
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
224
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
222
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
223
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
224
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
225
225
  lineCap: z.ZodOptional<z.ZodEnum<{
226
226
  butt: "butt";
227
227
  round: "round";
@@ -232,27 +232,27 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
232
232
  miter: "miter";
233
233
  bevel: "bevel";
234
234
  }>>;
235
- dashArray: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
236
- dashOffset: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
235
+ dashArray: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
236
+ dashOffset: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
237
237
  }, z.core.$strip>>;
238
238
  shadow: z.ZodOptional<z.ZodObject<{
239
- offsetX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
240
- offsetY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
241
- blur: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
242
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
243
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
239
+ offsetX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
240
+ offsetY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
241
+ blur: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
242
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
243
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
244
244
  }, z.core.$strip>>;
245
245
  transform: z.ZodOptional<z.ZodObject<{
246
- x: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
247
- y: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
248
- rotation: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
249
- scale: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
250
- originX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
251
- originY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
246
+ x: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
247
+ y: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
248
+ rotation: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
249
+ scale: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
250
+ originX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
251
+ originY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
252
252
  }, z.core.$strip>>;
253
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>>;
254
- width: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
255
- height: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
253
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
254
+ width: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
255
+ height: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
256
256
  }, z.core.$strip>;
257
257
  type CanvasSvgAsset = z.infer<typeof CanvasSvgAssetSchema>;
258
258
 
@@ -9,9 +9,9 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
9
9
  height: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
10
  font: z.ZodOptional<z.ZodObject<{
11
11
  stroke: z.ZodOptional<z.ZodObject<{
12
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
13
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
14
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
12
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
13
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
14
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
15
15
  }, z.core.$strip>>;
16
16
  family: z.ZodDefault<z.ZodString>;
17
17
  size: z.ZodDefault<z.ZodNumber>;
@@ -59,7 +59,7 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
59
59
  opacity: z.ZodDefault<z.ZodNumber>;
60
60
  }, z.core.$strip>>;
61
61
  background: z.ZodOptional<z.ZodObject<{
62
- borderRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
62
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
63
63
  color: z.ZodOptional<z.ZodString>;
64
64
  opacity: z.ZodDefault<z.ZodNumber>;
65
65
  }, z.core.$strip>>;
@@ -127,65 +127,65 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
127
127
  type: z.ZodEnum<{
128
128
  rectangle: "rectangle";
129
129
  }>;
130
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
131
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
132
- cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
130
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
131
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
132
+ cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
133
133
  }, z.core.$strip>, z.ZodObject<{
134
134
  type: z.ZodEnum<{
135
135
  circle: "circle";
136
136
  }>;
137
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
137
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
138
138
  }, z.core.$strip>, z.ZodObject<{
139
139
  type: z.ZodEnum<{
140
140
  ellipse: "ellipse";
141
141
  }>;
142
- radiusX: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
143
- radiusY: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
142
+ radiusX: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
143
+ radiusY: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
144
144
  }, z.core.$strip>, z.ZodObject<{
145
145
  type: z.ZodEnum<{
146
146
  line: "line";
147
147
  }>;
148
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
149
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
148
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
149
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
150
150
  }, z.core.$strip>, z.ZodObject<{
151
151
  type: z.ZodEnum<{
152
152
  polygon: "polygon";
153
153
  }>;
154
- sides: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
155
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
154
+ sides: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
155
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
156
156
  }, z.core.$strip>, z.ZodObject<{
157
157
  type: z.ZodEnum<{
158
158
  star: "star";
159
159
  }>;
160
- points: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
161
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
162
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
160
+ points: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
161
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
162
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
163
163
  }, z.core.$strip>, z.ZodObject<{
164
164
  type: z.ZodEnum<{
165
165
  arrow: "arrow";
166
166
  }>;
167
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
168
- headWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
169
- headLength: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
170
- shaftWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
167
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
168
+ headWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
169
+ headLength: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
170
+ shaftWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
171
171
  }, z.core.$strip>, z.ZodObject<{
172
172
  type: z.ZodEnum<{
173
173
  heart: "heart";
174
174
  }>;
175
- size: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
175
+ size: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
176
176
  }, z.core.$strip>, z.ZodObject<{
177
177
  type: z.ZodEnum<{
178
178
  cross: "cross";
179
179
  }>;
180
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
181
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
182
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
180
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
181
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
182
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
183
183
  }, z.core.$strip>, z.ZodObject<{
184
184
  type: z.ZodEnum<{
185
185
  ring: "ring";
186
186
  }>;
187
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
188
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
187
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
188
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
189
189
  }, z.core.$strip>, z.ZodObject<{
190
190
  type: z.ZodEnum<{
191
191
  path: "path";
@@ -197,31 +197,31 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
197
197
  solid: "solid";
198
198
  }>;
199
199
  color: z.ZodDefault<z.ZodString>;
200
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
200
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
201
201
  }, z.core.$strip>, z.ZodObject<{
202
202
  type: z.ZodEnum<{
203
203
  linear: "linear";
204
204
  }>;
205
- angle: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
205
+ angle: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
206
206
  stops: z.ZodArray<z.ZodObject<{
207
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
208
- color: z.ZodString;
207
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
208
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
209
209
  }, z.core.$strip>>;
210
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
210
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
211
211
  }, z.core.$strip>, z.ZodObject<{
212
212
  type: z.ZodEnum<{
213
213
  radial: "radial";
214
214
  }>;
215
215
  stops: z.ZodArray<z.ZodObject<{
216
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
217
- color: z.ZodString;
216
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
217
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
218
218
  }, z.core.$strip>>;
219
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
219
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
220
220
  }, z.core.$strip>], "type">>;
221
221
  stroke: z.ZodOptional<z.ZodObject<{
222
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
223
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
224
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
222
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
223
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
224
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
225
225
  lineCap: z.ZodOptional<z.ZodEnum<{
226
226
  butt: "butt";
227
227
  round: "round";
@@ -232,27 +232,27 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
232
232
  miter: "miter";
233
233
  bevel: "bevel";
234
234
  }>>;
235
- dashArray: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
236
- dashOffset: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
235
+ dashArray: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
236
+ dashOffset: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
237
237
  }, z.core.$strip>>;
238
238
  shadow: z.ZodOptional<z.ZodObject<{
239
- offsetX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
240
- offsetY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
241
- blur: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
242
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
243
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
239
+ offsetX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
240
+ offsetY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
241
+ blur: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
242
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
243
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
244
244
  }, z.core.$strip>>;
245
245
  transform: z.ZodOptional<z.ZodObject<{
246
- x: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
247
- y: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
248
- rotation: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
249
- scale: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
250
- originX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
251
- originY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
246
+ x: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
247
+ y: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
248
+ rotation: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
249
+ scale: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
250
+ originX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
251
+ originY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
252
252
  }, z.core.$strip>>;
253
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>>;
254
- width: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
255
- height: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
253
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
254
+ width: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
255
+ height: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
256
256
  }, z.core.$strip>;
257
257
  type CanvasSvgAsset = z.infer<typeof CanvasSvgAssetSchema>;
258
258
 
@@ -3079,6 +3079,10 @@ function quadraticToCubic(x0, y0, qx, qy, x, y) {
3079
3079
  }
3080
3080
 
3081
3081
  // src/core/resvg-renderer.ts
3082
+ function toNumber(value, defaultValue) {
3083
+ if (value === void 0) return defaultValue;
3084
+ return typeof value === "string" ? parseFloat(value) : value;
3085
+ }
3082
3086
  var resvgModule = null;
3083
3087
  async function getResvg() {
3084
3088
  if (!resvgModule) {
@@ -3112,8 +3116,8 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3112
3116
  if (!asset.shape) {
3113
3117
  throw new Error("Shape is required for shape mode");
3114
3118
  }
3115
- const width = asset.width ?? defaultWidth;
3116
- const height = asset.height ?? defaultHeight;
3119
+ const width = toNumber(asset.width, defaultWidth);
3120
+ const height = toNumber(asset.height, defaultHeight);
3117
3121
  const pathData = generateShapePathData(asset.shape);
3118
3122
  const bounds = computeSimplePathBounds(pathData);
3119
3123
  const centerX = width / 2;
@@ -3123,15 +3127,15 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3123
3127
  let offsetX = centerX - pathCenterX;
3124
3128
  let offsetY = centerY - pathCenterY;
3125
3129
  if (asset.transform) {
3126
- offsetX += asset.transform.x ?? 0;
3127
- offsetY += asset.transform.y ?? 0;
3130
+ offsetX += toNumber(asset.transform.x, 0);
3131
+ offsetY += toNumber(asset.transform.y, 0);
3128
3132
  }
3129
3133
  const elements = [];
3130
3134
  if (asset.shadow) {
3131
- const shadowOffsetX = asset.shadow.offsetX ?? 4;
3132
- const shadowOffsetY = asset.shadow.offsetY ?? 4;
3135
+ const shadowOffsetX = toNumber(asset.shadow.offsetX, 4);
3136
+ const shadowOffsetY = toNumber(asset.shadow.offsetY, 4);
3133
3137
  const shadowColor = asset.shadow.color ?? "#000000";
3134
- const shadowOpacity = asset.shadow.opacity ?? 0.5;
3138
+ const shadowOpacity = toNumber(asset.shadow.opacity, 0.5);
3135
3139
  elements.push(
3136
3140
  `<path d="${pathData}" transform="translate(${offsetX + shadowOffsetX}, ${offsetY + shadowOffsetY})" fill="${shadowColor}" fill-opacity="${shadowOpacity}"/>`
3137
3141
  );
@@ -3150,7 +3154,7 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
3150
3154
  } else {
3151
3155
  pathAttrs.push(`fill="none"`);
3152
3156
  }
3153
- if (asset.stroke && asset.stroke.width && asset.stroke.width > 0) {
3157
+ if (asset.stroke && asset.stroke.width && toNumber(asset.stroke.width, 0) > 0) {
3154
3158
  pathAttrs.push(`stroke="${asset.stroke.color ?? "#000000"}"`);
3155
3159
  pathAttrs.push(`stroke-width="${asset.stroke.width}"`);
3156
3160
  if (asset.stroke.opacity !== void 0 && asset.stroke.opacity !== 1) {
@@ -3179,18 +3183,18 @@ function generateFillDefinition(fill, id, bounds) {
3179
3183
  return { fill: fill.color };
3180
3184
  }
3181
3185
  if (fill.type === "linear") {
3182
- const angle = fill.angle ?? 0;
3186
+ const angle = toNumber(fill.angle, 0);
3183
3187
  const rad = angle * Math.PI / 180;
3184
3188
  const x1 = 50 - Math.cos(rad) * 50;
3185
3189
  const y1 = 50 - Math.sin(rad) * 50;
3186
3190
  const x2 = 50 + Math.cos(rad) * 50;
3187
3191
  const y2 = 50 + Math.sin(rad) * 50;
3188
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
3192
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
3189
3193
  const defs = `<defs><linearGradient id="${id}" x1="${x1}%" y1="${y1}%" x2="${x2}%" y2="${y2}%">${stops}</linearGradient></defs>`;
3190
3194
  return { fill: `url(#${id})`, defs };
3191
3195
  }
3192
3196
  if (fill.type === "radial") {
3193
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
3197
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
3194
3198
  const defs = `<defs><radialGradient id="${id}" cx="50%" cy="50%" r="50%">${stops}</radialGradient></defs>`;
3195
3199
  return { fill: `url(#${id})`, defs };
3196
3200
  }
@@ -3592,8 +3596,8 @@ async function renderSvgAssetToPng(asset, options = {}) {
3592
3596
  targetWidth = dimensions.width || defaultWidth;
3593
3597
  targetHeight = dimensions.height || defaultHeight;
3594
3598
  } else if (asset.shape) {
3595
- targetWidth = asset.width ?? defaultWidth;
3596
- targetHeight = asset.height ?? defaultHeight;
3599
+ targetWidth = toNumber(asset.width, defaultWidth);
3600
+ targetHeight = toNumber(asset.height, defaultHeight);
3597
3601
  svgString = shapeToSvgString(asset, targetWidth, targetHeight);
3598
3602
  } else {
3599
3603
  throw new Error("Either 'src' or 'shape' must be provided");
@@ -9,9 +9,9 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
9
9
  height: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
10
10
  font: z.ZodOptional<z.ZodObject<{
11
11
  stroke: z.ZodOptional<z.ZodObject<{
12
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
13
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
14
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
12
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
13
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
14
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
15
15
  }, z.core.$strip>>;
16
16
  family: z.ZodDefault<z.ZodString>;
17
17
  size: z.ZodDefault<z.ZodNumber>;
@@ -59,7 +59,7 @@ declare const CanvasRichTextAssetSchema: z.ZodObject<{
59
59
  opacity: z.ZodDefault<z.ZodNumber>;
60
60
  }, z.core.$strip>>;
61
61
  background: z.ZodOptional<z.ZodObject<{
62
- borderRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
62
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
63
63
  color: z.ZodOptional<z.ZodString>;
64
64
  opacity: z.ZodDefault<z.ZodNumber>;
65
65
  }, z.core.$strip>>;
@@ -127,65 +127,65 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
127
127
  type: z.ZodEnum<{
128
128
  rectangle: "rectangle";
129
129
  }>;
130
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
131
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
132
- cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
130
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
131
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
132
+ cornerRadius: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
133
133
  }, z.core.$strip>, z.ZodObject<{
134
134
  type: z.ZodEnum<{
135
135
  circle: "circle";
136
136
  }>;
137
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
137
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
138
138
  }, z.core.$strip>, z.ZodObject<{
139
139
  type: z.ZodEnum<{
140
140
  ellipse: "ellipse";
141
141
  }>;
142
- radiusX: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
143
- radiusY: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
142
+ radiusX: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
143
+ radiusY: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
144
144
  }, z.core.$strip>, z.ZodObject<{
145
145
  type: z.ZodEnum<{
146
146
  line: "line";
147
147
  }>;
148
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
149
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
148
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
149
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
150
150
  }, z.core.$strip>, z.ZodObject<{
151
151
  type: z.ZodEnum<{
152
152
  polygon: "polygon";
153
153
  }>;
154
- sides: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
155
- radius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
154
+ sides: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
155
+ radius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
156
156
  }, z.core.$strip>, z.ZodObject<{
157
157
  type: z.ZodEnum<{
158
158
  star: "star";
159
159
  }>;
160
- points: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
161
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
162
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
160
+ points: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
161
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
162
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
163
163
  }, z.core.$strip>, z.ZodObject<{
164
164
  type: z.ZodEnum<{
165
165
  arrow: "arrow";
166
166
  }>;
167
- length: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
168
- headWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
169
- headLength: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
170
- shaftWidth: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
167
+ length: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
168
+ headWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
169
+ headLength: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
170
+ shaftWidth: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
171
171
  }, z.core.$strip>, z.ZodObject<{
172
172
  type: z.ZodEnum<{
173
173
  heart: "heart";
174
174
  }>;
175
- size: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
175
+ size: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
176
176
  }, z.core.$strip>, z.ZodObject<{
177
177
  type: z.ZodEnum<{
178
178
  cross: "cross";
179
179
  }>;
180
- width: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
181
- height: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
182
- thickness: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
180
+ width: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
181
+ height: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
182
+ thickness: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
183
183
  }, z.core.$strip>, z.ZodObject<{
184
184
  type: z.ZodEnum<{
185
185
  ring: "ring";
186
186
  }>;
187
- outerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
188
- innerRadius: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
187
+ outerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
188
+ innerRadius: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
189
189
  }, z.core.$strip>, z.ZodObject<{
190
190
  type: z.ZodEnum<{
191
191
  path: "path";
@@ -197,31 +197,31 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
197
197
  solid: "solid";
198
198
  }>;
199
199
  color: z.ZodDefault<z.ZodString>;
200
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
200
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
201
201
  }, z.core.$strip>, z.ZodObject<{
202
202
  type: z.ZodEnum<{
203
203
  linear: "linear";
204
204
  }>;
205
- angle: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
205
+ angle: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
206
206
  stops: z.ZodArray<z.ZodObject<{
207
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
208
- color: z.ZodString;
207
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
208
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
209
209
  }, z.core.$strip>>;
210
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
210
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
211
211
  }, z.core.$strip>, z.ZodObject<{
212
212
  type: z.ZodEnum<{
213
213
  radial: "radial";
214
214
  }>;
215
215
  stops: z.ZodArray<z.ZodObject<{
216
- offset: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>;
217
- color: z.ZodString;
216
+ offset: z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>;
217
+ color: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
218
218
  }, z.core.$strip>>;
219
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
219
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
220
220
  }, z.core.$strip>], "type">>;
221
221
  stroke: z.ZodOptional<z.ZodObject<{
222
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
223
- width: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
224
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
222
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
223
+ width: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
224
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
225
225
  lineCap: z.ZodOptional<z.ZodEnum<{
226
226
  butt: "butt";
227
227
  round: "round";
@@ -232,27 +232,27 @@ declare const CanvasSvgAssetSchema: z.ZodObject<{
232
232
  miter: "miter";
233
233
  bevel: "bevel";
234
234
  }>>;
235
- dashArray: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
236
- dashOffset: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
235
+ dashArray: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
236
+ dashOffset: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
237
237
  }, z.core.$strip>>;
238
238
  shadow: z.ZodOptional<z.ZodObject<{
239
- offsetX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
240
- offsetY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
241
- blur: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
242
- color: z.ZodDefault<z.ZodOptional<z.ZodString>>;
243
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
239
+ offsetX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
240
+ offsetY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
241
+ blur: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
242
+ color: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>>;
243
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
244
244
  }, z.core.$strip>>;
245
245
  transform: z.ZodOptional<z.ZodObject<{
246
- x: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
247
- y: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
248
- rotation: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
249
- scale: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
250
- originX: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
251
- originY: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
246
+ x: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
247
+ y: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
248
+ rotation: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
249
+ scale: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
250
+ originX: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
251
+ originY: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
252
252
  }, z.core.$strip>>;
253
- opacity: z.ZodDefault<z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>>;
254
- width: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
255
- height: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>>;
253
+ opacity: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>>;
254
+ width: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
255
+ height: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>, z.ZodString]>>;
256
256
  }, z.core.$strip>;
257
257
  type CanvasSvgAsset = z.infer<typeof CanvasSvgAssetSchema>;
258
258
 
package/dist/entry.web.js CHANGED
@@ -357,10 +357,10 @@ async function initHB(wasmBaseURL) {
357
357
  }
358
358
  };
359
359
  }
360
- const hbModule = await import("./hb-KXF2MJ2J.js");
360
+ const hbModule = await import("./hb-ODWKSLMB.js");
361
361
  const hbFactory = hbModule.default || hbModule;
362
362
  const hbInstance = await hbFactory({ wasmBinary });
363
- const hbjsModule = await import("./hbjs-ZTRARROF.js");
363
+ const hbjsModule = await import("./hbjs-HHU2TAW7.js");
364
364
  const hbjsWrapper = hbjsModule.default || hbjsModule;
365
365
  const hb = hbjsWrapper(hbInstance);
366
366
  if (!hb || typeof hb.createBuffer !== "function" || typeof hb.createFont !== "function") {
@@ -2738,6 +2738,10 @@ function quadraticToCubic(x0, y0, qx, qy, x, y) {
2738
2738
  }
2739
2739
 
2740
2740
  // src/core/resvg-renderer-web.ts
2741
+ function toNumber(value, defaultValue) {
2742
+ if (value === void 0) return defaultValue;
2743
+ return typeof value === "string" ? parseFloat(value) : value;
2744
+ }
2741
2745
  var resvgWasmModule = null;
2742
2746
  var wasmInitialized = false;
2743
2747
  var DEFAULT_RESVG_WASM_URL = "https://unpkg.com/@resvg/resvg-wasm@2.6.2/index_bg.wasm";
@@ -2850,8 +2854,8 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
2850
2854
  if (!asset.shape) {
2851
2855
  throw new Error("Shape is required for shape mode");
2852
2856
  }
2853
- const width = asset.width ?? defaultWidth;
2854
- const height = asset.height ?? defaultHeight;
2857
+ const width = toNumber(asset.width, defaultWidth);
2858
+ const height = toNumber(asset.height, defaultHeight);
2855
2859
  const pathData = generateShapePathData(asset.shape);
2856
2860
  const bounds = computeSimplePathBounds(pathData);
2857
2861
  const centerX = width / 2;
@@ -2861,15 +2865,15 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
2861
2865
  let offsetX = centerX - pathCenterX;
2862
2866
  let offsetY = centerY - pathCenterY;
2863
2867
  if (asset.transform) {
2864
- offsetX += asset.transform.x ?? 0;
2865
- offsetY += asset.transform.y ?? 0;
2868
+ offsetX += toNumber(asset.transform.x, 0);
2869
+ offsetY += toNumber(asset.transform.y, 0);
2866
2870
  }
2867
2871
  const elements = [];
2868
2872
  if (asset.shadow) {
2869
- const shadowOffsetX = asset.shadow.offsetX ?? 4;
2870
- const shadowOffsetY = asset.shadow.offsetY ?? 4;
2873
+ const shadowOffsetX = toNumber(asset.shadow.offsetX, 4);
2874
+ const shadowOffsetY = toNumber(asset.shadow.offsetY, 4);
2871
2875
  const shadowColor = asset.shadow.color ?? "#000000";
2872
- const shadowOpacity = asset.shadow.opacity ?? 0.5;
2876
+ const shadowOpacity = toNumber(asset.shadow.opacity, 0.5);
2873
2877
  elements.push(
2874
2878
  `<path d="${pathData}" transform="translate(${offsetX + shadowOffsetX}, ${offsetY + shadowOffsetY})" fill="${shadowColor}" fill-opacity="${shadowOpacity}"/>`
2875
2879
  );
@@ -2888,7 +2892,7 @@ function shapeToSvgString(asset, defaultWidth, defaultHeight) {
2888
2892
  } else {
2889
2893
  pathAttrs.push(`fill="none"`);
2890
2894
  }
2891
- if (asset.stroke && asset.stroke.width && asset.stroke.width > 0) {
2895
+ if (asset.stroke && asset.stroke.width && toNumber(asset.stroke.width, 0) > 0) {
2892
2896
  pathAttrs.push(`stroke="${asset.stroke.color ?? "#000000"}"`);
2893
2897
  pathAttrs.push(`stroke-width="${asset.stroke.width}"`);
2894
2898
  if (asset.stroke.opacity !== void 0 && asset.stroke.opacity !== 1) {
@@ -2917,18 +2921,18 @@ function generateFillDefinition(fill, id, _bounds) {
2917
2921
  return { fill: fill.color };
2918
2922
  }
2919
2923
  if (fill.type === "linear") {
2920
- const angle = fill.angle ?? 0;
2924
+ const angle = toNumber(fill.angle, 0);
2921
2925
  const rad = angle * Math.PI / 180;
2922
2926
  const x1 = 50 - Math.cos(rad) * 50;
2923
2927
  const y1 = 50 - Math.sin(rad) * 50;
2924
2928
  const x2 = 50 + Math.cos(rad) * 50;
2925
2929
  const y2 = 50 + Math.sin(rad) * 50;
2926
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
2930
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
2927
2931
  const defs = `<defs><linearGradient id="${id}" x1="${x1}%" y1="${y1}%" x2="${x2}%" y2="${y2}%">${stops}</linearGradient></defs>`;
2928
2932
  return { fill: `url(#${id})`, defs };
2929
2933
  }
2930
2934
  if (fill.type === "radial") {
2931
- const stops = fill.stops.map((s) => `<stop offset="${s.offset * 100}%" stop-color="${s.color}"/>`).join("");
2935
+ const stops = fill.stops.map((s) => `<stop offset="${toNumber(s.offset, 0) * 100}%" stop-color="${s.color}"/>`).join("");
2932
2936
  const defs = `<defs><radialGradient id="${id}" cx="50%" cy="50%" r="50%">${stops}</radialGradient></defs>`;
2933
2937
  return { fill: `url(#${id})`, defs };
2934
2938
  }
@@ -3322,8 +3326,8 @@ async function renderSvgAssetToPng(asset, options = {}) {
3322
3326
  targetWidth = dimensions.width || defaultWidth;
3323
3327
  targetHeight = dimensions.height || defaultHeight;
3324
3328
  } else if (asset.shape) {
3325
- targetWidth = asset.width ?? defaultWidth;
3326
- targetHeight = asset.height ?? defaultHeight;
3329
+ targetWidth = toNumber(asset.width, defaultWidth);
3330
+ targetHeight = toNumber(asset.height, defaultHeight);
3327
3331
  svgString = shapeToSvgString(asset, targetWidth, targetHeight);
3328
3332
  } else {
3329
3333
  throw new Error("Either 'src' or 'shape' must be provided");
@@ -4,9 +4,9 @@ import {
4
4
  __require
5
5
  } from "./chunk-HYGMWVDX.js";
6
6
 
7
- // node_modules/harfbuzzjs/hb.js
7
+ // node_modules/.pnpm/harfbuzzjs@0.4.12/node_modules/harfbuzzjs/hb.js
8
8
  var require_hb = __commonJS({
9
- "node_modules/harfbuzzjs/hb.js"(exports, module) {
9
+ "node_modules/.pnpm/harfbuzzjs@0.4.12/node_modules/harfbuzzjs/hb.js"(exports, module) {
10
10
  var createHarfBuzz = (() => {
11
11
  var _scriptName = typeof document != "undefined" ? document.currentScript?.src : void 0;
12
12
  return async function(moduleArg = {}) {
@@ -2,9 +2,9 @@ import {
2
2
  __commonJS
3
3
  } from "./chunk-HYGMWVDX.js";
4
4
 
5
- // node_modules/harfbuzzjs/hbjs.js
5
+ // node_modules/.pnpm/harfbuzzjs@0.4.12/node_modules/harfbuzzjs/hbjs.js
6
6
  var require_hbjs = __commonJS({
7
- "node_modules/harfbuzzjs/hbjs.js"(exports, module) {
7
+ "node_modules/.pnpm/harfbuzzjs@0.4.12/node_modules/harfbuzzjs/hbjs.js"(exports, module) {
8
8
  function hbjs(Module) {
9
9
  "use strict";
10
10
  var exports2 = Module.wasmExports;
package/package.json CHANGED
@@ -1,65 +1,65 @@
1
- {
2
- "name": "@shotstack/shotstack-canvas",
3
- "version": "1.9.3",
4
- "description": "Text layout & animation engine (HarfBuzz) for Node & Web - fully self-contained.",
5
- "type": "module",
6
- "main": "./dist/entry.node.cjs",
7
- "module": "./dist/entry.node.js",
8
- "browser": "./dist/entry.web.js",
9
- "types": "./dist/entry.node.d.ts",
10
- "exports": {
11
- ".": {
12
- "node": {
13
- "import": "./dist/entry.node.js",
14
- "require": "./dist/entry.node.cjs"
15
- },
16
- "browser": "./dist/entry.web.js",
17
- "default": "./dist/entry.web.js"
18
- }
19
- },
20
- "files": [
21
- "dist/**",
22
- "scripts/postinstall.js",
23
- "README.md",
24
- "LICENSE"
25
- ],
26
- "scripts": {
27
- "dev": "tsup --watch",
28
- "build": "tsup",
29
- "postinstall": "node scripts/postinstall.js",
30
- "vendor:harfbuzz": "node scripts/vendor-harfbuzz.js",
31
- "example:node": "node examples/node-example.mjs",
32
- "example:video": "node examples/node-video.mjs",
33
- "example:web": "vite dev examples/web-example",
34
- "prepublishOnly": "npm run build"
35
- },
36
- "publishConfig": {
37
- "access": "public",
38
- "registry": "https://registry.npmjs.org/"
39
- },
40
- "engines": {
41
- "node": ">=18"
42
- },
43
- "sideEffects": false,
44
- "dependencies": {
45
- "@resvg/resvg-js": "^2.6.2",
46
- "@resvg/resvg-wasm": "^2.6.2",
47
- "@shotstack/schemas": "^1.4.0",
48
- "canvas": "npm:@napi-rs/canvas@^0.1.54",
49
- "ffmpeg-static": "^5.2.0",
50
- "fontkit": "^2.0.4",
51
- "harfbuzzjs": "0.4.12",
52
- "opentype.js": "^1.3.4",
53
- "zod": "^4.2.0"
54
- },
55
- "devDependencies": {
56
- "@types/fluent-ffmpeg": "2.1.27",
57
- "@types/node": "^20.14.10",
58
- "fluent-ffmpeg": "^2.1.3",
59
- "tsup": "^8.2.3",
60
- "typescript": "^5.5.3",
61
- "vite": "^5.3.3",
62
- "vite-plugin-top-level-await": "1.6.0",
63
- "vite-plugin-wasm": "3.5.0"
64
- }
65
- }
1
+ {
2
+ "name": "@shotstack/shotstack-canvas",
3
+ "version": "1.9.4",
4
+ "description": "Text layout & animation engine (HarfBuzz) for Node & Web - fully self-contained.",
5
+ "type": "module",
6
+ "main": "./dist/entry.node.cjs",
7
+ "module": "./dist/entry.node.js",
8
+ "browser": "./dist/entry.web.js",
9
+ "types": "./dist/entry.node.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "node": {
13
+ "import": "./dist/entry.node.js",
14
+ "require": "./dist/entry.node.cjs"
15
+ },
16
+ "browser": "./dist/entry.web.js",
17
+ "default": "./dist/entry.web.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist/**",
22
+ "scripts/postinstall.js",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "scripts": {
27
+ "dev": "tsup --watch",
28
+ "build": "tsup",
29
+ "postinstall": "node scripts/postinstall.js",
30
+ "vendor:harfbuzz": "node scripts/vendor-harfbuzz.js",
31
+ "example:node": "node examples/node-example.mjs",
32
+ "example:video": "node examples/node-video.mjs",
33
+ "example:web": "vite dev examples/web-example",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "registry": "https://registry.npmjs.org/"
39
+ },
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "sideEffects": false,
44
+ "dependencies": {
45
+ "@resvg/resvg-js": "^2.6.2",
46
+ "@resvg/resvg-wasm": "^2.6.2",
47
+ "@shotstack/schemas": "^1.5.4",
48
+ "canvas": "npm:@napi-rs/canvas@^0.1.54",
49
+ "ffmpeg-static": "^5.2.0",
50
+ "fontkit": "^2.0.4",
51
+ "harfbuzzjs": "0.4.12",
52
+ "opentype.js": "^1.3.4",
53
+ "zod": "^4.2.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/fluent-ffmpeg": "2.1.27",
57
+ "@types/node": "^20.14.10",
58
+ "fluent-ffmpeg": "^2.1.3",
59
+ "tsup": "^8.2.3",
60
+ "typescript": "^5.5.3",
61
+ "vite": "^5.3.3",
62
+ "vite-plugin-top-level-await": "1.6.0",
63
+ "vite-plugin-wasm": "3.5.0"
64
+ }
65
+ }
@@ -1,58 +1,58 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Postinstall script to verify native canvas bindings are available
5
- * This helps catch issues early and provides helpful guidance
6
- */
7
-
8
- import { platform as _platform, arch as _arch } from 'os';
9
- import { dirname } from 'path';
10
- import { readdirSync } from 'fs';
11
- import { createRequire } from 'module';
12
-
13
- const require = createRequire(import.meta.url);
14
-
15
- const platform = _platform();
16
- const arch = _arch();
17
-
18
- // Map platform/arch to package names
19
- const platformMap = {
20
- 'darwin-arm64': '@napi-rs/canvas-darwin-arm64',
21
- 'darwin-x64': '@napi-rs/canvas-darwin-x64',
22
- 'linux-arm64': '@napi-rs/canvas-linux-arm64-gnu',
23
- 'linux-x64': '@napi-rs/canvas-linux-x64-gnu',
24
- 'win32-x64': '@napi-rs/canvas-win32-x64-msvc',
25
- 'linux-arm': '@napi-rs/canvas-linux-arm-gnueabihf',
26
- 'android-arm64': '@napi-rs/canvas-android-arm64',
27
- };
28
-
29
- const platformKey = `${platform}-${arch}`;
30
- const requiredPackage = platformMap[platformKey];
31
-
32
- if (!requiredPackage) {
33
- console.warn(`\n⚠️ Warning: Unsupported platform ${platformKey} for @napi-rs/canvas`);
34
- console.warn(' Canvas rendering may not work on this platform.\n');
35
- process.exit(0);
36
- }
37
-
38
- // Check if the native binding package is installed
39
- try {
40
- const packagePath = require.resolve(`${requiredPackage}/package.json`);
41
- const packageDir = dirname(packagePath);
42
-
43
- // Verify the .node file exists
44
- const nodeFiles = readdirSync(packageDir).filter(f => f.endsWith('.node'));
45
-
46
- if (nodeFiles.length > 0) {
47
- console.log(`✅ @shotstack/shotstack-canvas: Native canvas binding found for ${platformKey}`);
48
- } else {
49
- throw new Error('No .node file found');
50
- }
51
- } catch (error) {
52
- console.warn(`\n⚠️ Warning: Native canvas binding not found for ${platformKey}`);
53
- console.warn(` Expected package: ${requiredPackage}`);
54
- console.warn('\n If you see "Cannot find native binding" errors, try:');
55
- console.warn(' 1. Delete node_modules and package-lock.json');
56
- console.warn(' 2. Run: npm install');
57
- console.warn(` 3. Or manually install: npm install ${requiredPackage}\n`);
58
- }
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Postinstall script to verify native canvas bindings are available
5
+ * This helps catch issues early and provides helpful guidance
6
+ */
7
+
8
+ import { platform as _platform, arch as _arch } from 'os';
9
+ import { dirname } from 'path';
10
+ import { readdirSync } from 'fs';
11
+ import { createRequire } from 'module';
12
+
13
+ const require = createRequire(import.meta.url);
14
+
15
+ const platform = _platform();
16
+ const arch = _arch();
17
+
18
+ // Map platform/arch to package names
19
+ const platformMap = {
20
+ 'darwin-arm64': '@napi-rs/canvas-darwin-arm64',
21
+ 'darwin-x64': '@napi-rs/canvas-darwin-x64',
22
+ 'linux-arm64': '@napi-rs/canvas-linux-arm64-gnu',
23
+ 'linux-x64': '@napi-rs/canvas-linux-x64-gnu',
24
+ 'win32-x64': '@napi-rs/canvas-win32-x64-msvc',
25
+ 'linux-arm': '@napi-rs/canvas-linux-arm-gnueabihf',
26
+ 'android-arm64': '@napi-rs/canvas-android-arm64',
27
+ };
28
+
29
+ const platformKey = `${platform}-${arch}`;
30
+ const requiredPackage = platformMap[platformKey];
31
+
32
+ if (!requiredPackage) {
33
+ console.warn(`\n⚠️ Warning: Unsupported platform ${platformKey} for @napi-rs/canvas`);
34
+ console.warn(' Canvas rendering may not work on this platform.\n');
35
+ process.exit(0);
36
+ }
37
+
38
+ // Check if the native binding package is installed
39
+ try {
40
+ const packagePath = require.resolve(`${requiredPackage}/package.json`);
41
+ const packageDir = dirname(packagePath);
42
+
43
+ // Verify the .node file exists
44
+ const nodeFiles = readdirSync(packageDir).filter(f => f.endsWith('.node'));
45
+
46
+ if (nodeFiles.length > 0) {
47
+ console.log(`✅ @shotstack/shotstack-canvas: Native canvas binding found for ${platformKey}`);
48
+ } else {
49
+ throw new Error('No .node file found');
50
+ }
51
+ } catch (error) {
52
+ console.warn(`\n⚠️ Warning: Native canvas binding not found for ${platformKey}`);
53
+ console.warn(` Expected package: ${requiredPackage}`);
54
+ console.warn('\n If you see "Cannot find native binding" errors, try:');
55
+ console.warn(' 1. Delete node_modules and package-lock.json');
56
+ console.warn(' 2. Run: npm install');
57
+ console.warn(` 3. Or manually install: npm install ${requiredPackage}\n`);
58
+ }