@coppsary/motionly 1.1.0 → 1.1.2
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 +49 -373
- package/bin/ffmpeg-export.js +263 -0
- package/bin/motionly.js +23 -13
- package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/main-BwVca29t.css +1 -0
- package/dist/assets/main-DJBtA-Cr.js +2752 -0
- package/dist/assets/main-DJBtA-Cr.js.map +1 -0
- package/dist/index.html +2 -2
- package/package.json +2 -1
- package/templates/motionly-skill/SKILL.md +1 -1
- package/templates/project/AGENTS.md +3 -3
- package/templates/project/README.md +10 -2
- package/dist/assets/main-BWhvHbtr.css +0 -1
- package/dist/assets/main-CrcFUwRU.js +0 -2470
- package/dist/assets/main-CrcFUwRU.js.map +0 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
5
|
+
import { mkdtemp, rm, stat } from 'node:fs/promises';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { Transform } from 'node:stream';
|
|
9
|
+
import { pipeline } from 'node:stream/promises';
|
|
10
|
+
|
|
11
|
+
const jobs = new Map();
|
|
12
|
+
const MAX_FRAME_BYTES = 100 * 1024 * 1024;
|
|
13
|
+
const MAX_AUDIO_BYTES = 1024 * 1024 * 1024;
|
|
14
|
+
|
|
15
|
+
/** Handle an export request in the standalone npm CLI server. */
|
|
16
|
+
export async function handleFfmpegExportRequest(request, response) {
|
|
17
|
+
const url = new URL(request.url ?? '/', 'http://motionly.local');
|
|
18
|
+
if (!url.pathname.startsWith('/api/exports')) return false;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
await handleExportRequest(request, response, url);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
if (response.headersSent) {
|
|
24
|
+
response.destroy(error instanceof Error ? error : new Error(String(error)));
|
|
25
|
+
} else {
|
|
26
|
+
response.statusCode = 500;
|
|
27
|
+
response.setHeader('content-type', 'text/plain;charset=utf-8');
|
|
28
|
+
response.end(error instanceof Error ? error.message : String(error));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Connect-compatible middleware used by the Vite development and preview servers. */
|
|
35
|
+
export function createFfmpegExportMiddleware() {
|
|
36
|
+
return (request, response, next) => {
|
|
37
|
+
void handleFfmpegExportRequest(request, response).then((handled) => {
|
|
38
|
+
if (!handled) next();
|
|
39
|
+
}, next);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function handleExportRequest(request, response, url) {
|
|
44
|
+
if (request.method === 'POST' && url.pathname === '/api/exports') {
|
|
45
|
+
await createJob(request, response);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const match = /^\/api\/exports\/([a-z0-9-]+)(?:\/(frames\/(\d+)|audio|finish))?$/.exec(
|
|
49
|
+
url.pathname
|
|
50
|
+
);
|
|
51
|
+
if (!match) return respond(response, 404, 'Unknown export endpoint');
|
|
52
|
+
const id = match[1];
|
|
53
|
+
const action = match[2];
|
|
54
|
+
if (!id) return respond(response, 404, 'Unknown export job');
|
|
55
|
+
const job = jobs.get(id);
|
|
56
|
+
if (!job) return respond(response, 404, 'Export job not found');
|
|
57
|
+
|
|
58
|
+
if (request.method === 'DELETE' && !action) {
|
|
59
|
+
jobs.delete(id);
|
|
60
|
+
await rm(job.directory, { recursive: true, force: true });
|
|
61
|
+
respond(response, 204);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (request.method === 'PUT' && action?.startsWith('frames/')) {
|
|
66
|
+
const index = Number(match[3]);
|
|
67
|
+
if (!Number.isInteger(index) || index < 0 || index >= job.totalFrames) {
|
|
68
|
+
return respond(response, 409, `Invalid frame ${index}`);
|
|
69
|
+
}
|
|
70
|
+
if (job.receivedFrames.has(index)) return respond(response, 409, `Duplicate frame ${index}`);
|
|
71
|
+
if (request.headers['content-type'] !== 'image/jpeg') {
|
|
72
|
+
return respond(response, 415, 'Export frames must be JPEG images');
|
|
73
|
+
}
|
|
74
|
+
await writeRequest(
|
|
75
|
+
request,
|
|
76
|
+
join(job.directory, `frame-${String(index).padStart(8, '0')}.jpg`),
|
|
77
|
+
MAX_FRAME_BYTES
|
|
78
|
+
);
|
|
79
|
+
job.receivedFrames.add(index);
|
|
80
|
+
respond(response, 204);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (request.method === 'PUT' && action === 'audio') {
|
|
85
|
+
if (!job.hasAudio) return respond(response, 409, 'This export was not created with audio');
|
|
86
|
+
await writeRequest(request, join(job.directory, 'audio-input'), MAX_AUDIO_BYTES);
|
|
87
|
+
job.audioReceived = true;
|
|
88
|
+
respond(response, 204);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (request.method === 'POST' && action === 'finish') {
|
|
93
|
+
if (job.receivedFrames.size !== job.totalFrames) {
|
|
94
|
+
return respond(
|
|
95
|
+
response,
|
|
96
|
+
409,
|
|
97
|
+
`Missing ${job.totalFrames - job.receivedFrames.size} export frames`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
if (job.hasAudio && !job.audioReceived) {
|
|
101
|
+
return respond(response, 409, 'The attached audio file was not uploaded');
|
|
102
|
+
}
|
|
103
|
+
await finishJob(id, job, response);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
respond(response, 405, 'Method not allowed');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function createJob(request, response) {
|
|
111
|
+
const input = JSON.parse((await readRequest(request, 64 * 1024)).toString('utf8'));
|
|
112
|
+
positiveInteger(input.width, 'width', 8192);
|
|
113
|
+
positiveInteger(input.height, 'height', 8192);
|
|
114
|
+
const fps = positiveNumber(input.fps, 'fps', 240);
|
|
115
|
+
const duration = positiveNumber(input.duration, 'duration', 24 * 60 * 60);
|
|
116
|
+
const totalFrames = positiveInteger(input.totalFrames, 'totalFrames', 24 * 60 * 60 * 240);
|
|
117
|
+
const audioStart = nonNegativeNumber(input.audioStart ?? 0, 'audioStart', duration);
|
|
118
|
+
const expectedFrames = Math.max(1, Math.ceil(duration * fps));
|
|
119
|
+
if (totalFrames !== expectedFrames) throw new Error(`Expected ${expectedFrames} frames`);
|
|
120
|
+
const id = randomUUID();
|
|
121
|
+
const directory = await mkdtemp(join(tmpdir(), 'motionly-export-'));
|
|
122
|
+
jobs.set(id, {
|
|
123
|
+
directory,
|
|
124
|
+
fps,
|
|
125
|
+
duration,
|
|
126
|
+
totalFrames,
|
|
127
|
+
receivedFrames: new Set(),
|
|
128
|
+
hasAudio: input.hasAudio === true,
|
|
129
|
+
audioStart,
|
|
130
|
+
audioReceived: false,
|
|
131
|
+
});
|
|
132
|
+
response.statusCode = 201;
|
|
133
|
+
response.setHeader('content-type', 'application/json');
|
|
134
|
+
response.end(JSON.stringify({ id }));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function finishJob(id, job, response) {
|
|
138
|
+
const outputPath = join(job.directory, 'motionly.mp4');
|
|
139
|
+
const framePattern = join(job.directory, 'frame-%08d.jpg');
|
|
140
|
+
const args = [
|
|
141
|
+
'-hide_banner',
|
|
142
|
+
'-loglevel',
|
|
143
|
+
'error',
|
|
144
|
+
'-y',
|
|
145
|
+
'-framerate',
|
|
146
|
+
String(job.fps),
|
|
147
|
+
'-start_number',
|
|
148
|
+
'0',
|
|
149
|
+
'-i',
|
|
150
|
+
framePattern,
|
|
151
|
+
];
|
|
152
|
+
if (job.hasAudio) {
|
|
153
|
+
args.push('-itsoffset', String(job.audioStart), '-i', join(job.directory, 'audio-input'));
|
|
154
|
+
}
|
|
155
|
+
args.push('-map', '0:v:0');
|
|
156
|
+
if (job.hasAudio) args.push('-map', '1:a:0', '-c:a', 'aac', '-b:a', '192k');
|
|
157
|
+
args.push(
|
|
158
|
+
'-c:v',
|
|
159
|
+
'libx264',
|
|
160
|
+
'-preset',
|
|
161
|
+
'medium',
|
|
162
|
+
'-crf',
|
|
163
|
+
'18',
|
|
164
|
+
'-vf',
|
|
165
|
+
'pad=ceil(iw/2)*2:ceil(ih/2)*2:color=black,format=yuv420p',
|
|
166
|
+
'-frames:v',
|
|
167
|
+
String(job.totalFrames),
|
|
168
|
+
'-t',
|
|
169
|
+
String(job.duration),
|
|
170
|
+
'-movflags',
|
|
171
|
+
'+faststart',
|
|
172
|
+
outputPath
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
jobs.delete(id);
|
|
176
|
+
try {
|
|
177
|
+
await runFfmpeg(args);
|
|
178
|
+
const output = await stat(outputPath);
|
|
179
|
+
response.statusCode = 200;
|
|
180
|
+
response.setHeader('content-type', 'video/mp4');
|
|
181
|
+
response.setHeader('content-length', String(output.size));
|
|
182
|
+
await pipeline(createReadStream(outputPath), response);
|
|
183
|
+
} finally {
|
|
184
|
+
await rm(job.directory, { recursive: true, force: true });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function runFfmpeg(args) {
|
|
189
|
+
return new Promise((resolve, reject) => {
|
|
190
|
+
const child = spawn('ffmpeg', args, { windowsHide: true });
|
|
191
|
+
let errorOutput = '';
|
|
192
|
+
child.stderr.setEncoding('utf8');
|
|
193
|
+
child.stderr.on('data', (chunk) => {
|
|
194
|
+
errorOutput = `${errorOutput}${chunk}`.slice(-16_384);
|
|
195
|
+
});
|
|
196
|
+
child.once('error', (error) => {
|
|
197
|
+
reject(
|
|
198
|
+
error.code === 'ENOENT'
|
|
199
|
+
? new Error('ffmpeg is not installed or is not available on PATH')
|
|
200
|
+
: error
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
child.once('close', (code) => {
|
|
204
|
+
if (code === 0) resolve();
|
|
205
|
+
else reject(new Error(errorOutput.trim() || `ffmpeg exited with code ${String(code)}`));
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function writeRequest(request, path, maxBytes) {
|
|
211
|
+
let size = 0;
|
|
212
|
+
const limiter = new Transform({
|
|
213
|
+
transform(chunk, _encoding, callback) {
|
|
214
|
+
size += chunk.byteLength;
|
|
215
|
+
callback(size > maxBytes ? new Error('Export upload is too large') : null, chunk);
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
try {
|
|
219
|
+
await pipeline(request, limiter, createWriteStream(path));
|
|
220
|
+
} catch (error) {
|
|
221
|
+
await rm(path, { force: true });
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async function readRequest(request, maxBytes) {
|
|
227
|
+
const chunks = [];
|
|
228
|
+
let size = 0;
|
|
229
|
+
for await (const chunk of request) {
|
|
230
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
231
|
+
size += buffer.byteLength;
|
|
232
|
+
if (size > maxBytes) throw new Error('Export upload is too large');
|
|
233
|
+
chunks.push(buffer);
|
|
234
|
+
}
|
|
235
|
+
return Buffer.concat(chunks);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function positiveInteger(value, name, max) {
|
|
239
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0 || value > max) {
|
|
240
|
+
throw new Error(`Invalid export ${name}`);
|
|
241
|
+
}
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function positiveNumber(value, name, max) {
|
|
246
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > max) {
|
|
247
|
+
throw new Error(`Invalid export ${name}`);
|
|
248
|
+
}
|
|
249
|
+
return value;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function nonNegativeNumber(value, name, max) {
|
|
253
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > max) {
|
|
254
|
+
throw new Error(`Invalid export ${name}`);
|
|
255
|
+
}
|
|
256
|
+
return value;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function respond(response, status, message) {
|
|
260
|
+
response.statusCode = status;
|
|
261
|
+
if (message) response.setHeader('content-type', 'text/plain;charset=utf-8');
|
|
262
|
+
response.end(message);
|
|
263
|
+
}
|
package/bin/motionly.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Zero-dependency Motionly CLI and local editor server.
|
|
3
3
|
|
|
4
4
|
import { createServer } from 'node:http';
|
|
5
|
+
import { handleFfmpegExportRequest } from './ffmpeg-export.js';
|
|
5
6
|
import { createInterface } from 'node:readline/promises';
|
|
6
7
|
import { spawn } from 'node:child_process';
|
|
7
8
|
import { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';
|
|
@@ -25,6 +26,7 @@ const PROVIDERS = {
|
|
|
25
26
|
gemini: '.gemini/skills/motionly/SKILL.md',
|
|
26
27
|
opencode: '.opencode/skills/motionly/SKILL.md',
|
|
27
28
|
kiro: '.kiro/skills/motionly/SKILL.md',
|
|
29
|
+
rayu: '.rayu/skills/motionly/SKILL.md',
|
|
28
30
|
};
|
|
29
31
|
|
|
30
32
|
const AGENT_LABELS = {
|
|
@@ -33,6 +35,7 @@ const AGENT_LABELS = {
|
|
|
33
35
|
gemini: 'Gemini CLI',
|
|
34
36
|
opencode: 'opencode',
|
|
35
37
|
kiro: 'Kiro',
|
|
38
|
+
rayu: 'RAYU',
|
|
36
39
|
};
|
|
37
40
|
|
|
38
41
|
const MIME = {
|
|
@@ -151,7 +154,11 @@ async function copyReferenceLibrary(source, destination) {
|
|
|
151
154
|
const to = join(destination, entry.name);
|
|
152
155
|
if (entry.isDirectory()) {
|
|
153
156
|
copied += await copyReferenceLibrary(from, to);
|
|
154
|
-
} else if (
|
|
157
|
+
} else if (
|
|
158
|
+
entry.name === 'SKILL.md' ||
|
|
159
|
+
entry.name === 'llms.txt' ||
|
|
160
|
+
entry.name === 'AGENTS.md'
|
|
161
|
+
) {
|
|
155
162
|
try {
|
|
156
163
|
await writeFile(to, await readFile(from), { flag: 'wx' });
|
|
157
164
|
copied += 1;
|
|
@@ -252,7 +259,8 @@ async function promptForAgent(scope) {
|
|
|
252
259
|
}
|
|
253
260
|
|
|
254
261
|
async function initProject(name, argv = []) {
|
|
255
|
-
if (!name || name.startsWith('-'))
|
|
262
|
+
if (!name || name.startsWith('-'))
|
|
263
|
+
throw new Error('Usage: npx @coppsary/motionly init <project-folder>');
|
|
256
264
|
const target = resolve(name);
|
|
257
265
|
if (await exists(target)) {
|
|
258
266
|
if ((await readdir(target)).length) throw new Error(`Folder is not empty: ${target}`);
|
|
@@ -286,7 +294,7 @@ async function initProject(name, argv = []) {
|
|
|
286
294
|
if (providers.length) await installSkills(skillBase(scope, target), providers);
|
|
287
295
|
}
|
|
288
296
|
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
289
|
-
console.log(`\n To reopen later: cd ${name} && npx motionly dev`);
|
|
297
|
+
console.log(`\n To reopen later: cd ${name} && npx @coppsary/motionly dev`);
|
|
290
298
|
await serveEditor(argv, target);
|
|
291
299
|
}
|
|
292
300
|
}
|
|
@@ -335,6 +343,8 @@ async function serveEditor(argv, projectFolder = null) {
|
|
|
335
343
|
const url = new URL(request.url ?? '/', 'http://localhost');
|
|
336
344
|
const pathname = decodeURIComponent(url.pathname);
|
|
337
345
|
|
|
346
|
+
if (await handleFfmpegExportRequest(request, response)) return;
|
|
347
|
+
|
|
338
348
|
if (projectPath && pathname === '/api/motion-project') {
|
|
339
349
|
if (request.method === 'GET' || request.method === 'HEAD') {
|
|
340
350
|
const source = await readFile(projectPath);
|
|
@@ -408,7 +418,7 @@ async function serveEditor(argv, projectFolder = null) {
|
|
|
408
418
|
server.on('error', (error) => {
|
|
409
419
|
if (error.code === 'EADDRINUSE') {
|
|
410
420
|
console.error(
|
|
411
|
-
`Port ${port} is in use. Try: npx motionly ${projectRoot ? 'dev ' : ''}--port ${port + 1}`
|
|
421
|
+
`Port ${port} is in use. Try: npx @coppsary/motionly ${projectRoot ? 'dev ' : ''}--port ${port + 1}`
|
|
412
422
|
);
|
|
413
423
|
process.exitCode = 1;
|
|
414
424
|
return;
|
|
@@ -420,14 +430,14 @@ async function serveEditor(argv, projectFolder = null) {
|
|
|
420
430
|
function printHelp() {
|
|
421
431
|
console.log(`Motionly
|
|
422
432
|
|
|
423
|
-
npx motionly init <project-folder> Create a project; asks which agent to set up
|
|
424
|
-
npx motionly init <folder> --provider codex Create a project; install for one agent (no prompt)
|
|
425
|
-
npx motionly init <folder> --all Create a project; install for every agent
|
|
426
|
-
npx motionly init <folder> --skip-skills Create a project without agent skills
|
|
427
|
-
npx motionly skills add Install agent skills into an existing project
|
|
428
|
-
npx motionly skills add --all
|
|
429
|
-
npx motionly skills add --provider <codex|claude|gemini|opencode|kiro>
|
|
430
|
-
npx motionly dev [project-folder] Reopen and edit a local project
|
|
433
|
+
npx @coppsary/motionly init <project-folder> Create a project; asks which agent to set up
|
|
434
|
+
npx @coppsary/motionly init <folder> --provider codex Create a project; install for one agent (no prompt)
|
|
435
|
+
npx @coppsary/motionly init <folder> --all Create a project; install for every agent
|
|
436
|
+
npx @coppsary/motionly init <folder> --skip-skills Create a project without agent skills
|
|
437
|
+
npx @coppsary/motionly skills add Install agent skills into an existing project
|
|
438
|
+
npx @coppsary/motionly skills add --all
|
|
439
|
+
npx @coppsary/motionly skills add --provider <codex|claude|gemini|opencode|kiro|rayu>
|
|
440
|
+
npx @coppsary/motionly dev [project-folder] Reopen and edit a local project
|
|
431
441
|
|
|
432
442
|
Options: --scope <project|global>, --port <number>, --no-open`);
|
|
433
443
|
}
|
|
@@ -438,7 +448,7 @@ async function main() {
|
|
|
438
448
|
if (command === 'skills') {
|
|
439
449
|
if (subcommand !== 'add')
|
|
440
450
|
throw new Error(
|
|
441
|
-
'Usage: npx motionly skills add [--provider <name> | --all] [--scope project|global]'
|
|
451
|
+
'Usage: npx @coppsary/motionly skills add [--provider <name> | --all] [--scope project|global]'
|
|
442
452
|
);
|
|
443
453
|
const options = await resolveSkillOptions(argv.slice(2));
|
|
444
454
|
await installSkills(skillBase(options.scope, process.cwd()), options.providers);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}html,body{width:100%;height:100%;margin:0;overflow:hidden;background:#0b0c0e}body{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.svelte-qg4u95{box-sizing:border-box}.onboarding.svelte-qg4u95{width:100%;height:100dvh;overflow:auto;display:grid;place-items:center;padding:72px 24px 32px;color:#e4e6ea;background:linear-gradient(90deg,rgba(255,255,255,.026) 1px,transparent 1px),linear-gradient(rgba(255,255,255,.026) 1px,transparent 1px),#0b0c0e;background-size:32px 32px}.brand.svelte-qg4u95{position:fixed;top:20px;left:24px;display:flex;align-items:center;gap:9px;color:#f2f3f5;font-size:14px;font-weight:650}.brand.svelte-qg4u95 img:where(.svelte-qg4u95){width:28px;height:28px;border-radius:7px}.step-card.svelte-qg4u95{width:min(640px,100%);min-height:520px;display:flex;flex-direction:column;padding:22px 26px 26px;border:1px solid #292c31;border-radius:14px;background:#0f1012f5;box-shadow:0 24px 70px #0000006b}.progress.svelte-qg4u95{display:flex;align-items:center;justify-content:space-between;padding-bottom:18px;border-bottom:1px solid #22252a;color:#686e77;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.dots.svelte-qg4u95{display:flex;gap:6px}.dots.svelte-qg4u95 i:where(.svelte-qg4u95){width:6px;height:6px;border-radius:999px;background:#33373d}.dots.svelte-qg4u95 i.active:where(.svelte-qg4u95){width:18px;background:#7cf7c5}.dots.svelte-qg4u95 i.complete:where(.svelte-qg4u95){background:#477565}.step-content.svelte-qg4u95{flex:1;display:flex;flex-direction:column;justify-content:center;gap:14px;padding:26px 16px 4px;animation:svelte-qg4u95-enter .2s ease-out}@keyframes svelte-qg4u95-enter{0%{opacity:0;transform:translateY(5px)}}h1.svelte-qg4u95{margin:0;color:#f3f4f6;font-size:clamp(24px,4vw,34px);line-height:1.12;letter-spacing:-.025em}p.svelte-qg4u95{margin:0;color:#9ca1aa;font-size:14px;line-height:1.65}code.svelte-qg4u95{color:#b8e9d7;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}.title-row.svelte-qg4u95{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.beta.svelte-qg4u95{padding:4px 8px;border:1px solid #426e5e;border-radius:999px;background:#17251f;color:#8ff0ca;font-size:10px;font-weight:700;text-transform:uppercase}.notice.svelte-qg4u95{padding:10px 12px;border-left:2px solid #6bc9a8;background:#151a18;color:#aeb5b0;font-size:12px}.field.svelte-qg4u95{display:flex;flex-direction:column;gap:7px}.field.svelte-qg4u95 label:where(.svelte-qg4u95){color:#c5c9cf;font-size:11px;font-weight:600}.field.svelte-qg4u95 label:where(.svelte-qg4u95) span:where(.svelte-qg4u95),.field.svelte-qg4u95 small:where(.svelte-qg4u95){color:#686e77;font-weight:400;font-size:10px}input.svelte-qg4u95,select.svelte-qg4u95{width:100%;height:38px;padding:0 11px;border:1px solid #2d3137;border-radius:7px;outline:none;background:#17191c;color:#e4e6ea;font:inherit;font-size:12px}input.svelte-qg4u95:focus,select.svelte-qg4u95:focus{border-color:#477565}.key-field.svelte-qg4u95{position:relative}.key-field.svelte-qg4u95 input:where(.svelte-qg4u95){padding-right:42px}.key-field.svelte-qg4u95 button:where(.svelte-qg4u95){position:absolute;top:4px;right:4px;width:30px;height:30px;display:grid;place-items:center;padding:0;border:0;background:transparent;color:#8e939b;cursor:pointer}.provider-chip.svelte-qg4u95{width:auto;max-width:220px;border-color:#355e4f;border-radius:999px;color:#9af8d1}.custom-toggle.svelte-qg4u95{display:flex;align-items:center;gap:8px;color:#b6bac1;font-size:12px}.custom-toggle.svelte-qg4u95 input:where(.svelte-qg4u95){width:14px;height:14px;accent-color:#7cf7c5}.privacy.svelte-qg4u95,.skip-note.svelte-qg4u95{color:#6e747d;font-size:11px}.warning.svelte-qg4u95,.error.svelte-qg4u95{padding:9px 10px;border-radius:7px;font-size:11px;line-height:1.45}.warning.svelte-qg4u95{border:1px solid #55452b;background:#241f17;color:#d9bd85}.error.svelte-qg4u95{border:1px solid #5c3030;background:#251919;color:#eea2a2}.actions.svelte-qg4u95{display:flex;align-items:center;margin-top:auto;padding-top:16px}.actions.end.svelte-qg4u95{justify-content:flex-end}.actions.split.svelte-qg4u95{justify-content:space-between}button.svelte-qg4u95,.community-link.svelte-qg4u95{font:inherit}button.primary.svelte-qg4u95,.community-link.svelte-qg4u95{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:38px;padding:0 15px;border:1px solid #4d8c75;border-radius:7px;background:#1a3b30;color:#a4f8d5;font-size:12px;font-weight:650;cursor:pointer;text-decoration:none}button.primary.svelte-qg4u95:hover,.community-link.svelte-qg4u95:hover{background:#214a3d}.text-button.svelte-qg4u95,.skip.svelte-qg4u95{border:0;background:transparent;color:#8e939b;font-size:12px;cursor:pointer}.skip.svelte-qg4u95{align-self:center;margin-top:4px;text-decoration:underline;text-underline-offset:3px}.skip-note.svelte-qg4u95{align-self:center;text-align:center}.preset.svelte-qg4u95{display:grid;grid-template-columns:180px 1fr;gap:16px;align-items:center;padding:12px;border:1px solid #292d32;border-radius:10px;background:#131518}.preset.svelte-qg4u95 img:where(.svelte-qg4u95){width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:6px;background:#070809}.preset.svelte-qg4u95 div:where(.svelte-qg4u95){display:flex;flex-direction:column;gap:6px}.preset.svelte-qg4u95 strong:where(.svelte-qg4u95){font-size:13px}.preset.svelte-qg4u95 span:where(.svelte-qg4u95){color:#858b94;font-size:11px;line-height:1.45}.loop.svelte-qg4u95{display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;padding:12px;color:#727982;font-size:10px;text-align:center}.loop.svelte-qg4u95 span:where(.svelte-qg4u95){color:#aeb3ba}.hero-icon.svelte-qg4u95{width:30px;height:30px}.community-links.svelte-qg4u95{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start}.community-link.svelte-qg4u95 img:where(.svelte-qg4u95){width:17px;height:17px}.product-hunt-badge.svelte-qg4u95{display:inline-flex;flex:0 0 auto;overflow:hidden;border-radius:7px;line-height:0}.product-hunt-badge.svelte-qg4u95 img:where(.svelte-qg4u95){display:block;width:250px;height:54px}.final-logo.svelte-qg4u95{width:56px;height:56px;align-self:center;border-radius:13px}.final-logo.svelte-qg4u95+h1:where(.svelte-qg4u95),.final-logo.svelte-qg4u95+h1:where(.svelte-qg4u95)+p:where(.svelte-qg4u95){text-align:center}button.final.svelte-qg4u95{align-self:center;margin-top:14px}@media(max-width:600px){.onboarding.svelte-qg4u95{padding:64px 12px 12px}.brand.svelte-qg4u95{left:16px;top:16px}.step-card.svelte-qg4u95{min-height:calc(100dvh - 76px);padding:18px 14px}.step-content.svelte-qg4u95{padding:22px 4px 2px}.preset.svelte-qg4u95{grid-template-columns:1fr}}.ai-chat-panel.svelte-lobal1{height:100%;min-height:0;display:flex;flex-direction:column;background:#111214;color:#e4e6ea}.chat-header.svelte-lobal1{min-height:57px;padding:0 14px 0 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #1c1d20;background:#0d0e10}.chat-title.svelte-lobal1,.header-actions.svelte-lobal1{display:flex;align-items:center;gap:8px}.chat-title.svelte-lobal1{font-size:13px;font-weight:600}.chat-title.svelte-lobal1 svg{color:#0a84ff}button.svelte-lobal1{font:inherit}.icon-button.svelte-lobal1{width:28px;height:28px;padding:0;display:grid;place-items:center;border:1px solid #2a2d33;border-radius:6px;color:#8e939b;background:#17191c;cursor:pointer}.icon-button.svelte-lobal1:hover,.icon-button.active.svelte-lobal1{color:#0a84ff;border-color:#244f78}.settings-view.svelte-lobal1{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#34383e transparent;padding:20px 16px;display:flex;flex-direction:column;gap:16px}h3.svelte-lobal1{margin:0 0 6px;font-size:14px}.settings-view.svelte-lobal1>div:where(.svelte-lobal1)>p:where(.svelte-lobal1){margin:0;color:#8e939b;font-size:12px;line-height:1.5}.settings-view.svelte-lobal1>div:where(.svelte-lobal1)>p:where(.svelte-lobal1) code:where(.svelte-lobal1){color:#a9b0b9;font-size:11px}.field.svelte-lobal1{display:flex;flex-direction:column;gap:7px}.field.svelte-lobal1 label:where(.svelte-lobal1){color:#b6bac1;font-size:11px;font-weight:600}.field.svelte-lobal1 label:where(.svelte-lobal1) span:where(.svelte-lobal1){color:#6b7280;font-weight:400}.field.svelte-lobal1 small:where(.svelte-lobal1){color:#6b7280;font-size:10px;line-height:1.35}input.svelte-lobal1,select.svelte-lobal1,textarea.svelte-lobal1{box-sizing:border-box;width:100%;border:1px solid #2a2d33;border-radius:7px;outline:none;background:#17191c;color:#e4e6ea}input.svelte-lobal1{height:36px;padding:0 10px;font-size:12px}input.svelte-lobal1:focus,select.svelte-lobal1:focus,textarea.svelte-lobal1:focus{border-color:#0a84ff}.key-input.svelte-lobal1{position:relative}.key-input.svelte-lobal1 input:where(.svelte-lobal1){padding-right:38px}.key-input.svelte-lobal1 button:where(.svelte-lobal1){position:absolute;top:4px;right:4px;width:28px;height:28px;display:grid;place-items:center;padding:0;border:0;background:transparent;color:#8e939b;cursor:pointer}.provider-chip.svelte-lobal1{width:auto;height:28px;padding:0 26px 0 9px;border-color:#244f78;border-radius:999px;color:#66b5ff;font-size:11px}.custom-toggle.svelte-lobal1{display:flex;align-items:center;gap:8px;color:#b6bac1;font-size:12px}.custom-toggle.svelte-lobal1 input:where(.svelte-lobal1){width:14px;height:14px;accent-color:#0a84ff}.privacy-note.svelte-lobal1{margin:0;color:#777d86;font-size:11px;line-height:1.45}.provider-warning.svelte-lobal1{margin:0;padding:9px;border:1px solid #55452b;border-radius:6px;background:#241f17;color:#d9bd85;font-size:11px;line-height:1.45}.provider-note.svelte-lobal1{margin:0;padding:9px;border:1px solid #1e4e76;border-radius:6px;background:#111f2c;color:#9bcfff;font-size:11px;line-height:1.45}.guide-note.svelte-lobal1{margin:0;color:#777d86;font-size:11px;line-height:1.45}.guide-note.svelte-lobal1 a:where(.svelte-lobal1){color:#0a84ff;text-decoration:none}.guide-note.svelte-lobal1 a:where(.svelte-lobal1):hover{text-decoration:underline}.guide-note.svelte-lobal1 code:where(.svelte-lobal1){color:#a9b0b9;font-size:10px}.copy-prompt-button.svelte-lobal1{align-self:flex-start;padding:7px 10px;border:1px solid #244f78;border-radius:6px;background:#111f2c;color:#66b5ff;cursor:pointer;font-size:11px;font-weight:600}.copy-prompt-button.svelte-lobal1:hover{border-color:#0a84ff;background:#102a42}.error-message.svelte-lobal1{margin:0;color:#f09b9b;font-size:11px;line-height:1.4}.settings-actions.svelte-lobal1{margin-top:auto;display:flex;justify-content:flex-end;gap:8px}.primary-button.svelte-lobal1,.secondary-button.svelte-lobal1,.load-button.svelte-lobal1,.repair-button.svelte-lobal1{padding:7px 10px;border-radius:6px;cursor:pointer;font-size:11px;font-weight:600}.primary-button.svelte-lobal1,.load-button.svelte-lobal1{border:1px solid #0a84ff;background:#10345a;color:#66b5ff}.secondary-button.svelte-lobal1{border:1px solid #2a2d33;background:#17191c;color:#a5aab2}.repair-button.svelte-lobal1{margin-left:6px;border:1px solid #59472c;background:#251f17;color:#d9bd85}.secondary-button.danger.svelte-lobal1{margin-right:auto;color:#dc9494}.message-list.svelte-lobal1{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;scrollbar-width:none;padding:16px;display:flex;flex-direction:column;gap:12px}.message-list.svelte-lobal1::-webkit-scrollbar{display:none;width:0;height:0}.settings-view.svelte-lobal1::-webkit-scrollbar,.message-list.svelte-lobal1::-webkit-scrollbar,textarea.svelte-lobal1::-webkit-scrollbar{width:6px;height:6px}.settings-view.svelte-lobal1::-webkit-scrollbar-track,.message-list.svelte-lobal1::-webkit-scrollbar-track,textarea.svelte-lobal1::-webkit-scrollbar-track{background:transparent}.settings-view.svelte-lobal1::-webkit-scrollbar-thumb,.message-list.svelte-lobal1::-webkit-scrollbar-thumb,textarea.svelte-lobal1::-webkit-scrollbar-thumb{border-radius:999px;background:#34383e}.settings-view.svelte-lobal1::-webkit-scrollbar-thumb:hover,.message-list.svelte-lobal1::-webkit-scrollbar-thumb:hover,textarea.svelte-lobal1::-webkit-scrollbar-thumb:hover{background:#484d55}.empty-state.svelte-lobal1{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#6f747c;font-size:11px;line-height:1.5;text-align:center}.empty-state.svelte-lobal1 strong:where(.svelte-lobal1){color:#8e939b;font-size:12px;font-weight:500}.empty-state.svelte-lobal1 span:where(.svelte-lobal1){max-width:230px}.empty-state.svelte-lobal1 a:where(.svelte-lobal1){color:#0a84ff;text-decoration:none}.empty-state.svelte-lobal1 a:where(.svelte-lobal1):hover{text-decoration:underline}.message.svelte-lobal1{align-self:stretch;padding:11px;border:1px solid #24262a;border-radius:9px;background:#151619}.message.user.svelte-lobal1{align-self:flex-end;max-width:86%;background:#101e2c;border-color:#183a5c}.message-role.svelte-lobal1{margin-bottom:6px;color:#0a84ff;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.message.user.svelte-lobal1 .message-role:where(.svelte-lobal1){color:#9ca3af}.message.svelte-lobal1 p:where(.svelte-lobal1){margin:0;color:#c8cbd0;font-size:12px;line-height:1.5;white-space:pre-wrap}pre.svelte-lobal1{margin:9px 0;padding:10px;overflow:visible;border:1px solid #25282d;border-radius:6px;background:#0d0e10;color:#a8d5ff;font:10px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}.thinking.svelte-lobal1{color:#777d86;font-size:11px}.composer-wrap.svelte-lobal1{padding:10px 12px 12px;border-top:1px solid #1c1d20;background:#0d0e10}.composer-wrap.svelte-lobal1 .error-message:where(.svelte-lobal1){margin-bottom:8px}.composer.svelte-lobal1{display:flex;align-items:flex-end;gap:7px;padding:7px;border:1px solid #2a2d33;border-radius:10px;background:#17191c}textarea.svelte-lobal1{min-height:38px;max-height:120px;padding:4px;resize:none;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#34383e transparent;border:0;background:transparent;font-size:12px;line-height:1.4}.composer.svelte-lobal1 button:where(.svelte-lobal1){flex:0 0 auto;width:30px;height:30px;display:grid;place-items:center;padding:0;border:0;border-radius:50%;background:transparent;color:#66b5ff;cursor:pointer;transition:color .15s ease,background .15s ease,transform .15s ease}.composer.svelte-lobal1 button:where(.svelte-lobal1):hover:not(:disabled){background:#0a84ff1a;color:#d8ecff;transform:translateY(-1px)}.composer.svelte-lobal1 button:where(.svelte-lobal1):focus-visible{outline:2px solid #0a84ff;outline-offset:1px}.composer.svelte-lobal1 button:where(.svelte-lobal1):disabled{border:0;background:transparent;color:#4c5158;cursor:default}.ai-chat-panel.svelte-lobal1{font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,Arial,sans-serif;background:#141417f5}.chat-header.svelte-lobal1,.composer-wrap.svelte-lobal1{background:#0e0e10f5;border-color:#ffffff14}.suggestion-chips.svelte-lobal1{display:flex;gap:6px;padding-bottom:8px;overflow-x:auto;scrollbar-width:none}.suggestion-chips.svelte-lobal1::-webkit-scrollbar{display:none}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1){flex:0 0 auto;height:26px;padding:0 9px;border:1px solid rgba(255,255,255,.08);border-radius:999px;background:#ffffff0a;color:#9999a1;font-size:10px;cursor:pointer}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1):hover{border-color:#0a84ff6b;color:#dceeff;background:#0a84ff1a}.composer.svelte-lobal1{align-items:center;min-height:48px;padding:5px 6px 5px 10px;border-color:#ffffff1a;border-radius:12px;background:#19191c;box-shadow:0 8px 24px #0000002e;transition:border-color .15s ease,box-shadow .15s ease}.composer.svelte-lobal1:focus-within{border-color:#0a84ffb3;box-shadow:0 0 0 3px #0a84ff1a,0 10px 30px #00000038}.command-mark.svelte-lobal1{flex:0 0 auto;width:20px;color:#6d6d75;font-size:13px;font-weight:700}.composer.svelte-lobal1 textarea:where(.svelte-lobal1){min-height:34px;padding:7px 2px;color:#f2f2f5}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1){width:32px;height:32px;border-radius:8px;background:#0a84ff;color:#fff}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1):hover:not(:disabled){background:#2997ff;color:#fff;transform:none}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1):disabled{background:#ffffff0d;color:#55555c}.composer-hint.svelte-lobal1{display:block;margin-top:6px;color:#5f5f67;font-size:9px;text-align:right}.empty-state.svelte-lobal1 strong:where(.svelte-lobal1){color:#d4d4d8;font-size:13px}.message.svelte-lobal1{border-color:#ffffff14;background:#ffffff09}.ai-chat-panel.svelte-lobal1{background:#151517}.chat-header.svelte-lobal1,.composer-wrap.svelte-lobal1{background:#131315;backdrop-filter:none}.icon-button.svelte-lobal1,.secondary-button.svelte-lobal1,.copy-prompt-button.svelte-lobal1{border-color:#ffffff14;background:#1b1b1e;color:#aaaab1}.icon-button.svelte-lobal1:hover,.icon-button.active.svelte-lobal1,.copy-prompt-button.svelte-lobal1:hover{border-color:#ffffff21;background:#232327;color:#f2f2f4}.provider-chip.svelte-lobal1{border-color:#ffffff1a;background:#1a1a1d;color:#b9b9c0}.message.svelte-lobal1,.message.user.svelte-lobal1{border-color:#ffffff14;background:#1a1a1d}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1){border-radius:7px;background:#1a1a1d}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1):hover{border-color:#ffffff21;background:#222226;color:#ededf0}.composer.svelte-lobal1{min-height:46px;border-radius:8px;border-color:#ffffff1a;background:#1b1b1e;box-shadow:none}.composer.svelte-lobal1:focus-within{border-color:#0a84ffa6;box-shadow:none}.composer.svelte-lobal1 button:where(.svelte-lobal1):hover:not(:disabled){transform:none}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1){border-radius:7px}.ai-chat-panel.svelte-lobal1{font-family:Inter Variable,Inter,-apple-system,BlinkMacSystemFont,sans-serif;font-feature-settings:"cv02","cv03","cv04","cv11"}.assistant-empty-state.svelte-lobal1{gap:9px;padding:24px}.assistant-empty-icon.svelte-lobal1{width:38px;height:38px;display:grid;place-items:center;margin-bottom:3px;border:1px solid rgba(255,255,255,.09);border-radius:9px;background:#1d1d20;color:#78a8ff;box-shadow:none}.assistant-empty-state.svelte-lobal1>span:where(.svelte-lobal1):not(.assistant-empty-icon){max-width:240px;color:#777780;font-size:11px;line-height:1.5}.assistant-guide-link.svelte-lobal1{color:#91b5f4;font-size:10px;text-decoration:none}.assistant-guide-link.svelte-lobal1:hover{color:#b6cef7;text-decoration:underline}.composer-wrap.svelte-lobal1{padding:11px 12px 12px}.suggestion-chips.svelte-lobal1{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px;overflow:visible;padding-bottom:8px}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1){min-width:0;width:100%;height:27px;overflow:hidden;padding:0 7px;border-color:#ffffff17;border-radius:7px;background:#1d1d20;color:#9a9aa2;box-shadow:none;font-size:9.5px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1):hover{border-color:#ffffff26;background:#252529;color:#e5e5e8}.composer.svelte-lobal1{min-height:52px;padding:6px 7px 6px 10px;border-color:#ffffff1c;border-radius:9px;background:#1b1b1e;box-shadow:none}.composer.svelte-lobal1:focus-within{border-color:#78a8ff85;box-shadow:none}.command-mark.svelte-lobal1{width:18px;color:#73737c}.composer.svelte-lobal1 textarea:where(.svelte-lobal1){min-width:0;min-height:38px;padding:8px 3px;font-family:Inter Variable,Inter,-apple-system,BlinkMacSystemFont,sans-serif;font-size:11.5px;font-weight:450;line-height:1.45;letter-spacing:-.01em}.composer.svelte-lobal1 textarea:where(.svelte-lobal1)::placeholder{color:#777780;opacity:1}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1){width:34px;height:34px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#0a84ff;color:#fff;box-shadow:none}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1):hover:not(:disabled){background:#2997ff}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1):disabled{border-color:#ffffff12;background:#242428;color:#56565e;box-shadow:none}.composer-hint.svelte-lobal1{margin-top:7px;color:#55555d;font-size:9px}.icon-button.svelte-lobal1:hover,.icon-button.active.svelte-lobal1,.suggestion-chips.svelte-lobal1 button:where(.svelte-lobal1):hover{border-color:#8ab4ff4d;background:linear-gradient(135deg,#8ab4ff29,#7cf7c517);color:#eef7f4}.composer.svelte-lobal1 .send-button:where(.svelte-lobal1),.composer.svelte-lobal1 .send-button:where(.svelte-lobal1):hover:not(:disabled){border-color:#ffffff2e;background:linear-gradient(135deg,#8ab4ff,#7cf7c5);color:#fff}.ai-config.svelte-1tw9x39{display:flex;flex-direction:column;flex:1;min-height:0}.config-nav.svelte-1tw9x39{display:flex;gap:2px;padding:8px 10px 0;border-bottom:1px solid #1d1f22;flex-wrap:wrap}.config-nav.svelte-1tw9x39 button:where(.svelte-1tw9x39){display:inline-flex;align-items:center;gap:5px;padding:7px 10px;border:0;border-bottom:2px solid transparent;background:transparent;color:#8e939b;font-size:11px;font-weight:600;cursor:pointer}.config-nav.svelte-1tw9x39 button.active:where(.svelte-1tw9x39){color:#f1f2f4;border-bottom-color:#0a84ff}.config-nav.svelte-1tw9x39 button:where(.svelte-1tw9x39):hover{color:#dce1e6}.config-body.svelte-1tw9x39{flex:1;min-height:0;overflow-y:auto;padding:14px}.config-section.svelte-1tw9x39{display:flex;flex-direction:column;gap:12px}.config-title.svelte-1tw9x39{margin:0;font-size:13px;font-weight:700;color:#f1f2f4}.config-desc.svelte-1tw9x39{margin:0;font-size:11px;line-height:1.5;color:#8e939b}.config-link.svelte-1tw9x39{display:inline-flex;align-items:center;gap:5px;align-self:flex-start;padding:0;border:0;background:transparent;color:#0a84ff;font-size:11px;cursor:pointer}.config-link.svelte-1tw9x39:hover{text-decoration:underline}.skill-row.svelte-1tw9x39{display:flex;flex-direction:column;gap:6px;padding:10px 0;border-bottom:1px solid #1a1c1f}.skill-main.svelte-1tw9x39{display:flex;align-items:center;justify-content:space-between;gap:10px}.skill-toggle.svelte-1tw9x39{display:inline-flex;align-items:center;gap:8px;cursor:pointer}.skill-name.svelte-1tw9x39{font-size:12px;font-weight:600;color:#f1f2f4}.skill-desc.svelte-1tw9x39{margin:0;font-size:11px;line-height:1.5;color:#8e939b}.skill-detail.svelte-1tw9x39{display:flex;flex-direction:column;gap:6px;font-size:11px;color:#b8bec6}.skill-detail.svelte-1tw9x39 code:where(.svelte-1tw9x39){color:#0a84ff;word-break:break-all}.skill-detail.svelte-1tw9x39 pre:where(.svelte-1tw9x39){margin:0;padding:10px;border:1px solid #2c3138;border-radius:6px;background:#0d0e10;color:#b8bec6;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.context-card.svelte-1tw9x39{display:flex;flex-direction:column;gap:8px;padding:14px;border:1px solid #2c3138;border-radius:8px;background:#0d0e10}.context-heading.svelte-1tw9x39{font-size:12px;font-weight:700;color:#f1f2f4;margin-bottom:2px}.context-line.svelte-1tw9x39{font-size:12px;color:#b8bec6}.context-line.ok.svelte-1tw9x39{color:#b8ffe4}.context-line.missing.svelte-1tw9x39{color:#f0b26d}.panel-content.svelte-167vias{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:14px;scrollbar-width:thin;scrollbar-color:#34373d #111214}.config-section.svelte-167vias{display:flex;flex-direction:column;gap:12px}.config-title.svelte-167vias{margin:0;font-size:13px;font-weight:700;color:#f1f2f4}.config-title-row.svelte-167vias{display:flex;align-items:center;justify-content:space-between}.config-desc.svelte-167vias{margin:0;font-size:11px;line-height:1.5;color:#8e939b}.config-textarea.svelte-167vias{width:100%;box-sizing:border-box;resize:vertical;padding:10px;border:1px solid #2c3138;border-radius:6px;background:#0d0e10;color:#e7eaee;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.5}.field.svelte-167vias{display:flex;flex-direction:column;gap:6px}.field-label.svelte-167vias{color:#8e939b;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.config-input.svelte-167vias{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid #2c3138;border-radius:6px;background:#0d0e10;color:#e7eaee;font-size:12px}.config-input.svelte-167vias:focus{outline:none;border-color:#4a5563}.inline-add.svelte-167vias{display:flex;gap:6px;align-items:center}.inline-add.svelte-167vias .config-input:where(.svelte-167vias){flex:1}.color-input.svelte-167vias{width:34px;height:34px;padding:0;border:1px solid #2c3138;border-radius:6px;background:#0d0e10;cursor:pointer}.chip-row.svelte-167vias{display:flex;flex-wrap:wrap;gap:6px}.chip.svelte-167vias{display:inline-flex;align-items:center;gap:5px;padding:4px 6px 4px 9px;border:1px solid #2c3138;border-radius:20px;background:#16181c;color:#dce1e6;font-size:11px}.chip.svelte-167vias button:where(.svelte-167vias){display:inline-flex;padding:0;border:0;background:transparent;color:#8e939b;cursor:pointer}.chip.svelte-167vias button:where(.svelte-167vias):hover{color:#ff9da5}.color-chip.svelte-167vias .swatch:where(.svelte-167vias){width:12px;height:12px;border-radius:3px;border:1px solid rgba(255,255,255,.15)}.avoid-chip.svelte-167vias{border-color:#5a3a3d;background:#241a1b}.config-btn.svelte-167vias{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:1px solid #2c3138;border-radius:6px;background:#16181c;color:#dce1e6;font-size:12px;font-weight:600;cursor:pointer}.config-btn.svelte-167vias:hover{background:#202329}.config-link.svelte-167vias{display:inline-flex;align-items:center;gap:5px;align-self:flex-start;padding:0;border:0;background:transparent;color:#0a84ff;font-size:11px;cursor:pointer}.config-link.svelte-167vias:hover{text-decoration:underline}.config-link.danger.svelte-167vias{color:#ff9da5}.brand-preview.svelte-167vias{display:flex;flex-direction:column;gap:6px}.brand-preview.svelte-167vias pre:where(.svelte-167vias){margin:0;padding:10px;border:1px solid #2c3138;border-radius:6px;background:#0d0e10;color:#b8bec6;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.color-picker.svelte-1mhl43o{position:relative;width:100%}.color-trigger.svelte-1mhl43o{width:100%;height:34px;display:grid;grid-template-columns:20px 1fr auto;align-items:center;gap:9px;padding:0 10px 0 7px;border:1px solid rgba(255,255,255,.09);border-radius:7px;background:#18181b;color:#b6b6bd;font:inherit;cursor:pointer}.color-trigger.svelte-1mhl43o:hover,.color-trigger[aria-expanded=true].svelte-1mhl43o{border-color:#8ab4ff57;background:linear-gradient(135deg,#8ab4ff1c,#7cf7c50e);color:#f2f2f4}.trigger-swatch.svelte-1mhl43o,.toolbar-swatch.svelte-1mhl43o{display:block;border:1px solid rgba(255,255,255,.24);border-radius:5px;box-shadow:inset 0 0 0 1px #00000029}.trigger-swatch.svelte-1mhl43o{width:20px;height:20px}.trigger-value.svelte-1mhl43o{overflow:hidden;font-size:11px;font-weight:550;font-variant-numeric:tabular-nums;letter-spacing:.02em;text-align:left;text-overflow:ellipsis}.color-popover.svelte-1mhl43o{position:absolute;top:calc(100% + 6px);left:0;z-index:80;width:236px;box-sizing:border-box;padding:9px;border:1px solid rgba(255,255,255,.11);border-radius:9px;background:#1b1b1e;box-shadow:0 12px 30px #0000006b}.picker-toolbar.svelte-1mhl43o{height:30px;display:grid;grid-template-columns:26px 1fr 30px;gap:6px;margin-bottom:8px}.toolbar-swatch.svelte-1mhl43o{width:26px;height:30px;box-sizing:border-box}.hex-input.svelte-1mhl43o{min-width:0;padding:0 8px;border:1px solid rgba(255,255,255,.09);border-radius:6px;outline:none;background:#121214;color:#dedee2;font:inherit;font-size:10.5px;font-variant-numeric:tabular-nums;text-transform:uppercase}.hex-input.svelte-1mhl43o:focus{border-color:#8ab4ff80}.custom-color.svelte-1mhl43o{position:relative;display:grid;place-items:center;overflow:hidden;border:1px solid rgba(255,255,255,.09);border-radius:6px;background:#242428;color:#a8a8af;cursor:pointer}.custom-color.svelte-1mhl43o:hover{border-color:#8ab4ff57;color:#fff}.custom-color.svelte-1mhl43o input:where(.svelte-1mhl43o){position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}.palette-grid.svelte-1mhl43o{display:grid;grid-template-columns:repeat(8,1fr);gap:3px}.palette-swatch.svelte-1mhl43o{width:24px;height:20px;display:grid;place-items:center;padding:0;border:1px solid rgba(255,255,255,.08);border-radius:4px;color:#fff;cursor:pointer}.palette-swatch.svelte-1mhl43o:hover{z-index:1;border-color:#ffffffb8;transform:scale(1.1)}.palette-swatch.selected.svelte-1mhl43o{border-color:#fff;box-shadow:0 0 0 1px #111114}@media(prefers-reduced-motion:reduce){.palette-swatch.svelte-1mhl43o:hover{transform:none}}.rotation-row.svelte-151emff{width:100%;display:grid;grid-template-columns:30px 46px repeat(4,minmax(30px,1fr)) 30px;align-items:center;gap:4px}.rotation-dial.svelte-151emff{position:relative;width:30px;height:30px;box-sizing:border-box;border:1px solid #44444a;border-radius:50%;background:#242428;outline:none;cursor:ew-resize;touch-action:none}.rotation-dial.svelte-151emff:hover,.rotation-dial.svelte-151emff:focus-visible,.rotation-dial.dragging.svelte-151emff{border-color:#73737b;background:#2a2a2f}.dial-arm.svelte-151emff{position:absolute;inset:2px;pointer-events:none}.dial-line.svelte-151emff{position:absolute;top:2px;left:50%;width:1.5px;height:11px;border-radius:999px;background:#d7d7db;transform:translate(-50%)}.dial-center.svelte-151emff{position:absolute;top:50%;left:50%;width:4px;height:4px;border-radius:50%;background:#a2a2a9;transform:translate(-50%,-50%);pointer-events:none}.angle-field.svelte-151emff{position:relative;width:46px;height:28px;display:flex;align-items:center}.angle-field.svelte-151emff input:where(.svelte-151emff){width:100%;height:100%;box-sizing:border-box;padding:0 15px 0 7px;border:1px solid rgba(255,255,255,.09);border-radius:6px;outline:none;background:#1b1b1e;color:#dedee2;font:inherit;font-size:10px;font-variant-numeric:tabular-nums;-moz-appearance:textfield;appearance:textfield}.angle-field.svelte-151emff input:where(.svelte-151emff)::-webkit-inner-spin-button,.angle-field.svelte-151emff input:where(.svelte-151emff)::-webkit-outer-spin-button{display:none;-webkit-appearance:none}.angle-field.svelte-151emff input:where(.svelte-151emff):focus{border-color:#66666e}.angle-field.svelte-151emff span:where(.svelte-151emff){position:absolute;right:6px;color:#73737b;font-size:10px;pointer-events:none}.preset.svelte-151emff{min-width:0;height:28px;display:grid;place-items:center;padding:0 2px;border:1px solid rgba(255,255,255,.09);border-radius:6px;background:#1b1b1e;color:#85858d;font:inherit;font-size:9px;font-weight:550;cursor:pointer}.preset.svelte-151emff:hover{border-color:#55555d;background:#27272b;color:#e7e7e9}.preset.active.svelte-151emff{border-color:#66666e;background:#3a3a40;color:#fff}.flip.svelte-151emff{position:relative;padding:0}.flip.svelte-151emff:after{content:attr(data-tooltip);position:absolute;bottom:calc(100% + 6px);left:50%;z-index:20;padding:5px 7px;border:1px solid rgba(255,255,255,.1);border-radius:5px;background:#29292d;color:#f1f1f3;font-size:9.5px;font-weight:550;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transform:translate(-50%,3px);transition:opacity .12s ease,transform .12s ease}.flip.svelte-151emff:hover:after,.flip.svelte-151emff:focus-visible:after{opacity:1;transform:translate(-50%)}.motion-editor.svelte-1mvnu54{width:100%;height:100%;display:flex;flex-direction:column;background:#09090a;color:#f1f2f4;position:relative;min-height:0;overflow:hidden}.motion-editor.fullscreen.svelte-1mvnu54{position:fixed;inset:0;z-index:200}.workbench.svelte-1mvnu54{flex:1;min-height:0;display:grid;grid-template-columns:52px 260px 50px minmax(0,1fr) 300px}.workbench.chat-open.svelte-1mvnu54{grid-template-columns:52px 260px 324px minmax(0,1fr) 300px}.chat-drawer.svelte-1mvnu54{box-sizing:border-box;display:flex;min-width:0;min-height:0;padding:8px;overflow:hidden;background:linear-gradient(90deg,rgba(255,255,255,.026) 1px,transparent 1px),linear-gradient(rgba(255,255,255,.026) 1px,transparent 1px),#0b0c0e;background-size:32px 32px}.chat-drawer.svelte-1mvnu54 .ai-chat-panel{flex:1;height:auto;border:1px solid #2a2d33;border-radius:10px;overflow:hidden;box-shadow:0 14px 34px #00000047}.chat-drawer.collapsed.svelte-1mvnu54{display:flex;justify-content:center;padding-top:14px}.assistant-expand.svelte-1mvnu54{width:28px;height:28px;display:grid;place-items:center;padding:0;border:1px solid #244f78;border-radius:6px;background:#111f2c;color:#0a84ff;cursor:pointer}.nav-rail.svelte-1mvnu54{display:flex;flex-direction:column;gap:4px;padding:12px 6px;background:#0a0b0c;border-right:1px solid #1c1d20}.nav-item.svelte-1mvnu54{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:none;border-radius:8px;background:transparent;color:#6b7280;cursor:pointer;transition:all .15s ease}.nav-item.svelte-1mvnu54:hover{background:#17191c;color:#9ca3af}.nav-item.active.svelte-1mvnu54{background:#10263a;color:#0a84ff;box-shadow:inset 2px 0 #0a84ff}.content-panel.svelte-1mvnu54{display:flex;flex-direction:column;background:#111214;border-right:1px solid #24262a;min-height:0;overflow:hidden}.panel-header.svelte-1mvnu54{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid #1c1d20;background:#0d0e10}.panel-heading-title.svelte-1mvnu54{color:#e4e6ea;font-size:13px;font-weight:600;margin:0}.panel-header-actions.svelte-1mvnu54{display:flex;align-items:center;gap:6px}.header-icon-btn.svelte-1mvnu54{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid #2a2d33;border-radius:6px;background:#17191c;color:#a8adb5;cursor:pointer;transition:all .15s ease}.header-icon-btn.svelte-1mvnu54:hover{background:#202328;color:#d8dce2}.panel-content.svelte-1mvnu54{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:12px;scrollbar-width:thin;scrollbar-color:#34373d #111214}.asset-error.svelte-1mvnu54{margin:0 0 12px;color:#f09b9b;font-size:11px;line-height:1.4}.media-dropzone.svelte-1mvnu54{min-height:100%;box-sizing:border-box;padding:18px 12px;border:1px dashed #4b5060;border-radius:8px;color:#b9b8e8;text-align:center;transition:background .2s ease,border-color .2s ease,transform .2s ease}.media-dropzone.drag-active.svelte-1mvnu54{border-color:#4aa3ff;background:#0a84ff1a;animation:svelte-1mvnu54-upload-pulse .8s ease-in-out infinite alternate}@keyframes svelte-1mvnu54-upload-pulse{to{transform:scale(1.015);box-shadow:0 0 18px #79e4bb33}}.media-dropzone.svelte-1mvnu54:has(.import-media-button:where(.svelte-1mvnu54):hover){border-color:#0a84ff}.import-media-button.svelte-1mvnu54{display:flex;align-items:center;justify-content:center;gap:7px;width:100%;padding:9px 12px;border:1px solid #0a84ff;border-radius:6px;background:#10345a;color:#66b5ff;font-size:12px;font-weight:600;cursor:pointer}.import-media-button.svelte-1mvnu54:hover{background:#102a42}@media(prefers-reduced-motion:reduce){.media-dropzone.drag-active.svelte-1mvnu54,.audio-waveform.loading.svelte-1mvnu54{animation:none}}.panel-description.svelte-1mvnu54{color:#8e939b;font-size:12px;line-height:1.6;padding:0 0 16px;margin:0 0 16px;border-bottom:1px solid #1c1d20}.asset-folder.svelte-1mvnu54{margin-bottom:20px}.folder-header.svelte-1mvnu54{display:flex;align-items:center;gap:8px;padding:8px 0;margin-bottom:10px;color:#8e939b;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.folder-title.svelte-1mvnu54{flex:1}.folder-count.svelte-1mvnu54{color:#6b7280;font-size:10px;font-weight:600;background:#1a1c20;padding:2px 6px;border-radius:10px}.folder-content.svelte-1mvnu54{display:flex;flex-direction:column;gap:4px}.asset-item.svelte-1mvnu54{display:flex;align-items:center;gap:10px;padding:10px;border:1px solid #2a2d33;border-radius:6px;background:#0d0e10;transition:all .15s ease}.asset-item.svelte-1mvnu54:hover{background:#17191c;border-color:#363d4b}.asset-item-icon.svelte-1mvnu54{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#17191c;border:1px solid #2a2d33;border-radius:6px;color:#0a84ff}.asset-item-info.svelte-1mvnu54{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.asset-item-name.svelte-1mvnu54{color:#e4e6ea;font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-item-path.svelte-1mvnu54{color:#6b7280;font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-grid.svelte-1mvnu54{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px}.asset-card.svelte-1mvnu54{display:flex;flex-direction:column;border:1px solid transparent;border-radius:6px;background:#0d0e10;cursor:pointer;transition:all .15s ease;overflow:hidden;padding:0}.asset-card.svelte-1mvnu54:hover{background:#17191c;border-color:#2a2d33}.asset-thumbnail.svelte-1mvnu54{width:100%;aspect-ratio:16 / 9;display:flex;align-items:center;justify-content:center;background:#17191c;color:#6b7280;overflow:hidden}.asset-thumbnail.svelte-1mvnu54 img:where(.svelte-1mvnu54),.asset-thumbnail.svelte-1mvnu54 video:where(.svelte-1mvnu54){width:100%;height:100%;object-fit:cover}.asset-info.svelte-1mvnu54{padding:8px}.asset-name.svelte-1mvnu54{color:#d8dce2;font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-item.svelte-1mvnu54{display:flex;align-items:center;gap:10px;padding:12px;border:1px solid #2a2d33;border-radius:6px;background:#0d0e10;color:#d8dce2;font-size:13px}.audio-asset.svelte-1mvnu54{cursor:grab}.audio-asset.svelte-1mvnu54:active{cursor:grabbing}.panel-tabs.svelte-1mvnu54{display:flex;gap:2px}.panel-tab.svelte-1mvnu54{padding:6px 12px;border:none;border-bottom:2px solid transparent;background:transparent;color:#6b7280;font-size:12px;font-weight:500;cursor:pointer;transition:all .15s ease}.panel-tab.svelte-1mvnu54:hover{color:#9ca3af}.panel-tab.active.svelte-1mvnu54{color:#0a84ff;border-bottom-color:#0a84ff}.preset-grid.svelte-1mvnu54{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px}.preset-card.svelte-1mvnu54{display:flex;flex-direction:column;border:1px solid #2a2d33;border-radius:8px;background:#0d0e10;cursor:pointer;transition:all .15s ease;overflow:hidden;padding:0}.preset-card.svelte-1mvnu54:hover{background:#17191c;border-color:#245d91;transform:translateY(-2px);box-shadow:0 4px 12px #0000004d}.preset-thumbnail.svelte-1mvnu54{width:100%;aspect-ratio:16 / 9;display:flex;align-items:center;justify-content:center;background:#000;overflow:hidden}.preset-thumbnail.svelte-1mvnu54 img:where(.svelte-1mvnu54){width:100%;height:100%;object-fit:cover}.preset-info.svelte-1mvnu54{padding:10px}.preset-name.svelte-1mvnu54{color:#e4e6ea;font-size:12px;font-weight:600;text-align:center}.effects-categories.svelte-1mvnu54{display:flex;flex-direction:column;gap:16px}.effects-category.svelte-1mvnu54{display:flex;flex-direction:column;gap:8px}.category-title.svelte-1mvnu54{color:#8e939b;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.category-hint.svelte-1mvnu54{margin:-2px 0 2px;color:#686e77;font-size:10px;line-height:1.35}.effects-list.svelte-1mvnu54{display:flex;flex-direction:column;gap:2px}.effect-item.svelte-1mvnu54{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid transparent;border-radius:4px;background:transparent;color:#d8dce2;font-size:12px;text-align:left;cursor:pointer;transition:all .15s ease}.effect-item.svelte-1mvnu54:hover{background:#1a1c20;border-color:#2a2d33}.effect-item.svelte-1mvnu54:disabled{cursor:not-allowed;opacity:.4}.effect-item.svelte-1mvnu54 span:where(.svelte-1mvnu54){font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.transition-effect-item.svelte-1mvnu54{border-color:#245d91;background:linear-gradient(135deg,#0a84ff1f,#0a84ff08);cursor:grab}.transition-effect-item.svelte-1mvnu54:active{cursor:grabbing}.transition-effect-item.svelte-1mvnu54 span:where(.svelte-1mvnu54){display:flex;flex-direction:column;gap:2px}.transition-effect-item.svelte-1mvnu54 strong:where(.svelte-1mvnu54){color:#e9fff6;font-size:11px}.transition-effect-item.svelte-1mvnu54 small:where(.svelte-1mvnu54){color:#79827f;font-size:9px}.dialog-overlay.svelte-1mvnu54{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000;backdrop-filter:blur(4px)}.dialog.svelte-1mvnu54{width:90%;max-width:440px;background:#17191c;border:1px solid #2a2d33;border-radius:12px;box-shadow:0 20px 60px #0009;overflow:hidden}.dialog-header.svelte-1mvnu54{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #24262a}.dialog-header.svelte-1mvnu54 h3:where(.svelte-1mvnu54){margin:0;color:#e4e6ea;font-size:16px;font-weight:600}.dialog-close.svelte-1mvnu54{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border:none;border-radius:6px;background:transparent;color:#9ca3af;cursor:pointer;transition:all .15s ease}.dialog-close.svelte-1mvnu54:hover{background:#24262a;color:#e4e6ea}.dialog-body.svelte-1mvnu54{padding:20px}.dialog-body.svelte-1mvnu54 p:where(.svelte-1mvnu54){margin:0;color:#d8dce2;font-size:14px;line-height:1.6}.dialog-footer.svelte-1mvnu54{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid #24262a;background:#111214}.dialog-btn.svelte-1mvnu54{padding:8px 16px;border:1px solid #2a2d33;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:all .15s ease}.dialog-btn.secondary.svelte-1mvnu54{background:transparent;color:#d8dce2}.dialog-btn.secondary.svelte-1mvnu54:hover{background:#24262a}.dialog-btn.danger.svelte-1mvnu54{background:#ef4444;color:#fff;border-color:#ef4444}.dialog-btn.danger.svelte-1mvnu54:hover{background:#dc2626}.properties-panel.svelte-1mvnu54{min-height:0;overflow:auto;background:#111214;border-color:#24262a;padding:14px;scrollbar-width:thin;scrollbar-color:#34373d #111214;border-left:1px solid #24262a}.panel-title.svelte-1mvnu54,.section-title.svelte-1mvnu54{color:#8e939b;font-size:11px;font-weight:700;letter-spacing:0;text-transform:uppercase;margin-bottom:12px}.section-title.svelte-1mvnu54{margin-top:22px}.layer-list.svelte-1mvnu54{display:flex;flex-direction:column;gap:3px}.layer-row.svelte-1mvnu54{width:100%;min-height:48px;display:grid;grid-template-columns:28px minmax(0,1fr);align-items:center;gap:9px;margin:0;padding:6px 8px;border:1px solid transparent;border-radius:4px;background:transparent;color:#e4e6ea;cursor:pointer;text-align:left}.layer-row.svelte-1mvnu54:hover{background:#1a1c20}.layer-row.selected.svelte-1mvnu54{background:#18201e;border-color:#245d91;box-shadow:inset 2px 0 #0a84ff}.layer-icon.svelte-1mvnu54{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid #2d3137;border-radius:4px;background:#17191c;color:#a8adb5;overflow:hidden}.layer-icon.svelte-1mvnu54 img:where(.svelte-1mvnu54),.track-thumb.svelte-1mvnu54 img:where(.svelte-1mvnu54){width:100%;height:100%;display:block;object-fit:contain}.selected.svelte-1mvnu54 .layer-icon:where(.svelte-1mvnu54),.selection-summary.svelte-1mvnu54 .layer-icon:where(.svelte-1mvnu54){color:#0a84ff;border-color:#245d91}.layer-copy.svelte-1mvnu54,.selection-summary.svelte-1mvnu54>span:where(.svelte-1mvnu54):last-child{display:flex;min-width:0;flex-direction:column;gap:3px}.layer-copy.svelte-1mvnu54 strong:where(.svelte-1mvnu54),.selection-summary.svelte-1mvnu54 strong:where(.svelte-1mvnu54){overflow:hidden;color:#eef0f2;font-size:12px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.layer-copy.svelte-1mvnu54 small:where(.svelte-1mvnu54),.selection-summary.svelte-1mvnu54 small:where(.svelte-1mvnu54){overflow:hidden;color:#777d86;font-size:10px;text-overflow:ellipsis;white-space:nowrap}.selection-summary.svelte-1mvnu54{display:grid;grid-template-columns:30px minmax(0,1fr);align-items:center;gap:10px;margin:0 0 18px;padding:8px;border-bottom:1px solid #24262a}.preview-container.svelte-1mvnu54{position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;background:linear-gradient(90deg,rgba(255,255,255,.026) 1px,transparent 1px),linear-gradient(rgba(255,255,255,.026) 1px,transparent 1px),#0b0c0e;background-size:32px 32px;overflow:hidden}.stage-meta.svelte-1mvnu54{height:40px;display:flex;align-items:center;justify-content:space-between;padding:0 18px;color:#858a92;font-size:12px;border-bottom:1px solid #22252a;background:#0d0e10eb}.stage-actions.svelte-1mvnu54{display:flex;align-items:center;gap:10px}.meta-btn.svelte-1mvnu54,.icon-btn.svelte-1mvnu54{border:1px solid #2c3035;border-radius:6px;background:#17191c;color:#d8dce2;cursor:pointer}.meta-btn.svelte-1mvnu54{height:28px;display:inline-flex;align-items:center;gap:6px;padding:0 10px;font-size:12px}.meta-btn.svelte-1mvnu54:disabled{cursor:not-allowed;opacity:.45}.icon-btn.svelte-1mvnu54{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center}.meta-btn.svelte-1mvnu54:hover,.icon-btn.svelte-1mvnu54:hover{background:#202328}.stage.svelte-1mvnu54{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:36px;overflow:hidden;position:relative}.property-align-actions.svelte-1mvnu54{display:grid;grid-template-columns:repeat(3,1fr) 1px repeat(3,1fr);overflow:hidden;border:1px solid #30353c;border-radius:5px}.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54){min-width:0;height:30px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-right:1px solid #30353c;background:#181b20;color:#cbd0d7;cursor:pointer}.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):last-child{border-right:0}.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover{background:#282d34;color:#0a84ff}.canvas-shell.svelte-1mvnu54{position:relative;flex:0 0 auto;height:auto}.preview-canvas.svelte-1mvnu54{display:block;width:100%;height:auto;max-width:none;max-height:none;border-radius:4px;background:#000;box-shadow:0 24px 80px #00000094,0 0 0 1px #ffffff14;cursor:grab;touch-action:none}.preview-canvas.dragging.svelte-1mvnu54{cursor:grabbing}.snap-guide.svelte-1mvnu54{position:absolute;z-index:5;display:block;background:#ff405f;box-shadow:0 0 0 1px #ff405f2e;pointer-events:none}.snap-guide-v.svelte-1mvnu54{top:0;bottom:0;width:1px;transform:translate(-.5px)}.snap-guide-h.svelte-1mvnu54{right:0;left:0;height:1px;transform:translateY(-.5px)}.asset-preview-overlay.svelte-1mvnu54{position:absolute;inset:36px;display:flex;align-items:center;justify-content:center;background:#000000f2;border:0;padding:0;backdrop-filter:blur(8px);z-index:100;cursor:default;border-radius:4px}.asset-preview-overlay.svelte-1mvnu54 img:where(.svelte-1mvnu54),.asset-preview-overlay.svelte-1mvnu54 video:where(.svelte-1mvnu54){max-width:100%;max-height:100%;object-fit:contain;border-radius:4px}.asset-preview-close.svelte-1mvnu54{position:absolute;top:12px;right:12px;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:1px solid #3a3f46;border-radius:6px;background:#111317e6;color:#fff;cursor:pointer}.asset-preview-close.svelte-1mvnu54:hover{background:#292e35}.property-group.svelte-1mvnu54{margin-bottom:16px}.property-label.svelte-1mvnu54{display:block;color:#8e939b;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.property-label-row.svelte-1mvnu54{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.property-label-row.svelte-1mvnu54 .property-label:where(.svelte-1mvnu54){margin-bottom:0}.property-action.svelte-1mvnu54{padding:0;border:0;background:transparent;color:#0a84ff;font-size:10px;cursor:pointer}.property-action.svelte-1mvnu54:hover{color:#b9ddff;text-decoration:underline}.clip-original-size.svelte-1mvnu54{width:100%;margin-bottom:14px}.transition-pair-copy.svelte-1mvnu54{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px;margin:0 0 16px;padding:10px;border:1px solid #2a2d33;border-radius:5px;background:#121417}.transition-pair-copy.svelte-1mvnu54>span:where(.svelte-1mvnu54):not(.transition-pair-arrow){display:flex;min-width:0;flex-direction:column;gap:3px}.transition-pair-copy.svelte-1mvnu54 small:where(.svelte-1mvnu54){color:#727983;font-size:9px;text-transform:uppercase}.transition-pair-copy.svelte-1mvnu54 strong:where(.svelte-1mvnu54){overflow:hidden;color:#e8ebef;font-size:11px;text-overflow:ellipsis}.transition-pair-arrow.svelte-1mvnu54{color:#0a84ff}.transition-remove.svelte-1mvnu54{width:100%;color:#ff9d9d}.property-row.svelte-1mvnu54{display:grid;grid-template-columns:1fr 1fr;gap:8px}.number-input-wrapper.svelte-1mvnu54{position:relative;display:flex;align-items:center}.number-input.svelte-1mvnu54{width:100%;height:32px;box-sizing:border-box;border:1px solid #2a2d33;border-radius:6px;background:#17191c;color:#e4e6ea;font:inherit;font-size:12px;font-variant-numeric:tabular-nums;padding:0 26px 0 10px;outline:none;transition:all .12s ease}.number-input.svelte-1mvnu54:hover{border-color:#363d4b;background:#1a1c20}.number-input.svelte-1mvnu54:focus{border-color:#0a84ff;background:#1a1c20;box-shadow:0 0 0 2px #0a84ff1f}.input-suffix.svelte-1mvnu54{position:absolute;right:10px;color:#6b7280;font-size:11px;font-weight:500;pointer-events:none}.slider-control.svelte-1mvnu54{display:flex;align-items:center;gap:10px}.custom-slider.svelte-1mvnu54{flex:1;height:3px;-webkit-appearance:none;appearance:none;background:transparent;outline:none;padding:0;margin:0}.custom-slider.svelte-1mvnu54::-webkit-slider-track{width:100%;height:3px;background:linear-gradient(to right,#0a84ff 0%,#0a84ff var(--slider-progress, 50%),#2a2d33 var(--slider-progress, 50%),#2a2d33 100%);border-radius:2px}.custom-slider.svelte-1mvnu54::-moz-range-track{width:100%;height:3px;background:#2a2d33;border-radius:2px}.custom-slider.svelte-1mvnu54::-moz-range-progress{height:3px;background:#0a84ff;border-radius:2px}.custom-slider.svelte-1mvnu54::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:12px;height:12px;background:#e4e6ea;border:2px solid #0a84ff;border-radius:50%;cursor:pointer;box-shadow:0 1px 3px #0006;transition:all .12s ease}.custom-slider.svelte-1mvnu54::-moz-range-thumb{width:12px;height:12px;background:#e4e6ea;border:2px solid #0a84ff;border-radius:50%;cursor:pointer;box-shadow:0 1px 3px #0006;transition:all .12s ease}.custom-slider.svelte-1mvnu54:hover::-webkit-slider-thumb{transform:scale(1.15);box-shadow:0 2px 6px #0a84ff4d,0 0 0 4px #0a84ff1a}.custom-slider.svelte-1mvnu54:hover::-moz-range-thumb{transform:scale(1.15);box-shadow:0 2px 6px #0a84ff4d,0 0 0 4px #0a84ff1a}.custom-slider.svelte-1mvnu54:active::-webkit-slider-thumb{transform:scale(1.05)}.custom-slider.svelte-1mvnu54:active::-moz-range-thumb{transform:scale(1.05)}.slider-value-input.svelte-1mvnu54{width:52px;height:28px;box-sizing:border-box;border:1px solid #2a2d33;border-radius:5px;background:#17191c;color:#e4e6ea;font-size:11px;font-variant-numeric:tabular-nums;text-align:center;padding:0 6px;outline:none;transition:all .12s ease}.slider-value-input.svelte-1mvnu54:hover{border-color:#363d4b}.slider-value-input.svelte-1mvnu54:focus{border-color:#0a84ff;box-shadow:0 0 0 2px #0a84ff1f}.text-input.svelte-1mvnu54{width:100%;min-height:72px;box-sizing:border-box;border:1px solid #2a2d33;border-radius:6px;background:#17191c;color:#e4e6ea;font:inherit;font-size:12px;line-height:1.5;padding:8px 10px;outline:none;resize:vertical;transition:all .12s ease}.text-input.svelte-1mvnu54:hover{border-color:#363d4b}.text-input.svelte-1mvnu54:focus{border-color:#0a84ff;background:#1a1c20;box-shadow:0 0 0 2px #0a84ff1f}.preset-cards.svelte-1mvnu54{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.preset-option.svelte-1mvnu54{height:32px;display:flex;align-items:center;justify-content:center;border:1px solid #2a2d33;border-radius:5px;background:#17191c;color:#d8dce2;font-size:11px;font-weight:500;cursor:pointer;transition:all .12s ease}.preset-option.svelte-1mvnu54:hover{background:#1a1c20;border-color:#363d4b}.preset-option.active.svelte-1mvnu54{background:#10263a;border-color:#245d91;color:#0a84ff;box-shadow:inset 0 0 0 1px #0a84ff33}.easing-options.svelte-1mvnu54{display:flex;flex-direction:column;gap:4px}.easing-option.svelte-1mvnu54{height:30px;display:flex;align-items:center;justify-content:flex-start;border:1px solid transparent;border-radius:5px;background:transparent;color:#d8dce2;font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;padding:0 10px;text-align:left;cursor:pointer;transition:all .12s ease}.easing-option.svelte-1mvnu54:hover{background:#1a1c20;border-color:#2a2d33}.easing-option.active.svelte-1mvnu54{background:#10263a;border-color:#245d91;color:#0a84ff}.timeline-panel.svelte-1mvnu54{flex:0 0 var(--timeline-height);min-height:0;display:flex;flex-direction:column;background:#0d0e10;border-top:1px solid #24262a}.timeline-resizer.svelte-1mvnu54{flex:0 0 7px;width:100%;display:flex;align-items:center;justify-content:center;padding:0;border:0;border-bottom:1px solid #24262a;background:#0d0e10;cursor:ns-resize}.timeline-resizer.svelte-1mvnu54 span:where(.svelte-1mvnu54){width:34px;height:2px;border-radius:1px;background:#3b4047}.timeline-resizer.svelte-1mvnu54:hover span:where(.svelte-1mvnu54),.timeline-resizer.svelte-1mvnu54:focus-visible span:where(.svelte-1mvnu54){background:#0a84ff}.timeline-toolbar.svelte-1mvnu54{flex:0 0 46px;display:grid;grid-template-columns:minmax(280px,1fr) auto minmax(280px,1fr);align-items:center;gap:14px;padding:0 12px;border-bottom:1px solid #24262a;background:#111214}.playback-controls.svelte-1mvnu54,.timeline-actions.svelte-1mvnu54,.timeline-context.svelte-1mvnu54{display:flex;align-items:center;gap:8px}.timeline-actions.svelte-1mvnu54{min-width:0;justify-content:flex-end}.timeline-context.svelte-1mvnu54{min-width:0;color:#858a92;font-size:11px}.timeline-context.svelte-1mvnu54 span:where(.svelte-1mvnu54){max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.control-btn.svelte-1mvnu54{width:30px;height:30px;display:flex;align-items:center;justify-content:center;border:1px solid #2c3035;border-radius:5px;background:#17191c;color:#fff;cursor:pointer}.control-btn.svelte-1mvnu54:hover{background:#202328;border-color:#3a3f46}.play-btn.svelte-1mvnu54{border:none;background:#e6e8ec;color:#09090a}.timecode.svelte-1mvnu54{min-width:50px;color:#f1f2f4;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:600}.framecode.svelte-1mvnu54{color:#777d86;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px}.timeline-command.svelte-1mvnu54,.audio-chip.svelte-1mvnu54{height:28px;display:inline-flex;align-items:center;gap:6px;border:1px solid #2c3035;border-radius:5px;background:#17191c;color:#d8dce2;padding:0 9px;font-size:11px}.timeline-command.svelte-1mvnu54{cursor:pointer}.timeline-command.svelte-1mvnu54:hover{background:#202328}.audio-chip.svelte-1mvnu54{max-width:170px;overflow:hidden;color:#cdb5e5;text-overflow:ellipsis;white-space:nowrap}.file-input.svelte-1mvnu54,.timeline-panel.svelte-1mvnu54 audio:where(.svelte-1mvnu54){display:none}.timeline-scroll.svelte-1mvnu54{flex:1;min-height:0;display:flex;flex-direction:column;align-items:stretch;overflow:auto;scrollbar-width:thin;scrollbar-color:#34373d #0d0e10}.ruler-row.svelte-1mvnu54,.timeline-row.svelte-1mvnu54{width:100%;min-width:var(--timeline-content-width, 820px);display:grid;grid-template-columns:220px minmax(600px,1fr)}.ruler-row.svelte-1mvnu54{position:sticky;order:-10000;top:0;z-index:4;height:30px;background:#111214}.timeline-row.svelte-1mvnu54{min-height:42px;margin:0;padding:0;border:0;border-radius:0;background:transparent;color:#d8dce2;text-align:left}.timeline-row.svelte-1mvnu54:hover,.timeline-row.selected.svelte-1mvnu54{background:#151719}.timeline-row.selected.svelte-1mvnu54 .track-label:where(.svelte-1mvnu54){color:#f1f2f4;box-shadow:inset 2px 0 #0a84ff}.track-label.svelte-1mvnu54{min-width:0;display:flex;align-items:center;gap:8px;padding:0 11px;border-right:1px solid #24262a;border-bottom:1px solid #1d1f22;color:#a8adb5;border-top:0;border-left:0;background:transparent;font:inherit;font-size:11px;text-align:left;cursor:default}.track-label.svelte-1mvnu54 strong:where(.svelte-1mvnu54){min-width:0;overflow:hidden;font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.track-thumb.svelte-1mvnu54{flex:0 0 28px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid #2c3138;border-radius:3px;background:#111419;color:#858c95}.track-copy.svelte-1mvnu54{min-width:0;display:flex;flex-direction:column;gap:2px}.track-copy.svelte-1mvnu54 small:where(.svelte-1mvnu54){max-width:82px;overflow:hidden;color:#676d75;font-size:9px;text-overflow:ellipsis;white-space:nowrap}.track-controls.svelte-1mvnu54{margin-left:auto;display:flex;align-items:center;gap:2px}.track-control.svelte-1mvnu54{width:24px;height:24px;padding:0;display:grid;place-items:center;border:0;border-radius:4px;background:transparent;color:#737a83;cursor:pointer}.track-control.svelte-1mvnu54:hover{color:#dce1e6;background:#202329}.track-control.active.svelte-1mvnu54{color:#f0b26d}.track-label.track-hidden.svelte-1mvnu54 .track-copy:where(.svelte-1mvnu54){opacity:.55}.track-time.svelte-1mvnu54{margin-left:auto;color:#676d75;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;white-space:nowrap}.ruler-label.svelte-1mvnu54{color:#777d86;font-size:10px;font-weight:700;text-transform:uppercase}.ruler.svelte-1mvnu54,.track-lane.svelte-1mvnu54{position:relative;border-bottom:1px solid #1d1f22;background-image:repeating-linear-gradient(90deg,transparent 0,transparent 59px,rgba(255,255,255,.035) 60px)}.ruler-tick.svelte-1mvnu54{position:absolute;top:8px;color:#676d75;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;transform:translate(-50%);pointer-events:none}.playhead-marker.svelte-1mvnu54{position:absolute;z-index:2;top:0;bottom:-1px;left:var(--playhead-position);width:2px;background:#f1f2f4;transform:translate(-50%);pointer-events:none}.playhead-marker.svelte-1mvnu54:before{content:"";position:absolute;top:0;left:50%;width:0;height:0;border-top:7px solid #f1f2f4;border-right:6px solid transparent;border-left:6px solid transparent;transform:translate(-50%)}.drop-indicator.svelte-1mvnu54{position:absolute;z-index:3;top:0;bottom:-1px;width:3px;background:#0a84ff;transform:translate(-50%);pointer-events:none;box-shadow:0 0 8px #0a84ff99}.drop-indicator.svelte-1mvnu54:before{content:"";position:absolute;top:0;left:50%;width:0;height:0;border-top:8px solid #0a84ff;border-right:7px solid transparent;border-left:7px solid transparent;transform:translate(-50%)}.timeline-scroll.drop-target.svelte-1mvnu54{background:#0a84ff0d}.clip-row.svelte-1mvnu54 .track-label:where(.svelte-1mvnu54){background:#0d0e10}.timeline-clip.svelte-1mvnu54{border:2px solid #0a84ff;background:#0a84ff1a}.clip-trim-label.svelte-1mvnu54{position:absolute;z-index:1;right:22px;bottom:2px;left:4px;overflow:hidden;color:#ffffffd1;font-size:8px;line-height:10px;text-overflow:ellipsis;white-space:nowrap;pointer-events:none}.timeline-clip.selected-clip.svelte-1mvnu54{border-color:#f1f2f4;box-shadow:0 0 0 1px #0a84ff}.transition-cut.svelte-1mvnu54{position:absolute;z-index:6;top:10px;width:16px;height:16px;padding:0;border:1px solid #515860;border-radius:4px;background:#15181c;color:#9ba1a9;font-size:12px;line-height:14px;cursor:pointer;transform:translate(-50%);transition:border-color .15s ease,background .15s ease,box-shadow .15s ease}.transition-cut.has-transition.svelte-1mvnu54{border-color:#0a84ff;background:#0f4777;color:#eef7ff;box-shadow:0 0 0 2px #0d0e10d9}.transition-cut.drop-ready.svelte-1mvnu54{width:22px;height:22px;top:7px;border-color:#0a84ff;background:#163a59;color:#fff;box-shadow:0 0 12px #0a84ffa6}.transition-cut.selected-transition.svelte-1mvnu54{border-color:#fff;box-shadow:0 0 0 2px #0a84ff,0 0 12px #0a84ff8c}.clip-delete.svelte-1mvnu54{position:absolute;top:2px;right:2px;width:18px;height:18px;display:flex;align-items:center;justify-content:center;border:none;border-radius:3px;background:#ef4444e6;color:#fff;opacity:0;cursor:pointer;transition:opacity .15s ease;z-index:2}.timeline-clip.svelte-1mvnu54:hover .clip-delete:where(.svelte-1mvnu54){opacity:1}.clip-delete.svelte-1mvnu54:hover{background:#dc2626}.timeline-scrubber.svelte-1mvnu54{position:absolute;inset:0;z-index:3;width:100%;height:100%;margin:0;opacity:0;cursor:ew-resize}.track-lane.svelte-1mvnu54{min-height:41px}.clip.svelte-1mvnu54{position:absolute;top:7px;height:27px;min-width:5px;border:1px solid #536070;border-radius:3px;background:#34404e;box-sizing:border-box;overflow:visible}.clip-media.svelte-1mvnu54,.clip-color.svelte-1mvnu54,.clip-text.svelte-1mvnu54{position:absolute;inset:1px;overflow:hidden;border-radius:2px;pointer-events:none}.clip-media.svelte-1mvnu54{background-color:#11151a;background-repeat:repeat-x;background-position:left center;background-size:auto 100%;opacity:.8}.video-clip-media.svelte-1mvnu54{display:flex;align-items:center;justify-content:center;background:#182433;color:#0a84ff}.clip-color.svelte-1mvnu54{opacity:.8}.clip-text.svelte-1mvnu54{padding:5px 8px;color:#f4f7f9e6;font-size:10px;line-height:15px;text-overflow:ellipsis;white-space:nowrap}.clip-select.svelte-1mvnu54{position:absolute;inset:0;width:100%;padding:0;border:0;border-radius:2px;background:transparent;cursor:grab;touch-action:none}.clip-select.svelte-1mvnu54:active{cursor:grabbing}.clip-ghost.svelte-1mvnu54{position:absolute;z-index:3;top:6px;height:27px;border:1px dashed #0a84ff;border-radius:3px;background:#0a84ff24;pointer-events:none}.clip-ghost.invalid.svelte-1mvnu54{border-color:#ff6b74;background:#ff6b7424}.trim-handle.svelte-1mvnu54{position:absolute;z-index:2;top:-2px;bottom:-2px;width:min(8px,30%);padding:0;border:0;border-radius:2px;background:#c7d0d9;opacity:0;pointer-events:none;cursor:ew-resize}.trim-start.svelte-1mvnu54{left:-1px}.trim-end.svelte-1mvnu54{right:-1px}.timeline-row.svelte-1mvnu54:hover .trim-handle:where(.svelte-1mvnu54),.timeline-row.selected.svelte-1mvnu54 .trim-handle:where(.svelte-1mvnu54),.trim-handle.svelte-1mvnu54:focus-visible{opacity:1;pointer-events:auto}.element-clip.selected-clip.svelte-1mvnu54{border-color:#0a84ff;background:#163b60}.audio-clip.svelte-1mvnu54{border-color:#725d86;background:#4e405d;overflow:hidden}.audio-waveform.svelte-1mvnu54{position:absolute;inset:2px;color:#e0c4ffb8;opacity:.9;overflow:hidden;pointer-events:none}.audio-waveform.svelte-1mvnu54:before{content:"";position:absolute;top:50%;right:0;left:0;height:1px;background:currentColor;opacity:.24}.audio-waveform.svelte-1mvnu54 svg:where(.svelte-1mvnu54){position:relative;display:block;width:100%;height:100%;overflow:hidden}.audio-waveform.svelte-1mvnu54 path:where(.svelte-1mvnu54){fill:currentColor}.audio-waveform.loading.svelte-1mvnu54{animation:svelte-1mvnu54-waveform-pulse .9s ease-in-out infinite alternate}.audio-clip.muted.svelte-1mvnu54 .audio-waveform:where(.svelte-1mvnu54){opacity:.28}.audio-clip-label.svelte-1mvnu54{z-index:1;text-shadow:0 1px 3px rgba(24,16,32,.95)}@keyframes svelte-1mvnu54-waveform-pulse{to{opacity:.35}}.mask-select.svelte-1mvnu54{min-height:34px;width:100%}.toggle-row.svelte-1mvnu54{display:flex;align-items:center;gap:8px;margin:-2px 0 10px;color:#b6bbc2;font-size:11px;cursor:pointer}.toggle-row.svelte-1mvnu54 input:where(.svelte-1mvnu54){accent-color:#0a84ff}.keyframe-marker.svelte-1mvnu54{position:absolute;z-index:5;top:50%;width:10px;height:10px;padding:0;border:1px solid #111318;border-radius:1px;background:#f4b860;box-shadow:0 0 0 1px #f4b86038;transform:translate(-50%,-50%) rotate(45deg);cursor:ew-resize;touch-action:none}.keyframe-marker.svelte-1mvnu54:hover,.keyframe-marker.selected-keyframe.svelte-1mvnu54{background:#fff1c9;box-shadow:0 0 0 2px #f4b860}.drag-keyframe.svelte-1mvnu54{pointer-events:none}.keyframe-add.svelte-1mvnu54{position:absolute;z-index:5;top:50%;width:15px;height:15px;padding:0;display:grid;place-items:center;border:1px solid #1e69a8;border-radius:50%;background:#102e4b;color:#b9ddff;font-size:12px;line-height:1;transform:translate(-50%,-50%);cursor:pointer;opacity:0}.timeline-row.svelte-1mvnu54:hover .keyframe-add:where(.svelte-1mvnu54),.timeline-row.selected.svelte-1mvnu54 .keyframe-add:where(.svelte-1mvnu54){opacity:1}.keyframe-add.svelte-1mvnu54:hover{background:#123b62}.keyframe-controls.svelte-1mvnu54{display:flex;align-items:center;gap:8px}.keyframe-controls.svelte-1mvnu54 .timeline-command:where(.svelte-1mvnu54){flex:1}.keyframe-controls.svelte-1mvnu54 .number-input-wrapper:where(.svelte-1mvnu54){width:84px}.easing-input.svelte-1mvnu54{margin-top:8px;min-height:32px}.track-lane.svelte-1mvnu54:after{content:"";position:absolute;z-index:2;top:0;bottom:0;left:var(--playhead-position);width:1px;background:#f1f2f4;box-shadow:0 0 0 1px #00000073;pointer-events:none}.danger-btn.svelte-1mvnu54:hover{border-color:#714044;background:#2b1719;color:#ff9da5}.source-toggle.svelte-1mvnu54{position:absolute;right:316px;bottom:calc(var(--timeline-height) + 10px);border:1px solid #2c3035;border-radius:6px;background:#111214;color:#d8dce2;padding:8px 10px;font-size:12px;cursor:pointer}.code-overlay.svelte-1mvnu54{position:absolute;top:0;left:0;right:0;bottom:var(--timeline-height);background:#050506e0;backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:100;animation:svelte-1mvnu54-fadeIn .2s ease-out}@keyframes svelte-1mvnu54-fadeIn{0%{opacity:0}to{opacity:1}}.code-panel.svelte-1mvnu54{width:90%;max-width:1200px;height:80%;background:#111214;border:1px solid #2c3035;border-radius:8px;display:flex;flex-direction:column;box-shadow:0 16px 64px #000c;animation:svelte-1mvnu54-slideUp .2s ease-out}@keyframes svelte-1mvnu54-slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.code-header.svelte-1mvnu54{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #24262a}.code-header.svelte-1mvnu54 h3:where(.svelte-1mvnu54){margin:0;font-size:18px;font-weight:600;color:#f1f2f4}.close-btn.svelte-1mvnu54{width:36px;height:36px;background:transparent;border:1px solid #2c3035;border-radius:6px;color:#8e939b;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center}.close-btn.svelte-1mvnu54:hover{background:#202328;color:#fff;border-color:#3a3f46}.code-textarea.svelte-1mvnu54{flex:1;padding:24px;background:#111214;border:none;color:#e6e8ec;font-family:Fira Code,Courier New,monospace;font-size:15px;line-height:1.6;resize:none;outline:none;tab-size:2}.code-textarea.svelte-1mvnu54::placeholder{color:#6d737c}.error-banner.svelte-1mvnu54{margin:12px;padding:12px 14px;background:#ff6b6b14;border:1px solid rgba(255,107,107,.28);border-radius:6px;color:#ff6b6b;font-size:12px;font-family:monospace}@media(max-width:900px){.workbench.svelte-1mvnu54,.workbench.chat-open.svelte-1mvnu54{grid-template-columns:1fr}.nav-rail.svelte-1mvnu54,.content-panel.svelte-1mvnu54,.chat-drawer.svelte-1mvnu54,.chat-drawer.collapsed.svelte-1mvnu54,.properties-panel.svelte-1mvnu54{display:none}.source-toggle.svelte-1mvnu54{right:16px}.timeline-toolbar.svelte-1mvnu54{grid-template-columns:1fr auto}.timeline-context.svelte-1mvnu54{display:none}.timeline-actions.svelte-1mvnu54 .audio-chip:where(.svelte-1mvnu54),.framecode.svelte-1mvnu54{display:none}}.motion-editor.svelte-1mvnu54{--accent: #0a84ff;--hairline: rgba(255, 255, 255, .08);font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,SF Pro Display,Helvetica Neue,Arial,sans-serif;background:linear-gradient(180deg,#111113,#0e0e10 24% 100%)}.workbench.svelte-1mvnu54,.timeline-panel.svelte-1mvnu54{border-color:var(--hairline)}.workbench.svelte-1mvnu54{grid-template-columns:60px 260px 50px minmax(0,1fr) 300px}.nav-rail.svelte-1mvnu54{position:relative;z-index:30;width:60px;padding:10px;gap:6px;background:#121214f5;border-right:1px solid var(--hairline)}.nav-item.svelte-1mvnu54{position:relative;width:40px;height:40px;border-radius:10px}.nav-item.svelte-1mvnu54:hover{color:#fff;background:#ffffff12}.nav-item.active.svelte-1mvnu54{color:var(--accent);background:#0a84ff24;box-shadow:inset 2px 0 0 var(--accent)}.nav-settings.svelte-1mvnu54{margin-top:auto}.nav-item.svelte-1mvnu54:after{content:attr(data-tooltip);position:absolute;top:50%;left:calc(100% + 12px);z-index:100;padding:6px 9px;border:1px solid var(--hairline);border-radius:7px;background:#242428;color:#f7f7f8;box-shadow:0 8px 24px #00000059;font-size:11px;font-weight:600;white-space:nowrap;opacity:0;pointer-events:none;transform:translate(4px,-50%);transition:opacity .14s ease,transform .14s ease}.nav-item.svelte-1mvnu54:hover:after,.nav-item.svelte-1mvnu54:focus-visible:after{opacity:1;transform:translateY(-50%)}.content-panel.svelte-1mvnu54,.properties-panel.svelte-1mvnu54,.timeline-toolbar.svelte-1mvnu54,.panel-header.svelte-1mvnu54,.stage-meta.svelte-1mvnu54{background:#141417eb;border-color:var(--hairline)}.chat-drawer.svelte-1mvnu54,.preview-container.svelte-1mvnu54{background:linear-gradient(180deg,#111114,#0e0e10 42%,#0c0c0e)}.panel-header.svelte-1mvnu54,.stage-meta.svelte-1mvnu54,.timeline-toolbar.svelte-1mvnu54,.timeline-resizer.svelte-1mvnu54,.track-label.svelte-1mvnu54,.ruler.svelte-1mvnu54,.track-lane.svelte-1mvnu54,.selection-summary.svelte-1mvnu54{border-color:var(--hairline)}.properties-panel.svelte-1mvnu54{padding:16px}.panel-title.svelte-1mvnu54{color:#f5f5f7;font-size:12px;text-transform:none}.primary-properties.svelte-1mvnu54{padding-top:2px}.timing-row.svelte-1mvnu54 .property-group:where(.svelte-1mvnu54){min-width:0}.property-unavailable.svelte-1mvnu54{min-height:34px;display:flex;align-items:center;padding:0 10px;border:1px solid var(--hairline);border-radius:7px;color:#77777f;background:#ffffff06;font-size:11px}.more-options.svelte-1mvnu54{margin:4px 0 20px;border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline)}.more-options.svelte-1mvnu54 summary:where(.svelte-1mvnu54){display:flex;align-items:center;gap:8px;padding:13px 2px;color:#aaaab1;font-size:11px;font-weight:650;cursor:pointer;list-style:none}.more-options.svelte-1mvnu54 summary:where(.svelte-1mvnu54)::-webkit-details-marker{display:none}.more-options.svelte-1mvnu54 summary:where(.svelte-1mvnu54):before{content:"›";color:#72727a;font-size:16px;line-height:1;transform:rotate(0);transition:transform .18s ease,color .18s ease}.more-options.svelte-1mvnu54 summary:where(.svelte-1mvnu54):hover{color:#fff}.more-options[open].svelte-1mvnu54 summary:where(.svelte-1mvnu54){color:var(--accent)}.more-options[open].svelte-1mvnu54 summary:where(.svelte-1mvnu54):before{color:var(--accent);transform:rotate(90deg)}.more-options-content.svelte-1mvnu54{padding:6px 0 4px;animation:svelte-1mvnu54-options-reveal .18s ease both}@keyframes svelte-1mvnu54-options-reveal{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.properties-empty.svelte-1mvnu54{min-height:210px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;text-align:center;color:#696970}.properties-empty.svelte-1mvnu54 svg{color:#4e4e55}.properties-empty.svelte-1mvnu54 strong:where(.svelte-1mvnu54){color:#aaaab1;font-size:12px}.properties-empty.svelte-1mvnu54 span:where(.svelte-1mvnu54){max-width:210px;font-size:11px;line-height:1.45}.status-label.svelte-1mvnu54,.stage-status.svelte-1mvnu54{display:inline-flex;align-items:center;gap:7px;color:#8d8d95;font-size:11px}.status-label.svelte-1mvnu54{margin:0 0 12px}.status-label.svelte-1mvnu54 span:where(.svelte-1mvnu54),.stage-status.svelte-1mvnu54 span:where(.svelte-1mvnu54){width:8px;height:8px;border:1.5px solid rgba(255,255,255,.22);border-top-color:var(--accent);border-radius:50%;animation:svelte-1mvnu54-status-spin .8s linear infinite}.stage-status.svelte-1mvnu54{position:absolute;top:14px;left:50%;z-index:12;padding:7px 10px;border:1px solid var(--hairline);border-radius:999px;background:#121214e0;transform:translate(-50%);backdrop-filter:blur(12px)}@keyframes svelte-1mvnu54-status-spin{to{transform:rotate(360deg)}}.timeline-empty.svelte-1mvnu54{order:1000000;min-width:var(--timeline-content-width, 820px);min-height:54px;display:flex;align-items:center;justify-content:center;gap:8px;color:#686870;font-size:11px;border-bottom:1px solid var(--hairline)}.clip-duplicate.svelte-1mvnu54{position:absolute;top:3px;right:3px;z-index:7;width:18px;height:18px;display:grid;place-items:center;padding:0;border:1px solid rgba(255,255,255,.12);border-radius:4px;background:#0e0e10e6;color:#aeb0b7;opacity:0;cursor:pointer;transition:opacity .14s ease,color .14s ease,background .14s ease}.clip.svelte-1mvnu54:hover .clip-duplicate:where(.svelte-1mvnu54),.clip-duplicate.svelte-1mvnu54:focus-visible{opacity:1}.clip-duplicate.svelte-1mvnu54:hover{color:#fff;background:var(--accent)}.timeline-clip.svelte-1mvnu54 .clip-duplicate:where(.svelte-1mvnu54){right:23px}.delete-toast.svelte-1mvnu54{position:fixed;right:20px;bottom:calc(var(--timeline-height, 230px) + 20px);z-index:1200;min-width:240px;display:flex;align-items:center;justify-content:space-between;gap:20px;padding:10px 11px 10px 14px;border:1px solid var(--hairline);border-radius:10px;background:#222226f5;color:#ececf0;box-shadow:0 16px 42px #00000073;backdrop-filter:blur(18px);font-size:12px}.delete-toast.svelte-1mvnu54 button:where(.svelte-1mvnu54){height:28px;padding:0 9px;border:0;border-radius:6px;background:#0a84ff24;color:var(--accent);font-weight:700;cursor:pointer}.delete-toast.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover{background:#0a84ff3d}.shared-property-note.svelte-1mvnu54{margin:-2px 0 14px;color:#696970;font-size:10px;line-height:1.4}.timeline-snap-guide.svelte-1mvnu54{position:absolute;z-index:6;top:0;bottom:-100vh;width:1px;background:var(--accent);opacity:.72;transform:translate(-50%);pointer-events:none;box-shadow:0 0 8px #0a84ff6b}.clip-action.svelte-1mvnu54{position:absolute;top:3px;z-index:8;width:18px;height:18px;display:grid;place-items:center;padding:0;border:1px solid rgba(255,255,255,.12);border-radius:4px;background:#0e0e10eb;color:#b8bac1;opacity:0;cursor:pointer;transition:opacity .14s ease,color .14s ease,background .14s ease}.clip.svelte-1mvnu54:hover .clip-action:where(.svelte-1mvnu54),.clip-action.svelte-1mvnu54:focus-visible{opacity:1}.clip-duplicate.svelte-1mvnu54{right:45px}.clip-more.svelte-1mvnu54{right:24px}.clip-delete.svelte-1mvnu54{right:3px}.clip-duplicate.svelte-1mvnu54:hover,.clip-more.svelte-1mvnu54:hover{color:#fff;background:var(--accent)}.clip-delete.svelte-1mvnu54:hover{color:#fff;background:#c43b45}.toast-separator.svelte-1mvnu54{color:#77777f;margin-left:auto}.delete-toast.svelte-1mvnu54{gap:8px}.workbench.svelte-1mvnu54,.workbench.chat-open.svelte-1mvnu54{grid-template-columns:60px 260px 50px minmax(0,1fr) 300px;overflow:hidden;isolation:isolate;background:#0e0e10}.workbench.chat-open.svelte-1mvnu54{grid-template-columns:60px 260px 324px minmax(0,1fr) 300px}.nav-rail.svelte-1mvnu54{grid-column:1;box-sizing:border-box;width:60px;min-width:60px;max-width:60px;overflow:visible;background:#111113;border-right:1px solid var(--hairline)}.content-panel.svelte-1mvnu54{grid-column:2;position:relative;z-index:1;box-sizing:border-box;width:100%;min-width:0;max-width:260px;contain:paint;background:#151517;border-right:1px solid var(--hairline)}.panel-header.svelte-1mvnu54{box-sizing:border-box;width:100%;min-width:0;overflow:hidden;padding:12px 14px;background:#151517}.panel-tabs.svelte-1mvnu54{min-width:0;margin:0;padding:0;gap:10px}.panel-tab.svelte-1mvnu54{height:30px;padding:0 1px;border:0;border-bottom:1px solid transparent;border-radius:0;color:#77777f;background:transparent;transition:color .16s ease,border-color .16s ease}.panel-tab.svelte-1mvnu54:hover{color:#c9c9ce;background:transparent}.panel-tab.active.svelte-1mvnu54{color:#f1f1f3;border-bottom-color:var(--accent)}.motion-editor.svelte-1mvnu54{background:linear-gradient(180deg,#101012,#0e0e10 28%,#0d0d0f)}.chat-drawer.svelte-1mvnu54,.preview-container.svelte-1mvnu54{background:linear-gradient(180deg,#111113,#0e0e10)}.content-panel.svelte-1mvnu54,.properties-panel.svelte-1mvnu54,.timeline-toolbar.svelte-1mvnu54,.panel-header.svelte-1mvnu54,.stage-meta.svelte-1mvnu54{backdrop-filter:none}.chat-drawer.svelte-1mvnu54 .ai-chat-panel,.preview-canvas.svelte-1mvnu54,.dialog.svelte-1mvnu54,.preset-card.svelte-1mvnu54:hover,.delete-toast.svelte-1mvnu54,.stage-status.svelte-1mvnu54{box-shadow:none}.preview-canvas.svelte-1mvnu54{box-shadow:0 0 0 1px var(--hairline)}.assistant-expand.svelte-1mvnu54{border-color:var(--hairline);background:#1a1a1d;color:#a9a9b0}.assistant-expand.svelte-1mvnu54:hover{background:#212125;color:#fff}.nav-item.svelte-1mvnu54{border-radius:8px;transition:color .16s ease,background .16s ease}.nav-item.active.svelte-1mvnu54{color:#fff;background:var(--accent);box-shadow:none}.nav-item.svelte-1mvnu54:after{border-radius:6px;background:#242427;box-shadow:none}.header-icon-btn.svelte-1mvnu54,.meta-btn.svelte-1mvnu54,.icon-btn.svelte-1mvnu54,.control-btn.svelte-1mvnu54,.timeline-command.svelte-1mvnu54,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54),.clip-action.svelte-1mvnu54{border-color:var(--hairline);background:#1b1b1e;color:#aaaab1;box-shadow:none;transition:background .16s ease,border-color .16s ease,color .16s ease}.header-icon-btn.svelte-1mvnu54:hover,.meta-btn.svelte-1mvnu54:hover,.icon-btn.svelte-1mvnu54:hover,.control-btn.svelte-1mvnu54:hover,.timeline-command.svelte-1mvnu54:hover,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover{border-color:#ffffff1f;background:#232327;color:#f4f4f5}.header-icon-btn.svelte-1mvnu54:active,.meta-btn.svelte-1mvnu54:active,.icon-btn.svelte-1mvnu54:active,.control-btn.svelte-1mvnu54:active,.timeline-command.svelte-1mvnu54:active{background:#151517}.play-btn.svelte-1mvnu54{border-color:var(--hairline);background:#eeeeef;color:#111113}.play-btn.svelte-1mvnu54:hover{border-color:#fff;background:#fff;color:#09090a}.icon-btn.active.svelte-1mvnu54{border-color:#0a84ff6b;background:#0a84ff1f;color:#73baff}.media-dropzone.svelte-1mvnu54{min-height:100%;padding:14px 4px;border:0;border-radius:0;background:transparent;color:#8d8d95;text-align:left;transition:background .16s ease}.media-dropzone.drag-active.svelte-1mvnu54{background:#ffffff09;animation:none}.media-dropzone.svelte-1mvnu54:has(.import-media-button:where(.svelte-1mvnu54):hover){border-color:transparent}.import-media-button.svelte-1mvnu54{width:auto;align-self:flex-start;border-color:var(--hairline);background:#1c1c1f;color:#ededf0}.import-media-button.svelte-1mvnu54:hover{border-color:#ffffff24;background:#252529}.asset-item.svelte-1mvnu54,.audio-item.svelte-1mvnu54,.asset-card.svelte-1mvnu54,.preset-card.svelte-1mvnu54,.effect-item.svelte-1mvnu54,.selection-summary.svelte-1mvnu54{border-color:var(--hairline);background:transparent;box-shadow:none}.asset-card.svelte-1mvnu54:hover,.preset-card.svelte-1mvnu54:hover,.asset-item.svelte-1mvnu54:hover,.effect-item.svelte-1mvnu54:hover{border-color:#ffffff1f;background:#ffffff09;transform:none}.asset-thumbnail.svelte-1mvnu54{background:#19191c}.folder-count.svelte-1mvnu54{background:#1d1d20}.layer-row.selected.svelte-1mvnu54{border-color:#0a84ff4d;background:#0a84ff17;box-shadow:inset 2px 0 0 var(--accent)}.snap-guide.svelte-1mvnu54,.timeline-snap-guide.svelte-1mvnu54,.drop-indicator.svelte-1mvnu54,.playhead-marker.svelte-1mvnu54{box-shadow:none}.status-label.svelte-1mvnu54 span:where(.svelte-1mvnu54),.stage-status.svelte-1mvnu54 span:where(.svelte-1mvnu54){animation-duration:1s}.stage-status.svelte-1mvnu54{border-radius:7px;background:#1b1b1e;backdrop-filter:none}.delete-toast.svelte-1mvnu54{border-radius:8px;background:#222225;backdrop-filter:none}.transition-cut.drop-ready.svelte-1mvnu54,.transition-cut.selected-transition.svelte-1mvnu54,.preset-option.active.svelte-1mvnu54,.easing-option.active.svelte-1mvnu54{box-shadow:none}.custom-slider.svelte-1mvnu54:hover::-webkit-slider-thumb,.custom-slider.svelte-1mvnu54:hover::-moz-range-thumb{box-shadow:none}@media(prefers-reduced-motion:reduce){.more-options-content.svelte-1mvnu54,.status-label.svelte-1mvnu54 span:where(.svelte-1mvnu54),.stage-status.svelte-1mvnu54 span:where(.svelte-1mvnu54){animation:none}}.motion-editor.svelte-1mvnu54{--accent: #78a8ff;--accent-mint: #70ddb8;--accent-gradient: linear-gradient(135deg, #5f8fe8 0%, #4eb392 100%);font-family:Inter Variable,Inter,-apple-system,BlinkMacSystemFont,sans-serif;font-feature-settings:"cv02","cv03","cv04","cv11"}.header-icon-btn.svelte-1mvnu54,.meta-btn.svelte-1mvnu54,.icon-btn.svelte-1mvnu54,.control-btn.svelte-1mvnu54,.timeline-command.svelte-1mvnu54,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54),.clip-action.svelte-1mvnu54,.assistant-expand.svelte-1mvnu54,.import-media-button.svelte-1mvnu54{border-color:#ffffff1a;background:#1b1b1e;box-shadow:none}.header-icon-btn.svelte-1mvnu54:hover,.meta-btn.svelte-1mvnu54:hover,.icon-btn.svelte-1mvnu54:hover,.control-btn.svelte-1mvnu54:hover,.timeline-command.svelte-1mvnu54:hover,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover,.assistant-expand.svelte-1mvnu54:hover,.import-media-button.svelte-1mvnu54:hover{border-color:#ffffff29;background:#242428;box-shadow:none}.header-icon-btn.svelte-1mvnu54:active,.meta-btn.svelte-1mvnu54:active,.icon-btn.svelte-1mvnu54:active,.control-btn.svelte-1mvnu54:active,.timeline-command.svelte-1mvnu54:active,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):active,.assistant-expand.svelte-1mvnu54:active,.import-media-button.svelte-1mvnu54:active{background:#171719;box-shadow:none;transform:none}.nav-item.active.svelte-1mvnu54{border:1px solid rgba(255,255,255,.16);background:#0a84ff;box-shadow:none}.icon-btn.active.svelte-1mvnu54,.preset-option.active.svelte-1mvnu54,.easing-option.active.svelte-1mvnu54{border-color:#78a8ff6b;background:#0a84ff24;color:#8fc5ff;box-shadow:none}.layer-row.selected.svelte-1mvnu54{border-color:#78a8ff57;background:#0a84ff1a;box-shadow:inset 2px 0 #78a8ff}.play-btn.svelte-1mvnu54{border-color:#fff3;background:#eeeeef;box-shadow:none}.library-empty-state.svelte-1mvnu54{position:absolute;inset:0;width:auto;height:auto;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 12px;text-align:center}.library-empty-icon.svelte-1mvnu54{width:44px;height:44px;display:grid;place-items:center;margin-bottom:4px;border:1px solid rgba(255,255,255,.09);border-radius:9px;background:#1d1d20;color:#8c8c95;box-shadow:none}.library-empty-state.svelte-1mvnu54 strong:where(.svelte-1mvnu54){color:#e0e0e4;font-size:13px;font-weight:600;letter-spacing:-.01em}.library-empty-state.svelte-1mvnu54>span:where(.svelte-1mvnu54):not(.library-empty-icon){max-width:205px;color:#7d7d86;font-size:11.5px;line-height:1.5}.library-empty-state.svelte-1mvnu54 small:where(.svelte-1mvnu54){max-width:220px;color:#5d5d65;font-size:10px;line-height:1.4}.library-empty-state.svelte-1mvnu54 .import-media-button:where(.svelte-1mvnu54){align-self:center;min-width:128px;height:34px;margin:7px 0 3px;padding:0 18px;border-radius:7px;background:#242428;color:#ededf0;font-size:11.5px;font-weight:600}.media-dropzone.svelte-1mvnu54{position:relative;height:100%;padding:0 4px}.media-dropzone.drag-active.svelte-1mvnu54 .library-empty-state:where(.svelte-1mvnu54){background:#0a84ff0b}.workbench.chat-open.svelte-1mvnu54{grid-template-columns:60px 260px 360px minmax(0,1fr) 300px}.stage.svelte-1mvnu54{background-color:#0f0f11;background-image:linear-gradient(rgba(255,255,255,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.018) 1px,transparent 1px);background-size:24px 24px}.number-input.svelte-1mvnu54,.slider-value-input.svelte-1mvnu54{-moz-appearance:textfield;appearance:textfield}.number-input.svelte-1mvnu54::-webkit-inner-spin-button,.number-input.svelte-1mvnu54::-webkit-outer-spin-button,.slider-value-input.svelte-1mvnu54::-webkit-inner-spin-button,.slider-value-input.svelte-1mvnu54::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}.custom-slider.svelte-1mvnu54{height:18px;cursor:pointer}.custom-slider.svelte-1mvnu54::-webkit-slider-track{width:100%;height:4px;border:1px solid rgba(255,255,255,.045);border-radius:999px;background:#34343a}.custom-slider.svelte-1mvnu54::-moz-range-track{width:100%;height:4px;border:1px solid rgba(255,255,255,.045);border-radius:999px;background:#34343a}.custom-slider.svelte-1mvnu54::-moz-range-progress{height:4px;border-radius:999px;background:var(--accent-gradient)}.custom-slider.svelte-1mvnu54::-webkit-slider-thumb{width:14px;height:14px;margin-top:-6px;border:2px solid #171719;background:var(--accent-gradient);box-shadow:0 0 0 1px #ffffff29}.custom-slider.svelte-1mvnu54::-moz-range-thumb{width:12px;height:12px;border:2px solid #171719;background:var(--accent-gradient);box-shadow:0 0 0 1px #ffffff29}.custom-slider.svelte-1mvnu54:hover::-webkit-slider-thumb,.custom-slider.svelte-1mvnu54:hover::-moz-range-thumb{transform:scale(1.08);box-shadow:0 0 0 3px #8ab4ff1f}.header-icon-btn.svelte-1mvnu54:hover,.meta-btn.svelte-1mvnu54:hover,.icon-btn.svelte-1mvnu54:hover,.control-btn.svelte-1mvnu54:hover,.timeline-command.svelte-1mvnu54:hover,.property-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover,.assistant-expand.svelte-1mvnu54:hover,.import-media-button.svelte-1mvnu54:hover{border-color:#8ab4ff4d;background:linear-gradient(135deg,#8ab4ff29,#7cf7c517);color:#f5f8f7}.nav-item.active.svelte-1mvnu54,.icon-btn.active.svelte-1mvnu54,.preset-option.active.svelte-1mvnu54,.easing-option.active.svelte-1mvnu54{border-color:#ffffff2e;background:var(--accent-gradient);color:#0d1618;box-shadow:none}.layer-row.selected.svelte-1mvnu54{border-color:#8ab4ff57;background:linear-gradient(90deg,#8ab4ff26,#7cf7c512);box-shadow:inset 2px 0 #8ab4ff}.media-dropzone.drag-active.svelte-1mvnu54 .library-empty-state:where(.svelte-1mvnu54){background:linear-gradient(135deg,#8ab4ff0f,#7cf7c506)}.custom-slider.svelte-1mvnu54{height:18px;background:linear-gradient(#3a3a41,#3a3a41) center / 100% 4px no-repeat}.custom-slider.svelte-1mvnu54::-webkit-slider-runnable-track{width:100%;height:4px;border:0;border-radius:999px;background:transparent}.custom-slider.svelte-1mvnu54::-webkit-slider-thumb{margin-top:-5px}.number-input[type=number].svelte-1mvnu54,.slider-value-input[type=number].svelte-1mvnu54{-moz-appearance:textfield!important;appearance:textfield!important}.number-input[type=number].svelte-1mvnu54::-webkit-inner-spin-button,.number-input[type=number].svelte-1mvnu54::-webkit-outer-spin-button,.slider-value-input[type=number].svelte-1mvnu54::-webkit-inner-spin-button,.slider-value-input[type=number].svelte-1mvnu54::-webkit-outer-spin-button{display:none;margin:0;-webkit-appearance:none!important}.scrubbable-suffix.svelte-1mvnu54{width:auto;height:24px;padding:0 2px;border:0;background:transparent;color:#71717a;font:inherit;font-size:11px;font-weight:550;line-height:24px;pointer-events:auto;cursor:ns-resize;user-select:none}.scrubbable-suffix.svelte-1mvnu54:hover,.scrubbable-suffix.svelte-1mvnu54:focus-visible{color:#a9d8f0;outline:none}.nav-item.active.svelte-1mvnu54,.icon-btn.active.svelte-1mvnu54,.preset-option.active.svelte-1mvnu54,.easing-option.active.svelte-1mvnu54{color:#fff}.primary-align-group.svelte-1mvnu54{margin-bottom:14px}.flat-align-actions.svelte-1mvnu54{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:5px;overflow:visible;border:0;border-radius:0;background:transparent}.flat-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54){position:relative;width:100%;height:30px;border:1px solid rgba(255,255,255,.09);border-radius:6px;background:#1b1b1e}.flat-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):after{content:attr(data-tooltip);position:absolute;bottom:calc(100% + 6px);left:50%;z-index:90;padding:5px 7px;border:1px solid rgba(255,255,255,.1);border-radius:5px;background:#29292d;color:#f1f1f3;font-size:9.5px;font-weight:550;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transform:translate(-50%,3px);transition:opacity .12s ease,transform .12s ease}.flat-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):hover:after,.flat-align-actions.svelte-1mvnu54 button:where(.svelte-1mvnu54):focus-visible:after{opacity:1;transform:translate(-50%)}.rotation-property.svelte-1mvnu54{padding-top:2px}html,body{width:100%;height:100%;margin:0;overflow:hidden;background:#0e0e10}body{font-family:Inter Variable,Inter,-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,Arial,sans-serif}.app.svelte-18ujb4i{width:100%;height:100dvh;display:flex;flex-direction:column;overflow:hidden;background:#0e0e10}.app.svelte-18ujb4i .motion-editor{flex:1 1 auto;min-height:0}.top-bar.svelte-18ujb4i{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:10px 18px;background:#141417eb;border-bottom:1px solid rgba(255,255,255,.08);box-shadow:0 1px #ffffff08 inset}.brand.svelte-18ujb4i{display:flex;align-items:center;gap:10px;min-width:0}.logo-shell.svelte-18ujb4i{width:32px;height:32px;display:grid;place-items:center;border-radius:9px;background:#15171a;border:1px solid #2a2d32;box-shadow:0 10px 24px #00000047}.brand.svelte-18ujb4i .logo:where(.svelte-18ujb4i){width:24px;height:24px;display:block;border-radius:7px}.brand.svelte-18ujb4i h1:where(.svelte-18ujb4i){margin:0;font-size:15px;font-weight:650;color:#f2f3f5;letter-spacing:0}.product-hunt-badge.svelte-18ujb4i{flex:0 0 auto;display:flex;margin-left:4px;border-radius:4px;overflow:hidden}.product-hunt-badge.svelte-18ujb4i img:where(.svelte-18ujb4i){width:125px;height:27px;display:block}.file-info.svelte-18ujb4i{display:flex;align-items:center;gap:8px;min-width:0;color:#8e939b;font-size:13px}.file-info.svelte-18ujb4i span:where(.svelte-18ujb4i){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions.svelte-18ujb4i{display:flex;gap:8px;flex:0 0 auto}.file-input.svelte-18ujb4i{display:none}.btn.svelte-18ujb4i{display:flex;align-items:center;gap:8px;padding:8px 13px;background:#17191c;border:1px solid #2c3035;border-radius:6px;color:#e4e6ea;font-size:13px;font-weight:500;cursor:pointer;transition:background .16s,border-color .16s,color .16s}.btn.svelte-18ujb4i:hover{background:#202328;border-color:#3a3f46;color:#fff}.btn.svelte-18ujb4i:disabled{cursor:not-allowed;opacity:.55}.export-action.svelte-18ujb4i{min-width:116px;justify-content:center}.btn-primary.svelte-18ujb4i{background:#0a84ff;border-color:#0a84ff;color:#fff;font-weight:600}.btn-primary.svelte-18ujb4i:hover{background:#2997ff;border-color:#2997ff;color:#fff}.github-btn.svelte-18ujb4i{min-width:92px;justify-content:center;padding:8px 10px;box-sizing:border-box;text-decoration:none}.docs-btn.svelte-18ujb4i{justify-content:center;padding:8px 10px;box-sizing:border-box;text-decoration:none}.welcome-btn.svelte-18ujb4i{width:36px;justify-content:center;padding:0;text-decoration:none}.github-btn.svelte-18ujb4i img:where(.svelte-18ujb4i){width:18px;height:18px;display:block}.github-btn.svelte-18ujb4i strong:where(.svelte-18ujb4i){padding-left:7px;border-left:1px solid #34383e;color:#fff;font-size:12px}.github-btn.svelte-18ujb4i .star-count:where(.svelte-18ujb4i){width:auto;height:18px;border-left:1px solid #34383e;padding-left:7px}@media(max-width:1120px){.product-hunt-badge.svelte-18ujb4i{display:none}}@media(max-width:760px){.file-info.svelte-18ujb4i{display:none}}@media(max-width:520px){.top-bar.svelte-18ujb4i{gap:8px;padding:8px}.brand.svelte-18ujb4i h1:where(.svelte-18ujb4i),.action-label.svelte-18ujb4i{display:none}.actions.svelte-18ujb4i{gap:5px}.btn.svelte-18ujb4i,.export-action.svelte-18ujb4i{width:36px;min-width:36px;height:36px;justify-content:center;padding:0}.github-btn.svelte-18ujb4i{width:auto;min-width:58px;padding:0 8px}}.app.svelte-18ujb4i{background:linear-gradient(180deg,#111113,#0e0e10 30% 100%)}.top-bar.svelte-18ujb4i{min-height:52px;padding:8px 14px;backdrop-filter:blur(18px);box-shadow:none}.logo-shell.svelte-18ujb4i,.btn.svelte-18ujb4i{border-color:#ffffff14;background:#ffffff0b}.btn.svelte-18ujb4i{border-radius:8px}.btn.svelte-18ujb4i:hover{border-color:#ffffff24;background:#ffffff14}.btn-primary.svelte-18ujb4i,.btn-primary.svelte-18ujb4i:hover{background:#0a84ff;border-color:#0a84ff;color:#fff}.file-info.svelte-18ujb4i{position:absolute;left:50%;transform:translate(-50%)}.app.svelte-18ujb4i{background:linear-gradient(180deg,#101012,#0e0e10 34%,#0d0d0f)}.top-bar.svelte-18ujb4i{min-height:50px;padding:7px 14px;background:#141416;border-bottom-color:#ffffff14;backdrop-filter:none;box-shadow:none}.logo-shell.svelte-18ujb4i{border-color:#ffffff14;border-radius:8px;background:#19191c;box-shadow:none}.btn.svelte-18ujb4i{height:32px;padding:0 10px;border-color:#ffffff14;border-radius:7px;background:#1b1b1e;color:#b8b8bf;box-shadow:none}.btn.svelte-18ujb4i:hover{border-color:#ffffff21;background:#242428;color:#f2f2f4}.btn.svelte-18ujb4i:active{background:#151517}.btn-primary.svelte-18ujb4i{border-color:#0a84ff;background:#0a84ff;color:#fff}.btn-primary.svelte-18ujb4i:hover{border-color:#218df7;background:#218df7;color:#fff}.product-hunt-badge.svelte-18ujb4i{opacity:.48;filter:grayscale(1);transition:opacity .16s ease}.product-hunt-badge.svelte-18ujb4i:hover{opacity:.78}.btn.svelte-18ujb4i{border-color:#ffffff1a;background:#1b1b1e;box-shadow:none;font-weight:520}.btn.svelte-18ujb4i:hover{border-color:#ffffff29;background:#242428;box-shadow:none}.btn.svelte-18ujb4i:active{background:#171719;box-shadow:none;transform:none}.btn-primary.svelte-18ujb4i,.btn-primary.svelte-18ujb4i:hover{border-color:#ffffff29;background:#0a84ff;color:#fff;box-shadow:none}.btn-primary.svelte-18ujb4i:hover{background:#2997ff}.btn.svelte-18ujb4i:hover{border-color:#8ab4ff4d;background:linear-gradient(135deg,#8ab4ff29,#7cf7c517);color:#f5f8f7}.btn-primary.svelte-18ujb4i,.btn-primary.svelte-18ujb4i:hover{border-color:#ffffff2e;background:linear-gradient(135deg,#8ab4ff,#7cf7c5);color:#fff}
|