@dnyantra/dtly 0.2.2 → 0.3.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 (77) hide show
  1. package/README.md +16 -3
  2. package/dist/cli.js +33 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/anim.js +20 -0
  5. package/dist/core/anim.js.map +1 -1
  6. package/dist/core/captions.d.ts +13 -0
  7. package/dist/core/captions.js +57 -0
  8. package/dist/core/captions.js.map +1 -0
  9. package/dist/core/geo.d.ts +13 -0
  10. package/dist/core/geo.js +41 -0
  11. package/dist/core/geo.js.map +1 -0
  12. package/dist/core/model.d.ts +112 -9
  13. package/dist/core/model.js.map +1 -1
  14. package/dist/core/path.d.ts +35 -0
  15. package/dist/core/path.js +324 -0
  16. package/dist/core/path.js.map +1 -0
  17. package/dist/core/svg.d.ts +22 -0
  18. package/dist/core/svg.js +217 -0
  19. package/dist/core/svg.js.map +1 -0
  20. package/dist/core/text.d.ts +3 -1
  21. package/dist/core/text.js +49 -3
  22. package/dist/core/text.js.map +1 -1
  23. package/dist/mcp/server.js +28 -1
  24. package/dist/mcp/server.js.map +1 -1
  25. package/dist/ops/ops.d.ts +7 -0
  26. package/dist/ops/ops.js +11 -1
  27. package/dist/ops/ops.js.map +1 -1
  28. package/dist/presets/app.d.ts +2 -0
  29. package/dist/presets/app.js +82 -0
  30. package/dist/presets/app.js.map +1 -0
  31. package/dist/presets/captions.d.ts +2 -0
  32. package/dist/presets/captions.js +48 -0
  33. package/dist/presets/captions.js.map +1 -0
  34. package/dist/presets/charts.d.ts +2 -0
  35. package/dist/presets/charts.js +162 -0
  36. package/dist/presets/charts.js.map +1 -0
  37. package/dist/presets/index.d.ts +1 -1
  38. package/dist/presets/index.js +62 -1
  39. package/dist/presets/index.js.map +1 -1
  40. package/dist/presets/maps.d.ts +2 -0
  41. package/dist/presets/maps.js +79 -0
  42. package/dist/presets/maps.js.map +1 -0
  43. package/dist/render/fx.d.ts +11 -0
  44. package/dist/render/fx.js +87 -0
  45. package/dist/render/fx.js.map +1 -0
  46. package/dist/render/grade.d.ts +20 -0
  47. package/dist/render/grade.js +178 -0
  48. package/dist/render/grade.js.map +1 -0
  49. package/dist/render/lottie.d.ts +36 -0
  50. package/dist/render/lottie.js +523 -0
  51. package/dist/render/lottie.js.map +1 -0
  52. package/dist/render/node-host.d.ts +1 -0
  53. package/dist/render/node-host.js +15 -4
  54. package/dist/render/node-host.js.map +1 -1
  55. package/dist/render/perspective.d.ts +5 -0
  56. package/dist/render/perspective.js +71 -0
  57. package/dist/render/perspective.js.map +1 -0
  58. package/dist/render/renderer.d.ts +6 -0
  59. package/dist/render/renderer.js +156 -95
  60. package/dist/render/renderer.js.map +1 -1
  61. package/dist/render/shapes.d.ts +6 -0
  62. package/dist/render/shapes.js +129 -0
  63. package/dist/render/shapes.js.map +1 -0
  64. package/dist/render/tiles.d.ts +11 -0
  65. package/dist/render/tiles.js +42 -0
  66. package/dist/render/tiles.js.map +1 -0
  67. package/dist/render/transcribe.d.ts +14 -0
  68. package/dist/render/transcribe.js +55 -0
  69. package/dist/render/transcribe.js.map +1 -0
  70. package/dist/studio/server.js +14 -1
  71. package/dist/studio/server.js.map +1 -1
  72. package/dist/studio-app/app.js +5 -4
  73. package/dist/studio-app/app.js.map +4 -4
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +1 -1
  76. package/package.json +1 -1
  77. package/plugin/skills/moti/SKILL.md +23 -3
