@servrox/console-fx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +253 -0
  4. package/dist/browser/compiler.d.ts +14 -0
  5. package/dist/browser/compiler.d.ts.map +1 -0
  6. package/dist/browser/compiler.js +218 -0
  7. package/dist/browser/compiler.js.map +1 -0
  8. package/dist/browser/index.d.ts +16 -0
  9. package/dist/browser/index.d.ts.map +1 -0
  10. package/dist/browser/index.js +55 -0
  11. package/dist/browser/index.js.map +1 -0
  12. package/dist/browser/measure.d.ts +5 -0
  13. package/dist/browser/measure.d.ts.map +1 -0
  14. package/dist/browser/measure.js +79 -0
  15. package/dist/browser/measure.js.map +1 -0
  16. package/dist/browser/preflight.d.ts +5 -0
  17. package/dist/browser/preflight.d.ts.map +1 -0
  18. package/dist/browser/preflight.js +70 -0
  19. package/dist/browser/preflight.js.map +1 -0
  20. package/dist/codegen/index.d.ts +5 -0
  21. package/dist/codegen/index.d.ts.map +1 -0
  22. package/dist/codegen/index.js +56 -0
  23. package/dist/codegen/index.js.map +1 -0
  24. package/dist/effects/catalog.d.ts +5 -0
  25. package/dist/effects/catalog.d.ts.map +1 -0
  26. package/dist/effects/catalog.js +121 -0
  27. package/dist/effects/catalog.js.map +1 -0
  28. package/dist/index.d.ts +7 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +6 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/layout/bounds.d.ts +16 -0
  33. package/dist/layout/bounds.d.ts.map +1 -0
  34. package/dist/layout/bounds.js +84 -0
  35. package/dist/layout/bounds.js.map +1 -0
  36. package/dist/layout/metrics.d.ts +20 -0
  37. package/dist/layout/metrics.d.ts.map +1 -0
  38. package/dist/layout/metrics.js +92 -0
  39. package/dist/layout/metrics.js.map +1 -0
  40. package/dist/layout/planner.d.ts +32 -0
  41. package/dist/layout/planner.d.ts.map +1 -0
  42. package/dist/layout/planner.js +439 -0
  43. package/dist/layout/planner.js.map +1 -0
  44. package/dist/layout/render.d.ts +4 -0
  45. package/dist/layout/render.d.ts.map +1 -0
  46. package/dist/layout/render.js +98 -0
  47. package/dist/layout/render.js.map +1 -0
  48. package/dist/layout/wrap.d.ts +16 -0
  49. package/dist/layout/wrap.d.ts.map +1 -0
  50. package/dist/layout/wrap.js +67 -0
  51. package/dist/layout/wrap.js.map +1 -0
  52. package/dist/model/layout.d.ts +112 -0
  53. package/dist/model/layout.d.ts.map +1 -0
  54. package/dist/model/layout.js +2 -0
  55. package/dist/model/layout.js.map +1 -0
  56. package/dist/model/limits.d.ts +19 -0
  57. package/dist/model/limits.d.ts.map +1 -0
  58. package/dist/model/limits.js +28 -0
  59. package/dist/model/limits.js.map +1 -0
  60. package/dist/model/types.d.ts +267 -0
  61. package/dist/model/types.d.ts.map +1 -0
  62. package/dist/model/types.js +2 -0
  63. package/dist/model/types.js.map +1 -0
  64. package/dist/presentations/catalog.d.ts +5 -0
  65. package/dist/presentations/catalog.d.ts.map +1 -0
  66. package/dist/presentations/catalog.js +1522 -0
  67. package/dist/presentations/catalog.js.map +1 -0
  68. package/dist/presentations/compact.d.ts +16 -0
  69. package/dist/presentations/compact.d.ts.map +1 -0
  70. package/dist/presentations/compact.js +178 -0
  71. package/dist/presentations/compact.js.map +1 -0
  72. package/dist/presentations/fonts.d.ts +7 -0
  73. package/dist/presentations/fonts.d.ts.map +1 -0
  74. package/dist/presentations/fonts.js +7 -0
  75. package/dist/presentations/fonts.js.map +1 -0
  76. package/dist/presets/cards.d.ts +67 -0
  77. package/dist/presets/cards.d.ts.map +1 -0
  78. package/dist/presets/cards.js +305 -0
  79. package/dist/presets/cards.js.map +1 -0
  80. package/dist/presets/index.d.ts +125 -0
  81. package/dist/presets/index.d.ts.map +1 -0
  82. package/dist/presets/index.js +270 -0
  83. package/dist/presets/index.js.map +1 -0
  84. package/dist/renderers/cinematic/glyphs.d.ts +2 -0
  85. package/dist/renderers/cinematic/glyphs.d.ts.map +1 -0
  86. package/dist/renderers/cinematic/glyphs.js +86 -0
  87. package/dist/renderers/cinematic/glyphs.js.map +1 -0
  88. package/dist/renderers/cinematic/layout.d.ts +23 -0
  89. package/dist/renderers/cinematic/layout.d.ts.map +1 -0
  90. package/dist/renderers/cinematic/layout.js +86 -0
  91. package/dist/renderers/cinematic/layout.js.map +1 -0
  92. package/dist/renderers/cinematic/profiles.d.ts +51 -0
  93. package/dist/renderers/cinematic/profiles.d.ts.map +1 -0
  94. package/dist/renderers/cinematic/profiles.js +78 -0
  95. package/dist/renderers/cinematic/profiles.js.map +1 -0
  96. package/dist/renderers/cinematic/render.d.ts +8 -0
  97. package/dist/renderers/cinematic/render.d.ts.map +1 -0
  98. package/dist/renderers/cinematic/render.js +51 -0
  99. package/dist/renderers/cinematic/render.js.map +1 -0
  100. package/dist/renderers/css.d.ts +12 -0
  101. package/dist/renderers/css.d.ts.map +1 -0
  102. package/dist/renderers/css.js +72 -0
  103. package/dist/renderers/css.js.map +1 -0
  104. package/dist/renderers/presentations/compact-art.d.ts +3 -0
  105. package/dist/renderers/presentations/compact-art.d.ts.map +1 -0
  106. package/dist/renderers/presentations/compact-art.js +80 -0
  107. package/dist/renderers/presentations/compact-art.js.map +1 -0
  108. package/dist/renderers/presentations/layout.d.ts +5 -0
  109. package/dist/renderers/presentations/layout.d.ts.map +1 -0
  110. package/dist/renderers/presentations/layout.js +88 -0
  111. package/dist/renderers/presentations/layout.js.map +1 -0
  112. package/dist/renderers/presentations/render.d.ts +4 -0
  113. package/dist/renderers/presentations/render.d.ts.map +1 -0
  114. package/dist/renderers/presentations/render.js +199 -0
  115. package/dist/renderers/presentations/render.js.map +1 -0
  116. package/dist/renderers/presentations/shapes.d.ts +5 -0
  117. package/dist/renderers/presentations/shapes.d.ts.map +1 -0
  118. package/dist/renderers/presentations/shapes.js +6 -0
  119. package/dist/renderers/presentations/shapes.js.map +1 -0
  120. package/dist/renderers/svg-values.d.ts +3 -0
  121. package/dist/renderers/svg-values.d.ts.map +1 -0
  122. package/dist/renderers/svg-values.js +13 -0
  123. package/dist/renderers/svg-values.js.map +1 -0
  124. package/dist/renderers/svg.d.ts +16 -0
  125. package/dist/renderers/svg.d.ts.map +1 -0
  126. package/dist/renderers/svg.js +260 -0
  127. package/dist/renderers/svg.js.map +1 -0
  128. package/dist/validation/index.d.ts +14 -0
  129. package/dist/validation/index.d.ts.map +1 -0
  130. package/dist/validation/index.js +291 -0
  131. package/dist/validation/index.js.map +1 -0
  132. package/dist/validation/layout.d.ts +10 -0
  133. package/dist/validation/layout.d.ts.map +1 -0
  134. package/dist/validation/layout.js +183 -0
  135. package/dist/validation/layout.js.map +1 -0
  136. package/dist/validation/options.d.ts +6 -0
  137. package/dist/validation/options.d.ts.map +1 -0
  138. package/dist/validation/options.js +29 -0
  139. package/dist/validation/options.js.map +1 -0
  140. package/dist/validation/recipe.d.ts +5 -0
  141. package/dist/validation/recipe.d.ts.map +1 -0
  142. package/dist/validation/recipe.js +30 -0
  143. package/dist/validation/recipe.js.map +1 -0
  144. package/dist/validation/render-options.d.ts +21 -0
  145. package/dist/validation/render-options.d.ts.map +1 -0
  146. package/dist/validation/render-options.js +36 -0
  147. package/dist/validation/render-options.js.map +1 -0
  148. package/package.json +56 -0
