@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.
- package/README.md +16 -3
- package/dist/cli.js +33 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/anim.js +20 -0
- package/dist/core/anim.js.map +1 -1
- package/dist/core/captions.d.ts +13 -0
- package/dist/core/captions.js +57 -0
- package/dist/core/captions.js.map +1 -0
- package/dist/core/geo.d.ts +13 -0
- package/dist/core/geo.js +41 -0
- package/dist/core/geo.js.map +1 -0
- package/dist/core/model.d.ts +112 -9
- package/dist/core/model.js.map +1 -1
- package/dist/core/path.d.ts +35 -0
- package/dist/core/path.js +324 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/svg.d.ts +22 -0
- package/dist/core/svg.js +217 -0
- package/dist/core/svg.js.map +1 -0
- package/dist/core/text.d.ts +3 -1
- package/dist/core/text.js +49 -3
- package/dist/core/text.js.map +1 -1
- package/dist/mcp/server.js +28 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/ops/ops.d.ts +7 -0
- package/dist/ops/ops.js +11 -1
- package/dist/ops/ops.js.map +1 -1
- package/dist/presets/app.d.ts +2 -0
- package/dist/presets/app.js +82 -0
- package/dist/presets/app.js.map +1 -0
- package/dist/presets/captions.d.ts +2 -0
- package/dist/presets/captions.js +48 -0
- package/dist/presets/captions.js.map +1 -0
- package/dist/presets/charts.d.ts +2 -0
- package/dist/presets/charts.js +162 -0
- package/dist/presets/charts.js.map +1 -0
- package/dist/presets/index.d.ts +1 -1
- package/dist/presets/index.js +62 -1
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/maps.d.ts +2 -0
- package/dist/presets/maps.js +79 -0
- package/dist/presets/maps.js.map +1 -0
- package/dist/render/fx.d.ts +11 -0
- package/dist/render/fx.js +87 -0
- package/dist/render/fx.js.map +1 -0
- package/dist/render/grade.d.ts +20 -0
- package/dist/render/grade.js +178 -0
- package/dist/render/grade.js.map +1 -0
- package/dist/render/lottie.d.ts +36 -0
- package/dist/render/lottie.js +523 -0
- package/dist/render/lottie.js.map +1 -0
- package/dist/render/node-host.d.ts +1 -0
- package/dist/render/node-host.js +15 -4
- package/dist/render/node-host.js.map +1 -1
- package/dist/render/perspective.d.ts +5 -0
- package/dist/render/perspective.js +71 -0
- package/dist/render/perspective.js.map +1 -0
- package/dist/render/renderer.d.ts +6 -0
- package/dist/render/renderer.js +156 -95
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/shapes.d.ts +6 -0
- package/dist/render/shapes.js +129 -0
- package/dist/render/shapes.js.map +1 -0
- package/dist/render/tiles.d.ts +11 -0
- package/dist/render/tiles.js +42 -0
- package/dist/render/tiles.js.map +1 -0
- package/dist/render/transcribe.d.ts +14 -0
- package/dist/render/transcribe.js +55 -0
- package/dist/render/transcribe.js.map +1 -0
- package/dist/studio/server.js +14 -1
- package/dist/studio/server.js.map +1 -1
- package/dist/studio-app/app.js +5 -4
- package/dist/studio-app/app.js.map +4 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/plugin/skills/moti/SKILL.md +23 -3
package/README.md
CHANGED
|
@@ -12,12 +12,19 @@ they make.
|
|
|
12
12
|
|
|
13
13
|

|
|
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** —
|
|
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
|
-
-
|
|
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
|
|
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":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;
|
|
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
|
};
|
package/dist/core/anim.js.map
CHANGED
|
@@ -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;
|
|
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;
|
package/dist/core/geo.js
ADDED
|
@@ -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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"}
|
package/dist/core/model.d.ts
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/dist/core/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uFAAuF;
|
|
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
|
+
};
|