package/README.md CHANGED
@@ -12,12 +12,19 @@ they make.
12
12
 
13
13
  ![Starter projects](docs/starters.png)
14
14
 
15
+ - **Explainers & logos** — SVG import as editable shapes, curved paths, shape morphing, repeaters, stars, gradients, and Lottie animations as layers.
16
+ - **Infographics** — counters (with ₹ and lakh/crore formatting), bar, line, donut and progress charts.
17
+ - **App promos** — phone mockups with true-perspective 3D tilt, corner pin, cursor and tap overlays.
18
+ - **Stylised looks** — glitch, RGB split, wave, light leaks; glitch, RGB-whip, warp and flash transitions.
19
+ - **Colour grading** — curves, colour wheels, exposure, temperature, vignette, 3D LUTs (.cube) and adjustment layers.
20
+ - **Captions** — word-highlight captions from SRT/VTT or automatic transcription (Sarvam AI, Indian languages).
21
+ - **Maps** — animated routes from coordinates with pins, labels and distance, over a stitched map background.
15
22
  - **Fine-grained animation** — any property can be keyframed with AE-style eases, bezier curves or physical springs; `wiggle` included.
16
23
  - **Text animators** — per grapheme, word or line, with stagger, order, blur, tracking, colour and masked line reveals. Indian scripts (Devanagari etc.) keep their conjuncts while animating.
17
24
  - **Presets** — kinetic typography, logo openers, colour-bar openers, slideshows with Ken Burns, push/whip/wipe/zoom transitions, lower thirds, highlight plates. Presets write ordinary layers, so everything stays editable.
18
25
  - **Media** — video, image and audio layers, volume keyframes, music mixing.
19
26
  - **Studio** — a browser preview and After Effects-style timeline editor that stays in sync with agents.
20
- - **Agent-native** — 23 MCP tools plus **moti**, a skill that turns your agent into a motion designer.
27
+ - **Agent-native** — 26 MCP tools plus **moti**, a skill that turns your agent into a motion designer.
21
28
  - **No browser, no lock-in** — renders with skia-canvas and FFmpeg. MIT licensed.
22
29
 
23
30
  ## Install
@@ -118,6 +125,9 @@ dtly init <project.json> [--starter opener|kinetic|bars] [--title "Text"]
118
125
  dtly render <project.json> <out.mp4> [--from s] [--to s] [--comp id] [--workers n]
119
126
  dtly still <project.json> <time> <out.png> [--scale 0.5]
120
127
  dtly sheet <project.json> <out.png> <t1,t2,...>
128
+ dtly import-svg <project.json> <file.svg> [--width 600] [--at x,y]
129
+ dtly captions <project.json> <audio|video|.srt|.vtt|.json> [--lang mr-IN]
130
+ dtly map-tiles <out.png> --tiles <url> --route "lat,lon;lat,lon" [--attribution "…"]
121
131
  dtly studio <project.json> [--port 4400] [--no-open]
122
132
  dtly presets
123
133
  dtly mcp
@@ -161,7 +171,10 @@ Installing the package also gives you the `dtly` command.
161
171
  | Masks / track mattes | `masks: [...]`, `matte: {layer, mode}` |
162
172
  | Trim paths | shape `trim: {start, end}` |
163
173
  | Text animators | `animators: [{unit, stagger, duration, ease, from: {...}, clip, mode}]` |
164
- | Effects | `blur`, `dropShadow`, `glow`, `fill`, `brightness`, `saturate`, `contrast` |
174
+ | Effects | `blur`, `dropShadow`, `glow`, `fill`, `brightness`, `saturate`, `contrast`, `tilt`, `cornerPin`, `rgbSplit`, `glitch`, `wave`, `curves`, `colorBalance`, `exposure`, `temperature`, `vignette`, `lut` |
175
+ | Adjustment layer | `type: "adjustment"` |
176
+ | Shape morphing / repeater | keyframe `path`; `repeater` |
177
+ | Footage (Lottie) | `type: "lottie"` |
165
178
  | Motion blur | `motionBlur: {samples, shutter}` |
