frameyard 0.7.0 → 0.9.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 (334) hide show
  1. package/CHANGELOG.md +164 -7
  2. package/GLOSSARY.md +152 -18
  3. package/README.md +328 -285
  4. package/dist/assets/integrations.d.ts +8 -4
  5. package/dist/assets/integrations.d.ts.map +1 -1
  6. package/dist/assets/integrations.js +8 -4
  7. package/dist/assets/integrations.js.map +1 -1
  8. package/dist/assets/provenance.d.ts +2 -2
  9. package/dist/assets/provenance.d.ts.map +1 -1
  10. package/dist/assets/provenance.js +5 -3
  11. package/dist/assets/provenance.js.map +1 -1
  12. package/dist/assets/tts-supertonic.d.ts +28 -0
  13. package/dist/assets/tts-supertonic.d.ts.map +1 -0
  14. package/dist/assets/tts-supertonic.js +156 -0
  15. package/dist/assets/tts-supertonic.js.map +1 -0
  16. package/dist/assets/tts.d.ts +18 -6
  17. package/dist/assets/tts.d.ts.map +1 -1
  18. package/dist/assets/tts.js +219 -97
  19. package/dist/assets/tts.js.map +1 -1
  20. package/dist/cli.js +1705 -106
  21. package/dist/cli.js.map +1 -1
  22. package/dist/composition/descriptor.d.ts +17 -3
  23. package/dist/composition/descriptor.d.ts.map +1 -1
  24. package/dist/composition/descriptor.js +51 -28
  25. package/dist/composition/descriptor.js.map +1 -1
  26. package/dist/composition/format.d.ts +12 -0
  27. package/dist/composition/format.d.ts.map +1 -0
  28. package/dist/composition/format.js +28 -0
  29. package/dist/composition/format.js.map +1 -0
  30. package/dist/composition/index.d.ts +2 -1
  31. package/dist/composition/index.d.ts.map +1 -1
  32. package/dist/composition/index.js +1 -0
  33. package/dist/composition/index.js.map +1 -1
  34. package/dist/context.d.ts +82 -0
  35. package/dist/context.d.ts.map +1 -0
  36. package/dist/context.js +277 -0
  37. package/dist/context.js.map +1 -0
  38. package/dist/contracts.d.ts +80 -6
  39. package/dist/contracts.d.ts.map +1 -1
  40. package/dist/contracts.js +3 -0
  41. package/dist/contracts.js.map +1 -1
  42. package/dist/doctor.d.ts +14 -1
  43. package/dist/doctor.d.ts.map +1 -1
  44. package/dist/doctor.js +166 -7
  45. package/dist/doctor.js.map +1 -1
  46. package/dist/errors.d.ts +1 -1
  47. package/dist/errors.d.ts.map +1 -1
  48. package/dist/errors.js.map +1 -1
  49. package/dist/fonts/add.d.ts +41 -0
  50. package/dist/fonts/add.d.ts.map +1 -0
  51. package/dist/fonts/add.js +259 -0
  52. package/dist/fonts/add.js.map +1 -0
  53. package/dist/fonts/binary.d.ts +4 -0
  54. package/dist/fonts/binary.d.ts.map +1 -0
  55. package/dist/fonts/binary.js +21 -0
  56. package/dist/fonts/binary.js.map +1 -0
  57. package/dist/fonts/css.d.ts +4 -0
  58. package/dist/fonts/css.d.ts.map +1 -0
  59. package/dist/fonts/css.js +50 -0
  60. package/dist/fonts/css.js.map +1 -0
  61. package/dist/fonts/fontsource.d.ts +107 -0
  62. package/dist/fonts/fontsource.d.ts.map +1 -0
  63. package/dist/fonts/fontsource.js +565 -0
  64. package/dist/fonts/fontsource.js.map +1 -0
  65. package/dist/fonts/index.d.ts +11 -0
  66. package/dist/fonts/index.d.ts.map +1 -0
  67. package/dist/fonts/index.js +11 -0
  68. package/dist/fonts/index.js.map +1 -0
  69. package/dist/fonts/install.d.ts +24 -0
  70. package/dist/fonts/install.d.ts.map +1 -0
  71. package/dist/fonts/install.js +145 -0
  72. package/dist/fonts/install.js.map +1 -0
  73. package/dist/fonts/manifest.d.ts +21 -0
  74. package/dist/fonts/manifest.d.ts.map +1 -0
  75. package/dist/fonts/manifest.js +96 -0
  76. package/dist/fonts/manifest.js.map +1 -0
  77. package/dist/fonts/options.d.ts +9 -0
  78. package/dist/fonts/options.d.ts.map +1 -0
  79. package/dist/fonts/options.js +66 -0
  80. package/dist/fonts/options.js.map +1 -0
  81. package/dist/fonts/schema.d.ts +4 -0
  82. package/dist/fonts/schema.d.ts.map +1 -0
  83. package/dist/fonts/schema.js +316 -0
  84. package/dist/fonts/schema.js.map +1 -0
  85. package/dist/fonts/summary.d.ts +16 -0
  86. package/dist/fonts/summary.d.ts.map +1 -0
  87. package/dist/fonts/summary.js +22 -0
  88. package/dist/fonts/summary.js.map +1 -0
  89. package/dist/fonts/types.d.ts +56 -0
  90. package/dist/fonts/types.d.ts.map +1 -0
  91. package/dist/fonts/types.js +8 -0
  92. package/dist/fonts/types.js.map +1 -0
  93. package/dist/fonts/verify.d.ts +33 -0
  94. package/dist/fonts/verify.d.ts.map +1 -0
  95. package/dist/fonts/verify.js +200 -0
  96. package/dist/fonts/verify.js.map +1 -0
  97. package/dist/html/document-adapter.d.ts +3 -3
  98. package/dist/html/document-adapter.d.ts.map +1 -1
  99. package/dist/html/document-adapter.js +1 -1
  100. package/dist/html/document-adapter.js.map +1 -1
  101. package/dist/html/index.d.ts +1 -1
  102. package/dist/html/index.d.ts.map +1 -1
  103. package/dist/html/parse.d.ts +10 -2
  104. package/dist/html/parse.d.ts.map +1 -1
  105. package/dist/html/parse.js +14 -5
  106. package/dist/html/parse.js.map +1 -1
  107. package/dist/html/validate.d.ts +12 -1
  108. package/dist/html/validate.d.ts.map +1 -1
  109. package/dist/html/validate.js +292 -61
  110. package/dist/html/validate.js.map +1 -1
  111. package/dist/index.d.ts +4 -4
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +2 -2
  114. package/dist/index.js.map +1 -1
  115. package/dist/inspect.d.ts +61 -0
  116. package/dist/inspect.d.ts.map +1 -0
  117. package/dist/inspect.js +325 -0
  118. package/dist/inspect.js.map +1 -0
  119. package/dist/lint.d.ts +63 -0
  120. package/dist/lint.d.ts.map +1 -0
  121. package/dist/lint.js +265 -0
  122. package/dist/lint.js.map +1 -0
  123. package/dist/policy.d.ts +69 -0
  124. package/dist/policy.d.ts.map +1 -0
  125. package/dist/policy.js +361 -0
  126. package/dist/policy.js.map +1 -0
  127. package/dist/preview/main.d.ts +2 -2
  128. package/dist/preview/main.d.ts.map +1 -1
  129. package/dist/preview/main.js +35 -14
  130. package/dist/preview/main.js.map +1 -1
  131. package/dist/preview/timeline-data.d.ts +17 -65
  132. package/dist/preview/timeline-data.d.ts.map +1 -1
  133. package/dist/preview/timeline-host.d.ts.map +1 -1
  134. package/dist/preview/timeline-host.js +73 -38
  135. package/dist/preview/timeline-host.js.map +1 -1
  136. package/dist/preview/timeline-main.d.ts.map +1 -1
  137. package/dist/preview/timeline-main.js +47 -3
  138. package/dist/preview/timeline-main.js.map +1 -1
  139. package/dist/project.d.ts +13 -8
  140. package/dist/project.d.ts.map +1 -1
  141. package/dist/project.js +20 -17
  142. package/dist/project.js.map +1 -1
  143. package/dist/renderer/browser.d.ts +2 -2
  144. package/dist/renderer/browser.d.ts.map +1 -1
  145. package/dist/renderer/browser.js +10 -4
  146. package/dist/renderer/browser.js.map +1 -1
  147. package/dist/renderer/ffmpeg.d.ts +44 -1
  148. package/dist/renderer/ffmpeg.d.ts.map +1 -1
  149. package/dist/renderer/ffmpeg.js +371 -73
  150. package/dist/renderer/ffmpeg.js.map +1 -1
  151. package/dist/renderer/index.d.ts +40 -4
  152. package/dist/renderer/index.d.ts.map +1 -1
  153. package/dist/renderer/index.js +100 -25
  154. package/dist/renderer/index.js.map +1 -1
  155. package/dist/renderer/keyframe-expressions.d.ts +39 -0
  156. package/dist/renderer/keyframe-expressions.d.ts.map +1 -0
  157. package/dist/renderer/keyframe-expressions.js +180 -0
  158. package/dist/renderer/keyframe-expressions.js.map +1 -0
  159. package/dist/renderer/timeline.d.ts +2 -0
  160. package/dist/renderer/timeline.d.ts.map +1 -1
  161. package/dist/renderer/timeline.js +168 -106
  162. package/dist/renderer/timeline.js.map +1 -1
  163. package/dist/runtime/host.d.ts.map +1 -1
  164. package/dist/runtime/host.js +159 -31
  165. package/dist/runtime/host.js.map +1 -1
  166. package/dist/scaffold.d.ts +3 -0
  167. package/dist/scaffold.d.ts.map +1 -1
  168. package/dist/scaffold.js +48 -317
  169. package/dist/scaffold.js.map +1 -1
  170. package/dist/server/composition-html.d.ts +15 -7
  171. package/dist/server/composition-html.d.ts.map +1 -1
  172. package/dist/server/composition-html.js +72 -16
  173. package/dist/server/composition-html.js.map +1 -1
  174. package/dist/server/server.d.ts.map +1 -1
  175. package/dist/server/server.js +56 -6
  176. package/dist/server/server.js.map +1 -1
  177. package/dist/server/timeline-preview-data.d.ts.map +1 -1
  178. package/dist/server/timeline-preview-data.js +12 -23
  179. package/dist/server/timeline-preview-data.js.map +1 -1
  180. package/dist/server/timeline-preview-html.d.ts.map +1 -1
  181. package/dist/server/timeline-preview-html.js +20 -3
  182. package/dist/server/timeline-preview-html.js.map +1 -1
  183. package/dist/templates.d.ts +16 -0
  184. package/dist/templates.d.ts.map +1 -0
  185. package/dist/templates.js +186 -0
  186. package/dist/templates.js.map +1 -0
  187. package/dist/timeline/easing.d.ts +36 -0
  188. package/dist/timeline/easing.d.ts.map +1 -0
  189. package/dist/timeline/easing.js +225 -0
  190. package/dist/timeline/easing.js.map +1 -0
  191. package/dist/timeline/keyframes.d.ts +23 -0
  192. package/dist/timeline/keyframes.d.ts.map +1 -0
  193. package/dist/timeline/keyframes.js +95 -0
  194. package/dist/timeline/keyframes.js.map +1 -0
  195. package/dist/timeline/plan.d.ts +6 -12
  196. package/dist/timeline/plan.d.ts.map +1 -1
  197. package/dist/timeline/plan.js +17 -30
  198. package/dist/timeline/plan.js.map +1 -1
  199. package/dist/timeline/resolve.d.ts +16 -3
  200. package/dist/timeline/resolve.d.ts.map +1 -1
  201. package/dist/timeline/resolve.js +119 -13
  202. package/dist/timeline/resolve.js.map +1 -1
  203. package/dist/timeline/scene.d.ts +126 -0
  204. package/dist/timeline/scene.d.ts.map +1 -0
  205. package/dist/timeline/scene.js +109 -0
  206. package/dist/timeline/scene.js.map +1 -0
  207. package/dist/timeline/schema.d.ts +38 -0
  208. package/dist/timeline/schema.d.ts.map +1 -1
  209. package/dist/timeline/schema.js +290 -9
  210. package/dist/timeline/schema.js.map +1 -1
  211. package/dist/timeline/transitions.d.ts +21 -0
  212. package/dist/timeline/transitions.d.ts.map +1 -0
  213. package/dist/timeline/transitions.js +23 -0
  214. package/dist/timeline/transitions.js.map +1 -0
  215. package/dist/version.d.ts +1 -1
  216. package/dist/version.js +1 -1
  217. package/docs/adr/0007-make-html-documents-the-composition-unit.md +2 -2
  218. package/docs/adr/0008-share-the-composition-document-grammar.md +1 -1
  219. package/docs/adr/0010-make-timelines-the-render-unit.md +3 -2
  220. package/docs/adr/0011-compose-timeline-frames-in-a-live-browser-host.md +1 -1
  221. package/docs/adr/0012-render-timelines-with-segmented-lossless-clip-intermediates.md +1 -1
  222. package/docs/adr/0014-compose-timeline-clips-with-css-blend-modes.md +38 -0
  223. package/docs/adr/0015-inherit-composition-format-from-the-project.md +28 -0
  224. package/docs/adr/0016-author-compositions-as-html-fragments.md +32 -0
  225. package/docs/adr/0017-render-timeless-compositions-as-stills.md +99 -0
  226. package/docs/adr/0018-animate-timeline-clips-with-keyframes.md +35 -0
  227. package/docs/adr/0019-make-same-track-overlap-the-transition-window.md +36 -0
  228. package/docs/adr/0020-crossfade-audio-clips-on-audio-tracks.md +27 -0
  229. package/docs/adr/0021-project-timeline-scenes-once.md +32 -0
  230. package/docs/adr/0022-gate-heavy-operations-with-a-workspace-resource-policy.md +35 -0
  231. package/docs/adr/0023-pin-fonts-as-project-assets.md +98 -0
  232. package/docs/migration-0.4.md +5 -3
  233. package/docs/migration-0.8.md +163 -0
  234. package/docs/preview-testing.md +23 -3
  235. package/docs/{v0.1-design.md → v0.x-design.md} +86 -53
  236. package/examples/blend/README.md +106 -0
  237. package/examples/blend/assets/ink.mp4 +0 -0
  238. package/examples/blend/compositions/aurora.html +55 -0
  239. package/examples/blend/compositions/backdrop.html +74 -0
  240. package/examples/blend/compositions/labels.html +149 -0
  241. package/examples/blend/fy.config.js +11 -0
  242. package/examples/blend/scripts/make-ink.sh +26 -0
  243. package/examples/blend/timelines/blend.timeline.json +155 -0
  244. package/examples/demo/README.md +2 -2
  245. package/examples/demo/compositions/demo.html +243 -251
  246. package/examples/intro/README.md +71 -0
  247. package/examples/intro/assets/fonts/figtree/LICENSE.txt +93 -0
  248. package/examples/intro/assets/fonts/figtree/figtree-latin-wght-normal.woff2 +0 -0
  249. package/examples/intro/assets/fonts/instrument-serif/LICENSE.txt +93 -0
  250. package/examples/intro/assets/fonts/instrument-serif/instrument-serif-latin-400-italic.woff2 +0 -0
  251. package/examples/intro/assets/fonts/space-mono/LICENSE.txt +93 -0
  252. package/examples/intro/assets/fonts/space-mono/space-mono-latin-400-normal.woff2 +0 -0
  253. package/examples/intro/assets/fonts/space-mono/space-mono-latin-700-normal.woff2 +0 -0
  254. package/examples/intro/assets/grain.png +0 -0
  255. package/examples/intro/assets/score.ogg +0 -0
  256. package/examples/intro/compositions/brand.html +412 -0
  257. package/examples/intro/compositions/chrome.controller.js +63 -0
  258. package/examples/intro/compositions/chrome.html +256 -0
  259. package/examples/intro/compositions/lattice.controller.js +148 -0
  260. package/examples/intro/compositions/lattice.html +308 -0
  261. package/examples/intro/compositions/opening.html +504 -0
  262. package/examples/intro/compositions/studio.html +930 -0
  263. package/examples/intro/compositions/theme.css +218 -0
  264. package/examples/intro/fy.config.js +13 -0
  265. package/examples/intro/fy.fonts.json +100 -0
  266. package/examples/intro/scripts/make-grain.mjs +79 -0
  267. package/examples/intro/scripts/make-score.mjs +702 -0
  268. package/examples/intro/timelines/intro.timeline.json +60 -0
  269. package/examples/keyframes/README.md +76 -0
  270. package/examples/keyframes/compositions/backdrop.html +60 -0
  271. package/examples/keyframes/compositions/card.html +99 -0
  272. package/examples/keyframes/fy.config.js +10 -0
  273. package/examples/keyframes/timelines/keyframes.timeline.json +60 -0
  274. package/examples/nested/README.md +112 -0
  275. package/examples/nested/assets/pulse.wav +0 -0
  276. package/examples/nested/compositions/backdrop.html +84 -0
  277. package/examples/nested/compositions/card.html +275 -0
  278. package/examples/nested/compositions/overlay.html +307 -0
  279. package/examples/nested/fy.config.js +13 -0
  280. package/examples/nested/scripts/make-pulse.sh +20 -0
  281. package/examples/nested/timelines/chapter-a.timeline.json +39 -0
  282. package/examples/nested/timelines/chapter-b.timeline.json +39 -0
  283. package/examples/nested/timelines/nested-reel.timeline.json +52 -0
  284. package/examples/static/README.md +17 -0
  285. package/examples/static/compositions/still.html +37 -0
  286. package/examples/static/fy.config.js +9 -0
  287. package/examples/static/timelines/still.timeline.json +13 -0
  288. package/examples/transitions/README.md +128 -0
  289. package/examples/transitions/assets/alpha.wav +0 -0
  290. package/examples/transitions/assets/beta.wav +0 -0
  291. package/examples/transitions/assets/gamma.wav +0 -0
  292. package/examples/transitions/compositions/alpha.html +56 -0
  293. package/examples/transitions/compositions/beta.html +56 -0
  294. package/examples/transitions/compositions/gamma.html +56 -0
  295. package/examples/transitions/fy.config.js +12 -0
  296. package/examples/transitions/timelines/audio-crossfade.timeline.json +44 -0
  297. package/examples/transitions/timelines/transitions.timeline.json +31 -0
  298. package/examples/video/README.md +4 -4
  299. package/examples/video/compositions/video-mp4.html +349 -357
  300. package/examples/video/compositions/video-overlay.html +337 -345
  301. package/examples/video/compositions/video.html +349 -357
  302. package/examples/webgl/README.md +1 -1
  303. package/examples/webgl/compositions/webgl.html +205 -213
  304. package/package.json +13 -5
  305. package/scaffolds/init/AGENTS.md +131 -0
  306. package/scaffolds/init/README.md +56 -0
  307. package/scaffolds/init/compositions/hello.html +79 -0
  308. package/scaffolds/init/fy.config.js +9 -0
  309. package/scaffolds/init/gitignore.template +1 -0
  310. package/scaffolds/init/package.json +11 -0
  311. package/scaffolds/init/props/hello.json +4 -0
  312. package/scaffolds/init/props/main.json +6 -0
  313. package/scaffolds/init/timelines/main.timeline.json +20 -0
  314. package/scaffolds/local-models/LOCAL-MODELS.md +77 -0
  315. package/scaffolds/local-models/fy.policy.json +5 -0
  316. package/scaffolds/local-models/opencode/opencode.jsonc +17 -0
  317. package/scaffolds/local-models/pi/APPEND_SYSTEM.md +21 -0
  318. package/scaffolds/local-models/pi/sandbox.json +15 -0
  319. package/scaffolds/local-models/pi/settings.json +15 -0
  320. package/skills/frameyard/README.md +1 -0
  321. package/skills/frameyard/SKILL.md +59 -59
  322. package/skills/frameyard/references/audio-assets.md +32 -3
  323. package/skills/frameyard/references/common-mistakes.md +81 -7
  324. package/skills/frameyard/references/controllers.md +5 -4
  325. package/skills/frameyard/references/deterministic-authoring.md +49 -37
  326. package/skills/frameyard/references/diagnostics.md +42 -4
  327. package/skills/frameyard/references/failure-recovery.md +56 -10
  328. package/skills/frameyard/references/fonts.md +132 -0
  329. package/skills/frameyard/references/json-results.md +165 -10
  330. package/skills/frameyard/references/quick-reference.md +222 -0
  331. package/skills/frameyard/references/timelines.md +109 -15
  332. /package/examples/demo/{video.config.js → fy.config.js} +0 -0
  333. /package/examples/video/{video.config.js → fy.config.js} +0 -0
  334. /package/examples/webgl/{video.config.js → fy.config.js} +0 -0
