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.
Files changed (132) hide show
  1. package/ANIMATABLE_MATRIX.md +177 -0
  2. package/KERNEL_SPEC.md +412 -0
  3. package/PACKS.md +81 -0
  4. package/PRESETS.md +182 -0
  5. package/README.md +274 -188
  6. package/bin/editor-ui.cjs +2285 -0
  7. package/bin/preview-ui.cjs +74 -0
  8. package/bin/sketchmark.cjs +648 -2008
  9. package/dist/src/animatable.d.ts +21 -0
  10. package/dist/src/animatable.js +439 -0
  11. package/dist/src/builders/index.d.ts +1 -11
  12. package/dist/src/builders/index.js +1 -19
  13. package/dist/src/diagnostics.js +1 -64
  14. package/dist/src/edit.d.ts +27 -0
  15. package/dist/src/edit.js +162 -0
  16. package/dist/src/index.d.ts +4 -13
  17. package/dist/src/index.js +4 -13
  18. package/dist/src/keyframes.d.ts +48 -0
  19. package/dist/src/keyframes.js +182 -0
  20. package/dist/src/motion.d.ts +4 -0
  21. package/dist/src/motion.js +262 -0
  22. package/dist/src/normalize.js +120 -151
  23. package/dist/src/presets/characters.d.ts +15 -0
  24. package/dist/src/presets/characters.js +113 -0
  25. package/dist/src/presets/compose.d.ts +5 -0
  26. package/dist/src/presets/compose.js +80 -0
  27. package/dist/src/presets/effects.d.ts +40 -0
  28. package/dist/src/presets/effects.js +79 -0
  29. package/dist/src/presets/helpers.d.ts +33 -0
  30. package/dist/src/presets/helpers.js +165 -0
  31. package/dist/src/presets/index.d.ts +9 -0
  32. package/dist/src/presets/index.js +48 -0
  33. package/dist/src/presets/motions.d.ts +33 -0
  34. package/dist/src/presets/motions.js +75 -0
  35. package/dist/src/presets/scenes.d.ts +35 -0
  36. package/dist/src/presets/scenes.js +134 -0
  37. package/dist/src/presets/shapes.d.ts +71 -0
  38. package/dist/src/presets/shapes.js +96 -0
  39. package/dist/src/presets/transitions.d.ts +29 -0
  40. package/dist/src/presets/transitions.js +113 -0
  41. package/dist/src/presets/types.d.ts +34 -0
  42. package/dist/src/presets/types.js +2 -0
  43. package/dist/src/render/html.js +1 -4
  44. package/dist/src/render/svg.d.ts +2 -2
  45. package/dist/src/render/svg.js +86 -82
  46. package/dist/src/render/three-html.js +67 -113
  47. package/dist/src/scenes.js +1 -0
  48. package/dist/src/schema.js +218 -280
  49. package/dist/src/shapes/builtins.js +11 -47
  50. package/dist/src/shapes/common.js +12 -11
  51. package/dist/src/shapes/registry.d.ts +0 -1
  52. package/dist/src/shapes/registry.js +0 -4
  53. package/dist/src/shapes/types.d.ts +1 -3
  54. package/dist/src/types.d.ts +57 -288
  55. package/dist/src/utils.d.ts +2 -11
  56. package/dist/src/utils.js +13 -70
  57. package/dist/src/validate.js +321 -275
  58. package/dist/tests/run.js +576 -510
  59. package/examples/1730642890464.jpg +0 -0
  60. package/examples/app-screen.svg +1 -0
  61. package/examples/app-screen.visual.json +503 -0
  62. package/examples/dashboard-table.svg +1 -0
  63. package/examples/dashboard-table.visual.json +708 -0
  64. package/examples/dev-docs.svg +1 -0
  65. package/examples/dev-docs.visual.json +248 -0
  66. package/examples/explainer.mp4 +0 -0
  67. package/examples/explainer.visual.json +1713 -0
  68. package/examples/group-origin-effects-lab-check.svg +1 -0
  69. package/examples/group-origin-effects-lab.visual.json +1880 -0
  70. package/examples/image-clip-radius.visual.json +271 -0
  71. package/examples/make-app-screen.cjs +368 -0
  72. package/examples/make-dashboard-table.cjs +277 -0
  73. package/examples/make-dev-docs.cjs +233 -0
  74. package/examples/make-explainer.cjs +438 -0
  75. package/examples/make-group-origin-effects-lab.cjs +370 -0
  76. package/examples/make-image-clip-radius.cjs +169 -0
  77. package/examples/make-modal-dialog.cjs +355 -0
  78. package/examples/make-origin-effects-lab.cjs +311 -0
  79. package/examples/make-preset-character-motion.cjs +32 -0
  80. package/examples/make-presets-demo.cjs +30 -0
  81. package/examples/make-pricing.cjs +286 -0
  82. package/examples/make-product-demo.cjs +468 -0
  83. package/examples/make-product-hero.cjs +223 -0
  84. package/examples/make-release-notes.cjs +333 -0
  85. package/examples/make-settings-panel.cjs +435 -0
  86. package/examples/make-split-preview.cjs +248 -0
  87. package/examples/make-storyboard.cjs +215 -0
  88. package/examples/make-transcript.cjs +234 -0
  89. package/examples/make-typography-test.cjs +397 -0
  90. package/examples/make-ui-demo-explainer.cjs +1094 -0
  91. package/examples/make-ui-flow.cjs +762 -0
  92. package/examples/make-walkthrough.cjs +815 -0
  93. package/examples/modal-dialog.svg +1 -0
  94. package/examples/modal-dialog.visual.json +239 -0
  95. package/examples/origin-effects-lab-check.svg +1 -0
  96. package/examples/origin-effects-lab.visual.json +1412 -0
  97. package/examples/preset-character-motion.visual.json +949 -0
  98. package/examples/presets-demo.visual.json +787 -0
  99. package/examples/pricing.svg +1 -0
  100. package/examples/pricing.visual.json +652 -0
  101. package/examples/product-demo.mp4 +0 -0
  102. package/examples/product-demo.visual.json +866 -0
  103. package/examples/product-hero.svg +1 -0
  104. package/examples/product-hero.visual.json +242 -0
  105. package/examples/release-notes.svg +1 -0
  106. package/examples/release-notes.visual.json +467 -0
  107. package/examples/settings-panel.svg +1 -0
  108. package/examples/settings-panel.visual.json +501 -0
  109. package/examples/split-preview.svg +1 -0
  110. package/examples/split-preview.visual.json +124 -0
  111. package/examples/storyboard.svg +1 -0
  112. package/examples/storyboard.visual.json +312 -0
  113. package/examples/transcript.svg +1 -0
  114. package/examples/transcript.visual.json +407 -0
  115. package/examples/typography-indent-check.svg +1 -0
  116. package/examples/typography-lineheight-0.svg +1 -0
  117. package/examples/typography-lineheight-2.svg +1 -0
  118. package/examples/typography-test-check.svg +1 -0
  119. package/examples/typography-test.svg +1 -0
  120. package/examples/typography-test.visual.json +757 -0
  121. package/examples/ui-demo-explainer-billing.svg +1 -0
  122. package/examples/ui-demo-explainer-check.svg +1 -0
  123. package/examples/ui-demo-explainer-save.svg +1 -0
  124. package/examples/ui-demo-explainer-toggle.svg +1 -0
  125. package/examples/ui-demo-explainer.mp4 +0 -0
  126. package/examples/ui-demo-explainer.visual.json +2597 -0
  127. package/examples/ui-flow.mp4 +0 -0
  128. package/examples/ui-flow.visual.json +1211 -0
  129. package/examples/walkthrough.mp4 +0 -0
  130. package/examples/walkthrough.visual.json +1372 -0
  131. package/package.json +52 -52
  132. package/schema/visual.schema.json +1086 -930
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1120" height="880" viewBox="0 0 1120 880" role="img"><rect x="0" y="0" width="1120" height="880" fill="#ffffff"/><text id="hero-headline" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="48" font-weight="800" fill="#0f172a"><tspan x="560" y="96">Ship faster with less friction</tspan></text><text id="hero-subheadline" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="18" font-weight="400" fill="#475569"><tspan x="560" y="149">A modern platform for teams who want to build, deploy, and iterate</tspan><tspan x="560" y="176.9">without wrestling infrastructure or waiting on bottlenecks.</tspan></text><path id="chip-bg-0" d="M 261.75 212 L 461.25 212 Q 479.25 212 479.25 230 L 479.25 230 Q 479.25 248 461.25 248 L 261.75 248 Q 243.75 248 243.75 230 L 243.75 230 Q 243.75 212 261.75 212 Z" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1"/><text id="chip-text-0" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="500" fill="#334155"><tspan x="361.5" y="230">Real-time Collaboration</tspan></text><path id="chip-bg-1" d="M 511.25 212 L 651.25 212 Q 669.25 212 669.25 230 L 669.25 230 Q 669.25 248 651.25 248 L 511.25 248 Q 493.25 248 493.25 230 L 493.25 230 Q 493.25 212 511.25 212 Z" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1"/><text id="chip-text-1" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="500" fill="#334155"><tspan x="581.25" y="230">One-click Deploy</tspan></text><path id="chip-bg-2" d="M 701.25 212 L 858.25 212 Q 876.25 212 876.25 230 L 876.25 230 Q 876.25 248 858.25 248 L 701.25 248 Q 683.25 248 683.25 230 L 683.25 230 Q 683.25 212 701.25 212 Z" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1"/><text id="chip-text-2" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="500" fill="#334155"><tspan x="779.75" y="230">Built-in Analytics</tspan></text><path id="hero-divider" d="M 80 304 L 1040 304" fill="none" stroke="#e2e8f0" stroke-width="1"/><text id="section-title" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="26" font-weight="700" fill="#1e293b"><tspan x="80" y="365">Why teams choose us</tspan></text><text id="section-para" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="15" font-weight="400" fill="#475569"><tspan x="80" y="403.5">Most platforms promise speed but deliver complexity. We took a different approach:</tspan><tspan x="80" y="429">strip away everything that doesn't directly help you ship. No configuration mazes,</tspan><tspan x="80" y="454.5">no permission matrices, no waiting for DevOps. Just write code, push, and see it live.</tspan></text><path id="bullet-dot-0" d="M 85 505 A 4 4 0 1 1 85 505.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="15" font-weight="400" fill="#475569"><tspan x="100" y="503.5">Zero-config deployments with automatic scaling and rollback</tspan></text><path id="bullet-dot-1" d="M 85 541 A 4 4 0 1 1 85 541.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="15" font-weight="400" fill="#475569"><tspan x="100" y="539.5">Collaborative editing with live cursors and instant sync</tspan></text><path id="bullet-dot-2" d="M 85 577 A 4 4 0 1 1 85 577.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="15" font-weight="400" fill="#475569"><tspan x="100" y="575.5">Unified dashboard for logs, metrics, and error tracking</tspan></text><path id="bullet-dot-3" d="M 85 613 A 4 4 0 1 1 85 613.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="15" font-weight="400" fill="#475569"><tspan x="100" y="611.5">Native integrations with GitHub, GitLab, and Bitbucket</tspan></text><path id="bullet-dot-4" d="M 85 649 A 4 4 0 1 1 85 649.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="15" font-weight="400" fill="#475569"><tspan x="100" y="647.5">SOC 2 Type II certified with end-to-end encryption</tspan></text></svg>
@@ -0,0 +1,242 @@
1
+ {
2
+ "version": 1,
3
+ "canvas": {
4
+ "width": 1120,
5
+ "height": 880,
6
+ "background": "#ffffff"
7
+ },
8
+ "elements": [
9
+ {
10
+ "id": "hero-headline",
11
+ "type": "text",
12
+ "x": 560,
13
+ "y": 72,
14
+ "text": "Ship faster with less friction",
15
+ "align": "center",
16
+ "valign": "top",
17
+ "fontSize": 48,
18
+ "fontFamily": "Inter, system-ui, sans-serif",
19
+ "weight": 800,
20
+ "fill": "#0f172a"
21
+ },
22
+ {
23
+ "id": "hero-subheadline",
24
+ "type": "text",
25
+ "x": 560,
26
+ "y": 140,
27
+ "text": "A modern platform for teams who want to build, deploy, and iterate\nwithout wrestling infrastructure or waiting on bottlenecks.",
28
+ "align": "center",
29
+ "valign": "top",
30
+ "fontSize": 18,
31
+ "fontFamily": "Inter, system-ui, sans-serif",
32
+ "weight": 400,
33
+ "lineHeight": 1.55,
34
+ "fill": "#475569",
35
+ "maxWidth": 960
36
+ },
37
+ {
38
+ "id": "chip-bg-0",
39
+ "type": "path",
40
+ "d": "M 261.75 212 L 461.25 212 Q 479.25 212 479.25 230 L 479.25 230 Q 479.25 248 461.25 248 L 261.75 248 Q 243.75 248 243.75 230 L 243.75 230 Q 243.75 212 261.75 212 Z",
41
+ "fill": "#f1f5f9",
42
+ "stroke": "#e2e8f0",
43
+ "strokeWidth": 1
44
+ },
45
+ {
46
+ "id": "chip-text-0",
47
+ "type": "text",
48
+ "x": 361.5,
49
+ "y": 230,
50
+ "text": "Real-time Collaboration",
51
+ "align": "center",
52
+ "valign": "middle",
53
+ "fontSize": 14,
54
+ "fontFamily": "Inter, system-ui, sans-serif",
55
+ "weight": 500,
56
+ "fill": "#334155"
57
+ },
58
+ {
59
+ "id": "chip-bg-1",
60
+ "type": "path",
61
+ "d": "M 511.25 212 L 651.25 212 Q 669.25 212 669.25 230 L 669.25 230 Q 669.25 248 651.25 248 L 511.25 248 Q 493.25 248 493.25 230 L 493.25 230 Q 493.25 212 511.25 212 Z",
62
+ "fill": "#f1f5f9",
63
+ "stroke": "#e2e8f0",
64
+ "strokeWidth": 1
65
+ },
66
+ {
67
+ "id": "chip-text-1",
68
+ "type": "text",
69
+ "x": 581.25,
70
+ "y": 230,
71
+ "text": "One-click Deploy",
72
+ "align": "center",
73
+ "valign": "middle",
74
+ "fontSize": 14,
75
+ "fontFamily": "Inter, system-ui, sans-serif",
76
+ "weight": 500,
77
+ "fill": "#334155"
78
+ },
79
+ {
80
+ "id": "chip-bg-2",
81
+ "type": "path",
82
+ "d": "M 701.25 212 L 858.25 212 Q 876.25 212 876.25 230 L 876.25 230 Q 876.25 248 858.25 248 L 701.25 248 Q 683.25 248 683.25 230 L 683.25 230 Q 683.25 212 701.25 212 Z",
83
+ "fill": "#f1f5f9",
84
+ "stroke": "#e2e8f0",
85
+ "strokeWidth": 1
86
+ },
87
+ {
88
+ "id": "chip-text-2",
89
+ "type": "text",
90
+ "x": 779.75,
91
+ "y": 230,
92
+ "text": "Built-in Analytics",
93
+ "align": "center",
94
+ "valign": "middle",
95
+ "fontSize": 14,
96
+ "fontFamily": "Inter, system-ui, sans-serif",
97
+ "weight": 500,
98
+ "fill": "#334155"
99
+ },
100
+ {
101
+ "id": "hero-divider",
102
+ "type": "path",
103
+ "d": "M 80 304 L 1040 304",
104
+ "stroke": "#e2e8f0",
105
+ "strokeWidth": 1,
106
+ "fill": "none"
107
+ },
108
+ {
109
+ "id": "section-title",
110
+ "type": "text",
111
+ "x": 80,
112
+ "y": 352,
113
+ "text": "Why teams choose us",
114
+ "align": "left",
115
+ "valign": "top",
116
+ "fontSize": 26,
117
+ "fontFamily": "Inter, system-ui, sans-serif",
118
+ "weight": 700,
119
+ "fill": "#1e293b"
120
+ },
121
+ {
122
+ "id": "section-para",
123
+ "type": "text",
124
+ "x": 80,
125
+ "y": 396,
126
+ "text": "Most platforms promise speed but deliver complexity. We took a different approach:\nstrip away everything that doesn't directly help you ship. No configuration mazes,\nno permission matrices, no waiting for DevOps. Just write code, push, and see it live.",
127
+ "align": "left",
128
+ "valign": "top",
129
+ "fontSize": 15,
130
+ "fontFamily": "Inter, system-ui, sans-serif",
131
+ "weight": 400,
132
+ "lineHeight": 1.7,
133
+ "fill": "#475569",
134
+ "maxWidth": 960
135
+ },
136
+ {
137
+ "id": "bullet-dot-0",
138
+ "type": "path",
139
+ "d": "M 85 505 A 4 4 0 1 1 85 505.01 Z",
140
+ "fill": "#2563eb",
141
+ "stroke": "none"
142
+ },
143
+ {
144
+ "id": "bullet-text-0",
145
+ "type": "text",
146
+ "x": 100,
147
+ "y": 496,
148
+ "text": "Zero-config deployments with automatic scaling and rollback",
149
+ "align": "left",
150
+ "valign": "top",
151
+ "fontSize": 15,
152
+ "fontFamily": "Inter, system-ui, sans-serif",
153
+ "weight": 400,
154
+ "fill": "#475569",
155
+ "maxWidth": 940
156
+ },
157
+ {
158
+ "id": "bullet-dot-1",
159
+ "type": "path",
160
+ "d": "M 85 541 A 4 4 0 1 1 85 541.01 Z",
161
+ "fill": "#2563eb",
162
+ "stroke": "none"
163
+ },
164
+ {
165
+ "id": "bullet-text-1",
166
+ "type": "text",
167
+ "x": 100,
168
+ "y": 532,
169
+ "text": "Collaborative editing with live cursors and instant sync",
170
+ "align": "left",
171
+ "valign": "top",
172
+ "fontSize": 15,
173
+ "fontFamily": "Inter, system-ui, sans-serif",
174
+ "weight": 400,
175
+ "fill": "#475569",
176
+ "maxWidth": 940
177
+ },
178
+ {
179
+ "id": "bullet-dot-2",
180
+ "type": "path",
181
+ "d": "M 85 577 A 4 4 0 1 1 85 577.01 Z",
182
+ "fill": "#2563eb",
183
+ "stroke": "none"
184
+ },
185
+ {
186
+ "id": "bullet-text-2",
187
+ "type": "text",
188
+ "x": 100,
189
+ "y": 568,
190
+ "text": "Unified dashboard for logs, metrics, and error tracking",
191
+ "align": "left",
192
+ "valign": "top",
193
+ "fontSize": 15,
194
+ "fontFamily": "Inter, system-ui, sans-serif",
195
+ "weight": 400,
196
+ "fill": "#475569",
197
+ "maxWidth": 940
198
+ },
199
+ {
200
+ "id": "bullet-dot-3",
201
+ "type": "path",
202
+ "d": "M 85 613 A 4 4 0 1 1 85 613.01 Z",
203
+ "fill": "#2563eb",
204
+ "stroke": "none"
205
+ },
206
+ {
207
+ "id": "bullet-text-3",
208
+ "type": "text",
209
+ "x": 100,
210
+ "y": 604,
211
+ "text": "Native integrations with GitHub, GitLab, and Bitbucket",
212
+ "align": "left",
213
+ "valign": "top",
214
+ "fontSize": 15,
215
+ "fontFamily": "Inter, system-ui, sans-serif",
216
+ "weight": 400,
217
+ "fill": "#475569",
218
+ "maxWidth": 940
219
+ },
220
+ {
221
+ "id": "bullet-dot-4",
222
+ "type": "path",
223
+ "d": "M 85 649 A 4 4 0 1 1 85 649.01 Z",
224
+ "fill": "#2563eb",
225
+ "stroke": "none"
226
+ },
227
+ {
228
+ "id": "bullet-text-4",
229
+ "type": "text",
230
+ "x": 100,
231
+ "y": 640,
232
+ "text": "SOC 2 Type II certified with end-to-end encryption",
233
+ "align": "left",
234
+ "valign": "top",
235
+ "fontSize": 15,
236
+ "fontFamily": "Inter, system-ui, sans-serif",
237
+ "weight": 400,
238
+ "fill": "#475569",
239
+ "maxWidth": 940
240
+ }
241
+ ]
242
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1080" height="1380" viewBox="0 0 1080 1380" role="img"><rect x="0" y="0" width="1080" height="1380" fill="#ffffff"/><text id="title" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="44" font-weight="800" fill="#0f172a"><tspan x="72" y="78">Release Notes</tspan></text><text id="version" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="18" font-weight="600" fill="#1e293b"><tspan x="72" y="125">v2.4.0</tspan></text><text id="date" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="15" font-weight="400" fill="#94a3b8"><tspan x="144" y="125.5">— May 27, 2026</tspan></text><path id="divider-top" d="M 72 152 L 1008 152" fill="none" stroke="#e2e8f0" stroke-width="1"/><text id="s1-heading" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="24" font-weight="700" fill="#1e293b"><tspan x="72" y="204">New Features</tspan></text><path id="new-pill-bg" d="M 251 195 L 281 195 Q 292 195 292 206 L 292 206 Q 292 217 281 217 L 251 217 Q 240 217 240 206 L 240 206 Q 240 195 251 195 Z" fill="#10b981" stroke="none" stroke-width="0"/><text id="new-pill-text" text-anchor="middle" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="11" font-weight="700" fill="#ffffff"><tspan x="266" y="206">New</tspan></text><text id="s1a-sub" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="600" fill="#334155"><tspan x="72" y="242">Real-time Collaboration</tspan></text><path id="s1a-dot-0" d="M 78 270 A 3.5 3.5 0 1 1 78 270.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s1a-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="269">Multiple users can now edit the same document simultaneously</tspan><tspan x="92" y="292.1">with live cursor presence and conflict-free merging.</tspan></text><path id="s1a-dot-1" d="M 78 330 A 3.5 3.5 0 1 1 78 330.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s1a-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="329">Inline comments and threads are synced in real time across</tspan><tspan x="92" y="352.1">all connected sessions without page reload.</tspan></text><path id="s1a-dot-2" d="M 78 390 A 3.5 3.5 0 1 1 78 390.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s1a-text-2" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="389">Permission scopes support viewer, commenter, and editor</tspan><tspan x="92" y="412.1">roles with granular per-section access control.</tspan></text><text id="s1b-sub" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="600" fill="#334155"><tspan x="72" y="466">Export Pipeline</tspan></text><path id="s1b-dot-0" d="M 78 494 A 3.5 3.5 0 1 1 78 494.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s1b-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="493">Added PDF and DOCX export targets with full styling</tspan><tspan x="92" y="516.1">preservation and embedded font support.</tspan></text><path id="s1b-dot-1" d="M 78 554 A 3.5 3.5 0 1 1 78 554.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s1b-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="553">Batch export now runs in parallel workers, reducing</tspan><tspan x="92" y="576.1">processing time by up to 4x on large document sets.</tspan></text><text id="s2-heading" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="24" font-weight="700" fill="#1e293b"><tspan x="72" y="650">Improvements</tspan></text><text id="s2a-sub" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="600" fill="#334155"><tspan x="72" y="688">Performance</tspan></text><path id="s2a-dot-0" d="M 78 716 A 3.5 3.5 0 1 1 78 716.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s2a-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="715">Timeline resolution is now 3x faster due to a rewritten</tspan><tspan x="92" y="738.1">interpolation engine with pre-compiled curve LUTs.</tspan></text><path id="s2a-dot-1" d="M 78 776 A 3.5 3.5 0 1 1 78 776.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s2a-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="775">Initial document load time reduced by 40% through</tspan><tspan x="92" y="798.1">lazy hydration of off-screen element groups.</tspan></text><path id="s2a-dot-2" d="M 78 836 A 3.5 3.5 0 1 1 78 836.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s2a-text-2" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="835">Memory usage during preview reduced by caching</tspan><tspan x="92" y="858.1">resolved frames and evicting stale entries on scroll.</tspan></text><text id="s2b-sub" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="600" fill="#334155"><tspan x="72" y="912">Editor UX</tspan></text><path id="s2b-dot-0" d="M 78 940 A 3.5 3.5 0 1 1 78 940.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s2b-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="939">Undo history now groups rapid sequential edits into</tspan><tspan x="92" y="962.1">single entries for cleaner rollback behavior.</tspan></text><path id="s2b-dot-1" d="M 78 1000 A 3.5 3.5 0 1 1 78 1000.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s2b-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="999">Keyboard shortcuts panel redesigned with searchable</tspan><tspan x="92" y="1022.1">categories and conflict detection warnings.</tspan></text><text id="s3-heading" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="24" font-weight="700" fill="#1e293b"><tspan x="72" y="1096">Bug Fixes</tspan></text><text id="s3a-sub" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="16" font-weight="600" fill="#334155"><tspan x="72" y="1134">Rendering</tspan></text><path id="s3a-dot-0" d="M 78 1162 A 3.5 3.5 0 1 1 78 1162.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s3a-text-0" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="1161">Fixed incorrect gradient interpolation when stop offsets</tspan><tspan x="92" y="1184.1">were defined in descending order.</tspan></text><path id="s3a-dot-1" d="M 78 1222 A 3.5 3.5 0 1 1 78 1222.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s3a-text-1" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="1221">Resolved clipping mask artifacts on group elements</tspan><tspan x="92" y="1244.1">with non-zero rotation and nested transforms.</tspan></text><path id="s3a-dot-2" d="M 78 1282 A 3.5 3.5 0 1 1 78 1282.01 Z" fill="#2563eb" stroke="none" stroke-width="0"/><text id="s3a-text-2" text-anchor="start" dominant-baseline="middle" font-family="Roboto, Arial, sans-serif" font-size="14" font-weight="400" fill="#475569"><tspan x="92" y="1281">Text elements with empty strings no longer produce</tspan><tspan x="92" y="1304.1">invalid SVG output during frame resolution.</tspan></text></svg>