@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.
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/browser/compiler.d.ts +14 -0
- package/dist/browser/compiler.d.ts.map +1 -0
- package/dist/browser/compiler.js +218 -0
- package/dist/browser/compiler.js.map +1 -0
- package/dist/browser/index.d.ts +16 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +55 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/measure.d.ts +5 -0
- package/dist/browser/measure.d.ts.map +1 -0
- package/dist/browser/measure.js +79 -0
- package/dist/browser/measure.js.map +1 -0
- package/dist/browser/preflight.d.ts +5 -0
- package/dist/browser/preflight.d.ts.map +1 -0
- package/dist/browser/preflight.js +70 -0
- package/dist/browser/preflight.js.map +1 -0
- package/dist/codegen/index.d.ts +5 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +56 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/effects/catalog.d.ts +5 -0
- package/dist/effects/catalog.d.ts.map +1 -0
- package/dist/effects/catalog.js +121 -0
- package/dist/effects/catalog.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/bounds.d.ts +16 -0
- package/dist/layout/bounds.d.ts.map +1 -0
- package/dist/layout/bounds.js +84 -0
- package/dist/layout/bounds.js.map +1 -0
- package/dist/layout/metrics.d.ts +20 -0
- package/dist/layout/metrics.d.ts.map +1 -0
- package/dist/layout/metrics.js +92 -0
- package/dist/layout/metrics.js.map +1 -0
- package/dist/layout/planner.d.ts +32 -0
- package/dist/layout/planner.d.ts.map +1 -0
- package/dist/layout/planner.js +439 -0
- package/dist/layout/planner.js.map +1 -0
- package/dist/layout/render.d.ts +4 -0
- package/dist/layout/render.d.ts.map +1 -0
- package/dist/layout/render.js +98 -0
- package/dist/layout/render.js.map +1 -0
- package/dist/layout/wrap.d.ts +16 -0
- package/dist/layout/wrap.d.ts.map +1 -0
- package/dist/layout/wrap.js +67 -0
- package/dist/layout/wrap.js.map +1 -0
- package/dist/model/layout.d.ts +112 -0
- package/dist/model/layout.d.ts.map +1 -0
- package/dist/model/layout.js +2 -0
- package/dist/model/layout.js.map +1 -0
- package/dist/model/limits.d.ts +19 -0
- package/dist/model/limits.d.ts.map +1 -0
- package/dist/model/limits.js +28 -0
- package/dist/model/limits.js.map +1 -0
- package/dist/model/types.d.ts +267 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +2 -0
- package/dist/model/types.js.map +1 -0
- package/dist/presentations/catalog.d.ts +5 -0
- package/dist/presentations/catalog.d.ts.map +1 -0
- package/dist/presentations/catalog.js +1522 -0
- package/dist/presentations/catalog.js.map +1 -0
- package/dist/presentations/compact.d.ts +16 -0
- package/dist/presentations/compact.d.ts.map +1 -0
- package/dist/presentations/compact.js +178 -0
- package/dist/presentations/compact.js.map +1 -0
- package/dist/presentations/fonts.d.ts +7 -0
- package/dist/presentations/fonts.d.ts.map +1 -0
- package/dist/presentations/fonts.js +7 -0
- package/dist/presentations/fonts.js.map +1 -0
- package/dist/presets/cards.d.ts +67 -0
- package/dist/presets/cards.d.ts.map +1 -0
- package/dist/presets/cards.js +305 -0
- package/dist/presets/cards.js.map +1 -0
- package/dist/presets/index.d.ts +125 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +270 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/renderers/cinematic/glyphs.d.ts +2 -0
- package/dist/renderers/cinematic/glyphs.d.ts.map +1 -0
- package/dist/renderers/cinematic/glyphs.js +86 -0
- package/dist/renderers/cinematic/glyphs.js.map +1 -0
- package/dist/renderers/cinematic/layout.d.ts +23 -0
- package/dist/renderers/cinematic/layout.d.ts.map +1 -0
- package/dist/renderers/cinematic/layout.js +86 -0
- package/dist/renderers/cinematic/layout.js.map +1 -0
- package/dist/renderers/cinematic/profiles.d.ts +51 -0
- package/dist/renderers/cinematic/profiles.d.ts.map +1 -0
- package/dist/renderers/cinematic/profiles.js +78 -0
- package/dist/renderers/cinematic/profiles.js.map +1 -0
- package/dist/renderers/cinematic/render.d.ts +8 -0
- package/dist/renderers/cinematic/render.d.ts.map +1 -0
- package/dist/renderers/cinematic/render.js +51 -0
- package/dist/renderers/cinematic/render.js.map +1 -0
- package/dist/renderers/css.d.ts +12 -0
- package/dist/renderers/css.d.ts.map +1 -0
- package/dist/renderers/css.js +72 -0
- package/dist/renderers/css.js.map +1 -0
- package/dist/renderers/presentations/compact-art.d.ts +3 -0
- package/dist/renderers/presentations/compact-art.d.ts.map +1 -0
- package/dist/renderers/presentations/compact-art.js +80 -0
- package/dist/renderers/presentations/compact-art.js.map +1 -0
- package/dist/renderers/presentations/layout.d.ts +5 -0
- package/dist/renderers/presentations/layout.d.ts.map +1 -0
- package/dist/renderers/presentations/layout.js +88 -0
- package/dist/renderers/presentations/layout.js.map +1 -0
- package/dist/renderers/presentations/render.d.ts +4 -0
- package/dist/renderers/presentations/render.d.ts.map +1 -0
- package/dist/renderers/presentations/render.js +199 -0
- package/dist/renderers/presentations/render.js.map +1 -0
- package/dist/renderers/presentations/shapes.d.ts +5 -0
- package/dist/renderers/presentations/shapes.d.ts.map +1 -0
- package/dist/renderers/presentations/shapes.js +6 -0
- package/dist/renderers/presentations/shapes.js.map +1 -0
- package/dist/renderers/svg-values.d.ts +3 -0
- package/dist/renderers/svg-values.d.ts.map +1 -0
- package/dist/renderers/svg-values.js +13 -0
- package/dist/renderers/svg-values.js.map +1 -0
- package/dist/renderers/svg.d.ts +16 -0
- package/dist/renderers/svg.d.ts.map +1 -0
- package/dist/renderers/svg.js +260 -0
- package/dist/renderers/svg.js.map +1 -0
- package/dist/validation/index.d.ts +14 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +291 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/layout.d.ts +10 -0
- package/dist/validation/layout.d.ts.map +1 -0
- package/dist/validation/layout.js +183 -0
- package/dist/validation/layout.js.map +1 -0
- package/dist/validation/options.d.ts +6 -0
- package/dist/validation/options.d.ts.map +1 -0
- package/dist/validation/options.js +29 -0
- package/dist/validation/options.js.map +1 -0
- package/dist/validation/recipe.d.ts +5 -0
- package/dist/validation/recipe.d.ts.map +1 -0
- package/dist/validation/recipe.js +30 -0
- package/dist/validation/recipe.js.map +1 -0
- package/dist/validation/render-options.d.ts +21 -0
- package/dist/validation/render-options.d.ts.map +1 -0
- package/dist/validation/render-options.js +36 -0
- package/dist/validation/render-options.js.map +1 -0
- 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 @@
|
|
|
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
|
+
"&": "&",
|
|
4
|
+
"<": "<",
|
|
5
|
+
">": ">",
|
|
6
|
+
'"': """,
|
|
7
|
+
"'": "'",
|
|
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"}
|