@dnyantra/dtly 0.2.1 → 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 +21 -8
- package/dist/agents.d.ts +1 -0
- package/dist/agents.js +9 -4
- package/dist/agents.js.map +1 -1
- package/dist/cli.js +35 -5
- 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/{dtly → moti}/SKILL.md +26 -6
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
|
|
@@ -37,7 +44,7 @@ npx @dnyantra/dtly render hello.json hello.mp4
|
|
|
37
44
|
|
|
38
45
|
### Use it from Claude Code
|
|
39
46
|
|
|
40
|
-
Install the plugin (MCP server + skill) in one step:
|
|
47
|
+
Install the plugin (MCP server + the **moti** skill) in one step:
|
|
41
48
|
|
|
42
49
|
```
|
|
43
50
|
/plugin install dtly --marketplace dnyantra/dtly
|
|
@@ -52,8 +59,8 @@ npx @dnyantra/dtly skill install --agent claude
|
|
|
52
59
|
|
|
53
60
|
### Use it from Codex, Cursor, Gemini CLI, Copilot or Windsurf
|
|
54
61
|
|
|
55
|
-
The skill uses the open [Agent Skills](https://agentskills.io) format, so one command installs
|
|
56
|
-
every supported agent:
|
|
62
|
+
The **moti** skill uses the open [Agent Skills](https://agentskills.io) format, so one command installs
|
|
63
|
+
it for every supported agent:
|
|
57
64
|
|
|
58
65
|
```bash
|
|
59
66
|
npx skills add dnyantra/dtly # or: npx @dnyantra/dtly skill install --agent all
|
|
@@ -72,7 +79,7 @@ Then add the MCP server (the editing tools) to your agent:
|
|
|
72
79
|
`npx @dnyantra/dtly setup <agent>` prints these steps for your agent. Agents without MCP can still use
|
|
73
80
|
DT.ly through the skill's CLI fallback (`init`, `still`, `sheet`, `render`).
|
|
74
81
|
|
|
75
|
-
Then ask for things like
|
|
82
|
+
Then ask for things like `/moti make a 10 second kinetic typography opener for my bakery` or
|
|
76
83
|
*"ease the call-to-action in with a spring and move it 0.3 s later"*.
|
|
77
84
|
|
|
78
85
|
## Studio — browser preview and timeline editor
|
|
@@ -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,11 +171,14 @@ 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
|
|
168
|
-
[`plugin/skills/
|
|
181
|
+
[`plugin/skills/moti/SKILL.md`](plugin/skills/moti/SKILL.md) for the full guide.
|
|
169
182
|
|
|
170
183
|
## Development
|
|
171
184
|
|
|
@@ -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/agents.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const skillTargets: (agent: string, project: boolean) => string[];
|
|
2
|
+
export declare const SKILL_NAME = "moti";
|
|
2
3
|
export declare const installSkill: (pkgRoot: string, dirs: string[]) => string[];
|
|
3
4
|
export declare const MCP_SETUP: Record<string, {
|
|
4
5
|
file: string;
|
package/dist/agents.js
CHANGED
|
@@ -18,10 +18,15 @@ export const skillTargets = (agent, project) => {
|
|
|
18
18
|
return [claude, shared];
|
|
19
19
|
throw new Error(`Unknown agent "${agent}". Use claude, codex, cursor, gemini, copilot or all.`);
|
|
20
20
|
};
|
|
21
|
+
export const SKILL_NAME = 'moti';
|
|
21
22
|
export const installSkill = (pkgRoot, dirs) => dirs.map((base) => {
|
|
22
|
-
const dest = path.join(base,
|
|
23
|
+
const dest = path.join(base, SKILL_NAME);
|
|
23
24
|
fs.mkdirSync(dest, { recursive: true });
|
|
24
|
-
fs.cpSync(path.join(pkgRoot, 'plugin/skills
|
|
25
|
+
fs.cpSync(path.join(pkgRoot, 'plugin/skills', SKILL_NAME), dest, { recursive: true });
|
|
26
|
+
// Before 0.2.2 the skill was called "dtly"; remove that copy so agents don't see it twice.
|
|
27
|
+
const old = path.join(base, 'dtly', 'SKILL.md');
|
|
28
|
+
if (fs.existsSync(old) && /^name: dtly$/m.test(fs.readFileSync(old, 'utf8')))
|
|
29
|
+
fs.rmSync(path.dirname(old), { recursive: true, force: true });
|
|
25
30
|
return dest;
|
|
26
31
|
});
|
|
27
32
|
const json = (o) => JSON.stringify(o, null, 2);
|
|
@@ -48,14 +53,14 @@ export const setupGuide = (agent) => {
|
|
|
48
53
|
return [
|
|
49
54
|
`DT.ly setup for ${agent}`,
|
|
50
55
|
'',
|
|
51
|
-
`1. Skill (motion-design guidance for the agent) → ${skillDir}
|
|
56
|
+
`1. Skill "moti" (motion-design guidance for the agent) → ${skillDir}/${SKILL_NAME}`,
|
|
52
57
|
` npx ${PKG} skill install --agent ${agent}`,
|
|
53
58
|
` (or for every agent at once: npx skills add dnyantra/dtly)`,
|
|
54
59
|
'',
|
|
55
60
|
`2. MCP server (the editing tools) → ${m.file}`,
|
|
56
61
|
...m.text.split('\n').map((l) => (l ? ` ${l}` : '')),
|
|
57
62
|
'',
|
|
58
|
-
'3. Restart the agent and
|
|
63
|
+
'3. Restart the agent and try: /moti make a 15 second vertical ad for <your business>',
|
|
59
64
|
'Needs Node.js 20+ and FFmpeg on PATH.',
|
|
60
65
|
].join('\n');
|
|
61
66
|
};
|
package/dist/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,GAAG,GAAG,gBAAgB,CAAC;AAC7B,MAAM,MAAM,GAAG,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAC,CAAC;AAE1D,6FAA6F;AAC7F,kFAAkF;AAClF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,OAAgB,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3I,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/F,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxF,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,uDAAuD,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,IAAc,EAAE,EAAE,CAC9D,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
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,12 +17,18 @@ 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
|
|
23
30
|
dtly skill install [--agent claude|codex|cursor|gemini|copilot|all] [--project] [--dir d]
|
|
24
|
-
install the agent skill (default: all)
|
|
31
|
+
install the "moti" agent skill (default: all)
|
|
25
32
|
|
|
26
33
|
Docs: https://github.com/dnyantra/dtly`;
|
|
27
34
|
const flag = (name) => { const i = rest.indexOf(`--${name}`); return i >= 0 ? rest[i + 1] : undefined; };
|
|
@@ -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
|
}
|
|
@@ -78,7 +108,7 @@ try {
|
|
|
78
108
|
else if (cmd === 'skill' && rest[0] === 'install') {
|
|
79
109
|
const dirs = flag('dir') ? [flag('dir')] : skillTargets(flag('agent') ?? 'all', rest.includes('--project'));
|
|
80
110
|
for (const dest of installSkill(pkgRoot, dirs))
|
|
81
|
-
console.log(`Installed the
|
|
111
|
+
console.log(`Installed the moti skill to ${dest}`);
|
|
82
112
|
console.log(`Next, add the MCP server to your agent: dtly setup <claude|codex|cursor|gemini|copilot|windsurf>`);
|
|
83
113
|
}
|
|
84
114
|
else if (cmd === 'setup') {
|
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":"AAGA,oEAAoE;AACpE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAS,EAAE,CAAC,GAAG,CAAC,EAAoB,EAAE;IACrE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/E,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAmB,EAAE,CAAC,GAAG,CAAC,EAAU,EAAE;IACnE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC,CAAC;AAIF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAa,EAAE,CAAS,EAAE,CAAS,EAAE,GAAG,GAAG,IAAI,EAA0D,EAAE;IACjI,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/F,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;QAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;QAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAoB,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjJ,OAAO,EAAC,IAAI,EAAE,IAAI,EAAE,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,EAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,EAAE;IACxC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,CAAS,EAAoB,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/K,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;IACjD,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC/F,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAClI,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC"}
|
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"}
|