@@ -0,0 +1,6 @@
1
+ // Numeric authored geometry and validated palette values only.
2
+ export const rect = (x, y, w, h, fill, radius = 0, stroke = "none") => `<rect x="${x}" y="${y}" width="${w}" height="${h}" fill="${fill}" rx="${radius}" stroke="${stroke}"/>`;
3
+ export const line = (x1, y1, x2, y2, color, extra = "") => `<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${color}" ${extra}/>`;
4
+ export const path = (d, fill, stroke, extra = "") => `<path d="${d}" fill="${fill}" stroke="${stroke}" ${extra}/>`;
5
+ export const circle = (x, y, r, fill, stroke = "none", extra = "") => `<circle cx="${x}" cy="${y}" r="${r}" fill="${fill}" stroke="${stroke}" ${extra}/>`;
6
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../../src/renderers/presentations/shapes.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS,EACT,IAAY,EACZ,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,MAAM,EACf,EAAE,CACF,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS,MAAM,aAAa,MAAM,KAAK,CAAC;AAC1G,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,KAAa,EACb,KAAK,GAAG,EAAE,EACV,EAAE,CACF,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,KAAK,KAAK,KAAK,IAAI,CAAC;AACnF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,IAAY,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAC1E,YAAY,CAAC,WAAW,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC;AAChE,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,CAAS,EACT,CAAS,EACT,IAAY,EACZ,MAAM,GAAG,MAAM,EACf,KAAK,GAAG,EAAE,EACV,EAAE,CACF,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function escapeXml(value: string): string;
2
+ export declare function svgNumber(value: number): string;
3
+ //# sourceMappingURL=svg-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-values.d.ts","sourceRoot":"","sources":["../../src/renderers/svg-values.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAY/C;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,13 @@
1
+ export function escapeXml(value) {
2
+ return value.replace(/[&<>"']/g, (character) => ({
3
+ "&": "&amp;",
4
+ "<": "&lt;",
5
+ ">": "&gt;",
6
+ '"': "&quot;",
7
+ "'": "&apos;",
8
+ })[character]);
9
+ }
10
+ export function svgNumber(value) {
11
+ return String(Math.round(value * 1000) / 1000);
12
+ }
13
+ //# sourceMappingURL=svg-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-values.js","sourceRoot":"","sources":["../../src/renderers/svg-values.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAClB,UAAU,EACV,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC;QACC,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,QAAQ;KACd,CAAC,CAAC,SAAS,CAAE,CACjB,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Diagnostic, SceneV1 } from "../model/types.js";
2
+ import type { SvgLayoutPlan } from "../layout/planner.js";
3
+ import type { LayoutReport, OutputSizingReport } from "../model/layout.js";
4
+ export { escapeXml } from "./svg-values.js";
5
+ export interface SvgResult {
6
+ readonly imageUri: string;
7
+ readonly animated: boolean;
8
+ readonly diagnostics: readonly Diagnostic[];
9
+ readonly layout?: LayoutReport;
10
+ readonly width?: number;
11
+ readonly height?: number;
12
+ readonly carrierPadding?: string;
13
+ readonly sizing?: OutputSizingReport;
14
+ }
15
+ export declare function renderSvg(scene: SceneV1, allowMotion: boolean, plan?: SvgLayoutPlan): SvgResult;
16
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/renderers/svg.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAU,OAAO,EAAW,MAAM,mBAAmB,CAAC;AAS9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAsC5C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,OAAO,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,SAAS,CAuTX"}
@@ -0,0 +1,260 @@
1
+ import { LIMITS } from "../model/limits.js";
2
+ import { FONT_STACKS } from "./css.js";
3
+ import { cinematicEffect, cinematicLayout, cinematicElementBound, } from "./cinematic/layout.js";
4
+ import { renderCinematic } from "./cinematic/render.js";
5
+ import { renderPresentation } from "./presentations/render.js";
6
+ import { textDirection } from "../layout/metrics.js";
7
+ import { escapeXml, svgNumber } from "./svg-values.js";
8
+ export { escapeXml } from "./svg-values.js";
9
+ function dataUri(svg) {
10
+ return `data:image/svg+xml,${encodeURIComponent(svg).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`)}`;
11
+ }
12
+ function gradient(id, colors, drift) {
13
+ let animation = "";
14
+ if (drift?.kind === "gradientDrift") {
15
+ animation = `<animateTransform attributeName="gradientTransform" type="translate" values="0 0;${drift.distance / 100} 0;0 0" dur="${drift.periodMs}ms" repeatCount="indefinite"/>`;
16
+ }
17
+ return `<linearGradient id="${id}" x1="0" y1="0" x2="1" y2="1">${colors.map((color, index) => `<stop offset="${svgNumber(index / (colors.length - 1))}" stop-color="${color}"/>`).join("")}${animation}</linearGradient>`;
18
+ }
19
+ function motionEffect(run) {
20
+ return run.effects.find((effect) => ["glowPulse", "gradientDrift", "wave", "indicator"].includes(effect.kind));
21
+ }
22
+ function visualLines(scene) {
23
+ return scene.lines.flatMap((line, sourceLine) => {
24
+ const result = [{ align: line.align, sourceLine, runs: [] }];
25
+ for (const [sourceRun, run] of line.runs.entries()) {
26
+ run.text.split("\n").forEach((text, part) => {
27
+ if (part > 0)
28
+ result.push({ align: line.align, sourceLine, runs: [] });
29
+ result.at(-1).runs.push({ ...run, text, sourceRun });
30
+ });
31
+ }
32
+ return result;
33
+ });
34
+ }
35
+ export function renderSvg(scene, allowMotion, plan) {
36
+ // Fitted geometry must retain the precision used for paint/readability checks.
37
+ const number = plan ? String : svgNumber;
38
+ scene = plan?.scene ?? scene;
39
+ if (scene.presentation) {
40
+ const svg = renderPresentation(scene, plan);
41
+ if ((svg.match(/<[a-z]/g)?.length ?? 0) > LIMITS.svgElements)
42
+ throw new RangeError();
43
+ const { width, height, padding } = scene.surface;
44
+ const diagnostics = [
45
+ {
46
+ code: "platform-font-variation",
47
+ severity: "info",
48
+ path: ["presentation"],
49
+ message: "Local fonts vary; slot widths use conservative estimates.",
50
+ },
51
+ ];
52
+ if (width - padding * 2 !== (height - padding * 2) * 3)
53
+ diagnostics.push({
54
+ code: "presentation-letterbox",
55
+ severity: "info",
56
+ path: ["surface"],
57
+ message: "The card is scaled uniformly and centered inside the padded surface; the different aspect ratio leaves space.",
58
+ });
59
+ return {
60
+ imageUri: dataUri(svg),
61
+ animated: false,
62
+ diagnostics,
63
+ };
64
+ }
65
+ const definitions = [];
66
+ const elements = [];
67
+ const diagnostics = [];
68
+ const { width, height, padding, background, borderRadius } = scene.surface;
69
+ let animated = false;
70
+ const lines = plan
71
+ ? plan.lines.map((line) => ({ ...line, runs: line.runs.map((r) => r.run) }))
72
+ : visualLines(scene);
73
+ const cinematicCount = scene.lines.reduce((count, line) => count +
74
+ line.runs.reduce((sum, run) => {
75
+ const effect = cinematicEffect(run);
76
+ return sum + (effect ? cinematicElementBound(run, effect) : 0);
77
+ }, 0), 3);
78
+ if (cinematicCount > LIMITS.svgElements)
79
+ throw new RangeError();
80
+ const measurements = lines.map((line, lineNumber) => {
81
+ const layouts = line.runs.map((run, runNumber) => {
82
+ const effect = cinematicEffect(run);
83
+ return (plan?.lines[lineNumber]?.runs[runNumber]?.cinematic ??
84
+ (effect ? cinematicLayout(run, effect) : undefined));
85
+ });
86
+ const cinematic = layouts.some(Boolean);
87
+ const maxSize = Math.max(8, ...line.runs.map((run) => run.style.fontSize));
88
+ const ascent = cinematic
89
+ ? Math.max(...line.runs.map((run, i) => layouts[i]?.ascent ?? run.style.fontSize))
90
+ : maxSize;
91
+ const descent = cinematic
92
+ ? Math.max(...line.runs.map((run, i) => layouts[i]?.descent ?? run.style.fontSize * 0.25))
93
+ : maxSize * 0.25;
94
+ return {
95
+ layouts,
96
+ cinematic,
97
+ ascent,
98
+ descent,
99
+ maxSize,
100
+ gap: cinematic ? maxSize * 0.2 : maxSize * 0.15,
101
+ };
102
+ });
103
+ const contentHeight = measurements.reduce((sum, m) => sum + m.ascent + m.descent + m.gap, 0) -
104
+ (measurements.at(-1)?.gap ?? 0);
105
+ let y = padding +
106
+ (measurements.some((m) => m.cinematic)
107
+ ? Math.max(0, (height - padding * 2 - contentHeight) / 2)
108
+ : 0);
109
+ let identity = 0;
110
+ const duration = scene.motion.durationMs;
111
+ // Finish all declarative motion at a finite outer duration. Each animation
112
+ // receives repeatDur as well; no animation relies on an unbounded timer.
113
+ const boundedAnimation = (markup) => markup.replaceAll('repeatCount="indefinite"', `repeatDur="${duration}ms" fill="freeze"`);
114
+ for (const [visualIndex, line] of lines.entries()) {
115
+ const measurement = measurements[visualIndex];
116
+ const lineIndex = line.sourceLine;
117
+ const maxSize = Math.max(8, ...line.runs.map((run) => run.style.fontSize));
118
+ const estimatedWidths = line.runs.map((run, index) => plan?.lines[visualIndex]?.runs[index]?.fragment.advance ??
119
+ measurement.layouts[index]?.width ??
120
+ [...run.text].length *
121
+ (run.style.fontSize * (run.style.fontFamily === "mono" ? 0.61 : 0.6) +
122
+ run.style.letterSpacing));
123
+ const estimatedWidth = estimatedWidths.reduce((sum, value) => sum + value, 0);
124
+ let x = line.align === "center"
125
+ ? (width - estimatedWidth) / 2
126
+ : line.align === "right"
127
+ ? width - padding - estimatedWidth
128
+ : padding;
129
+ y += measurement.ascent;
130
+ if (plan)
131
+ y = plan.lines[visualIndex].baseline;
132
+ if (estimatedWidth > width - padding * 2 ||
133
+ y + measurement.descent > height - padding) {
134
+ diagnostics.push({
135
+ code: "possible-clipping",
136
+ severity: "warning",
137
+ path: ["lines", lineIndex],
138
+ message: "Possible clipping: reduce text size or enlarge the surface.",
139
+ });
140
+ }
141
+ for (const [runIndex, run] of line.runs.entries()) {
142
+ if (plan)
143
+ x = plan.lines[visualIndex].runs[runIndex].fragment.x;
144
+ const id = `fx-${identity++}`;
145
+ const cinematic = cinematicEffect(run);
146
+ if (cinematic) {
147
+ const output = renderCinematic(run, cinematic, measurement.layouts[runIndex], id, x, y, FONT_STACKS.serif, Boolean(plan));
148
+ definitions.push(output.definitions);
149
+ elements.push(output.markup);
150
+ x += estimatedWidths[runIndex] ?? 0;
151
+ continue;
152
+ }
153
+ const motion = allowMotion ? motionEffect(run) : undefined;
154
+ let fill = run.style.color;
155
+ const filters = [];
156
+ let underlay = "";
157
+ let overlay = "";
158
+ const content = escapeXml(run.text);
159
+ const attributes = `x="${number(x)}" y="${number(y)}" font-family="${FONT_STACKS[run.style.fontFamily]}" font-size="${run.style.fontSize}" font-weight="${run.style.fontWeight}" letter-spacing="${run.style.letterSpacing}" xml:space="preserve"${plan ? ` direction="${textDirection(run.text)}" text-anchor="${textDirection(run.text) === "rtl" ? "end" : "start"}"` : ""}`;
160
+ const text = (ink, extra = "") => `<text ${attributes} fill="${ink}" ${extra}>${content}</text>`;
161
+ for (const effect of run.effects) {
162
+ switch (effect.kind) {
163
+ case "badge":
164
+ underlay += `<rect x="${number(x - 10)}" y="${number(y - maxSize - 3)}" width="${number((estimatedWidths[runIndex] ?? 0) + 20)}" height="${number(maxSize * 1.4)}" rx="7" fill="${effect.color}"/>`;
165
+ fill = "#071014";
166
+ break;
167
+ case "neon":
168
+ fill = effect.color;
169
+ definitions.push(`<filter id="${id}-glow" ${plan
170
+ ? (() => {
171
+ const ink = plan.lines[visualIndex].runs[runIndex].fragment.ink;
172
+ const extent = 3 * (1 + effect.intensity * 3);
173
+ return `filterUnits="userSpaceOnUse" x="${number(ink.x - extent)}" y="${number(ink.y - extent)}" width="${number(ink.width + 2 * extent)}" height="${number(ink.height + 2 * extent)}"`;
174
+ })()
175
+ : 'x="-30%" y="-100%" width="160%" height="300%"'}><feGaussianBlur stdDeviation="${number(1 + effect.intensity * 3)}"/><feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge></filter>`);
176
+ filters.push(`filter="url(#${id}-glow)"`);
177
+ break;
178
+ case "rgbSplit":
179
+ underlay +=
180
+ text("#ff526f", `transform="translate(${-effect.offset} 0)" opacity=".8"`) +
181
+ text("#35dfff", `transform="translate(${effect.offset} 0)" opacity=".8"`);
182
+ break;
183
+ case "extruded":
184
+ for (let depth = Math.floor(effect.depth); depth > 0; depth--)
185
+ underlay += text(effect.color, `transform="translate(${depth} ${depth})"`);
186
+ break;
187
+ case "holographic":
188
+ definitions.push(gradient(`${id}-fill`, [
189
+ "#81fff0",
190
+ "#c4a2ff",
191
+ "#fff3be",
192
+ "#82d5ff",
193
+ "#ffb8dc",
194
+ "#81fff0",
195
+ ], motion));
196
+ fill = `url(#${id}-fill)`;
197
+ underlay += text("#7effe9", `transform="translate(-1 -1)" opacity="${number(effect.intensity * 0.5)}"`);
198
+ break;
199
+ case "metallic":
200
+ definitions.push(gradient(`${id}-fill`, effect.variant === "gold"
201
+ ? ["#fff6c8", "#b47c21", "#ffe399", "#81551d", "#ffedb0"]
202
+ : ["#fafcff", "#738498", "#e5f5ff", "#445161", "#f4fcff"], motion));
203
+ fill = `url(#${id}-fill)`;
204
+ underlay += text(effect.variant === "gold" ? "#73501b" : "#3c4958", 'transform="translate(2 2)"');
205
+ break;
206
+ case "crt":
207
+ fill = "#8bffa2";
208
+ definitions.push(`<pattern id="${id}-scan" width="4" height="4" patternUnits="userSpaceOnUse"><path d="M0 1h4" stroke="${background}" stroke-width="${number(effect.intensity * 1.5)}"/></pattern>`);
209
+ overlay += `<rect x="${number(x)}" y="${number(y - maxSize)}" width="${number(estimatedWidths[runIndex] ?? 0)}" height="${number(maxSize * 1.3)}" fill="url(#${id}-scan)"/>`;
210
+ break;
211
+ case "rainbow": {
212
+ const colors = [0, 45, 95, 165, 205, 265, 320].map((hue) => `hsl(${hue} ${Math.round(effect.saturation * 100)}% 70%)`);
213
+ definitions.push(gradient(`${id}-fill`, colors, motion));
214
+ fill = `url(#${id}-fill)`;
215
+ break;
216
+ }
217
+ }
218
+ }
219
+ if (motion?.kind === "gradientDrift" && !fill.startsWith("url(")) {
220
+ definitions.push(gradient(`${id}-drift`, [run.style.color, "#f1a8d5", "#8affe0", run.style.color], motion));
221
+ fill = `url(#${id}-drift)`;
222
+ }
223
+ let markup = underlay + text(fill, filters.join(" ")) + overlay;
224
+ if (motion) {
225
+ animated = true;
226
+ switch (motion.kind) {
227
+ case "glowPulse":
228
+ markup = `<g>${markup}<animate attributeName="opacity" values="1;${number(1 - motion.intensity)};1" dur="${motion.periodMs}ms" repeatDur="${duration}ms" fill="freeze"/></g>`;
229
+ break;
230
+ case "wave":
231
+ markup = `<g>${markup}<animateTransform attributeName="transform" type="translate" values="0 0;0 ${-motion.amplitude};0 0;0 ${motion.amplitude};0 0" dur="${motion.periodMs}ms" repeatDur="${duration}ms" fill="freeze"/></g>`;
232
+ diagnostics.push({
233
+ code: "whole-run-motion",
234
+ severity: "info",
235
+ path: ["lines", lineIndex, "runs", run.sourceRun],
236
+ message: "Wave moves whole runs to preserve graphemes and shaping.",
237
+ });
238
+ break;
239
+ case "indicator": {
240
+ const outline = run.effects.some((effect) => effect.kind === "badge")
241
+ ? ' stroke="#071014" stroke-width="1"'
242
+ : "";
243
+ markup += `<rect x="${number(x)}" y="${number(y + 8)}" width="14" height="3" rx="1.5" fill="${motion.color}"${outline}><animateTransform attributeName="transform" type="translate" values="0 0;${number(Math.max(0, (estimatedWidths[runIndex] ?? 14) - 14))} 0;0 0" dur="${motion.periodMs}ms" repeatDur="${duration}ms" fill="freeze"/></rect>`;
244
+ break;
245
+ }
246
+ }
247
+ }
248
+ elements.push(markup);
249
+ x += estimatedWidths[runIndex] ?? 0;
250
+ }
251
+ y += measurement.cinematic
252
+ ? measurement.descent + measurement.gap
253
+ : maxSize * 0.4;
254
+ }
255
+ const svg = boundedAnimation(`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><defs>${definitions.join("")}</defs><rect width="${width}" height="${height}" rx="${borderRadius}" fill="${background}"/>${elements.join("")}</svg>`);
256
+ if ((svg.match(/<[a-z]/g)?.length ?? 0) > LIMITS.svgElements)
257
+ throw new RangeError();
258
+ return { imageUri: dataUri(svg), animated, diagnostics };
259
+ }
260
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/renderers/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Diagnostic, SceneInputV1, SceneV1, ValidationResult } from "../model/types.js";
2
+ type Path = readonly (string | number)[];
3
+ export declare class SceneValidationError extends Error {
4
+ readonly diagnostics: readonly Diagnostic[];
5
+ constructor(diagnostics: readonly Diagnostic[]);
6
+ }
7
+ export declare function fail(code: string, message: string, path: Path): never;
8
+ export declare function record(input: unknown, keys: readonly string[], path: Path): Record<string, unknown>;
9
+ export declare function array(input: unknown, max: number, path: Path): readonly unknown[];
10
+ export declare function text(value: unknown, path: Path): string;
11
+ export declare function parseScene(input: unknown): ValidationResult<SceneV1>;
12
+ export declare function defineScene(input: SceneInputV1): SceneV1;
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAEV,YAAY,EACZ,OAAO,EACP,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;AACzC,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;gBAChC,WAAW,EAAE,SAAS,UAAU,EAAE;CAK/C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAErE;AACD,wBAAgB,MAAM,CACpB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,IAAI,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BzB;AACD,wBAAgB,KAAK,CACnB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,GACT,SAAS,OAAO,EAAE,CA0BpB;AA0CD,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAsBvD;AAgSD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAQpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAIxD"}