@shotstack/shotstack-canvas 1.6.6 → 1.7.1

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.
@@ -30,14 +30,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/env/entry.node.ts
31
31
  var entry_node_exports = {};
32
32
  __export(entry_node_exports, {
33
+ CanvasRichTextAssetSchema: () => CanvasRichTextAssetSchema,
33
34
  createTextEngine: () => createTextEngine,
34
35
  isGlyphFill: () => isGlyphFill2,
35
36
  isShadowFill: () => isShadowFill2
36
37
  });
37
38
  module.exports = __toCommonJS(entry_node_exports);
38
39
 
39
- // src/schema/asset-schema.ts
40
- var import_joi = __toESM(require("joi"), 1);
40
+ // src/schema/zod-schema.ts
41
+ var import_zod = require("zod");
42
+ var import_zod2 = require("@shotstack/schemas/zod");
41
43
 
42
44
  // src/config/canvas-constants.ts
43
45
  var CANVAS_CONFIG = {
@@ -71,110 +73,127 @@ var CANVAS_CONFIG = {
71
73
  ]
72
74
  };
73
75
 
74
- // src/schema/asset-schema.ts
76
+ // src/schema/zod-schema.ts
75
77
  var HEX6 = /^#[A-Fa-f0-9]{6}$/;
76
- var gradientSchema = import_joi.default.object({
77
- type: import_joi.default.string().valid("linear", "radial").default("linear"),
78
- angle: import_joi.default.number().min(0).max(360).default(0),
79
- stops: import_joi.default.array().items(
80
- import_joi.default.object({
81
- offset: import_joi.default.number().min(0).max(1).required(),
82
- color: import_joi.default.string().pattern(HEX6).required()
83
- }).unknown(false)
84
- ).min(2).required()
85
- }).unknown(false);
86
- var shadowSchema = import_joi.default.object({
87
- offsetX: import_joi.default.number().default(0),
88
- offsetY: import_joi.default.number().default(0),
89
- blur: import_joi.default.number().min(0).default(0),
90
- color: import_joi.default.string().pattern(HEX6).default("#000000"),
91
- opacity: import_joi.default.number().min(0).max(1).default(0.5)
92
- }).unknown(false);
93
- var strokeSchema = import_joi.default.object({
94
- width: import_joi.default.number().min(0).default(0),
95
- color: import_joi.default.string().pattern(HEX6).default("#000000"),
96
- opacity: import_joi.default.number().min(0).max(1).default(1)
97
- }).unknown(false);
98
- var fontSchema = import_joi.default.object({
99
- family: import_joi.default.string().default(CANVAS_CONFIG.DEFAULTS.fontFamily),
100
- size: import_joi.default.number().min(CANVAS_CONFIG.LIMITS.minFontSize).max(CANVAS_CONFIG.LIMITS.maxFontSize).default(CANVAS_CONFIG.DEFAULTS.fontSize),
101
- weight: import_joi.default.alternatives().try(import_joi.default.string(), import_joi.default.number()).default("400"),
102
- color: import_joi.default.string().pattern(HEX6).default(CANVAS_CONFIG.DEFAULTS.color),
103
- opacity: import_joi.default.number().min(0).max(1).default(1),
104
- background: import_joi.default.string().pattern(HEX6).optional()
105
- }).unknown(false);
106
- var styleSchema = import_joi.default.object({
107
- letterSpacing: import_joi.default.number().default(0),
108
- lineHeight: import_joi.default.number().min(0).max(10).default(1.2),
109
- textTransform: import_joi.default.string().valid("none", "uppercase", "lowercase", "capitalize").default("none"),
110
- textDecoration: import_joi.default.string().valid("none", "underline", "line-through").default("none"),
111
- gradient: gradientSchema.optional()
112
- }).unknown(false);
113
- var alignmentSchema = import_joi.default.object({
114
- horizontal: import_joi.default.string().valid("left", "center", "right").default(CANVAS_CONFIG.DEFAULTS.textAlign),
115
- vertical: import_joi.default.string().valid("top", "middle", "bottom").default("middle")
116
- }).unknown(false);
117
- var animationSchema = import_joi.default.object({
118
- preset: import_joi.default.string().valid(...CANVAS_CONFIG.ANIMATION_TYPES),
119
- speed: import_joi.default.number().min(0.1).max(10).default(1),
120
- duration: import_joi.default.number().min(CANVAS_CONFIG.LIMITS.minDuration).max(CANVAS_CONFIG.LIMITS.maxDuration).optional(),
121
- style: import_joi.default.string().valid("character", "word").optional().when("preset", {
122
- is: import_joi.default.valid("typewriter", "shift", "fadeIn", "slideIn"),
123
- then: import_joi.default.optional(),
124
- otherwise: import_joi.default.forbidden()
125
- }),
126
- direction: import_joi.default.string().optional().when("preset", {
127
- switch: [
128
- { is: "ascend", then: import_joi.default.valid("up", "down") },
129
- { is: "shift", then: import_joi.default.valid("left", "right", "up", "down") },
130
- { is: "slideIn", then: import_joi.default.valid("left", "right", "up", "down") },
131
- { is: "movingLetters", then: import_joi.default.valid("left", "right", "up", "down") }
132
- ],
133
- otherwise: import_joi.default.forbidden()
78
+ var customFontSchema = import_zod.z.object({
79
+ src: import_zod.z.string().url(),
80
+ family: import_zod.z.string(),
81
+ weight: import_zod.z.union([import_zod.z.string(), import_zod.z.number()]).optional(),
82
+ style: import_zod.z.string().optional(),
83
+ originalFamily: import_zod.z.string().optional()
84
+ });
85
+ var borderSchema = import_zod.z.object({
86
+ width: import_zod.z.number().min(0).default(0),
87
+ color: import_zod.z.string().regex(HEX6).default("#000000"),
88
+ opacity: import_zod.z.number().min(0).max(1).default(1),
89
+ radius: import_zod.z.number().min(0).default(0)
90
+ });
91
+ var paddingSchema = import_zod.z.union([
92
+ import_zod.z.number().min(0),
93
+ import_zod.z.object({
94
+ top: import_zod.z.number().min(0).default(0),
95
+ right: import_zod.z.number().min(0).default(0),
96
+ bottom: import_zod.z.number().min(0).default(0),
97
+ left: import_zod.z.number().min(0).default(0)
134
98
  })
135
- }).unknown(false);
136
- var borderSchema = import_joi.default.object({
137
- width: import_joi.default.number().min(0).default(0),
138
- color: import_joi.default.string().pattern(HEX6).default("#000000"),
139
- opacity: import_joi.default.number().min(0).max(1).default(1),
140
- radius: import_joi.default.number().min(0).default(0)
141
- }).unknown(false);
142
- var backgroundSchema = import_joi.default.object({
143
- color: import_joi.default.string().pattern(HEX6).optional(),
144
- opacity: import_joi.default.number().min(0).max(1).default(1)
145
- }).unknown(false);
146
- var paddingSchema = import_joi.default.alternatives().try(
147
- import_joi.default.number().min(0).default(0),
148
- import_joi.default.object({
149
- top: import_joi.default.number().min(0).default(0),
150
- right: import_joi.default.number().min(0).default(0),
151
- bottom: import_joi.default.number().min(0).default(0),
152
- left: import_joi.default.number().min(0).default(0)
153
- }).unknown(false)
154
- );
155
- var customFontSchema = import_joi.default.object({
156
- src: import_joi.default.string().uri().required(),
157
- family: import_joi.default.string().required(),
158
- weight: import_joi.default.alternatives().try(import_joi.default.string(), import_joi.default.number()).optional(),
159
- style: import_joi.default.string().optional(),
160
- originalFamily: import_joi.default.string().optional()
161
- }).unknown(false);
162
- var RichTextAssetSchema = import_joi.default.object({
163
- type: import_joi.default.string().valid("rich-text").required(),
164
- text: import_joi.default.string().allow("").max(CANVAS_CONFIG.LIMITS.maxTextLength).default(""),
165
- width: import_joi.default.number().min(CANVAS_CONFIG.LIMITS.minWidth).max(CANVAS_CONFIG.LIMITS.maxWidth).default(CANVAS_CONFIG.DEFAULTS.width).optional(),
166
- height: import_joi.default.number().min(CANVAS_CONFIG.LIMITS.minHeight).max(CANVAS_CONFIG.LIMITS.maxHeight).default(CANVAS_CONFIG.DEFAULTS.height).optional(),
167
- font: fontSchema.optional(),
168
- style: styleSchema.optional(),
169
- stroke: strokeSchema.optional(),
170
- shadow: shadowSchema.optional(),
171
- background: backgroundSchema.optional(),
99
+ ]);
100
+ var canvasFontSchema = import_zod2.richTextFontSchema.extend({
101
+ family: import_zod.z.string().default(CANVAS_CONFIG.DEFAULTS.fontFamily),
102
+ size: import_zod.z.number().int().min(CANVAS_CONFIG.LIMITS.minFontSize).max(CANVAS_CONFIG.LIMITS.maxFontSize).default(CANVAS_CONFIG.DEFAULTS.fontSize),
103
+ weight: import_zod.z.union([import_zod.z.string(), import_zod.z.number()]).default("400"),
104
+ color: import_zod.z.string().regex(HEX6).default(CANVAS_CONFIG.DEFAULTS.color),
105
+ opacity: import_zod.z.number().min(0).max(1).default(1),
106
+ background: import_zod.z.string().regex(HEX6).optional()
107
+ });
108
+ var canvasGradientSchema = import_zod.z.object({
109
+ type: import_zod.z.enum(["linear", "radial"]).default("linear"),
110
+ angle: import_zod.z.number().min(0).max(360).default(0),
111
+ stops: import_zod.z.array(import_zod.z.object({
112
+ offset: import_zod.z.number().min(0).max(1),
113
+ color: import_zod.z.string().regex(HEX6)
114
+ })).min(2)
115
+ });
116
+ var canvasStyleSchema = import_zod2.richTextStyleSchema.extend({
117
+ letterSpacing: import_zod.z.number().default(0),
118
+ lineHeight: import_zod.z.number().min(0).max(10).default(1.2),
119
+ textTransform: import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).default("none"),
120
+ textDecoration: import_zod.z.enum(["none", "underline", "line-through"]).default("none"),
121
+ gradient: canvasGradientSchema.optional()
122
+ });
123
+ var canvasStrokeSchema = import_zod2.richTextStrokeSchema.extend({
124
+ width: import_zod.z.number().min(0).default(0),
125
+ color: import_zod.z.string().regex(HEX6).default("#000000"),
126
+ opacity: import_zod.z.number().min(0).max(1).default(1)
127
+ });
128
+ var canvasShadowSchema = import_zod2.richTextShadowSchema.extend({
129
+ offsetX: import_zod.z.number().default(0),
130
+ offsetY: import_zod.z.number().default(0),
131
+ blur: import_zod.z.number().min(0).default(0),
132
+ color: import_zod.z.string().regex(HEX6).default("#000000"),
133
+ opacity: import_zod.z.number().min(0).max(1).default(0.5)
134
+ });
135
+ var canvasBackgroundSchema = import_zod2.richTextBackgroundSchema.extend({
136
+ color: import_zod.z.string().regex(HEX6).optional(),
137
+ opacity: import_zod.z.number().min(0).max(1).default(1)
138
+ });
139
+ var canvasAlignmentSchema = import_zod2.richTextAlignmentSchema.extend({
140
+ horizontal: import_zod.z.enum(["left", "center", "right"]).default(CANVAS_CONFIG.DEFAULTS.textAlign),
141
+ vertical: import_zod.z.enum(["top", "middle", "bottom"]).default("middle")
142
+ });
143
+ var canvasAnimationSchema = import_zod2.richTextAnimationSchema.extend({
144
+ preset: import_zod.z.enum(CANVAS_CONFIG.ANIMATION_TYPES),
145
+ speed: import_zod.z.number().min(0.1).max(10).default(1),
146
+ duration: import_zod.z.number().min(CANVAS_CONFIG.LIMITS.minDuration).max(CANVAS_CONFIG.LIMITS.maxDuration).optional(),
147
+ style: import_zod.z.enum(["character", "word"]).optional(),
148
+ direction: import_zod.z.enum(["left", "right", "up", "down"]).optional()
149
+ }).superRefine((data, ctx) => {
150
+ const presetsWithStyle = ["typewriter", "shift", "fadeIn", "slideIn"];
151
+ if (data.style && !presetsWithStyle.includes(data.preset)) {
152
+ ctx.addIssue({
153
+ code: import_zod.z.ZodIssueCode.custom,
154
+ message: `style is not allowed for preset "${data.preset}"`,
155
+ path: ["style"]
156
+ });
157
+ }
158
+ const directionRules = {
159
+ ascend: ["up", "down"],
160
+ shift: ["left", "right", "up", "down"],
161
+ slideIn: ["left", "right", "up", "down"],
162
+ movingLetters: ["left", "right", "up", "down"]
163
+ };
164
+ if (data.direction) {
165
+ const allowedDirections = directionRules[data.preset];
166
+ if (!allowedDirections) {
167
+ ctx.addIssue({
168
+ code: import_zod.z.ZodIssueCode.custom,
169
+ message: `direction is not allowed for preset "${data.preset}"`,
170
+ path: ["direction"]
171
+ });
172
+ } else if (!allowedDirections.includes(data.direction)) {
173
+ ctx.addIssue({
174
+ code: import_zod.z.ZodIssueCode.custom,
175
+ message: `direction "${data.direction}" is not valid for preset "${data.preset}"`,
176
+ path: ["direction"]
177
+ });
178
+ }
179
+ }
180
+ });
181
+ var CanvasRichTextAssetSchema = import_zod2.richTextAssetSchema.extend({
182
+ type: import_zod.z.literal("rich-text"),
183
+ text: import_zod.z.string().max(CANVAS_CONFIG.LIMITS.maxTextLength).default(""),
184
+ width: import_zod.z.number().int().min(CANVAS_CONFIG.LIMITS.minWidth).max(CANVAS_CONFIG.LIMITS.maxWidth).default(CANVAS_CONFIG.DEFAULTS.width).optional(),
185
+ height: import_zod.z.number().int().min(CANVAS_CONFIG.LIMITS.minHeight).max(CANVAS_CONFIG.LIMITS.maxHeight).default(CANVAS_CONFIG.DEFAULTS.height).optional(),
186
+ font: canvasFontSchema.optional(),
187
+ style: canvasStyleSchema.optional(),
188
+ stroke: canvasStrokeSchema.optional(),
189
+ shadow: canvasShadowSchema.optional(),
190
+ background: canvasBackgroundSchema.optional(),
172
191
  border: borderSchema.optional(),
173
192
  padding: paddingSchema.optional(),
174
- align: alignmentSchema.optional(),
175
- animation: animationSchema.optional(),
176
- customFonts: import_joi.default.array().items(customFontSchema).optional()
177
- }).unknown(false);
193
+ align: canvasAlignmentSchema.optional(),
194
+ animation: canvasAnimationSchema.optional(),
195
+ customFonts: import_zod.z.array(customFontSchema).optional()
196
+ }).strict();
178
197
 
179
198
  // src/wasm/hb-loader.ts
180
199
  var import_meta = {};
@@ -2483,19 +2502,12 @@ async function createTextEngine(opts = {}) {
2483
2502
  }
2484
2503
  return {
2485
2504
  validate(input) {
2486
- try {
2487
- const { value, error } = RichTextAssetSchema.validate(input, {
2488
- abortEarly: false,
2489
- convert: true
2490
- });
2491
- if (error) throw error;
2492
- return { value };
2493
- } catch (err) {
2494
- if (err instanceof Error) {
2495
- throw new Error(`Validation failed: ${err.message}`);
2496
- }
2497
- throw new Error(`Validation failed: ${String(err)}`);
2505
+ const result = CanvasRichTextAssetSchema.safeParse(input);
2506
+ if (!result.success) {
2507
+ const messages = result.error.issues.map((i) => i.message).join(". ");
2508
+ throw new Error(`Validation failed: ${messages}`);
2498
2509
  }
2510
+ return { value: result.data };
2499
2511
  },
2500
2512
  async registerFontFromFile(path, desc) {
2501
2513
  try {
@@ -2690,6 +2702,7 @@ async function createTextEngine(opts = {}) {
2690
2702
  }
2691
2703
  // Annotate the CommonJS export names for ESM import in node:
2692
2704
  0 && (module.exports = {
2705
+ CanvasRichTextAssetSchema,
2693
2706
  createTextEngine,
2694
2707
  isGlyphFill,
2695
2708
  isShadowFill
@@ -1,105 +1,124 @@
1
+ import { z } from 'zod';
1
2
  import { components } from '@shotstack/schemas';
2
3
 
3
- declare const CANVAS_CONFIG: {
4
- DEFAULTS: {
5
- width: number;
6
- height: number;
7
- pixelRatio: number;
8
- fontFamily: string;
9
- fontSize: number;
10
- color: string;
11
- textAlign: "center";
12
- };
13
- LIMITS: {
14
- minWidth: number;
15
- maxWidth: number;
16
- minHeight: number;
17
- maxHeight: number;
18
- minFontSize: number;
19
- maxFontSize: number;
20
- minDuration: number;
21
- maxDuration: number;
22
- maxTextLength: number;
23
- };
24
- ANIMATION_TYPES: readonly ["typewriter", "fadeIn", "slideIn", "shift", "ascend", "movingLetters"];
25
- };
4
+ declare const CanvasRichTextAssetSchema: z.ZodObject<{
5
+ type: z.ZodLiteral<"rich-text">;
6
+ text: z.ZodDefault<z.ZodString>;
7
+ width: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
8
+ height: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
9
+ font: z.ZodOptional<z.ZodObject<{
10
+ style: z.ZodOptional<z.ZodEnum<{
11
+ normal: "normal";
12
+ italic: "italic";
13
+ oblique: "oblique";
14
+ }>>;
15
+ family: z.ZodDefault<z.ZodString>;
16
+ size: z.ZodDefault<z.ZodNumber>;
17
+ weight: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
18
+ color: z.ZodDefault<z.ZodString>;
19
+ opacity: z.ZodDefault<z.ZodNumber>;
20
+ background: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$strip>>;
22
+ style: z.ZodOptional<z.ZodObject<{
23
+ letterSpacing: z.ZodDefault<z.ZodNumber>;
24
+ lineHeight: z.ZodDefault<z.ZodNumber>;
25
+ textTransform: z.ZodDefault<z.ZodEnum<{
26
+ none: "none";
27
+ uppercase: "uppercase";
28
+ lowercase: "lowercase";
29
+ capitalize: "capitalize";
30
+ }>>;
31
+ textDecoration: z.ZodDefault<z.ZodEnum<{
32
+ none: "none";
33
+ underline: "underline";
34
+ "line-through": "line-through";
35
+ }>>;
36
+ gradient: z.ZodOptional<z.ZodObject<{
37
+ type: z.ZodDefault<z.ZodEnum<{
38
+ linear: "linear";
39
+ radial: "radial";
40
+ }>>;
41
+ angle: z.ZodDefault<z.ZodNumber>;
42
+ stops: z.ZodArray<z.ZodObject<{
43
+ offset: z.ZodNumber;
44
+ color: z.ZodString;
45
+ }, z.core.$strip>>;
46
+ }, z.core.$strip>>;
47
+ }, z.core.$strip>>;
48
+ stroke: z.ZodOptional<z.ZodObject<{
49
+ width: z.ZodDefault<z.ZodNumber>;
50
+ color: z.ZodDefault<z.ZodString>;
51
+ opacity: z.ZodDefault<z.ZodNumber>;
52
+ }, z.core.$strip>>;
53
+ shadow: z.ZodOptional<z.ZodObject<{
54
+ offsetX: z.ZodDefault<z.ZodNumber>;
55
+ offsetY: z.ZodDefault<z.ZodNumber>;
56
+ blur: z.ZodDefault<z.ZodNumber>;
57
+ color: z.ZodDefault<z.ZodString>;
58
+ opacity: z.ZodDefault<z.ZodNumber>;
59
+ }, z.core.$strip>>;
60
+ background: z.ZodOptional<z.ZodObject<{
61
+ borderRadius: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
62
+ color: z.ZodOptional<z.ZodString>;
63
+ opacity: z.ZodDefault<z.ZodNumber>;
64
+ }, z.core.$strip>>;
65
+ border: z.ZodOptional<z.ZodObject<{
66
+ width: z.ZodDefault<z.ZodNumber>;
67
+ color: z.ZodDefault<z.ZodString>;
68
+ opacity: z.ZodDefault<z.ZodNumber>;
69
+ radius: z.ZodDefault<z.ZodNumber>;
70
+ }, z.core.$strip>>;
71
+ padding: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodObject<{
72
+ top: z.ZodDefault<z.ZodNumber>;
73
+ right: z.ZodDefault<z.ZodNumber>;
74
+ bottom: z.ZodDefault<z.ZodNumber>;
75
+ left: z.ZodDefault<z.ZodNumber>;
76
+ }, z.core.$strip>]>>;
77
+ align: z.ZodOptional<z.ZodObject<{
78
+ horizontal: z.ZodDefault<z.ZodEnum<{
79
+ center: "center";
80
+ right: "right";
81
+ left: "left";
82
+ }>>;
83
+ vertical: z.ZodDefault<z.ZodEnum<{
84
+ top: "top";
85
+ bottom: "bottom";
86
+ middle: "middle";
87
+ }>>;
88
+ }, z.core.$strip>>;
89
+ animation: z.ZodOptional<z.ZodObject<{
90
+ preset: z.ZodEnum<{
91
+ typewriter: "typewriter";
92
+ fadeIn: "fadeIn";
93
+ slideIn: "slideIn";
94
+ shift: "shift";
95
+ ascend: "ascend";
96
+ movingLetters: "movingLetters";
97
+ }>;
98
+ speed: z.ZodDefault<z.ZodNumber>;
99
+ duration: z.ZodOptional<z.ZodNumber>;
100
+ style: z.ZodOptional<z.ZodEnum<{
101
+ character: "character";
102
+ word: "word";
103
+ }>>;
104
+ direction: z.ZodOptional<z.ZodEnum<{
105
+ right: "right";
106
+ left: "left";
107
+ up: "up";
108
+ down: "down";
109
+ }>>;
110
+ }, z.core.$strip>>;
111
+ customFonts: z.ZodOptional<z.ZodArray<z.ZodObject<{
112
+ src: z.ZodString;
113
+ family: z.ZodString;
114
+ weight: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
115
+ style: z.ZodOptional<z.ZodString>;
116
+ originalFamily: z.ZodOptional<z.ZodString>;
117
+ }, z.core.$strip>>>;
118
+ }, z.core.$strict>;
119
+ type CanvasRichTextAsset = z.infer<typeof CanvasRichTextAssetSchema>;
26
120
 
27
121
  type ShotstackRichTextAsset = components["schemas"]["RichTextAsset"];
28
- type RichTextValidated = Required<{
29
- type: "rich-text";
30
- text: string;
31
- width?: number;
32
- height?: number;
33
- font?: {
34
- family: string;
35
- size: number;
36
- weight: string | number;
37
- color: string;
38
- opacity: number;
39
- background?: string;
40
- };
41
- style?: {
42
- letterSpacing: number;
43
- lineHeight: number;
44
- textTransform: "none" | "uppercase" | "lowercase" | "capitalize";
45
- textDecoration: "none" | "underline" | "line-through";
46
- gradient?: {
47
- type: "linear" | "radial";
48
- angle: number;
49
- stops: {
50
- offset: number;
51
- color: string;
52
- }[];
53
- };
54
- };
55
- stroke?: {
56
- width: number;
57
- color: string;
58
- opacity: number;
59
- };
60
- shadow?: {
61
- offsetX: number;
62
- offsetY: number;
63
- blur: number;
64
- color: string;
65
- opacity: number;
66
- };
67
- background?: {
68
- color?: string;
69
- opacity: number;
70
- };
71
- border?: {
72
- width: number;
73
- color: string;
74
- opacity: number;
75
- radius: number;
76
- };
77
- padding?: number | {
78
- top: number;
79
- right: number;
80
- bottom: number;
81
- left: number;
82
- };
83
- align?: {
84
- horizontal: "left" | "center" | "right";
85
- vertical: "top" | "middle" | "bottom";
86
- };
87
- animation?: {
88
- preset: typeof CANVAS_CONFIG.ANIMATION_TYPES[number];
89
- speed: number;
90
- duration?: number;
91
- style?: "character" | "word";
92
- direction?: "left" | "right" | "up" | "down";
93
- };
94
- customFonts?: {
95
- src: string;
96
- family: string;
97
- weight?: string | number;
98
- style?: string;
99
- originalFamily?: string;
100
- }[];
101
- }>;
102
-
103
122
  type RGBA = {
104
123
  r: number;
105
124
  g: number;
@@ -221,7 +240,7 @@ type Renderer = {
221
240
  render(ops: DrawOp[]): Promise<void>;
222
241
  toPNG?: () => Promise<Buffer>;
223
242
  };
224
- type ValidAsset = RichTextValidated;
243
+ type ValidAsset = CanvasRichTextAsset;
225
244
  declare const isShadowFill: (op: DrawOp) => op is Extract<DrawOp, {
226
245
  op: "FillPath";
227
246
  }> & {
@@ -258,7 +277,7 @@ declare function createTextEngine(opts?: {
258
277
  wasmBaseURL?: string;
259
278
  }): Promise<{
260
279
  validate(input: unknown): {
261
- value: RichTextValidated;
280
+ value: CanvasRichTextAsset;
262
281
  };
263
282
  registerFontFromFile(path: string, desc: {
264
283
  family: string;
@@ -268,7 +287,7 @@ declare function createTextEngine(opts?: {
268
287
  family: string;
269
288
  weight?: string | number;
270
289
  }): Promise<void>;
271
- renderFrame(asset: RichTextValidated, tSeconds: number, clipDuration?: number): Promise<DrawOp[]>;
290
+ renderFrame(asset: CanvasRichTextAsset, tSeconds: number, clipDuration?: number): Promise<DrawOp[]>;
272
291
  createRenderer(p: {
273
292
  width?: number;
274
293
  height?: number;
@@ -277,8 +296,8 @@ declare function createTextEngine(opts?: {
277
296
  render(ops: DrawOp[]): Promise<void>;
278
297
  toPNG(): Promise<Buffer>;
279
298
  }>;
280
- generateVideo(asset: RichTextValidated, options: Partial<VideoGenerationOptions>): Promise<string>;
299
+ generateVideo(asset: CanvasRichTextAsset, options: Partial<VideoGenerationOptions>): Promise<string>;
281
300
  destroy(): void;
282
301
  }>;
283
302
 
284
- export { type DrawOp, type EngineInit, type Glyph, type GradientSpec, type RGBA, type Renderer, type ShapedLine, type ShotstackRichTextAsset, type ValidAsset, createTextEngine, isGlyphFill, isShadowFill };
303
+ export { type CanvasRichTextAsset, CanvasRichTextAssetSchema, type DrawOp, type EngineInit, type Glyph, type GradientSpec, type RGBA, type Renderer, type ShapedLine, type ShotstackRichTextAsset, type ValidAsset, createTextEngine, isGlyphFill, isShadowFill };