166
179
 
167
180
  Layer index 0 is the top of the stack, as in After Effects. See
@@ -184,7 +197,7 @@ Opening Claude Code in the repo loads the local MCP server (`.mcp.json`) and the
184
197
  - Studio: graph editor, drag-to-reorder layers, multi-select, media import by drag and drop
185
198
  - Faster rendering: layer-bounds buffers, caching finished layers
186
199
  - Templates with brand kits and media slots for fixed 30/60 s videos
187
- - More AE features: 3D layers and camera, repeaters, path morphing, LUTs
200
+ - Templates with media slots; audio-reactive animation; beat-synced cuts
188
201
 
189
202
  ## License
190
203
 
package/dist/cli.js CHANGED
@@ -3,9 +3,10 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { installSkill, MCP_SETUP, setupGuide, skillTargets } from './agents.js';
6
- import { listPresets } from './presets/index.js';
6
+ import { listPresets, PRESETS } from './presets/index.js';
7
7
  import { renderContactSheet, renderStill, renderVideo, renderVideoParallel } from './render/export.js';
8
- import { writeProject } from './ops/store.js';
8
+ import { editProject, writeProject } from './ops/store.js';
9
+ import { addSvg } from './ops/ops.js';
9
10
  import { STARTERS } from './starter.js';
10
11
  import { BRAND, VERSION } from './version.js';
11
12
  const [cmd, ...rest] = process.argv.slice(2);
@@ -16,7 +17,13 @@ After Effects-style motion graphics as JSON, rendered to MP4.
16
17
  dtly render <project.json> <out.mp4> [--from s] [--to s] [--comp id] [--workers n]
17
18
  dtly still <project.json> <time> <out.png> [--scale 0.5] [--comp id]
18
19
  dtly sheet <project.json> <out.png> <t1,t2,...> [--comp id]