@@ -0,0 +1,930 @@
1
+ <link rel="stylesheet" href="./theme.css" />
2
+ <script type="application/json" data-fy="props">
3
+ {
4
+ "eyebrow": "COMPOSE / 02",
5
+ "lineOne": "THE TIMELINE",
6
+ "lineTwo": "is the",
7
+ "emphasis": "score.",
8
+ "note": "Every clip is a range. Every range is reproducible.",
9
+ "accent": "#b8f36b"
10
+ }
11
+ </script>
12
+ <style>
13
+ @keyframes editor-in {
14
+ from {
15
+ opacity: 0;
16
+ transform: translateY(42px);
17
+ }
18
+ to {
19
+ opacity: 1;
20
+ transform: translateY(0);
21
+ }
22
+ }
23
+ @keyframes playhead-run {
24
+ from {
25
+ left: 22.5%;
26
+ }
27
+ to {
28
+ left: 50%;
29
+ }
30
+ }
31
+ @keyframes kf-pop {
32
+ from {
33
+ opacity: 0;
34
+ scale: 0;
35
+ }
36
+ to {
37
+ opacity: 1;
38
+ scale: 1;
39
+ }
40
+ }
41
+ .scene {
42
+ background:
43
+ radial-gradient(circle at 82% 24%, rgba(184, 243, 107, 0.07), transparent 32%),
44
+ radial-gradient(circle at 22% 82%, rgba(184, 243, 107, 0.05), transparent 36%), #06080b;
45
+ }
46
+ .grid {
47
+ position: absolute;
48
+ inset: 0;
49
+ background-image:
50
+ linear-gradient(90deg, rgba(242, 245, 238, 0.05) 1px, transparent 1px),
51
+ linear-gradient(0deg, rgba(242, 245, 238, 0.04) 1px, transparent 1px);
52
+ background-size: 64px 64px;
53
+ mask-image: linear-gradient(180deg, black, transparent 64%);
54
+ opacity: 0.45;
55
+ }
56
+ .content {
57
+ position: absolute;
58
+ inset: 0;
59
+ animation: scene-out 1s linear both;
60
+ }
61
+ .hero {
62
+ position: absolute;
63
+ left: 148px;
64
+ top: 134px;
65
+ width: 840px;
66
+ }
67
+ .eyebrow {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 18px;
71
+ margin-bottom: 52px;
72
+ color: var(--accent);
73
+ font-size: 19px;
74
+ font-weight: 600;
75
+ letter-spacing: 0.22em;
76
+ text-transform: uppercase;
77
+ animation: rise-small 1s ease-out both;
78
+ }
79
+ .eyebrow::before {
80
+ content: "";
81
+ width: 36px;
82
+ height: 1px;
83
+ background: var(--accent);
84
+ box-shadow: 0 0 12px var(--accent);
85
+ }
86
+ .headline {
87
+ margin: 0;
88
+ color: var(--paper);
89
+ }
90
+ .line {
91
+ display: block;
92
+ overflow: hidden;
93
+ padding-bottom: 0.04em;
94
+ }
95
+ .line-one {
96
+ font-size: 96px;
97
+ line-height: 0.94;
98
+ font-weight: 540;
99
+ letter-spacing: -0.045em;
100
+ }
101
+ .line-one span {
102
+ display: inline-block;
103
+ animation: line-up 1s cubic-bezier(0.16, 1, 0.3, 1) both;
104
+ }
105
+ .line-two {
106
+ margin-top: 2px;
107
+ font-size: 144px;
108
+ line-height: 0.92;
109
+ letter-spacing: -0.018em;
110
+ }
111
+ .line-two span {
112
+ display: inline-block;
113
+ animation: line-up 1s cubic-bezier(0.16, 1, 0.3, 1) both;
114
+ }
115
+ .line-two .accent {
116
+ position: relative;
117
+ }
118
+ .line-two .accent::after {
119
+ content: "";
120
+ position: absolute;
121
+ left: 0.04em;
122
+ right: -0.02em;
123
+ bottom: 0.03em;
124
+ height: 2px;
125
+ background: var(--accent);
126
+ opacity: 0.6;
127
+ box-shadow: 0 0 14px var(--accent);
128
+ animation: wipe-right 1s cubic-bezier(0.16, 1, 0.3, 1) both;
129
+ animation-delay: 2.1s;
130
+ }
131
+ .note {
132
+ margin: 44px 0 0;
133
+ max-width: 680px;
134
+ color: #9ca8a1;
135
+ font-size: 31px;
136
+ line-height: 1.5;
137
+ letter-spacing: -0.01em;
138
+ animation: rise-in 1s ease-out both;
139
+ }
140
+
141
+ .divider {
142
+ position: absolute;
143
+ left: 1074px;
144
+ top: 168px;
145
+ bottom: 512px;
146
+ width: 1px;
147
+ background: linear-gradient(
148
+ 180deg,
149
+ transparent,
150
+ rgba(242, 245, 238, 0.18) 12%,
151
+ rgba(242, 245, 238, 0.18) 88%,
152
+ transparent
153
+ );
154
+ transform-origin: top center;
155
+ animation: draw-y 1s ease-out both;
156
+ }
157
+ .divider::before {
158
+ content: "";
159
+ position: absolute;
160
+ left: -2px;
161
+ top: 0;
162
+ width: 5px;
163
+ height: 5px;
164
+ background: var(--accent);
165
+ box-shadow: 0 0 10px var(--accent);
166
+ }
167
+
168
+ .cue {
169
+ position: absolute;
170
+ left: 1112px;
171
+ top: 172px;
172
+ width: 660px;
173
+ animation: rise-in 1s ease-out both;
174
+ }
175
+ .cue-head {
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: space-between;
179
+ padding-bottom: 14px;
180
+ border-bottom: 1px solid rgba(242, 245, 238, 0.14);
181
+ color: var(--muted);
182
+ font-size: 13px;
183
+ letter-spacing: 0.18em;
184
+ text-transform: uppercase;
185
+ }
186
+ .cue-head b {
187
+ color: var(--paper);
188
+ font-weight: 500;
189
+ }
190
+ .cue-row {
191
+ display: grid;
192
+ grid-template-columns: 42px 128px 1fr auto;
193
+ align-items: baseline;
194
+ gap: 18px;
195
+ padding: 17px 0 16px;
196
+ border-bottom: 1px solid rgba(242, 245, 238, 0.08);
197
+ font-size: 17px;
198
+ letter-spacing: 0.08em;
199
+ text-transform: uppercase;
200
+ }
201
+ .cue-row i {
202
+ color: var(--accent);
203
+ font-size: 13px;
204
+ font-style: normal;
205
+ letter-spacing: 0.06em;
206
+ }
207
+ .cue-row b {
208
+ color: var(--paper);
209
+ font-weight: 500;
210
+ }
211
+ .cue-row span {
212
+ color: var(--muted);
213
+ font-size: 14px;
214
+ letter-spacing: 0.08em;
215
+ }
216
+ .cue-row em {
217
+ color: var(--muted-strong);
218
+ font-size: 12px;
219
+ font-style: normal;
220
+ letter-spacing: 0.1em;
221
+ }
222
+ .cue-row.live b {
223
+ color: var(--accent);
224
+ }
225
+ .cue-row.live {
226
+ border-bottom-color: rgba(184, 243, 107, 0.32);
227
+ }
228
+ .cue-foot {
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: space-between;
232
+ padding-top: 18px;
233
+ color: var(--muted);
234
+ font-size: 13px;
235
+ letter-spacing: 0.14em;
236
+ text-transform: uppercase;
237
+ }
238
+ .cue-foot b {
239
+ color: var(--muted-strong);
240
+ font-weight: 500;
241
+ }
242
+
243
+ .callout {
244
+ position: absolute;
245
+ left: 1112px;
246
+ top: 486px;
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 12px;
250
+ color: var(--muted);
251
+ font-size: 13px;
252
+ letter-spacing: 0.14em;
253
+ text-transform: uppercase;
254
+ animation: rise-small 1s ease-out both;
255
+ }
256
+ .callout b {
257
+ color: var(--accent);
258
+ font-weight: 500;
259
+ }
260
+
261
+ .editor-wrap {
262
+ position: absolute;
263
+ left: 148px;
264
+ right: 148px;
265
+ top: 590px;
266
+ height: 368px;
267
+ }
268
+ .editor {
269
+ position: relative;
270
+ width: 100%;
271
+ height: 100%;
272
+ overflow: hidden;
273
+ border: 1px solid rgba(242, 245, 238, 0.22);
274
+ border-radius: 6px;
275
+ background: #080c10;
276
+ box-shadow:
277
+ 0 44px 120px rgba(0, 0, 0, 0.55),
278
+ 0 0 0 1px rgba(184, 243, 107, 0.05),
279
+ 0 0 90px rgba(184, 243, 107, 0.045);
280
+ animation: editor-in 1s cubic-bezier(0.16, 1, 0.3, 1) both;
281
+ }
282
+ .toolbar {
283
+ display: flex;
284
+ align-items: center;
285
+ justify-content: space-between;
286
+ height: 40px;
287
+ padding: 0 20px;
288
+ border-bottom: 1px solid rgba(242, 245, 238, 0.1);
289
+ background: rgba(242, 245, 238, 0.025);
290
+ color: var(--muted);
291
+ font-size: 12px;
292
+ letter-spacing: 0.12em;
293
+ text-transform: uppercase;
294
+ }
295
+ .toggle {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: 10px;
299
+ color: var(--muted-strong);
300
+ }
301
+ .toggle .dot {
302
+ width: 7px;
303
+ height: 7px;
304
+ border-radius: 50%;
305
+ background: var(--accent);
306
+ box-shadow: 0 0 10px var(--accent);
307
+ }
308
+ .toolbar .mid {
309
+ display: flex;
310
+ gap: 26px;
311
+ }
312
+ .toolbar .right {
313
+ display: flex;
314
+ gap: 24px;
315
+ }
316
+ .toolbar b {
317
+ color: var(--paper);
318
+ font-weight: 500;
319
+ }
320
+ .toolbar .chip {
321
+ padding: 4px 10px;
322
+ border: 1px solid rgba(242, 245, 238, 0.16);
323
+ border-radius: 2px;
324
+ color: var(--muted-strong);
325
+ }
326
+ .toolbar .chip.active {
327
+ border-color: rgba(184, 243, 107, 0.42);
328
+ color: var(--accent);
329
+ }
330
+
331
+ .ruler {
332
+ display: grid;
333
+ grid-template-columns: 116px 1fr;
334
+ height: 36px;
335
+ border-bottom: 1px solid rgba(242, 245, 238, 0.09);
336
+ }
337
+ .ruler .label {
338
+ display: flex;
339
+ align-items: center;
340
+ padding-left: 20px;
341
+ color: rgba(139, 152, 146, 0.7);
342
+ font-size: 11px;
343
+ letter-spacing: 0.14em;
344
+ text-transform: uppercase;
345
+ }
346
+ .ruler .lane {
347
+ position: relative;
348
+ margin-right: 16px;
349
+ background-image:
350
+ repeating-linear-gradient(90deg, rgba(242, 245, 238, 0.13) 0 1px, transparent 1px 2.5%),
351
+ repeating-linear-gradient(90deg, rgba(242, 245, 238, 0.24) 0 1px, transparent 1px 25%);
352
+ background-position: left bottom;
353
+ background-size:
354
+ 100% 7px,
355
+ 100% 13px;
356
+ background-repeat: no-repeat;
357
+ }
358
+ .ruler .lane span {
359
+ position: absolute;
360
+ top: 8px;
361
+ color: rgba(139, 152, 146, 0.8);
362
+ font-size: 11px;
363
+ letter-spacing: 0.1em;
364
+ transform: translateX(-50%);
365
+ }
366
+ .ruler .lane span:first-child {
367
+ transform: none;
368
+ }
369
+ .ruler .lane span:last-child {
370
+ transform: translateX(-100%);
371
+ }
372
+
373
+ .track {
374
+ display: grid;
375
+ grid-template-columns: 116px 1fr;
376
+ border-bottom: 1px solid rgba(242, 245, 238, 0.07);
377
+ }
378
+ .track-label {
379
+ display: flex;
380
+ flex-direction: column;
381
+ justify-content: center;
382
+ gap: 7px;
383
+ padding-left: 20px;
384
+ border-right: 1px solid rgba(242, 245, 238, 0.07);
385
+ }
386
+ .track-label b {
387
+ color: var(--muted-strong);
388
+ font-size: 12px;
389
+ font-weight: 500;
390
+ letter-spacing: 0.12em;
391
+ text-transform: uppercase;
392
+ }
393
+ .track-label span {
394
+ color: rgba(139, 152, 146, 0.62);
395
+ font-size: 10px;
396
+ letter-spacing: 0.1em;
397
+ text-transform: uppercase;
398
+ }
399
+ .track-label.accent b {
400
+ color: var(--accent);
401
+ }
402
+ .track .lane {
403
+ position: relative;
404
+ margin-right: 16px;
405
+ background-image: repeating-linear-gradient(90deg, rgba(242, 245, 238, 0.045) 0 1px, transparent 1px 2.5%);
406
+ }
407
+ .track.overlay {
408
+ height: 78px;
409
+ }
410
+ .track.scenes {
411
+ height: 84px;
412
+ }
413
+ .track.audio {
414
+ height: 84px;
415
+ }
416
+
417
+ .clip {
418
+ position: absolute;
419
+ top: 15px;
420
+ height: 48px;
421
+ overflow: hidden;
422
+ border: 1px solid rgba(242, 245, 238, 0.16);
423
+ border-radius: 3px;
424
+ background: rgba(242, 245, 238, 0.045);
425
+ color: var(--muted-strong);
426
+ animation: wipe-right 1s cubic-bezier(0.22, 1, 0.36, 1) both;
427
+ }
428
+ .clip .clip-top {
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: space-between;
432
+ gap: 12px;
433
+ padding: 8px 12px 0;
434
+ }
435
+ .clip .clip-top b {
436
+ overflow: hidden;
437
+ color: inherit;
438
+ font-size: 12px;
439
+ font-weight: 500;
440
+ letter-spacing: 0.1em;
441
+ text-overflow: ellipsis;
442
+ text-transform: uppercase;
443
+ white-space: nowrap;
444
+ }
445
+ .clip .clip-top span {
446
+ flex: none;
447
+ color: currentColor;
448
+ font-size: 10px;
449
+ letter-spacing: 0.08em;
450
+ opacity: 0.66;
451
+ }
452
+ .clip .clip-sub {
453
+ padding: 4px 12px 0;
454
+ color: currentColor;
455
+ font-size: 10px;
456
+ letter-spacing: 0.08em;
457
+ opacity: 0.55;
458
+ text-transform: uppercase;
459
+ }
460
+ .clip.hatched {
461
+ border-style: dashed;
462
+ background:
463
+ repeating-linear-gradient(135deg, rgba(184, 243, 107, 0.08) 0 6px, transparent 6px 12px),
464
+ rgba(242, 245, 238, 0.02);
465
+ color: var(--muted);
466
+ }
467
+ .clip.author,
468
+ .clip.lattice,
469
+ .clip.brand {
470
+ background: rgba(242, 245, 238, 0.055);
471
+ }
472
+ .clip.compose {
473
+ border-color: rgba(184, 243, 107, 0.85);
474
+ background: linear-gradient(100deg, rgba(184, 243, 107, 0.92), rgba(163, 226, 86, 0.62));
475
+ color: #0a1006;
476
+ box-shadow: 0 0 34px rgba(184, 243, 107, 0.16);
477
+ }
478
+ .clip.compose .clip-sub {
479
+ opacity: 0.66;
480
+ }
481
+ .clip.compose .clip-top,
482
+ .clip.lattice .clip-top,
483
+ .clip.brand .clip-top {
484
+ padding-left: 52px;
485
+ }
486
+ .clip.compose .clip-sub,
487
+ .clip.lattice .clip-sub,
488
+ .clip.brand .clip-sub {
489
+ padding-left: 52px;
490
+ }
491
+ .clip.author .clip-top,
492
+ .clip.compose .clip-top,
493
+ .clip.lattice .clip-top {
494
+ padding-right: 52px;
495
+ }
496
+ .clip .kf-line {
497
+ position: absolute;
498
+ left: 16px;
499
+ right: 16px;
500
+ bottom: 8px;
501
+ height: 1px;
502
+ background: rgba(6, 12, 4, 0.28);
503
+ }
504
+ .kf {
505
+ position: absolute;
506
+ bottom: 5px;
507
+ width: 7px;
508
+ height: 7px;
509
+ margin-left: -3.5px;
510
+ background: #0a1006;
511
+ rotate: 45deg;
512
+ animation: kf-pop 1s ease-out both;
513
+ }
514
+ .trans {
515
+ position: absolute;
516
+ top: 9px;
517
+ height: 62px;
518
+ border-left: 1px dashed rgba(184, 243, 107, 0.5);
519
+ border-right: 1px dashed rgba(184, 243, 107, 0.5);
520
+ background: repeating-linear-gradient(135deg, rgba(184, 243, 107, 0.22) 0 2px, transparent 2px 7px);
521
+ z-index: 3;
522
+ animation: fade-in 1s ease-out both;
523
+ }
524
+ .trans::after {
525
+ content: "30F";
526
+ position: absolute;
527
+ left: 50%;
528
+ top: -16px;
529
+ color: var(--accent);
530
+ font-family: "Space Mono", monospace;
531
+ font-size: 10px;
532
+ letter-spacing: 0.08em;
533
+ transform: translateX(-50%);
534
+ white-space: nowrap;
535
+ }
536
+ .audio-clip {
537
+ position: absolute;
538
+ left: 0;
539
+ top: 11px;
540
+ width: 100%;
541
+ height: 62px;
542
+ overflow: hidden;
543
+ border: 1px solid rgba(184, 243, 107, 0.32);
544
+ border-radius: 3px;
545
+ background: linear-gradient(180deg, rgba(184, 243, 107, 0.12), rgba(184, 243, 107, 0.045));
546
+ animation: wipe-right 1s cubic-bezier(0.22, 1, 0.36, 1) both;
547
+ }
548
+ .audio-clip .audio-head {
549
+ position: absolute;
550
+ left: 12px;
551
+ top: 8px;
552
+ z-index: 2;
553
+ display: flex;
554
+ gap: 12px;
555
+ color: var(--muted-strong);
556
+ font-size: 11px;
557
+ letter-spacing: 0.12em;
558
+ text-transform: uppercase;
559
+ }
560
+ .audio-clip .audio-head b {
561
+ color: var(--accent);
562
+ font-weight: 500;
563
+ }
564
+ .wave {
565
+ position: absolute;
566
+ left: 0;
567
+ right: 0;
568
+ bottom: 5px;
569
+ width: 100%;
570
+ height: 36px;
571
+ }
572
+ .wave path {
573
+ stroke: var(--accent);
574
+ stroke-width: 1.6;
575
+ opacity: 0.68;
576
+ }
577
+ .wave .ghost {
578
+ stroke: rgba(242, 245, 238, 0.24);
579
+ stroke-width: 1;
580
+ opacity: 0.5;
581
+ }
582
+
583
+ .playhead-layer {
584
+ position: absolute;
585
+ left: 116px;
586
+ right: 16px;
587
+ top: 76px;
588
+ bottom: 46px;
589
+ z-index: 5;
590
+ pointer-events: none;
591
+ }
592
+ .playhead {
593
+ position: absolute;
594
+ top: 0;
595
+ bottom: 0;
596
+ width: 1px;
597
+ background: var(--accent);
598
+ box-shadow: 0 0 12px rgba(184, 243, 107, 0.75);
599
+ animation: playhead-run 1s linear both;
600
+ }
601
+ .playhead::before {
602
+ content: "";
603
+ position: absolute;
604
+ left: -5px;
605
+ top: -1px;
606
+ width: 11px;
607
+ height: 8px;
608
+ background: var(--accent);
609
+ clip-path: polygon(0 0, 100% 0, 50% 100%);
610
+ }
611
+
612
+ .editor-foot {
613
+ position: absolute;
614
+ left: 0;
615
+ right: 0;
616
+ bottom: 0;
617
+ display: flex;
618
+ align-items: center;
619
+ justify-content: space-between;
620
+ height: 46px;
621
+ padding: 0 20px;
622
+ border-top: 1px solid rgba(242, 245, 238, 0.08);
623
+ color: var(--muted);
624
+ font-size: 11px;
625
+ letter-spacing: 0.1em;
626
+ text-transform: uppercase;
627
+ }
628
+ .editor-foot .group {
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 20px;
632
+ }
633
+ .editor-foot .play {
634
+ display: inline-flex;
635
+ align-items: center;
636
+ gap: 10px;
637
+ color: var(--paper);
638
+ }
639
+ .editor-foot .play::before {
640
+ content: "";
641
+ width: 0;
642
+ height: 0;
643
+ border-top: 5px solid transparent;
644
+ border-bottom: 5px solid transparent;
645
+ border-left: 8px solid var(--accent);
646
+ }
647
+ .editor-foot b {
648
+ color: var(--muted-strong);
649
+ font-weight: 500;
650
+ }
651
+ </style>
652
+ <fy-composition duration-in-frames="330">
653
+ <div class="scene">
654
+ <div class="grid"></div>
655
+ <div class="content" data-fy-anim-start="288" data-fy-anim-duration="30" data-fy-anim-easing="linear">
656
+ <div class="hero">
657
+ <div class="eyebrow mono" data-fy-anim-start="20" data-fy-anim-duration="44" data-fy-anim-easing="ease-out">
658
+ <span data-fy-text="eyebrow"></span>
659
+ </div>
660
+ <h1 class="headline">
661
+ <span class="line line-one">
662
+ <span
663
+ class="mono"
664
+ data-fy-text="lineOne"
665
+ data-fy-anim-start="32"
666
+ data-fy-anim-duration="60"
667
+ data-fy-anim-easing="cubic-bezier(0.16, 1, 0.3, 1)"
668
+ ></span>
669
+ </span>
670
+ <span class="line line-two">
671
+ <span
672
+ class="serif"
673
+ data-fy-anim-start="48"
674
+ data-fy-anim-duration="68"
675
+ data-fy-anim-easing="cubic-bezier(0.16, 1, 0.3, 1)"
676
+ >
677
+ <span data-fy-text="lineTwo"></span> <span class="accent" data-fy-text="emphasis"></span>
678
+ </span>
679
+ </span>
680
+ </h1>
681
+ <p
682
+ class="note"
683
+ data-fy-text="note"
684
+ data-fy-anim-start="80"
685
+ data-fy-anim-duration="52"
686
+ data-fy-anim-easing="ease-out"
687
+ ></p>
688
+ </div>
689
+
690
+ <div class="divider" data-fy-anim-start="24" data-fy-anim-duration="48" data-fy-anim-easing="ease-out"></div>
691
+
692
+ <div
693
+ class="cue"
694
+ data-fy-anim-start="36"
695
+ data-fy-anim-duration="60"
696
+ data-fy-anim-easing="cubic-bezier(0.16, 1, 0.3, 1)"
697
+ >
698
+ <div class="cue-head mono">
699
+ <span><b>Cue sheet</b> / intro</span>
700
+ <span>4 movements</span>
701
+ </div>
702
+ <div class="cue-row mono">
703
+ <i>01</i>
704
+ <b>Author</b>
705
+ <span>00:00:00</span>
706
+ <em>300 F</em>
707
+ </div>
708
+ <div class="cue-row mono live">
709
+ <i>02</i>
710
+ <b>Compose</b>
711
+ <span>00:04:30</span>
712
+ <em>330 F</em>
713
+ </div>
714
+ <div class="cue-row mono">
715
+ <i>03</i>
716
+ <b>Render</b>
717
+ <span>00:09:30</span>
718
+ <em>330 F</em>
719
+ </div>
720
+ <div class="cue-row mono">
721
+ <i>04</i>
722
+ <b>Frameyard</b>
723
+ <span>00:14:30</span>
724
+ <em>330 F</em>
725
+ </div>
726
+ <div class="cue-foot mono">
727
+ <span>Score / <b>120 bpm</b></span>
728
+ <span>D minor → D major</span>
729
+ </div>
730
+ </div>
731
+
732
+ <div class="callout mono" data-fy-anim-start="120" data-fy-anim-duration="44" data-fy-anim-easing="ease-out">
733
+ <b>30-frame dissolve</b> / same-track overlap
734
+ </div>
735
+
736
+ <div class="editor-wrap">
737
+ <div
738
+ class="editor"
739
+ data-fy-anim-start="52"
740
+ data-fy-anim-duration="68"
741
+ data-fy-anim-easing="cubic-bezier(0.16, 1, 0.3, 1)"
742
+ >
743
+ <div class="toolbar mono">
744
+ <div class="toggle">
745
+ <i class="dot"></i>
746
+ <b>intro.timeline.json</b>
747
+ <span>/ &nbsp;4 scenes · 3 dissolves</span>
748
+ </div>
749
+ <div class="mid">
750
+ <span class="chip active">timeline</span>
751
+ <span class="chip">preview</span>
752
+ <span class="chip">checks</span>
753
+ </div>
754
+ <div class="right">
755
+ <span><b>1200 F</b> / 60 FPS</span>
756
+ <span>1920 × 1080</span>
757
+ </div>
758
+ </div>
759
+
760
+ <div class="ruler mono">
761
+ <div class="label">Frame</div>
762
+ <div class="lane">
763
+ <span style="left: 0%">00:00</span>
764
+ <span style="left: 25%">00:05</span>
765
+ <span style="left: 50%">00:10</span>
766
+ <span style="left: 75%">00:15</span>
767
+ <span style="left: 100%">00:20</span>
768
+ </div>
769
+ </div>
770
+
771
+ <div class="track overlay">
772
+ <div class="track-label mono">
773
+ <b>V2</b>
774
+ <span>overlay</span>
775
+ </div>
776
+ <div class="lane">
777
+ <div
778
+ class="clip hatched"
779
+ data-fy-anim-start="56"
780
+ data-fy-anim-duration="48"
781
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
782
+ style="left: 0; width: 100%"
783
+ >
784
+ <div class="clip-top">
785
+ <b>chrome / HUD overlay</b>
786
+ <span>1200 F</span>
787
+ </div>
788
+ <div class="clip-sub">frame counter · progress · grain</div>
789
+ </div>
790
+ </div>
791
+ </div>
792
+
793
+ <div class="track scenes">
794
+ <div class="track-label mono accent">
795
+ <b>V1</b>
796
+ <span>scenes</span>
797
+ </div>
798
+ <div class="lane">
799
+ <div
800
+ class="clip author"
801
+ data-fy-anim-start="52"
802
+ data-fy-anim-duration="52"
803
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
804
+ style="left: 0; width: 25%"
805
+ >
806
+ <div class="clip-top">
807
+ <b>01 / Author</b>
808
+ <span>300 F</span>
809
+ </div>
810
+ <div class="clip-sub">opening</div>
811
+ </div>
812
+ <div
813
+ class="clip compose"
814
+ data-fy-anim-start="60"
815
+ data-fy-anim-duration="52"
816
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
817
+ style="left: 22.5%; width: 27.5%"
818
+ >
819
+ <div class="clip-top">
820
+ <b>02 / Compose</b>
821
+ <span>330 F</span>
822
+ </div>
823
+ <div class="clip-sub">studio · keyframed</div>
824
+ <div class="kf-line"></div>
825
+ <span class="kf" style="left: 22%; animation-delay: 1.5s"></span>
826
+ <span class="kf" style="left: 46%; animation-delay: 1.6s"></span>
827
+ <span class="kf" style="left: 71%; animation-delay: 1.7s"></span>
828
+ <span class="kf" style="left: 88%; animation-delay: 1.8s"></span>
829
+ </div>
830
+ <div
831
+ class="clip lattice"
832
+ data-fy-anim-start="68"
833
+ data-fy-anim-duration="52"
834
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
835
+ style="left: 47.5%; width: 27.5%"
836
+ >
837
+ <div class="clip-top">
838
+ <b>03 / Render</b>
839
+ <span>330 F</span>
840
+ </div>
841
+ <div class="clip-sub">lattice · canvas</div>
842
+ </div>
843
+ <div
844
+ class="clip brand"
845
+ data-fy-anim-start="76"
846
+ data-fy-anim-duration="52"
847
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
848
+ style="left: 72.5%; width: 27.5%"
849
+ >
850
+ <div class="clip-top">
851
+ <b>04 / Frameyard</b>
852
+ <span>330 F</span>
853
+ </div>
854
+ <div class="clip-sub">brand · lockup</div>
855
+ </div>
856
+ <span
857
+ class="trans"
858
+ data-fy-anim-start="80"
859
+ data-fy-anim-duration="40"
860
+ data-fy-anim-easing="ease-out"
861
+ style="left: 22.5%; width: 2.5%"
862
+ ></span>
863
+ <span
864
+ class="trans"
865
+ data-fy-anim-start="92"
866
+ data-fy-anim-duration="40"
867
+ data-fy-anim-easing="ease-out"
868
+ style="left: 47.5%; width: 2.5%"
869
+ ></span>
870
+ <span
871
+ class="trans"
872
+ data-fy-anim-start="104"
873
+ data-fy-anim-duration="40"
874
+ data-fy-anim-easing="ease-out"
875
+ style="left: 72.5%; width: 2.5%"
876
+ ></span>
877
+ </div>
878
+ </div>
879
+
880
+ <div class="track audio">
881
+ <div class="track-label mono">
882
+ <b>A1</b>
883
+ <span>score</span>
884
+ </div>
885
+ <div class="lane">
886
+ <div
887
+ class="audio-clip"
888
+ data-fy-anim-start="68"
889
+ data-fy-anim-duration="56"
890
+ data-fy-anim-easing="cubic-bezier(0.22, 1, 0.36, 1)"
891
+ >
892
+ <div class="audio-head mono">
893
+ <b>score.ogg</b>
894
+ <span>120 bpm · 48 khz · stereo</span>
895
+ </div>
896
+ <svg class="wave" viewBox="0 0 1400 100" preserveAspectRatio="none" aria-hidden="true">
897
+ <path
898
+ class="ghost"
899
+ transform="translate(0 1)"
900
+ d="M3.9 37.7V62.3M11.7 43.0V57.0M19.4 41.6V58.4M27.2 43.8V56.2M35.0 40.2V59.8M42.8 39.2V60.8M50.6 44.5V55.5M58.3 30.2V69.8M66.1 42.4V57.6M73.9 41.4V58.6M81.7 43.4V56.6M89.4 40.5V59.5M97.2 32.8V67.2M105.0 45.0V55.0M112.8 42.0V58.0M120.6 36.2V63.8M128.3 40.6V59.4M136.1 43.8V56.2M143.9 45.2V54.8M151.7 44.5V55.5M159.4 38.3V61.7M167.2 34.4V65.6M175.0 34.1V65.9M182.8 44.0V56.0M190.6 23.7V76.3M198.3 37.4V62.6M206.1 24.6V75.4M213.9 27.0V73.0M221.7 26.5V73.5M229.4 22.1V77.9M237.2 40.8V59.2M245.0 28.0V72.0M252.8 26.1V73.9M260.6 42.4V57.6M268.3 43.9V56.1M276.1 28.2V71.8M283.9 37.8V62.2M291.7 41.4V58.6M299.4 21.5V78.5M307.2 43.7V56.3M315.0 27.8V72.2M322.8 39.0V61.0M330.6 39.4V60.6M338.3 33.2V66.8M346.1 38.0V62.0M353.9 30.8V69.2M361.7 38.0V62.0M369.4 42.7V57.3M377.2 43.0V57.0M385.0 25.3V74.7M392.8 36.6V63.4M400.6 19.2V80.8M408.3 30.8V69.2M416.1 25.2V74.8M423.9 30.4V69.6M431.7 26.0V74.0M439.4 39.1V60.9M447.2 20.5V79.5M455.0 43.6V56.4M462.8 43.0V57.0M470.6 35.8V64.2M478.3 20.6V79.4M486.1 43.0V57.0M493.9 17.0V83.0M501.7 39.9V60.1M509.4 21.9V78.1M517.2 21.6V78.4M525.0 29.8V70.2M532.8 17.6V82.4M540.6 42.5V57.5M548.3 30.0V70.0M556.1 20.5V79.5M563.9 42.7V57.3M571.7 13.4V86.6M579.4 30.5V69.5M587.2 33.6V66.4M595.0 43.0V57.0M602.8 38.8V61.2M610.6 24.7V75.3M618.3 40.6V59.4M626.1 30.5V69.5M633.9 14.0V86.0M641.7 12.7V87.3M649.4 32.9V67.1M657.2 21.1V78.9M665.0 14.4V85.6M672.8 40.8V59.2M680.6 29.3V70.7M688.3 37.8V62.2M696.1 28.7V71.3M703.9 40.0V60.0M711.7 14.6V85.4M719.4 12.8V87.2M727.2 37.6V62.4M735.0 37.1V62.9M742.8 39.5V60.5M750.6 36.9V63.1M758.3 17.6V82.4M766.1 17.6V82.4M773.9 26.9V73.1M781.7 28.5V71.5M789.4 39.8V60.2M797.2 42.3V57.7M805.0 37.5V62.5M812.8 28.8V71.2M820.6 26.4V73.6M828.3 17.7V82.3M836.1 23.3V76.7M843.9 33.5V66.5M851.7 40.6V59.4M859.4 38.4V61.6M867.2 41.2V58.8M875.0 33.1V66.9M882.8 39.1V60.9M890.6 41.0V59.0M898.3 41.4V58.6M906.1 28.0V72.0M913.9 26.5V73.5M921.7 41.0V59.0M929.4 18.3V81.7M937.2 22.9V77.1M945.0 20.4V79.6M952.8 24.8V75.2M960.6 28.7V71.3M968.3 39.1V60.9M976.1 42.4V57.6M983.9 39.0V61.0M991.7 37.5V62.5M999.4 37.2V62.8M1007.2 23.2V76.8M1015.0 37.8V62.2M1022.8 16.7V83.3M1030.6 40.8V59.2M1038.3 42.2V57.8M1046.1 37.2V62.8M1053.9 17.4V82.6M1061.7 22.5V77.5M1069.4 34.7V65.3M1077.2 21.4V78.6M1085.0 30.7V69.3M1092.8 44.2V55.8M1100.6 29.8V70.2M1108.3 40.3V59.7M1116.1 26.2V73.8M1123.9 42.6V57.4M1131.7 36.4V63.6M1139.4 42.5V57.5M1147.2 23.5V76.5M1155.0 40.3V59.7M1162.8 41.4V58.6M1170.6 36.4V63.6M1178.3 25.7V74.3M1186.1 40.9V59.1M1193.9 30.6V69.4M1201.7 35.2V64.8M1209.4 35.5V64.5M1217.2 27.1V72.9M1225.0 29.6V70.4M1232.8 40.6V59.4M1240.6 35.3V64.7M1248.3 34.0V66.0M1256.1 41.3V58.7M1263.9 27.1V72.9M1271.7 39.1V60.9M1279.4 45.4V54.6M1287.2 33.8V66.2M1295.0 44.6V55.4M1302.8 41.1V58.9M1310.6 39.6V60.4M1318.3 38.4V61.6M1326.1 30.5V69.5M1333.9 32.7V67.3M1341.7 33.1V66.9M1349.4 45.5V54.5M1357.2 38.7V61.3M1365.0 34.6V65.4M1372.8 46.3V53.7M1380.6 47.0V53.0M1388.3 47.1V52.9M1396.1 38.4V61.6"
901
+ />
902
+ <path
903
+ d="M3.9 37.7V62.3M11.7 43.0V57.0M19.4 41.6V58.4M27.2 43.8V56.2M35.0 40.2V59.8M42.8 39.2V60.8M50.6 44.5V55.5M58.3 30.2V69.8M66.1 42.4V57.6M73.9 41.4V58.6M81.7 43.4V56.6M89.4 40.5V59.5M97.2 32.8V67.2M105.0 45.0V55.0M112.8 42.0V58.0M120.6 36.2V63.8M128.3 40.6V59.4M136.1 43.8V56.2M143.9 45.2V54.8M151.7 44.5V55.5M159.4 38.3V61.7M167.2 34.4V65.6M175.0 34.1V65.9M182.8 44.0V56.0M190.6 23.7V76.3M198.3 37.4V62.6M206.1 24.6V75.4M213.9 27.0V73.0M221.7 26.5V73.5M229.4 22.1V77.9M237.2 40.8V59.2M245.0 28.0V72.0M252.8 26.1V73.9M260.6 42.4V57.6M268.3 43.9V56.1M276.1 28.2V71.8M283.9 37.8V62.2M291.7 41.4V58.6M299.4 21.5V78.5M307.2 43.7V56.3M315.0 27.8V72.2M322.8 39.0V61.0M330.6 39.4V60.6M338.3 33.2V66.8M346.1 38.0V62.0M353.9 30.8V69.2M361.7 38.0V62.0M369.4 42.7V57.3M377.2 43.0V57.0M385.0 25.3V74.7M392.8 36.6V63.4M400.6 19.2V80.8M408.3 30.8V69.2M416.1 25.2V74.8M423.9 30.4V69.6M431.7 26.0V74.0M439.4 39.1V60.9M447.2 20.5V79.5M455.0 43.6V56.4M462.8 43.0V57.0M470.6 35.8V64.2M478.3 20.6V79.4M486.1 43.0V57.0M493.9 17.0V83.0M501.7 39.9V60.1M509.4 21.9V78.1M517.2 21.6V78.4M525.0 29.8V70.2M532.8 17.6V82.4M540.6 42.5V57.5M548.3 30.0V70.0M556.1 20.5V79.5M563.9 42.7V57.3M571.7 13.4V86.6M579.4 30.5V69.5M587.2 33.6V66.4M595.0 43.0V57.0M602.8 38.8V61.2M610.6 24.7V75.3M618.3 40.6V59.4M626.1 30.5V69.5M633.9 14.0V86.0M641.7 12.7V87.3M649.4 32.9V67.1M657.2 21.1V78.9M665.0 14.4V85.6M672.8 40.8V59.2M680.6 29.3V70.7M688.3 37.8V62.2M696.1 28.7V71.3M703.9 40.0V60.0M711.7 14.6V85.4M719.4 12.8V87.2M727.2 37.6V62.4M735.0 37.1V62.9M742.8 39.5V60.5M750.6 36.9V63.1M758.3 17.6V82.4M766.1 17.6V82.4M773.9 26.9V73.1M781.7 28.5V71.5M789.4 39.8V60.2M797.2 42.3V57.7M805.0 37.5V62.5M812.8 28.8V71.2M820.6 26.4V73.6M828.3 17.7V82.3M836.1 23.3V76.7M843.9 33.5V66.5M851.7 40.6V59.4M859.4 38.4V61.6M867.2 41.2V58.8M875.0 33.1V66.9M882.8 39.1V60.9M890.6 41.0V59.0M898.3 41.4V58.6M906.1 28.0V72.0M913.9 26.5V73.5M921.7 41.0V59.0M929.4 18.3V81.7M937.2 22.9V77.1M945.0 20.4V79.6M952.8 24.8V75.2M960.6 28.7V71.3M968.3 39.1V60.9M976.1 42.4V57.6M983.9 39.0V61.0M991.7 37.5V62.5M999.4 37.2V62.8M1007.2 23.2V76.8M1015.0 37.8V62.2M1022.8 16.7V83.3M1030.6 40.8V59.2M1038.3 42.2V57.8M1046.1 37.2V62.8M1053.9 17.4V82.6M1061.7 22.5V77.5M1069.4 34.7V65.3M1077.2 21.4V78.6M1085.0 30.7V69.3M1092.8 44.2V55.8M1100.6 29.8V70.2M1108.3 40.3V59.7M1116.1 26.2V73.8M1123.9 42.6V57.4M1131.7 36.4V63.6M1139.4 42.5V57.5M1147.2 23.5V76.5M1155.0 40.3V59.7M1162.8 41.4V58.6M1170.6 36.4V63.6M1178.3 25.7V74.3M1186.1 40.9V59.1M1193.9 30.6V69.4M1201.7 35.2V64.8M1209.4 35.5V64.5M1217.2 27.1V72.9M1225.0 29.6V70.4M1232.8 40.6V59.4M1240.6 35.3V64.7M1248.3 34.0V66.0M1256.1 41.3V58.7M1263.9 27.1V72.9M1271.7 39.1V60.9M1279.4 45.4V54.6M1287.2 33.8V66.2M1295.0 44.6V55.4M1302.8 41.1V58.9M1310.6 39.6V60.4M1318.3 38.4V61.6M1326.1 30.5V69.5M1333.9 32.7V67.3M1341.7 33.1V66.9M1349.4 45.5V54.5M1357.2 38.7V61.3M1365.0 34.6V65.4M1372.8 46.3V53.7M1380.6 47.0V53.0M1388.3 47.1V52.9M1396.1 38.4V61.6"
904
+ />
905
+ </svg>
906
+ </div>
907
+ </div>
908
+ </div>
909
+
910
+ <div class="playhead-layer">
911
+ <div class="playhead" data-fy-anim-duration="330" data-fy-anim-easing="linear"></div>
912
+ </div>
913
+
914
+ <div class="editor-foot mono">
915
+ <div class="group">
916
+ <span class="play">Play</span>
917
+ <span>← → step 1f</span>
918
+ <span><b>Snap</b> / frame</span>
919
+ </div>
920
+ <div class="group">
921
+ <span>in <b>0270</b> · out <b>0600</b></span>
922
+ <span><b>Loop</b> / on</span>
923
+ <span>zoom / fit</span>
924
+ </div>
925
+ </div>
926
+ </div>
927
+ </div>
928
+ </div>
929
+ </div>
930
+ </fy-composition>