sketchmark 2.0.0 → 2.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/ANIMATABLE_MATRIX.md +177 -0
- package/KERNEL_SPEC.md +412 -0
- package/PACKS.md +81 -0
- package/PRESETS.md +182 -0
- package/README.md +274 -188
- package/bin/editor-ui.cjs +2285 -0
- package/bin/preview-ui.cjs +74 -0
- package/bin/sketchmark.cjs +648 -2008
- package/dist/src/animatable.d.ts +21 -0
- package/dist/src/animatable.js +439 -0
- package/dist/src/builders/index.d.ts +1 -11
- package/dist/src/builders/index.js +1 -19
- package/dist/src/diagnostics.js +1 -64
- package/dist/src/edit.d.ts +27 -0
- package/dist/src/edit.js +162 -0
- package/dist/src/index.d.ts +4 -13
- package/dist/src/index.js +4 -13
- package/dist/src/keyframes.d.ts +48 -0
- package/dist/src/keyframes.js +182 -0
- package/dist/src/motion.d.ts +4 -0
- package/dist/src/motion.js +262 -0
- package/dist/src/normalize.js +120 -151
- package/dist/src/presets/characters.d.ts +15 -0
- package/dist/src/presets/characters.js +113 -0
- package/dist/src/presets/compose.d.ts +5 -0
- package/dist/src/presets/compose.js +80 -0
- package/dist/src/presets/effects.d.ts +40 -0
- package/dist/src/presets/effects.js +79 -0
- package/dist/src/presets/helpers.d.ts +33 -0
- package/dist/src/presets/helpers.js +165 -0
- package/dist/src/presets/index.d.ts +9 -0
- package/dist/src/presets/index.js +48 -0
- package/dist/src/presets/motions.d.ts +33 -0
- package/dist/src/presets/motions.js +75 -0
- package/dist/src/presets/scenes.d.ts +35 -0
- package/dist/src/presets/scenes.js +134 -0
- package/dist/src/presets/shapes.d.ts +71 -0
- package/dist/src/presets/shapes.js +96 -0
- package/dist/src/presets/transitions.d.ts +29 -0
- package/dist/src/presets/transitions.js +113 -0
- package/dist/src/presets/types.d.ts +34 -0
- package/dist/src/presets/types.js +2 -0
- package/dist/src/render/html.js +1 -4
- package/dist/src/render/svg.d.ts +2 -2
- package/dist/src/render/svg.js +86 -82
- package/dist/src/render/three-html.js +67 -113
- package/dist/src/scenes.js +1 -0
- package/dist/src/schema.js +218 -280
- package/dist/src/shapes/builtins.js +11 -47
- package/dist/src/shapes/common.js +12 -11
- package/dist/src/shapes/registry.d.ts +0 -1
- package/dist/src/shapes/registry.js +0 -4
- package/dist/src/shapes/types.d.ts +1 -3
- package/dist/src/types.d.ts +57 -288
- package/dist/src/utils.d.ts +2 -11
- package/dist/src/utils.js +13 -70
- package/dist/src/validate.js +321 -275
- package/dist/tests/run.js +576 -510
- package/examples/1730642890464.jpg +0 -0
- package/examples/app-screen.svg +1 -0
- package/examples/app-screen.visual.json +503 -0
- package/examples/dashboard-table.svg +1 -0
- package/examples/dashboard-table.visual.json +708 -0
- package/examples/dev-docs.svg +1 -0
- package/examples/dev-docs.visual.json +248 -0
- package/examples/explainer.mp4 +0 -0
- package/examples/explainer.visual.json +1713 -0
- package/examples/group-origin-effects-lab-check.svg +1 -0
- package/examples/group-origin-effects-lab.visual.json +1880 -0
- package/examples/image-clip-radius.visual.json +271 -0
- package/examples/make-app-screen.cjs +368 -0
- package/examples/make-dashboard-table.cjs +277 -0
- package/examples/make-dev-docs.cjs +233 -0
- package/examples/make-explainer.cjs +438 -0
- package/examples/make-group-origin-effects-lab.cjs +370 -0
- package/examples/make-image-clip-radius.cjs +169 -0
- package/examples/make-modal-dialog.cjs +355 -0
- package/examples/make-origin-effects-lab.cjs +311 -0
- package/examples/make-preset-character-motion.cjs +32 -0
- package/examples/make-presets-demo.cjs +30 -0
- package/examples/make-pricing.cjs +286 -0
- package/examples/make-product-demo.cjs +468 -0
- package/examples/make-product-hero.cjs +223 -0
- package/examples/make-release-notes.cjs +333 -0
- package/examples/make-settings-panel.cjs +435 -0
- package/examples/make-split-preview.cjs +248 -0
- package/examples/make-storyboard.cjs +215 -0
- package/examples/make-transcript.cjs +234 -0
- package/examples/make-typography-test.cjs +397 -0
- package/examples/make-ui-demo-explainer.cjs +1094 -0
- package/examples/make-ui-flow.cjs +762 -0
- package/examples/make-walkthrough.cjs +815 -0
- package/examples/modal-dialog.svg +1 -0
- package/examples/modal-dialog.visual.json +239 -0
- package/examples/origin-effects-lab-check.svg +1 -0
- package/examples/origin-effects-lab.visual.json +1412 -0
- package/examples/preset-character-motion.visual.json +949 -0
- package/examples/presets-demo.visual.json +787 -0
- package/examples/pricing.svg +1 -0
- package/examples/pricing.visual.json +652 -0
- package/examples/product-demo.mp4 +0 -0
- package/examples/product-demo.visual.json +866 -0
- package/examples/product-hero.svg +1 -0
- package/examples/product-hero.visual.json +242 -0
- package/examples/release-notes.svg +1 -0
- package/examples/release-notes.visual.json +467 -0
- package/examples/settings-panel.svg +1 -0
- package/examples/settings-panel.visual.json +501 -0
- package/examples/split-preview.svg +1 -0
- package/examples/split-preview.visual.json +124 -0
- package/examples/storyboard.svg +1 -0
- package/examples/storyboard.visual.json +312 -0
- package/examples/transcript.svg +1 -0
- package/examples/transcript.visual.json +407 -0
- package/examples/typography-indent-check.svg +1 -0
- package/examples/typography-lineheight-0.svg +1 -0
- package/examples/typography-lineheight-2.svg +1 -0
- package/examples/typography-test-check.svg +1 -0
- package/examples/typography-test.svg +1 -0
- package/examples/typography-test.visual.json +757 -0
- package/examples/ui-demo-explainer-billing.svg +1 -0
- package/examples/ui-demo-explainer-check.svg +1 -0
- package/examples/ui-demo-explainer-save.svg +1 -0
- package/examples/ui-demo-explainer-toggle.svg +1 -0
- package/examples/ui-demo-explainer.mp4 +0 -0
- package/examples/ui-demo-explainer.visual.json +2597 -0
- package/examples/ui-flow.mp4 +0 -0
- package/examples/ui-flow.visual.json +1211 -0
- package/examples/walkthrough.mp4 +0 -0
- package/examples/walkthrough.visual.json +1372 -0
- package/package.json +52 -52
- package/schema/visual.schema.json +1086 -930
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="960" viewBox="0 0 1280 960" role="img"><rect x="0" y="0" width="1280" height="960" fill="#ffffff"/><text id="title" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="36" font-weight="700" fill="#1a1a2e"><tspan x="80" y="82">Getting Started with the Render API</tspan></text><text id="subtitle" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="400" fill="#6b7280"><tspan x="80" y="124">A concise guide to integrating the render pipeline into your application.</tspan></text><path id="divider" d="M 80 164 L 1200 164" fill="none" stroke="#e5e7eb" stroke-width="1"/><text id="para1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="15" font-weight="400" fill="#1a1a2e"><tspan x="80" y="203.5">The Render API exposes a minimal surface for compiling visual documents into</tspan><tspan x="80" y="229">output frames. It accepts a validated kernel document and a target time, then</tspan><tspan x="80" y="254.5">resolves all timeline interpolations and returns a flat list of positioned primitives</tspan><tspan x="80" y="280">ready for rasterization or SVG serialization.</tspan></text><text id="para2" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="15" font-weight="400" fill="#1a1a2e"><tspan x="80" y="313.5">Before calling the render function, ensure your document passes schema</tspan><tspan x="80" y="339">validation. Invalid documents will throw a structured error with path information</tspan><tspan x="80" y="364.5">pointing to the offending node. This keeps the pipeline predictable and safe.</tspan></text><path id="code-bg" d="M 80 406 L 1200 406 L 1200 578 L 80 578 Z" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1"/><text id="code-text" text-anchor="start" dominant-baseline="middle" font-family="JetBrains Mono, Fira Code, monospace" font-size="13" font-weight="400" fill="#334155"><tspan x="100" y="430.5">import { validateVisualDocument, resolveVisualFrame } from "sketchmark";</tspan><tspan x="100" y="453.9"></tspan><tspan x="100" y="477.3">const doc = JSON.parse(fs.readFileSync("scene.visual.json", "utf8"));</tspan><tspan x="100" y="500.7">validateVisualDocument(doc);</tspan><tspan x="100" y="524.1"></tspan><tspan x="100" y="547.5">const frame = resolveVisualFrame(doc, { time: 1.5 });</tspan><tspan x="100" y="570.9">console.log(frame.elements.length, "primitives resolved");</tspan></text><text id="list-heading" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="20" font-weight="600" fill="#1a1a2e"><tspan x="80" y="624">Key Concepts</tspan></text><path id="bullet-dot-0" d="M 84 657 A 3 3 0 1 1 84 657.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="bullet-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#1a1a2e"><tspan x="98" y="657">Documents must declare version: 1 and a canvas with width and height.</tspan></text><path id="bullet-dot-1" d="M 84 687 A 3 3 0 1 1 84 687.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="bullet-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#1a1a2e"><tspan x="98" y="687">Elements are flat arrays of path, text, image, point, or group primitives.</tspan></text><path id="bullet-dot-2" d="M 84 717 A 3 3 0 1 1 84 717.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="bullet-text-2" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#1a1a2e"><tspan x="98" y="717">Timelines are element-local — each element owns its own tracks and keyframes.</tspan></text><path id="bullet-dot-3" d="M 84 747 A 3 3 0 1 1 84 747.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="bullet-text-3" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#1a1a2e"><tspan x="98" y="747">Interpolation resolves per-track using cubic bezier, graph, or hold curves.</tspan></text><path id="bullet-dot-4" d="M 84 777 A 3 3 0 1 1 84 777.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="bullet-text-4" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#1a1a2e"><tspan x="98" y="777">The output frame contains fully resolved properties with no remaining references.</tspan></text><path id="btn-bg" d="M 548 840 L 732 840 Q 740 840 740 848 L 740 876 Q 740 884 732 884 L 548 884 Q 540 884 540 876 L 540 848 Q 540 840 548 840 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="btn-label" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="15" font-weight="600" fill="#ffffff"><tspan x="640" y="862">View Full Reference</tspan></text><text id="footer" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="12" font-weight="400" fill="#6b7280"><tspan x="80" y="926">Last updated May 2026 · Sketchmark v1.0 · MIT License</tspan></text></svg>
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"canvas": {
|
|
4
|
+
"width": 1280,
|
|
5
|
+
"height": 960,
|
|
6
|
+
"background": "#ffffff"
|
|
7
|
+
},
|
|
8
|
+
"elements": [
|
|
9
|
+
{
|
|
10
|
+
"id": "title",
|
|
11
|
+
"type": "text",
|
|
12
|
+
"x": 80,
|
|
13
|
+
"y": 64,
|
|
14
|
+
"text": "Getting Started with the Render API",
|
|
15
|
+
"align": "left",
|
|
16
|
+
"valign": "top",
|
|
17
|
+
"fontSize": 36,
|
|
18
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
19
|
+
"weight": 700,
|
|
20
|
+
"fill": "#1a1a2e"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "subtitle",
|
|
24
|
+
"type": "text",
|
|
25
|
+
"x": 80,
|
|
26
|
+
"y": 116,
|
|
27
|
+
"text": "A concise guide to integrating the render pipeline into your application.",
|
|
28
|
+
"align": "left",
|
|
29
|
+
"valign": "top",
|
|
30
|
+
"fontSize": 16,
|
|
31
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
32
|
+
"weight": 400,
|
|
33
|
+
"fill": "#6b7280"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "divider",
|
|
37
|
+
"type": "path",
|
|
38
|
+
"d": "M 80 164 L 1200 164",
|
|
39
|
+
"stroke": "#e5e7eb",
|
|
40
|
+
"strokeWidth": 1,
|
|
41
|
+
"fill": "none"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "para1",
|
|
45
|
+
"type": "text",
|
|
46
|
+
"x": 80,
|
|
47
|
+
"y": 196,
|
|
48
|
+
"text": "The Render API exposes a minimal surface for compiling visual documents into\noutput frames. It accepts a validated kernel document and a target time, then\nresolves all timeline interpolations and returns a flat list of positioned primitives\nready for rasterization or SVG serialization.",
|
|
49
|
+
"align": "left",
|
|
50
|
+
"valign": "top",
|
|
51
|
+
"fontSize": 15,
|
|
52
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
53
|
+
"weight": 400,
|
|
54
|
+
"lineHeight": 1.7,
|
|
55
|
+
"fill": "#1a1a2e",
|
|
56
|
+
"maxWidth": 1120
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "para2",
|
|
60
|
+
"type": "text",
|
|
61
|
+
"x": 80,
|
|
62
|
+
"y": 306,
|
|
63
|
+
"text": "Before calling the render function, ensure your document passes schema\nvalidation. Invalid documents will throw a structured error with path information\npointing to the offending node. This keeps the pipeline predictable and safe.",
|
|
64
|
+
"align": "left",
|
|
65
|
+
"valign": "top",
|
|
66
|
+
"fontSize": 15,
|
|
67
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
68
|
+
"weight": 400,
|
|
69
|
+
"lineHeight": 1.7,
|
|
70
|
+
"fill": "#1a1a2e",
|
|
71
|
+
"maxWidth": 1120
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "code-bg",
|
|
75
|
+
"type": "path",
|
|
76
|
+
"d": "M 80 406 L 1200 406 L 1200 578 L 80 578 Z",
|
|
77
|
+
"fill": "#f1f5f9",
|
|
78
|
+
"stroke": "#e2e8f0",
|
|
79
|
+
"strokeWidth": 1
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "code-text",
|
|
83
|
+
"type": "text",
|
|
84
|
+
"x": 100,
|
|
85
|
+
"y": 424,
|
|
86
|
+
"text": "import { validateVisualDocument, resolveVisualFrame } from \"sketchmark\";\n\nconst doc = JSON.parse(fs.readFileSync(\"scene.visual.json\", \"utf8\"));\nvalidateVisualDocument(doc);\n\nconst frame = resolveVisualFrame(doc, { time: 1.5 });\nconsole.log(frame.elements.length, \"primitives resolved\");",
|
|
87
|
+
"align": "left",
|
|
88
|
+
"valign": "top",
|
|
89
|
+
"fontSize": 13,
|
|
90
|
+
"fontFamily": "JetBrains Mono, Fira Code, monospace",
|
|
91
|
+
"weight": 400,
|
|
92
|
+
"lineHeight": 1.8,
|
|
93
|
+
"fill": "#334155",
|
|
94
|
+
"maxWidth": 1080
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "list-heading",
|
|
98
|
+
"type": "text",
|
|
99
|
+
"x": 80,
|
|
100
|
+
"y": 614,
|
|
101
|
+
"text": "Key Concepts",
|
|
102
|
+
"align": "left",
|
|
103
|
+
"valign": "top",
|
|
104
|
+
"fontSize": 20,
|
|
105
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
106
|
+
"weight": 600,
|
|
107
|
+
"fill": "#1a1a2e"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "bullet-dot-0",
|
|
111
|
+
"type": "path",
|
|
112
|
+
"d": "M 84 657 A 3 3 0 1 1 84 657.01 Z",
|
|
113
|
+
"fill": "#2563eb",
|
|
114
|
+
"stroke": "none"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "bullet-text-0",
|
|
118
|
+
"type": "text",
|
|
119
|
+
"x": 98,
|
|
120
|
+
"y": 650,
|
|
121
|
+
"text": "Documents must declare version: 1 and a canvas with width and height.",
|
|
122
|
+
"align": "left",
|
|
123
|
+
"valign": "top",
|
|
124
|
+
"fontSize": 14,
|
|
125
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
126
|
+
"weight": 400,
|
|
127
|
+
"fill": "#1a1a2e",
|
|
128
|
+
"maxWidth": 1102
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "bullet-dot-1",
|
|
132
|
+
"type": "path",
|
|
133
|
+
"d": "M 84 687 A 3 3 0 1 1 84 687.01 Z",
|
|
134
|
+
"fill": "#2563eb",
|
|
135
|
+
"stroke": "none"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "bullet-text-1",
|
|
139
|
+
"type": "text",
|
|
140
|
+
"x": 98,
|
|
141
|
+
"y": 680,
|
|
142
|
+
"text": "Elements are flat arrays of path, text, image, point, or group primitives.",
|
|
143
|
+
"align": "left",
|
|
144
|
+
"valign": "top",
|
|
145
|
+
"fontSize": 14,
|
|
146
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
147
|
+
"weight": 400,
|
|
148
|
+
"fill": "#1a1a2e",
|
|
149
|
+
"maxWidth": 1102
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"id": "bullet-dot-2",
|
|
153
|
+
"type": "path",
|
|
154
|
+
"d": "M 84 717 A 3 3 0 1 1 84 717.01 Z",
|
|
155
|
+
"fill": "#2563eb",
|
|
156
|
+
"stroke": "none"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "bullet-text-2",
|
|
160
|
+
"type": "text",
|
|
161
|
+
"x": 98,
|
|
162
|
+
"y": 710,
|
|
163
|
+
"text": "Timelines are element-local — each element owns its own tracks and keyframes.",
|
|
164
|
+
"align": "left",
|
|
165
|
+
"valign": "top",
|
|
166
|
+
"fontSize": 14,
|
|
167
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
168
|
+
"weight": 400,
|
|
169
|
+
"fill": "#1a1a2e",
|
|
170
|
+
"maxWidth": 1102
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "bullet-dot-3",
|
|
174
|
+
"type": "path",
|
|
175
|
+
"d": "M 84 747 A 3 3 0 1 1 84 747.01 Z",
|
|
176
|
+
"fill": "#2563eb",
|
|
177
|
+
"stroke": "none"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "bullet-text-3",
|
|
181
|
+
"type": "text",
|
|
182
|
+
"x": 98,
|
|
183
|
+
"y": 740,
|
|
184
|
+
"text": "Interpolation resolves per-track using cubic bezier, graph, or hold curves.",
|
|
185
|
+
"align": "left",
|
|
186
|
+
"valign": "top",
|
|
187
|
+
"fontSize": 14,
|
|
188
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
189
|
+
"weight": 400,
|
|
190
|
+
"fill": "#1a1a2e",
|
|
191
|
+
"maxWidth": 1102
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"id": "bullet-dot-4",
|
|
195
|
+
"type": "path",
|
|
196
|
+
"d": "M 84 777 A 3 3 0 1 1 84 777.01 Z",
|
|
197
|
+
"fill": "#2563eb",
|
|
198
|
+
"stroke": "none"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "bullet-text-4",
|
|
202
|
+
"type": "text",
|
|
203
|
+
"x": 98,
|
|
204
|
+
"y": 770,
|
|
205
|
+
"text": "The output frame contains fully resolved properties with no remaining references.",
|
|
206
|
+
"align": "left",
|
|
207
|
+
"valign": "top",
|
|
208
|
+
"fontSize": 14,
|
|
209
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
210
|
+
"weight": 400,
|
|
211
|
+
"fill": "#1a1a2e",
|
|
212
|
+
"maxWidth": 1102
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"id": "btn-bg",
|
|
216
|
+
"type": "path",
|
|
217
|
+
"d": "M 548 840 L 732 840 Q 740 840 740 848 L 740 876 Q 740 884 732 884 L 548 884 Q 540 884 540 876 L 540 848 Q 540 840 548 840 Z",
|
|
218
|
+
"fill": "#2563eb",
|
|
219
|
+
"stroke": "none"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": "btn-label",
|
|
223
|
+
"type": "text",
|
|
224
|
+
"x": 640,
|
|
225
|
+
"y": 862,
|
|
226
|
+
"text": "View Full Reference",
|
|
227
|
+
"align": "center",
|
|
228
|
+
"valign": "middle",
|
|
229
|
+
"fontSize": 15,
|
|
230
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
231
|
+
"weight": 600,
|
|
232
|
+
"fill": "#ffffff"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "footer",
|
|
236
|
+
"type": "text",
|
|
237
|
+
"x": 80,
|
|
238
|
+
"y": 920,
|
|
239
|
+
"text": "Last updated May 2026 · Sketchmark v1.0 · MIT License",
|
|
240
|
+
"align": "left",
|
|
241
|
+
"valign": "top",
|
|
242
|
+
"fontSize": 12,
|
|
243
|
+
"fontFamily": "Inter, system-ui, sans-serif",
|
|
244
|
+
"weight": 400,
|
|
245
|
+
"fill": "#6b7280"
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
}
|
|
Binary file
|