19
- dtly presets list text animators, openers, slides, transitions
20
+ dtly import-svg <project.json> <file.svg> [--width 600] [--at x,y] [--name logo] [--color #hex] [--comp id]
21
+ add an SVG as editable shape layers
22
+ dtly captions <project.json> <audio|video|.srt|.vtt|.json> [--lang mr-IN] [--words 4] [--y px] [--highlight #hex] [--offset s] [--uppercase]
23
+ word-highlight captions (audio/video is transcribed with Sarvam; needs SARVAM_API_KEY)
24
+ dtly map-tiles <out.png> --tiles <url with {z}/{x}/{y}> (--route "lat,lon;lat,lon" | --bounds latN,lonW,latS,lonE) [--size 1080x1920] [--attribution "© OpenStreetMap"]
25
+ stitch a map background for map.route (you choose the provider and its licence)
26
+ dtly presets list text animators, openers, slides, transitions, charts, captions, maps
20
27
  dtly studio <project.json> [--port 4400] [--no-open] browser preview + timeline editor
21
28
  dtly mcp run the MCP server (stdio) for AI agents
22
29
  dtly setup <agent> how to add DT.ly to claude, codex, cursor, gemini, copilot, windsurf
@@ -58,6 +65,29 @@ try {
58
65
  writeProject(rest[0], starter.build(flag('title') ?? 'DT.ly'));
59
66
  console.log(`Created ${rest[0]} (${starter.description})\nNext: dtly render ${rest[0]} ${rest[0].replace(/\.json$/, '')}.mp4`);
60
67
  }
68
+ else if (cmd === 'import-svg' && rest[1]) {
69
+ const at = flag('at')?.split(',').map(Number);
70
+ const r = editProject(rest[0], (p) => addSvg(p, flag('comp'), fs.readFileSync(rest[1], 'utf8'), { name: flag('name') ?? path.basename(rest[1], '.svg'), width: num(flag('width')), position: at, color: flag('color') }));
71
+ console.log(`Added "${r.group}" with ${r.parts} shape layers (${Math.round(r.size[0])}×${Math.round(r.size[1])} px). Animate the group layer, or each part.`);
72
+ }
73
+ else if (cmd === 'captions' && rest[1]) {
74
+ const { loadCaptions } = await import('./render/transcribe.js');
75
+ const src = await loadCaptions(rest[1], flag('lang'));
76
+ const y = num(flag('y'));
77
+ const r = editProject(rest[0], (p) => PRESETS['captions.add'].apply(p, flag('comp'), { ...src, maxWords: num(flag('words')), highlight: flag('highlight'), offset: num(flag('offset')), uppercase: rest.includes('--uppercase'), ...(y ? { position: [p.comps.find((c) => c.id === (flag('comp') ?? p.root)).width / 2, y] } : {}) }));
78
+ console.log(`Added ${r.created.length} caption layers. ${r.note ?? ''}`);
79
+ }
80
+ else if (cmd === 'map-tiles' && rest[0]) {
81
+ const { stitchMap } = await import('./render/tiles.js');
82
+ const tiles = flag('tiles');
83
+ if (!tiles)
84
+ throw new Error('--tiles <url template> is required, e.g. https://api.maptiler.com/maps/streets/256/{z}/{x}/{y}.png?key=KEY');
85
+ const [w, h] = (flag('size') ?? '1080x1920').split('x').map(Number);
86
+ const route = flag('route')?.split(';').map((p) => p.split(',').map(Number));
87
+ const b = flag('bounds')?.split(',').map(Number);
88
+ const view = await stitchMap(rest[0], { tiles, route, bounds: b ? [[b[0], b[1]], [b[2], b[3]]] : undefined, size: [w, h], attribution: flag('attribution') });
89
+ console.log(`Saved ${rest[0]} (+ ${rest[0]}.json with bounds ${JSON.stringify(view.bounds)}). Use it as map.route's background: {src, bounds}.`);
90
+ }
61
91
  else if (cmd === 'presets') {
62
92
  console.log(listPresets());
63
93
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/core/anim.js CHANGED
@@ -1,5 +1,17 @@
1
1
  import { applyEase } from './ease.js';
2
2
  import { parseColor, rgbaString } from './color.js';
3
+ import { morph, parsePath, pathToString } from './path.js';
4
+ const pathCache = new Map();
5
+ const parsed = (d) => {
6
+ let p = pathCache.get(d);
7
+ if (!p) {
8
+ p = parsePath(d);
9
+ if (pathCache.size > 200)
10
+ pathCache.clear();
11
+ pathCache.set(d, p);
12
+ }
13
+ return p;
14
+ };
3
15
  import { isAnimated } from './model.js';
4
16
  const lerp = (a, b, p) => a + (b - a) * p;
5
17
  const interpolate = (a, b, p) => {
@@ -11,6 +23,14 @@ const interpolate = (a, b, p) => {
11
23
  const ca = parseColor(a), cb = parseColor(b);
12
24
  if (ca && cb)
13
25
  return rgbaString(ca.map((v, i) => lerp(v, cb[i], p)));
26
+ // Two SVG paths: morph between them.
27
+ if (/^\s*[Mm]/.test(a) && /^\s*[Mm]/.test(b)) {
28
+ if (p <= 0)
29
+ return a;
30
+ if (p >= 1)
31
+ return b;
32
+ return pathToString(morph(parsed(a), parsed(b), p));
33
+ }
14
34
  }
15
35
  return p < 1 ? a : b;
16
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"anim.js","sourceRoot":"","sources":["../../src/core/anim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AACpC,OAAO,EAAC,UAAU,EAAE,UAAU,EAAC,MAAM,YAAY,CAAC;AAClD,OAAO,EAAC,UAAU,EAAwC,MAAM,YAAY,CAAC;AAE7E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAElE,MAAM,WAAW,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,CAAS,EAAW,EAAE;IACjE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAW,EAAG,CAAC,CAAC,CAAC,CAAY,IAAK,CAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1H,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,EAAE,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAqC,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;IACnD,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,IAAY,EAAE,EAAE;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC;AACF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,CAAS,EAAE,CAAS,EAAW,EAAE;IAC/D,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACnF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,CAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,GAAkB,EAAE,CAAS,EAAK,EAAE;IACnE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IACpD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAM,CAAC;AACvC,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,GAAG,CAAI,CAAsB,EAAE,CAAS,EAAE,QAAW;IACnE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,CAAM,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAM,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"anim.js","sourceRoot":"","sources":["../../src/core/anim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface Cue {
2
+ start: number;
3
+ end: number;
4
+ text: string;
5
+ }
6
+ export interface Word {
7
+ text: string;
8
+ start: number;
9
+ end: number;
10
+ }
11
+ export declare const parseSubtitles: (src: string) => Cue[];
12
+ export declare const cuesToWords: (cues: Cue[]) => Word[];
13
+ export declare const paginate: (words: Word[], maxWords?: number, maxChars?: number) => Word[][];
@@ -0,0 +1,57 @@
1
+ const time = (s) => {
2
+ const m = s.trim().replace(',', '.').match(/(?:(\d+):)?(\d+):(\d+(?:\.\d+)?)/);
3
+ if (!m)
4
+ return NaN;
5
+ return (m[1] ? Number(m[1]) * 3600 : 0) + Number(m[2]) * 60 + Number(m[3]);
6
+ };
7
+ // Parses SRT or WebVTT into cues.
8
+ export const parseSubtitles = (src) => {
9
+ const cues = [];
10
+ for (const block of src.replace(/\r/g, '').split(/\n\s*\n/)) {
11
+ const lines = block.split('\n').map((l) => l.trim()).filter(Boolean);
12
+ const i = lines.findIndex((l) => l.includes('-->'));
13
+ if (i < 0)
14
+ continue;
15
+ const [a, b] = lines[i].split('-->');
16
+ const text = lines.slice(i + 1).join(' ').replace(/<[^>]+>/g, '').trim();
17
+ if (text)
18
+ cues.push({ start: time(a), end: time(b.split(/\s+/).filter(Boolean)[0] ?? b), text });
19
+ }
20
+ return cues.filter((c) => Number.isFinite(c.start) && Number.isFinite(c.end));
21
+ };
22
+ // Spreads each cue's time across its words, weighted by length (cues only have phrase timing).
23
+ export const cuesToWords = (cues) => cues.flatMap((c) => {
24
+ const words = c.text.split(/\s+/).filter(Boolean);
25
+ const weights = words.map((w) => Math.max(1, [...w].length) + 1);
26
+ const total = weights.reduce((a, b) => a + b, 0);
27
+ let t = c.start;
28
+ return words.map((w, i) => {
29
+ const d = ((c.end - c.start) * weights[i]) / total;
30
+ const out = { text: w, start: +t.toFixed(3), end: +(t + d).toFixed(3) };
31
+ t += d;
32
+ return out;
33
+ });
34
+ });
35
+ // Groups words into on-screen pages: at most `maxWords` / `maxChars`, breaking after punctuation
36
+ // and on pauses, the way short-form video captions read.
37
+ export const paginate = (words, maxWords = 4, maxChars = 22) => {
38
+ const pages = [];
39
+ let cur = [];
40
+ const len = (ws) => ws.reduce((a, w) => a + [...w.text].length + 1, 0);
41
+ for (const w of words) {
42
+ const pause = cur.length && w.start - cur[cur.length - 1].end > 0.6;
43
+ if (cur.length && (cur.length >= maxWords || len([...cur, w]) > maxChars || pause)) {
44
+ pages.push(cur);
45
+ cur = [];
46
+ }
47
+ cur.push(w);
48
+ if (/[.!?।,;:]$/.test(w.text) && cur.length >= 2) {
49
+ pages.push(cur);
50
+ cur = [];
51
+ }
52
+ }
53
+ if (cur.length)
54
+ pages.push(cur);
55
+ return pages;
56
+ };
57
+ //# sourceMappingURL=captions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captions.js","sourceRoot":"","sources":["../../src/core/captions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type LatLon = [number, number];
2
+ export declare const project: ([lat, lon]: LatLon, z?: number) => [number, number];
3
+ export declare const unproject: ([x, y]: [number, number], z?: number) => LatLon;
4
+ export interface MapView {
5
+ bounds: [LatLon, LatLon];
6
+ size: [number, number];
7
+ }
8
+ export declare const fitView: (pts: LatLon[], w: number, h: number, pad?: number) => {
9
+ toPx: (p: LatLon) => [number, number];
10
+ view: MapView;
11
+ };
12
+ export declare const viewToPx: (view: MapView) => (p: LatLon) => [number, number];
13
+ export declare const distanceKm: (a: LatLon, b: LatLon) => number;
@@ -0,0 +1,41 @@
1
+ // Lat/lon → world pixel coordinates at zoom level z (256 px tiles).
2
+ export const project = ([lat, lon], z = 0) => {
3
+ const s = 256 * 2 ** z;
4
+ const sin = Math.sin((Math.max(-85.05, Math.min(85.05, lat)) * Math.PI) / 180);
5
+ return [((lon + 180) / 360) * s, (0.5 - Math.log((1 + sin) / (1 - sin)) / (4 * Math.PI)) * s];
6
+ };
7
+ export const unproject = ([x, y], z = 0) => {
8
+ const s = 256 * 2 ** z;
9
+ const lon = (x / s) * 360 - 180;
10
+ const n = Math.PI - (2 * Math.PI * y) / s;
11
+ return [(180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))), lon];
12
+ };
13
+ // Fits coordinates into a w×h box with padding, keeping Mercator proportions.
14
+ export const fitView = (pts, w, h, pad = 0.12) => {
15
+ const xy = pts.map((p) => project(p, 0));
16
+ let x0 = Math.min(...xy.map((p) => p[0])), x1 = Math.max(...xy.map((p) => p[0]));
17
+ let y0 = Math.min(...xy.map((p) => p[1])), y1 = Math.max(...xy.map((p) => p[1]));
18
+ const cx = (x0 + x1) / 2, cy = (y0 + y1) / 2;
19
+ let sw = Math.max(x1 - x0, 1e-6) / (1 - 2 * pad), sh = Math.max(y1 - y0, 1e-6) / (1 - 2 * pad);
20
+ if (sw / sh > w / h)
21
+ sh = (sw * h) / w;
22
+ else
23
+ sw = (sh * w) / h;
24
+ x0 = cx - sw / 2;
25
+ x1 = cx + sw / 2;
26
+ y0 = cy - sh / 2;
27
+ y1 = cy + sh / 2;
28
+ const toPx = (p) => { const [x, y] = project(p, 0); return [((x - x0) / (x1 - x0)) * w, ((y - y0) / (y1 - y0)) * h]; };
29
+ return { toPx, view: { bounds: [unproject([x0, y0]), unproject([x1, y1])], size: [w, h] } };
30
+ };
31
+ // Maps lat/lon into an existing view (a stitched map image of known bounds).
32
+ export const viewToPx = (view) => {
33
+ const [a, b] = [project(view.bounds[0], 0), project(view.bounds[1], 0)];
34
+ return (p) => { const [x, y] = project(p, 0); return [((x - a[0]) / (b[0] - a[0])) * view.size[0], ((y - a[1]) / (b[1] - a[1])) * view.size[1]]; };
35
+ };
36
+ export const distanceKm = (a, b) => {
37
+ const R = 6371, dLat = ((b[0] - a[0]) * Math.PI) / 180, dLon = ((b[1] - a[1]) * Math.PI) / 180;
38
+ const h = Math.sin(dLat / 2) ** 2 + Math.cos((a[0] * Math.PI) / 180) * Math.cos((b[0] * Math.PI) / 180) * Math.sin(dLon / 2) ** 2;
39
+ return 2 * R * Math.asin(Math.sqrt(h));
40
+ };
41
+ //# sourceMappingURL=geo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo.js","sourceRoot":"","sources":["../../src/core/geo.ts"],"names":[],"mappings":"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"}
@@ -59,11 +59,63 @@ export type Effect = {
59
59
  } | {
60
60
  type: 'contrast';
61
61
  amount: Prop<number>;
62
+ } | {
63
+ type: 'cornerPin';
64
+ corners: Prop<[Vec2, Vec2, Vec2, Vec2]>;
65
+ } | {
66
+ type: 'tilt';
67
+ rotateX?: Prop<number>;
68
+ rotateY?: Prop<number>;
69
+ rotateZ?: Prop<number>;
70
+ perspective?: number;
71
+ } | {
72
+ type: 'rgbSplit';
73
+ amount: Prop<number>;
74
+ angle?: number;
75
+ } | {
76
+ type: 'glitch';
77
+ amount: Prop<number>;
78
+ seed?: number;
79
+ hold?: number;
80
+ rgb?: boolean;
81
+ } | {
82
+ type: 'wave';
83
+ amplitude: Prop<number>;
84
+ wavelength?: number;
85
+ speed?: number;
86
+ direction?: 'horizontal' | 'vertical';
87
+ } | {
88
+ type: 'curves';
89
+ master?: [number, number][];
90
+ r?: [number, number][];
91
+ g?: [number, number][];
92
+ b?: [number, number][];
93
+ } | {
94
+ type: 'colorBalance';
95
+ shadows?: [number, number, number];
96
+ midtones?: [number, number, number];
97
+ highlights?: [number, number, number];
98
+ } | {
99
+ type: 'exposure';
100
+ stops: Prop<number>;
101
+ } | {
102
+ type: 'temperature';
103
+ amount: Prop<number>;
104
+ } | {
105
+ type: 'lut';
106
+ src: string;
107
+ intensity?: Prop<number>;
108
+ } | {
109
+ type: 'vignette';
110
+ amount: Prop<number>;
111
+ softness?: number;
112
+ color?: Color;
62
113
  };
63
114
  export interface Mask {
64
115
  shape: 'rect' | 'ellipse' | 'path';
65
116
  rect?: Prop<[number, number, number, number]>;
66
117
  points?: Vec2[];
118
+ path?: Prop<string>;
67
119
  radius?: number;
68
120
  inverted?: boolean;
69
121
  }
@@ -118,28 +170,52 @@ export interface SolidLayer extends LayerBase {
118
170
  export interface NullLayer extends LayerBase {
119
171
  type: 'null';
120
172
  }
173
+ export type Gradient = {
174
+ linear: {
175
+ from: Vec2;
176
+ to: Vec2;
177
+ stops: [number, Color][];
178
+ };
179
+ } | {
180
+ radial: {
181
+ center: Vec2;
182
+ radius: number;
183
+ stops: [number, Color][];
184
+ };
185
+ };
186
+ export interface Repeater {
187
+ copies: Prop<number>;
188
+ offset?: number;
189
+ position?: Vec2;
190
+ rotation?: number;
191
+ scale?: Vec2;
192
+ anchor?: Vec2;
193
+ startOpacity?: number;
194
+ endOpacity?: number;
195
+ }
121
196
  export interface ShapeLayer extends LayerBase {
122
197
  type: 'shape';
123
- shape: 'rect' | 'ellipse' | 'polygon' | 'path' | 'line';
198
+ shape: 'rect' | 'ellipse' | 'polygon' | 'star' | 'path' | 'line';
124
199
  size?: Prop<Vec2>;
125
200
  radius?: Prop<number>;
201
+ innerRadius?: Prop<number>;
126
202
  sides?: number;
203
+ path?: Prop<string>;
127
204
  points?: Vec2[];
128
205
  closed?: boolean;
129
- fill?: Prop<Color> | {
130
- linear: {
131
- from: Vec2;
132
- to: Vec2;
133
- stops: [number, Color][];
134
- };
135
- };
206
+ fill?: Prop<Color> | Gradient;
207
+ fillRule?: 'nonzero' | 'evenodd';
136
208
  stroke?: Prop<Color>;
137
209
  strokeWidth?: Prop<number>;
138
210
  lineCap?: 'butt' | 'round' | 'square';
211
+ lineJoin?: 'miter' | 'round' | 'bevel';
212
+ dash?: number[];
139
213
  trim?: {
140
214
  start?: Prop<number>;
141
215
  end?: Prop<number>;
216
+ offset?: Prop<number>;
142
217
  };
218
+ repeater?: Repeater;
143
219
  }
144
220
  export interface TextLayer extends LayerBase {
145
221
  type: 'text';
@@ -168,6 +244,21 @@ export interface TextLayer extends LayerBase {
168
244
  radius?: number;
169
245
  reveal?: Prop<number>;
170
246
  };
247
+ value?: Prop<number>;
248
+ format?: {
249
+ decimals?: number;
250
+ prefix?: string;
251
+ suffix?: string;
252
+ locale?: string;
253
+ grouping?: boolean;
254
+ };
255
+ karaoke?: {
256
+ words: [number, number][];
257
+ color?: Color;
258
+ mode?: 'current' | 'spoken';
259
+ scale?: number;
260
+ box?: Color;
261
+ };
171
262
  animators?: TextAnimator[];
172
263
  }
173
264
  export interface ImageLayer extends LayerBase {
@@ -193,13 +284,25 @@ export interface AudioLayer extends LayerBase {
193
284
  fadeIn?: number;
194
285
  fadeOut?: number;
195
286
  }
287
+ export interface LottieLayer extends LayerBase {
288
+ type: 'lottie';
289
+ src: string;
290
+ size?: Vec2;
291
+ loop?: boolean;
292
+ speed?: number;
293
+ timeOffset?: number;
294
+ frames?: [number, number];
295
+ }
296
+ export interface AdjustmentLayer extends LayerBase {
297
+ type: 'adjustment';
298
+ }
196
299
  export interface PrecompLayer extends LayerBase {
197
300
  type: 'precomp';
198
301
  comp: string;
199
302
  timeOffset?: number;
200
303
  speed?: number;
201
304
  }
202
- export type Layer = SolidLayer | NullLayer | ShapeLayer | TextLayer | ImageLayer | VideoLayer | AudioLayer | PrecompLayer;
305
+ export type Layer = SolidLayer | NullLayer | ShapeLayer | TextLayer | ImageLayer | VideoLayer | AudioLayer | PrecompLayer | LottieLayer | AdjustmentLayer;
203
306
  export type LayerType = Layer['type'];
204
307
  export type NewLayer = Layer extends infer L ? (L extends Layer ? Omit<L, 'id'> & {
205
308
  id?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uFAAuF;AA4JvF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,CAAsB,EAAoB,EAAE,CACxE,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uFAAuF;AAmNvF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,CAAsB,EAAoB,EAAE,CACxE,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Vec2 } from './model.js';
2
+ export type Seg = {
3
+ kind: 'M';
4
+ p: Vec2;
5
+ } | {
6
+ kind: 'L';
7
+ p: Vec2;
8
+ } | {
9
+ kind: 'C';
10
+ c1: Vec2;
11
+ c2: Vec2;
12
+ p: Vec2;
13
+ } | {
14
+ kind: 'Z';
15
+ };
16
+ export type Path = Seg[];
17
+ export declare const parsePath: (d: string) => Path;
18
+ export declare const pathToString: (path: Path) => string;
19
+ export declare const transformPath: (path: Path, m: [number, number, number, number, number, number]) => Path;
20
+ export declare const tracePath: (ctx: CanvasRenderingContext2D, path: Path) => void;
21
+ export declare const flatten: (path: Path, tolerance?: number) => {
22
+ pts: Vec2[];
23
+ closed: boolean;
24
+ }[];
25
+ export declare const resample: (pts: Vec2[], closed: boolean, n: number) => Vec2[];
26
+ export declare const trimPolylines: (subs: {
27
+ pts: Vec2[];
28
+ closed: boolean;
29
+ }[], start: number, end: number, offset?: number) => Vec2[][];
30
+ export declare const morph: (a: Path, b: Path, p: number) => Path;
31
+ export declare const pathBounds: (path: Path) => [number, number, number, number] | null;
32
+ export declare const pointAt: (path: Path, f: number) => {
33
+ p: Vec2;
34
+ angle: number;
35
+ };