frameyard 0.6.0 → 0.8.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 (161) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/GLOSSARY.md +40 -16
  3. package/README.md +64 -55
  4. package/dist/assets/process.js.map +1 -1
  5. package/dist/assets/provenance.js.map +1 -1
  6. package/dist/cli.js +255 -59
  7. package/dist/cli.js.map +1 -1
  8. package/dist/composition/attributes.d.ts.map +1 -1
  9. package/dist/composition/descriptor.d.ts +17 -3
  10. package/dist/composition/descriptor.d.ts.map +1 -1
  11. package/dist/composition/descriptor.js +51 -28
  12. package/dist/composition/descriptor.js.map +1 -1
  13. package/dist/composition/diagnostics.js.map +1 -1
  14. package/dist/composition/format.d.ts +12 -0
  15. package/dist/composition/format.d.ts.map +1 -0
  16. package/dist/composition/format.js +28 -0
  17. package/dist/composition/format.js.map +1 -0
  18. package/dist/composition/index.d.ts +2 -1
  19. package/dist/composition/index.d.ts.map +1 -1
  20. package/dist/composition/index.js +1 -0
  21. package/dist/composition/index.js.map +1 -1
  22. package/dist/contracts.d.ts +55 -6
  23. package/dist/contracts.d.ts.map +1 -1
  24. package/dist/contracts.js +3 -0
  25. package/dist/contracts.js.map +1 -1
  26. package/dist/doctor.d.ts.map +1 -1
  27. package/dist/doctor.js +79 -0
  28. package/dist/doctor.js.map +1 -1
  29. package/dist/errors.d.ts +1 -1
  30. package/dist/errors.d.ts.map +1 -1
  31. package/dist/errors.js.map +1 -1
  32. package/dist/html/document-adapter.d.ts +3 -3
  33. package/dist/html/document-adapter.d.ts.map +1 -1
  34. package/dist/html/document-adapter.js +1 -1
  35. package/dist/html/document-adapter.js.map +1 -1
  36. package/dist/html/index.d.ts +1 -1
  37. package/dist/html/index.d.ts.map +1 -1
  38. package/dist/html/parse.d.ts +10 -2
  39. package/dist/html/parse.d.ts.map +1 -1
  40. package/dist/html/parse.js +14 -5
  41. package/dist/html/parse.js.map +1 -1
  42. package/dist/html/validate.d.ts +12 -1
  43. package/dist/html/validate.d.ts.map +1 -1
  44. package/dist/html/validate.js +233 -61
  45. package/dist/html/validate.js.map +1 -1
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +2 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/preview/main.d.ts +2 -2
  51. package/dist/preview/main.d.ts.map +1 -1
  52. package/dist/preview/main.js +47 -19
  53. package/dist/preview/main.js.map +1 -1
  54. package/dist/preview/timeline-data.d.ts +5 -1
  55. package/dist/preview/timeline-data.d.ts.map +1 -1
  56. package/dist/preview/timeline-host.d.ts +2 -0
  57. package/dist/preview/timeline-host.d.ts.map +1 -1
  58. package/dist/preview/timeline-host.js +31 -10
  59. package/dist/preview/timeline-host.js.map +1 -1
  60. package/dist/preview/timeline-main.js +12 -7
  61. package/dist/preview/timeline-main.js.map +1 -1
  62. package/dist/project.d.ts +3 -5
  63. package/dist/project.d.ts.map +1 -1
  64. package/dist/project.js.map +1 -1
  65. package/dist/renderer/browser.d.ts +2 -2
  66. package/dist/renderer/browser.d.ts.map +1 -1
  67. package/dist/renderer/browser.js +10 -4
  68. package/dist/renderer/browser.js.map +1 -1
  69. package/dist/renderer/ffmpeg.d.ts +69 -2
  70. package/dist/renderer/ffmpeg.d.ts.map +1 -1
  71. package/dist/renderer/ffmpeg.js +381 -69
  72. package/dist/renderer/ffmpeg.js.map +1 -1
  73. package/dist/renderer/index.d.ts +66 -5
  74. package/dist/renderer/index.d.ts.map +1 -1
  75. package/dist/renderer/index.js +226 -51
  76. package/dist/renderer/index.js.map +1 -1
  77. package/dist/renderer/timeline.d.ts +41 -4
  78. package/dist/renderer/timeline.d.ts.map +1 -1
  79. package/dist/renderer/timeline.js +242 -39
  80. package/dist/renderer/timeline.js.map +1 -1
  81. package/dist/runtime/host.d.ts.map +1 -1
  82. package/dist/runtime/host.js +155 -31
  83. package/dist/runtime/host.js.map +1 -1
  84. package/dist/runtime/media.d.ts.map +1 -1
  85. package/dist/runtime/media.js +3 -6
  86. package/dist/runtime/media.js.map +1 -1
  87. package/dist/runtime/video.d.ts +13 -0
  88. package/dist/runtime/video.d.ts.map +1 -0
  89. package/dist/runtime/video.js +41 -0
  90. package/dist/runtime/video.js.map +1 -0
  91. package/dist/scaffold.d.ts.map +1 -1
  92. package/dist/scaffold.js +107 -103
  93. package/dist/scaffold.js.map +1 -1
  94. package/dist/server/composition-html.d.ts +13 -7
  95. package/dist/server/composition-html.d.ts.map +1 -1
  96. package/dist/server/composition-html.js +65 -16
  97. package/dist/server/composition-html.js.map +1 -1
  98. package/dist/server/preview-html.js +1 -1
  99. package/dist/server/server.d.ts.map +1 -1
  100. package/dist/server/server.js +26 -6
  101. package/dist/server/server.js.map +1 -1
  102. package/dist/server/timeline-preview-data.d.ts.map +1 -1
  103. package/dist/server/timeline-preview-data.js +11 -0
  104. package/dist/server/timeline-preview-data.js.map +1 -1
  105. package/dist/server/timeline-preview-html.d.ts.map +1 -1
  106. package/dist/server/timeline-preview-html.js +2 -1
  107. package/dist/server/timeline-preview-html.js.map +1 -1
  108. package/dist/timeline/plan.js.map +1 -1
  109. package/dist/timeline/resolve.d.ts +4 -3
  110. package/dist/timeline/resolve.d.ts.map +1 -1
  111. package/dist/timeline/resolve.js +14 -4
  112. package/dist/timeline/resolve.js.map +1 -1
  113. package/dist/timeline/schema.d.ts +7 -0
  114. package/dist/timeline/schema.d.ts.map +1 -1
  115. package/dist/timeline/schema.js +50 -0
  116. package/dist/timeline/schema.js.map +1 -1
  117. package/dist/transcript.js.map +1 -1
  118. package/dist/version.d.ts +1 -1
  119. package/dist/version.js +1 -1
  120. package/docs/adr/0007-make-html-documents-the-composition-unit.md +1 -1
  121. package/docs/adr/0008-share-the-composition-document-grammar.md +1 -1
  122. package/docs/adr/0011-compose-timeline-frames-in-a-live-browser-host.md +1 -1
  123. package/docs/adr/0012-render-timelines-with-segmented-lossless-clip-intermediates.md +1 -1
  124. package/docs/adr/0013-capture-bounded-multi-frame-stills-for-inspection.md +33 -0
  125. package/docs/adr/0014-compose-timeline-clips-with-css-blend-modes.md +37 -0
  126. package/docs/adr/0015-inherit-composition-format-from-the-project.md +28 -0
  127. package/docs/adr/0016-author-compositions-as-html-fragments.md +32 -0
  128. package/docs/adr/0017-render-timeless-compositions-as-stills.md +99 -0
  129. package/docs/migration-0.4.md +3 -1
  130. package/docs/migration-0.8.md +163 -0
  131. package/docs/preview-testing.md +60 -0
  132. package/docs/v0.1-design.md +52 -42
  133. package/examples/blend/README.md +106 -0
  134. package/examples/blend/assets/ink.mp4 +0 -0
  135. package/examples/blend/compositions/aurora.html +55 -0
  136. package/examples/blend/compositions/backdrop.html +74 -0
  137. package/examples/blend/compositions/labels.html +149 -0
  138. package/examples/blend/scripts/make-ink.sh +26 -0
  139. package/examples/blend/timelines/blend.timeline.json +155 -0
  140. package/examples/blend/video.config.js +11 -0
  141. package/examples/demo/compositions/demo.html +243 -251
  142. package/examples/static/README.md +17 -0
  143. package/examples/static/compositions/still.html +37 -0
  144. package/examples/static/timelines/still.timeline.json +13 -0
  145. package/examples/static/video.config.js +9 -0
  146. package/examples/video/compositions/video-mp4.html +349 -357
  147. package/examples/video/compositions/video-overlay.html +337 -345
  148. package/examples/video/compositions/video.html +349 -357
  149. package/examples/webgl/compositions/webgl.html +205 -213
  150. package/package.json +6 -3
  151. package/skills/frameyard/README.md +7 -5
  152. package/skills/frameyard/SKILL.md +17 -13
  153. package/skills/frameyard/references/common-mistakes.md +30 -6
  154. package/skills/frameyard/references/controllers.md +5 -4
  155. package/skills/frameyard/references/deterministic-authoring.md +42 -36
  156. package/skills/frameyard/references/diagnostics.md +11 -3
  157. package/skills/frameyard/references/failure-recovery.md +28 -7
  158. package/skills/frameyard/references/json-results.md +58 -7
  159. package/skills/frameyard/references/subtitles-karaoke.md +2 -2
  160. package/skills/frameyard/references/timelines.md +21 -15
  161. package/skills/frameyard/scripts/frameyard.mjs +20 -3
