@clipkit/runtime 1.0.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 (219) hide show
  1. package/LICENSE +54 -0
  2. package/README.md +98 -0
  3. package/dist/animation/easings.d.ts +9 -0
  4. package/dist/animation/easings.d.ts.map +1 -0
  5. package/dist/animation/easings.js +230 -0
  6. package/dist/animation/easings.js.map +1 -0
  7. package/dist/animation/expr.d.ts +44 -0
  8. package/dist/animation/expr.d.ts.map +1 -0
  9. package/dist/animation/expr.js +236 -0
  10. package/dist/animation/expr.js.map +1 -0
  11. package/dist/animation/keyframes.d.ts +23 -0
  12. package/dist/animation/keyframes.d.ts.map +1 -0
  13. package/dist/animation/keyframes.js +117 -0
  14. package/dist/animation/keyframes.js.map +1 -0
  15. package/dist/animation/motion-path.d.ts +18 -0
  16. package/dist/animation/motion-path.d.ts.map +1 -0
  17. package/dist/animation/motion-path.js +269 -0
  18. package/dist/animation/motion-path.js.map +1 -0
  19. package/dist/animation/noise1d.d.ts +5 -0
  20. package/dist/animation/noise1d.d.ts.map +1 -0
  21. package/dist/animation/noise1d.js +27 -0
  22. package/dist/animation/noise1d.js.map +1 -0
  23. package/dist/animation/presets.d.ts +60 -0
  24. package/dist/animation/presets.d.ts.map +1 -0
  25. package/dist/animation/presets.js +221 -0
  26. package/dist/animation/presets.js.map +1 -0
  27. package/dist/assets/cache.d.ts +18 -0
  28. package/dist/assets/cache.d.ts.map +1 -0
  29. package/dist/assets/cache.js +56 -0
  30. package/dist/assets/cache.js.map +1 -0
  31. package/dist/assets/fonts.d.ts +20 -0
  32. package/dist/assets/fonts.d.ts.map +1 -0
  33. package/dist/assets/fonts.js +127 -0
  34. package/dist/assets/fonts.js.map +1 -0
  35. package/dist/assets/loader.d.ts +18 -0
  36. package/dist/assets/loader.d.ts.map +1 -0
  37. package/dist/assets/loader.js +87 -0
  38. package/dist/assets/loader.js.map +1 -0
  39. package/dist/assets/lut.d.ts +5 -0
  40. package/dist/assets/lut.d.ts.map +1 -0
  41. package/dist/assets/lut.js +77 -0
  42. package/dist/assets/lut.js.map +1 -0
  43. package/dist/assets/media-time.d.ts +31 -0
  44. package/dist/assets/media-time.d.ts.map +1 -0
  45. package/dist/assets/media-time.js +65 -0
  46. package/dist/assets/media-time.js.map +1 -0
  47. package/dist/assets/mp4-frame-source.d.ts +44 -0
  48. package/dist/assets/mp4-frame-source.d.ts.map +1 -0
  49. package/dist/assets/mp4-frame-source.js +387 -0
  50. package/dist/assets/mp4-frame-source.js.map +1 -0
  51. package/dist/audio/encoder.d.ts +31 -0
  52. package/dist/audio/encoder.d.ts.map +1 -0
  53. package/dist/audio/encoder.js +96 -0
  54. package/dist/audio/encoder.js.map +1 -0
  55. package/dist/audio/fades.d.ts +16 -0
  56. package/dist/audio/fades.d.ts.map +1 -0
  57. package/dist/audio/fades.js +43 -0
  58. package/dist/audio/fades.js.map +1 -0
  59. package/dist/audio/limiter.d.ts +8 -0
  60. package/dist/audio/limiter.d.ts.map +1 -0
  61. package/dist/audio/limiter.js +39 -0
  62. package/dist/audio/limiter.js.map +1 -0
  63. package/dist/audio/loader.d.ts +6 -0
  64. package/dist/audio/loader.d.ts.map +1 -0
  65. package/dist/audio/loader.js +42 -0
  66. package/dist/audio/loader.js.map +1 -0
  67. package/dist/audio/mixer.d.ts +17 -0
  68. package/dist/audio/mixer.d.ts.map +1 -0
  69. package/dist/audio/mixer.js +204 -0
  70. package/dist/audio/mixer.js.map +1 -0
  71. package/dist/audio/varispeed.d.ts +24 -0
  72. package/dist/audio/varispeed.d.ts.map +1 -0
  73. package/dist/audio/varispeed.js +114 -0
  74. package/dist/audio/varispeed.js.map +1 -0
  75. package/dist/audio/wav.d.ts +6 -0
  76. package/dist/audio/wav.d.ts.map +1 -0
  77. package/dist/audio/wav.js +62 -0
  78. package/dist/audio/wav.js.map +1 -0
  79. package/dist/backend/backend.d.ts +579 -0
  80. package/dist/backend/backend.d.ts.map +1 -0
  81. package/dist/backend/backend.js +17 -0
  82. package/dist/backend/backend.js.map +1 -0
  83. package/dist/backend/webgl-backend.d.ts +97 -0
  84. package/dist/backend/webgl-backend.d.ts.map +1 -0
  85. package/dist/backend/webgl-backend.js +2142 -0
  86. package/dist/backend/webgl-backend.js.map +1 -0
  87. package/dist/backend/webgpu-backend.d.ts +121 -0
  88. package/dist/backend/webgpu-backend.d.ts.map +1 -0
  89. package/dist/backend/webgpu-backend.js +2481 -0
  90. package/dist/backend/webgpu-backend.js.map +1 -0
  91. package/dist/compositor/bitfont.d.ts +8 -0
  92. package/dist/compositor/bitfont.d.ts.map +1 -0
  93. package/dist/compositor/bitfont.js +52 -0
  94. package/dist/compositor/bitfont.js.map +1 -0
  95. package/dist/compositor/camera.d.ts +5 -0
  96. package/dist/compositor/camera.d.ts.map +1 -0
  97. package/dist/compositor/camera.js +114 -0
  98. package/dist/compositor/camera.js.map +1 -0
  99. package/dist/compositor/color.d.ts +26 -0
  100. package/dist/compositor/color.d.ts.map +1 -0
  101. package/dist/compositor/color.js +189 -0
  102. package/dist/compositor/color.js.map +1 -0
  103. package/dist/compositor/element-renderers/caption.d.ts +4 -0
  104. package/dist/compositor/element-renderers/caption.d.ts.map +1 -0
  105. package/dist/compositor/element-renderers/caption.js +376 -0
  106. package/dist/compositor/element-renderers/caption.js.map +1 -0
  107. package/dist/compositor/element-renderers/group.d.ts +12 -0
  108. package/dist/compositor/element-renderers/group.d.ts.map +1 -0
  109. package/dist/compositor/element-renderers/group.js +259 -0
  110. package/dist/compositor/element-renderers/group.js.map +1 -0
  111. package/dist/compositor/element-renderers/image.d.ts +4 -0
  112. package/dist/compositor/element-renderers/image.d.ts.map +1 -0
  113. package/dist/compositor/element-renderers/image.js +97 -0
  114. package/dist/compositor/element-renderers/image.js.map +1 -0
  115. package/dist/compositor/element-renderers/lit.d.ts +6 -0
  116. package/dist/compositor/element-renderers/lit.d.ts.map +1 -0
  117. package/dist/compositor/element-renderers/lit.js +82 -0
  118. package/dist/compositor/element-renderers/lit.js.map +1 -0
  119. package/dist/compositor/element-renderers/particles.d.ts +4 -0
  120. package/dist/compositor/element-renderers/particles.d.ts.map +1 -0
  121. package/dist/compositor/element-renderers/particles.js +212 -0
  122. package/dist/compositor/element-renderers/particles.js.map +1 -0
  123. package/dist/compositor/element-renderers/shape.d.ts +4 -0
  124. package/dist/compositor/element-renderers/shape.d.ts.map +1 -0
  125. package/dist/compositor/element-renderers/shape.js +171 -0
  126. package/dist/compositor/element-renderers/shape.js.map +1 -0
  127. package/dist/compositor/element-renderers/svg.d.ts +4 -0
  128. package/dist/compositor/element-renderers/svg.d.ts.map +1 -0
  129. package/dist/compositor/element-renderers/svg.js +210 -0
  130. package/dist/compositor/element-renderers/svg.js.map +1 -0
  131. package/dist/compositor/element-renderers/text.d.ts +25 -0
  132. package/dist/compositor/element-renderers/text.d.ts.map +1 -0
  133. package/dist/compositor/element-renderers/text.js +1358 -0
  134. package/dist/compositor/element-renderers/text.js.map +1 -0
  135. package/dist/compositor/element-renderers/video.d.ts +12 -0
  136. package/dist/compositor/element-renderers/video.d.ts.map +1 -0
  137. package/dist/compositor/element-renderers/video.js +109 -0
  138. package/dist/compositor/element-renderers/video.js.map +1 -0
  139. package/dist/compositor/fit.d.ts +18 -0
  140. package/dist/compositor/fit.d.ts.map +1 -0
  141. package/dist/compositor/fit.js +106 -0
  142. package/dist/compositor/fit.js.map +1 -0
  143. package/dist/compositor/lighting.d.ts +63 -0
  144. package/dist/compositor/lighting.d.ts.map +1 -0
  145. package/dist/compositor/lighting.js +141 -0
  146. package/dist/compositor/lighting.js.map +1 -0
  147. package/dist/compositor/mat4.d.ts +88 -0
  148. package/dist/compositor/mat4.d.ts.map +1 -0
  149. package/dist/compositor/mat4.js +245 -0
  150. package/dist/compositor/mat4.js.map +1 -0
  151. package/dist/compositor/project.d.ts +24 -0
  152. package/dist/compositor/project.d.ts.map +1 -0
  153. package/dist/compositor/project.js +105 -0
  154. package/dist/compositor/project.js.map +1 -0
  155. package/dist/compositor/render-context.d.ts +194 -0
  156. package/dist/compositor/render-context.d.ts.map +1 -0
  157. package/dist/compositor/render-context.js +10 -0
  158. package/dist/compositor/render-context.js.map +1 -0
  159. package/dist/compositor/resolve.d.ts +80 -0
  160. package/dist/compositor/resolve.d.ts.map +1 -0
  161. package/dist/compositor/resolve.js +276 -0
  162. package/dist/compositor/resolve.js.map +1 -0
  163. package/dist/compositor/scene.d.ts +10 -0
  164. package/dist/compositor/scene.d.ts.map +1 -0
  165. package/dist/compositor/scene.js +658 -0
  166. package/dist/compositor/scene.js.map +1 -0
  167. package/dist/compositor/transform.d.ts +73 -0
  168. package/dist/compositor/transform.d.ts.map +1 -0
  169. package/dist/compositor/transform.js +229 -0
  170. package/dist/compositor/transform.js.map +1 -0
  171. package/dist/compositor/unit.d.ts +27 -0
  172. package/dist/compositor/unit.d.ts.map +1 -0
  173. package/dist/compositor/unit.js +74 -0
  174. package/dist/compositor/unit.js.map +1 -0
  175. package/dist/encoder/exporter.d.ts +95 -0
  176. package/dist/encoder/exporter.d.ts.map +1 -0
  177. package/dist/encoder/exporter.js +341 -0
  178. package/dist/encoder/exporter.js.map +1 -0
  179. package/dist/encoder/index.d.ts +3 -0
  180. package/dist/encoder/index.d.ts.map +1 -0
  181. package/dist/encoder/index.js +2 -0
  182. package/dist/encoder/index.js.map +1 -0
  183. package/dist/index.d.ts +12 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +27 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/logger.d.ts +13 -0
  188. package/dist/logger.d.ts.map +1 -0
  189. package/dist/logger.js +32 -0
  190. package/dist/logger.js.map +1 -0
  191. package/dist/runtime.d.ts +216 -0
  192. package/dist/runtime.d.ts.map +1 -0
  193. package/dist/runtime.js +1012 -0
  194. package/dist/runtime.js.map +1 -0
  195. package/dist/svg/morph.d.ts +6 -0
  196. package/dist/svg/morph.d.ts.map +1 -0
  197. package/dist/svg/morph.js +62 -0
  198. package/dist/svg/morph.js.map +1 -0
  199. package/dist/svg/svg-renderer.d.ts +18 -0
  200. package/dist/svg/svg-renderer.d.ts.map +1 -0
  201. package/dist/svg/svg-renderer.js +142 -0
  202. package/dist/svg/svg-renderer.js.map +1 -0
  203. package/dist/text/caption-chunk.d.ts +17 -0
  204. package/dist/text/caption-chunk.d.ts.map +1 -0
  205. package/dist/text/caption-chunk.js +76 -0
  206. package/dist/text/caption-chunk.js.map +1 -0
  207. package/dist/text/font-atlas.d.ts +63 -0
  208. package/dist/text/font-atlas.d.ts.map +1 -0
  209. package/dist/text/font-atlas.js +225 -0
  210. package/dist/text/font-atlas.js.map +1 -0
  211. package/dist/text/measure.d.ts +38 -0
  212. package/dist/text/measure.d.ts.map +1 -0
  213. package/dist/text/measure.js +164 -0
  214. package/dist/text/measure.js.map +1 -0
  215. package/dist/text/text-animation.d.ts +52 -0
  216. package/dist/text/text-animation.d.ts.map +1 -0
  217. package/dist/text/text-animation.js +133 -0
  218. package/dist/text/text-animation.js.map +1 -0
  219. package/package.json +47 -0
