@spectratools/graphic-designer-cli 0.3.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.
@@ -0,0 +1,3 @@
1
+ import 'zod';
2
+ export { A as AutoLayoutConfig, B as BuiltInTheme, C as CardElement, e as CodeBlockElement, ae as CodeBlockStyle, f as ConnectionElement, g as ConstraintSpec, j as Decorator, k as DesignSafeFrame, D as DesignSpec, l as DrawBadge, m as DrawBezier, n as DrawCircle, b as DrawCommand, o as DrawFontFamily, p as DrawGradientRect, q as DrawLine, r as DrawPath, s as DrawPoint, t as DrawRect, u as DrawText, E as Element, F as FlowNodeElement, G as Gradient, v as GradientOverlayDecorator, af as GradientStop, y as GridLayoutConfig, I as ImageElement, L as LayoutConfig, ag as LinearGradient, M as ManualLayoutConfig, ah as RadialGradient, H as RainbowRuleDecorator, S as ShapeElement, K as StackLayoutConfig, N as TerminalElement, O as TextElement, c as Theme, P as ThemeInput, V as VignetteDecorator, Q as builtInThemeBackgrounds, U as builtInThemes, Y as defaultAutoLayout, Z as defaultCanvas, _ as defaultConstraints, $ as defaultGridLayout, a0 as defaultLayout, a1 as defaultStackLayout, a2 as defaultTheme, a3 as deriveSafeFrame, a4 as designSpecSchema, a8 as inferLayout, aa as parseDesignSpec, ac as resolveTheme } from './spec.schema-BxXBTOn-.js';
3
+ import '@napi-rs/canvas';
@@ -0,0 +1,604 @@
1
+ // src/spec.schema.ts
2
+ import { z as z2 } from "zod";
3
+
4
+ // src/themes/builtin.ts
5
+ import { z } from "zod";
6
+ var colorHexSchema = z.string().regex(/^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, "Expected #RRGGBB or #RRGGBBAA color");
7
+ var fontFamilySchema = z.string().min(1).max(120);
8
+ var codeThemeSchema = z.object({
9
+ background: colorHexSchema,
10
+ text: colorHexSchema,
11
+ comment: colorHexSchema,
12
+ keyword: colorHexSchema,
13
+ string: colorHexSchema,
14
+ number: colorHexSchema,
15
+ function: colorHexSchema,
16
+ variable: colorHexSchema,
17
+ operator: colorHexSchema,
18
+ punctuation: colorHexSchema
19
+ }).strict();
20
+ var themeSchema = z.object({
21
+ background: colorHexSchema,
22
+ surface: colorHexSchema,
23
+ surfaceMuted: colorHexSchema,
24
+ surfaceElevated: colorHexSchema,
25
+ text: colorHexSchema,
26
+ textMuted: colorHexSchema,
27
+ textInverse: colorHexSchema,
28
+ primary: colorHexSchema,
29
+ secondary: colorHexSchema,
30
+ accent: colorHexSchema,
31
+ success: colorHexSchema,
32
+ warning: colorHexSchema,
33
+ error: colorHexSchema,
34
+ info: colorHexSchema,
35
+ border: colorHexSchema,
36
+ borderMuted: colorHexSchema,
37
+ code: codeThemeSchema,
38
+ fonts: z.object({
39
+ heading: fontFamilySchema,
40
+ body: fontFamilySchema,
41
+ mono: fontFamilySchema
42
+ }).strict()
43
+ }).strict();
44
+ var builtInThemeSchema = z.enum([
45
+ "dark",
46
+ "light",
47
+ "dracula",
48
+ "github-dark",
49
+ "one-dark",
50
+ "nord"
51
+ ]);
52
+ var baseDarkTheme = {
53
+ background: "#0B1020",
54
+ surface: "#111936",
55
+ surfaceMuted: "#1A2547",
56
+ surfaceElevated: "#202D55",
57
+ text: "#E8EEFF",
58
+ textMuted: "#AAB9E8",
59
+ textInverse: "#0B1020",
60
+ primary: "#7AA2FF",
61
+ secondary: "#65E4A3",
62
+ accent: "#65E4A3",
63
+ success: "#2FCB7E",
64
+ warning: "#F4B860",
65
+ error: "#F97070",
66
+ info: "#60A5FA",
67
+ border: "#32426E",
68
+ borderMuted: "#24345F",
69
+ code: {
70
+ background: "#0F172A",
71
+ text: "#E2E8F0",
72
+ comment: "#64748B",
73
+ keyword: "#C084FC",
74
+ string: "#86EFAC",
75
+ number: "#FCA5A5",
76
+ function: "#93C5FD",
77
+ variable: "#E2E8F0",
78
+ operator: "#F8FAFC",
79
+ punctuation: "#CBD5E1"
80
+ },
81
+ fonts: {
82
+ heading: "Space Grotesk",
83
+ body: "Inter",
84
+ mono: "JetBrains Mono"
85
+ }
86
+ };
87
+ var builtInThemeBackgrounds = {
88
+ dark: {
89
+ type: "linear",
90
+ angle: 180,
91
+ stops: [
92
+ { offset: 0, color: "#0B1020" },
93
+ { offset: 1, color: "#1A2547" }
94
+ ]
95
+ }
96
+ };
97
+ var builtInThemes = {
98
+ dark: baseDarkTheme,
99
+ light: {
100
+ ...baseDarkTheme,
101
+ background: "#F8FAFC",
102
+ surface: "#FFFFFF",
103
+ surfaceMuted: "#EEF2FF",
104
+ surfaceElevated: "#FFFFFF",
105
+ text: "#0F172A",
106
+ textMuted: "#334155",
107
+ textInverse: "#F8FAFC",
108
+ border: "#CBD5E1",
109
+ borderMuted: "#E2E8F0",
110
+ code: {
111
+ ...baseDarkTheme.code,
112
+ background: "#F1F5F9",
113
+ text: "#0F172A",
114
+ variable: "#1E293B",
115
+ punctuation: "#334155",
116
+ operator: "#0F172A"
117
+ }
118
+ },
119
+ dracula: {
120
+ ...baseDarkTheme,
121
+ background: "#282A36",
122
+ surface: "#303247",
123
+ surfaceMuted: "#3A3D55",
124
+ surfaceElevated: "#44475A",
125
+ text: "#F8F8F2",
126
+ textMuted: "#BD93F9",
127
+ primary: "#8BE9FD",
128
+ accent: "#50FA7B",
129
+ secondary: "#FFB86C",
130
+ success: "#50FA7B",
131
+ warning: "#FFB86C",
132
+ error: "#FF5555",
133
+ info: "#8BE9FD",
134
+ border: "#44475A",
135
+ borderMuted: "#3A3D55"
136
+ },
137
+ "github-dark": {
138
+ ...baseDarkTheme,
139
+ background: "#0D1117",
140
+ surface: "#161B22",
141
+ surfaceMuted: "#1F2632",
142
+ surfaceElevated: "#21262D",
143
+ text: "#E6EDF3",
144
+ textMuted: "#8B949E",
145
+ primary: "#58A6FF",
146
+ accent: "#3FB950",
147
+ secondary: "#A5D6FF",
148
+ border: "#30363D",
149
+ borderMuted: "#21262D"
150
+ },
151
+ "one-dark": {
152
+ ...baseDarkTheme,
153
+ background: "#282C34",
154
+ surface: "#2F343F",
155
+ surfaceMuted: "#3A404C",
156
+ surfaceElevated: "#434A59",
157
+ text: "#ABB2BF",
158
+ textMuted: "#7F848E",
159
+ primary: "#61AFEF",
160
+ accent: "#98C379",
161
+ secondary: "#E5C07B",
162
+ warning: "#E5C07B",
163
+ error: "#E06C75",
164
+ border: "#4B5263",
165
+ borderMuted: "#3A404C"
166
+ },
167
+ nord: {
168
+ ...baseDarkTheme,
169
+ background: "#2E3440",
170
+ surface: "#3B4252",
171
+ surfaceMuted: "#434C5E",
172
+ surfaceElevated: "#4C566A",
173
+ text: "#ECEFF4",
174
+ textMuted: "#D8DEE9",
175
+ primary: "#88C0D0",
176
+ accent: "#A3BE8C",
177
+ secondary: "#81A1C1",
178
+ success: "#A3BE8C",
179
+ warning: "#EBCB8B",
180
+ error: "#BF616A",
181
+ info: "#5E81AC",
182
+ border: "#4C566A",
183
+ borderMuted: "#434C5E"
184
+ }
185
+ };
186
+ var defaultTheme = builtInThemes.dark;
187
+
188
+ // src/themes/index.ts
189
+ function resolveTheme(theme) {
190
+ if (typeof theme === "string") {
191
+ return builtInThemes[theme];
192
+ }
193
+ return theme;
194
+ }
195
+
196
+ // src/spec.schema.ts
197
+ var colorHexSchema2 = z2.string().regex(/^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, "Expected #RRGGBB or #RRGGBBAA color");
198
+ var gradientStopSchema = z2.object({
199
+ offset: z2.number().min(0).max(1),
200
+ color: colorHexSchema2
201
+ }).strict();
202
+ var linearGradientSchema = z2.object({
203
+ type: z2.literal("linear"),
204
+ angle: z2.number().default(180),
205
+ stops: z2.array(gradientStopSchema).min(2)
206
+ }).strict();
207
+ var radialGradientSchema = z2.object({
208
+ type: z2.literal("radial"),
209
+ stops: z2.array(gradientStopSchema).min(2)
210
+ }).strict();
211
+ var gradientSchema = z2.discriminatedUnion("type", [linearGradientSchema, radialGradientSchema]);
212
+ var drawFontFamilySchema = z2.enum(["heading", "body", "mono"]);
213
+ var drawRectSchema = z2.object({
214
+ type: z2.literal("rect"),
215
+ x: z2.number(),
216
+ y: z2.number(),
217
+ width: z2.number().positive(),
218
+ height: z2.number().positive(),
219
+ fill: colorHexSchema2.optional(),
220
+ stroke: colorHexSchema2.optional(),
221
+ strokeWidth: z2.number().min(0).max(32).default(0),
222
+ radius: z2.number().min(0).max(256).default(0),
223
+ opacity: z2.number().min(0).max(1).default(1)
224
+ }).strict();
225
+ var drawCircleSchema = z2.object({
226
+ type: z2.literal("circle"),
227
+ cx: z2.number(),
228
+ cy: z2.number(),
229
+ radius: z2.number().positive(),
230
+ fill: colorHexSchema2.optional(),
231
+ stroke: colorHexSchema2.optional(),
232
+ strokeWidth: z2.number().min(0).max(32).default(0),
233
+ opacity: z2.number().min(0).max(1).default(1)
234
+ }).strict();
235
+ var drawTextSchema = z2.object({
236
+ type: z2.literal("text"),
237
+ x: z2.number(),
238
+ y: z2.number(),
239
+ text: z2.string().min(1).max(500),
240
+ fontSize: z2.number().min(6).max(200).default(16),
241
+ fontWeight: z2.number().int().min(100).max(900).default(400),
242
+ fontFamily: drawFontFamilySchema.default("body"),
243
+ color: colorHexSchema2.default("#FFFFFF"),
244
+ align: z2.enum(["left", "center", "right"]).default("left"),
245
+ baseline: z2.enum(["top", "middle", "alphabetic", "bottom"]).default("alphabetic"),
246
+ letterSpacing: z2.number().min(-10).max(50).default(0),
247
+ maxWidth: z2.number().positive().optional(),
248
+ opacity: z2.number().min(0).max(1).default(1)
249
+ }).strict();
250
+ var drawLineSchema = z2.object({
251
+ type: z2.literal("line"),
252
+ x1: z2.number(),
253
+ y1: z2.number(),
254
+ x2: z2.number(),
255
+ y2: z2.number(),
256
+ color: colorHexSchema2.default("#FFFFFF"),
257
+ width: z2.number().min(0.5).max(32).default(2),
258
+ dash: z2.array(z2.number()).max(6).optional(),
259
+ arrow: z2.enum(["none", "end", "start", "both"]).default("none"),
260
+ arrowSize: z2.number().min(4).max(32).default(10),
261
+ opacity: z2.number().min(0).max(1).default(1)
262
+ }).strict();
263
+ var drawPointSchema = z2.object({
264
+ x: z2.number(),
265
+ y: z2.number()
266
+ }).strict();
267
+ var drawBezierSchema = z2.object({
268
+ type: z2.literal("bezier"),
269
+ points: z2.array(drawPointSchema).min(2).max(20),
270
+ color: colorHexSchema2.default("#FFFFFF"),
271
+ width: z2.number().min(0.5).max(32).default(2),
272
+ dash: z2.array(z2.number()).max(6).optional(),
273
+ arrow: z2.enum(["none", "end", "start", "both"]).default("none"),
274
+ arrowSize: z2.number().min(4).max(32).default(10),
275
+ opacity: z2.number().min(0).max(1).default(1)
276
+ }).strict();
277
+ var drawPathSchema = z2.object({
278
+ type: z2.literal("path"),
279
+ d: z2.string().min(1).max(4e3),
280
+ fill: colorHexSchema2.optional(),
281
+ stroke: colorHexSchema2.optional(),
282
+ strokeWidth: z2.number().min(0).max(32).default(0),
283
+ opacity: z2.number().min(0).max(1).default(1)
284
+ }).strict();
285
+ var drawBadgeSchema = z2.object({
286
+ type: z2.literal("badge"),
287
+ x: z2.number(),
288
+ y: z2.number(),
289
+ text: z2.string().min(1).max(64),
290
+ fontSize: z2.number().min(6).max(48).default(12),
291
+ fontFamily: drawFontFamilySchema.default("mono"),
292
+ color: colorHexSchema2.default("#FFFFFF"),
293
+ background: colorHexSchema2.default("#334B83"),
294
+ paddingX: z2.number().min(0).max(64).default(10),
295
+ paddingY: z2.number().min(0).max(32).default(4),
296
+ borderRadius: z2.number().min(0).max(64).default(12),
297
+ opacity: z2.number().min(0).max(1).default(1)
298
+ }).strict();
299
+ var drawGradientRectSchema = z2.object({
300
+ type: z2.literal("gradient-rect"),
301
+ x: z2.number(),
302
+ y: z2.number(),
303
+ width: z2.number().positive(),
304
+ height: z2.number().positive(),
305
+ gradient: gradientSchema,
306
+ radius: z2.number().min(0).max(256).default(0),
307
+ opacity: z2.number().min(0).max(1).default(1)
308
+ }).strict();
309
+ var drawCommandSchema = z2.discriminatedUnion("type", [
310
+ drawRectSchema,
311
+ drawCircleSchema,
312
+ drawTextSchema,
313
+ drawLineSchema,
314
+ drawBezierSchema,
315
+ drawPathSchema,
316
+ drawBadgeSchema,
317
+ drawGradientRectSchema
318
+ ]);
319
+ var defaultCanvas = {
320
+ width: 1200,
321
+ height: 675,
322
+ padding: 48
323
+ };
324
+ var defaultConstraints = {
325
+ minContrastRatio: 4.5,
326
+ minFooterSpacing: 16,
327
+ checkOverlaps: true,
328
+ maxTextTruncation: 0.1
329
+ };
330
+ var defaultAutoLayout = {
331
+ mode: "auto",
332
+ algorithm: "layered",
333
+ direction: "TB",
334
+ nodeSpacing: 80,
335
+ rankSpacing: 120,
336
+ edgeRouting: "polyline"
337
+ };
338
+ var defaultGridLayout = {
339
+ mode: "grid",
340
+ columns: 3,
341
+ gap: 24,
342
+ equalHeight: false
343
+ };
344
+ var defaultStackLayout = {
345
+ mode: "stack",
346
+ direction: "vertical",
347
+ gap: 24,
348
+ alignment: "stretch"
349
+ };
350
+ var defaultLayout = defaultGridLayout;
351
+ function inferLayout(elements, explicitLayout) {
352
+ if (explicitLayout) {
353
+ return explicitLayout;
354
+ }
355
+ const hasFlowNodes = elements.some((element) => element.type === "flow-node");
356
+ const hasConnections = elements.some((element) => element.type === "connection");
357
+ const hasOnlyCards = elements.every((element) => element.type === "card");
358
+ const hasCodeOrTerminal = elements.some(
359
+ (element) => element.type === "code-block" || element.type === "terminal"
360
+ );
361
+ if (hasFlowNodes && hasConnections) {
362
+ return defaultAutoLayout;
363
+ }
364
+ if (hasOnlyCards) {
365
+ return defaultGridLayout;
366
+ }
367
+ if (hasCodeOrTerminal) {
368
+ return defaultStackLayout;
369
+ }
370
+ return defaultGridLayout;
371
+ }
372
+ var cardElementSchema = z2.object({
373
+ type: z2.literal("card"),
374
+ id: z2.string().min(1).max(120),
375
+ title: z2.string().min(1).max(200),
376
+ body: z2.string().min(1).max(4e3),
377
+ badge: z2.string().min(1).max(64).optional(),
378
+ metric: z2.string().min(1).max(80).optional(),
379
+ tone: z2.enum(["neutral", "accent", "success", "warning", "error"]).default("neutral"),
380
+ icon: z2.string().min(1).max(64).optional()
381
+ }).strict();
382
+ var flowNodeElementSchema = z2.object({
383
+ type: z2.literal("flow-node"),
384
+ id: z2.string().min(1).max(120),
385
+ shape: z2.enum(["box", "rounded-box", "diamond", "circle", "pill", "cylinder", "parallelogram"]),
386
+ label: z2.string().min(1).max(200),
387
+ sublabel: z2.string().min(1).max(300).optional(),
388
+ sublabelColor: colorHexSchema2.optional(),
389
+ labelColor: colorHexSchema2.optional(),
390
+ labelFontSize: z2.number().min(10).max(48).optional(),
391
+ color: colorHexSchema2.optional(),
392
+ borderColor: colorHexSchema2.optional(),
393
+ borderWidth: z2.number().min(0.5).max(8).optional(),
394
+ cornerRadius: z2.number().min(0).max(64).optional(),
395
+ width: z2.number().int().min(40).max(800).optional(),
396
+ height: z2.number().int().min(30).max(600).optional(),
397
+ opacity: z2.number().min(0).max(1).default(1)
398
+ }).strict();
399
+ var connectionElementSchema = z2.object({
400
+ type: z2.literal("connection"),
401
+ from: z2.string().min(1).max(120),
402
+ to: z2.string().min(1).max(120),
403
+ style: z2.enum(["solid", "dashed", "dotted"]).default("solid"),
404
+ arrow: z2.enum(["end", "start", "both", "none"]).default("end"),
405
+ label: z2.string().min(1).max(200).optional(),
406
+ labelPosition: z2.enum(["start", "middle", "end"]).default("middle"),
407
+ color: colorHexSchema2.optional(),
408
+ width: z2.number().min(0.5).max(8).optional(),
409
+ arrowSize: z2.number().min(4).max(32).optional(),
410
+ opacity: z2.number().min(0).max(1).default(1)
411
+ }).strict();
412
+ var codeBlockStyleSchema = z2.object({
413
+ paddingVertical: z2.number().min(0).max(128).default(56),
414
+ paddingHorizontal: z2.number().min(0).max(128).default(56),
415
+ windowControls: z2.enum(["macos", "bw", "none"]).default("macos"),
416
+ dropShadow: z2.boolean().default(true),
417
+ dropShadowOffsetY: z2.number().min(0).max(100).default(20),
418
+ dropShadowBlurRadius: z2.number().min(0).max(200).default(68),
419
+ surroundColor: z2.string().optional(),
420
+ fontSize: z2.number().min(8).max(32).default(14),
421
+ lineHeightPercent: z2.number().min(100).max(200).default(143),
422
+ scale: z2.number().int().min(1).max(4).default(2)
423
+ }).partial();
424
+ var codeBlockElementSchema = z2.object({
425
+ type: z2.literal("code-block"),
426
+ id: z2.string().min(1).max(120),
427
+ code: z2.string().min(1),
428
+ language: z2.string().min(1).max(40),
429
+ theme: z2.string().min(1).max(80).optional(),
430
+ showLineNumbers: z2.boolean().default(false),
431
+ highlightLines: z2.array(z2.number().int().positive()).max(500).optional(),
432
+ startLine: z2.number().int().positive().default(1),
433
+ title: z2.string().min(1).max(200).optional(),
434
+ style: codeBlockStyleSchema.optional()
435
+ }).strict();
436
+ var terminalElementSchema = z2.object({
437
+ type: z2.literal("terminal"),
438
+ id: z2.string().min(1).max(120),
439
+ content: z2.string().min(1),
440
+ prompt: z2.string().min(1).max(24).optional(),
441
+ title: z2.string().min(1).max(200).optional(),
442
+ showPrompt: z2.boolean().default(true),
443
+ style: codeBlockStyleSchema.optional()
444
+ }).strict();
445
+ var textElementSchema = z2.object({
446
+ type: z2.literal("text"),
447
+ id: z2.string().min(1).max(120),
448
+ content: z2.string().min(1).max(4e3),
449
+ style: z2.enum(["heading", "subheading", "body", "caption", "code"]),
450
+ align: z2.enum(["left", "center", "right"]).default("left"),
451
+ color: colorHexSchema2.optional()
452
+ }).strict();
453
+ var shapeElementSchema = z2.object({
454
+ type: z2.literal("shape"),
455
+ id: z2.string().min(1).max(120),
456
+ shape: z2.enum(["rectangle", "rounded-rectangle", "circle", "ellipse", "line", "arrow"]),
457
+ fill: colorHexSchema2.optional(),
458
+ stroke: colorHexSchema2.optional(),
459
+ strokeWidth: z2.number().min(0).max(64).default(1)
460
+ }).strict();
461
+ var imageElementSchema = z2.object({
462
+ type: z2.literal("image"),
463
+ id: z2.string().min(1).max(120),
464
+ src: z2.string().min(1),
465
+ alt: z2.string().max(240).optional(),
466
+ fit: z2.enum(["contain", "cover", "fill", "none"]).default("contain"),
467
+ borderRadius: z2.number().min(0).default(0)
468
+ }).strict();
469
+ var elementSchema = z2.discriminatedUnion("type", [
470
+ cardElementSchema,
471
+ flowNodeElementSchema,
472
+ connectionElementSchema,
473
+ codeBlockElementSchema,
474
+ terminalElementSchema,
475
+ textElementSchema,
476
+ shapeElementSchema,
477
+ imageElementSchema
478
+ ]);
479
+ var autoLayoutConfigSchema = z2.object({
480
+ mode: z2.literal("auto"),
481
+ algorithm: z2.enum(["layered", "stress", "force", "radial", "box"]).default("layered"),
482
+ direction: z2.enum(["TB", "BT", "LR", "RL"]).default("TB"),
483
+ nodeSpacing: z2.number().int().min(0).max(512).default(80),
484
+ rankSpacing: z2.number().int().min(0).max(512).default(120),
485
+ edgeRouting: z2.enum(["orthogonal", "polyline", "spline"]).default("polyline"),
486
+ aspectRatio: z2.number().min(0.5).max(3).optional()
487
+ }).strict();
488
+ var gridLayoutConfigSchema = z2.object({
489
+ mode: z2.literal("grid"),
490
+ columns: z2.number().int().min(1).max(12).default(3),
491
+ gap: z2.number().int().min(0).max(256).default(24),
492
+ cardMinHeight: z2.number().int().min(32).max(4096).optional(),
493
+ cardMaxHeight: z2.number().int().min(32).max(4096).optional(),
494
+ equalHeight: z2.boolean().default(false)
495
+ }).strict();
496
+ var stackLayoutConfigSchema = z2.object({
497
+ mode: z2.literal("stack"),
498
+ direction: z2.enum(["vertical", "horizontal"]).default("vertical"),
499
+ gap: z2.number().int().min(0).max(256).default(24),
500
+ alignment: z2.enum(["start", "center", "end", "stretch"]).default("stretch")
501
+ }).strict();
502
+ var manualPositionSchema = z2.object({
503
+ x: z2.number().int(),
504
+ y: z2.number().int(),
505
+ width: z2.number().int().positive().optional(),
506
+ height: z2.number().int().positive().optional()
507
+ }).strict();
508
+ var manualLayoutConfigSchema = z2.object({
509
+ mode: z2.literal("manual"),
510
+ positions: z2.record(z2.string().min(1), manualPositionSchema).default({})
511
+ }).strict();
512
+ var layoutConfigSchema = z2.discriminatedUnion("mode", [
513
+ autoLayoutConfigSchema,
514
+ gridLayoutConfigSchema,
515
+ stackLayoutConfigSchema,
516
+ manualLayoutConfigSchema
517
+ ]);
518
+ var constraintsSchema = z2.object({
519
+ minContrastRatio: z2.number().min(3).max(21).default(4.5),
520
+ minFooterSpacing: z2.number().int().min(0).max(256).default(16),
521
+ checkOverlaps: z2.boolean().default(true),
522
+ maxTextTruncation: z2.number().min(0).max(1).default(0.1)
523
+ }).strict();
524
+ var headerSchema = z2.object({
525
+ eyebrow: z2.string().min(1).max(120).optional(),
526
+ title: z2.string().min(1).max(300),
527
+ subtitle: z2.string().min(1).max(400).optional(),
528
+ align: z2.enum(["left", "center", "right"]).default("center"),
529
+ titleLetterSpacing: z2.number().min(-2).max(20).default(0),
530
+ titleFontSize: z2.number().min(16).max(96).optional()
531
+ }).strict();
532
+ var footerSchema = z2.object({
533
+ text: z2.string().min(1).max(300),
534
+ tagline: z2.string().min(1).max(200).optional()
535
+ }).strict();
536
+ var decoratorSchema = z2.discriminatedUnion("type", [
537
+ z2.object({
538
+ type: z2.literal("rainbow-rule"),
539
+ y: z2.enum(["after-header", "before-footer", "custom"]).default("after-header"),
540
+ customY: z2.number().optional(),
541
+ thickness: z2.number().positive().max(64).default(2),
542
+ colors: z2.array(colorHexSchema2).min(2).optional(),
543
+ margin: z2.number().min(0).max(512).default(16)
544
+ }).strict(),
545
+ z2.object({
546
+ type: z2.literal("vignette"),
547
+ intensity: z2.number().min(0).max(1).default(0.3),
548
+ color: colorHexSchema2.default("#000000")
549
+ }).strict(),
550
+ z2.object({
551
+ type: z2.literal("gradient-overlay"),
552
+ gradient: gradientSchema,
553
+ opacity: z2.number().min(0).max(1).default(0.5)
554
+ }).strict()
555
+ ]);
556
+ var canvasSchema = z2.object({
557
+ width: z2.number().int().min(320).max(4096).default(defaultCanvas.width),
558
+ height: z2.number().int().min(180).max(4096).default(defaultCanvas.height),
559
+ padding: z2.number().int().min(0).max(256).default(defaultCanvas.padding)
560
+ }).strict();
561
+ var themeInputSchema = z2.union([builtInThemeSchema, themeSchema]);
562
+ var designSpecSchema = z2.object({
563
+ version: z2.literal(2).default(2),
564
+ canvas: canvasSchema.default(defaultCanvas),
565
+ theme: themeInputSchema.default("dark"),
566
+ background: z2.union([colorHexSchema2, gradientSchema]).optional(),
567
+ header: headerSchema.optional(),
568
+ elements: z2.array(elementSchema).default([]),
569
+ footer: footerSchema.optional(),
570
+ decorators: z2.array(decoratorSchema).default([]),
571
+ draw: z2.array(drawCommandSchema).max(200).default([]),
572
+ layout: layoutConfigSchema.optional(),
573
+ constraints: constraintsSchema.default(defaultConstraints)
574
+ }).strict().transform((spec) => ({
575
+ ...spec,
576
+ layout: inferLayout(spec.elements, spec.layout)
577
+ }));
578
+ function deriveSafeFrame(spec) {
579
+ return {
580
+ x: spec.canvas.padding,
581
+ y: spec.canvas.padding,
582
+ width: spec.canvas.width - spec.canvas.padding * 2,
583
+ height: spec.canvas.height - spec.canvas.padding * 2
584
+ };
585
+ }
586
+ function parseDesignSpec(input) {
587
+ return designSpecSchema.parse(input);
588
+ }
589
+ export {
590
+ builtInThemeBackgrounds,
591
+ builtInThemes,
592
+ defaultAutoLayout,
593
+ defaultCanvas,
594
+ defaultConstraints,
595
+ defaultGridLayout,
596
+ defaultLayout,
597
+ defaultStackLayout,
598
+ defaultTheme,
599
+ deriveSafeFrame,
600
+ designSpecSchema,
601
+ inferLayout,
602
+ parseDesignSpec,
603
+ resolveTheme
604
+ };
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file