@@ -0,0 +1,149 @@
1
+ <style>
2
+ html,
3
+ body,
4
+ fy-composition {
5
+ margin: 0;
6
+ width: 100%;
7
+ height: 100%;
8
+ background: transparent;
9
+ }
10
+ fy-composition {
11
+ display: block;
12
+ overflow: hidden;
13
+ }
14
+ .scene {
15
+ position: relative;
16
+ width: 100%;
17
+ height: 100%;
18
+ overflow: hidden;
19
+ color: #eef4ff;
20
+ font-family: Inter, "Helvetica Neue", ui-sans-serif, system-ui, sans-serif;
21
+ }
22
+ .panel {
23
+ position: absolute;
24
+ left: 92px;
25
+ top: 96px;
26
+ width: 920px;
27
+ padding: 44px 46px 40px;
28
+ border: 1px solid rgba(160, 205, 255, 0.24);
29
+ border-radius: 22px;
30
+ background: linear-gradient(135deg, rgba(6, 12, 24, 0.91), rgba(6, 12, 24, 0.64));
31
+ box-shadow: 0 38px 110px rgba(0, 0, 0, 0.38);
32
+ }
33
+ .kicker {
34
+ color: #7fd6ff;
35
+ font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", monospace;
36
+ font-size: 13px;
37
+ font-weight: 650;
38
+ letter-spacing: 0.22em;
39
+ text-transform: uppercase;
40
+ }
41
+ h1 {
42
+ margin: 18px 0 14px;
43
+ font-size: 78px;
44
+ font-weight: 680;
45
+ letter-spacing: -0.045em;
46
+ line-height: 0.95;
47
+ }
48
+ h1 span {
49
+ color: #ffb347;
50
+ }
51
+ .subtitle {
52
+ margin: 0;
53
+ max-width: 780px;
54
+ color: #a9b8d0;
55
+ font-size: 20px;
56
+ line-height: 1.4;
57
+ }
58
+ .modes {
59
+ display: grid;
60
+ grid-template-columns: repeat(4, minmax(0, 1fr));
61
+ gap: 14px 18px;
62
+ margin-top: 28px;
63
+ }
64
+ .modes div {
65
+ padding-top: 9px;
66
+ border-top: 2px solid rgba(127, 214, 255, 0.5);
67
+ }
68
+ .modes div:nth-child(4n + 2) {
69
+ border-top-color: rgba(255, 179, 71, 0.5);
70
+ }
71
+ .modes div:nth-child(4n + 3) {
72
+ border-top-color: rgba(255, 100, 180, 0.5);
73
+ }
74
+ .modes div:nth-child(4n + 4) {
75
+ border-top-color: rgba(160, 190, 255, 0.5);
76
+ }
77
+ .modes b {
78
+ display: block;
79
+ margin-bottom: 5px;
80
+ color: #eef4ff;
81
+ font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", monospace;
82
+ font-size: 15px;
83
+ font-weight: 600;
84
+ letter-spacing: -0.01em;
85
+ }
86
+ .modes span {
87
+ display: block;
88
+ color: #7f90a8;
89
+ font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", monospace;
90
+ font-size: 11px;
91
+ }
92
+ .foot {
93
+ margin-top: 26px;
94
+ color: #73839a;
95
+ font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", monospace;
96
+ font-size: 12px;
97
+ line-height: 1.55;
98
+ letter-spacing: 0.03em;
99
+ }
100
+ .progress {
101
+ position: absolute;
102
+ left: 142px;
103
+ bottom: 92px;
104
+ width: 820px;
105
+ height: 3px;
106
+ overflow: hidden;
107
+ border-radius: 99px;
108
+ background: rgba(220, 235, 255, 0.16);
109
+ }
110
+ .progress::after {
111
+ content: "";
112
+ display: block;
113
+ width: calc(var(--fy-progress) * 100%);
114
+ height: 100%;
115
+ border-radius: inherit;
116
+ background: linear-gradient(90deg, #7fd6ff, #ffb347);
117
+ }
118
+ </style>
119
+ <fy-composition width="1920" height="1080" fps="30" duration-in-frames="360">
120
+ <div class="scene">
121
+ <div class="panel">
122
+ <div class="kicker">Frameyard / Blend lab</div>
123
+ <h1>12 modes.<br /><span>One timeline.</span></h1>
124
+ <p class="subtitle">
125
+ A composition stays on screen while the video clip cycles through every supported CSS blend mode, one second
126
+ each.
127
+ </p>
128
+ <div class="modes">
129
+ <div><b>normal</b><span>0–1s</span></div>
130
+ <div><b>multiply</b><span>1–2s</span></div>
131
+ <div><b>screen</b><span>2–3s</span></div>
132
+ <div><b>overlay</b><span>3–4s</span></div>
133
+ <div><b>darken</b><span>4–5s</span></div>
134
+ <div><b>lighten</b><span>5–6s</span></div>
135
+ <div><b>color-dodge</b><span>6–7s</span></div>
136
+ <div><b>color-burn</b><span>7–8s</span></div>
137
+ <div><b>hard-light</b><span>8–9s</span></div>
138
+ <div><b>soft-light</b><span>9–10s</span></div>
139
+ <div><b>difference</b><span>10–11s</span></div>
140
+ <div><b>exclusion</b><span>11–12s</span></div>
141
+ </div>
142
+ <div class="foot">
143
+ v2 · composition · screen · 0–12s<br />
144
+ v3 · video · 12 modes · 1s each · Preview uses CSS; render uses FFmpeg + alpha mask
145
+ </div>
146
+ </div>
147
+ <div class="progress"></div>
148
+ </div>
149
+ </fy-composition>
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
+ out="${1:-$root/assets/ink.mp4}"
6
+ mkdir -p "$(dirname "$out")"
7
+
8
+ ffmpeg -y -v error \
9
+ -f lavfi \
10
+ -i "gradients=size=1280x720:rate=30:c0=0x0b1020:c1=0x1b4dff:c2=0xff2d7a:c3=0xffb347:n=4:type=spiral:speed=0.08:duration=12" \
11
+ -f lavfi \
12
+ -i "anullsrc=channel_layout=stereo:sample_rate=48000" \
13
+ -t 12 \
14
+ -map 0:v:0 \
15
+ -map 1:a:0 \
16
+ -c:v libx264 \
17
+ -preset medium \
18
+ -crf 20 \
19
+ -pix_fmt yuv420p \
20
+ -g 30 \
21
+ -c:a aac \
22
+ -b:a 96k \
23
+ -shortest \
24
+ "$out"
25
+
26
+ printf 'Wrote %s\n' "$out"
@@ -0,0 +1,155 @@
1
+ {
2
+ "version": 1,
3
+ "name": "Blend lab: every supported mode on a video clip",
4
+ "background": "#05070d",
5
+ "tracks": [
6
+ { "id": "v1", "kind": "video", "name": "Backdrop" },
7
+ { "id": "v2", "kind": "video", "name": "Aurora · screen" },
8
+ { "id": "v3", "kind": "video", "name": "Video · 12 modes, one per second" },
9
+ { "id": "v4", "kind": "video", "name": "Labels" }
10
+ ],
11
+ "clips": [
12
+ {
13
+ "id": "backdrop",
14
+ "track": "v1",
15
+ "source": { "kind": "composition", "id": "backdrop" },
16
+ "start": 0,
17
+ "duration": 360
18
+ },
19
+ {
20
+ "id": "aurora",
21
+ "track": "v2",
22
+ "source": { "kind": "composition", "id": "aurora" },
23
+ "start": 0,
24
+ "duration": 360,
25
+ "blend": "screen"
26
+ },
27
+ {
28
+ "id": "ink-normal",
29
+ "track": "v3",
30
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
31
+ "start": 0,
32
+ "duration": 30,
33
+ "sourceIn": 0,
34
+ "blend": "normal",
35
+ "audio": { "muted": true }
36
+ },
37
+ {
38
+ "id": "ink-multiply",
39
+ "track": "v3",
40
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
41
+ "start": 30,
42
+ "duration": 30,
43
+ "sourceIn": 30,
44
+ "blend": "multiply",
45
+ "audio": { "muted": true }
46
+ },
47
+ {
48
+ "id": "ink-screen",
49
+ "track": "v3",
50
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
51
+ "start": 60,
52
+ "duration": 30,
53
+ "sourceIn": 60,
54
+ "blend": "screen",
55
+ "audio": { "muted": true }
56
+ },
57
+ {
58
+ "id": "ink-overlay",
59
+ "track": "v3",
60
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
61
+ "start": 90,
62
+ "duration": 30,
63
+ "sourceIn": 90,
64
+ "blend": "overlay",
65
+ "audio": { "muted": true }
66
+ },
67
+ {
68
+ "id": "ink-darken",
69
+ "track": "v3",
70
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
71
+ "start": 120,
72
+ "duration": 30,
73
+ "sourceIn": 120,
74
+ "blend": "darken",
75
+ "audio": { "muted": true }
76
+ },
77
+ {
78
+ "id": "ink-lighten",
79
+ "track": "v3",
80
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
81
+ "start": 150,
82
+ "duration": 30,
83
+ "sourceIn": 150,
84
+ "blend": "lighten",
85
+ "audio": { "muted": true }
86
+ },
87
+ {
88
+ "id": "ink-color-dodge",
89
+ "track": "v3",
90
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
91
+ "start": 180,
92
+ "duration": 30,
93
+ "sourceIn": 180,
94
+ "blend": "color-dodge",
95
+ "audio": { "muted": true }
96
+ },
97
+ {
98
+ "id": "ink-color-burn",
99
+ "track": "v3",
100
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
101
+ "start": 210,
102
+ "duration": 30,
103
+ "sourceIn": 210,
104
+ "blend": "color-burn",
105
+ "audio": { "muted": true }
106
+ },
107
+ {
108
+ "id": "ink-hard-light",
109
+ "track": "v3",
110
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
111
+ "start": 240,
112
+ "duration": 30,
113
+ "sourceIn": 240,
114
+ "blend": "hard-light",
115
+ "audio": { "muted": true }
116
+ },
117
+ {
118
+ "id": "ink-soft-light",
119
+ "track": "v3",
120
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
121
+ "start": 270,
122
+ "duration": 30,
123
+ "sourceIn": 270,
124
+ "blend": "soft-light",
125
+ "audio": { "muted": true }
126
+ },
127
+ {
128
+ "id": "ink-difference",
129
+ "track": "v3",
130
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
131
+ "start": 300,
132
+ "duration": 30,
133
+ "sourceIn": 300,
134
+ "blend": "difference",
135
+ "audio": { "muted": true }
136
+ },
137
+ {
138
+ "id": "ink-exclusion",
139
+ "track": "v3",
140
+ "source": { "kind": "video", "src": "assets/ink.mp4" },
141
+ "start": 330,
142
+ "duration": 30,
143
+ "sourceIn": 330,
144
+ "blend": "exclusion",
145
+ "audio": { "muted": true }
146
+ },
147
+ {
148
+ "id": "labels",
149
+ "track": "v4",
150
+ "source": { "kind": "composition", "id": "labels" },
151
+ "start": 0,
152
+ "duration": 360
153
+ }
154
+ ]
155
+ }
@@ -0,0 +1,11 @@
1
+ export default {
2
+ format: { width: 1920, height: 1080, fps: 30 },
3
+ compositions: {
4
+ backdrop: "./compositions/backdrop.html",
5
+ aurora: "./compositions/aurora.html",
6
+ labels: "./compositions/labels.html",
7
+ },
8
+ timelines: {
9
+ "blend-timeline": "./timelines/blend.timeline.json",
10
+ },
11
+ };