claude-exode-mcp 7.5.7 → 7.5.9

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 (173) hide show
  1. package/MCP_DOCUMENTATION.md +1 -0
  2. package/SKILL.md +10 -0
  3. package/examples/aurum-product-page.exode +3208 -0
  4. package/examples/bell-ring-icon.exode +1 -0
  5. package/examples/drift-kinetic-type.exode +770 -0
  6. package/examples/earbuds-product.exode +214 -0
  7. package/examples/energy-flow.exode +1736 -0
  8. package/examples/flux-hero.exode +223 -0
  9. package/examples/gooey-toggle.exode +214 -0
  10. package/examples/gravity-well.exode +3113 -0
  11. package/examples/heart-icon.exode +1 -0
  12. package/examples/hologram-temple.exode +8100 -0
  13. package/examples/jarful-app.exode +1 -0
  14. package/examples/kip-character-rig.exode +1 -0
  15. package/examples/low-tide-tilt.exode +2216 -0
  16. package/examples/manifest.json +352 -0
  17. package/examples/swipe-stack-carousel.exode +4048 -0
  18. package/examples/tokyo-neon-weather.exode +470 -0
  19. package/examples/typographic-collapse.exode +1578 -0
  20. package/examples/void-product-ad.exode +1269 -0
  21. package/examples/wire-globe-card.exode +580 -0
  22. package/index.d.ts +41 -1
  23. package/index.js +2554 -2408
  24. package/package.json +6 -2
  25. package/render-runtime/exode-runtime.js +20 -20
  26. package/skills/creative-motion/SKILL.md +10 -0
  27. package/skills/creative-motion/recipes/character-rig.js +104 -0
  28. package/skills/creative-motion/recipes/dashboard.js +120 -0
  29. package/skills/creative-motion/recipes/game-arcade.js +203 -0
  30. package/skills/creative-motion/recipes/hero-physics.js +65 -0
  31. package/skills/creative-motion/recipes/pricing.js +88 -0
  32. package/skills/creative-motion/recipes/title-sequence.js +62 -0
  33. package/skills/creative-motion/references/apps.md +37 -0
  34. package/skills/creative-motion/references/gotchas.md +80 -0
  35. package/skills/creative-motion/references/native-layers.md +60 -0
  36. package/skills/creative-motion/references/quality.md +54 -0
  37. package/src/__tests__/buildKit.test.ts +127 -0
  38. package/src/__tests__/effectKnobs.test.ts +162 -0
  39. package/src/__tests__/nativeLayers.test.ts +178 -0
  40. package/src/buildKit.d.ts +301 -0
  41. package/src/buildKit.d.ts.map +1 -0
  42. package/src/buildKit.js +559 -0
  43. package/src/buildKit.js.map +1 -0
  44. package/src/buildKit.ts +520 -0
  45. package/src/compiler.d.ts +4 -0
  46. package/src/compiler.d.ts.map +1 -1
  47. package/src/compiler.js +21 -45
  48. package/src/compiler.js.map +1 -1
  49. package/src/compiler.ts +22 -51
  50. package/src/critique.d.ts +8 -0
  51. package/src/critique.d.ts.map +1 -0
  52. package/src/critique.js +348 -0
  53. package/src/critique.js.map +1 -0
  54. package/src/critique.ts +239 -0
  55. package/src/effectKnobs.d.ts +72 -0
  56. package/src/effectKnobs.d.ts.map +1 -0
  57. package/src/effectKnobs.js +541 -0
  58. package/src/effectKnobs.js.map +1 -0
  59. package/src/effectKnobs.ts +445 -0
  60. package/src/effectOptimizer.d.ts +18 -0
  61. package/src/effectOptimizer.d.ts.map +1 -0
  62. package/src/effectOptimizer.js +125 -0
  63. package/src/effectOptimizer.js.map +1 -0
  64. package/src/effectOptimizer.ts +104 -0
  65. package/src/engine/layout.js +1 -1
  66. package/src/engine/layout.js.map +1 -1
  67. package/src/engine/layout.ts +1 -1
  68. package/src/examples.d.ts +30 -0
  69. package/src/examples.d.ts.map +1 -0
  70. package/src/examples.js +168 -0
  71. package/src/examples.js.map +1 -0
  72. package/src/examples.ts +151 -0
  73. package/src/handlers/artboardHandlers.d.ts.map +1 -1
  74. package/src/handlers/artboardHandlers.js +45 -10
  75. package/src/handlers/artboardHandlers.js.map +1 -1
  76. package/src/handlers/artboardHandlers.ts +43 -12
  77. package/src/handlers/buildHandlers.d.ts +2 -0
  78. package/src/handlers/buildHandlers.d.ts.map +1 -0
  79. package/src/handlers/buildHandlers.js +86 -0
  80. package/src/handlers/buildHandlers.js.map +1 -0
  81. package/src/handlers/buildHandlers.ts +76 -0
  82. package/src/handlers/compilerHandlers.d.ts.map +1 -1
  83. package/src/handlers/compilerHandlers.js +32 -2
  84. package/src/handlers/compilerHandlers.js.map +1 -1
  85. package/src/handlers/compilerHandlers.ts +31 -2
  86. package/src/handlers/exampleHandlers.d.ts +2 -0
  87. package/src/handlers/exampleHandlers.d.ts.map +1 -0
  88. package/src/handlers/exampleHandlers.js +81 -0
  89. package/src/handlers/exampleHandlers.js.map +1 -0
  90. package/src/handlers/exampleHandlers.ts +76 -0
  91. package/src/handlers/renderHandlers.d.ts.map +1 -1
  92. package/src/handlers/renderHandlers.js +100 -2
  93. package/src/handlers/renderHandlers.js.map +1 -1
  94. package/src/handlers/renderHandlers.ts +90 -2
  95. package/src/handlers/scaffoldHandlers.d.ts.map +1 -1
  96. package/src/handlers/scaffoldHandlers.js +3 -0
  97. package/src/handlers/scaffoldHandlers.js.map +1 -1
  98. package/src/handlers/scaffoldHandlers.ts +2 -0
  99. package/src/handlers/widgetHandlers.js +1 -1
  100. package/src/handlers/widgetHandlers.js.map +1 -1
  101. package/src/handlers/widgetHandlers.ts +1 -1
  102. package/src/lottie/convert.d.ts +16 -0
  103. package/src/lottie/convert.d.ts.map +1 -0
  104. package/src/lottie/convert.js +1225 -0
  105. package/src/lottie/convert.js.map +1 -0
  106. package/src/lottie/convert.ts +1134 -0
  107. package/src/lottie/evaluate.d.ts +48 -0
  108. package/src/lottie/evaluate.d.ts.map +1 -0
  109. package/src/lottie/evaluate.js +174 -0
  110. package/src/lottie/evaluate.js.map +1 -0
  111. package/src/lottie/evaluate.ts +184 -0
  112. package/src/nativeLayers.d.ts +76 -0
  113. package/src/nativeLayers.d.ts.map +1 -0
  114. package/src/nativeLayers.js +404 -0
  115. package/src/nativeLayers.js.map +1 -0
  116. package/src/nativeLayers.ts +339 -0
  117. package/src/render/motionBrief.d.ts.map +1 -1
  118. package/src/render/motionBrief.js +4 -0
  119. package/src/render/motionBrief.js.map +1 -1
  120. package/src/render/motionBrief.ts +4 -0
  121. package/src/render/videoRenderer.d.ts.map +1 -1
  122. package/src/render/videoRenderer.js +5 -2
  123. package/src/render/videoRenderer.js.map +1 -1
  124. package/src/render/videoRenderer.ts +5 -2
  125. package/src/rive/convert.d.ts +17 -0
  126. package/src/rive/convert.d.ts.map +1 -0
  127. package/src/rive/convert.js +1779 -0
  128. package/src/rive/convert.js.map +1 -0
  129. package/src/rive/convert.ts +1492 -0
  130. package/src/rive/font.d.ts +13 -0
  131. package/src/rive/font.d.ts.map +1 -0
  132. package/src/rive/font.js +154 -0
  133. package/src/rive/font.js.map +1 -0
  134. package/src/rive/font.ts +132 -0
  135. package/src/rive/layout.d.ts +20 -0
  136. package/src/rive/layout.d.ts.map +1 -0
  137. package/src/rive/layout.js +145 -0
  138. package/src/rive/layout.js.map +1 -0
  139. package/src/rive/layout.ts +140 -0
  140. package/src/rive/reader.d.ts +32 -0
  141. package/src/rive/reader.d.ts.map +1 -0
  142. package/src/rive/reader.js +172 -0
  143. package/src/rive/reader.js.map +1 -0
  144. package/src/rive/reader.ts +160 -0
  145. package/src/rive/schema.generated.d.ts +9 -0
  146. package/src/rive/schema.generated.d.ts.map +1 -0
  147. package/src/rive/schema.generated.js +13 -0
  148. package/src/rive/schema.generated.js.map +1 -0
  149. package/src/rive/schema.generated.ts +13 -0
  150. package/src/schema.d.ts +5 -0
  151. package/src/schema.d.ts.map +1 -1
  152. package/src/schema.js +5 -0
  153. package/src/schema.js.map +1 -1
  154. package/src/schema.ts +6 -0
  155. package/src/serverInstructions.d.ts +2 -0
  156. package/src/serverInstructions.d.ts.map +1 -0
  157. package/src/serverInstructions.js +22 -0
  158. package/src/serverInstructions.js.map +1 -0
  159. package/src/serverInstructions.ts +21 -0
  160. package/src/sseServer.d.ts +2 -0
  161. package/src/sseServer.d.ts.map +1 -0
  162. package/src/sseServer.js +165 -0
  163. package/src/sseServer.js.map +1 -0
  164. package/src/sseServer.ts +189 -0
  165. package/src/utils.d.ts.map +1 -1
  166. package/src/utils.js +23 -1
  167. package/src/utils.js.map +1 -1
  168. package/src/utils.ts +13 -1
  169. package/src/widgets.d.ts +26 -0
  170. package/src/widgets.d.ts.map +1 -1
  171. package/src/widgets.js +89 -45
  172. package/src/widgets.js.map +1 -1
  173. package/src/widgets.ts +88 -45
