@mevdragon/vidfarm-devcli 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/SKILL.director.md +28 -7
- package/SKILL.platform.md +9 -5
- package/demo/README.md +28 -0
- package/demo/dist/app.css +1 -0
- package/demo/dist/app.js +1184 -0
- package/demo/dist/chunks/chunk-DXB73IDG.js +1 -0
- package/demo/dist/chunks/chunk-S7OWAJDS.js +36 -0
- package/demo/dist/chunks/chunk-VTIBZ6AN.js +1 -0
- package/demo/dist/chunks/dist-ADSJKBVE.js +332 -0
- package/demo/dist/chunks/domEditingLayers-VZMLL4AP-SGHWPND4.js +1 -0
- package/demo/dist/chunks/hyperframes-player-XB65TCD6.js +425 -0
- package/demo/dist/chunks/lib-XAQ37YOE.js +1 -0
- package/demo/dist/chunks/src-TJ2QYA4U.js +207 -0
- package/demo/dist/favicon.ico +0 -0
- package/demo/dist/icons/timeline/audio.svg +7 -0
- package/demo/dist/icons/timeline/captions.svg +5 -0
- package/demo/dist/icons/timeline/composition.svg +12 -0
- package/demo/dist/icons/timeline/image.svg +18 -0
- package/demo/dist/icons/timeline/music.svg +10 -0
- package/demo/dist/icons/timeline/text.svg +3 -0
- package/demo/dist/index.html +15 -0
- package/dist/src/account-pages-legacy.js +9396 -0
- package/dist/src/account-pages.js +61 -0
- package/dist/src/app.js +14663 -0
- package/dist/src/cli.js +60 -97
- package/dist/src/composition-runtime.js +613 -0
- package/dist/src/config.js +173 -0
- package/dist/src/context.js +447 -0
- package/dist/src/dev-app-legacy.js +739 -0
- package/dist/src/dev-app.js +6 -0
- package/dist/src/domain.js +2 -0
- package/dist/src/editor-chat-history.js +82 -0
- package/dist/src/editor-chat.js +449 -0
- package/dist/src/editor-dark-theme.js +1128 -0
- package/dist/src/frontend/debug.js +71 -0
- package/dist/src/frontend/flockposter-cache-store.js +124 -0
- package/dist/src/frontend/homepage-client.js +182 -0
- package/dist/src/frontend/homepage-shared.js +4 -0
- package/dist/src/frontend/homepage-store.js +28 -0
- package/dist/src/frontend/homepage-view.js +547 -0
- package/dist/src/frontend/page-runtime-client.js +132 -0
- package/dist/src/frontend/page-runtime-store.js +9 -0
- package/dist/src/frontend/sentry.js +42 -0
- package/dist/src/frontend/template-editor-chat.js +3960 -0
- package/dist/src/help-page.js +346 -0
- package/dist/src/homepage.js +1235 -0
- package/dist/src/hyperframes/composition.js +180 -0
- package/dist/src/index.js +16 -0
- package/dist/src/instrument.js +30 -0
- package/dist/src/lib/crypto.js +45 -0
- package/dist/src/lib/dev-log.js +54 -0
- package/dist/src/lib/display-name.js +11 -0
- package/dist/src/lib/ids.js +24 -0
- package/dist/src/lib/images.js +19 -0
- package/dist/src/lib/json.js +15 -0
- package/dist/src/lib/package-root.js +47 -0
- package/dist/src/lib/template-paths.js +28 -0
- package/dist/src/lib/time.js +7 -0
- package/dist/src/lib/url-clean.js +85 -0
- package/dist/src/page-runtime.js +2 -0
- package/dist/src/page-shell.js +1381 -0
- package/dist/src/primitive-context.js +357 -0
- package/dist/src/primitive-registry.js +2561 -0
- package/dist/src/primitive-sdk.js +4 -0
- package/dist/src/primitives/hyperframes-media.js +108 -0
- package/dist/src/react-page-shell.js +35 -0
- package/dist/src/ready-post-schedule-component.js +1540 -0
- package/dist/src/registry.js +296 -0
- package/dist/src/runtime.js +35 -0
- package/dist/src/services/api-call-history.js +249 -0
- package/dist/src/services/auth.js +152 -0
- package/dist/src/services/billing-pricing.js +39 -0
- package/dist/src/services/billing.js +228 -0
- package/dist/src/services/cast.js +127 -0
- package/dist/src/services/chat-threads.js +92 -0
- package/dist/src/services/composition-sanitize.js +124 -0
- package/dist/src/services/composition-watch.js +79 -0
- package/dist/src/services/fork-access.js +93 -0
- package/dist/src/services/fork-manifest.js +42 -0
- package/dist/src/services/ghostcut.js +179 -0
- package/dist/src/services/hyperframes.js +2307 -0
- package/dist/src/services/job-capacity.js +14 -0
- package/dist/src/services/job-logs.js +197 -0
- package/dist/src/services/jobs.js +136 -0
- package/dist/src/services/local-dynamo.js +0 -0
- package/dist/src/services/media-processing.js +766 -0
- package/dist/src/services/primitive-media-lambda.js +280 -0
- package/dist/src/services/providers.js +2926 -0
- package/dist/src/services/rate-limits.js +262 -0
- package/dist/src/services/serverless-auth.js +382 -0
- package/dist/src/services/serverless-jobs.js +1082 -0
- package/dist/src/services/serverless-provider-keys.js +409 -0
- package/dist/src/services/serverless-records.js +1385 -0
- package/dist/src/services/serverless-template-configs.js +75 -0
- package/dist/src/services/storage.js +383 -0
- package/dist/src/services/template-certification.js +413 -0
- package/dist/src/services/template-loader.js +99 -0
- package/dist/src/services/template-runtime-bundles.js +217 -0
- package/dist/src/services/template-sources.js +1017 -0
- package/dist/src/services/upstream.js +248 -0
- package/dist/src/services/video-normalization.js +2 -0
- package/dist/src/services/webhooks.js +62 -0
- package/dist/src/template-editor-pages.js +2576 -0
- package/dist/src/template-editor-shell.js +2840 -0
- package/dist/src/template-sdk.js +4 -0
- package/dist/src/worker.js +17 -0
- package/package.json +6 -4
- package/public/assets/homepage-app.js +54 -0
- package/public/assets/homepage-client-app.js +80 -0
- package/public/assets/page-runtime-client-app.js +94 -0
- package/src/assets/SELLING_AWARENESS_STAGES.md +579 -0
- package/src/assets/SELLING_WITH_HOOKS.md +377 -0
- package/src/assets/SELLING_WITH_VSLS.md +606 -0
- package/src/assets/favicon.ico +0 -0
- package/src/assets/logo-vidfarm.png +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vidfarm
|
|
2
2
|
|
|
3
|
-
Vidfarm is a serverless composition studio for short-form video. Directors fork templates, edit compositions on a timeline in the **Trackpad Editor**,
|
|
3
|
+
Vidfarm is a serverless composition studio for short-form video. Directors fork templates, edit compositions on a timeline in the **Trackpad Editor**, render MP4s with the native HyperFrames renderer (cloud Lambda fan-out, or free in-process on a local `vidfarm serve` box), and share results.
|
|
4
4
|
|
|
5
5
|
Everything runs on AWS Lambda + DynamoDB + S3. There is no long-lived worker. It scales to zero at idle.
|
|
6
6
|
|
|
@@ -37,7 +37,7 @@ Never call bare `cdk deploy` — the npm scripts load the correct `.env.<stage>`
|
|
|
37
37
|
|
|
38
38
|
## Local editor: `vidfarm serve`
|
|
39
39
|
|
|
40
|
-
Boot the **full** Vidfarm editor locally — single origin, disk-backed records + storage — so an AI agent (Claude Code, Codex, etc.) edits composition files on disk while a human finishes in the browser, both sharing one source of truth with live sync. Render
|
|
40
|
+
Boot the **full** Vidfarm editor locally — single origin, disk-backed records + storage — so an AI agent (Claude Code, Codex, etc.) edits composition files on disk while a human finishes in the browser, both sharing one source of truth with live sync. Render runs **in-process on your box, free** (no cloud, no wallet charge).
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
npx -y @mevdragon/vidfarm-devcli serve
|
|
@@ -46,7 +46,7 @@ npx -y @mevdragon/vidfarm-devcli serve
|
|
|
46
46
|
# → agents edit files under ./.vidfarm-local/storage — the browser live-morphs on save
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Everything runs locally (`RECORDS_DRIVER=local`, `STORAGE_DRIVER=local`)
|
|
49
|
+
Everything runs locally (`RECORDS_DRIVER=local`, `STORAGE_DRIVER=local`), including **render** — the native in-process HyperFrames renderer produces the MP4 on your machine at no charge. No AWS is touched. Multiple forks can be edited at once.
|
|
50
50
|
|
|
51
51
|
Flags: `--port` (default 3000), `--dir` (default `./.vidfarm-local`), `--key` (bootstrap/browser key, or `VIDFARM_API_KEY`), `--fork <id>`, `--no-open`. `vidfarm <template_id>` is an alias for `serve <template_id>`.
|
|
52
52
|
|
package/SKILL.director.md
CHANGED
|
@@ -165,9 +165,9 @@ Response:
|
|
|
165
165
|
{ "ok": true, "mode": "smart", "scene_count": 6, "caption_count": 4, "duration_seconds": 12.4, "ghostcut_pending": true, "ghostcut_task_id": "..." }
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
-
If `ghostcut_pending: true`, poll `POST /api/v1/compositions/:forkId/ghostcut-poll` until status transitions to `done` or `failed`.
|
|
168
|
+
If `ghostcut_pending: true`, poll `POST /api/v1/compositions/:forkId/remove-video-captions-poll` (legacy alias: `/ghostcut-poll`) until status transitions to `done` or `failed`.
|
|
169
169
|
|
|
170
|
-
Read-only state (does **not** advance the job or bill): `GET /api/v1/compositions/:forkId/ghostcut
|
|
170
|
+
Read-only state (does **not** advance the job or bill): `GET /api/v1/compositions/:forkId/remove-video-captions` (legacy alias: `/ghostcut`). Returns `{ status, task_id, original_source_url, mirrored_url, submitted_at_ms, completed_at_ms, failure_reason }`. This is how you read the composition's **two video sources**: `original_source_url` is the **original video** (raw upload, captions intact) and `mirrored_url` is the **decomposed video** (the processed, caption-free copy the timeline renders from). Use this when you want both URLs without triggering another poll — the AI copilot uses it to pick between the original video and the decomposed video before feeding a video into a primitive route (image extract, dedupe, trim, ai video edit, etc.). Prefer the **decomposed video** (`mirrored_url`) when `status === "done"` and the downstream call should be caption-free; prefer the **original video** (`original_source_url`) when the user explicitly wants the raw upload or when `status !== "done"`.
|
|
171
171
|
|
|
172
172
|
## Video context (transcript + scene descriptions)
|
|
173
173
|
|
|
@@ -245,7 +245,7 @@ Content-Type: application/json
|
|
|
245
245
|
{ "title": "optional", "version": null, "tracer": "optional-trace-id", "html": "optional HTML to save to working state before rendering" }
|
|
246
246
|
```
|
|
247
247
|
|
|
248
|
-
Returns 202 with `{ ok, renderId, status, progress, outputUrl, cost, title, version, ... }` where `version` is the snapshot version created for this publish. Failure modes: `402` if the fork owner is not on a paid plan, `409` while GhostCut subtitle removal is still `pending` (retry after `/
|
|
248
|
+
Returns 202 with `{ ok, renderId, status, progress, outputUrl, cost, title, version, ... }` where `version` is the snapshot version created for this publish. Failure modes: `402` if the fork owner is not on a paid plan, `409` while GhostCut subtitle removal is still `pending` (retry after `/remove-video-captions-poll` reports done/failed), `412` if the provider-key preflight fails. Poll:
|
|
249
249
|
|
|
250
250
|
```
|
|
251
251
|
GET /api/v1/compositions/:forkId/renders/:renderId
|
|
@@ -419,7 +419,7 @@ Send a stable `tracer` on export so retries are traceable and filterable in job
|
|
|
419
419
|
| `vidfarm generate <image\|video> --prompt "…"` | `POST /api/v1/primitives/{images,videos}/generate` (polls job) | generate AI media → finished URL |
|
|
420
420
|
| `vidfarm place <dir> --src <url> [--at\|--replace]` | (edits local composition.html) | drop media into a gap / over a scene |
|
|
421
421
|
| `vidfarm decompose <forkId>` | `POST .../compositions/:forkId/auto-decompose` | split source into scenes |
|
|
422
|
-
| `vidfarm
|
|
422
|
+
| `vidfarm remove-video-captions <forkId>` (alias: `ghostcut`) | `GET .../compositions/:forkId/remove-video-captions` | subtitle-removal status |
|
|
423
423
|
| `vidfarm snapshot <forkId>` | `POST .../compositions/:forkId/versions` | save composition fork version |
|
|
424
424
|
| `vidfarm versions <forkId>` | `GET .../compositions/:forkId/versions` | list versions |
|
|
425
425
|
| `vidfarm render <forkId> [--wait]` | `POST .../compositions/:forkId/render` | render video to MP4 |
|
|
@@ -468,7 +468,9 @@ npx -y @mevdragon/vidfarm-devcli serve <template_id>
|
|
|
468
468
|
# → auto-provisions a local user and opens the editor, pre-authed
|
|
469
469
|
```
|
|
470
470
|
|
|
471
|
-
|
|
471
|
+
The **editor and its data** run locally (`RECORDS_DRIVER=local`, `STORAGE_DRIVER=local`) and rendering happens **in-process on this box for free**. Everything catalog-shaped still mirrors the cloud host ("cloud passthrough"): `/discover`, `/api/v1/videos`, and `/library` list the **cloud** catalog and the cloud account's approved posts next to anything local, opening a cloud template **seeds** its composition onto disk on demand, Add Template ingests into the cloud account, and approved-post actions (schedules, archive, delete) on cloud posts proxy through. Media referenced by the composition stays on its cloud URLs. Pass `--no-cloud` for a fully-offline box.
|
|
472
|
+
|
|
473
|
+
**Rendering from a serve box** — the editor's **Render** button becomes a popover with two options when a cloud `--api-key` is configured: **Render Local (Free)** (in-process HyperFrames render, no charge) and **Render in Cloud** (hands the render to the cloud renderer, billed to the cloud account's wallet). Over REST, pass `render_target: "cloud"` in the `POST /render` body; the local box resolves (or clones, once) a publishable cloud fork, remembers the mapping in the fork's `upstream-link.json`, and `GET /renders/:renderId` transparently proxies the cloud job status.
|
|
472
474
|
|
|
473
475
|
How the loop works:
|
|
474
476
|
- The composition lives on disk at `<data-dir>/storage/compositions/forks/<forkId>/working/composition.html` (default `<data-dir>` is `./.vidfarm-local`). Point your agent at that file.
|
|
@@ -477,7 +479,7 @@ How the loop works:
|
|
|
477
479
|
|
|
478
480
|
Seeding from the cloud: `serve <template_id>` pulls the template's **default fork** (which may be another user's public decomposition); `serve --fork <id>` pulls a specific fork. Only the composition + records are localized — media stays on cloud URLs. Re-serving keeps local edits unless you pass `--refetch`.
|
|
479
481
|
|
|
480
|
-
Flags: `--port` (default 3000), `--dir` (default `./.vidfarm-local`), `--key` (bootstrap/browser key, or `VIDFARM_API_KEY`), `--fork <id>`, `--host` (cloud host to pull from, default `https://vidfarm.cc`), `--api-key` (cloud key for
|
|
482
|
+
Flags: `--port` (default 3000), `--dir` (default `./.vidfarm-local`), `--key` (bootstrap/browser key, or `VIDFARM_API_KEY`), `--fork <id>`, `--host` (cloud host to mirror + pull from, default `https://vidfarm.cc`), `--api-key` (cloud key for pulls, `/library`, and cloud render — defaults to `VIDFARM_API_KEY`), `--refetch`, `--no-cloud` (fully offline: no cloud catalog, seeding, or cloud render), `--no-open`. `vidfarm <template_id>` is an alias for `serve <template_id>`.
|
|
481
483
|
|
|
482
484
|
To *analyze* the source media locally (videos, transcript, recurring cast), read the `video-context.json` / `cast.json` routes, or pull a media URL with `vidfarm download <url>`.
|
|
483
485
|
|
|
@@ -543,6 +545,25 @@ curl -X POST "$VIDFARM_BASE/api/v1/primitives/images/remove-background" \
|
|
|
543
545
|
-d '{"source_image_url": "https://cdn.example.com/photo.jpg"}'
|
|
544
546
|
```
|
|
545
547
|
|
|
548
|
+
## Primitive: video_remove_captions
|
|
549
|
+
|
|
550
|
+
Remove burned-in captions/subtitles/on-screen text from any video URL (GhostCut-powered — the same pipeline auto-decompose uses for its caption-free mirror, exposed as a standalone reusable primitive). Result is a durable caption-free MP4 stored at a Vidfarm URL.
|
|
551
|
+
|
|
552
|
+
- `POST /api/v1/primitives/videos/remove-captions` (alias: `POST /api/v1/primitives/remove-video-captions`)
|
|
553
|
+
- Body: `{ "tracer": "...", "payload": { "source_video_url": "https://..." }, "webhook_url"?: "..." }`
|
|
554
|
+
- Response: standard primitive job (`202 { job_id }`). The job probes the source, submits to GhostCut, polls to completion server-side (typically a few minutes), and mirrors the result. Poll `GET /api/v1/primitives/jobs/:jobId` until `status: "succeeded"`, then read `primary_file_url` / `video.file_url` (`captionsRemovedVideoUrl` in the output).
|
|
555
|
+
- Billing: `~$0.10 per 30 seconds` of source video (per-chunk, 1-chunk minimum; `ghostcut_subtitle_removal` cost center), plus the small probe cost.
|
|
556
|
+
- For the CURRENT fork's decompose flow, don't re-run this primitive — the caption-free mirror already exists via `GET /api/v1/compositions/:forkId/remove-video-captions`.
|
|
557
|
+
|
|
558
|
+
Example:
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
curl -X POST "$VIDFARM_BASE/api/v1/primitives/videos/remove-captions" \
|
|
562
|
+
-H "vidfarm-api-key: $VIDFARM_API_KEY" \
|
|
563
|
+
-H "content-type: application/json" \
|
|
564
|
+
-d '{"tracer": "demo-remove-captions", "payload": {"source_video_url": "https://cdn.example.com/clip.mp4"}}'
|
|
565
|
+
```
|
|
566
|
+
|
|
546
567
|
## Primitive: media_dedupe
|
|
547
568
|
|
|
548
569
|
Apply subtle camouflage transforms (zoom, tilt, rotate, saturation, playback speed, contrast, brightness, hue rotate, blur, horizontal flip, tint overlay) to any source **image or video** URL. Useful when reposting existing media and you want small perceptual differences to reduce duplicate-detection.
|
|
@@ -635,7 +656,7 @@ Analyze a source video and identify where a product can be organically placed so
|
|
|
635
656
|
|
|
636
657
|
- `POST /api/v1/primitives/brainstorm/product_placement`
|
|
637
658
|
- Body: `{ "tracer": "...", "payload": { "source_video_url": "...", "offer_description": "...", "count"?: 8, "provider"?: "gemini" }, "webhook_url"?: "..." }`
|
|
638
|
-
- `source_video_url` (required, URL) — the exact durable/public video to analyze. Aliases accepted: `video_url`, `source_url`, `url`. For a fork's composition, call `GET /api/v1/compositions/:forkId/
|
|
659
|
+
- `source_video_url` (required, URL) — the exact durable/public video to analyze. Aliases accepted: `video_url`, `source_url`, `url`. For a fork's composition, call `GET /api/v1/compositions/:forkId/remove-video-captions` first and pass the correct URL — the **original video** (`original_source_url`) or the **decomposed video** (`mirrored_url`).
|
|
639
660
|
- `offer_description` (required) — the product/offer to place. Aliases: `offer`, `description`, `details`.
|
|
640
661
|
- `count` (optional, 3–30, default 8) — number of opportunities; only send when the user asks for a specific number.
|
|
641
662
|
- Response: standard primitive job. Poll `GET /api/v1/primitives/jobs/:jobId` to completion, then read `result.json` (also surfaced on the job output as `opportunities[]`), where each entry has `timestamp`, `scene`, `placement_type`, `placement_idea`, and `why_it_works`.
|
package/SKILL.platform.md
CHANGED
|
@@ -221,9 +221,11 @@ GhostCut is an external AI subtitle-removal service. Vidfarm proxies to it via `
|
|
|
221
221
|
- `pollStatus(taskId)` — check status (`pending` | `processing` | `queued` | `done` | `failed`)
|
|
222
222
|
- `mirrorGhostcutVideoToStorage()` — copy the clean output back to Vidfarm S3
|
|
223
223
|
|
|
224
|
-
State is persisted per fork at `compositions/forks/<forkId>/working/ghostcut.json`. The client polls `POST /api/v1/compositions/:forkId/ghostcut-poll` every few seconds during smart decompose.
|
|
224
|
+
State is persisted per fork at `compositions/forks/<forkId>/working/ghostcut.json`. The client polls `POST /api/v1/compositions/:forkId/remove-video-captions-poll` (legacy alias: `/ghostcut-poll`) every few seconds during smart decompose.
|
|
225
225
|
|
|
226
|
-
Read-only companion: `GET /api/v1/compositions/:forkId/ghostcut` returns `{ status, task_id, original_source_url, mirrored_url, submitted_at_ms, completed_at_ms, failure_reason }` without touching GhostCut. Non-billing. Exposed for two reasons: (1) the editor chat harness / AI copilot uses it to look up both video URLs on demand so downstream primitive calls can pick raw-upload vs caption-free-mirror without hardcoding either in chat context; (2) it's `http_request`-allowlisted under `COMPOSITIONS_PREFIX` in `src/app.ts`, which is why the editor chat system prompt (`src/editor-chat.ts`) directs the model to call it before feeding a video into a primitive route. The AI is instructed **not** to call `POST /
|
|
226
|
+
Read-only companion: `GET /api/v1/compositions/:forkId/remove-video-captions` (legacy alias: `/ghostcut`) returns `{ status, task_id, original_source_url, mirrored_url, submitted_at_ms, completed_at_ms, failure_reason }` without touching GhostCut. Non-billing. Exposed for two reasons: (1) the editor chat harness / AI copilot uses it to look up both video URLs on demand so downstream primitive calls can pick raw-upload vs caption-free-mirror without hardcoding either in chat context; (2) it's `http_request`-allowlisted under `COMPOSITIONS_PREFIX` in `src/app.ts`, which is why the editor chat system prompt (`src/editor-chat.ts`) directs the model to call it before feeding a video into a primitive route. The AI is instructed **not** to call `POST /remove-video-captions-poll` unless the user explicitly asks to advance subtitle removal.
|
|
227
|
+
|
|
228
|
+
Standalone primitive: `POST /api/v1/primitives/videos/remove-captions` (alias: `POST /api/v1/primitives/remove-video-captions`; id `primitive:video_remove_captions` in `src/primitive-registry.ts`) exposes the same GhostCut pipeline for ANY video URL, decoupled from forks and decompose. The job probes the source (duration prices the task), submits, polls GhostCut to completion inside the job runner (12-minute budget, vs the fork routes where the client drives completion), mirrors `captions-removed.mp4` into primitive storage, and bills the `ghostcut_subtitle_removal` cost center per 30s chunk.
|
|
227
229
|
|
|
228
230
|
Configuration: `GHOSTCUT_KEY` and `GHOSTCUT_SECRET` env vars per stage. Pass-through cost: `GHOSTCUT_USD_PER_30S` (default 0.10).
|
|
229
231
|
|
|
@@ -378,13 +380,15 @@ vidfarm-devcli serve <template_id>
|
|
|
378
380
|
vidfarm-devcli serve --fork <forkId> --host https://vidfarm.cc --api-key <key>
|
|
379
381
|
```
|
|
380
382
|
|
|
381
|
-
Flags: `--port` (3000), `--dir` (`./.vidfarm-local`), `--key` (local bootstrap/browser key, or `VIDFARM_API_KEY`), `--fork`, `--host`, `--api-key` (cloud
|
|
383
|
+
Flags: `--port` (3000), `--dir` (`./.vidfarm-local`), `--key` (local bootstrap/browser key, or `VIDFARM_API_KEY`), `--fork`, `--host`, `--api-key` (cloud key for pulls, /library, and cloud render), `--refetch`, `--no-cloud`, `--no-open`. `vidfarm <template_id>` aliases `serve <template_id>`.
|
|
384
|
+
|
|
385
|
+
**Cloud passthrough** (`src/services/upstream.ts`; on unless `--no-cloud`): only the editor's data is local — the box mirrors the upstream host (`VIDFARM_UPSTREAM_HOST` + `VIDFARM_UPSTREAM_API_KEY`, set by serve from `--host`/`--api-key`). `/discover/feed` and `GET /api/v1/videos` merge the upstream catalog behind local entries (dedup by id); `/library` and `GET /api/v1/approved/posts` merge the cloud account's approved posts, and `:postId` actions on posts that don't resolve locally proxy through (`maybeProxyUnknownReadyPostToUpstream`); `POST /discover/templates` (Add Template) proxies so ingest lands in the cloud account; `/editor/:templateId` seeds an unknown template/fork from upstream on first open (`seedFromUpstream` — same path as boot seeding, cloud fork id reused locally). The editor boot gains `localRender` + `cloudRenderAvailable`, which turn the Render button into a popover: **Render Local (Free)** vs **Render in Cloud**. `render_target: "cloud"` on `POST /render` resolves (or clones, once) a publishable upstream fork (mapping persisted in the fork's working `upstream-link.json`), starts the render upstream with the submitted html, writes a `cloud-render-<renderId>.json` marker, and `GET /renders/:renderId` proxies status through that marker. serve force-clears `VIDFARM_JOB_STATE_MACHINE_ARN` so local renders never silently route to a cloud state machine picked up from a dev-shell `.env`.
|
|
382
386
|
|
|
383
|
-
**Architecture** (fully local;
|
|
387
|
+
**Architecture** (fully local editor; cloud passthrough is read/proxy-only):
|
|
384
388
|
- **Records/auth** — `src/services/local-dynamo.ts` is a drop-in `.send()` shim for the DynamoDB DocumentClient used by `serverless-records.ts` + `serverless-auth.ts`, servicing Get/Put/Delete/Query/Scan/Update against JSON files under `<data-dir>/dynamo/<table>/`. Selected by `config.RECORDS_DRIVER` (`z.enum(["local","dynamo"]).default("dynamo")` — deployed envs are unaffected). The 25 call sites are unchanged; only the client construction switches.
|
|
385
389
|
- **Storage** — `StorageService` already writes to disk when `STORAGE_DRIVER=local` / `AWS_S3_BUCKET=""` (files under `<data-dir>/storage/`). Composition public URLs become `${PUBLIC_BASE_URL}/storage/<key>`.
|
|
386
390
|
- **Auth** — no seeding: `VIDFARM_API_KEY` + the existing `tryBootstrapFromEnv` auto-provisions a paid customer; `serve` opens `/auto-login?api_key=…&redirect=/editor/…` to plant the session cookie so the browser lands pre-authed.
|
|
387
391
|
- **Live push** — `src/services/composition-watch.ts` (`fs.watch` on the forks dir, only when `STORAGE_DRIVER=local`) coalesces bursts (80ms) and broadcasts `{ forkId, file }` to `GET /api/v1/dev/events` (Hono `streamSSE`, cookie-authed). The editor opens an `EventSource` there gated on the boot flag `liveReload`, and on a `reload` for its fork refetches `composition.html` and runs `applyExternalCompositionHtml` → `morphLiveCompositionDom` (keyed on `data-hf-id`; media buffers + playback survive). The composition write routes call `compositionWatch.suppressFork(forkId)` so the editor's own `PUT` doesn't echo.
|
|
388
392
|
- **Cloud-seed** — `serve` pulls the composition for `--fork` (or the template's default fork via `resolveForkId`, which follows the cloud `/editor` redirect and grabs even another user's public decomposition), then materializes a local template + fork record and writes the composition to the working key so `/editor/:templateId?fork=:id` resolves offline. Media stays on cloud URLs.
|
|
389
|
-
- **Render** —
|
|
393
|
+
- **Render** — in-process on this box (free, unguarded — `runPrimitiveJobInProcess` + headless-Chromium HyperFrames). Cloud rendering is the explicit `render_target: "cloud"` upstream handoff described above; the ambient `VIDFARM_JOB_STATE_MACHINE_ARN` is force-cleared by serve.
|
|
390
394
|
- Lambdas — `infra/lambda/*.ts`
|
package/demo/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# HyperFrames Layer Editor Demo
|
|
2
|
+
|
|
3
|
+
This is a self-contained React demo for decomposing a short vertical video into editable HyperFrames-style layers.
|
|
4
|
+
|
|
5
|
+
Run it from this folder:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run dev
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The editor currently supports:
|
|
12
|
+
|
|
13
|
+
- Editable media URLs for video and image layers.
|
|
14
|
+
- Editable text, timing, track, z-index, size, position, opacity, and colors.
|
|
15
|
+
- A live 9:16 stage preview.
|
|
16
|
+
- A scrub/play timeline with layer tracks.
|
|
17
|
+
- Generated HyperFrames-style HTML using `data-start`, `data-duration`, and `data-track-index`.
|
|
18
|
+
- A generated project URL targeting `https://hyperframes.heygen.com/` with the layer payload encoded in the query string.
|
|
19
|
+
- Local MP4 decomposition via `POST /api/decompose`.
|
|
20
|
+
- Gemini-powered extraction of viral DNA, visual DNA, production graph intent, and editable semantic layer timelines.
|
|
21
|
+
|
|
22
|
+
The decomposition demo reads:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
../drafts/inspiration-posts/best-at-what-cost.mp4
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
It loads `GEMINI_API_KEY` from `../.env.production` and defaults to `gemini-3.5-flash`. Use the `Decompose MP4` button in the UI to sample frames, call Gemini, and replace the editor layers with the returned semantic timeline.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Abel&family=Montserrat:wght@600&family=Source+Code+Pro:wght@700&family=TikTok+Sans:wght@400;600;700;800;900&family=Yesteryear&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-2{inset:.5rem}.inset-y-0{top:0;bottom:0}.-bottom-1\.5{bottom:-.375rem}.-right-1\.5{right:-.375rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-6{bottom:1.5rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\.5{left:.375rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-3{left:.75rem}.right-0{right:0}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-\[2px\]{top:2px}.top-\[calc\(100\%\+6px\)\]{top:calc(100% + 6px)}.top-full{top:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[1\]{z-index:1}.z-\[200\]{z-index:200}.z-\[3\]{z-index:3}.z-\[4\]{z-index:4}.z-\[90\]{z-index:90}.z-\[91\]{z-index:91}.z-\[92\]{z-index:92}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.mt-\[22px\]{margin-top:22px}.mt-\[5px\]{margin-top:5px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-video{aspect-ratio:16 / 9}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-2{height:.5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-36{height:9rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[100px\]{height:100px}.h-\[14px\]{height:14px}.h-\[32px\]{height:32px}.h-\[3px\]{height:3px}.h-\[45px\]{height:45px}.h-\[52px\]{height:52px}.h-\[5px\]{height:5px}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:6rem}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.max-h-\[420px\]{max-height:420px}.max-h-\[70\%\]{max-height:70%}.max-h-\[80vh\]{max-height:80vh}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-7{min-height:1.75rem}.min-h-8{min-height:2rem}.min-h-9{min-height:2.25rem}.min-h-\[120px\]{min-height:120px}.min-h-\[240px\]{min-height:240px}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\/5{width:40%}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/5{width:60%}.w-4{width:1rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[118px\]{width:118px}.w-\[160px\]{width:160px}.w-\[292px\]{width:292px}.w-\[38px\]{width:38px}.w-\[480px\]{width:480px}.w-\[50px\]{width:50px}.w-\[560px\]{width:560px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-6{min-width:1.5rem}.min-w-7{min-width:1.75rem}.min-w-8{min-width:2rem}.min-w-9{min-width:2.25rem}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[16px\]{min-width:16px}.min-w-\[180px\]{min-width:180px}.min-w-\[20px\]{min-width:20px}.min-w-\[220px\]{min-width:220px}.min-w-\[36px\]{min-width:36px}.min-w-\[44px\]{min-width:44px}.min-w-\[56px\]{min-width:56px}.min-w-\[58px\]{min-width:58px}.min-w-\[96px\]{min-width:96px}.max-w-\[1400px\]{max-width:1400px}.max-w-\[184px\]{max-width:184px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[900px\]{max-width:900px}.max-w-\[calc\(100vw-32px\)\]{max-width:calc(100vw - 32px)}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-2{--tw-translate-y: .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\!transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.\!resize{resize:both!important}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[minmax\(0\,1fr\)_28px\]{grid-template-columns:minmax(0,1fr) 28px}.grid-cols-\[minmax\(0\,1fr\)_68px_28px\]{grid-template-columns:minmax(0,1fr) 68px 28px}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-cols-\[minmax\(0\,1fr\)_auto_auto\]{grid-template-columns:minmax(0,1fr) auto auto}.grid-cols-\[repeat\(auto-fit\,minmax\(118px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(118px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-\[2px\]{gap:2px}.gap-px{gap:1px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-8{row-gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[14px\]{border-radius:14px}.rounded-\[18px\]{border-radius:18px}.rounded-\[1px\]{border-radius:1px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-green-500\/30{border-color:#22c55e4d}.border-neutral-600{--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.border-neutral-700{--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.border-neutral-700\/40{border-color:#40404066}.border-neutral-700\/50{border-color:#40404080}.border-neutral-700\/60{border-color:#40404099}.border-neutral-800{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.border-neutral-800\/30{border-color:#2626264d}.border-neutral-800\/40{border-color:#26262666}.border-neutral-800\/50{border-color:#26262680}.border-neutral-800\/60{border-color:#26262699}.border-panel-border{--tw-border-opacity: 1;border-color:rgb(30 30 30 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-red-300\/20{border-color:#fca5a533}.border-red-400\/60{border-color:#f8717199}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/30{border-color:#ef44444d}.border-studio-accent{--tw-border-opacity: 1;border-color:rgb(60 230 172 / var(--tw-border-opacity, 1))}.border-studio-accent\/25{border-color:#3ce6ac40}.border-studio-accent\/30{border-color:#3ce6ac4d}.border-studio-accent\/50{border-color:#3ce6ac80}.border-studio-accent\/60{border-color:#3ce6ac99}.border-studio-accent\/70{border-color:#3ce6acb3}.border-studio-accent\/80{border-color:#3ce6accc}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-white\/20{border-color:#fff3}.border-white\/5{border-color:#ffffff0d}.border-white\/90{border-color:#ffffffe6}.border-t-neutral-500{--tw-border-opacity: 1;border-top-color:rgb(115 115 115 / var(--tw-border-opacity, 1))}.bg-\[\#0a0a0b\]{--tw-bg-opacity: 1;background-color:rgb(10 10 11 / var(--tw-bg-opacity, 1))}.bg-\[\#3CE6AC\]\/10{background-color:#3ce6ac1a}.bg-\[\#3CE6AC\]\/5{background-color:#3ce6ac0d}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-500\/15{background-color:#3b82f626}.bg-cyan-400{--tw-bg-opacity: 1;background-color:rgb(34 211 238 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/15{background-color:#06b6d426}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/20{background-color:#10b98133}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500\/15{background-color:#22c55e26}.bg-green-500\/20{background-color:#22c55e33}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-neutral-200{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.bg-neutral-500{--tw-bg-opacity: 1;background-color:rgb(115 115 115 / var(--tw-bg-opacity, 1))}.bg-neutral-600{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.bg-neutral-700{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.bg-neutral-700\/40{background-color:#40404066}.bg-neutral-800{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.bg-neutral-800\/50{background-color:#26262680}.bg-neutral-800\/60{background-color:#26262699}.bg-neutral-800\/70{background-color:#262626b3}.bg-neutral-900{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.bg-neutral-900\/40{background-color:#17171766}.bg-neutral-900\/50{background-color:#17171780}.bg-neutral-900\/60{background-color:#17171799}.bg-neutral-900\/80{background-color:#171717cc}.bg-neutral-950{--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.bg-neutral-950\/80{background-color:#0a0a0acc}.bg-panel-accent{--tw-bg-opacity: 1;background-color:rgb(60 230 172 / var(--tw-bg-opacity, 1))}.bg-panel-accent\/10{background-color:#3ce6ac1a}.bg-panel-accent\/15{background-color:#3ce6ac26}.bg-panel-accent\/40{background-color:#3ce6ac66}.bg-panel-accent\/\[0\.06\]{background-color:#3ce6ac0f}.bg-panel-bg{--tw-bg-opacity: 1;background-color:rgb(12 12 14 / var(--tw-bg-opacity, 1))}.bg-panel-border{--tw-bg-opacity: 1;background-color:rgb(30 30 30 / var(--tw-bg-opacity, 1))}.bg-panel-hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.bg-panel-input{--tw-bg-opacity: 1;background-color:rgb(22 22 24 / var(--tw-bg-opacity, 1))}.bg-panel-input\/30{background-color:#1616184d}.bg-panel-text-3{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-panel-text-5{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.bg-pink-400{--tw-bg-opacity: 1;background-color:rgb(244 114 182 / var(--tw-bg-opacity, 1))}.bg-pink-500\/15{background-color:#ec489926}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-purple-500\/15{background-color:#a855f726}.bg-purple-900\/70{background-color:#581c87b3}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-900\/60{background-color:#7f1d1d99}.bg-red-950\/30{background-color:#450a0a4d}.bg-red-950\/85{background-color:#450a0ad9}.bg-rose-400{--tw-bg-opacity: 1;background-color:rgb(251 113 133 / var(--tw-bg-opacity, 1))}.bg-rose-500\/15{background-color:#f43f5e26}.bg-sky-400{--tw-bg-opacity: 1;background-color:rgb(56 189 248 / var(--tw-bg-opacity, 1))}.bg-sky-500\/20{background-color:#0ea5e933}.bg-studio-accent{--tw-bg-opacity: 1;background-color:rgb(60 230 172 / var(--tw-bg-opacity, 1))}.bg-studio-accent\/10{background-color:#3ce6ac1a}.bg-studio-accent\/15{background-color:#3ce6ac26}.bg-studio-accent\/20{background-color:#3ce6ac33}.bg-studio-accent\/5{background-color:#3ce6ac0d}.bg-studio-accent\/60{background-color:#3ce6ac99}.bg-studio-accent\/80{background-color:#3ce6accc}.bg-studio-accent\/90{background-color:#3ce6ace6}.bg-studio-accent\/\[0\.03\]{background-color:#3ce6ac08}.bg-studio-accent\/\[0\.04\]{background-color:#3ce6ac0a}.bg-studio-accent\/\[0\.05\]{background-color:#3ce6ac0d}.bg-studio-accent\/\[0\.06\]{background-color:#3ce6ac0f}.bg-transparent{background-color:transparent}.bg-violet-400{--tw-bg-opacity: 1;background-color:rgb(167 139 250 / var(--tw-bg-opacity, 1))}.bg-violet-500\/15{background-color:#8b5cf626}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/15{background-color:#ffffff26}.bg-white\/5{background-color:#ffffff0d}.bg-white\/70{background-color:#ffffffb3}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-black{--tw-gradient-from: #000 var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-neutral-900{--tw-gradient-from: #171717 var(--tw-gradient-from-position);--tw-gradient-to: rgb(23 23 23 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-white{--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-neutral-950{--tw-gradient-to: #0a0a0a var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-8{padding:2rem}.p-\[2px\]{padding:2px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[5px\]{padding-top:5px;padding-bottom:5px}.py-\[7px\]{padding-top:7px;padding-bottom:7px}.py-px{padding-top:1px;padding-bottom:1px}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-5{padding-bottom:1.25rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pr-2{padding-right:.5rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#09090B\]{--tw-text-opacity: 1;color:rgb(9 9 11 / var(--tw-text-opacity, 1))}.text-\[\#5ff0bf\]{--tw-text-opacity: 1;color:rgb(95 240 191 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-neutral-100{--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.text-neutral-200{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.text-neutral-300{--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-neutral-50{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-neutral-950{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.text-orange-400\/70{color:#fb923cb3}.text-panel-accent{--tw-text-opacity: 1;color:rgb(60 230 172 / var(--tw-text-opacity, 1))}.text-panel-accent\/70{color:#3ce6acb3}.text-panel-text-1{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.text-panel-text-2{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.text-panel-text-3{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.text-panel-text-4{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.text-panel-text-5{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.text-panel-text-5\/30{color:#3f3f464d}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-200{--tw-text-opacity: 1;color:rgb(233 213 255 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-100{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-studio-accent{--tw-text-opacity: 1;color:rgb(60 230 172 / var(--tw-text-opacity, 1))}.text-studio-accent\/50{color:#3ce6ac80}.text-studio-accent\/80{color:#3ce6accc}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/60{color:#fff9}.text-white\/80{color:#fffc}.text-white\/90{color:#ffffffe6}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.placeholder-neutral-600::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(82 82 82 / var(--tw-placeholder-opacity, 1))}.placeholder-neutral-600::placeholder{--tw-placeholder-opacity: 1;color:rgb(82 82 82 / var(--tw-placeholder-opacity, 1))}.accent-studio-accent{accent-color:#3CE6AC}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.mix-blend-difference{mix-blend-mode:difference}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,0\.35\)\]{--tw-shadow: 0 0 0 1px rgba(0,0,0,.35);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 0 0 1px rgba(0,0,0,.45);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,0\.85\)\,0_6px_14px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow: 0 0 0 1px rgba(0,0,0,.85),0 6px 14px rgba(0,0,0,.5);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 6px 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,0\.85\)\,0_8px_18px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 0 0 1px rgba(0,0,0,.85),0 8px 18px rgba(0,0,0,.45);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 8px 18px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(60\,230\,172\,0\.25\)\]{--tw-shadow: 0 0 0 1px rgba(60,230,172,.25);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(60\,230\,172\,0\.3\)\]{--tw-shadow: 0 0 0 1px rgba(60,230,172,.3);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_2px_rgba\(60\,230\,172\,0\.18\)\]{--tw-shadow: 0 0 0 2px rgba(60,230,172,.18);--tw-shadow-colored: 0 0 0 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(255\,255\,255\,0\.06\)\]{--tw-shadow: inset 0 0 0 1px rgba(255,255,255,.06);--tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_0_2px_rgba\(60\,230\,172\,0\.6\)\]{--tw-shadow: inset 0 0 0 2px rgba(60,230,172,.6);--tw-shadow-colored: inset 0 0 0 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.03\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.03);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.08\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.08);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_2px_rgba\(0\,0\,0\,0\.55\)\]{--tw-shadow: inset 0 1px 2px rgba(0,0,0,.55);--tw-shadow-colored: inset 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/30{--tw-shadow-color: rgb(0 0 0 / .3);--tw-shadow: var(--tw-shadow-colored)}.shadow-black\/40{--tw-shadow-color: rgb(0 0 0 / .4);--tw-shadow: var(--tw-shadow-colored)}.shadow-black\/50{--tw-shadow-color: rgb(0 0 0 / .5);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-1{outline-width:1px}.-outline-offset-1{outline-offset:-1px}.outline-\[\#3CE6AC\]\/30{outline-color:#3ce6ac4d}.outline-\[\#3CE6AC\]\/40{outline-color:#3ce6ac66}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-panel-accent\/30{--tw-ring-color: rgb(60 230 172 / .3)}.ring-studio-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(60 230 172 / var(--tw-ring-opacity, 1))}.ring-white\/50{--tw-ring-color: rgb(255 255 255 / .5)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sepia{--tw-sepia: sepia(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[r\]{transition-property:r;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[grid-template-columns\:repeat\(auto-fill\,minmax\(300px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}:root{color-scheme:dark}body{margin:0;padding:0;background:#0a0a0a;color:#e5e5e5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden}.hf-color-grading-number::-webkit-outer-spin-button,.hf-color-grading-number::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.hf-color-grading-number{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.hf-color-grading-range{height:1.5rem;cursor:default;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent}.hf-color-grading-range:disabled{cursor:not-allowed;opacity:.5}.hf-color-grading-range::-webkit-slider-runnable-track{height:1.25rem;border:0;background:transparent}.hf-color-grading-range::-webkit-slider-thumb{width:.625rem;height:1rem;margin-top:.125rem;border:0;border-radius:999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff;box-shadow:0 0 0 2px #0c0c0e,0 1px 4px #0000008c;cursor:default}.hf-color-grading-range::-moz-range-track{height:1.25rem;border:0;background:transparent}.hf-color-grading-range::-moz-range-thumb{width:.625rem;height:1rem;border:0;border-radius:999px;background:#fff;box-shadow:0 0 0 2px #0c0c0e,0 1px 4px #0000008c;cursor:default}.hf-color-grading-range:focus-visible{outline:none}.hf-color-grading-range:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 2px #0c0c0e,0 0 0 4px #3ce6ac38,0 1px 4px #0000008c}.hf-color-grading-range:focus-visible::-moz-range-thumb{box-shadow:0 0 0 2px #0c0c0e,0 0 0 4px #3ce6ac38,0 1px 4px #0000008c}#root{width:100vw;height:100vh;height:100dvh}.cm-editor{height:100%;font-size:13px}.cm-editor .cm-scroller{font-family:JetBrains Mono,Fira Code,SF Mono,monospace}.cm-editor.cm-focused{outline:none}.hf-loader{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;width:min(34rem,100%);padding:1.5rem;box-sizing:border-box;text-align:center;cursor:default;-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}.hf-frame{display:grid;place-items:center;width:100%;height:100%;min-height:12rem;border:1px solid rgba(255,255,255,.08);background:#00000085}.hf-loader-mark-frame{display:grid;place-items:center;overflow:visible;transform-origin:50% 50%;-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}.hf-loader-mark{display:block;overflow:visible;filter:drop-shadow(0 0 7px rgba(79,219,94,.2));-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}.hf-loader-title{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:1rem;font-weight:600;letter-spacing:0;color:var(--hf-heading, #f4f4f5);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hf-loader-detail{max-width:32rem;min-height:2.5rem;overflow:hidden;color:var(--hf-text-secondary, rgba(244, 244, 245, .68));font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:.82rem;line-height:1.6}.hf-loader-mono{width:min(36rem,100%);min-height:1.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--hf-text-tertiary, rgba(244, 244, 245, .46));font-family:IBM Plex Mono,SF Mono,Fira Code,monospace;font-size:.75rem;letter-spacing:0;font-variant-numeric:tabular-nums}.hf-loader-progress{width:min(18rem,72vw);height:.375rem;overflow:hidden;border-radius:999px;background:#ffffff1a}@keyframes hf-thumb-fade{0%{opacity:0}to{opacity:1}}.hf-loader-progress__fill{width:100%;height:100%;transform:scaleX(0);transform-origin:left center;border-radius:inherit;background:linear-gradient(90deg,#06e3fa,#4fdb5e);transition:transform .16s ease}.placeholder\:text-neutral-600::-moz-placeholder{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.placeholder\:text-neutral-600::placeholder{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.placeholder\:text-panel-text-5::-moz-placeholder{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.placeholder\:text-panel-text-5::placeholder{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-panel-accent\/30:focus-within{--tw-ring-color: rgb(60 230 172 / .3)}.hover\:border-neutral-500:hover{--tw-border-opacity: 1;border-color:rgb(115 115 115 / var(--tw-border-opacity, 1))}.hover\:border-neutral-600:hover{--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.hover\:border-neutral-700:hover{--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.hover\:border-neutral-800:hover{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.hover\:border-studio-accent:hover{--tw-border-opacity: 1;border-color:rgb(60 230 172 / var(--tw-border-opacity, 1))}.hover\:border-studio-accent\/50:hover{border-color:#3ce6ac80}.hover\:bg-black\/60:hover{background-color:#0009}.hover\:bg-black\/70:hover{background-color:#000000b3}.hover\:bg-neutral-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-600:hover{--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-700:hover{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-700\/50:hover{background-color:#40404080}.hover\:bg-neutral-800:hover{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-neutral-800\/30:hover{background-color:#2626264d}.hover\:bg-neutral-800\/50:hover{background-color:#26262680}.hover\:bg-neutral-800\/60:hover{background-color:#26262699}.hover\:bg-neutral-800\/70:hover{background-color:#262626b3}.hover\:bg-neutral-900:hover{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.hover\:bg-panel-accent\/10:hover{background-color:#3ce6ac1a}.hover\:bg-panel-hover:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.hover\:bg-panel-hover\/30:hover{background-color:#27272a4d}.hover\:bg-panel-hover\/40:hover{background-color:#27272a66}.hover\:bg-red-400\/10:hover{background-color:#f871711a}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-800\/60:hover{background-color:#991b1b99}.hover\:bg-red-900\/30:hover{background-color:#7f1d1d4d}.hover\:bg-studio-accent:hover{--tw-bg-opacity: 1;background-color:rgb(60 230 172 / var(--tw-bg-opacity, 1))}.hover\:bg-studio-accent\/10:hover{background-color:#3ce6ac1a}.hover\:bg-studio-accent\/25:hover{background-color:#3ce6ac40}.hover\:bg-studio-accent\/80:hover{background-color:#3ce6accc}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/25:hover{background-color:#ffffff40}.hover\:text-\[\#22c55e\]:hover{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-neutral-100:hover{--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.hover\:text-neutral-200:hover{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.hover\:text-neutral-300:hover{--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.hover\:text-neutral-400:hover{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.hover\:text-orange-300:hover{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.hover\:text-panel-accent:hover{--tw-text-opacity: 1;color:rgb(60 230 172 / var(--tw-text-opacity, 1))}.hover\:text-panel-text-1:hover{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.hover\:text-panel-text-2:hover{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.hover\:text-panel-text-3:hover{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-studio-accent:hover{--tw-text-opacity: 1;color:rgb(60 230 172 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-white\/80:hover{color:#fffc}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:ring-1:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-white\/30:hover{--tw-ring-color: rgb(255 255 255 / .3)}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-\[\#3CE6AC\]:focus{--tw-border-opacity: 1;border-color:rgb(60 230 172 / var(--tw-border-opacity, 1))}.focus\:border-neutral-600:focus{--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.focus\:border-neutral-700:focus{--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.focus\:border-panel-accent:focus{--tw-border-opacity: 1;border-color:rgb(60 230 172 / var(--tw-border-opacity, 1))}.focus\:border-studio-accent:focus{--tw-border-opacity: 1;border-color:rgb(60 230 172 / var(--tw-border-opacity, 1))}.focus\:border-studio-accent\/40:focus{border-color:#3ce6ac66}.focus\:border-studio-accent\/60:focus{border-color:#3ce6ac99}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-panel-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(60 230 172 / var(--tw-ring-opacity, 1))}.focus\:ring-panel-accent\/40:focus{--tw-ring-color: rgb(60 230 172 / .4)}.focus\:ring-studio-accent\/30:focus{--tw-ring-color: rgb(60 230 172 / .3)}.focus\:ring-studio-accent\/40:focus{--tw-ring-color: rgb(60 230 172 / .4)}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-white\/30:focus-visible{--tw-ring-color: rgb(255 255 255 / .3)}.active\:scale-\[0\.97\]:active{--tw-scale-x: .97;--tw-scale-y: .97;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-neutral-600:disabled{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.disabled\:text-neutral-700:disabled{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-125{--tw-scale-x: 1.25;--tw-scale-y: 1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-panel-text-3{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.group\/card:hover .group-hover\/card\:opacity-100{opacity:1}.group:active .group-active\:bg-studio-accent\/70{background-color:#3ce6acb3}@media(min-width:640px){.sm\:inline{display:inline}}.\[\&\:\:-webkit-slider-runnable-track\]\:h-\[2px\]::-webkit-slider-runnable-track{height:2px}.\[\&\:\:-webkit-slider-runnable-track\]\:rounded-full::-webkit-slider-runnable-track{border-radius:9999px}.\[\&\:\:-webkit-slider-runnable-track\]\:bg-panel-border::-webkit-slider-runnable-track{--tw-bg-opacity: 1;background-color:rgb(30 30 30 / var(--tw-bg-opacity, 1))}.\[\&\:\:-webkit-slider-thumb\:active\]\:cursor-grabbing::-webkit-slider-thumb:active{cursor:grabbing}.\[\&\:\:-webkit-slider-thumb\]\:-mt-1::-webkit-slider-thumb{margin-top:-.25rem}.\[\&\:\:-webkit-slider-thumb\]\:h-\[10px\]::-webkit-slider-thumb{height:10px}.\[\&\:\:-webkit-slider-thumb\]\:w-\[10px\]::-webkit-slider-thumb{width:10px}.\[\&\:\:-webkit-slider-thumb\]\:cursor-grab::-webkit-slider-thumb{cursor:grab}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:9999px}.\[\&\:\:-webkit-slider-thumb\]\:bg-white::-webkit-slider-thumb{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.\[\&\:\:-webkit-slider-thumb\]\:shadow-\[0_0_0_2px_\#0C0C0E\,0_1px_3px_rgba\(0\,0\,0\,0\.5\)\]::-webkit-slider-thumb{--tw-shadow: 0 0 0 2px #0C0C0E,0 1px 3px rgba(0,0,0,.5);--tw-shadow-colored: 0 0 0 2px var(--tw-shadow-color), 0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\[\&_a\]\:text-sky-400 a{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.\[\&_code\]\:rounded code{border-radius:.25rem}.\[\&_code\]\:bg-neutral-800 code{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.\[\&_code\]\:px-1 code{padding-left:.25rem;padding-right:.25rem}.\[\&_code\]\:text-\[0\.85em\] code{font-size:.85em}.\[\&_code\]\:text-neutral-200 code{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.\[\&_h1\]\:mb-2 h1{margin-bottom:.5rem}.\[\&_h1\]\:mt-5 h1{margin-top:1.25rem}.\[\&_h1\]\:text-xl h1{font-size:1.25rem;line-height:1.75rem}.\[\&_h1\]\:font-semibold h1{font-weight:600}.\[\&_h1\]\:text-neutral-100 h1{--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\[\&_h2\]\:mb-1\.5 h2{margin-bottom:.375rem}.\[\&_h2\]\:mt-5 h2{margin-top:1.25rem}.\[\&_h2\]\:text-base h2{font-size:1rem;line-height:1.5rem}.\[\&_h2\]\:font-semibold h2{font-weight:600}.\[\&_h2\]\:text-neutral-100 h2{--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\[\&_h3\]\:mt-4 h3{margin-top:1rem}.\[\&_h3\]\:font-semibold h3{font-weight:600}.\[\&_h3\]\:text-neutral-200 h3{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.\[\&_hr\]\:my-4 hr{margin-top:1rem;margin-bottom:1rem}.\[\&_hr\]\:border-neutral-800 hr{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.\[\&_img\]\:my-2 img{margin-top:.5rem;margin-bottom:.5rem}.\[\&_img\]\:h-auto img{height:auto}.\[\&_img\]\:max-w-full img{max-width:100%}.\[\&_img\]\:rounded img{border-radius:.25rem}.\[\&_ol\]\:my-2 ol{margin-top:.5rem;margin-bottom:.5rem}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-5 ol{padding-left:1.25rem}.\[\&_p\]\:my-2 p{margin-top:.5rem;margin-bottom:.5rem}.\[\&_pre\]\:my-3 pre{margin-top:.75rem;margin-bottom:.75rem}.\[\&_pre\]\:overflow-auto pre{overflow:auto}.\[\&_pre\]\:rounded pre{border-radius:.25rem}.\[\&_pre\]\:bg-neutral-900 pre{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.\[\&_pre\]\:p-3 pre{padding:.75rem}.\[\&_pre_code\]\:bg-transparent pre code{background-color:transparent}.\[\&_pre_code\]\:p-0 pre code{padding:0}.\[\&_strong\]\:text-neutral-100 strong{--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.\[\&_table\]\:my-3 table{margin-top:.75rem;margin-bottom:.75rem}.\[\&_td\]\:border td{border-width:1px}.\[\&_td\]\:border-neutral-800 td{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.\[\&_td\]\:px-2 td{padding-left:.5rem;padding-right:.5rem}.\[\&_td\]\:py-1 td{padding-top:.25rem;padding-bottom:.25rem}.\[\&_th\]\:border th{border-width:1px}.\[\&_th\]\:border-neutral-800 th{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.\[\&_th\]\:px-2 th{padding-left:.5rem;padding-right:.5rem}.\[\&_th\]\:py-1 th{padding-top:.25rem;padding-bottom:.25rem}.\[\&_ul\]\:my-2 ul{margin-top:.5rem;margin-bottom:.5rem}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-5 ul{padding-left:1.25rem}:root{color-scheme:dark;--font-ui: "TikTok Sans", Abel;--font-semibold: Montserrat, "TikTok Sans";--font-code: "Source Code Pro", "TikTok Sans";--font-script: Yesteryear, "TikTok Sans";--font-serif-bold: Georgia, "TikTok Sans";--hl-black: #000000;--hl-red: #EA403F;--hl-orange: #FF933D;--hl-yellow: #F2CD46;--hl-lime-green: #78C25E;--hl-teal: #77C8A6;--hl-light-blue: #3496F0;--hl-dark-blue: #3496F0;--hl-violet: #5756D4;--hl-pink: #F7D7E9;--hl-brown: #A3895B;--hl-dark-green: #32523B;--hl-blue-gray: #2F688C;--hl-light-gray: #92979E;--hl-dark-gray: #333333;--vf-bg: #080a07;--vf-panel: #11140f;--vf-panel-2: #171c14;--vf-line: #273023;--vf-ink: #f5f1e8;--vf-muted: #9aa491;--vf-green: var(--hl-lime-green);--vf-gold: var(--hl-yellow);--vf-red: var(--hl-red);font-family:var(--font-ui)}*{box-sizing:border-box}body{min-width:1400px;min-height:100vh;margin:0;color:var(--vf-ink);background:linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px) 0 0 / 48px 48px,linear-gradient(180deg,rgba(255,255,255,.018) 1px,transparent 1px) 0 0 / 48px 48px,var(--vf-bg)}button,input,textarea{font:inherit}.vidfarm-workbench{display:grid;grid-template-columns:420px minmax(0,1fr);gap:8px;height:100vh;padding:8px;overflow:hidden}.chat-workspace{display:grid;grid-template-rows:auto minmax(0,1fr) auto;min-height:0;border:1px solid rgba(215,222,206,.18);border-radius:8px;background:linear-gradient(180deg,rgba(215,222,206,.035),transparent 34%),#090c08fa;overflow:hidden}.chat-header{display:grid;gap:2px;padding:12px;border-bottom:1px solid var(--vf-line)}.chat-header.chat-header-row{display:flex;align-items:center;gap:10px}.chat-header-titles{display:grid;gap:2px;flex:1 1 auto;min-width:0}.chat-header span{color:#a7aea2;font-size:.64rem;font-weight:950;text-transform:uppercase}.chat-header strong{color:var(--vf-ink);font-size:.92rem;font-weight:850}.chat-header-history{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:1px solid rgba(215,222,206,.24);border-radius:999px;background:#d7dece0f;color:#a7aea2;cursor:pointer}.chat-header-history[aria-pressed=true]{border-color:#dbc17ab3;color:#dbc17a;background:#dbc17a24}.chat-header-new{display:inline-flex;align-items:center;min-height:28px;padding:0 12px;border:1px solid rgba(219,193,122,.7);border-radius:999px;background:#dbc17a29;color:#dbc17a;font-size:.74rem;font-weight:800;cursor:pointer}.chat-thread-history{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.chat-thread-history-item{display:grid;gap:4px;width:100%;padding:10px 12px;border:1px solid rgba(215,222,206,.14);border-radius:10px;background:#d7dece0a;color:var(--vf-ink);text-align:left;cursor:pointer}.chat-thread-history-item:hover{border-color:#dbc17a66;background:#dbc17a0f}.chat-thread-history-item[data-active=true]{border-color:#dbc17ab3;background:#dbc17a1f}.chat-thread-history-title{font-size:.84rem;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-thread-history-meta{color:#7a8177;font-size:.68rem;font-weight:600}.chat-thread{min-height:0;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:10px}.chat-empty{color:#6c7466;font-size:.78rem;padding:12px;text-align:center}.chat-status{color:#a7aea2;font-size:.7rem;font-style:italic;padding:4px 8px}.chat-message{display:grid;gap:4px;padding:8px 10px;border-radius:8px;border:1px solid rgba(215,222,206,.12);background:#0d100ceb}.chat-message--user{background:#222a1ef0;border-color:#d7dece38}.chat-message--error{border-color:#dc5a5a6b}.chat-message-role{color:#a7aea2;font-size:.62rem;font-weight:950;text-transform:uppercase;letter-spacing:.04em}.chat-message-text{color:var(--vf-ink);font-size:.82rem;line-height:1.4;white-space:pre-wrap;word-break:break-word}.chat-message-text--markdown{white-space:normal}.chat-message-text--markdown p{margin:0 0 8px}.chat-message-text--markdown p:last-child{margin-bottom:0}.chat-message-text--markdown ul,.chat-message-text--markdown ol{margin:0 0 8px;padding-left:18px}.chat-message-text--markdown ul:last-child,.chat-message-text--markdown ol:last-child{margin-bottom:0}.chat-message-text--markdown li{margin:2px 0}.chat-message-text--markdown a{color:#a4c2f4;text-decoration:underline;text-underline-offset:2px;word-break:break-all}.chat-message-text--markdown a:hover{color:#cddffb}.chat-message-text--markdown code{font-family:Source Code Pro,ui-monospace,monospace;font-size:.78em;padding:1px 4px;border-radius:4px;background:#080a07bf;border:1px solid rgba(215,222,206,.12)}.chat-message-text--markdown pre{margin:0 0 8px;padding:8px 10px;border-radius:6px;background:#080a07e6;border:1px solid rgba(215,222,206,.14);overflow-x:auto}.chat-message-text--markdown pre:last-child{margin-bottom:0}.chat-message-text--markdown pre code{padding:0;border:none;background:transparent;font-size:.76em;white-space:pre}.chat-message-text--markdown strong{color:var(--vf-ink);font-weight:700}.chat-message-text--markdown em{color:#d7dece}.chat-message-pending,.chat-message-error{color:#8f9785;font-size:.74rem;font-style:italic}.chat-message-error{color:#d97070}.chat-tool{margin-top:4px;border:1px solid rgba(215,222,206,.14);border-radius:6px;background:#080a07eb;font-size:.72rem}.chat-tool>summary{cursor:pointer;list-style:none;display:flex;gap:8px;align-items:center;padding:6px 8px;color:#a7aea2}.chat-tool>summary::-webkit-details-marker{display:none}.chat-tool-name{color:var(--vf-ink);font-weight:800;text-transform:uppercase;letter-spacing:.03em}.chat-tool-args{color:#8f9785;font-family:var(--vf-mono, monospace);font-size:.7rem;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-tool-status{color:#6c7466;font-size:.62rem;text-transform:uppercase}.chat-tool--complete .chat-tool-status{color:#7fa67a}.chat-tool-payload{margin:0;padding:6px 8px;border-top:1px solid rgba(215,222,206,.08);font-family:var(--vf-mono, monospace);font-size:.68rem;color:#d7decd;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow-y:auto}.chat-tool-result{background:#141812b8}.chat-tool-applied{padding:4px 8px;border-top:1px solid rgba(127,166,122,.32);color:#b5d6a8;font-size:.7rem;font-weight:700;background:#283c2047}.chat-tool-applied--error{border-top-color:#dc5a5a6b;color:#f5a7a7;background:#481c1c5c}.chat-tool--apply-error .chat-tool-status{color:#f5a7a7}.chat-composer{position:relative;display:grid;gap:8px;padding:10px;border-top:1px solid var(--vf-line);background:#0d100c}.chat-composer-attachments{display:flex;flex-wrap:wrap;gap:6px}.chat-attachment-chip{display:flex;align-items:center;gap:8px;padding:4px 6px 4px 4px;background:#12160f;border:1px solid rgba(215,222,206,.16);border-radius:6px;color:var(--vf-ink);max-width:180px}.chat-attachment-chip--uploading{border-color:#d7dece47}.chat-attachment-chip--error{border-color:#f0646480}.chat-attachment-chip-thumb{width:28px;height:28px;object-fit:cover;border-radius:4px;flex-shrink:0}.chat-attachment-chip-file{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;background:#1c221a;border-radius:4px;flex-shrink:0;font-size:14px}.chat-attachment-chip-meta{display:flex;flex-direction:column;min-width:0;gap:1px}.chat-attachment-chip-name{font-size:.7rem;color:var(--vf-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-attachment-chip-status{font-size:.62rem;color:#8a917f}.chat-attachment-chip--error .chat-attachment-chip-status{color:#f38a8a}.chat-attachment-chip-remove{background:none;border:none;color:#8a917f;cursor:pointer;font-size:14px;line-height:1;padding:2px 4px}.chat-attachment-chip-remove:hover{color:var(--vf-ink)}.chat-composer-shell{position:relative;border:1px solid #2a3128;border-radius:8px;background:#080a07;transition:border-color .12s ease}.chat-composer-shell:focus-within{border-color:#d7dece75}.chat-composer-shell textarea{width:100%;min-height:80px;resize:none;border:none;border-radius:8px 8px 0 0;padding:10px 12px 6px;color:var(--vf-ink);background:transparent;font-size:.78rem;line-height:1.35;outline:none;display:block;box-sizing:border-box}.chat-composer-actions{display:flex;align-items:center;justify-content:space-between;padding:4px 6px 6px;gap:6px}.chat-composer-icon,.chat-composer-send{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;border:1px solid transparent;cursor:pointer;color:var(--vf-ink);background:transparent;padding:0}.chat-composer-icon:hover:not(:disabled){background:#171d13}.chat-composer-send{background:#1f2618;border-color:#d7dece52}.chat-composer-send:hover:not(:disabled){background:#263019}.chat-composer-icon:disabled,.chat-composer-send:disabled{color:#596151;cursor:not-allowed;background:transparent;border-color:transparent}.chat-composer-send:disabled{background:#12160f;border-color:#d7dece1a}.chat-composer-send-label{font-size:.75rem;font-weight:900}.chat-composer-drop-hint{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0b0e08bf;border:1px dashed rgba(215,222,206,.4);border-radius:8px;color:var(--vf-ink);font-size:.75rem;font-weight:700;pointer-events:none;margin:10px}.chat-workspace--drag{outline:1px solid rgba(215,222,206,.3);outline-offset:-1px}.chat-message-attachments{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.chat-message-attachment{display:inline-flex;align-items:center;gap:6px;color:var(--vf-ink);background:#12160f;border:1px solid rgba(215,222,206,.16);border-radius:6px;padding:4px 8px;font-size:.72rem;text-decoration:none}.chat-message-attachment--image{padding:0;overflow:hidden;max-width:200px}.chat-message-attachment--image img{display:block;width:100%;max-height:160px;object-fit:cover}.editor-output{min-width:0;min-height:0;height:100%;overflow:hidden}.studio-shell{display:grid;grid-template-rows:minmax(0,1fr) 222px;gap:8px;height:100%;padding:0;overflow:hidden}.markdown-preview-shell{height:100%;overflow-y:auto;overscroll-behavior:contain;border:1px solid rgba(215,222,206,.14);border-radius:8px;background:linear-gradient(180deg,rgba(215,222,206,.03),transparent 180px),#0d100c;scrollbar-color:#3d4937 #11140f}.preview-feed{display:grid;gap:10px;width:min(1200px,calc(100% - 32px));margin:0 auto;padding:10px 0}.preview-feed-card{display:grid;grid-template-rows:auto auto;min-height:calc(100vh - 28px);overflow:visible;border:1px solid rgba(215,222,206,.14);border-radius:8px;color:#d7dece;background:#0b0e0ae6}.markdown-preview-header{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:12px 16px;border-bottom:1px solid rgba(215,222,206,.16)}.markdown-preview-header p{margin:0 0 4px;color:#a7aea2;font-size:.68rem;font-weight:950;text-transform:uppercase}.markdown-preview-header h1{max-width:650px;margin:0;color:var(--vf-ink);font-size:1.18rem;line-height:1.12;font-weight:950;word-break:break-word}.markdown-preview-actions{display:flex;align-items:center;gap:8px;flex:none}.preview-feed-card .markdown-preview-actions{align-self:stretch}.preview-feed-body{display:grid;grid-template-columns:minmax(16px,.2fr) minmax(380px,480px) minmax(330px,420px);align-items:start;gap:16px;min-height:0;padding:14px 16px 16px}.preview-feed-spacer{min-width:0}.preview-video-column{display:grid;align-content:start;justify-items:center;min-height:0}.preview-detail-scroll{min-height:0;max-height:none;overflow:visible;padding:0}.markdown-switch{height:36px;padding:0 9px;border:1px solid rgba(215,222,206,.18);border-radius:7px;color:#d7dece;background:#11140f}.markdown-switch input:checked+i{background:#d7dece2e}.markdown-switch input:checked+i:after{background:#d7dece}.preview-feed-card .markdown-switch{min-width:132px;color:#f5f1e8}.preview-feed-card .markdown-switch span{color:#d7dece}.preview-feed-card .markdown-switch i{background:#252a22}.preview-feed-card .markdown-switch input:checked+i{background:#d7dece3d}.preview-feed-card .markdown-switch input:checked+i:after{background:#f5f1e8}.markdown-section{padding:14px 0;border-bottom:1px solid rgba(215,222,206,.12)}.preview-detail-scroll .markdown-section:first-child{padding-top:0}.markdown-section h2{margin:0 0 12px;color:#f5f1e8;font-size:.92rem;font-weight:950;text-transform:uppercase}.markdown-section p,.markdown-section li{margin:0;color:#d7dece;font-size:.91rem;line-height:1.58}.markdown-section ul{display:grid;gap:8px;margin:0;padding-left:20px}.markdown-subsection{display:grid;gap:6px;margin-top:16px}.markdown-subsection:first-of-type{margin-top:0}.markdown-subsection h3{margin:0;color:#a7aea2;font-size:.78rem;font-weight:950;text-transform:uppercase}.document-video-block{margin:0;overflow:hidden;border:1px solid rgba(215,222,206,.12);border-radius:8px;background:#090c08}.document-video-stage{display:grid;place-items:center;min-height:0;padding:12px;background:radial-gradient(circle at 50% 40%,rgba(215,222,206,.045),transparent 32%),#080a07}.document-video-stage>div{width:min(44vh,360px);height:min(78vh,640px)}.repeated-video-block video{width:min(44vh,360px);height:min(78vh,640px);object-fit:cover}.document-video-block .play-icon-button:not(:disabled):hover{border-color:#d7dece75;background:#171a15}.document-video-block .play-glyph{border-left-color:#d7dece}.document-video-block .pause-glyph:before,.document-video-block .pause-glyph:after{background:#d7dece}.document-video-block .preview-scrubber{accent-color:#d7dece}.document-video-block .speed-input input{color:#d7dece}.document-video-block .speed-input b{color:#a7aea2}.markdown-layer-list{display:grid;gap:0;border-top:1px solid rgba(215,222,206,.12)}.markdown-layer-row{display:grid;grid-template-columns:62px minmax(0,1fr);gap:10px;align-items:start;padding:13px 0;border-bottom:1px solid rgba(215,222,206,.1)}.markdown-layer-row>span{color:#a7aea2;font-size:.68rem;font-weight:950;text-transform:uppercase}.markdown-layer-row h3{margin:0 0 4px;color:var(--vf-ink);font-size:.86rem;font-weight:900}.markdown-layer-row p{color:#aeb7a7;font-size:.78rem;line-height:1.42}.markdown-layer-row time{grid-column:2;color:#a7aea2;font-size:.68rem;font-weight:900;text-align:left;white-space:nowrap}.studio-main{display:grid;grid-template-columns:minmax(520px,1fr) 370px;gap:8px;min-height:0}.preview-pane,.dna-panel,.native-timeline,.status-strip{border:1px solid var(--vf-line);border-radius:8px;background:#11140ff5}.preview-pane{display:grid;grid-template-rows:minmax(0,1fr) 44px;min-height:0;overflow:hidden}.direct-player-controls{display:grid;grid-template-columns:34px 36px 34px auto minmax(130px,1fr) auto auto;align-items:center;gap:8px;min-width:0;padding:6px 10px;border-top:1px solid var(--vf-line);background:#0d100c}.play-icon-button{display:grid;place-items:center;width:34px;height:30px;border:1px solid #263021;border-radius:7px;background:#151a13;cursor:pointer}.history-icon-button{display:grid;place-items:center;width:32px;height:30px;border:1px solid #263021;border-radius:7px;color:#a7aea2;background:#11150f;font-family:var(--font-semibold);font-size:1rem;font-weight:900;cursor:pointer}.history-icon-button:hover:not(:disabled){border-color:#c9ff4570;color:#f5f1e8;background:#171d15}.history-icon-button:disabled{opacity:.35;cursor:not-allowed}.play-icon-button:disabled{opacity:.42;cursor:not-allowed}.play-icon-button:not(:disabled):hover{border-color:#c9ff459e;background:#1a2116}.play-glyph{width:0;height:0;margin-left:2px;border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:11px solid var(--vf-green)}.pause-glyph{position:relative;width:13px;height:14px}.pause-glyph:before,.pause-glyph:after{content:"";position:absolute;top:0;width:4px;height:14px;border-radius:1px;background:var(--vf-gold)}.pause-glyph:before{left:1px}.pause-glyph:after{right:1px}.time-readout{display:flex;align-items:center;gap:4px;font-family:var(--font-code);color:#a7aea2;font-variant-numeric:tabular-nums;font-size:.72rem;font-weight:850;white-space:nowrap}.inline-time-input{position:relative;display:inline-block;width:88px}.inline-time-input input{width:100%;height:24px;border:1px solid #2a3128;border-radius:5px;padding:0 7px;color:var(--vf-green);background:#0b0e0a;font-family:var(--font-code);font-size:.72rem;font-weight:850}.text-style-toggles{display:flex;align-items:center;gap:7px}.text-background-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.text-background-option{display:grid;grid-template-columns:42px minmax(0,1fr);align-items:center;gap:7px;min-height:34px;border:1px solid #2a3128;border-radius:6px;padding:5px;color:var(--vf-muted);background:#090c08;cursor:pointer}.text-background-option:hover,.text-background-option.selected{border-color:#f2cd469e;color:var(--vf-ink);background:#151a13}.text-background-option span{display:grid;place-items:center;min-height:22px;border-radius:5px;font-family:var(--font-semibold);font-size:.85rem;font-weight:900;line-height:1}.text-background-option b{min-width:0;overflow:hidden;font-family:var(--font-semibold);font-size:.6rem;font-weight:900;line-height:1.05;text-align:left;text-overflow:ellipsis;text-transform:uppercase}.style-toggle{position:relative;display:inline-grid;place-items:center;width:32px;height:28px;border:1px solid #2a3128;border-radius:6px;color:var(--vf-muted);background:#090c08;font-family:var(--font-semibold);font-size:.78rem;font-weight:900;cursor:pointer}.style-toggle input{position:absolute;opacity:0;pointer-events:none}.style-toggle:has(input:checked){border-color:#f2cd469e;color:#0b0d0a;background:var(--vf-gold)}.style-toggle:has(input:focus-visible){outline:2px solid rgba(201,255,69,.48);outline-offset:2px}.style-toggle span{line-height:1}.style-toggle.bold span{font-weight:950}.style-toggle.italic span{font-style:italic}.style-toggle.underline span{text-decoration:underline}.preview-scrubber{width:100%;min-width:0;accent-color:var(--vf-green)}.speed-input,.zoom-input{font-family:var(--font-semibold);display:grid;grid-template-columns:auto 62px;align-items:center;gap:5px;color:var(--vf-muted);font-size:.66rem;font-weight:850;text-transform:uppercase}.suffix-number{position:relative;display:block;width:62px}.suffix-number input{width:100%;height:26px;border:1px solid #2a3128;border-radius:6px;padding:0 18px 0 6px;color:var(--vf-green);background:#0b0e0a;font-size:.72rem;font-weight:850}.suffix-number b{position:absolute;top:50%;right:7px;transform:translateY(-50%);color:var(--vf-gold);font-size:.68rem;line-height:1;pointer-events:none}.panel-title span,.status-strip span{color:var(--vf-muted);font-size:.68rem;font-weight:850;text-transform:uppercase}.player-stage{position:relative;display:grid;place-items:center;min-height:0;overflow:hidden;background:radial-gradient(circle at 50% 42%,rgba(201,255,69,.08),transparent 30%),#0b0e0a}.source-watermark{font-family:var(--font-semibold);position:absolute;top:9px;left:10px;z-index:4;display:flex;align-items:center;gap:8px;max-width:calc(100% - 20px);color:#d7dece7a;font-size:.66rem;font-weight:850;pointer-events:none;text-transform:uppercase}.source-titlebar{pointer-events:auto;transition:opacity .12s ease,visibility .12s ease}.source-titlebar.playing{opacity:0;visibility:hidden;pointer-events:none}.mode-back-link{font-family:var(--font-semibold);height:22px;border:1px solid rgba(201,255,69,.28);border-radius:5px;padding:0 7px;color:var(--vf-green);background:#c9ff4514;font-size:.62rem;font-weight:900;text-transform:uppercase;cursor:pointer}.mode-back-link:hover{border-color:#c9ff459e;background:#c9ff4529}.source-watermark strong{overflow:hidden;color:#d7dece8a;font-size:.66rem;white-space:nowrap;text-overflow:ellipsis;text-transform:none}.player-stage>div:not(.source-watermark){width:min(44vh,360px);height:min(78vh,640px)}.canvas-frame-overlay{position:absolute;z-index:8;border:1px dashed rgba(242,205,70,.96);box-shadow:0 0 0 9999px #00000014,0 0 0 1px #0000009e;cursor:move;pointer-events:auto;touch-action:none}.canvas-frame-handle{position:absolute;display:block;width:14px;height:14px;border:1px solid #0b0d0a;border-radius:999px;background:var(--vf-gold);box-shadow:0 0 0 2px #f2cd463d;pointer-events:auto}.canvas-frame-handle.top-left{top:-8px;left:-8px;cursor:nwse-resize}.canvas-frame-handle.top{top:-8px;left:50%;transform:translate(-50%);cursor:ns-resize}.canvas-frame-handle.top-right{top:-8px;right:-8px;cursor:nesw-resize}.canvas-frame-handle.right{top:50%;right:-8px;transform:translateY(-50%);cursor:ew-resize}.canvas-frame-handle.bottom-right{right:-8px;bottom:-8px;cursor:nwse-resize}.canvas-frame-handle.bottom{bottom:-8px;left:50%;transform:translate(-50%);cursor:ns-resize}.canvas-frame-handle.bottom-left{bottom:-8px;left:-8px;cursor:nesw-resize}.canvas-frame-handle.left{top:50%;left:-8px;transform:translateY(-50%);cursor:ew-resize}.dna-panel{display:grid;grid-auto-rows:max-content;gap:9px;min-height:0;min-width:0;overflow-y:auto;overflow-x:hidden;padding:10px;scrollbar-color:#3d4937 #11140f}.dna-panel article,.dna-panel>*{min-width:0;max-width:100%}.main-action-button{height:36px;border:1px solid var(--vf-gold);border-radius:7px;color:#10120f;background:var(--vf-gold);font-size:.78rem;font-weight:950;text-transform:uppercase;cursor:pointer}.main-action-button:hover{background:#fff0a6;border-color:#fff0a6}.preview-feed-card .main-action-button{min-width:76px;padding:0 18px;border-color:#d7dece47;color:#0d100c;background:#d7dece}.preview-feed-card .main-action-button:hover{border-color:#f5f1e8;background:#f5f1e8}.preview-feed-card .main-action-button:disabled{border-color:#d7dece1f;color:#d7dece70;background:#d7dece14;cursor:not-allowed}.slideshow-preview-stage{gap:10px}.slideshow-preview-stack{position:relative;width:min(44vh,360px);height:min(78vh,640px);overflow:hidden;border-radius:6px;background:#050604}.slideshow-preview-stack img{width:100%;height:100%;object-fit:cover}.slideshow-thumb-strip{display:grid;grid-template-columns:repeat(3,44px);gap:6px;justify-content:center}.slideshow-thumb-strip button{width:44px;padding:0;border:1px solid rgba(215,222,206,.18);border-radius:4px;background:#050604;cursor:pointer}.slideshow-thumb-strip button.active{border-color:#d7dece;box-shadow:0 0 0 2px #d7dece29}.slideshow-thumb-strip img{display:block;width:44px;aspect-ratio:9 / 16;object-fit:cover;border-radius:3px}.carousel-nav{position:absolute;top:50%;z-index:2;display:grid;place-items:center;width:34px;height:44px;transform:translateY(-50%);border:1px solid rgba(245,241,232,.22);border-radius:999px;color:#f5f1e8;background:#0506047a;font-size:1.7rem;font-weight:700;line-height:1;cursor:pointer}.carousel-nav:hover{border-color:#f5f1e880;background:#050604b8}.carousel-nav.previous{left:10px}.carousel-nav.next{right:10px}.carousel-count{position:absolute;right:10px;bottom:10px;z-index:2;border-radius:999px;padding:4px 8px;color:#f5f1e8;background:#05060494;font-size:.66rem;font-weight:850}.panel-title{position:sticky;top:-10px;z-index:25;display:flex;align-items:center;justify-content:space-between;gap:12px;margin:-10px -10px 0;padding:10px;border-bottom:1px solid var(--vf-line);background:#11140ffa}.panel-title strong{margin-left:auto;color:var(--vf-green);font-size:.68rem;text-transform:uppercase}.panel-close-button{display:grid;place-items:center;width:22px;height:22px;border:1px solid transparent;border-radius:5px;color:#d7dece94;background:transparent;font-family:var(--font-semibold);font-size:.72rem;font-weight:900;line-height:1;text-transform:uppercase;cursor:pointer}.panel-close-button:hover{border-color:#30392d;color:#f5f1e8;background:#151a13}.panel-action-pair{display:flex;align-items:center;gap:6px}.panel-action-button{height:24px;border-radius:5px;padding:0 9px;font-family:var(--font-semibold);font-size:.62rem;font-weight:900;text-transform:uppercase;cursor:pointer}.panel-action-button.secondary{border:1px solid #30392d;color:#d7dece;background:#151a13}.panel-action-button.secondary:hover{border-color:#4a5744;color:#f5f1e8}.panel-action-button.primary{border:1px solid rgba(242,205,70,.64);color:#0b0d0a;background:var(--vf-gold)}.panel-action-button.primary:hover{background:#fff0a6}.panel-action-button:disabled{cursor:progress;opacity:.62;filter:saturate(.78)}.panel-action-button.danger{border:1px solid rgba(234,64,63,.68);color:#fff;background:#ea403f}.inspector-danger-zone{display:grid;gap:8px;padding-top:3px}.inspector-delete-button{width:100%;height:32px;border:1px solid rgba(234,64,63,.48);border-radius:6px;color:#ffb4b2;background:#ea403f14;font-family:var(--font-semibold);font-size:.68rem;font-weight:900;text-transform:uppercase;cursor:pointer}.inspector-delete-button:hover:not(:disabled){color:#fff;background:#ea403f29}.inspector-delete-button:disabled{opacity:.38;cursor:not-allowed}.delete-confirm{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:6px;min-height:34px;border:1px solid rgba(234,64,63,.32);border-radius:7px;padding:5px;background:#ea403f14}.delete-confirm span{min-width:0;color:#ffcfce;font-family:var(--font-semibold);font-size:.68rem;font-weight:850}.dna-panel article,.dna-card{display:grid;gap:7px;padding:9px;border:1px solid #242b22;border-radius:6px;background:#121711}.source-card{border-color:#f4ce575c!important;background:#f4ce5712!important}.decompose-cta{display:grid;gap:8px;padding:11px;border:1px solid rgba(201,255,69,.4)!important;border-radius:6px;background:linear-gradient(145deg,#c9ff4524,#58c5d80f)!important}.decompose-cta strong{margin:0;color:var(--vf-green);font-size:.7rem;text-transform:uppercase;letter-spacing:.3px}.decompose-cta .panel-action-button{justify-self:start}.source-card p{color:var(--vf-gold)!important;font-weight:850;word-break:break-word}.dna-card{border-color:#c9ff4557;background:linear-gradient(145deg,#c9ff451f,#58c5d80d)}.dna-panel h2,.dna-card strong{margin:0;color:var(--vf-green);font-size:.7rem;text-transform:uppercase}.dna-panel p,.dna-panel li,.dna-card p{margin:0;color:#d7dece;font-size:.76rem;line-height:1.35}.dna-panel ul{display:grid;gap:5px;margin:0;padding-left:16px}.dna-card dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin:0}.dna-card dl div{min-width:0;padding:6px;border-radius:5px;background:#0000003d}.dna-card dt,.dna-card dd{overflow:hidden;margin:0;white-space:nowrap;text-overflow:ellipsis}.dna-card dt{color:var(--vf-muted);font-size:.62rem;font-weight:850;text-transform:uppercase}.dna-card dd{margin-top:2px;color:var(--vf-ink);font-size:.72rem}.switch-row,.volume-row{display:grid;gap:7px;color:#d7dece;font-size:.76rem}.switch-row{grid-template-columns:minmax(0,1fr) auto;align-items:center}.inspector-field{display:grid;gap:5px;min-width:0;color:#d7dece;font-size:.7rem;font-weight:850;text-transform:uppercase}.inspector-field input,.inspector-field textarea,.inspector-field select{width:100%;min-width:0;border:1px solid #2a3128;border-radius:6px;padding:7px;color:var(--vf-ink);background:#090c08;font-size:.74rem;line-height:1.25;outline:none;text-transform:none}.inspector-field input[type=color]{height:30px;padding:3px}.inspector-field input:focus,.inspector-field textarea:focus,.inspector-field select:focus{border-color:#c9ff457a}.text-draft-shell{position:relative}.font-dropdown{position:relative;min-width:0}.font-dropdown-trigger,.font-dropdown-option{width:100%;border:1px solid #2a3128;border-radius:6px;color:var(--vf-ink);background:#090c08;font-size:.76rem;line-height:1.1;text-align:left;text-transform:none;cursor:pointer}.font-dropdown-trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:32px;padding:7px}.font-dropdown-trigger:focus-visible,.font-dropdown-option:focus-visible{border-color:#c9ff45ad;outline:none}.font-dropdown-trigger b{color:var(--vf-muted);font-family:var(--font-ui);font-size:.66rem;font-weight:900}.font-dropdown-menu{position:absolute;z-index:80;top:calc(100% + 5px);right:0;left:0;display:grid;gap:4px;max-height:228px;overflow-y:auto;border:1px solid #2a3128;border-radius:7px;padding:5px;background:#090c08;box-shadow:0 18px 48px #0000006b}.font-dropdown-option{display:flex;align-items:center;justify-content:space-between;gap:10px;border-color:transparent;padding:8px}.font-dropdown-option small{opacity:.62}.font-dropdown-option:hover,.font-dropdown-option.selected{border-color:#3d4937;background:#151a13}.font-select-wrap{position:relative;min-width:0}.font-select-wrap select{width:100%;min-height:36px;appearance:none;border:1px solid #2a3128;border-radius:6px;padding:0 30px 0 8px;color:var(--vf-ink);background:#090c08;font-size:.78rem;line-height:1.1;cursor:pointer}.font-select-wrap select:focus{border-color:#f2cd46ad;outline:none}.font-select-wrap>span{position:absolute;top:50%;right:9px;transform:translateY(-50%);color:var(--vf-muted);font-family:var(--font-semibold);font-size:.62rem;font-weight:900;pointer-events:none}.font-button-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.font-choice-button{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:7px;min-height:34px;border:1px solid #2a3128;border-radius:6px;padding:6px 7px;color:var(--vf-ink);background:#090c08;line-height:1;text-align:left;cursor:pointer}.font-choice-button:hover,.font-choice-button.selected{border-color:#f2cd469e;background:#151a13}.font-choice-button span{min-width:0;overflow:hidden;font-size:.72rem;line-height:1.05;text-overflow:ellipsis;white-space:nowrap}.font-choice-button small{color:var(--vf-muted);font-size:.78rem;line-height:1}.inspector-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}.inspector-help{color:var(--vf-muted)!important;font-size:.68rem!important}.inspector-section-header{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:4px}.inspector-help-inline{color:var(--vf-muted);font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.4px}.inspector-timing{padding-top:6px;padding-bottom:6px}.inspector-timing-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px}.inspector-field.compact{gap:2px;font-size:.6rem;font-weight:900;letter-spacing:.4px}.inspector-field.compact input,.inspector-field.compact textarea,.inspector-field.compact select{padding:4px 5px;font-size:.7rem;border-radius:5px}.inspector-identity{display:grid;gap:4px;padding-top:4px;padding-bottom:4px}.inspector-identity-fields{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:4px;min-width:0}.inspector-identity-input{width:100%;min-width:0;padding:4px 6px;border:1px solid #252c22;border-radius:5px;background:#10140d;color:var(--vf-ink);font-size:.68rem;line-height:1.15;outline:none}.inspector-identity-input:focus{border-color:#d7dece66}.click-copy-id{display:flex;align-items:center;justify-content:space-between;gap:6px;width:100%;max-width:100%;min-width:0;padding:3px 6px;background:#10140d;border:1px solid #252c22;border-radius:5px;color:var(--vf-ink);cursor:pointer;text-align:left;transition:background .12s ease,border-color .12s ease,color .12s ease;overflow:hidden}.click-copy-id:hover:not(:disabled){background:#171d13;border-color:#d7dece52}.click-copy-id:disabled{opacity:.5;cursor:not-allowed}.click-copy-id code{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:SF Mono,Menlo,monospace;font-size:.68rem}.click-copy-id-state{font-size:.7rem;color:#8a917f}.click-copy-id--done{background:#1e3f1c;border-color:#2f5c2b;color:#a8f28f}.click-copy-id--done .click-copy-id-state{color:#a8f28f}.click-copy-id--error{background:#3f1c1c;border-color:#5c2b2b;color:#f2a4a4}.inspector-id-copy{display:inline-flex;align-items:center;gap:4px;background:#1a2115;border:1px solid #2a3128;color:var(--vf-ink);border-radius:5px;padding:3px 6px;cursor:pointer;font-size:.58rem;font-weight:900;text-transform:uppercase;letter-spacing:.4px;transition:background .12s ease,color .12s ease}.inspector-id-copy:hover:not(:disabled){background:#253022}.inspector-id-copy:disabled{opacity:.5;cursor:not-allowed}.inspector-id-copy--done{background:#1e3f1c;color:#a8f28f;border-color:#2f5c2b}.inspector-id-copy--error{background:#3f1c1c;color:#f2a4a4;border-color:#5c2b2b}.inspector-id-copy-state{font-size:.55rem}.panel-title-actions{display:inline-flex;align-items:center;gap:6px}.publish-info-wrap{position:relative;display:inline-flex}.publish-info-trigger{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;border:1px solid rgba(215,222,206,.2);background:transparent;color:var(--vf-muted, #8a917f);cursor:pointer;padding:0}.publish-info-trigger:hover{color:var(--vf-ink);border-color:#d7dece66;background:#12160f}.publish-info-popover{position:fixed;top:60px;right:16px;width:380px;max-width:calc(100vw - 24px);padding:10px;background:#0d100c;border:1px solid #2a3128;border-radius:8px;box-shadow:0 12px 36px #0009;display:grid;gap:6px;z-index:9999;isolation:isolate}.publish-info-row{display:grid;grid-template-columns:60px 1fr auto;align-items:center;gap:6px;padding:4px 6px;background:#10140d;border:1px solid #252c22;border-radius:6px;min-width:0}.publish-info-label{font-size:.58rem;font-weight:900;color:#8a917f;letter-spacing:.6px;text-transform:uppercase}.publish-info-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:SF Mono,Menlo,monospace;font-size:.68rem;color:var(--vf-ink);cursor:pointer;user-select:all}.decompose-modal-backdrop{position:fixed;inset:0;background:#050604b3;display:flex;align-items:center;justify-content:center;z-index:100;backdrop-filter:blur(6px)}.decompose-modal{position:relative;width:min(440px,88vw);padding:20px 22px;background:#0d100c;border:1px solid #2a3128;border-radius:12px;color:var(--vf-ink);box-shadow:0 12px 36px #0000008c;display:grid;gap:12px}.decompose-modal-close{position:absolute;top:12px;right:12px;display:grid;place-items:center;width:26px;height:26px;border:1px solid #30392d;border-radius:6px;color:#d7dece;background:#11140f;cursor:pointer;font-size:.8rem;line-height:1}.decompose-modal-close:hover{border-color:#4a5744;color:#fffaf2}.decompose-modal h2{margin:0;font-size:1.1rem;font-weight:800;letter-spacing:.2px}.decompose-modal p{margin:0;font-size:.85rem;line-height:1.4;color:#c7cdbc}.decompose-modal-note{font-size:.72rem!important;color:var(--vf-muted, #8a917f)!important}.decompose-modal-error{color:#f2a4a4!important;font-size:.72rem!important;padding:6px 8px;background:#2a1414;border:1px solid #5c2b2b;border-radius:6px}.decompose-modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:4px}.decompose-modal-prompt{display:grid;gap:6px;font-size:.75rem;color:#c7cdbc}.decompose-modal-prompt>span:first-child{font-weight:700;letter-spacing:.3px;text-transform:uppercase;font-size:.68rem;color:#a4ab97}.decompose-modal-textarea{width:100%;padding:8px 10px;border-radius:8px;background:#10130f;border:1px solid #2a3128;color:var(--vf-ink);font-family:inherit;font-size:.82rem;line-height:1.4;resize:vertical;min-height:80px}.decompose-modal-textarea:focus{outline:none;border-color:#4a5744;background:#131711}.decompose-modal-textarea:disabled{opacity:.65;cursor:not-allowed}.decompose-modal-hint{font-size:.68rem;color:#8a917f;line-height:1.35}.panel-menu-wrap{position:relative;display:inline-flex}.panel-menu-button{border:1px solid #30392d;color:#d7dece;background:#151a13;font-size:.9rem;line-height:1;padding:0 8px;min-width:24px}.panel-menu-button:hover{border-color:#4a5744;color:#f5f1e8}.panel-menu-button[aria-expanded=true]{background:#1e241b;border-color:#4a5744}.panel-menu-popover{position:absolute;top:calc(100% + 4px);right:0;min-width:180px;padding:4px;background:#0d100c;border:1px solid #2a3128;border-radius:8px;box-shadow:0 8px 24px #00000080;z-index:60;display:grid;gap:2px}.panel-menu-item{text-align:left;padding:7px 10px;background:transparent;border:none;color:#d7dece;font-size:.78rem;font-family:inherit;border-radius:5px;cursor:pointer}.panel-menu-item:hover:not(:disabled){background:#1a1f16;color:#f5f1e8}.panel-menu-item:disabled{color:#6a715e;cursor:not-allowed}.dna-panel-hint{font-size:.72rem!important;color:#8a917f!important;margin-top:2px!important}.share-modal-choices{display:grid;gap:8px}.share-choice{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto auto;gap:2px 10px;padding:10px 12px;border:1px solid #2a3128;border-radius:8px;background:#10130f;cursor:pointer;align-items:center}.share-choice:hover{border-color:#4a5744}.share-choice--active{border-color:#f2cd46a3;background:#171912}.share-choice input[type=radio]{grid-row:span 2;align-self:center;accent-color:var(--vf-gold)}.share-choice-label{font-size:.85rem;font-weight:700;color:#f5f1e8}.share-choice-hint{font-size:.72rem;color:#8a917f}.share-modal-link{display:flex;gap:8px;align-items:center}.share-modal-link input{flex:1;padding:8px 10px;border-radius:6px;background:#10130f;border:1px solid #2a3128;color:#d7dece;font-family:monospace;font-size:.72rem}.history-modal{width:min(560px,92vw);max-height:80vh}.history-list{list-style:none;padding:0;margin:0;display:grid;gap:8px;max-height:50vh;overflow-y:auto}.history-row{padding:10px 12px;border:1px solid #2a3128;border-radius:8px;background:#10130f;display:grid;gap:4px}.history-row--current{border-color:#f2cd467a;background:#171912}.history-row-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px}.history-version{font-weight:700;font-size:.9rem;color:#f5f1e8}.history-date{font-size:.68rem;color:#8a917f}.history-message{font-size:.78rem;color:#c7cdbc;line-height:1.35}.history-reason{font-size:.66rem;color:#6a715e;text-transform:uppercase;letter-spacing:.3px}.history-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:4px}.switch-row input,.volume-row input{accent-color:var(--vf-green)}.native-timeline{display:grid;grid-template-rows:minmax(0,1fr);position:relative;min-height:0;overflow:hidden}.native-timeline [aria-label=Timeline]>div>div.relative>div.relative.overflow-hidden{position:sticky!important;top:0;z-index:90;background:#0d100c;border-bottom:1px solid var(--vf-line)}.timeline-layer-numbers{position:absolute;left:0;top:24px;bottom:0;width:32px;overflow:hidden;pointer-events:none;z-index:85}.timeline-layer-number{position:absolute;left:0;width:32px;height:13px;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:.05em;color:#d6e8cdb8;text-shadow:0 1px 2px rgba(0,0,0,.8)}.timeline-context-menu{position:fixed;z-index:9999;width:220px;overflow:hidden;border:1px solid #30392d;border-radius:7px;background:#0b0d0a;box-shadow:0 18px 48px #00000070;padding:5px}.preview-context-menu{width:220px}.editor-upload-toast{position:fixed;z-index:10030;left:50%;bottom:24px;transform:translate(-50%);max-width:80vw;padding:9px 16px;border:1px solid #30392d;border-radius:999px;background:#0b0d0a;color:#d7e6cf;font-size:13px;font-weight:600;letter-spacing:.01em;box-shadow:0 18px 48px #00000070;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.publish-modal-backdrop{position:fixed;inset:0;z-index:10020;display:grid;place-items:center;padding:24px;background:radial-gradient(circle at 68% 18%,rgba(242,205,70,.16),transparent 32%),radial-gradient(circle at 22% 86%,rgba(120,194,94,.12),transparent 34%),#030503ad;backdrop-filter:blur(6px)}.publish-modal{width:min(560px,calc(100vw - 32px));border:1px solid rgba(242,205,70,.34);border-radius:10px;padding:18px;background:linear-gradient(180deg,rgba(242,205,70,.08),transparent 34%),linear-gradient(135deg,rgba(120,194,94,.08),transparent 42%),#0b0d0a;box-shadow:0 28px 80px #0000009e,inset 0 1px #ffffff0a;animation:publish-modal-in .18s ease-out both}.publish-modal-kicker{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--vf-green);font-family:var(--font-semibold);font-size:.65rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.publish-modal-close{display:grid;place-items:center;width:26px;height:26px;border:1px solid #30392d;border-radius:6px;color:#d7dece;background:#11140f;cursor:pointer}.publish-modal-close:hover{border-color:#4a5744;color:#fffaf2}.publish-modal h2{margin:10px 0 6px;color:#fff7d5;font-family:var(--font-semibold);font-size:1.42rem;line-height:1.1;text-transform:uppercase}.publish-modal-summary{margin:0 0 14px;color:#c3cbb9;font-size:.82rem;line-height:1.45}.publish-modal-summary strong{color:var(--vf-ink);font-weight:850}.publish-modal-eta{margin:-6px 0 14px;padding:8px 10px;border:1px solid rgba(242,205,70,.32);border-radius:6px;background:#f2cd4614;color:#d7dece;font-size:.76rem;line-height:1.45}.publish-progress-shell{height:9px;overflow:hidden;border:1px solid #2d3529;border-radius:999px;background:#060806}.publish-progress-shell span{display:block;height:100%;min-width:4px;border-radius:inherit;background:linear-gradient(90deg,var(--vf-green),var(--vf-gold));box-shadow:0 0 18px #f2cd4657;transition:width .26s ease}.publish-detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:14px 0 0}.publish-detail-grid div{min-width:0;border:1px solid #252c23;border-radius:7px;padding:8px;background:#11140fb8}.publish-detail-grid dt{margin-bottom:4px;color:var(--vf-muted);font-family:var(--font-semibold);font-size:.58rem;font-weight:900;text-transform:uppercase}.publish-detail-grid dd{margin:0;overflow-wrap:anywhere;color:#f5f1e8;font-family:var(--font-code);font-size:.67rem;line-height:1.35}.publish-error-box{margin-top:12px;border:1px solid rgba(234,64,63,.44);border-radius:7px;padding:10px;color:#ffd7d3;background:#ea403f1f}.publish-error-box strong,.publish-error-box p{margin:0;font-size:.72rem;line-height:1.4}.publish-error-box p{margin-top:5px;overflow-wrap:anywhere}.publish-modal-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.publish-modal-actions a{display:inline-flex;align-items:center;min-height:30px;border:1px solid rgba(215,222,206,.22);border-radius:6px;padding:0 10px;color:#0b0d0a;background:#d7dece;font-family:var(--font-semibold);font-size:.65rem;font-weight:900;text-decoration:none;text-transform:uppercase}.publish-modal-actions a:first-child{border-color:#f2cd46ad;background:var(--vf-gold)}.publish-modal-actions a:hover{background:#fff0a6}@keyframes publish-modal-in{0%{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes vf-spin{to{transform:rotate(360deg)}}.vf-inline-spinner{display:inline-block;width:.85em;height:.85em;margin-right:.4em;border-radius:50%;border:1.6px solid currentColor;border-top-color:transparent;border-right-color:transparent;opacity:.85;vertical-align:-.1em;animation:vf-spin .7s linear infinite}.timeline-menu-title{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:6px 7px 8px;border-bottom:1px solid #242c22;margin-bottom:4px;color:var(--vf-muted);font-family:var(--font-semibold);font-size:.62rem;font-weight:850;text-transform:uppercase}.timeline-menu-title span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.timeline-menu-title time{color:var(--vf-green);font-family:var(--font-mono);font-size:.6rem}.timeline-menu-item{display:flex;align-items:center;width:100%;min-height:28px;border:0;border-radius:5px;padding:0 8px;color:#e6eadf;background:transparent;font-family:var(--font-semibold);font-size:.7rem;font-weight:800;text-align:left}.timeline-menu-item:hover:not(:disabled){background:#171d15}.timeline-menu-item.danger{color:#ff8c8a}.timeline-menu-item:disabled{cursor:not-allowed;color:#555f51}.native-clip-label{position:relative;display:flex;align-items:center;gap:6px;width:100%;height:100%;padding:0 8px;min-width:0;overflow:hidden}.native-clip-drag-hit,.native-clip-trim-hit{position:absolute;top:0;bottom:0;z-index:4;touch-action:none}.native-clip-drag-hit{left:14px;right:14px;cursor:grab}.native-clip-drag-hit:active{cursor:grabbing}.native-clip-trim-hit{width:18px;cursor:col-resize}.native-clip-trim-hit.start{left:0}.native-clip-trim-hit.end{right:0}.native-clip-trim-hit:after{content:"";position:absolute;top:9px;bottom:9px;width:2px;border-radius:2px;background:#f2cd46c2;opacity:.8}.native-clip-trim-hit.start:after{left:5px}.native-clip-trim-hit.end:after{right:5px}.native-clip-label>.native-clip-thumb,.native-clip-label>strong,.native-clip-label>small,.native-clip-label>em{position:relative;z-index:2;pointer-events:none}.native-clip-label.multi-selected{box-shadow:inset 0 0 0 2px #f4ce57b8;background:#f4ce5717}.native-clip-thumb{display:grid;place-items:center;flex:none;width:26px;height:16px;border-radius:4px;color:#10120f;background:var(--vf-green);font-size:.54rem;font-weight:900;text-transform:uppercase}.native-clip-thumb.audio{color:var(--vf-green);background:#172017;box-shadow:inset 0 0 0 1px #c9ff4559}.native-clip-thumb.video{color:#e7f8f3;background:#26433d}.native-clip-thumb.caption,.native-clip-thumb.text{background:var(--vf-gold)}.native-clip-label strong{overflow:hidden;min-width:0;font-size:.7rem;font-weight:850;white-space:nowrap;text-overflow:ellipsis}.native-clip-label small{flex:none;color:#d7dece94;font-size:.56rem;font-weight:900;text-transform:uppercase}.native-clip-label em{flex:none;color:#c9ff45d1;font-size:.56rem;font-style:normal;font-weight:900}.status-strip{display:flex;align-items:center;justify-content:flex-end;gap:16px;padding:0 10px;background:#0d100c}
|