@@ -0,0 +1,376 @@
1
+ // Caption element renderer — word-timed text with kinetic styles.
2
+ //
3
+ // Each word in element.words has its own start/end time. The kinetic style
4
+ // (`tiktok_bounce`, `fade_reveal`, `kinetic_typewriter`, `word_pop`) defines
5
+ // how the word appears and which transform applies during its active window.
6
+ // The active word gets `highlight_color` tint; inactive visible words get
7
+ // `fill_color`.
8
+ //
9
+ // Layout: single line for v1. Wrapping is a follow-up.
10
+ // Characters are drawn via the same font-atlas + textured-quad pipeline as
11
+ // the text renderer — we just stack a per-word transform on top.
12
+ import { parseColorPremultiplied } from '../color.js';
13
+ import { mat4ApplyToPoint, mat4Multiply, mat4PlaneAt, mat4Rotation, quadWorldTransform } from '../mat4.js';
14
+ import { resolveAnchor, resolveLength } from '../unit.js';
15
+ import { resolveTextShadows, paintTextShadows } from './text.js';
16
+ import { applyAnimation, resolve3D } from '../resolve.js';
17
+ import { atlasKey, generateFontAtlas } from '../../text/font-atlas.js';
18
+ import { autoFitFontSize, withFontFallback } from '../../text/measure.js';
19
+ import { chunkCaptionWords, activeCaptionChunk } from '../../text/caption-chunk.js';
20
+ import { applyEasing } from '../../animation/easings.js';
21
+ export function renderCaptionElement(element, ctx) {
22
+ const { canvas, backend } = ctx;
23
+ const allWords = element.words;
24
+ if (!allWords || allWords.length === 0)
25
+ return;
26
+ // Windowing (§ caption.max_length): show only the chunk active at this time.
27
+ // Word times are element-local, so chunk selection uses the element-local time.
28
+ const elementStartT = ctx.timeOffset + numberOr(element.time, 0);
29
+ const localT = ctx.time - elementStartT;
30
+ const chunks = chunkCaptionWords(allWords, element.max_length);
31
+ const words = element.max_length === undefined
32
+ ? allWords
33
+ : (activeCaptionChunk(chunks, localT)?.words ?? []);
34
+ if (words.length === 0)
35
+ return;
36
+ const fontFamily = withFontFallback(String(element.font_family ?? 'sans-serif'));
37
+ const fontWeight = element.font_weight ?? 'bold';
38
+ // font_size accepts: number (px), "auto" (fit to element.width), or
39
+ // a unit string ("Nvh", "Nvw", "N%" — % is canvas height).
40
+ let fontSize;
41
+ if (element.font_size === 'auto') {
42
+ const constraintWidth = element.width !== undefined
43
+ ? resolveLength(element.width, canvas.width, canvas, canvas.width * 0.9)
44
+ : canvas.width * 0.9;
45
+ // Approximate the rendered text by joining words with spaces.
46
+ const joined = words.map((w) => w.text).join(' ');
47
+ fontSize = autoFitFontSize(joined, fontFamily, fontWeight, constraintWidth, 64);
48
+ }
49
+ else if (typeof element.font_size === 'number') {
50
+ fontSize = element.font_size;
51
+ }
52
+ else if (typeof element.font_size === 'string') {
53
+ fontSize = resolveLength(element.font_size, canvas.height, canvas, 64);
54
+ }
55
+ else {
56
+ fontSize = 64;
57
+ }
58
+ // Resolve atlas (cached per family/size/weight).
59
+ const key = atlasKey({ family: fontFamily, size: fontSize, weight: fontWeight });
60
+ let atlas;
61
+ if (ctx.fontAtlases.has(key)) {
62
+ atlas = ctx.fontAtlases.get(key);
63
+ }
64
+ else {
65
+ atlas = generateFontAtlas({ family: fontFamily, size: fontSize, weight: fontWeight }, backend);
66
+ ctx.fontAtlases.set(key, atlas);
67
+ }
68
+ // Position the caption block. Animations can move the element as a whole.
69
+ const localX = applyAnimation(element, 'x', resolveLength(element.x, canvas.width, canvas), ctx);
70
+ const localY = applyAnimation(element, 'y', resolveLength(element.y, canvas.height, canvas), ctx);
71
+ const localRotation = applyAnimation(element, 'rotation', numberOr(element.rotation ?? element.z_rotation, 0), ctx);
72
+ const localOpacity01 = applyAnimation(element, 'opacity', numberOr(element.opacity, 1), ctx);
73
+ // Apply group transform stack: translate pivot to world coords, add
74
+ // ambient rotation, multiply opacity. Same pattern as text.ts —
75
+ // including the CKP/1.0 local-frame + plane-matrix path under 3D.
76
+ const t3d = resolve3D(element, ctx);
77
+ const matrixPath = t3d !== null || !ctx.modelMatrix.aff;
78
+ let x, y, rotation;
79
+ let glyphChain = null;
80
+ if (matrixPath) {
81
+ glyphChain = mat4Multiply(ctx.modelMatrix, mat4PlaneAt(localX, localY, t3d?.z ?? 0, localRotation, t3d?.yRot ?? 0, t3d?.xRot ?? 0));
82
+ x = localX;
83
+ y = localY;
84
+ rotation = 0;
85
+ }
86
+ else {
87
+ [x, y] = mat4ApplyToPoint(ctx.modelMatrix, localX, localY);
88
+ rotation = localRotation + mat4Rotation(ctx.modelMatrix);
89
+ }
90
+ const opacity01 = localOpacity01 * ctx.opacityFactor;
91
+ const xAnchor = resolveAnchor(element.x_anchor);
92
+ const yAnchor = resolveAnchor(element.y_anchor);
93
+ // Wrap words to the element's BOX width — captions must stay inside their box,
94
+ // not run off-screen on one infinite line. Each char's `cursorX` is its pen
95
+ // position relative to its own line's start (0).
96
+ const SPACE_WIDTH = atlas.glyphs.get(' ')?.advance ?? fontSize * 0.3;
97
+ const boxWidth = element.width !== undefined
98
+ ? resolveLength(element.width, canvas.width, canvas, canvas.width * 0.9)
99
+ : canvas.width * 0.9;
100
+ const measure = (text) => {
101
+ let w = 0;
102
+ for (const ch of text)
103
+ w += atlas.glyphs.get(ch)?.advance ?? 0;
104
+ return w;
105
+ };
106
+ // Greedy line-break: a word that would overflow `boxWidth` starts a new line.
107
+ const lines = [];
108
+ {
109
+ let line = [];
110
+ let lineW = 0;
111
+ for (const word of words) {
112
+ const ww = measure(word.text);
113
+ if (line.length > 0 && lineW + SPACE_WIDTH + ww > boxWidth) {
114
+ lines.push(line);
115
+ line = [];
116
+ lineW = 0;
117
+ }
118
+ if (line.length > 0)
119
+ lineW += SPACE_WIDTH;
120
+ line.push(word);
121
+ lineW += ww;
122
+ }
123
+ if (line.length > 0)
124
+ lines.push(line);
125
+ }
126
+ const wordLayouts = [];
127
+ const chars = [];
128
+ const lineWidths = [];
129
+ for (let li = 0; li < lines.length; li++) {
130
+ let cursorX = 0;
131
+ const lineWords = lines[li];
132
+ for (let wi = 0; wi < lineWords.length; wi++) {
133
+ const word = lineWords[wi];
134
+ const wordCursorStart = cursorX;
135
+ const startCharIdx = chars.length;
136
+ for (const ch of word.text) {
137
+ const g = atlas.glyphs.get(ch);
138
+ if (!g)
139
+ continue;
140
+ if (g.width > 0 && g.height > 0) {
141
+ chars.push({ glyphX: g.x, glyphY: g.y, glyphW: g.width, glyphH: g.height, cursorX, offsetX: g.offsetX, offsetY: g.offsetY, lineIndex: li });
142
+ }
143
+ cursorX += g.advance;
144
+ }
145
+ wordLayouts.push({ word, width: cursorX - wordCursorStart, cursorStart: wordCursorStart, charStart: startCharIdx, charCount: chars.length - startCharIdx, lineIndex: li });
146
+ if (wi < lineWords.length - 1)
147
+ cursorX += SPACE_WIDTH;
148
+ }
149
+ lineWidths.push(cursorX);
150
+ }
151
+ const maxLineWidth = lineWidths.length > 0 ? Math.max(...lineWidths) : 0;
152
+ const lineHeight = (atlas.ascent + atlas.descent) * numberOr(element.line_height, 1.2);
153
+ const totalHeight = Math.max(lines.length, 1) * lineHeight;
154
+ // Anchor the BOX (width × stacked lines); align each line within it.
155
+ const blockLeft = x - boxWidth * xAnchor;
156
+ const blockTop = y - totalHeight * yAnchor;
157
+ const alignF = element.text_align === 'left' ? 0 : element.text_align === 'right' ? 1 : 0.5;
158
+ const lineLeft = lineWidths.map((w) => blockLeft + (boxWidth - w) * alignF);
159
+ const lineBaseline = lines.map((_, li) => blockTop + atlas.ascent + li * lineHeight);
160
+ const lineCenterY = lineBaseline.map((b) => b - atlas.ascent + (atlas.ascent + atlas.descent) / 2);
161
+ // Block-level rotation: orbit each glyph's center around (x, y) by
162
+ // the same angle we pass to drawTexturedQuad. Without the orbit
163
+ // step, each letter would spin in place while the baseline stayed
164
+ // horizontal. Same approach as the text renderer; matches
165
+ // composeQuadTransform's CW-in-Y-down convention.
166
+ const rotRad = (rotation * Math.PI) / 180;
167
+ const rotCos = Math.cos(rotRad);
168
+ const rotSin = Math.sin(rotRad);
169
+ const rotateAroundPivot = rotation !== 0;
170
+ // Style + colors.
171
+ const style = element.style ?? 'tiktok_bounce';
172
+ const baseColor = parseColorPremultiplied(typeof element.fill_color === 'string' ? element.fill_color : '#ffffff');
173
+ const highlightColor = parseColorPremultiplied(typeof element.highlight_color === 'string' ? element.highlight_color : '#ffd60a');
174
+ const elementOpacity = Math.max(0, Math.min(1, opacity01));
175
+ // Element-local time. Word.start/end are relative to the element.
176
+ const elementStart = ctx.timeOffset + numberOr(element.time, 0);
177
+ const localTime = ctx.time - elementStart;
178
+ // Shrink-wrapped background behind the caption phrase — sized to the
179
+ // laid-out glyph bounds (totalWidth × the ascent/descent box), not the
180
+ // element box. Opt-in; absent background_color ⇒ byte-identical.
181
+ if (typeof element.background_color === 'string' && maxLineWidth > 0) {
182
+ const bgC = parseColorPremultiplied(element.background_color);
183
+ const padRaw = element.background_padding;
184
+ const padX = Array.isArray(padRaw) ? numberOr(padRaw[0], 0) : numberOr(padRaw, 0);
185
+ const padY = Array.isArray(padRaw) ? numberOr(padRaw[1], 0) : numberOr(padRaw, 0);
186
+ const bgW = maxLineWidth + 2 * padX;
187
+ const bgH = totalHeight + 2 * padY;
188
+ let bgCx = blockLeft + boxWidth / 2;
189
+ let bgCy = blockTop + totalHeight / 2;
190
+ if (rotateAroundPivot) {
191
+ const pdx = bgCx - x;
192
+ const pdy = bgCy - y;
193
+ bgCx = x + pdx * rotCos - pdy * rotSin;
194
+ bgCy = y + pdx * rotSin + pdy * rotCos;
195
+ }
196
+ backend.drawShape({
197
+ cx: bgCx, cy: bgCy, width: bgW, height: bgH, rotation,
198
+ skewX: 0, skewY: 0,
199
+ transform: glyphChain
200
+ ? quadWorldTransform(glyphChain, bgCx, bgCy, bgW, bgH, 0, 0, 0, null)
201
+ : undefined,
202
+ color: [bgC[0] * elementOpacity, bgC[1] * elementOpacity, bgC[2] * elementOpacity, bgC[3] * elementOpacity],
203
+ cornerRadius: numberOr(element.background_border_radius, 0),
204
+ shape: 'rectangle',
205
+ blend: element.blend_mode,
206
+ });
207
+ }
208
+ // Per-glyph text shadows. Two passes when present: pass 0 paints all
209
+ // shadows behind the words, pass 1 the fills (no shadows ⇒ one pass,
210
+ // byte-identical).
211
+ const textShadows = resolveTextShadows(element.text_shadow, elementOpacity);
212
+ const shadowPasses = textShadows.length > 0 ? 2 : 1;
213
+ for (let pass = 0; pass < shadowPasses; pass++) {
214
+ const drawShadowPass = textShadows.length > 0 && pass === 0;
215
+ const drawFillPass = textShadows.length === 0 || pass === 1;
216
+ // Render each word with its kinetic transform.
217
+ for (const wl of wordLayouts) {
218
+ const kinetic = computeKineticTransform(style, wl.word, localTime);
219
+ if (kinetic.opacity <= 0)
220
+ continue;
221
+ // Word's typographic center in screen space (the kinetic transform's anchor).
222
+ const wordCenterX = lineLeft[wl.lineIndex] + wl.cursorStart + wl.width / 2;
223
+ const wordCenterY = lineCenterY[wl.lineIndex];
224
+ // Choose tint color for this word.
225
+ const color = kinetic.highlighted ? highlightColor : baseColor;
226
+ const wordOpacity = elementOpacity * kinetic.opacity;
227
+ const tint = [
228
+ color[0] * wordOpacity,
229
+ color[1] * wordOpacity,
230
+ color[2] * wordOpacity,
231
+ color[3] * wordOpacity,
232
+ ];
233
+ // Render each glyph of this word.
234
+ for (let i = 0; i < wl.charCount; i++) {
235
+ const ch = chars[wl.charStart + i];
236
+ // Absolute quad center before kinetic scale (per the char's wrapped line).
237
+ const baseCx = lineLeft[ch.lineIndex] + ch.cursorX + ch.offsetX + ch.glyphW / 2;
238
+ const baseCy = lineBaseline[ch.lineIndex] + ch.offsetY + ch.glyphH / 2;
239
+ // Apply scale around word center.
240
+ const dx = baseCx - wordCenterX;
241
+ const dy = baseCy - wordCenterY;
242
+ let cellCx = wordCenterX + dx * kinetic.scale;
243
+ let cellCy = wordCenterY + dy * kinetic.scale;
244
+ const cellW = ch.glyphW * kinetic.scale;
245
+ const cellH = ch.glyphH * kinetic.scale;
246
+ // Block-level rotation: orbit the kinetic-scaled cell center
247
+ // around the element pivot.
248
+ if (rotateAroundPivot) {
249
+ const pdx = cellCx - x;
250
+ const pdy = cellCy - y;
251
+ cellCx = x + pdx * rotCos - pdy * rotSin;
252
+ cellCy = y + pdx * rotSin + pdy * rotCos;
253
+ }
254
+ // Tight UVs — no inset needed, AA margin is baked into the atlas bounds.
255
+ const u0 = ch.glyphX / atlas.width;
256
+ const v0 = ch.glyphY / atlas.height;
257
+ const u1 = (ch.glyphX + ch.glyphW) / atlas.width;
258
+ const v1 = (ch.glyphY + ch.glyphH) / atlas.height;
259
+ if (drawShadowPass) {
260
+ paintTextShadows(textShadows, kinetic.opacity, (ox, oy, col) => {
261
+ let scx = wordCenterX + (baseCx + ox - wordCenterX) * kinetic.scale;
262
+ let scy = wordCenterY + (baseCy + oy - wordCenterY) * kinetic.scale;
263
+ if (rotateAroundPivot) {
264
+ const pdx = scx - x, pdy = scy - y;
265
+ scx = x + pdx * rotCos - pdy * rotSin;
266
+ scy = y + pdx * rotSin + pdy * rotCos;
267
+ }
268
+ backend.drawTexturedQuad({
269
+ cx: scx, cy: scy, width: cellW, height: cellH, rotation,
270
+ transform: glyphChain ? quadWorldTransform(glyphChain, scx, scy, cellW, cellH, 0, 0, 0, null) : undefined,
271
+ texture: atlas.texture, uvRect: [u0, v0, u1, v1], tint: col, blend: element.blend_mode,
272
+ });
273
+ });
274
+ }
275
+ if (drawFillPass) {
276
+ backend.drawTexturedQuad({
277
+ cx: cellCx,
278
+ cy: cellCy,
279
+ width: cellW,
280
+ height: cellH,
281
+ rotation,
282
+ transform: glyphChain
283
+ ? quadWorldTransform(glyphChain, cellCx, cellCy, cellW, cellH, 0, 0, 0, null)
284
+ : undefined,
285
+ texture: atlas.texture,
286
+ uvRect: [u0, v0, u1, v1],
287
+ tint,
288
+ blend: element.blend_mode,
289
+ });
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ // ─── Kinetic styles ───────────────────────────────────────────────────────
296
+ function computeKineticTransform(style, word, localTime) {
297
+ const tSinceStart = localTime - word.start;
298
+ const wordDuration = Math.max(0.01, word.end - word.start);
299
+ const beforeStart = tSinceStart < 0;
300
+ const duringWord = tSinceStart >= 0 && tSinceStart <= wordDuration;
301
+ const afterEnd = tSinceStart > wordDuration;
302
+ switch (style) {
303
+ case 'tiktok_bounce':
304
+ return tiktokBounce(tSinceStart, wordDuration, beforeStart, duringWord, afterEnd);
305
+ case 'fade_reveal':
306
+ return fadeReveal(tSinceStart, wordDuration, beforeStart, duringWord, afterEnd);
307
+ case 'kinetic_typewriter':
308
+ return kineticTypewriter(beforeStart, duringWord, afterEnd);
309
+ case 'word_pop':
310
+ return wordPop(tSinceStart, beforeStart, duringWord, afterEnd);
311
+ }
312
+ }
313
+ function tiktokBounce(t, _duration, beforeStart, duringWord, _afterEnd) {
314
+ // Before: invisible. During: scales 0.6 → 1.0 with back ease in 0.15s, holds 1.0.
315
+ // After: stays visible at scale 1.0 (so the caption builds up over time).
316
+ if (beforeStart)
317
+ return { opacity: 0, scale: 1, highlighted: false };
318
+ if (duringWord) {
319
+ const POP = 0.18;
320
+ if (t < POP) {
321
+ const e = applyEasing('ease-out-back', t / POP);
322
+ return { opacity: 1, scale: 0.6 + 0.4 * e, highlighted: true };
323
+ }
324
+ return { opacity: 1, scale: 1, highlighted: true };
325
+ }
326
+ return { opacity: 1, scale: 1, highlighted: false };
327
+ }
328
+ function fadeReveal(t, duration, beforeStart, duringWord, _afterEnd) {
329
+ const FADE = 0.12;
330
+ if (beforeStart) {
331
+ // Begin fade-in just before start.
332
+ if (t > -FADE) {
333
+ const p = (t + FADE) / FADE; // 0..1
334
+ return { opacity: p, scale: 1, highlighted: false };
335
+ }
336
+ return { opacity: 0, scale: 1, highlighted: false };
337
+ }
338
+ if (duringWord)
339
+ return { opacity: 1, scale: 1, highlighted: true };
340
+ // afterEnd: fade out over FADE seconds.
341
+ const sinceEnd = t - duration;
342
+ if (sinceEnd < FADE)
343
+ return { opacity: 1 - sinceEnd / FADE, scale: 1, highlighted: false };
344
+ return { opacity: 0, scale: 1, highlighted: false };
345
+ }
346
+ function kineticTypewriter(beforeStart, duringWord, _afterEnd) {
347
+ // Word appears at its start, stays visible, gets highlighted only while active.
348
+ if (beforeStart)
349
+ return { opacity: 0, scale: 1, highlighted: false };
350
+ return { opacity: 1, scale: 1, highlighted: duringWord };
351
+ }
352
+ function wordPop(t, beforeStart, duringWord, _afterEnd) {
353
+ if (beforeStart)
354
+ return { opacity: 0, scale: 1, highlighted: false };
355
+ if (duringWord) {
356
+ // 1.0 → 1.15 → 1.0 sine pop over first 0.15s.
357
+ const POP = 0.15;
358
+ if (t < POP) {
359
+ const scale = 1 + 0.15 * Math.sin((t / POP) * Math.PI);
360
+ return { opacity: 1, scale, highlighted: true };
361
+ }
362
+ return { opacity: 1, scale: 1, highlighted: true };
363
+ }
364
+ return { opacity: 1, scale: 1, highlighted: false };
365
+ }
366
+ function numberOr(value, fallback) {
367
+ if (typeof value === 'number' && Number.isFinite(value))
368
+ return value;
369
+ if (typeof value === 'string') {
370
+ const n = parseFloat(value);
371
+ if (Number.isFinite(n))
372
+ return n;
373
+ }
374
+ return fallback;
375
+ }
376
+ //# sourceMappingURL=caption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption.js","sourceRoot":"","sources":["../../../src/compositor/element-renderers/caption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GroupElement } from '@clipkit/protocol';
2
+ import type { RenderContext } from '../render-context.js';
3
+ /**
4
+ * Render a group element. Pushes the group's transform / opacity / time
5
+ * scope, then walks children. Stack is restored on return.
6
+ *
7
+ * Layers within a group establish local paint order — children render
8
+ * in descending-layer order (layer 1 on top), just like at the top
9
+ * level.
10
+ */
11
+ export declare function renderGroupElement(el: GroupElement, ctx: RenderContext): void;
12
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/compositor/element-renderers/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAS/D,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM3E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAqO7E"}