@@ -0,0 +1,770 @@
1
+ {
2
+ "id": "drift",
3
+ "name": "Drift",
4
+ "width": 1920,
5
+ "height": 1080,
6
+ "x": 0,
7
+ "y": 0,
8
+ "backgroundColor": "#ece3d2",
9
+ "objects": [
10
+ {
11
+ "id": "stage",
12
+ "name": "Stage",
13
+ "type": "Shape",
14
+ "transform": {
15
+ "x": 960,
16
+ "y": 540,
17
+ "rotation": 0,
18
+ "scale_x": 1,
19
+ "scale_y": 1,
20
+ "opacity": 1,
21
+ "skew_x": 0,
22
+ "skew_y": 0
23
+ },
24
+ "width": 1920,
25
+ "height": 1080,
26
+ "geometry": {
27
+ "type": "Rectangle",
28
+ "width": 1920,
29
+ "height": 1080,
30
+ "cornerRadius": 0
31
+ },
32
+ "style": {
33
+ "fill": {
34
+ "type": "Solid",
35
+ "color": "#000000",
36
+ "opacity": 1
37
+ },
38
+ "effects": [
39
+ {
40
+ "id": "fx_drift",
41
+ "type": "CustomEffect",
42
+ "name": "Gouache Wind",
43
+ "isEnabled": true,
44
+ "params": {},
45
+ "code": "/* Shared helpers, prepended to every creative-motion effect.\n Effect rules: block comments only, explicit semicolons, never a minus\n followed by a negative value, motion driven by env.time only. */\n\nfunction inp(env, name, fallback) {\n const v = env.inputs ? env.inputs[name] : undefined;\n return v === undefined || v === null || v === '' ? fallback : v;\n}\nfunction clamp(v, a, b) { return v < a ? a : v > b ? b : v; }\nfunction lerp(a, b, k) { return a + (b - a) * k; }\nfunction seg(t, start, dur) { return clamp((t - start) / dur, 0, 1); }\nfunction easeOutExpo(x) { return x >= 1 ? 1 : 1 - Math.pow(2, -10 * x); }\nfunction easeInOutCubic(x) { return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(2 - 2 * x, 3) / 2; }\nfunction easeOutCubic(x) { return 1 - Math.pow(1 - x, 3); }\nfunction easeInOutSine(x) { return 0.5 - Math.cos(Math.PI * x) / 2; }\nfunction hash2(x, y) {\n let h = Math.imul(x | 0, 374761393) + Math.imul(y | 0, 668265263);\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n return ((h ^ (h >>> 16)) >>> 0) / 4294967296;\n}\nfunction rng(seed) {\n let s = seed >>> 0;\n return function () {\n s = (s + 0x6D2B79F5) >>> 0;\n let x = s;\n x = Math.imul(x ^ (x >>> 15), x | 1);\n x ^= x + Math.imul(x ^ (x >>> 7), x | 61);\n return ((x ^ (x >>> 14)) >>> 0) / 4294967296;\n };\n}\nfunction vnoise(x, y) {\n const xi = Math.floor(x), yi = Math.floor(y), xf = x - xi, yf = y - yi;\n const u = xf * xf * (3 - 2 * xf), v = yf * yf * (3 - 2 * yf);\n const a = hash2(xi, yi), b = hash2(xi + 1, yi), c = hash2(xi, yi + 1), d = hash2(xi + 1, yi + 1);\n return a + (b - a) * u + (c - a) * v + (a - b - c + d) * u * v;\n}\nfunction fbm(x, y) {\n let s = 0, a = 0.5;\n for (let i = 0; i < 5; i++) { s += a * vnoise(x, y); x = x * 2.03 + 17.1; y = y * 2.03 + 9.7; a *= 0.5; }\n return s;\n}\nfunction hexRgb(h) { const n = parseInt(h.slice(1), 16); return [n >> 16 & 255, n >> 8 & 255, n & 255]; }\nfunction rgba(h, a) { const c = hexRgb(h); return 'rgba(' + c[0] + ',' + c[1] + ',' + c[2] + ',' + a + ')'; }\n/* A canvas reused between frames (offscreen layers, cached textures). */\nfunction layer(S, key, w, h) {\n let c = S[key];\n if (!c || c.width !== w || c.height !== h) {\n c = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(w, h) : document.createElement('canvas');\n c.width = w; c.height = h; S[key] = c;\n }\n return c;\n}\n\n/* Gouache Wind: the background of \"Drift\". Broad marker strokes on paper,\n all leaning with a gust you never see. The headline (keyframed Text\n objects in front) leans with the same gust envelope, so the force is\n inferred from two things agreeing. Gust timing matches the keyframes:\n calm, build from 2.0 s, peak at 2.9 s, release by 4.4 s; 6 s cycle.\n Inputs: paper, inkA, inkB, inkC. */\nlet S = null;\n\nconst PERIOD = 6;\n\nfunction gust(t) {\n const u = ((t % PERIOD) + PERIOD) % PERIOD;\n if (u < 2.0) return 0;\n if (u < 2.9) return easeInOutSine((u - 2.0) / 0.9);\n if (u < 4.4) return 1 - easeInOutSine((u - 2.9) / 1.5);\n return 0;\n}\n\nfunction strokesFor(S, W, H) {\n if (S.strokes && S.for === W + 'x' + H) return S.strokes;\n S.for = W + 'x' + H;\n const r = rng(42);\n const list = [];\n for (let i = 0; i < 34; i++) {\n list.push({\n x: r() * W * 1.2 - W * 0.1, y: r() * H, len: (0.18 + r() * 0.32) * W, w: (0.02 + r() * 0.05) * H,\n ink: r() < 0.6 ? 0 : r() < 0.3 ? 1 : 2, a: 0.1 + r() * 0.2, ph: r() * 6.283, depth: 0.35 + r() * 0.65,\n tint: (r() - 0.5) * 22,\n });\n }\n S.strokes = list;\n return list;\n}\n\nfunction paperTexture(S, W, H, paper) {\n const c = layer(S, 'paper', Math.ceil(W / 3), Math.ceil(H / 3));\n if (S.paperFor === paper + W) return c;\n S.paperFor = paper + W;\n const g = c.getContext('2d');\n g.fillStyle = paper; g.fillRect(0, 0, c.width, c.height);\n const r = rng(9);\n for (let i = 0; i < c.width * c.height / 6; i++) {\n g.fillStyle = r() < 0.5 ? 'rgba(80,60,30,0.035)' : 'rgba(255,255,255,0.05)';\n g.fillRect(r() * c.width, r() * c.height, 1 + r() * 2, 1);\n }\n return c;\n}\n\nfunction render(ctx, env) {\n const W = env.width, H = env.height;\n if (!S) S = {};\n const t = env.time;\n const paper = inp(env, 'paper', '#ece3d2');\n const inks = [inp(env, 'inkA', '#e3a23b'), inp(env, 'inkB', '#c8553d'), inp(env, 'inkC', '#8fa8b8')];\n const g = gust(t);\n /* Wind lean: strokes tilt up to 9 degrees and slide right with depth. */\n const lean = -0.03 - g * 0.13;\n\n ctx.save();\n ctx.translate(-W / 2, -H / 2);\n ctx.drawImage(paperTexture(S, W, H, paper), 0, 0, W, H);\n ctx.lineCap = 'round';\n\n const list = strokesFor(S, W, H);\n for (let i = 0; i < list.length; i++) {\n const s = list[i];\n /* Legato drift on a 6 s period (integer multiples only, so it loops). */\n const drift = Math.sin((t / PERIOD) * 6.283 + s.ph) * W * 0.012 * s.depth + g * W * 0.05 * s.depth;\n const sway = Math.sin((t / PERIOD) * 12.566 + s.ph * 2) * 0.012;\n const ang = lean * (0.6 + s.depth * 0.6) + sway;\n const base = hexRgb(inks[s.ink]);\n /* Keep the headline's block quiet: strokes behind it are thinned out. */\n const behindText = s.x < W * 0.62 && s.y > H * 0.18 && s.y < H * 0.78;\n const quiet = behindText ? 0.35 : 1;\n ctx.save();\n ctx.translate(s.x + drift, s.y);\n ctx.rotate(ang);\n /* A gouache stroke: overlapping passes, each a slightly different tint. */\n for (let p = 0; p < 4; p++) {\n const v = s.tint + (hash2(i * 9 + p, 3) - 0.5) * 18;\n ctx.strokeStyle = 'rgba(' + Math.round(clamp(base[0] + v, 0, 255)) + ',' + Math.round(clamp(base[1] + v, 0, 255)) + ',' + Math.round(clamp(base[2] + v, 0, 255)) + ',' + (s.a * quiet * (0.55 + p * 0.15)).toFixed(3) + ')';\n ctx.lineWidth = s.w * (0.7 + hash2(i, p) * 0.5);\n const off = (p - 1.5) * s.w * 0.22;\n ctx.beginPath();\n ctx.moveTo(0, off);\n ctx.bezierCurveTo(s.len * 0.33, off - s.w * 0.25, s.len * 0.66, off + s.w * 0.25, s.len * (0.92 + hash2(i, p + 7) * 0.08), off);\n ctx.stroke();\n }\n ctx.restore();\n }\n\n /* Flying flecks only during the gust: the clearest evidence of the wind. */\n if (g > 0.02) {\n const r = rng(77);\n ctx.fillStyle = rgba(inks[1], 0.5 * g);\n for (let i = 0; i < 70; i++) {\n const sp = 0.6 + r() * 1.4;\n const x = ((r() * W + ((t % PERIOD) - 2.0) * W * 0.55 * sp) % (W * 1.1)) - W * 0.05;\n const y = r() * H + Math.sin(t * 3 + i) * 6;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(lean * 2);\n ctx.fillRect(0, 0, 6 + sp * 10, 2.2);\n ctx.restore();\n }\n }\n ctx.restore();\n}\n"
46
+ }
47
+ ]
48
+ },
49
+ "zIndex": 0
50
+ },
51
+ {
52
+ "id": "headline",
53
+ "name": "Headline",
54
+ "type": "Frame",
55
+ "transform": {
56
+ "x": 960,
57
+ "y": 530,
58
+ "rotation": 0,
59
+ "scale_x": 1,
60
+ "scale_y": 1,
61
+ "opacity": 1,
62
+ "skew_x": 0,
63
+ "skew_y": 0
64
+ },
65
+ "width": 1920,
66
+ "height": 1080,
67
+ "geometry": {
68
+ "type": "Rectangle",
69
+ "width": 1920,
70
+ "height": 1080,
71
+ "cornerRadius": 0
72
+ },
73
+ "clipContent": false,
74
+ "style": {
75
+ "fill": {
76
+ "type": "None",
77
+ "color": "transparent",
78
+ "opacity": 0
79
+ }
80
+ },
81
+ "children": [
82
+ "line_0",
83
+ "line_1",
84
+ "line_2"
85
+ ],
86
+ "zIndex": 10
87
+ },
88
+ {
89
+ "id": "line_0",
90
+ "name": "Line 1",
91
+ "type": "Frame",
92
+ "parentId": "headline",
93
+ "transform": {
94
+ "x": -40,
95
+ "y": -205,
96
+ "rotation": 0,
97
+ "scale_x": 1,
98
+ "scale_y": 1,
99
+ "opacity": 1,
100
+ "skew_x": 0,
101
+ "skew_y": 0
102
+ },
103
+ "width": 1500,
104
+ "height": 220,
105
+ "geometry": {
106
+ "type": "Rectangle",
107
+ "width": 1500,
108
+ "height": 220,
109
+ "cornerRadius": 0
110
+ },
111
+ "clipContent": true,
112
+ "style": {
113
+ "fill": {
114
+ "type": "None",
115
+ "color": "transparent",
116
+ "opacity": 0
117
+ }
118
+ },
119
+ "children": [
120
+ "text_0"
121
+ ],
122
+ "zIndex": 11
123
+ },
124
+ {
125
+ "id": "text_0",
126
+ "name": "Something",
127
+ "type": "Shape",
128
+ "parentId": "line_0",
129
+ "transform": {
130
+ "x": 0,
131
+ "y": 0,
132
+ "rotation": 0,
133
+ "scale_x": 1,
134
+ "scale_y": 1,
135
+ "opacity": 1,
136
+ "skew_x": 0,
137
+ "skew_y": 0
138
+ },
139
+ "geometry": {
140
+ "type": "Text",
141
+ "text": "Something",
142
+ "fontSize": 168,
143
+ "fontFamily": "Georgia",
144
+ "fontWeight": 700,
145
+ "fontStyle": "italic",
146
+ "textAlign": "left",
147
+ "width": 1500
148
+ },
149
+ "style": {
150
+ "fill": {
151
+ "type": "Solid",
152
+ "color": "#1b2a4a",
153
+ "opacity": 1
154
+ },
155
+ "stroke": {
156
+ "color": "transparent",
157
+ "width": 0
158
+ }
159
+ },
160
+ "zIndex": 20
161
+ },
162
+ {
163
+ "id": "line_1",
164
+ "name": "Line 2",
165
+ "type": "Frame",
166
+ "parentId": "headline",
167
+ "transform": {
168
+ "x": -40,
169
+ "y": 0,
170
+ "rotation": 0,
171
+ "scale_x": 1,
172
+ "scale_y": 1,
173
+ "opacity": 1,
174
+ "skew_x": 0,
175
+ "skew_y": 0
176
+ },
177
+ "width": 1500,
178
+ "height": 220,
179
+ "geometry": {
180
+ "type": "Rectangle",
181
+ "width": 1500,
182
+ "height": 220,
183
+ "cornerRadius": 0
184
+ },
185
+ "clipContent": true,
186
+ "style": {
187
+ "fill": {
188
+ "type": "None",
189
+ "color": "transparent",
190
+ "opacity": 0
191
+ }
192
+ },
193
+ "children": [
194
+ "text_1"
195
+ ],
196
+ "zIndex": 12
197
+ },
198
+ {
199
+ "id": "text_1",
200
+ "name": "is pushing",
201
+ "type": "Shape",
202
+ "parentId": "line_1",
203
+ "transform": {
204
+ "x": 0,
205
+ "y": 0,
206
+ "rotation": 0,
207
+ "scale_x": 1,
208
+ "scale_y": 1,
209
+ "opacity": 1,
210
+ "skew_x": 0,
211
+ "skew_y": 0
212
+ },
213
+ "geometry": {
214
+ "type": "Text",
215
+ "text": "is pushing",
216
+ "fontSize": 168,
217
+ "fontFamily": "Georgia",
218
+ "fontWeight": 700,
219
+ "fontStyle": "italic",
220
+ "textAlign": "left",
221
+ "width": 1500
222
+ },
223
+ "style": {
224
+ "fill": {
225
+ "type": "Solid",
226
+ "color": "#1b2a4a",
227
+ "opacity": 1
228
+ },
229
+ "stroke": {
230
+ "color": "transparent",
231
+ "width": 0
232
+ }
233
+ },
234
+ "zIndex": 21
235
+ },
236
+ {
237
+ "id": "line_2",
238
+ "name": "Line 3",
239
+ "type": "Frame",
240
+ "parentId": "headline",
241
+ "transform": {
242
+ "x": -40,
243
+ "y": 205,
244
+ "rotation": 0,
245
+ "scale_x": 1,
246
+ "scale_y": 1,
247
+ "opacity": 1,
248
+ "skew_x": 0,
249
+ "skew_y": 0
250
+ },
251
+ "width": 1500,
252
+ "height": 220,
253
+ "geometry": {
254
+ "type": "Rectangle",
255
+ "width": 1500,
256
+ "height": 220,
257
+ "cornerRadius": 0
258
+ },
259
+ "clipContent": true,
260
+ "style": {
261
+ "fill": {
262
+ "type": "None",
263
+ "color": "transparent",
264
+ "opacity": 0
265
+ }
266
+ },
267
+ "children": [
268
+ "text_2"
269
+ ],
270
+ "zIndex": 13
271
+ },
272
+ {
273
+ "id": "text_2",
274
+ "name": "everything.",
275
+ "type": "Shape",
276
+ "parentId": "line_2",
277
+ "transform": {
278
+ "x": 0,
279
+ "y": 0,
280
+ "rotation": 0,
281
+ "scale_x": 1,
282
+ "scale_y": 1,
283
+ "opacity": 1,
284
+ "skew_x": 0,
285
+ "skew_y": 0
286
+ },
287
+ "geometry": {
288
+ "type": "Text",
289
+ "text": "everything.",
290
+ "fontSize": 168,
291
+ "fontFamily": "Georgia",
292
+ "fontWeight": 700,
293
+ "fontStyle": "italic",
294
+ "textAlign": "left",
295
+ "width": 1500
296
+ },
297
+ "style": {
298
+ "fill": {
299
+ "type": "Solid",
300
+ "color": "#c8553d",
301
+ "opacity": 1
302
+ },
303
+ "stroke": {
304
+ "color": "transparent",
305
+ "width": 0
306
+ }
307
+ },
308
+ "zIndex": 22
309
+ },
310
+ {
311
+ "id": "caption",
312
+ "name": "Caption",
313
+ "type": "Shape",
314
+ "transform": {
315
+ "x": 430,
316
+ "y": 1010,
317
+ "rotation": 0,
318
+ "scale_x": 1,
319
+ "scale_y": 1,
320
+ "opacity": 1,
321
+ "skew_x": 0,
322
+ "skew_y": 0
323
+ },
324
+ "geometry": {
325
+ "type": "Text",
326
+ "text": "fig. 2 — wind, inferred",
327
+ "fontSize": 22,
328
+ "fontFamily": "Georgia",
329
+ "fontWeight": 400,
330
+ "fontStyle": "italic",
331
+ "textAlign": "left",
332
+ "width": 520
333
+ },
334
+ "style": {
335
+ "fill": {
336
+ "type": "Solid",
337
+ "color": "#1b2a4a",
338
+ "opacity": 0.75
339
+ },
340
+ "stroke": {
341
+ "color": "transparent",
342
+ "width": 0
343
+ }
344
+ },
345
+ "zIndex": 30
346
+ }
347
+ ],
348
+ "animations": [
349
+ {
350
+ "id": "drift_cycle",
351
+ "name": "Drift cycle",
352
+ "duration": 6,
353
+ "loop": true,
354
+ "tracks": [
355
+ {
356
+ "id": "tr_text_0_transform_y",
357
+ "object_id": "text_0",
358
+ "property": "transform.y",
359
+ "keyframes": [
360
+ {
361
+ "id": "kf_1",
362
+ "time": 0,
363
+ "value": 260
364
+ },
365
+ {
366
+ "id": "kf_2",
367
+ "time": 0.25,
368
+ "value": 260,
369
+ "easing": "easeOutElastic"
370
+ },
371
+ {
372
+ "id": "kf_3",
373
+ "time": 1.5,
374
+ "value": 0
375
+ },
376
+ {
377
+ "id": "kf_4",
378
+ "time": 4.75,
379
+ "value": 0,
380
+ "easing": "easeInCubic"
381
+ },
382
+ {
383
+ "id": "kf_5",
384
+ "time": 5.2,
385
+ "value": -260
386
+ },
387
+ {
388
+ "id": "kf_6",
389
+ "time": 6,
390
+ "value": -260
391
+ }
392
+ ]
393
+ },
394
+ {
395
+ "id": "tr_line_0_transform_rotation",
396
+ "object_id": "line_0",
397
+ "property": "transform.rotation",
398
+ "keyframes": [
399
+ {
400
+ "id": "kf_7",
401
+ "time": 0,
402
+ "value": 0
403
+ },
404
+ {
405
+ "id": "kf_8",
406
+ "time": 2,
407
+ "value": 0,
408
+ "easing": "easeInOutSine"
409
+ },
410
+ {
411
+ "id": "kf_9",
412
+ "time": 2.9,
413
+ "value": 4.2,
414
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
415
+ },
416
+ {
417
+ "id": "kf_10",
418
+ "time": 4.3,
419
+ "value": 0
420
+ },
421
+ {
422
+ "id": "kf_11",
423
+ "time": 6,
424
+ "value": 0
425
+ }
426
+ ]
427
+ },
428
+ {
429
+ "id": "tr_line_0_transform_x",
430
+ "object_id": "line_0",
431
+ "property": "transform.x",
432
+ "keyframes": [
433
+ {
434
+ "id": "kf_12",
435
+ "time": 0,
436
+ "value": -40
437
+ },
438
+ {
439
+ "id": "kf_13",
440
+ "time": 2,
441
+ "value": -40,
442
+ "easing": "easeInOutSine"
443
+ },
444
+ {
445
+ "id": "kf_14",
446
+ "time": 2.9,
447
+ "value": 8,
448
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
449
+ },
450
+ {
451
+ "id": "kf_15",
452
+ "time": 4.3,
453
+ "value": -40
454
+ },
455
+ {
456
+ "id": "kf_16",
457
+ "time": 6,
458
+ "value": -40
459
+ }
460
+ ]
461
+ },
462
+ {
463
+ "id": "tr_text_1_transform_y",
464
+ "object_id": "text_1",
465
+ "property": "transform.y",
466
+ "keyframes": [
467
+ {
468
+ "id": "kf_17",
469
+ "time": 0,
470
+ "value": 260
471
+ },
472
+ {
473
+ "id": "kf_18",
474
+ "time": 0.47,
475
+ "value": 260,
476
+ "easing": "easeOutElastic"
477
+ },
478
+ {
479
+ "id": "kf_19",
480
+ "time": 1.72,
481
+ "value": 0
482
+ },
483
+ {
484
+ "id": "kf_20",
485
+ "time": 4.85,
486
+ "value": 0,
487
+ "easing": "easeInCubic"
488
+ },
489
+ {
490
+ "id": "kf_21",
491
+ "time": 5.3,
492
+ "value": -260
493
+ },
494
+ {
495
+ "id": "kf_22",
496
+ "time": 6,
497
+ "value": -260
498
+ }
499
+ ]
500
+ },
501
+ {
502
+ "id": "tr_line_1_transform_rotation",
503
+ "object_id": "line_1",
504
+ "property": "transform.rotation",
505
+ "keyframes": [
506
+ {
507
+ "id": "kf_23",
508
+ "time": 0,
509
+ "value": 0
510
+ },
511
+ {
512
+ "id": "kf_24",
513
+ "time": 2.12,
514
+ "value": 0,
515
+ "easing": "easeInOutSine"
516
+ },
517
+ {
518
+ "id": "kf_25",
519
+ "time": 3.02,
520
+ "value": 4.2,
521
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
522
+ },
523
+ {
524
+ "id": "kf_26",
525
+ "time": 4.42,
526
+ "value": 0
527
+ },
528
+ {
529
+ "id": "kf_27",
530
+ "time": 6,
531
+ "value": 0
532
+ }
533
+ ]
534
+ },
535
+ {
536
+ "id": "tr_line_1_transform_x",
537
+ "object_id": "line_1",
538
+ "property": "transform.x",
539
+ "keyframes": [
540
+ {
541
+ "id": "kf_28",
542
+ "time": 0,
543
+ "value": -40
544
+ },
545
+ {
546
+ "id": "kf_29",
547
+ "time": 2.12,
548
+ "value": -40,
549
+ "easing": "easeInOutSine"
550
+ },
551
+ {
552
+ "id": "kf_30",
553
+ "time": 3.02,
554
+ "value": 8,
555
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
556
+ },
557
+ {
558
+ "id": "kf_31",
559
+ "time": 4.42,
560
+ "value": -40
561
+ },
562
+ {
563
+ "id": "kf_32",
564
+ "time": 6,
565
+ "value": -40
566
+ }
567
+ ]
568
+ },
569
+ {
570
+ "id": "tr_text_2_transform_y",
571
+ "object_id": "text_2",
572
+ "property": "transform.y",
573
+ "keyframes": [
574
+ {
575
+ "id": "kf_33",
576
+ "time": 0,
577
+ "value": 260
578
+ },
579
+ {
580
+ "id": "kf_34",
581
+ "time": 0.69,
582
+ "value": 260,
583
+ "easing": "easeOutElastic"
584
+ },
585
+ {
586
+ "id": "kf_35",
587
+ "time": 1.94,
588
+ "value": 0
589
+ },
590
+ {
591
+ "id": "kf_36",
592
+ "time": 4.95,
593
+ "value": 0,
594
+ "easing": "easeInCubic"
595
+ },
596
+ {
597
+ "id": "kf_37",
598
+ "time": 5.4,
599
+ "value": -260
600
+ },
601
+ {
602
+ "id": "kf_38",
603
+ "time": 6,
604
+ "value": -260
605
+ }
606
+ ]
607
+ },
608
+ {
609
+ "id": "tr_line_2_transform_rotation",
610
+ "object_id": "line_2",
611
+ "property": "transform.rotation",
612
+ "keyframes": [
613
+ {
614
+ "id": "kf_39",
615
+ "time": 0,
616
+ "value": 0
617
+ },
618
+ {
619
+ "id": "kf_40",
620
+ "time": 2.24,
621
+ "value": 0,
622
+ "easing": "easeInOutSine"
623
+ },
624
+ {
625
+ "id": "kf_41",
626
+ "time": 3.1399999999999997,
627
+ "value": 4.2,
628
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
629
+ },
630
+ {
631
+ "id": "kf_42",
632
+ "time": 4.54,
633
+ "value": 0
634
+ },
635
+ {
636
+ "id": "kf_43",
637
+ "time": 6,
638
+ "value": 0
639
+ }
640
+ ]
641
+ },
642
+ {
643
+ "id": "tr_line_2_transform_x",
644
+ "object_id": "line_2",
645
+ "property": "transform.x",
646
+ "keyframes": [
647
+ {
648
+ "id": "kf_44",
649
+ "time": 0,
650
+ "value": -40
651
+ },
652
+ {
653
+ "id": "kf_45",
654
+ "time": 2.24,
655
+ "value": -40,
656
+ "easing": "easeInOutSine"
657
+ },
658
+ {
659
+ "id": "kf_46",
660
+ "time": 3.1399999999999997,
661
+ "value": 8,
662
+ "easing": "cubic-bezier(0.34,1.56,0.64,1)"
663
+ },
664
+ {
665
+ "id": "kf_47",
666
+ "time": 4.54,
667
+ "value": -40
668
+ },
669
+ {
670
+ "id": "kf_48",
671
+ "time": 6,
672
+ "value": -40
673
+ }
674
+ ]
675
+ },
676
+ {
677
+ "id": "tr_headline_transform_scale_x",
678
+ "object_id": "headline",
679
+ "property": "transform.scale_x",
680
+ "keyframes": [
681
+ {
682
+ "id": "kf_49",
683
+ "time": 0,
684
+ "value": 1,
685
+ "easing": "easeInOutSine"
686
+ },
687
+ {
688
+ "id": "kf_50",
689
+ "time": 6,
690
+ "value": 1.06
691
+ }
692
+ ]
693
+ },
694
+ {
695
+ "id": "tr_headline_transform_scale_y",
696
+ "object_id": "headline",
697
+ "property": "transform.scale_y",
698
+ "keyframes": [
699
+ {
700
+ "id": "kf_51",
701
+ "time": 0,
702
+ "value": 1,
703
+ "easing": "easeInOutSine"
704
+ },
705
+ {
706
+ "id": "kf_52",
707
+ "time": 6,
708
+ "value": 1.06
709
+ }
710
+ ]
711
+ }
712
+ ]
713
+ }
714
+ ],
715
+ "stateMachine": {
716
+ "inputs": [
717
+ {
718
+ "id": "paper",
719
+ "name": "paper",
720
+ "value": {
721
+ "type": "Text",
722
+ "value": "#ece3d2",
723
+ "defaultValue": "#ece3d2"
724
+ }
725
+ },
726
+ {
727
+ "id": "inkA",
728
+ "name": "inkA",
729
+ "value": {
730
+ "type": "Text",
731
+ "value": "#e3a23b",
732
+ "defaultValue": "#e3a23b"
733
+ }
734
+ },
735
+ {
736
+ "id": "inkB",
737
+ "name": "inkB",
738
+ "value": {
739
+ "type": "Text",
740
+ "value": "#c8553d",
741
+ "defaultValue": "#c8553d"
742
+ }
743
+ },
744
+ {
745
+ "id": "inkC",
746
+ "name": "inkC",
747
+ "value": {
748
+ "type": "Text",
749
+ "value": "#8fa8b8",
750
+ "defaultValue": "#8fa8b8"
751
+ }
752
+ }
753
+ ],
754
+ "layers": [
755
+ {
756
+ "id": "layer_0",
757
+ "name": "Drift cycle",
758
+ "entryStateId": "state_0",
759
+ "states": [
760
+ {
761
+ "id": "state_0",
762
+ "name": "Drift cycle",
763
+ "animationId": "drift_cycle",
764
+ "transitions": []
765
+ }
766
+ ]
767
+ }
768
+ ]
769
+ }
770
+ }